{"_id":"@ciwergrp/nestjs-midtrans","_rev":"3-37e0b8bc1d0360311e5c8937d16a196c","name":"@ciwergrp/nestjs-midtrans","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@ciwergrp/nestjs-midtrans","version":"0.1.0","author":"","license":"MIT","_id":"@ciwergrp/nestjs-midtrans@0.1.0","maintainers":[{"name":"ciwer","email":"bagusp81@gmail.com"}],"dist":{"shasum":"d3f2faf7a470b06639277933024b6b2acac896d6","tarball":"https://registry.npmjs.org/@ciwergrp/nestjs-midtrans/-/nestjs-midtrans-0.1.0.tgz","fileCount":38,"integrity":"sha512-kPBVzbfl4Wjbrl+VTn+ezCLgCh+6s1fFSXPlNGF/0R5uI0pxoIR8wPl0f+guNNGshXXyEBQrflahIsp8W6OktQ==","signatures":[{"sig":"MEUCIQCwIAzjV2HZ6PIbyyDrg49eWoWSzz/UP/G07xwLgC4/kwIgR3agt2FNmlcyccEObrfZRXjraiUlprhb4/wHJRyHhss=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108175},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"c6fa12b2645891705208884d97f013cb7fc8497e","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.playground.json","playground:dev":"nodemon --watch src --watch playground --ext ts,json --exec \"ts-node -P tsconfig.playground.json playground/main.ts\""},"_npmUser":{"name":"ciwer","email":"bagusp81@gmail.com"},"_npmVersion":"10.9.8","description":"NestJS wrapper for Midtrans configuration and injectable services.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","nodemon":"^3.1.14","ts-node":"^10.9.2","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^11.1.6","@nestjs/common":"^11.1.6","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","reflect-metadata":"^0.2.2","@nestjs/platform-express":"^11.1.6"},"peerDependencies":{"rxjs":"^7.8.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-midtrans_0.1.0_1780827822369_0.11041248212150001","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@ciwergrp/nestjs-midtrans","version":"0.2.1","author":"","license":"MIT","_id":"@ciwergrp/nestjs-midtrans@0.2.1","maintainers":[{"name":"ciwer","email":"bagusp81@gmail.com"}],"dist":{"shasum":"3d7176bd5020e0f7916e57d5137e4aae38ea0373","tarball":"https://registry.npmjs.org/@ciwergrp/nestjs-midtrans/-/nestjs-midtrans-0.2.1.tgz","fileCount":41,"integrity":"sha512-btvGrFgMLP3zvAU8+uPOEy+W/yKfUVwTNkn7Qapfm1FCPwoQgLG/jR/IsaAgum6qqicXHmRDYtgcaTn97YhjNQ==","signatures":[{"sig":"MEUCIFM2jbPGCscNHO5vjf5YjeDqLeMZfHbGlf5+O9Hl7ABuAiEAxh2m8yYLglSG9WT9ptEje9wsPEh3e0uaTynyUBsJkFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126660},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"3790381f962a6a83109c0a9f13b26f2584d3c5b6","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.playground.json","playground:dev":"nodemon --watch src --watch playground --ext ts,json --exec \"ts-node -P tsconfig.playground.json playground/main.ts\""},"_npmUser":{"name":"ciwer","email":"bagusp81@gmail.com"},"_npmVersion":"10.9.8","description":"NestJS wrapper for Midtrans configuration and injectable services.","directories":{},"_nodeVersion":"22.23.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","nodemon":"^3.1.14","ts-node":"^10.9.2","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^11.1.6","@nestjs/common":"^11.1.6","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","reflect-metadata":"^0.2.2","@nestjs/platform-express":"^11.1.6"},"peerDependencies":{"rxjs":"^7.8.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-midtrans_0.2.1_1781980871833_0.1958503709432211","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"_id":"@ciwergrp/nestjs-midtrans@0.3.1","dist":{"shasum":"cbad33722a6401da934d3ab4a2103078d3a32493","tarball":"https://registry.npmjs.org/@ciwergrp/nestjs-midtrans/-/nestjs-midtrans-0.3.1.tgz","fileCount":41,"integrity":"sha512-cciHhox5yD2afkHwjOfIzKscYsqzMYzKgtFvxf8m7zoHI7N8QLBgeXo5gpUw4xcRpI+RfEvAiw2sT6cpi+YUww==","signatures":[{"sig":"MEYCIQC9UTspo331CH5QgECDjYzzFZaR/yjgd38WoI7j9kvJkQIhAO0iS2w8nEmtfeiQbgug2f0CUo1i3cFoTYSfEpjx+EO4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD9qJVNGfukfhr5orE6nRqT6du8ATQtTIiriMMdHGkEaAIgAKduk5hsphih3s9FQp7QOPxDeDiJIsSX+xPCoYrIT04="}],"unpackedSize":127785},"main":"dist/index.js","name":"@ciwergrp/nestjs-midtrans","types":"dist/index.d.ts","author":"","engines":{"node":">=18"},"gitHead":"cafb580bdb47d668d70699fcd8b188ea00b8f9fc","license":"MIT","scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.playground.json","playground:dev":"nodemon --watch src --watch playground --ext ts,json --exec \"ts-node -P tsconfig.playground.json playground/main.ts\""},"version":"0.3.1","_npmUser":{"name":"ciwer","email":"bagusp81@gmail.com"},"_npmVersion":"10.9.9","description":"NestJS wrapper for Midtrans configuration and injectable services.","directories":{},"maintainers":[{"name":"ciwer","email":"bagusp81@gmail.com"}],"_nodeVersion":"22.23.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","nodemon":"^3.1.14","ts-node":"^10.9.2","typescript":"^5.5.0","@types/node":"^22.0.0","@nestjs/core":"^11.1.6","@nestjs/common":"^11.1.6","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","reflect-metadata":"^0.2.2","@nestjs/platform-express":"^11.1.6"},"peerDependencies":{"rxjs":"^7.8.0","@nestjs/common":"^10.0.0 || ^11.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-midtrans_0.3.1_1790672273930_0.23016429000167737"}}},"time":{"created":"2026-06-07T10:23:42.235Z","modified":"2026-09-29T08:57:54.179Z","0.1.0":"2026-06-07T10:23:42.495Z","0.2.1":"2026-06-20T18:41:11.969Z","0.3.1":"2026-09-29T08:57:54.011Z"},"license":"MIT","description":"NestJS wrapper for Midtrans configuration and injectable services.","maintainers":[{"name":"ciwer","email":"bagusp81@gmail.com"}],"readme":"# @ciwergrp/nestjs-midtrans\n\nNestJS module for calling Midtrans APIs from injectable services.\n\nThe package currently supports Midtrans Snap transaction creation and payment URL generation. It also supports static configuration, async configuration, per-call runtime configuration, custom fetch wrappers, request/response interceptors, and request timeouts.\n\n## Installation\n\n```bash\nnpm install @ciwergrp/nestjs-midtrans\n```\n\n## Register the module\n\nUse `forRoot()` when the Midtrans keys are known when the app starts.\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { MidtransModule } from '@ciwergrp/nestjs-midtrans';\n\n@Module({\n  imports: [\n    MidtransModule.forRoot({\n      serverKey: process.env.MIDTRANS_SERVER_KEY!,\n      clientKey: process.env.MIDTRANS_CLIENT_KEY!,\n      environment: 'sandbox',\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n## Async configuration\n\nUse `forRootAsync()` when keys come from another Nest provider, such as `ConfigService`.\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { MidtransModule } from '@ciwergrp/nestjs-midtrans';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot(),\n    MidtransModule.forRootAsync({\n      imports: [ConfigModule],\n      inject: [ConfigService],\n      useFactory: (config: ConfigService) => ({\n        serverKey: config.getOrThrow<string>('MIDTRANS_SERVER_KEY'),\n        clientKey: config.getOrThrow<string>('MIDTRANS_CLIENT_KEY'),\n        environment: config.get<'sandbox' | 'production'>('MIDTRANS_ENVIRONMENT', 'sandbox'),\n      }),\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n## Runtime configuration\n\nUse `resolveConfig` when the Midtrans keys must be resolved for each API call. This is useful when the keys come from a database or another runtime source and changes should take effect without restarting the app.\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { MidtransModule } from '@ciwergrp/nestjs-midtrans';\nimport { PaymentConfigModule } from './payment-config.module';\nimport { PaymentConfigService } from './payment-config.service';\n\n@Module({\n  imports: [\n    PaymentConfigModule,\n    MidtransModule.forRootAsync({\n      imports: [PaymentConfigModule],\n      inject: [PaymentConfigService],\n      useFactory: (paymentConfig: PaymentConfigService) => ({\n        resolveConfig: async (context) => {\n          const config = await paymentConfig.getMidtransConfig(context);\n\n          return {\n            serverKey: config.serverKey,\n            clientKey: config.clientKey,\n            environment: config.environment,\n          };\n        },\n      }),\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nPass any project-specific context when calling a Midtrans method:\n\n```ts\nawait this.midtrans.createSnapTransaction(payload, {\n  context: {\n    configKey: 'store-1',\n  },\n});\n```\n\nThe library does not inspect or require any specific `context` fields. It only passes the object to `resolveConfig`.\n\n## Per-call configuration\n\nYou can also override the Midtrans config for a single call.\n\n```ts\nawait this.midtrans.generateSnapPaymentUrl(payload, {\n  config: {\n    serverKey: runtimeConfig.serverKey,\n    clientKey: runtimeConfig.clientKey,\n    environment: runtimeConfig.environment,\n  },\n});\n```\n\nPer-call `config` has the highest priority, then `resolveConfig`, then the static config from `forRoot()` or `forRootAsync()`.\n\n## Default Snap callback URLs\n\nSet `snapCallbacks` when you want default redirect URLs for Snap transactions.\n\n```ts\nMidtransModule.forRoot({\n  serverKey: process.env.MIDTRANS_SERVER_KEY!,\n  clientKey: process.env.MIDTRANS_CLIENT_KEY,\n  environment: 'sandbox',\n  snapCallbacks: {\n    finish: 'https://your-app.com/payment/finish',\n    error: 'https://your-app.com/payment/error',\n  },\n});\n```\n\nThese defaults are merged into every Snap transaction payload. Per-transaction `callbacks` still win, so you can add custom query strings for a specific payment.\n\n```ts\nawait this.midtrans.createSnapTransaction({\n  transaction_details: {\n    order_id: 'ORDER-101',\n    gross_amount: 10000,\n  },\n  callbacks: {\n    finish: `https://your-app.com/payment/finish?order_id=ORDER-101`,\n  },\n});\n```\n\n## Inject in a service\n\n```ts\nimport { Injectable } from '@nestjs/common';\nimport { MidtransService } from '@ciwergrp/nestjs-midtrans';\n\n@Injectable()\nexport class PaymentsService {\n  constructor(private readonly midtrans: MidtransService) {}\n\n  getMidtransEnvironment() {\n    return {\n      environment: this.midtrans.environment,\n      baseUrl: this.midtrans.baseUrl,\n      snapBaseUrl: this.midtrans.snapBaseUrl,\n    };\n  }\n}\n```\n\n## Generate a Snap payment URL\n\n```ts\nimport { Injectable } from '@nestjs/common';\nimport { MidtransService } from '@ciwergrp/nestjs-midtrans';\n\n@Injectable()\nexport class PaymentsService {\n  constructor(private readonly midtrans: MidtransService) {}\n\n  async createPaymentUrl() {\n    return this.midtrans.generateSnapPaymentUrl({\n      transaction_details: {\n        order_id: 'ORDER-101',\n        gross_amount: 10000,\n      },\n      credit_card: {\n        secure: true,\n      },\n    });\n  }\n}\n```\n\nUse `createSnapTransaction()` when you need both values returned by Midtrans:\n\n```ts\nconst transaction = await this.midtrans.createSnapTransaction({\n  transaction_details: {\n    order_id: 'ORDER-101',\n    gross_amount: 10000,\n  },\n});\n\nconsole.log(transaction.token);\nconsole.log(transaction.redirect_url);\n```\n\nBoth Snap methods accept optional request options:\n\n```ts\nawait this.midtrans.createSnapTransaction(payload, {\n  context: {\n    configKey: 'store-1',\n  },\n  timeoutMs: 10000,\n});\n```\n\n## Charge a Core transaction\n\nCore Charge currently supports Bank Transfer and E-Wallet payload types.\nCore Charge payloads are validated before the request is sent to Midtrans. The package does not rely on Midtrans fallback behavior for `payment_type`, `bank_transfer.bank`, QRIS acquirer, or required e-wallet fields.\nValidation also checks shared fields such as `transaction_details`, `item_details`, `customer_details`, and `custom_expiry`, and rejects payment-specific objects that do not belong to the selected `payment_type`.\n\nBank Transfer examples:\n\n```ts\nawait this.midtrans.chargeCoreTransaction({\n  payment_type: 'bank_transfer',\n  transaction_details: {\n    order_id: 'ORDER-101',\n    gross_amount: 10000,\n  },\n  bank_transfer: {\n    bank: 'bca',\n  },\n});\n\nawait this.midtrans.chargeCoreTransaction({\n  payment_type: 'permata',\n  transaction_details: {\n    order_id: 'ORDER-102',\n    gross_amount: 10000,\n  },\n});\n\nawait this.midtrans.chargeCoreTransaction({\n  payment_type: 'echannel',\n  transaction_details: {\n    order_id: 'ORDER-103',\n    gross_amount: 10000,\n  },\n  echannel: {\n    bill_info1: 'Payment:',\n    bill_info2: 'Online purchase',\n  },\n});\n```\n\nE-Wallet examples:\n\n```ts\nawait this.midtrans.chargeCoreTransaction({\n  payment_type: 'gopay',\n  transaction_details: {\n    order_id: 'ORDER-104',\n    gross_amount: 10000,\n  },\n  gopay: {\n    enable_callback: true,\n    callback_url: 'https://your-app.com/payment/gopay',\n  },\n});\n\nawait this.midtrans.chargeCoreTransaction({\n  payment_type: 'qris',\n  transaction_details: {\n    order_id: 'ORDER-105',\n    gross_amount: 10000,\n  },\n  qris: {\n    acquirer: 'gopay',\n  },\n});\n\nawait this.midtrans.chargeCoreTransaction({\n  payment_type: 'shopeepay',\n  transaction_details: {\n    order_id: 'ORDER-106',\n    gross_amount: 10000,\n  },\n  shopeepay: {\n    callback_url: 'https://your-app.com/payment/shopeepay',\n  },\n});\n```\n\nCore Charge accepts the same optional request options as Snap methods.\n\n## Transaction operations\n\nTransaction operations use the Core API base URL and work for both Snap and Core transactions where Midtrans supports the operation.\n\n```ts\nconst status = await this.midtrans.getTransactionStatus('ORDER-101');\n\nconsole.log(status.transaction_status);\n```\n\nAvailable methods:\n\n```ts\nawait this.midtrans.getTransactionStatus('ORDER-101');\nawait this.midtrans.getB2bTransactionStatus('ORDER-101', {\n  page: 0,\n  perPage: 10,\n});\nawait this.midtrans.approveTransaction('ORDER-101');\nawait this.midtrans.denyTransaction('ORDER-101');\nawait this.midtrans.cancelTransaction('ORDER-101');\nawait this.midtrans.expireTransaction('ORDER-101');\nawait this.midtrans.refundTransaction('ORDER-101', {\n  refund_key: 'ORDER-101-refund-1',\n  amount: 5000,\n  reason: 'Item out of stock',\n});\nawait this.midtrans.captureTransaction({\n  transaction_id: 'transaction-id',\n  gross_amount: 10000,\n});\n```\n\nThese methods accept the same optional request options as Snap methods:\n\n```ts\nawait this.midtrans.getTransactionStatus('ORDER-101', {\n  context: {\n    configKey: 'store-1',\n  },\n  timeoutMs: 10000,\n});\n```\n\n## Custom fetch and interceptors\n\nUse `fetch`, `requestInterceptor`, and `responseInterceptor` to add logging, tracing, retries, custom headers, proxies, or tests around outgoing Midtrans requests.\n\n```ts\nMidtransModule.forRoot({\n  serverKey: process.env.MIDTRANS_SERVER_KEY!,\n  clientKey: process.env.MIDTRANS_CLIENT_KEY,\n  environment: 'sandbox',\n  timeoutMs: 10000,\n  fetch: async (url, init) => fetch(url, init),\n  requestInterceptor: (request) => {\n    console.log('Midtrans request:', request.method, request.url);\n\n    return request;\n  },\n  responseInterceptor: (response, request) => {\n    console.log('Midtrans response:', request.url, response.status);\n\n    return response;\n  },\n});\n```\n\nThe default timeout is `30000` milliseconds. Set `timeoutMs: false` to disable the package timeout.\n\n## Options\n\n| Option | Required | Default | Description |\n| --- | --- | --- | --- |\n| `serverKey` | Yes, unless `resolveConfig` is used | - | Midtrans server key for backend operations. |\n| `clientKey` | No | - | Midtrans client key for frontend/Snap configuration. |\n| `environment` | No | `sandbox` | Either `sandbox` or `production`. |\n| `baseUrl` | No | Based on environment | Midtrans API base URL override. |\n| `snapBaseUrl` | No | Based on environment | Midtrans Snap base URL override. |\n| `snapCallbacks` | No | - | Default Snap redirect callback URLs. Payload callbacks override these values. |\n| `isProduction` | No | Derived from environment | Compatibility flag matching Midtrans Node.js client config style. |\n| `isGlobal` | No | `false` | Makes the Nest module global when set to `true`. |\n| `fetch` | No | `globalThis.fetch` | Custom fetch implementation or wrapper. |\n| `requestInterceptor` | No | - | Hook called before the request is sent. |\n| `responseInterceptor` | No | - | Hook called after a response is received. |\n| `resolveConfig` | No | - | Function used to resolve Midtrans config for every API call. |\n| `timeoutMs` | No | `30000` | Request timeout in milliseconds. Use `false` to disable. |\n\nDefault URLs:\n\n| Environment | `baseUrl` | `snapBaseUrl` |\n| --- | --- | --- |\n| `sandbox` | `https://api.sandbox.midtrans.com` | `https://app.sandbox.midtrans.com/snap` |\n| `production` | `https://api.midtrans.com` | `https://app.midtrans.com/snap` |\n","readmeFilename":"README.md"}