@atbas/m-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +364 -0
- package/dist/builder/transaction-builder.d.ts +53 -0
- package/dist/builder/transaction-builder.d.ts.map +1 -0
- package/dist/builder/transaction-builder.js +159 -0
- package/dist/builder/transaction-builder.js.map +1 -0
- package/dist/catalogue/default-catalogue.d.ts +18 -0
- package/dist/catalogue/default-catalogue.d.ts.map +1 -0
- package/dist/catalogue/default-catalogue.js +21 -0
- package/dist/catalogue/default-catalogue.js.map +1 -0
- package/dist/catalogue/endpoints.d.ts +22 -0
- package/dist/catalogue/endpoints.d.ts.map +1 -0
- package/dist/catalogue/endpoints.js +24 -0
- package/dist/catalogue/endpoints.js.map +1 -0
- package/dist/catalogue/flows.d.ts +32 -0
- package/dist/catalogue/flows.d.ts.map +1 -0
- package/dist/catalogue/flows.js +64 -0
- package/dist/catalogue/flows.js.map +1 -0
- package/dist/catalogue/hash-options.d.ts +112 -0
- package/dist/catalogue/hash-options.d.ts.map +1 -0
- package/dist/catalogue/hash-options.js +151 -0
- package/dist/catalogue/hash-options.js.map +1 -0
- package/dist/catalogue/types.d.ts +279 -0
- package/dist/catalogue/types.d.ts.map +1 -0
- package/dist/catalogue/types.js +360 -0
- package/dist/catalogue/types.js.map +1 -0
- package/dist/codegen/generate.d.ts +14 -0
- package/dist/codegen/generate.d.ts.map +1 -0
- package/dist/codegen/generate.js +490 -0
- package/dist/codegen/generate.js.map +1 -0
- package/dist/codegen/languages/node.d.ts +3 -0
- package/dist/codegen/languages/node.d.ts.map +1 -0
- package/dist/codegen/languages/node.js +32 -0
- package/dist/codegen/languages/node.js.map +1 -0
- package/dist/codegen/languages/php.d.ts +3 -0
- package/dist/codegen/languages/php.d.ts.map +1 -0
- package/dist/codegen/languages/php.js +27 -0
- package/dist/codegen/languages/php.js.map +1 -0
- package/dist/codegen/languages/python.d.ts +3 -0
- package/dist/codegen/languages/python.d.ts.map +1 -0
- package/dist/codegen/languages/python.js +27 -0
- package/dist/codegen/languages/python.js.map +1 -0
- package/dist/codegen/renderer.d.ts +24 -0
- package/dist/codegen/renderer.d.ts.map +1 -0
- package/dist/codegen/renderer.js +59 -0
- package/dist/codegen/renderer.js.map +1 -0
- package/dist/codegen/types.d.ts +50 -0
- package/dist/codegen/types.d.ts.map +1 -0
- package/dist/codegen/types.js +5 -0
- package/dist/codegen/types.js.map +1 -0
- package/dist/config/credentials.d.ts +64 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +216 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/environment.d.ts +23 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +54 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/core/dependencies.d.ts +43 -0
- package/dist/core/dependencies.d.ts.map +1 -0
- package/dist/core/dependencies.js +2 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/registry.d.ts +33 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +13 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/server.d.ts +61 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +90 -0
- package/dist/core/server.js.map +1 -0
- package/dist/dependencies.d.ts +28 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +2 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/diagnostics/diagnose.d.ts +43 -0
- package/dist/diagnostics/diagnose.d.ts.map +1 -0
- package/dist/diagnostics/diagnose.js +121 -0
- package/dist/diagnostics/diagnose.js.map +1 -0
- package/dist/domain/amount.d.ts +157 -0
- package/dist/domain/amount.d.ts.map +1 -0
- package/dist/domain/amount.js +275 -0
- package/dist/domain/amount.js.map +1 -0
- package/dist/domain/datetime.d.ts +95 -0
- package/dist/domain/datetime.d.ts.map +1 -0
- package/dist/domain/datetime.js +211 -0
- package/dist/domain/datetime.js.map +1 -0
- package/dist/domain/response-codes.d.ts +116 -0
- package/dist/domain/response-codes.d.ts.map +1 -0
- package/dist/domain/response-codes.js +380 -0
- package/dist/domain/response-codes.js.map +1 -0
- package/dist/domain/secure-hash.d.ts +78 -0
- package/dist/domain/secure-hash.d.ts.map +1 -0
- package/dist/domain/secure-hash.js +69 -0
- package/dist/domain/secure-hash.js.map +1 -0
- package/dist/domain/signature/jazzcash.d.ts +56 -0
- package/dist/domain/signature/jazzcash.d.ts.map +1 -0
- package/dist/domain/signature/jazzcash.js +214 -0
- package/dist/domain/signature/jazzcash.js.map +1 -0
- package/dist/domain/signature/registry.d.ts +69 -0
- package/dist/domain/signature/registry.d.ts.map +1 -0
- package/dist/domain/signature/registry.js +92 -0
- package/dist/domain/signature/registry.js.map +1 -0
- package/dist/domain/signature/scheme.d.ts +349 -0
- package/dist/domain/signature/scheme.d.ts.map +1 -0
- package/dist/domain/signature/scheme.js +398 -0
- package/dist/domain/signature/scheme.js.map +1 -0
- package/dist/domain/txn-ref.d.ts +76 -0
- package/dist/domain/txn-ref.d.ts.map +1 -0
- package/dist/domain/txn-ref.js +126 -0
- package/dist/domain/txn-ref.js.map +1 -0
- package/dist/domain/types.d.ts +45 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +70 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/errors.d.ts +84 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +87 -0
- package/dist/errors.js.map +1 -0
- package/dist/gateway/checkout-form.d.ts +16 -0
- package/dist/gateway/checkout-form.d.ts.map +1 -0
- package/dist/gateway/checkout-form.js +103 -0
- package/dist/gateway/checkout-form.js.map +1 -0
- package/dist/gateway/checkout-output.d.ts +70 -0
- package/dist/gateway/checkout-output.d.ts.map +1 -0
- package/dist/gateway/checkout-output.js +199 -0
- package/dist/gateway/checkout-output.js.map +1 -0
- package/dist/gateway/guards.d.ts +37 -0
- package/dist/gateway/guards.d.ts.map +1 -0
- package/dist/gateway/guards.js +44 -0
- package/dist/gateway/guards.js.map +1 -0
- package/dist/gateway/http-client.d.ts +42 -0
- package/dist/gateway/http-client.d.ts.map +1 -0
- package/dist/gateway/http-client.js +153 -0
- package/dist/gateway/http-client.js.map +1 -0
- package/dist/gateway/rest-client.d.ts +42 -0
- package/dist/gateway/rest-client.d.ts.map +1 -0
- package/dist/gateway/rest-client.js +241 -0
- package/dist/gateway/rest-client.js.map +1 -0
- package/dist/gateway/transport.d.ts +31 -0
- package/dist/gateway/transport.d.ts.map +1 -0
- package/dist/gateway/transport.js +73 -0
- package/dist/gateway/transport.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/install/cli.d.ts +38 -0
- package/dist/install/cli.d.ts.map +1 -0
- package/dist/install/cli.js +274 -0
- package/dist/install/cli.js.map +1 -0
- package/dist/install/harnesses.d.ts +74 -0
- package/dist/install/harnesses.d.ts.map +1 -0
- package/dist/install/harnesses.js +263 -0
- package/dist/install/harnesses.js.map +1 -0
- package/dist/knowledge/corpus.d.ts +15 -0
- package/dist/knowledge/corpus.d.ts.map +1 -0
- package/dist/knowledge/corpus.js +129 -0
- package/dist/knowledge/corpus.js.map +1 -0
- package/dist/knowledge/search.d.ts +29 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +181 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/source.d.ts +60 -0
- package/dist/knowledge/source.d.ts.map +1 -0
- package/dist/knowledge/source.js +91 -0
- package/dist/knowledge/source.js.map +1 -0
- package/dist/knowledge/types.d.ts +40 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +19 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/paths.d.ts +26 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +106 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompts/integration-walkthrough.d.ts +11 -0
- package/dist/prompts/integration-walkthrough.d.ts.map +1 -0
- package/dist/prompts/integration-walkthrough.js +52 -0
- package/dist/prompts/integration-walkthrough.js.map +1 -0
- package/dist/prompts/register.d.ts +4 -0
- package/dist/prompts/register.d.ts.map +1 -0
- package/dist/prompts/register.js +4 -0
- package/dist/prompts/register.js.map +1 -0
- package/dist/registry.d.ts +14 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/dist/resources/knowledge-resources.d.ts +5 -0
- package/dist/resources/knowledge-resources.d.ts.map +1 -0
- package/dist/resources/knowledge-resources.js +121 -0
- package/dist/resources/knowledge-resources.js.map +1 -0
- package/dist/resources/register.d.ts +4 -0
- package/dist/resources/register.d.ts.map +1 -0
- package/dist/resources/register.js +8 -0
- package/dist/resources/register.js.map +1 -0
- package/dist/server.d.ts +40 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +56 -0
- package/dist/server.js.map +1 -0
- package/dist/telemetry/logger.d.ts +31 -0
- package/dist/telemetry/logger.d.ts.map +1 -0
- package/dist/telemetry/logger.js +67 -0
- package/dist/telemetry/logger.js.map +1 -0
- package/dist/telemetry/redaction.d.ts +88 -0
- package/dist/telemetry/redaction.d.ts.map +1 -0
- package/dist/telemetry/redaction.js +238 -0
- package/dist/telemetry/redaction.js.map +1 -0
- package/dist/tools/build-transaction-parameters.d.ts +10 -0
- package/dist/tools/build-transaction-parameters.d.ts.map +1 -0
- package/dist/tools/build-transaction-parameters.js +154 -0
- package/dist/tools/build-transaction-parameters.js.map +1 -0
- package/dist/tools/call-context.d.ts +47 -0
- package/dist/tools/call-context.d.ts.map +1 -0
- package/dist/tools/call-context.js +15 -0
- package/dist/tools/call-context.js.map +1 -0
- package/dist/tools/codegen-tools.d.ts +4 -0
- package/dist/tools/codegen-tools.d.ts.map +1 -0
- package/dist/tools/codegen-tools.js +131 -0
- package/dist/tools/codegen-tools.js.map +1 -0
- package/dist/tools/credential-tools.d.ts +32 -0
- package/dist/tools/credential-tools.d.ts.map +1 -0
- package/dist/tools/credential-tools.js +65 -0
- package/dist/tools/credential-tools.js.map +1 -0
- package/dist/tools/descriptor.d.ts +52 -0
- package/dist/tools/descriptor.d.ts.map +1 -0
- package/dist/tools/descriptor.js +2 -0
- package/dist/tools/descriptor.js.map +1 -0
- package/dist/tools/diagnostic-tools.d.ts +3 -0
- package/dist/tools/diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/diagnostic-tools.js +128 -0
- package/dist/tools/diagnostic-tools.js.map +1 -0
- package/dist/tools/gateway-tools.d.ts +6 -0
- package/dist/tools/gateway-tools.d.ts.map +1 -0
- package/dist/tools/gateway-tools.js +381 -0
- package/dist/tools/gateway-tools.js.map +1 -0
- package/dist/tools/hash-tools.d.ts +5 -0
- package/dist/tools/hash-tools.d.ts.map +1 -0
- package/dist/tools/hash-tools.js +238 -0
- package/dist/tools/hash-tools.js.map +1 -0
- package/dist/tools/knowledge-tools.d.ts +7 -0
- package/dist/tools/knowledge-tools.d.ts.map +1 -0
- package/dist/tools/knowledge-tools.js +247 -0
- package/dist/tools/knowledge-tools.js.map +1 -0
- package/dist/tools/onboarding-checklist.d.ts +3 -0
- package/dist/tools/onboarding-checklist.d.ts.map +1 -0
- package/dist/tools/onboarding-checklist.js +141 -0
- package/dist/tools/onboarding-checklist.js.map +1 -0
- package/dist/tools/register.d.ts +60 -0
- package/dist/tools/register.d.ts.map +1 -0
- package/dist/tools/register.js +145 -0
- package/dist/tools/register.js.map +1 -0
- package/dist/tools/tool-kit.d.ts +88 -0
- package/dist/tools/tool-kit.d.ts.map +1 -0
- package/dist/tools/tool-kit.js +297 -0
- package/dist/tools/tool-kit.js.map +1 -0
- package/dist/validation/payload-validator.d.ts +29 -0
- package/dist/validation/payload-validator.d.ts.map +1 -0
- package/dist/validation/payload-validator.js +79 -0
- package/dist/validation/payload-validator.js.map +1 -0
- package/dist/validation/rules/amount.d.ts +3 -0
- package/dist/validation/rules/amount.d.ts.map +1 -0
- package/dist/validation/rules/amount.js +77 -0
- package/dist/validation/rules/amount.js.map +1 -0
- package/dist/validation/rules/bill-reference.d.ts +10 -0
- package/dist/validation/rules/bill-reference.d.ts.map +1 -0
- package/dist/validation/rules/bill-reference.js +34 -0
- package/dist/validation/rules/bill-reference.js.map +1 -0
- package/dist/validation/rules/cnic.d.ts +3 -0
- package/dist/validation/rules/cnic.d.ts.map +1 -0
- package/dist/validation/rules/cnic.js +42 -0
- package/dist/validation/rules/cnic.js.map +1 -0
- package/dist/validation/rules/constants.d.ts +9 -0
- package/dist/validation/rules/constants.d.ts.map +1 -0
- package/dist/validation/rules/constants.js +28 -0
- package/dist/validation/rules/constants.js.map +1 -0
- package/dist/validation/rules/constraints.d.ts +3 -0
- package/dist/validation/rules/constraints.d.ts.map +1 -0
- package/dist/validation/rules/constraints.js +113 -0
- package/dist/validation/rules/constraints.js.map +1 -0
- package/dist/validation/rules/datetime.d.ts +3 -0
- package/dist/validation/rules/datetime.d.ts.map +1 -0
- package/dist/validation/rules/datetime.js +49 -0
- package/dist/validation/rules/datetime.js.map +1 -0
- package/dist/validation/rules/empty-string.d.ts +13 -0
- package/dist/validation/rules/empty-string.d.ts.map +1 -0
- package/dist/validation/rules/empty-string.js +32 -0
- package/dist/validation/rules/empty-string.js.map +1 -0
- package/dist/validation/rules/expiry.d.ts +3 -0
- package/dist/validation/rules/expiry.d.ts.map +1 -0
- package/dist/validation/rules/expiry.js +52 -0
- package/dist/validation/rules/expiry.js.map +1 -0
- package/dist/validation/rules/msisdn.d.ts +3 -0
- package/dist/validation/rules/msisdn.d.ts.map +1 -0
- package/dist/validation/rules/msisdn.js +45 -0
- package/dist/validation/rules/msisdn.js.map +1 -0
- package/dist/validation/rules/presence.d.ts +3 -0
- package/dist/validation/rules/presence.d.ts.map +1 -0
- package/dist/validation/rules/presence.js +90 -0
- package/dist/validation/rules/presence.js.map +1 -0
- package/dist/validation/rules/return-url.d.ts +14 -0
- package/dist/validation/rules/return-url.d.ts.map +1 -0
- package/dist/validation/rules/return-url.js +58 -0
- package/dist/validation/rules/return-url.js.map +1 -0
- package/dist/validation/rules/tool-argument.d.ts +16 -0
- package/dist/validation/rules/tool-argument.d.ts.map +1 -0
- package/dist/validation/rules/tool-argument.js +38 -0
- package/dist/validation/rules/tool-argument.js.map +1 -0
- package/dist/validation/rules/txn-ref.d.ts +3 -0
- package/dist/validation/rules/txn-ref.d.ts.map +1 -0
- package/dist/validation/rules/txn-ref.js +47 -0
- package/dist/validation/rules/txn-ref.js.map +1 -0
- package/dist/validation/rules/unknown-fields.d.ts +10 -0
- package/dist/validation/rules/unknown-fields.d.ts.map +1 -0
- package/dist/validation/rules/unknown-fields.js +29 -0
- package/dist/validation/rules/unknown-fields.js.map +1 -0
- package/dist/validation/types.d.ts +36 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +12 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/version.d.ts +23 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/knowledge/diagnostics/symptoms.json +321 -0
- package/knowledge/docs/bnpl-guide.md +77 -0
- package/knowledge/docs/card-page-redirection.md +67 -0
- package/knowledge/docs/card-refund.md +91 -0
- package/knowledge/docs/hmac-sha256-calculation.md +72 -0
- package/knowledge/docs/index.json +189 -0
- package/knowledge/docs/ipn-implementation.md +89 -0
- package/knowledge/docs/mwallet-recurring.md +117 -0
- package/knowledge/docs/mwallet-refund.md +65 -0
- package/knowledge/docs/mwallet-rest-v1-1.md +126 -0
- package/knowledge/docs/mwallet-rest-v2-0-cnic.md +113 -0
- package/knowledge/docs/portal-guide.md +45 -0
- package/knowledge/docs/shopify-guide.md +74 -0
- package/knowledge/docs/status-inquiry-2025-26.md +32 -0
- package/knowledge/docs/status-inquiry.md +111 -0
- package/knowledge/docs/wordpress-guide.md +49 -0
- package/knowledge/flow.schema.json +390 -0
- package/knowledge/flows/bnpl-page-redirection-v1.1.json +211 -0
- package/knowledge/flows/card-page-redirection-v1.1.json +211 -0
- package/knowledge/flows/mwallet-rest-v1.1.json +187 -0
- package/knowledge/flows/mwallet-rest-v2.0-cnic.json +197 -0
- package/knowledge/flows/mwallet-token-pay-v4.0.json +130 -0
- package/knowledge/flows/refund-bnpl.json +105 -0
- package/knowledge/flows/refund-card-v1.1.json +112 -0
- package/knowledge/flows/refund-card-v2.0.json +121 -0
- package/knowledge/flows/refund-mwallet-v1.1.json +106 -0
- package/knowledge/flows/status-inquiry-v1.1.json +102 -0
- package/knowledge/flows/status-inquiry-v2.0.json +103 -0
- package/knowledge/flows/token-delete-v1.json +85 -0
- package/knowledge/flows/token-inquiry-v1.json +85 -0
- package/knowledge/flows/wallet-linking-portal.json +103 -0
- package/knowledge/templates/node/checkout-redirect.tmpl +166 -0
- package/knowledge/templates/node/ipn-handler.tmpl +108 -0
- package/knowledge/templates/node/rest-client.tmpl +197 -0
- package/knowledge/templates/node/wallet-linking.tmpl +147 -0
- package/knowledge/templates/php/checkout-redirect.tmpl +149 -0
- package/knowledge/templates/php/ipn-handler.tmpl +105 -0
- package/knowledge/templates/php/rest-client.tmpl +191 -0
- package/knowledge/templates/php/wallet-linking.tmpl +137 -0
- package/knowledge/templates/python/checkout-redirect.tmpl +148 -0
- package/knowledge/templates/python/ipn-handler.tmpl +110 -0
- package/knowledge/templates/python/rest-client.tmpl +179 -0
- package/knowledge/templates/python/wallet-linking.tmpl +133 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/codegen/generate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAQ7D,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAGb,YAAY,EAEb,MAAM,YAAY,CAAC;AAmfpB,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAqBnE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,YAAY,EAAE,CAW7E"}
|
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { resolveEndpoint } from '../catalogue/endpoints.js';
|
|
2
|
+
import { signatureFieldName } from '../catalogue/hash-options.js';
|
|
3
|
+
import { JazzCashValidationError } from '../errors.js';
|
|
4
|
+
import { describeTransportMismatch } from '../gateway/transport.js';
|
|
5
|
+
import { CORPUS_VERSION } from '../version.js';
|
|
6
|
+
import { nodeAdapter } from './languages/node.js';
|
|
7
|
+
import { phpAdapter } from './languages/php.js';
|
|
8
|
+
import { pythonAdapter } from './languages/python.js';
|
|
9
|
+
import { loadTemplate, render } from './renderer.js';
|
|
10
|
+
/**
|
|
11
|
+
* Bind a flow specification to a language template.
|
|
12
|
+
*
|
|
13
|
+
* The parameter list is derived from the catalogue rather than written into the
|
|
14
|
+
* template, so generated code can never drift from the documented field set.
|
|
15
|
+
* Credentials and runtime values are assigned separately, after the literal, so
|
|
16
|
+
* a secret is never embedded in generated source.
|
|
17
|
+
*/
|
|
18
|
+
const ADAPTERS = {
|
|
19
|
+
php: phpAdapter,
|
|
20
|
+
node: nodeAdapter,
|
|
21
|
+
python: pythonAdapter,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Fields every template assigns at runtime rather than from the literal.
|
|
25
|
+
*
|
|
26
|
+
* Credentials, timestamps and references are computed by the generated code, so
|
|
27
|
+
* embedding them in the literal would either bake in a secret or emit a stale
|
|
28
|
+
* value.
|
|
29
|
+
*/
|
|
30
|
+
const RUNTIME_ASSIGNED_EVERYWHERE = new Set([
|
|
31
|
+
'pp_MerchantID',
|
|
32
|
+
'pp_Password',
|
|
33
|
+
'pp_MerchantMPIN',
|
|
34
|
+
'pp_ReturnURL',
|
|
35
|
+
'pp_TxnDateTime',
|
|
36
|
+
'pp_TxnExpiryDateTime',
|
|
37
|
+
'pp_TxnRefNo',
|
|
38
|
+
'pp_RequestID',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Business fields only SOME templates assign at runtime.
|
|
42
|
+
*
|
|
43
|
+
* The checkout and wallet-linking templates carry an order-data block and fill
|
|
44
|
+
* these in themselves. The REST client has no such block, so treating them as
|
|
45
|
+
* runtime-assigned there dropped them from the generated file entirely: code
|
|
46
|
+
* that moves money with no amount in it, and no `TODO` for the merchant to
|
|
47
|
+
* replace.
|
|
48
|
+
*/
|
|
49
|
+
const RUNTIME_ASSIGNED_BUSINESS_FIELDS = new Set(['pp_Amount', 'pp_BillReference', 'pp_Description', 'pp_MSISDN']);
|
|
50
|
+
/**
|
|
51
|
+
* Whether the template assigns `name` itself, so the literal must omit it.
|
|
52
|
+
*
|
|
53
|
+
* The signature field is taken from the flow rather than listed above, because
|
|
54
|
+
* `pp_SecureHash` is only JazzCash's name for it. Spelled as a literal, a flow
|
|
55
|
+
* that signs into `vp_Signature` had that field emitted into the parameter map
|
|
56
|
+
* as a `TODO` for the merchant to fill in by hand — a signature the generated
|
|
57
|
+
* code computes being asked of the reader instead.
|
|
58
|
+
*/
|
|
59
|
+
function isRuntimeAssigned(flow, name, kind) {
|
|
60
|
+
if (name === signatureFieldName(flow) || RUNTIME_ASSIGNED_EVERYWHERE.has(name)) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return kind !== 'rest-client' && RUNTIME_ASSIGNED_BUSINESS_FIELDS.has(name);
|
|
64
|
+
}
|
|
65
|
+
const TODO = 'TODO';
|
|
66
|
+
/** The exact rupees-to-minor-units helper each generated file ships. */
|
|
67
|
+
const MINOR_UNITS_HELPER = {
|
|
68
|
+
php: 'jazzcash_to_minor_units()',
|
|
69
|
+
node: 'toMinorUnits()',
|
|
70
|
+
python: 'to_minor_units()',
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Build the literal parameter map a template embeds.
|
|
74
|
+
*
|
|
75
|
+
* Constants get their fixed value, `must-be-empty` fields get `''`, and business
|
|
76
|
+
* fields the merchant must supply get a `TODO` marker rather than a plausible
|
|
77
|
+
* placeholder that could be shipped unnoticed. A field is omitted only when the
|
|
78
|
+
* template provably assigns it, which `isRuntimeAssigned` decides per kind: a
|
|
79
|
+
* mandatory field that is neither in the literal nor assigned at runtime would
|
|
80
|
+
* leave the generated request incomplete with nothing to tell the merchant so.
|
|
81
|
+
*/
|
|
82
|
+
function literalParameters(flow, kind) {
|
|
83
|
+
const entries = new Map();
|
|
84
|
+
for (const parameter of flow.parameters) {
|
|
85
|
+
if (isRuntimeAssigned(flow, parameter.name, kind)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (parameter.valueType === 'constant') {
|
|
89
|
+
entries.set(parameter.name, parameter.constantValue ?? flow.constants[parameter.name] ?? '');
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (parameter.requirement === 'must-be-empty' || parameter.requirement === 'optional') {
|
|
93
|
+
entries.set(parameter.name, '');
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
entries.set(parameter.name, `${TODO}: ${parameter.notes}`);
|
|
97
|
+
}
|
|
98
|
+
return entries;
|
|
99
|
+
}
|
|
100
|
+
/** Runtime assignments the template appends after the literal, per language. */
|
|
101
|
+
function runtimeOverrides(flow, language) {
|
|
102
|
+
const lines = [];
|
|
103
|
+
const needsMpin = flow.parameters.some((parameter) => parameter.name === 'pp_MerchantMPIN');
|
|
104
|
+
const assign = (name, expression) => {
|
|
105
|
+
switch (language) {
|
|
106
|
+
case 'php':
|
|
107
|
+
lines.push(`$params['${name}'] = ${expression};`);
|
|
108
|
+
break;
|
|
109
|
+
case 'node':
|
|
110
|
+
lines.push(` ${name}: ${expression},`);
|
|
111
|
+
break;
|
|
112
|
+
case 'python':
|
|
113
|
+
lines.push(` parameters['${name}'] = ${expression}`);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const envRead = (variable) => {
|
|
118
|
+
switch (language) {
|
|
119
|
+
case 'php':
|
|
120
|
+
return `getenv('${variable}') ?: ''`;
|
|
121
|
+
case 'node':
|
|
122
|
+
return `process.env.${variable} ?? ''`;
|
|
123
|
+
case 'python':
|
|
124
|
+
return `os.environ.get('${variable}', '')`;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Call the template's reference builder rather than inlining a timestamp.
|
|
129
|
+
*
|
|
130
|
+
* A wall-clock stamp alone is not unique: two orders placed in the same
|
|
131
|
+
* millisecond produce the same reference, which the gateway rejects as a
|
|
132
|
+
* duplicate. The builder appends random characters from the language's
|
|
133
|
+
* cryptographic source, inside the documented 20-character limit.
|
|
134
|
+
*/
|
|
135
|
+
const reference = (prefix) => {
|
|
136
|
+
switch (language) {
|
|
137
|
+
case 'php':
|
|
138
|
+
return `jazzcash_reference('${prefix}')`;
|
|
139
|
+
case 'node':
|
|
140
|
+
return `generateReference('${prefix}')`;
|
|
141
|
+
case 'python':
|
|
142
|
+
return `generate_reference('${prefix}')`;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
if (needsMpin) {
|
|
146
|
+
assign('pp_MerchantMPIN', envRead('JAZZCASH_MERCHANT_MPIN'));
|
|
147
|
+
}
|
|
148
|
+
for (const parameter of flow.parameters) {
|
|
149
|
+
switch (parameter.name) {
|
|
150
|
+
case 'pp_TxnDateTime':
|
|
151
|
+
assign('pp_TxnDateTime', language === 'php' ? "date('YmdHis')" : language === 'node' ? 'txnDateTime()' : 'txn_date_time()');
|
|
152
|
+
break;
|
|
153
|
+
case 'pp_TxnExpiryDateTime':
|
|
154
|
+
assign('pp_TxnExpiryDateTime', language === 'php'
|
|
155
|
+
? "date('YmdHis', strtotime('+1 day'))"
|
|
156
|
+
: language === 'node'
|
|
157
|
+
? 'txnExpiryDateTime()'
|
|
158
|
+
: 'txn_expiry_date_time()');
|
|
159
|
+
break;
|
|
160
|
+
case 'pp_TxnRefNo':
|
|
161
|
+
// A refund and a status enquiry reference an EXISTING transaction, so
|
|
162
|
+
// generating a fresh reference there would look up nothing.
|
|
163
|
+
if (flow.responseContext === 'refund' || flow.responseContext === 'inquiry') {
|
|
164
|
+
assign('pp_TxnRefNo', "'TODO-original-transaction-reference'");
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
assign('pp_TxnRefNo', reference('T'));
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
case 'pp_RequestID':
|
|
171
|
+
// Unique for every attempt, unlike pp_TxnRefNo, which a refund or an
|
|
172
|
+
// enquiry carries over from the transaction it names.
|
|
173
|
+
assign('pp_RequestID', reference('R'));
|
|
174
|
+
break;
|
|
175
|
+
case 'pp_ReturnURL':
|
|
176
|
+
assign('pp_ReturnURL', envRead('JAZZCASH_RETURN_URL'));
|
|
177
|
+
break;
|
|
178
|
+
default:
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return lines.join('\n');
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The nested settlement guard, per language.
|
|
186
|
+
*
|
|
187
|
+
* Rendered by the ordinary renderer from the flow's own declared field and
|
|
188
|
+
* value, and emitted ONLY where the flow declares a settlement level, so the
|
|
189
|
+
* generated file for a JazzCash flow — which answers in one field — carries no
|
|
190
|
+
* check for a field its gateway never sends.
|
|
191
|
+
*
|
|
192
|
+
* The guard has to be here rather than in the template because the renderer
|
|
193
|
+
* substitutes and nothing else: it has no way to drop a block. A guard left in
|
|
194
|
+
* the template unconditionally would compare an empty field name for every
|
|
195
|
+
* JazzCash flow, which is dead code in a file that moves money.
|
|
196
|
+
*/
|
|
197
|
+
const SETTLEMENT_GUARDS = {
|
|
198
|
+
php: ` // Two-level success rule. {{SUCCESS_FIELD}} says only that the gateway accepted
|
|
199
|
+
// and processed the request; {{SETTLEMENT_FIELD}} is the card issuer's own
|
|
200
|
+
// verdict, and it is the one that says whether money moved. Read the first
|
|
201
|
+
// level alone and a DECLINED card prints Success: the merchant releases the
|
|
202
|
+
// goods and is never paid.
|
|
203
|
+
$settlementCode = (string) ($response['{{SETTLEMENT_FIELD}}'] ?? '');
|
|
204
|
+
|
|
205
|
+
if ($settlementCode !== '{{SETTLEMENT_SUCCESS_VALUE}}') {
|
|
206
|
+
// An absent verdict is not an approval either: this flow declares a
|
|
207
|
+
// settlement level, so a response without one has not been answered.
|
|
208
|
+
echo 'DECLINED. {{SETTLEMENT_FIELD}}: ' . ($settlementCode === '' ? '(absent)' : $settlementCode) . PHP_EOL;
|
|
209
|
+
echo 'Do NOT release goods. Ask the customer for another payment method.' . PHP_EOL;
|
|
210
|
+
exit(1);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
`,
|
|
214
|
+
node: ` // Two-level success rule. {{SUCCESS_FIELD}} says only that the gateway accepted
|
|
215
|
+
// and processed the request; {{SETTLEMENT_FIELD}} is the card issuer's own
|
|
216
|
+
// verdict, and it is the one that says whether money moved. Read the first
|
|
217
|
+
// level alone and a DECLINED card prints Success: the merchant releases the
|
|
218
|
+
// goods and is never paid.
|
|
219
|
+
const settlementCode = String(result['{{SETTLEMENT_FIELD}}'] ?? '');
|
|
220
|
+
|
|
221
|
+
if (settlementCode !== '{{SETTLEMENT_SUCCESS_VALUE}}') {
|
|
222
|
+
// An absent verdict is not an approval either: this flow declares a
|
|
223
|
+
// settlement level, so a response without one has not been answered.
|
|
224
|
+
console.error('DECLINED. {{SETTLEMENT_FIELD}}:', settlementCode === '' ? '(absent)' : settlementCode);
|
|
225
|
+
console.error('Do NOT release goods. Ask the customer for another payment method.');
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
`,
|
|
230
|
+
python: ` # Two-level success rule. {{SUCCESS_FIELD}} says only that the gateway
|
|
231
|
+
# accepted and processed the request; {{SETTLEMENT_FIELD}} is the card
|
|
232
|
+
# issuer's own verdict, and it is the one that says whether money moved.
|
|
233
|
+
# Read the first level alone and a DECLINED card prints Success: the
|
|
234
|
+
# merchant releases the goods and is never paid.
|
|
235
|
+
settlement_code = str(result.get('{{SETTLEMENT_FIELD}}') or '')
|
|
236
|
+
|
|
237
|
+
if settlement_code != '{{SETTLEMENT_SUCCESS_VALUE}}':
|
|
238
|
+
# An absent verdict is not an approval either: this flow declares a
|
|
239
|
+
# settlement level, so a response without one has not been answered.
|
|
240
|
+
print('DECLINED. {{SETTLEMENT_FIELD}}:', settlement_code or '(absent)')
|
|
241
|
+
print('Do NOT release goods. Ask the customer for another payment method.')
|
|
242
|
+
return result
|
|
243
|
+
|
|
244
|
+
`,
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* Render the settlement guard for a flow, or nothing where it declares none.
|
|
248
|
+
*
|
|
249
|
+
* Rendered here rather than by the caller so the guard's own placeholders are
|
|
250
|
+
* already substituted by the time it is spliced into the outer template: the
|
|
251
|
+
* renderer replaces in a single pass and does not rescan what it inserted, so a
|
|
252
|
+
* `{{SETTLEMENT_FIELD}}` left inside would reach the merchant's file verbatim.
|
|
253
|
+
*/
|
|
254
|
+
function settlementGuard(flow, adapter) {
|
|
255
|
+
const settlement = flow.response.settlement;
|
|
256
|
+
if (settlement === undefined) {
|
|
257
|
+
return '';
|
|
258
|
+
}
|
|
259
|
+
return render(SETTLEMENT_GUARDS[adapter.id], {
|
|
260
|
+
SUCCESS_FIELD: flow.response.successField,
|
|
261
|
+
SETTLEMENT_FIELD: settlement.field,
|
|
262
|
+
SETTLEMENT_SUCCESS_VALUE: adapter.escape(settlement.successValue),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* The line a generated client prints when the call succeeds.
|
|
267
|
+
*
|
|
268
|
+
* The field comes from the flow's response contract. It used to be derived from
|
|
269
|
+
* the SHAPE of the success field — `pp_ResponseMessage` unless the flow answered
|
|
270
|
+
* in a bare `ResponseCode` — which is a JazzCash naming convention applied to
|
|
271
|
+
* every provider, so a client generated for anyone else read a field its gateway
|
|
272
|
+
* never sends. The failure is silent in all three languages: an absent key is an
|
|
273
|
+
* empty line where the gateway's own explanation of a failed payment should be.
|
|
274
|
+
*
|
|
275
|
+
* Built here rather than written into the template for the same reason as the
|
|
276
|
+
* settlement guard: the renderer substitutes and cannot drop a block, so a flow
|
|
277
|
+
* whose contract names no message field could only be rendered as a lookup of
|
|
278
|
+
* the empty string — which prints `undefined` in Node and `None` in Python in
|
|
279
|
+
* front of a merchant, reading as a broken integration rather than as a provider
|
|
280
|
+
* that sends no message.
|
|
281
|
+
*
|
|
282
|
+
* The name is escaped even though `responseFieldNameSchema` already restricts it
|
|
283
|
+
* to an identifier: this value is interpolated into source code that will handle
|
|
284
|
+
* money, and the escaping must not depend on a check made somewhere else.
|
|
285
|
+
*/
|
|
286
|
+
function successReport(flow, adapter) {
|
|
287
|
+
const field = flow.response.messageField;
|
|
288
|
+
switch (adapter.id) {
|
|
289
|
+
case 'php':
|
|
290
|
+
return field === undefined
|
|
291
|
+
? [
|
|
292
|
+
" // This flow's response contract names no message field, so nothing is read.",
|
|
293
|
+
' echo "Success." . PHP_EOL;',
|
|
294
|
+
].join('\n')
|
|
295
|
+
: ` echo "Success: " . ($response['${adapter.escape(field)}'] ?? '') . PHP_EOL;`;
|
|
296
|
+
case 'node':
|
|
297
|
+
return field === undefined
|
|
298
|
+
? [
|
|
299
|
+
" // This flow's response contract names no message field, so nothing is read.",
|
|
300
|
+
" console.error('Call succeeded.');",
|
|
301
|
+
].join('\n')
|
|
302
|
+
: ` console.error('JazzCash call succeeded:', result['${adapter.escape(field)}']);`;
|
|
303
|
+
case 'python':
|
|
304
|
+
return field === undefined
|
|
305
|
+
? [
|
|
306
|
+
" # This flow's response contract names no message field, so nothing is read.",
|
|
307
|
+
" print('Call succeeded.')",
|
|
308
|
+
].join('\n')
|
|
309
|
+
: ` print('JazzCash call succeeded:', result.get('${adapter.escape(field)}'))`;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function docSources(flow) {
|
|
313
|
+
return flow.docRefs
|
|
314
|
+
.map((ref) => ref.label ?? `jazzcash://docs/${ref.docId}`)
|
|
315
|
+
.filter((label, index, all) => all.indexOf(label) === index)
|
|
316
|
+
.join('; ');
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Route the generated IPN listener answers on.
|
|
320
|
+
*
|
|
321
|
+
* WooCommerce merchants must instead register `{base}/jazzcash_ipn_v2`, which
|
|
322
|
+
* the plugin owns; this default is for bespoke integrations.
|
|
323
|
+
*/
|
|
324
|
+
const IPN_PATH = '/jazzcash/ipn';
|
|
325
|
+
function defaultFramework(language) {
|
|
326
|
+
switch (language) {
|
|
327
|
+
case 'php':
|
|
328
|
+
return 'plain PHP (no framework)';
|
|
329
|
+
case 'node':
|
|
330
|
+
return 'Express';
|
|
331
|
+
case 'python':
|
|
332
|
+
return 'Flask';
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Characters a framework name may keep once it is rendered into a comment.
|
|
337
|
+
*
|
|
338
|
+
* `FRAMEWORK` is the only template value taken from a free-text tool argument —
|
|
339
|
+
* every other one comes from the catalogue, the version constant or a `z.enum` —
|
|
340
|
+
* and in all three IPN templates it sits inside a block comment or a docstring.
|
|
341
|
+
* A value carrying a comment terminator — a star followed by a slash, or a
|
|
342
|
+
* triple quote — closes that comment and leaves the remainder as executable
|
|
343
|
+
* top-level code in a file that will handle money. The value is therefore
|
|
344
|
+
* reduced to a conservative allow-list rather than escaped per language, which
|
|
345
|
+
* would need a different escape for each of the three comment syntaxes.
|
|
346
|
+
*/
|
|
347
|
+
const FRAMEWORK_DISALLOWED = /[^\w .,+#()-]+/g;
|
|
348
|
+
const MAX_FRAMEWORK_LENGTH = 80;
|
|
349
|
+
/** The framework label to render, reduced to something no comment can escape. */
|
|
350
|
+
function frameworkLabel(request) {
|
|
351
|
+
const supplied = (request.framework ?? '')
|
|
352
|
+
.replace(FRAMEWORK_DISALLOWED, ' ')
|
|
353
|
+
.replace(/\s+/g, ' ')
|
|
354
|
+
.trim()
|
|
355
|
+
.slice(0, MAX_FRAMEWORK_LENGTH)
|
|
356
|
+
.trim();
|
|
357
|
+
return supplied === '' ? defaultFramework(request.language) : supplied;
|
|
358
|
+
}
|
|
359
|
+
function templateValues(request, adapter) {
|
|
360
|
+
const { flow } = request;
|
|
361
|
+
const indent = request.language === 'php' ? ' ' : ' ';
|
|
362
|
+
return {
|
|
363
|
+
FLOW_ID: flow.id,
|
|
364
|
+
FLOW_TITLE: flow.title,
|
|
365
|
+
CORPUS_VERSION,
|
|
366
|
+
ENDPOINT: resolveEndpoint(flow, request.environment),
|
|
367
|
+
DOC_SOURCES: docSources(flow),
|
|
368
|
+
MOVES_MONEY: flow.movesMoney ? 'YES — a successful call debits or refunds real money' : 'no',
|
|
369
|
+
PARAMS: adapter.literal(literalParameters(flow, request.kind), indent),
|
|
370
|
+
RUNTIME_OVERRIDES: runtimeOverrides(flow, request.language),
|
|
371
|
+
SUCCESS_FIELD: flow.response.successField,
|
|
372
|
+
SUCCESS_VALUE: flow.response.successValue,
|
|
373
|
+
// A flow that declares no response signature names no field. The empty
|
|
374
|
+
// string is what the templates already treat as "no hash arrived", so the
|
|
375
|
+
// generated verification block reads nothing and skips — which is the truth
|
|
376
|
+
// for an unsigned response, rather than a check against an invented name.
|
|
377
|
+
RESPONSE_HASH_FIELD: flow.response.hashField ?? '',
|
|
378
|
+
// Empty for every JazzCash flow, which reports one outcome in one field. A
|
|
379
|
+
// provider that answers a card sale at two levels gets a nested guard here,
|
|
380
|
+
// because a service-level success on its own does not say the card was
|
|
381
|
+
// approved.
|
|
382
|
+
SETTLEMENT_CHECK: settlementGuard(flow, adapter),
|
|
383
|
+
// The line that prints the gateway's own message on success, or none at all
|
|
384
|
+
// where the flow declares no field to read it from. See `successReport`.
|
|
385
|
+
SUCCESS_REPORT: successReport(flow, adapter),
|
|
386
|
+
FRAMEWORK: frameworkLabel(request),
|
|
387
|
+
IPN_PATH,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
function assertKindSuitsFlow(flow, kind) {
|
|
391
|
+
if (kind === 'checkout-redirect' && flow.transport !== 'form-post') {
|
|
392
|
+
throw new JazzCashValidationError(describeTransportMismatch(flow, 'form-post'));
|
|
393
|
+
}
|
|
394
|
+
if (kind === 'rest-client' && flow.transport !== 'rest') {
|
|
395
|
+
throw new JazzCashValidationError(describeTransportMismatch(flow, 'rest'));
|
|
396
|
+
}
|
|
397
|
+
if (kind === 'wallet-linking' && flow.id !== 'wallet-linking-portal') {
|
|
398
|
+
throw new JazzCashValidationError(`"wallet-linking" applies only to the wallet-linking-portal flow, not to ${flow.id}.`);
|
|
399
|
+
}
|
|
400
|
+
// NOTE: the twelve templates hard-code one signature construction — sort by
|
|
401
|
+
// name, join with "&", prepend the salt, HMAC-SHA256, lowercase hex. There is
|
|
402
|
+
// no runtime guard for a second construction because `flowSchema` admits only
|
|
403
|
+
// `hmac-sha256`, so a flow declaring another one cannot be loaded at all. A
|
|
404
|
+
// construction added there MUST either template the hashing helper per scheme
|
|
405
|
+
// or reinstate a refusal here: generated code that computes a confident, wrong
|
|
406
|
+
// digest is pasted straight into a payment integration and fails in a way that
|
|
407
|
+
// reads as a gateway problem.
|
|
408
|
+
}
|
|
409
|
+
function followUp(request) {
|
|
410
|
+
const { flow } = request;
|
|
411
|
+
const steps = [
|
|
412
|
+
'Set JAZZCASH_MERCHANT_ID, JAZZCASH_PASSWORD and JAZZCASH_INTEGRITY_SALT in the environment. Never hard-code them and never commit them.',
|
|
413
|
+
`The endpoint is identical for sandbox and production. Which environment you reach is decided by the credentials you load, so confirm them before running${flow.movesMoney ? ' — a successful call here moves real money' : ''}.`,
|
|
414
|
+
];
|
|
415
|
+
if (flow.parameters.some((parameter) => parameter.name === 'pp_ReturnURL')) {
|
|
416
|
+
steps.push('Set JAZZCASH_RETURN_URL to the URL registered under Integration → Credentials. It must match byte for byte, including any trailing slash.');
|
|
417
|
+
}
|
|
418
|
+
if (flow.parameters.some((parameter) => parameter.name === 'pp_MerchantMPIN')) {
|
|
419
|
+
steps.push('Set JAZZCASH_MERCHANT_MPIN, and save the same MPIN in the merchant portal. Refunds fail until it is stored there.');
|
|
420
|
+
}
|
|
421
|
+
if (request.kind === 'ipn-handler') {
|
|
422
|
+
steps.push('Register this endpoint as your IPN URL in the portal and confirm it is reachable from the internet.');
|
|
423
|
+
steps.push('Replace the commented persistence calls with your own order lookup, and keep the handler idempotent.');
|
|
424
|
+
}
|
|
425
|
+
if (request.kind === 'rest-client') {
|
|
426
|
+
steps.push('Replace every value marked TODO with data from your application.');
|
|
427
|
+
if (flow.parameters.some((parameter) => parameter.name === 'pp_Amount')) {
|
|
428
|
+
steps.push(`pp_Amount is in MINOR units: PKR 100.00 is sent as "10000". Convert your rupee total with ${MINOR_UNITS_HELPER[request.language]} in the generated file, which uses exact arithmetic. Never multiply a floating-point value.`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
steps.push('Implement the Status Inquiry API if you have not already: it is mandatory and is how you resolve an unknown outcome.');
|
|
432
|
+
return steps;
|
|
433
|
+
}
|
|
434
|
+
function envExample(request) {
|
|
435
|
+
const lines = [
|
|
436
|
+
'# JazzCash credentials — from Integration → Credentials in the merchant portal.',
|
|
437
|
+
'# Never commit this file.',
|
|
438
|
+
'JAZZCASH_MERCHANT_ID=',
|
|
439
|
+
'JAZZCASH_PASSWORD=',
|
|
440
|
+
'JAZZCASH_INTEGRITY_SALT=',
|
|
441
|
+
];
|
|
442
|
+
if (request.flow.parameters.some((parameter) => parameter.name === 'pp_ReturnURL')) {
|
|
443
|
+
lines.push('# Must match the URL registered in the portal, byte for byte.', 'JAZZCASH_RETURN_URL=');
|
|
444
|
+
}
|
|
445
|
+
if (request.flow.parameters.some((parameter) => parameter.name === 'pp_MerchantMPIN')) {
|
|
446
|
+
lines.push('# Also save this MPIN in the merchant portal, or refunds will fail.', 'JAZZCASH_MERCHANT_MPIN=');
|
|
447
|
+
}
|
|
448
|
+
return lines.join('\n');
|
|
449
|
+
}
|
|
450
|
+
/** Generate one artefact for a flow. */
|
|
451
|
+
export function generateCode(request) {
|
|
452
|
+
assertKindSuitsFlow(request.flow, request.kind);
|
|
453
|
+
const adapter = ADAPTERS[request.language];
|
|
454
|
+
const template = loadTemplate(request.language, request.kind);
|
|
455
|
+
const contents = render(template, templateValues(request, adapter));
|
|
456
|
+
return {
|
|
457
|
+
flowId: request.flow.id,
|
|
458
|
+
language: request.language,
|
|
459
|
+
kind: request.kind,
|
|
460
|
+
files: [
|
|
461
|
+
{
|
|
462
|
+
path: adapter.fileName(request.kind, request.flow),
|
|
463
|
+
language: request.language,
|
|
464
|
+
contents,
|
|
465
|
+
},
|
|
466
|
+
],
|
|
467
|
+
followUp: followUp(request),
|
|
468
|
+
envExample: envExample(request),
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* The artefact kinds that make sense for a flow.
|
|
473
|
+
*
|
|
474
|
+
* Every shipped transport has a kind, so this is currently total. It returns a
|
|
475
|
+
* list rather than one kind because a transport nothing here can generate for
|
|
476
|
+
* must be able to answer "none" — naming a kind and then refusing it in
|
|
477
|
+
* `assertKindSuitsFlow` sent the caller round in a circle between the two.
|
|
478
|
+
*/
|
|
479
|
+
export function availableKinds(flow) {
|
|
480
|
+
if (flow.id === 'wallet-linking-portal') {
|
|
481
|
+
return ['wallet-linking'];
|
|
482
|
+
}
|
|
483
|
+
switch (flow.transport) {
|
|
484
|
+
case 'form-post':
|
|
485
|
+
return ['checkout-redirect'];
|
|
486
|
+
case 'rest':
|
|
487
|
+
return ['rest-client'];
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/codegen/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/codegen/languages/node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,aAAa,CAAC;AAUjE,eAAO,MAAM,WAAW,EAAE,eA2BzB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Escape for a JavaScript single-quoted string. */
|
|
2
|
+
function escapeJs(value) {
|
|
3
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\r/g, '\\r').replace(/\n/g, '\\n');
|
|
4
|
+
}
|
|
5
|
+
/** JavaScript identifiers may be unquoted; anything else must be quoted. */
|
|
6
|
+
const SAFE_KEY = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
7
|
+
export const nodeAdapter = {
|
|
8
|
+
id: 'node',
|
|
9
|
+
label: 'Node.js (TypeScript-compatible ESM)',
|
|
10
|
+
escape: escapeJs,
|
|
11
|
+
literal(parameters, indent) {
|
|
12
|
+
return [...parameters.entries()]
|
|
13
|
+
.map(([name, value]) => {
|
|
14
|
+
const key = SAFE_KEY.test(name) ? name : `'${escapeJs(name)}'`;
|
|
15
|
+
return `${indent}${key}: '${escapeJs(value)}',`;
|
|
16
|
+
})
|
|
17
|
+
.join('\n');
|
|
18
|
+
},
|
|
19
|
+
fileName(kind, flow) {
|
|
20
|
+
switch (kind) {
|
|
21
|
+
case 'checkout-redirect':
|
|
22
|
+
return `jazzcash/${flow.product}-checkout.mjs`;
|
|
23
|
+
case 'rest-client':
|
|
24
|
+
return `jazzcash/${flow.id}.mjs`;
|
|
25
|
+
case 'ipn-handler':
|
|
26
|
+
return 'jazzcash/ipn-handler.mjs';
|
|
27
|
+
case 'wallet-linking':
|
|
28
|
+
return 'jazzcash/wallet-linking.mjs';
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/codegen/languages/node.ts"],"names":[],"mappings":"AAGA,oDAAoD;AACpD,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvG,CAAC;AAED,4EAA4E;AAC5E,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,qCAAqC;IAE5C,MAAM,EAAE,QAAQ;IAEhB,OAAO,CAAC,UAAU,EAAE,MAAM;QACxB,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;aAC7B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YAC/D,OAAO,GAAG,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAClD,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,IAAkB,EAAE,IAAqB;QAChD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,mBAAmB;gBACtB,OAAO,YAAY,IAAI,CAAC,OAAO,eAAe,CAAC;YACjD,KAAK,aAAa;gBAChB,OAAO,YAAY,IAAI,CAAC,EAAE,MAAM,CAAC;YACnC,KAAK,aAAa;gBAChB,OAAO,0BAA0B,CAAC;YACpC,KAAK,gBAAgB;gBACnB,OAAO,6BAA6B,CAAC;QACzC,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/codegen/languages/php.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,aAAa,CAAC;AAOjE,eAAO,MAAM,UAAU,EAAE,eAwBxB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Escape for a PHP single-quoted string: only `\` and `'` are special. */
|
|
2
|
+
function escapePhp(value) {
|
|
3
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
4
|
+
}
|
|
5
|
+
export const phpAdapter = {
|
|
6
|
+
id: 'php',
|
|
7
|
+
label: 'PHP',
|
|
8
|
+
escape: escapePhp,
|
|
9
|
+
literal(parameters, indent) {
|
|
10
|
+
return [...parameters.entries()]
|
|
11
|
+
.map(([name, value]) => `${indent}'${escapePhp(name)}' => ${value === '' ? "''" : `'${escapePhp(value)}'`},`)
|
|
12
|
+
.join('\n');
|
|
13
|
+
},
|
|
14
|
+
fileName(kind, flow) {
|
|
15
|
+
switch (kind) {
|
|
16
|
+
case 'checkout-redirect':
|
|
17
|
+
return `jazzcash/${flow.product}-checkout.php`;
|
|
18
|
+
case 'rest-client':
|
|
19
|
+
return `jazzcash/${flow.id}.php`;
|
|
20
|
+
case 'ipn-handler':
|
|
21
|
+
return 'jazzcash/ipn-handler.php';
|
|
22
|
+
case 'wallet-linking':
|
|
23
|
+
return 'jazzcash/wallet-linking.php';
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=php.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"php.js","sourceRoot":"","sources":["../../../src/codegen/languages/php.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAoB;IACzC,EAAE,EAAE,KAAK;IACT,KAAK,EAAE,KAAK;IAEZ,MAAM,EAAE,SAAS;IAEjB,OAAO,CAAC,UAAU,EAAE,MAAM;QACxB,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;aAC7B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;aAC5G,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,IAAkB,EAAE,IAAqB;QAChD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,mBAAmB;gBACtB,OAAO,YAAY,IAAI,CAAC,OAAO,eAAe,CAAC;YACjD,KAAK,aAAa;gBAChB,OAAO,YAAY,IAAI,CAAC,EAAE,MAAM,CAAC;YACnC,KAAK,aAAa;gBAChB,OAAO,0BAA0B,CAAC;YACpC,KAAK,gBAAgB;gBACnB,OAAO,6BAA6B,CAAC;QACzC,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/codegen/languages/python.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,aAAa,CAAC;AAOjE,eAAO,MAAM,aAAa,EAAE,eAwB3B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Escape for a Python single-quoted string. */
|
|
2
|
+
function escapePython(value) {
|
|
3
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\r/g, '\\r').replace(/\n/g, '\\n');
|
|
4
|
+
}
|
|
5
|
+
export const pythonAdapter = {
|
|
6
|
+
id: 'python',
|
|
7
|
+
label: 'Python',
|
|
8
|
+
escape: escapePython,
|
|
9
|
+
literal(parameters, indent) {
|
|
10
|
+
return [...parameters.entries()]
|
|
11
|
+
.map(([name, value]) => `${indent}'${escapePython(name)}': '${escapePython(value)}',`)
|
|
12
|
+
.join('\n');
|
|
13
|
+
},
|
|
14
|
+
fileName(kind, flow) {
|
|
15
|
+
switch (kind) {
|
|
16
|
+
case 'checkout-redirect':
|
|
17
|
+
return `jazzcash/${flow.product}_checkout.py`;
|
|
18
|
+
case 'rest-client':
|
|
19
|
+
return `jazzcash/${flow.id.replace(/[.-]/g, '_')}.py`;
|
|
20
|
+
case 'ipn-handler':
|
|
21
|
+
return 'jazzcash/ipn_handler.py';
|
|
22
|
+
case 'wallet-linking':
|
|
23
|
+
return 'jazzcash/wallet_linking.py';
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/codegen/languages/python.ts"],"names":[],"mappings":"AAGA,gDAAgD;AAChD,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvG,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC5C,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;IAEf,MAAM,EAAE,YAAY;IAEpB,OAAO,CAAC,UAAU,EAAE,MAAM;QACxB,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;aAC7B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;aACrF,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,IAAkB,EAAE,IAAqB;QAChD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,mBAAmB;gBACtB,OAAO,YAAY,IAAI,CAAC,OAAO,cAAc,CAAC;YAChD,KAAK,aAAa;gBAChB,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC;YACxD,KAAK,aAAa;gBAChB,OAAO,yBAAyB,CAAC;YACnC,KAAK,gBAAgB;gBACnB,OAAO,4BAA4B,CAAC;QACxC,CAAC;IACH,CAAC;CACF,CAAC"}
|