From 00da1bd950ba190b0f13fc3a37d44de046d46107 Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 12 Oct 2024 19:43:00 +0300 Subject: [PATCH 1/7] ci: do release from tag --- .github/workflows/ci.yml | 42 +++++++++++++++++++++++++++++++++++ .github/workflows/publish.yml | 23 ------------------- .github/workflows/test.yml | 25 --------------------- 3 files changed, 42 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..67c54bb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: ci + +on: + push: + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + name: node-${{ matrix.node-version }} + strategy: + matrix: + node-version: [18, 20, 22] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "yarn" + + - run: yarn install --frozen-lockfile + - run: yarn ci + + release: + runs-on: ubuntu-latest + if: ${{ startsWith(github.ref, 'refs/tags/v') }} + needs: test + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "22" + registry-url: "https://registry.npmjs.org" + + - run: yarn install --frozen-lockfile + - run: yarn ci + + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index d91e32f..0000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: publish to npm - -on: - workflow_dispatch: - release: - types: [created] - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "22" - registry-url: "https://registry.npmjs.org" - - - run: yarn install --frozen-lockfile - - run: yarn ci - - - run: npm publish - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 331e314..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: test - -on: - workflow_dispatch: - pull_request: - push: - branches: - - main - -jobs: - test: - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18, 20, 22] - name: node-${{ matrix.node-version }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: "yarn" - - - run: yarn install --frozen-lockfile - - run: yarn ci From 671bc222b48a9b6abd19453b77a855087d65e985 Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 12 Oct 2024 19:44:21 +0300 Subject: [PATCH 2/7] deps: update & pin --- .yarnrc | 1 + package.json | 34 +++++++-------- readme.md | 2 +- yarn.lock | 121 ++++++++++++++++++++++++--------------------------- 4 files changed, 76 insertions(+), 82 deletions(-) create mode 100644 .yarnrc diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 0000000..0b38d98 --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +save-prefix "" \ No newline at end of file diff --git a/package.json b/package.json index 94f1352..d563840 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "MIT", "author": "vladkens ", "repository": "vladkens/apigen-ts", - "description": "OpenAPI TypeScript client generator", + "description": "Simple typed OpenAPI client generator", "keywords": [ "openapi", "swagger", @@ -22,24 +22,24 @@ "ci": "tsc --noEmit && yarn test-cov && yarn build" }, "dependencies": { - "@redocly/openapi-core": "^1.22.1", - "@types/lodash-es": "^4.17.12", - "@types/swagger2openapi": "^7.0.4", - "array-utils-ts": "^0.1.2", - "cleye": "^1.3.2", - "lodash-es": "^4.17.21", - "swagger2openapi": "^7.0.8" + "@redocly/openapi-core": "1.25.5", + "@types/lodash-es": "4.17.12", + "@types/swagger2openapi": "7.0.4", + "array-utils-ts": "0.1.2", + "cleye": "1.3.2", + "lodash-es": "4.17.21", + "swagger2openapi": "7.0.8" }, "devDependencies": { - "@types/node": "^22.5.2", - "c8": "^10.1.2", - "fetch-mock": "^11.1.3", - "pkgroll": "^2.4.2", - "prettier": "^3.3.3", - "prettier-plugin-organize-imports": "^4.0.0", - "tsm": "^2.3.0", - "typescript": "^5.5.4", - "uvu": "^0.5.6" + "@types/node": "22.7.5", + "c8": "10.1.2", + "fetch-mock": "11.1.5", + "pkgroll": "2.5.0", + "prettier": "3.3.3", + "prettier-plugin-organize-imports": "4.1.0", + "tsm": "2.3.0", + "typescript": "5.6.3", + "uvu": "0.5.6" }, "peerDependencies": { "prettier": "^3.0.0", diff --git a/readme.md b/readme.md index 9e7cd95..a7d82e8 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@
apigen-ts logo -
TypeScript client generator from OpenAPI schema
+
Simple typed OpenAPI client generator
## Features diff --git a/yarn.lock b/yarn.lock index 632f3d7..71d355f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -187,28 +187,28 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@redocly/ajv@^8.11.0": - version "8.11.0" - resolved "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz" - integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== +"@redocly/ajv@^8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.2.tgz#46e1bf321ec0ac1e0fd31dea41a3d1fcbdcda0b5" + integrity sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" + uri-js-replace "^1.0.1" -"@redocly/config@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.10.1.tgz#c7bcbab6cb3b82236c2f5c87aa44924a652d8e80" - integrity sha512-H3LnKVGzOaxskwJu8pmJYwBOWjP61qOK7TuTrbafqArDVckE06fhA6l0nO4KvBbjLPjy1Al7UnlxOu23V4Nl0w== +"@redocly/config@^0.12.1": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.12.1.tgz#7b905a17d710244550ef826542d0db164d5ace02" + integrity sha512-RW3rSirfsPdr0uvATijRDU3f55SuZV3m7/ppdTDvGw4IB0cmeZRkFmqTrchxMqWP50Gfg1tpHnjdxUCNo0E2qg== -"@redocly/openapi-core@^1.22.1": - version "1.22.1" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.22.1.tgz#e229ccca4de6875d4682f1f890bfe15753fbceda" - integrity sha512-pjr456gJzrbwPvBjFKlWOd9nZEcr/dp6XSH0c8ijWGWv5K+V0vpUUy2zaTAVsFAoCydx1miEoOcbLhWQ9WC2nw== +"@redocly/openapi-core@1.25.5": + version "1.25.5" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.25.5.tgz#443b1488c8ef1ddcb8f407c3e7dd8cb7b388b427" + integrity sha512-BNgXjqesJu4L5f8F73c2hkkH5IdvjYCKYFgIl+m9oNgqGRIPBJjtiEGOx7jkQ6nElN4311z7Z4aTECtklaaHwg== dependencies: - "@redocly/ajv" "^8.11.0" - "@redocly/config" "^0.10.1" + "@redocly/ajv" "^8.11.2" + "@redocly/config" "^0.12.1" colorette "^1.2.0" https-proxy-agent "^7.0.4" js-levenshtein "^1.1.6" @@ -378,9 +378,9 @@ resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== -"@types/lodash-es@^4.17.12": +"@types/lodash-es@4.17.12": version "4.17.12" - resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== dependencies: "@types/lodash" "*" @@ -397,10 +397,10 @@ dependencies: undici-types "~5.26.4" -"@types/node@^22.5.2": - version "22.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" - integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== dependencies: undici-types "~6.19.2" @@ -409,9 +409,9 @@ resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== -"@types/swagger2openapi@^7.0.4": +"@types/swagger2openapi@7.0.4": version "7.0.4" - resolved "https://registry.npmjs.org/@types/swagger2openapi/-/swagger2openapi-7.0.4.tgz" + resolved "https://registry.yarnpkg.com/@types/swagger2openapi/-/swagger2openapi-7.0.4.tgz#56723c4184c067a70f2cd47f7607e5330770dded" integrity sha512-ffMqzciTDihOKH4Q//9Ond1yb5JP1P5FC/aFPsLK4blea1Fwk2aYctiNCkAh5etDYFswFXS+5LV/vuGkf+PU6A== dependencies: "@types/node" "*" @@ -451,9 +451,9 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-utils-ts@^0.1.2: +array-utils-ts@0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/array-utils-ts/-/array-utils-ts-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/array-utils-ts/-/array-utils-ts-0.1.2.tgz#232a416b0e6794b64880372e297d9702cf8877ef" integrity sha512-AVp/ybvqELxWd7ZtSC9HGwPPv4FOoWlJWtOaQY1lZuPKmRmJKXA80f+CAyMByH6yCF7H5wDupA67c7N0SGTiTQ== balanced-match@^1.0.0: @@ -473,7 +473,7 @@ builtin-modules@^3.3.0: resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== -c8@^10.1.2: +c8@10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/c8/-/c8-10.1.2.tgz#7fe04ced150316e2a623612ab78378289f7e6a9f" integrity sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw== @@ -495,9 +495,9 @@ call-me-maybe@^1.0.1: resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== -cleye@^1.3.2: +cleye@1.3.2: version "1.3.2" - resolved "https://registry.npmjs.org/cleye/-/cleye-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/cleye/-/cleye-1.3.2.tgz#3c013c816f604d446a92e1457debdb360985f7e9" integrity sha512-MngIC2izcCz07iRKr3Pe8Z6ZBv4zbKFl/YnQEN/aMHis6PpH+MxI2e6n0bMUAmSVlMoAyQkdBCSTbfDmtcSovQ== dependencies: terminal-columns "^1.4.1" @@ -768,10 +768,10 @@ fast-safe-stringify@^2.0.7: resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== -fetch-mock@^11.1.3: - version "11.1.3" - resolved "https://registry.yarnpkg.com/fetch-mock/-/fetch-mock-11.1.3.tgz#3dc8dcc81340fea1cf1db60a2c195c63e270b501" - integrity sha512-ATh0dWgnVrUHiiXuvQm1Ry+ThWfSv1QQgqJTCtybrNxyUrFiSOaDKsNG29eyysp1SHeNP6Q+dH50+8VifN51Ig== +fetch-mock@11.1.5: + version "11.1.5" + resolved "https://registry.yarnpkg.com/fetch-mock/-/fetch-mock-11.1.5.tgz#77f78942f3733cfba47fc232b8528d1138a6761f" + integrity sha512-KHmZDnZ1ry0pCTrX4YG5DtThHi0MH+GNI9caESnzX/nMJBrvppUHMvLx47M0WY9oAtKOMiPfZDRpxhlHg89BOA== dependencies: "@types/glob-to-regexp" "^0.4.4" dequal "^2.0.3" @@ -966,9 +966,9 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.21: +lodash-es@4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.isequal@^4.5.0: @@ -1157,10 +1157,10 @@ picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pkgroll@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/pkgroll/-/pkgroll-2.4.2.tgz#5f2dffb993c85f9405d4624da130c3685276d1fd" - integrity sha512-9seL/4BNQsE+eL+kefjfh5jSLqQPSKXQE/adw1L76k49KFw/XnOnyU8dRwuWpVtvMyIVyecaSBIpvFYrmnZq6A== +pkgroll@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/pkgroll/-/pkgroll-2.5.0.tgz#71f369f9e21ba545a3ba7ecf64b958e6e99ec7ba" + integrity sha512-nIbxukMp9i63is1Aq8wIHZcNcJyZJRZ340HF7yP3y+TBZ5P34ARI67dBChvCz4DKPaEZu8hRHM+mnDw3G471uA== dependencies: "@rollup/plugin-alias" "^5.1.0" "@rollup/plugin-commonjs" "^26.0.1" @@ -1178,21 +1178,16 @@ pluralize@^8.0.0: resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -prettier-plugin-organize-imports@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.0.0.tgz#a69acf024ea3c8eb650c81f664693826ca853534" - integrity sha512-vnKSdgv9aOlqKeEFGhf9SCBsTyzDSyScy1k7E0R1Uo4L0cTcOV7c1XQaT7jfXIOc/p08WLBfN2QUQA9zDSZMxA== +prettier-plugin-organize-imports@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz#f3d3764046a8e7ba6491431158b9be6ffd83b90f" + integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A== -prettier@^3.3.3: +prettier@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - reftools@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz" @@ -1387,9 +1382,9 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swagger2openapi@^7.0.8: +swagger2openapi@7.0.8: version "7.0.8" - resolved "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== dependencies: call-me-maybe "^1.0.1" @@ -1423,9 +1418,9 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -tsm@^2.3.0: +tsm@2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/tsm/-/tsm-2.3.0.tgz" + resolved "https://registry.yarnpkg.com/tsm/-/tsm-2.3.0.tgz#f1a2f21393ca58268ef54ba2246bee5528e2ec43" integrity sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw== dependencies: esbuild "^0.15.16" @@ -1435,10 +1430,10 @@ type-flag@^3.0.0: resolved "https://registry.npmjs.org/type-flag/-/type-flag-3.0.0.tgz" integrity sha512-3YaYwMseXCAhBB14RXW5cRQfJQlEknS6i4C8fCfeUdS3ihG9EdccdR9kt3vP73ZdeTGmPb4bZtkDn5XMIn1DLA== -typescript@^5.5.4: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== +typescript@5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== undici-types@~5.26.4: version "5.26.5" @@ -1450,16 +1445,14 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" +uri-js-replace@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uri-js-replace/-/uri-js-replace-1.0.1.tgz#c285bb352b701c9dfdaeffc4da5be77f936c9048" + integrity sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g== -uvu@^0.5.6: +uvu@0.5.6: version "0.5.6" - resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" From df918bf25705fbda67decb4e48f9527814b5cd4a Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 12 Oct 2024 21:06:06 +0300 Subject: [PATCH 3/7] feat: additionalProperties #1 --- examples/petstore-v2.ts | 2 +- examples/petstore-v3.ts | 2 +- src/type-gen.ts | 17 +++++++++++++++-- test/type-gen.test.ts | 13 +++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/examples/petstore-v2.ts b/examples/petstore-v2.ts index 944102b..a851cc2 100644 --- a/examples/petstore-v2.ts +++ b/examples/petstore-v2.ts @@ -148,7 +148,7 @@ export class ApiClient { store = { getInventory: () => { - return this.Fetch("get", "/store/inventory", {}) + return this.Fetch>("get", "/store/inventory", {}) }, placeOrder: (body: Order) => { diff --git a/examples/petstore-v3.ts b/examples/petstore-v3.ts index 7c61e94..3fafa61 100644 --- a/examples/petstore-v3.ts +++ b/examples/petstore-v3.ts @@ -141,7 +141,7 @@ export class ApiClient { store = { getInventory: () => { - return this.Fetch("get", "/store/inventory", {}) + return this.Fetch>("get", "/store/inventory", {}) }, placeOrder: (body: Order) => { diff --git a/src/type-gen.ts b/src/type-gen.ts index 31d8a66..fccdf56 100644 --- a/src/type-gen.ts +++ b/src/type-gen.ts @@ -1,6 +1,6 @@ import { Oas3Schema, Referenced } from "@redocly/openapi-core/lib/typings/openapi" import { filterEmpty } from "array-utils-ts" -import { isArray, uniq, upperFirst } from "lodash-es" +import { isArray, isBoolean, uniq, upperFirst } from "lodash-es" import ts from "typescript" import { Context } from "./config" import { OAS3, unref } from "./schema" @@ -68,6 +68,19 @@ const makeInlineEnum = (s: OAS3) => { return undefined } +const makeObject = (ctx: Context, s: OAS3): ts.TypeNode => { + if (s.type !== "object") throw new Error(`makeObject: not an object ${JSON.stringify(s)}`) + + if (s.additionalProperties && !isBoolean(s.additionalProperties)) { + return f.createTypeReferenceNode("Record", [ + f.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), + makeType(ctx, s.additionalProperties), + ]) + } + + return f.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword) +} + export const makeType = (ctx: Context, s?: Referenced): ts.TypeNode => { const mk = makeType.bind(null, ctx) @@ -123,7 +136,7 @@ export const makeType = (ctx: Context, s?: Referenced): ts.TypeNode => { let t: ts.TypeNode // if (s.type === "object") t = f.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword) - if (s.type === "object") t = f.createKeywordTypeNode(ts.SyntaxKind.ObjectKeyword) + if (s.type === "object") t = makeObject(ctx, s) else if (s.type === "boolean") t = f.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword) else if (s.type === "number") t = f.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword) else if (s.type === "string") t = f.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) diff --git a/test/type-gen.test.ts b/test/type-gen.test.ts index 7c06b71..59a3e3f 100644 --- a/test/type-gen.test.ts +++ b/test/type-gen.test.ts @@ -117,6 +117,19 @@ test("type inline", async () => { { type: "object", properties: { a: { type: "string" } }, additionalProperties: true }, "{ a?: string }", ) + + t({ type: "object", additionalProperties: { type: "number" } }, "Record") + + t( + { + type: "object", + additionalProperties: { + type: "array", + items: { oneOf: [{ type: "string" }, { type: "number" }] }, + }, + }, + "Record", + ) }) test("type alias", async () => { From 4a2e9c5bf39f9e1a3289927deb3319cb54b5e48c Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 12 Oct 2024 21:44:45 +0300 Subject: [PATCH 4/7] docs: usage with fastapi --- readme.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/readme.md b/readme.md index a7d82e8..0b31df2 100644 --- a/readme.md +++ b/readme.md @@ -168,6 +168,33 @@ await apigen({ Then run with: `node apigen.mjs` +## Usage with different backend frameworks + +### FastAPI + +By default `apigen-ts` generates noisy method names when used with FastAPI. This can be fixed by [custom resolving](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#using-the-path-operation-function-name-as-the-operationid) for operations ids. + +```py +from fastapi import FastAPI +from fastapi.routing import APIRoute + +app = FastAPI() + +# add your routes here + +def update_operation_ids(app: FastAPI) -> None: + for route in app.routes: + if isinstance(route, APIRoute): + ns = route.tags[0] if route.tags else "general" + route.operation_id = f"{ns}_{route.name}".lower() + + +# this function should be after all routes added +update_operation_ids(app) +``` + +_Note: If you want FastAPI to be added as preset, open PR please._ + ## Compare - [openapi-typescript-codegen](https://github.com/ferdikoomen/openapi-typescript-codegen) ([npm](https://www.npmjs.com/package/openapi-typescript-codegen)): no single file mode [#1263](https://github.com/ferdikoomen/openapi-typescript-codegen/issues/1263#issuecomment-1502890838) From 7cfa9bea4c4d939c421f0f3c2882fa72c1055006 Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 12 Oct 2024 22:15:47 +0300 Subject: [PATCH 5/7] ci: create release and changelog --- .github/workflows/ci.yml | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67c54bb..9b12c01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,19 @@ jobs: - run: yarn install --frozen-lockfile - run: yarn ci + - name: Generate changelog + uses: orhun/git-cliff-action@v4 + id: changelog + with: + args: --latest --strip header + - run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create Github Release + uses: softprops/action-gh-release@v2 + with: + body: ${{ steps.changelog.outputs.content }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index d563840..dfd1e2d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "apigen-ts", - "version": "0.2.0", + "version": "1.0.0", "license": "MIT", "author": "vladkens ", "repository": "vladkens/apigen-ts", From 6bc09e921f2153ebae12cb07f4aa491303942c24 Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 12 Oct 2024 22:22:56 +0300 Subject: [PATCH 6/7] remove git-cliff from ci --- .github/workflows/ci.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b12c01..8b28b0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,19 +37,11 @@ jobs: - run: yarn install --frozen-lockfile - run: yarn ci - - name: Generate changelog - uses: orhun/git-cliff-action@v4 - id: changelog - with: - args: --latest --strip header - - run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Create Github Release uses: softprops/action-gh-release@v2 - with: - body: ${{ steps.changelog.outputs.content }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c73c923cdfc0db6c1bf915f6e5ca0579b4439887 Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sat, 9 Nov 2024 19:26:16 +0200 Subject: [PATCH 7/7] npm provenance --- .github/workflows/ci.yml | 3 ++- package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b28b0d..c47e2c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,7 @@ jobs: needs: test permissions: contents: write + id-token: write steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -37,7 +38,7 @@ jobs: - run: yarn install --frozen-lockfile - run: yarn ci - - run: npm publish + - run: npm publish --provenance --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/package.json b/package.json index dfd1e2d..ae3838c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "apigen-ts", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "author": "vladkens ", "repository": "vladkens/apigen-ts",