From 34207ae7f43e7d3ac6195cfa4fa47c7ce2fab017 Mon Sep 17 00:00:00 2001 From: Aleksey Dmitriev <73853919+dmtew@users.noreply.github.com> Date: Thu, 23 Jul 2026 19:35:44 +0700 Subject: [PATCH] Add trusted npm publishing --- .github/workflows/publish.yml | 43 +++++++++++++++++++++++++++++++++++ README.md | 21 +++++------------ src/services/payment.ts | 5 +--- 3 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..baadac2 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,43 @@ +name: Publish to npm + +on: + push: + tags: + - 'v*' + +permissions: + contents: read + id-token: write + +jobs: + publish: + name: Publish package + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Use Node.js + uses: actions/setup-node@v7 + with: + node-version: '24' + registry-url: 'https://registry.npmjs.org' + package-manager-cache: false + + - name: Install dependencies + run: npm ci + + - name: Verify tag matches package version + shell: bash + run: | + package_version="$(node --print "require('./package.json').version")" + tag_version="${GITHUB_REF_NAME#v}" + + if [[ "$package_version" != "$tag_version" ]]; then + echo "Tag v$tag_version does not match package version $package_version." + exit 1 + fi + + - name: Publish package + run: npm publish --access public diff --git a/README.md b/README.md index 950fb7e..0db8105 100644 --- a/README.md +++ b/README.md @@ -172,8 +172,6 @@ const form = robokassa.payment.buildPaymentForm({ InvID: '1004', Description: 'Заказ №1004', }); - -// form.action, form.method и form.fields готовы для HTML-формы. ``` Метод `sendForm` создаёт платёж через JSON endpoint и возвращает готовую @@ -184,6 +182,9 @@ const form = robokassa.payment.buildPaymentForm({ SDK не зависит от web-фреймворка. Например, с Express передайте разобранное form-body: +Перед отправкой подтверждения атомарно и идемпотентно зафиксируйте оплату в +базе данных. + ```ts import express from 'express'; @@ -197,7 +198,6 @@ app.post( const notification = robokassa.notification.parseResultURL(req.body); robokassa.notification.verifyResultURL(notification); - // Сначала атомарно и идемпотентно зафиксируйте оплату в БД. res.type('text/plain').send( robokassa.notification.resultResponse(notification), ); @@ -266,12 +266,13 @@ try { } catch (error) { if (error instanceof RobokassaError) { console.error(error.code, error.operation, error.statusCode); - // error.responseBody доступен для внутренней диагностики. - // Не записывайте его в публичные логи без фильтрации. } } ``` +`error.responseBody` доступен для внутренней диагностики. Перед записью в +публичные логи его следует фильтровать. + Коды: `VALIDATION_ERROR`, `CONFIGURATION_ERROR`, `NETWORK_ERROR`, `TIMEOUT`, `HTTP_ERROR`, `API_ERROR`, `PARSE_ERROR`, `INVALID_SIGNATURE`. @@ -309,16 +310,6 @@ npm run build Unit-тесты не обращаются к Robokassa и не выполняют реальные платежи. -## Публикация - -```bash -npm pack --dry-run -npm publish --access public -``` - -`prepublishOnly` автоматически запускает lint, unit-тесты, typecheck и сборку -обоих модульных форматов. - ## Лицензия MIT diff --git a/src/services/payment.ts b/src/services/payment.ts index f1e7ba5..5c7811f 100644 --- a/src/services/payment.ts +++ b/src/services/payment.ts @@ -85,10 +85,7 @@ export class PaymentService { }; } - /** - * Creates a payment through the JSON form endpoint and returns its URL. - * Uses the JSON payment endpoint and returns the resulting payment URL. - */ + /** Creates a payment through the JSON form endpoint and returns its URL. */ public async sendForm( request: CreatePaymentRequest, options: RequestOptions = {},