@stellar/stellar-sdk 16.0.1 → 16.2.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/README.md +41 -2
- package/dist/stellar-sdk-axios.js +5401 -3690
- package/dist/stellar-sdk-axios.js.map +1 -1
- package/dist/stellar-sdk-axios.min.js +12 -11
- package/dist/stellar-sdk-axios.min.js.map +1 -1
- package/dist/stellar-sdk.js +4850 -3681
- package/dist/stellar-sdk.js.map +1 -1
- package/dist/stellar-sdk.min.js +17 -17
- package/dist/stellar-sdk.min.js.map +1 -1
- package/lib/axios/cjs/base/auth.js +147 -30
- package/lib/axios/cjs/base/auth.js.map +1 -1
- package/lib/axios/cjs/base/index.js +113 -0
- package/lib/axios/cjs/base/index.js.map +1 -0
- package/lib/axios/cjs/base/keypair.js +39 -0
- package/lib/axios/cjs/base/keypair.js.map +1 -1
- package/lib/axios/cjs/base/scval.js +34 -0
- package/lib/axios/cjs/base/scval.js.map +1 -1
- package/lib/axios/cjs/bindings/client.js +170 -0
- package/lib/axios/cjs/bindings/client.js.map +1 -1
- package/lib/axios/cjs/bindings/config.js +1 -1
- package/lib/axios/cjs/bindings/generator.js +45 -16
- package/lib/axios/cjs/bindings/generator.js.map +1 -1
- package/lib/axios/cjs/bindings/types.js +151 -1
- package/lib/axios/cjs/bindings/types.js.map +1 -1
- package/lib/axios/cjs/bindings/utils.js +10 -0
- package/lib/axios/cjs/bindings/utils.js.map +1 -1
- package/lib/axios/cjs/cli/index.js +19 -22
- package/lib/axios/cjs/cli/index.js.map +1 -1
- package/lib/axios/cjs/cli/util.js +1 -20
- package/lib/axios/cjs/cli/util.js.map +1 -1
- package/lib/axios/cjs/contract/assembled_transaction.js +39 -17
- package/lib/axios/cjs/contract/assembled_transaction.js.map +1 -1
- package/lib/axios/cjs/contract/basic_node_signer.js +8 -42
- package/lib/axios/cjs/contract/basic_node_signer.js.map +1 -1
- package/lib/axios/cjs/contract/client.js +56 -3
- package/lib/axios/cjs/contract/client.js.map +1 -1
- package/lib/axios/cjs/contract/event_spec.js +164 -0
- package/lib/axios/cjs/contract/event_spec.js.map +1 -0
- package/lib/axios/cjs/contract/index.js +2 -0
- package/lib/axios/cjs/contract/index.js.map +1 -1
- package/lib/axios/cjs/contract/sent_transaction.js +0 -20
- package/lib/axios/cjs/contract/sent_transaction.js.map +1 -1
- package/lib/axios/cjs/contract/signer.js +96 -0
- package/lib/axios/cjs/contract/signer.js.map +1 -0
- package/lib/axios/cjs/contract/spec.js +107 -3
- package/lib/axios/cjs/contract/spec.js.map +1 -1
- package/lib/axios/cjs/contract/types.js.map +1 -1
- package/lib/axios/cjs/errors/transaction_failed.js +62 -0
- package/lib/axios/cjs/errors/transaction_failed.js.map +1 -0
- package/lib/axios/cjs/errors/wrap_http_error.js +20 -0
- package/lib/axios/cjs/errors/wrap_http_error.js.map +1 -0
- package/lib/axios/cjs/federation/server.js +15 -35
- package/lib/axios/cjs/federation/server.js.map +1 -1
- package/lib/axios/cjs/horizon/account_response.js +0 -20
- package/lib/axios/cjs/horizon/account_response.js.map +1 -1
- package/lib/axios/cjs/horizon/horizon_api.js +5 -0
- package/lib/axios/cjs/horizon/horizon_api.js.map +1 -1
- package/lib/axios/cjs/horizon/horizon_axios_client.js +1 -1
- package/lib/axios/cjs/horizon/server.js +20 -26
- package/lib/axios/cjs/horizon/server.js.map +1 -1
- package/lib/axios/cjs/index.js +66 -65
- package/lib/axios/cjs/index.js.map +1 -1
- package/lib/axios/cjs/rpc/api.js.map +1 -1
- package/lib/axios/cjs/rpc/axios.js +1 -1
- package/lib/axios/cjs/rpc/server.js +181 -13
- package/lib/axios/cjs/rpc/server.js.map +1 -1
- package/lib/axios/cjs/rpc/transaction.js +2 -20
- package/lib/axios/cjs/rpc/transaction.js.map +1 -1
- package/lib/axios/cjs/webauth/challenge_transaction.js +7 -22
- package/lib/axios/cjs/webauth/challenge_transaction.js.map +1 -1
- package/lib/axios/cjs/webauth/utils.js +1 -20
- package/lib/axios/cjs/webauth/utils.js.map +1 -1
- package/lib/axios/esm/base/auth.d.ts +181 -13
- package/lib/axios/esm/base/auth.js +146 -31
- package/lib/axios/esm/base/auth.js.map +1 -1
- package/lib/axios/esm/base/index.d.ts +2 -2
- package/lib/axios/esm/base/index.js +44 -0
- package/lib/axios/esm/base/index.js.map +1 -0
- package/lib/axios/esm/base/keypair.d.ts +27 -0
- package/lib/axios/esm/base/keypair.js +39 -0
- package/lib/axios/esm/base/keypair.js.map +1 -1
- package/lib/axios/esm/base/scval.d.ts +4 -0
- package/lib/axios/esm/base/scval.js +34 -0
- package/lib/axios/esm/base/scval.js.map +1 -1
- package/lib/axios/esm/bindings/client.d.ts +39 -0
- package/lib/axios/esm/bindings/client.js +171 -1
- package/lib/axios/esm/bindings/client.js.map +1 -1
- package/lib/axios/esm/bindings/config.js +1 -1
- package/lib/axios/esm/bindings/generator.d.ts +34 -0
- package/lib/axios/esm/bindings/generator.js +45 -16
- package/lib/axios/esm/bindings/generator.js.map +1 -1
- package/lib/axios/esm/bindings/types.d.ts +42 -0
- package/lib/axios/esm/bindings/types.js +153 -3
- package/lib/axios/esm/bindings/types.js.map +1 -1
- package/lib/axios/esm/bindings/utils.d.ts +10 -0
- package/lib/axios/esm/bindings/utils.js +9 -1
- package/lib/axios/esm/bindings/utils.js.map +1 -1
- package/lib/axios/esm/cli/index.js +19 -22
- package/lib/axios/esm/cli/index.js.map +1 -1
- package/lib/axios/esm/cli/util.d.ts +1 -1
- package/lib/axios/esm/cli/util.js +1 -20
- package/lib/axios/esm/cli/util.js.map +1 -1
- package/lib/axios/esm/contract/assembled_transaction.d.ts +7 -5
- package/lib/axios/esm/contract/assembled_transaction.js +39 -17
- package/lib/axios/esm/contract/assembled_transaction.js.map +1 -1
- package/lib/axios/esm/contract/basic_node_signer.d.ts +3 -0
- package/lib/axios/esm/contract/basic_node_signer.js +8 -42
- package/lib/axios/esm/contract/basic_node_signer.js.map +1 -1
- package/lib/axios/esm/contract/client.d.ts +49 -3
- package/lib/axios/esm/contract/client.js +56 -3
- package/lib/axios/esm/contract/client.js.map +1 -1
- package/lib/axios/esm/contract/event_spec.d.ts +78 -0
- package/lib/axios/esm/contract/event_spec.js +159 -0
- package/lib/axios/esm/contract/event_spec.js.map +1 -0
- package/lib/axios/esm/contract/index.d.ts +3 -0
- package/lib/axios/esm/contract/index.js +1 -0
- package/lib/axios/esm/contract/index.js.map +1 -1
- package/lib/axios/esm/contract/sent_transaction.js +0 -20
- package/lib/axios/esm/contract/sent_transaction.js.map +1 -1
- package/lib/axios/esm/contract/signer.d.ts +104 -0
- package/lib/axios/esm/contract/signer.js +91 -0
- package/lib/axios/esm/contract/signer.js.map +1 -0
- package/lib/axios/esm/contract/spec.d.ts +84 -0
- package/lib/axios/esm/contract/spec.js +107 -3
- package/lib/axios/esm/contract/spec.js.map +1 -1
- package/lib/axios/esm/contract/types.d.ts +25 -8
- package/lib/axios/esm/contract/types.js.map +1 -1
- package/lib/axios/esm/errors/index.d.ts +1 -0
- package/lib/axios/esm/errors/transaction_failed.d.ts +55 -0
- package/lib/axios/esm/errors/transaction_failed.js +60 -0
- package/lib/axios/esm/errors/transaction_failed.js.map +1 -0
- package/lib/axios/esm/errors/wrap_http_error.d.ts +20 -0
- package/lib/axios/esm/errors/wrap_http_error.js +18 -0
- package/lib/axios/esm/errors/wrap_http_error.js.map +1 -0
- package/lib/axios/esm/federation/server.js +15 -35
- package/lib/axios/esm/federation/server.js.map +1 -1
- package/lib/axios/esm/horizon/account_response.js +0 -20
- package/lib/axios/esm/horizon/account_response.js.map +1 -1
- package/lib/axios/esm/horizon/horizon_api.d.ts +12 -1
- package/lib/axios/esm/horizon/horizon_api.js +5 -0
- package/lib/axios/esm/horizon/horizon_api.js.map +1 -1
- package/lib/axios/esm/horizon/horizon_axios_client.js +1 -1
- package/lib/axios/esm/horizon/server.d.ts +10 -4
- package/lib/axios/esm/horizon/server.js +20 -26
- package/lib/axios/esm/horizon/server.js.map +1 -1
- package/lib/axios/esm/index.js +27 -29
- package/lib/axios/esm/index.js.map +1 -1
- package/lib/axios/esm/rpc/api.d.ts +21 -0
- package/lib/axios/esm/rpc/api.js.map +1 -1
- package/lib/axios/esm/rpc/axios.js +1 -1
- package/lib/axios/esm/rpc/server.d.ts +115 -3
- package/lib/axios/esm/rpc/server.js +181 -13
- package/lib/axios/esm/rpc/server.js.map +1 -1
- package/lib/axios/esm/rpc/transaction.js +2 -20
- package/lib/axios/esm/rpc/transaction.js.map +1 -1
- package/lib/axios/esm/webauth/challenge_transaction.js +7 -22
- package/lib/axios/esm/webauth/challenge_transaction.js.map +1 -1
- package/lib/axios/esm/webauth/utils.js +1 -20
- package/lib/axios/esm/webauth/utils.js.map +1 -1
- package/lib/cjs/base/auth.js +147 -30
- package/lib/cjs/base/auth.js.map +1 -1
- package/lib/cjs/base/index.js +113 -0
- package/lib/cjs/base/index.js.map +1 -0
- package/lib/cjs/base/keypair.js +39 -0
- package/lib/cjs/base/keypair.js.map +1 -1
- package/lib/cjs/base/scval.js +34 -0
- package/lib/cjs/base/scval.js.map +1 -1
- package/lib/cjs/bindings/client.js +170 -0
- package/lib/cjs/bindings/client.js.map +1 -1
- package/lib/cjs/bindings/config.js +1 -1
- package/lib/cjs/bindings/generator.js +45 -16
- package/lib/cjs/bindings/generator.js.map +1 -1
- package/lib/cjs/bindings/types.js +151 -1
- package/lib/cjs/bindings/types.js.map +1 -1
- package/lib/cjs/bindings/utils.js +10 -0
- package/lib/cjs/bindings/utils.js.map +1 -1
- package/lib/cjs/cli/index.js +19 -22
- package/lib/cjs/cli/index.js.map +1 -1
- package/lib/cjs/cli/util.js +1 -20
- package/lib/cjs/cli/util.js.map +1 -1
- package/lib/cjs/contract/assembled_transaction.js +39 -17
- package/lib/cjs/contract/assembled_transaction.js.map +1 -1
- package/lib/cjs/contract/basic_node_signer.js +8 -42
- package/lib/cjs/contract/basic_node_signer.js.map +1 -1
- package/lib/cjs/contract/client.js +56 -3
- package/lib/cjs/contract/client.js.map +1 -1
- package/lib/cjs/contract/event_spec.js +164 -0
- package/lib/cjs/contract/event_spec.js.map +1 -0
- package/lib/cjs/contract/index.js +2 -0
- package/lib/cjs/contract/index.js.map +1 -1
- package/lib/cjs/contract/sent_transaction.js +0 -20
- package/lib/cjs/contract/sent_transaction.js.map +1 -1
- package/lib/cjs/contract/signer.js +96 -0
- package/lib/cjs/contract/signer.js.map +1 -0
- package/lib/cjs/contract/spec.js +107 -3
- package/lib/cjs/contract/spec.js.map +1 -1
- package/lib/cjs/contract/types.js.map +1 -1
- package/lib/cjs/errors/transaction_failed.js +62 -0
- package/lib/cjs/errors/transaction_failed.js.map +1 -0
- package/lib/cjs/errors/wrap_http_error.js +20 -0
- package/lib/cjs/errors/wrap_http_error.js.map +1 -0
- package/lib/cjs/federation/server.js +15 -35
- package/lib/cjs/federation/server.js.map +1 -1
- package/lib/cjs/horizon/account_response.js +0 -20
- package/lib/cjs/horizon/account_response.js.map +1 -1
- package/lib/cjs/horizon/horizon_api.js +5 -0
- package/lib/cjs/horizon/horizon_api.js.map +1 -1
- package/lib/cjs/horizon/horizon_axios_client.js +1 -1
- package/lib/cjs/horizon/server.js +20 -26
- package/lib/cjs/horizon/server.js.map +1 -1
- package/lib/cjs/index.js +66 -65
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/rpc/api.js.map +1 -1
- package/lib/cjs/rpc/axios.js +1 -1
- package/lib/cjs/rpc/server.js +181 -13
- package/lib/cjs/rpc/server.js.map +1 -1
- package/lib/cjs/rpc/transaction.js +2 -20
- package/lib/cjs/rpc/transaction.js.map +1 -1
- package/lib/cjs/webauth/challenge_transaction.js +7 -22
- package/lib/cjs/webauth/challenge_transaction.js.map +1 -1
- package/lib/cjs/webauth/utils.js +1 -20
- package/lib/cjs/webauth/utils.js.map +1 -1
- package/lib/esm/base/auth.d.ts +181 -13
- package/lib/esm/base/auth.js +146 -31
- package/lib/esm/base/auth.js.map +1 -1
- package/lib/esm/base/index.d.ts +2 -2
- package/lib/esm/base/index.js +44 -0
- package/lib/esm/base/index.js.map +1 -0
- package/lib/esm/base/keypair.d.ts +27 -0
- package/lib/esm/base/keypair.js +39 -0
- package/lib/esm/base/keypair.js.map +1 -1
- package/lib/esm/base/scval.d.ts +4 -0
- package/lib/esm/base/scval.js +34 -0
- package/lib/esm/base/scval.js.map +1 -1
- package/lib/esm/bindings/client.d.ts +39 -0
- package/lib/esm/bindings/client.js +171 -1
- package/lib/esm/bindings/client.js.map +1 -1
- package/lib/esm/bindings/config.js +1 -1
- package/lib/esm/bindings/generator.d.ts +34 -0
- package/lib/esm/bindings/generator.js +45 -16
- package/lib/esm/bindings/generator.js.map +1 -1
- package/lib/esm/bindings/types.d.ts +42 -0
- package/lib/esm/bindings/types.js +153 -3
- package/lib/esm/bindings/types.js.map +1 -1
- package/lib/esm/bindings/utils.d.ts +10 -0
- package/lib/esm/bindings/utils.js +9 -1
- package/lib/esm/bindings/utils.js.map +1 -1
- package/lib/esm/cli/index.js +19 -22
- package/lib/esm/cli/index.js.map +1 -1
- package/lib/esm/cli/util.d.ts +1 -1
- package/lib/esm/cli/util.js +1 -20
- package/lib/esm/cli/util.js.map +1 -1
- package/lib/esm/contract/assembled_transaction.d.ts +7 -5
- package/lib/esm/contract/assembled_transaction.js +39 -17
- package/lib/esm/contract/assembled_transaction.js.map +1 -1
- package/lib/esm/contract/basic_node_signer.d.ts +3 -0
- package/lib/esm/contract/basic_node_signer.js +8 -42
- package/lib/esm/contract/basic_node_signer.js.map +1 -1
- package/lib/esm/contract/client.d.ts +49 -3
- package/lib/esm/contract/client.js +56 -3
- package/lib/esm/contract/client.js.map +1 -1
- package/lib/esm/contract/event_spec.d.ts +78 -0
- package/lib/esm/contract/event_spec.js +159 -0
- package/lib/esm/contract/event_spec.js.map +1 -0
- package/lib/esm/contract/index.d.ts +3 -0
- package/lib/esm/contract/index.js +1 -0
- package/lib/esm/contract/index.js.map +1 -1
- package/lib/esm/contract/sent_transaction.js +0 -20
- package/lib/esm/contract/sent_transaction.js.map +1 -1
- package/lib/esm/contract/signer.d.ts +104 -0
- package/lib/esm/contract/signer.js +91 -0
- package/lib/esm/contract/signer.js.map +1 -0
- package/lib/esm/contract/spec.d.ts +84 -0
- package/lib/esm/contract/spec.js +107 -3
- package/lib/esm/contract/spec.js.map +1 -1
- package/lib/esm/contract/types.d.ts +25 -8
- package/lib/esm/contract/types.js.map +1 -1
- package/lib/esm/errors/index.d.ts +1 -0
- package/lib/esm/errors/transaction_failed.d.ts +55 -0
- package/lib/esm/errors/transaction_failed.js +60 -0
- package/lib/esm/errors/transaction_failed.js.map +1 -0
- package/lib/esm/errors/wrap_http_error.d.ts +20 -0
- package/lib/esm/errors/wrap_http_error.js +18 -0
- package/lib/esm/errors/wrap_http_error.js.map +1 -0
- package/lib/esm/federation/server.js +15 -35
- package/lib/esm/federation/server.js.map +1 -1
- package/lib/esm/horizon/account_response.js +0 -20
- package/lib/esm/horizon/account_response.js.map +1 -1
- package/lib/esm/horizon/horizon_api.d.ts +12 -1
- package/lib/esm/horizon/horizon_api.js +5 -0
- package/lib/esm/horizon/horizon_api.js.map +1 -1
- package/lib/esm/horizon/horizon_axios_client.js +1 -1
- package/lib/esm/horizon/server.d.ts +10 -4
- package/lib/esm/horizon/server.js +20 -26
- package/lib/esm/horizon/server.js.map +1 -1
- package/lib/esm/index.js +27 -29
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/rpc/api.d.ts +21 -0
- package/lib/esm/rpc/api.js.map +1 -1
- package/lib/esm/rpc/axios.js +1 -1
- package/lib/esm/rpc/server.d.ts +115 -3
- package/lib/esm/rpc/server.js +181 -13
- package/lib/esm/rpc/server.js.map +1 -1
- package/lib/esm/rpc/transaction.js +2 -20
- package/lib/esm/rpc/transaction.js.map +1 -1
- package/lib/esm/webauth/challenge_transaction.js +7 -22
- package/lib/esm/webauth/challenge_transaction.js.map +1 -1
- package/lib/esm/webauth/utils.js +1 -20
- package/lib/esm/webauth/utils.js.map +1 -1
- package/package.json +35 -30
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scval.js","sources":["../../../../src/base/scval.ts"],"sourcesContent":["import xdr from \"./xdr.js\";\nimport { Keypair } from \"./keypair.js\";\nimport { Address } from \"./address.js\";\nimport { Contract } from \"./contract.js\";\nimport { ScInt, XdrLargeInt, scValToBigInt } from \"./numbers/index.js\";\nimport type { ScIntType } from \"./numbers/index.js\";\n\ntype ScValIntType = ScIntType | \"i32\" | \"u32\";\ntype ScValStringType = ScValIntType | \"address\" | \"string\" | \"symbol\";\ntype ScValBytesType = \"bytes\" | \"string\" | \"symbol\";\ntype ScValType = ScValBytesType | ScValIntType | ScValStringType;\n\ntype ScValMapTypeSpec = Record<\n string,\n [(ScValType | null)?, (ScValType | null)?]\n>;\n\nexport interface NativeToScValOpts {\n type?: (ScValType | null)[] | ScValMapTypeSpec | ScValType | undefined;\n}\n\n/**\n * Attempts to convert native types into smart contract values\n * ({@link xdr.ScVal}).\n *\n * Provides conversions from smart contract XDR values ({@link xdr.ScVal}) to\n * native JavaScript types.\n *\n * The conversions are as follows:\n *\n * - `xdr.ScVal` → passthrough\n * - `null` / `undefined` → `scvVoid`\n * - `string` → `scvString` (a copy is made)\n * - `UintArray8` → `scvBytes` (a copy is made)\n * - `boolean` → `scvBool`\n *\n * - `number` / `bigint` → the smallest possible XDR integer type that will fit\n * the input value (if you want a specific type, use {@link ScInt})\n *\n * - {@link Address} or {@link Contract} → `scvAddress` (for contracts and\n * public keys)\n *\n * - `Array<T>` → `scvVec` after attempting to convert each item of type `T` to\n * an `xdr.ScVal` (recursively). note that all values must be the same type!\n *\n * - `object` → `scvMap` after attempting to convert each key and value to an\n * `xdr.ScVal` (recursively). note that there is no restriction on types\n * matching anywhere (unlike arrays)\n *\n * When passing an integer-like native value, you can also optionally specify a\n * type which will force a particular interpretation of that value.\n *\n * Note that not all type specifications are compatible with all `ScVal`s, e.g.\n * `toScVal(\"a string\", {type: \"i256\"})` will throw.\n *\n * @param val - a native (or convertible) input value to wrap\n * @param opts - an optional set of hints around the type of\n * conversion you'd like to see\n * - `type`: there is different behavior for different input\n * types for `val`:\n *\n * - when `val` is an integer-like type (i.e. number|bigint), this will be\n * forwarded to {@link ScInt} or forced to be u32/i32.\n *\n * - when `val` is an array type, this is forwarded to the recursion\n *\n * - when `val` is an object type (key-value entries), this should be an\n * object in which each key has a pair of types (to represent forced types\n * for the key and the value), where `null` (or a missing entry) indicates\n * the default interpretation(s) (refer to the examples, below)\n *\n * - when `val` is a string type, this can be 'string' or 'symbol' to force\n * a particular interpretation of `val`.\n *\n * - when `val` is a bytes-like type, this can be 'string', 'symbol', or\n * 'bytes' to force a particular interpretation\n *\n * As a simple example, `nativeToScVal(\"hello\", {type: 'symbol'})` will\n * return an `scvSymbol`, whereas without the type it would have been an\n * `scvString`.\n *\n * @throws if...\n * - there are arrays with more than one type in them\n * - there are values that do not have a sensible conversion (e.g. random XDR\n * types, custom classes)\n * - the type of the input object (or some inner value of said object) cannot\n * be determined (via `typeof`)\n * - the type you specified (via `opts.type`) is incompatible with the value\n * you passed in (`val`), e.g. `nativeToScVal(\"a string\", { type: 'i128' })`,\n * though this does not apply for types that ignore `opts` (e.g. addresses).\n * @see scValToNative\n *\n * @example\n * ```ts\n * nativeToScVal(1000); // gives ScValType === scvU64\n * nativeToScVal(1000n); // gives ScValType === scvU64\n * nativeToScVal(1n << 100n); // gives ScValType === scvU128\n * nativeToScVal(1000, { type: 'u32' }); // gives ScValType === scvU32\n * nativeToScVal(1000, { type: 'i125' }); // gives ScValType === scvI256\n * nativeToScVal(\"a string\"); // gives ScValType === scvString\n * nativeToScVal(\"a string\", { type: 'symbol' }); // gives scvSymbol\n * nativeToScVal(new Uint8Array(5)); // scvBytes\n * nativeToScVal(new Uint8Array(5), { type: 'symbol' }); // scvSymbol\n * nativeToScVal(null); // scvVoid\n * nativeToScVal(true); // scvBool\n * nativeToScVal([1, 2, 3]); // gives scvVec with each element as scvU64\n * nativeToScVal([1, 2, 3], { type: 'i128' }); // scvVec<scvI128>\n * nativeToScVal([1, '2'], { type: ['i128', 'symbol'] }); // scvVec with diff types\n * nativeToScVal([1, '2', 3], { type: ['i128', 'symbol'] });\n * // scvVec with diff types, using the default when omitted\n * nativeToScVal({ 'hello': 1, 'world': [ true, false ] }, {\n * type: {\n * 'hello': [ 'symbol', 'i128' ],\n * }\n * })\n * // gives scvMap with entries: [\n * // [ scvSymbol, scvI128 ],\n * // [ scvString, scvArray<scvBool> ]\n * // ]\n * ```\n *\n * @example\n * ```ts\n * import {\n * nativeToScVal,\n * scValToNative,\n * ScInt,\n * xdr\n * } from '@stellar/stellar-base';\n *\n * let gigaMap = {\n * bool: true,\n * void: null,\n * u32: xdr.ScVal.scvU32(1),\n * i32: xdr.ScVal.scvI32(1),\n * u64: 1n,\n * i64: -1n,\n * u128: new ScInt(1).toU128(),\n * i128: new ScInt(1).toI128(),\n * u256: new ScInt(1).toU256(),\n * i256: new ScInt(1).toI256(),\n * map: {\n * arbitrary: 1n,\n * nested: 'values',\n * etc: false\n * },\n * vec: ['same', 'type', 'list'],\n * vec: ['diff', 1, 'type', 2, 'list'],\n * };\n *\n * // then, simply:\n * let scv = nativeToScVal(gigaMap); // scv.switch() == xdr.ScValType.scvMap()\n *\n * // then...\n * someContract.call(\"method\", scv);\n *\n * // Similarly, the inverse should work:\n * scValToNative(scv) == gigaMap; // true\n * ```\n */\nexport function nativeToScVal(\n val: unknown,\n opts: NativeToScValOpts = {},\n): xdr.ScVal {\n switch (typeof val) {\n case \"object\": {\n if (val === null) {\n return xdr.ScVal.scvVoid();\n }\n\n if (val instanceof xdr.ScVal) {\n return val; // should we copy?\n }\n\n if (val instanceof Address) {\n return val.toScVal();\n }\n\n if (val instanceof Keypair) {\n return nativeToScVal(val.publicKey(), { type: \"address\" });\n }\n\n if (val instanceof Contract) {\n return val.address().toScVal();\n }\n\n if (val instanceof Uint8Array || Buffer.isBuffer(val)) {\n const copy = Buffer.from(val);\n switch ((opts?.type as string) ?? \"bytes\") {\n case \"bytes\":\n return xdr.ScVal.scvBytes(copy);\n case \"symbol\":\n return xdr.ScVal.scvSymbol(copy);\n case \"string\":\n return xdr.ScVal.scvString(copy);\n default:\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for bytes-like value`,\n );\n }\n }\n\n if (Array.isArray(val)) {\n return xdr.ScVal.scvVec(\n val.map((v: unknown, idx: number) => {\n // There may be different type specifications for each element in\n // the array, so we need to apply those accordingly.\n if (Array.isArray(opts.type)) {\n return nativeToScVal(\n v,\n // only include a `{ type: ... }` if it's present (safer than\n // `{type: undefined}`)\n {\n ...(opts.type.length > idx && {\n type: opts.type[idx] as ScValType,\n }),\n },\n );\n }\n\n // Otherwise apply a generic (or missing) type specifier on it.\n return nativeToScVal(v, opts);\n }),\n );\n }\n\n if (Object.getPrototypeOf(val) !== Object.prototype) {\n throw new TypeError(\n `cannot interpret ${\n val.constructor?.name\n } value as ScVal (${JSON.stringify(val)})`,\n );\n }\n\n const mapTypeSpec = (opts?.type ?? {}) as ScValMapTypeSpec;\n\n return xdr.ScVal.scvMap(\n Object.entries(val as Record<string, unknown>)\n // The Soroban runtime expects maps to have their keys in sorted\n // order, so let's do that here as part of the conversion to prevent\n // confusing error messages on execution.\n .sort(([key1], [key2]) => (key1 < key2 ? -1 : key1 > key2 ? 1 : 0))\n .map(([k, v]) => {\n // the type can be specified with an entry for the key and the value,\n // e.g. val = { 'hello': 1 } and opts.type = { hello: [ 'symbol',\n // 'u128' ]} or you can use `null` for the default interpretation\n const [keyType, valType] = Object.hasOwn(mapTypeSpec, k)\n ? (mapTypeSpec[k] ?? [null, null])\n : [null, null];\n const keyOpts: NativeToScValOpts = keyType ? { type: keyType } : {};\n const valOpts: NativeToScValOpts = valType ? { type: valType } : {};\n\n return new xdr.ScMapEntry({\n key: nativeToScVal(k, keyOpts),\n val: nativeToScVal(v, valOpts),\n });\n }),\n );\n }\n\n case \"number\":\n case \"bigint\": {\n const bigintVal = BigInt(val);\n switch (opts?.type) {\n case \"u32\":\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(val));\n case \"i32\":\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(val));\n\n default:\n break;\n }\n\n return new ScInt(val, { type: opts?.type as ScIntType }).toScVal();\n }\n case \"string\": {\n const optType = (opts?.type as string) ?? \"string\";\n switch (optType) {\n case \"string\":\n return xdr.ScVal.scvString(val);\n\n case \"symbol\":\n return xdr.ScVal.scvSymbol(val);\n\n case \"address\":\n return new Address(val).toScVal();\n\n case \"u32\": {\n const bigintVal = BigInt(val);\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(bigintVal));\n }\n\n case \"i32\": {\n const bigintVal = BigInt(val);\n // TODO: Update this check once xdr.Int32.MIN_VALUE in XDR is properly\n // set to negative. Check this globally.\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(bigintVal));\n }\n\n default:\n if (XdrLargeInt.isType(optType)) {\n return new XdrLargeInt(optType, val).toScVal();\n }\n\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for string value`,\n );\n }\n }\n\n case \"boolean\":\n return xdr.ScVal.scvBool(val);\n\n case \"undefined\":\n return xdr.ScVal.scvVoid();\n\n case \"function\": // FIXME: Is this too helpful?\n return nativeToScVal((val as () => unknown)());\n\n default:\n throw new TypeError(\n `failed to convert typeof ${typeof val} (${JSON.stringify(val)})`,\n );\n }\n}\n\n/**\n * Given a smart contract value, attempt to convert it to a native type.\n * Possible conversions include:\n *\n * - `void` → `null`\n * - `u32`, `i32` → `number`\n * - `u64`, `i64`, `u128`, `i128`, `u256`, `i256`, `timepoint`, `duration` →\n * `bigint`\n * - `vec` → `Array` of any of the above (via recursion)\n * - `map` → key-value object of any of the above (via recursion)\n * - `bool` → `boolean`\n * - `bytes` → `Uint8Array`\n * - `symbol` → `string`\n * - `string` → `string` IF the underlying buffer can be decoded as ascii/utf8,\n * `Uint8Array` of the raw contents in any error case\n *\n * If no viable conversion can be determined, this just \"unwraps\" the smart\n * value to return its underlying XDR value.\n *\n * @param scv - the input smart contract value\n *\n * @see nativeToScVal\n */\n\nexport function scValToNative(scv: xdr.ScVal): any {\n // we use the verbose xdr.ScValType.<type>.value form here because it's faster\n // than string comparisons and the underlying constants never need to be\n // updated\n switch (scv.switch().value) {\n case xdr.ScValType.scvVoid().value:\n return null;\n\n // these can be converted to bigints directly\n case xdr.ScValType.scvU64().value:\n case xdr.ScValType.scvI64().value:\n return (scv.value() as xdr.Int64 | xdr.Uint64).toBigInt();\n\n // these can be parsed by internal abstractions note that this can also\n // handle the above two cases, but it's not as efficient (another\n // type-check, parsing, etc.)\n case xdr.ScValType.scvU128().value:\n case xdr.ScValType.scvI128().value:\n case xdr.ScValType.scvU256().value:\n case xdr.ScValType.scvI256().value:\n return scValToBigInt(scv);\n\n case xdr.ScValType.scvVec().value:\n return (scv.vec() ?? []).map(scValToNative);\n\n case xdr.ScValType.scvAddress().value:\n return Address.fromScVal(scv).toString();\n\n case xdr.ScValType.scvMap().value:\n return Object.fromEntries(\n (scv.map() ?? []).map((entry: xdr.ScMapEntry) => [\n scValToNative(entry.key()),\n scValToNative(entry.val()),\n ]),\n );\n\n // these return the primitive type directly\n case xdr.ScValType.scvBool().value:\n case xdr.ScValType.scvU32().value:\n case xdr.ScValType.scvI32().value:\n case xdr.ScValType.scvBytes().value:\n return scv.value();\n\n // Symbols are limited to [a-zA-Z0-9_]+, so we can safely make ascii strings\n //\n // Strings, however, are \"presented\" as strings and we treat them as such\n // (in other words, string = bytes with a hint that it's text). If the user\n // encoded non-printable bytes in their string value, that's on them.\n //\n // Note that we assume a utf8 encoding (ascii-compatible). For other\n // encodings, you should probably use bytes anyway. If it cannot be decoded,\n // the raw bytes are returned.\n case xdr.ScValType.scvSymbol().value: {\n const v = scv.sym();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n case xdr.ScValType.scvString().value: {\n const v = scv.str();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n\n // these can be converted to bigint\n case xdr.ScValType.scvTimepoint().value:\n case xdr.ScValType.scvDuration().value:\n return (scv.value() as xdr.Uint64).toBigInt();\n\n case xdr.ScValType.scvError().value:\n switch (scv.error().switch().value) {\n // Distinguish errors from the user contract.\n case xdr.ScErrorType.sceContract().value:\n return { type: \"contract\", code: scv.error().contractCode() };\n default: {\n const err = scv.error();\n return {\n type: \"system\",\n code: err.code().value,\n value: err.code().name,\n };\n }\n }\n\n // in the fallthrough case, just return the underlying value directly\n default:\n return scv.value();\n }\n}\n\n/**\n * Build a sorted ScVal map from unsorted entries, sorted by key.\n *\n * @param items - the unsorted map entries\n */\nexport function scvSortedMap(items: xdr.ScMapEntry[]): xdr.ScVal {\n const sorted = Array.from(items).sort((a, b) => {\n // Both a and b are `ScMapEntry`s, so we need to sort by underlying key.\n //\n // We couldn't possibly handle every combination of keys since Soroban\n // maps don't enforce consistent types, so we do a best-effort and try\n // sorting by \"number-like\" or \"string-like.\"\n const nativeA = scValToNative(a.key()) as bigint | number | string;\n const nativeB = scValToNative(b.key()) as bigint | number | string;\n\n switch (typeof nativeA) {\n case \"number\":\n case \"bigint\":\n if (nativeA === nativeB) return 0;\n return nativeA < (nativeB as bigint | number) ? -1 : 1;\n\n default: {\n const strA = nativeA.toString();\n const strB = nativeB.toString();\n return strA < strB ? -1 : strA > strB ? 1 : 0;\n }\n }\n });\n\n return xdr.ScVal.scvMap(sorted);\n}\n\n// Inject a sortable map builder into the xdr module for backwards compatibility.\nxdr.scvSortedMap = scvSortedMap;\n"],"names":["xdr"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scval.js","sources":["../../../../src/base/scval.ts"],"sourcesContent":["import xdr from \"./xdr.js\";\nimport { Keypair } from \"./keypair.js\";\nimport { Address } from \"./address.js\";\nimport { Contract } from \"./contract.js\";\nimport { ScInt, XdrLargeInt, scValToBigInt } from \"./numbers/index.js\";\nimport type { ScIntType } from \"./numbers/index.js\";\n\ntype ScValIntType = ScIntType | \"i32\" | \"u32\";\ntype ScValStringType = ScValIntType | \"address\" | \"string\" | \"symbol\";\ntype ScValBytesType = \"bytes\" | \"string\" | \"symbol\";\ntype ScValType = ScValBytesType | ScValIntType | ScValStringType;\n\ntype ScValMapTypeSpec = Record<\n string,\n [(ScValType | null)?, (ScValType | null)?]\n>;\n\nexport interface NativeToScValOpts {\n type?: (ScValType | null)[] | ScValMapTypeSpec | ScValType | undefined;\n}\n\n/**\n * Attempts to convert native types into smart contract values\n * ({@link xdr.ScVal}).\n *\n * Provides conversions from smart contract XDR values ({@link xdr.ScVal}) to\n * native JavaScript types.\n *\n * The conversions are as follows:\n *\n * - `xdr.ScVal` → passthrough\n * - `null` / `undefined` → `scvVoid`\n * - `string` → `scvString` (a copy is made)\n * - `UintArray8` → `scvBytes` (a copy is made)\n * - `boolean` → `scvBool`\n *\n * - `number` / `bigint` → the smallest possible XDR integer type that will fit\n * the input value (if you want a specific type, use {@link ScInt})\n *\n * - {@link Address} or {@link Contract} → `scvAddress` (for contracts and\n * public keys)\n *\n * - `Array<T>` → `scvVec` after attempting to convert each item of type `T` to\n * an `xdr.ScVal` (recursively). note that all values must be the same type!\n *\n * - `object` → `scvMap` after attempting to convert each key and value to an\n * `xdr.ScVal` (recursively). note that there is no restriction on types\n * matching anywhere (unlike arrays)\n *\n * When passing an integer-like native value, you can also optionally specify a\n * type which will force a particular interpretation of that value.\n *\n * Note that not all type specifications are compatible with all `ScVal`s, e.g.\n * `toScVal(\"a string\", {type: \"i256\"})` will throw.\n *\n * @param val - a native (or convertible) input value to wrap\n * @param opts - an optional set of hints around the type of\n * conversion you'd like to see\n * - `type`: there is different behavior for different input\n * types for `val`:\n *\n * - when `val` is an integer-like type (i.e. number|bigint), this will be\n * forwarded to {@link ScInt} or forced to be u32/i32.\n *\n * - when `val` is an array type, this is forwarded to the recursion\n *\n * - when `val` is an object type (key-value entries), this should be an\n * object in which each key has a pair of types (to represent forced types\n * for the key and the value), where `null` (or a missing entry) indicates\n * the default interpretation(s) (refer to the examples, below)\n *\n * - when `val` is a `Map`, this can be a `[keyType, valType]` pair applied\n * to every entry, or (when all keys are strings) the same per-key spec\n * object used for plain objects\n *\n * - when `val` is a string type, this can be 'string' or 'symbol' to force\n * a particular interpretation of `val`.\n *\n * - when `val` is a bytes-like type, this can be 'string', 'symbol', or\n * 'bytes' to force a particular interpretation\n *\n * As a simple example, `nativeToScVal(\"hello\", {type: 'symbol'})` will\n * return an `scvSymbol`, whereas without the type it would have been an\n * `scvString`.\n *\n * @throws if...\n * - there are arrays with more than one type in them\n * - there are values that do not have a sensible conversion (e.g. random XDR\n * types, custom classes)\n * - the type of the input object (or some inner value of said object) cannot\n * be determined (via `typeof`)\n * - the type you specified (via `opts.type`) is incompatible with the value\n * you passed in (`val`), e.g. `nativeToScVal(\"a string\", { type: 'i128' })`,\n * though this does not apply for types that ignore `opts` (e.g. addresses).\n * @see scValToNative\n *\n * @example\n * ```ts\n * nativeToScVal(1000); // gives ScValType === scvU64\n * nativeToScVal(1000n); // gives ScValType === scvU64\n * nativeToScVal(1n << 100n); // gives ScValType === scvU128\n * nativeToScVal(1000, { type: 'u32' }); // gives ScValType === scvU32\n * nativeToScVal(1000, { type: 'i125' }); // gives ScValType === scvI256\n * nativeToScVal(\"a string\"); // gives ScValType === scvString\n * nativeToScVal(\"a string\", { type: 'symbol' }); // gives scvSymbol\n * nativeToScVal(new Uint8Array(5)); // scvBytes\n * nativeToScVal(new Uint8Array(5), { type: 'symbol' }); // scvSymbol\n * nativeToScVal(null); // scvVoid\n * nativeToScVal(true); // scvBool\n * nativeToScVal([1, 2, 3]); // gives scvVec with each element as scvU64\n * nativeToScVal([1, 2, 3], { type: 'i128' }); // scvVec<scvI128>\n * nativeToScVal([1, '2'], { type: ['i128', 'symbol'] }); // scvVec with diff types\n * nativeToScVal([1, '2', 3], { type: ['i128', 'symbol'] });\n * // scvVec with diff types, using the default when omitted\n * nativeToScVal({ 'hello': 1, 'world': [ true, false ] }, {\n * type: {\n * 'hello': [ 'symbol', 'i128' ],\n * }\n * })\n * // gives scvMap with entries: [\n * // [ scvSymbol, scvI128 ],\n * // [ scvString, scvArray<scvBool> ]\n * // ]\n * ```\n *\n * @example\n * ```ts\n * import {\n * nativeToScVal,\n * scValToNative,\n * ScInt,\n * xdr\n * } from '@stellar/stellar-base';\n *\n * let gigaMap = {\n * bool: true,\n * void: null,\n * u32: xdr.ScVal.scvU32(1),\n * i32: xdr.ScVal.scvI32(1),\n * u64: 1n,\n * i64: -1n,\n * u128: new ScInt(1).toU128(),\n * i128: new ScInt(1).toI128(),\n * u256: new ScInt(1).toU256(),\n * i256: new ScInt(1).toI256(),\n * map: {\n * arbitrary: 1n,\n * nested: 'values',\n * etc: false\n * },\n * vec: ['same', 'type', 'list'],\n * vec: ['diff', 1, 'type', 2, 'list'],\n * };\n *\n * // then, simply:\n * let scv = nativeToScVal(gigaMap); // scv.switch() == xdr.ScValType.scvMap()\n *\n * // then...\n * someContract.call(\"method\", scv);\n *\n * // Similarly, the inverse should work:\n * scValToNative(scv) == gigaMap; // true\n * ```\n */\nexport function nativeToScVal(\n val: unknown,\n opts: NativeToScValOpts = {},\n): xdr.ScVal {\n switch (typeof val) {\n case \"object\": {\n if (val === null) {\n return xdr.ScVal.scvVoid();\n }\n\n if (val instanceof xdr.ScVal) {\n return val; // should we copy?\n }\n\n if (val instanceof Address) {\n return val.toScVal();\n }\n\n if (val instanceof Keypair) {\n return nativeToScVal(val.publicKey(), { type: \"address\" });\n }\n\n if (val instanceof Contract) {\n return val.address().toScVal();\n }\n\n if (val instanceof Uint8Array || Buffer.isBuffer(val)) {\n const copy = Buffer.from(val);\n switch ((opts?.type as string) ?? \"bytes\") {\n case \"bytes\":\n return xdr.ScVal.scvBytes(copy);\n case \"symbol\":\n return xdr.ScVal.scvSymbol(copy);\n case \"string\":\n return xdr.ScVal.scvString(copy);\n default:\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for bytes-like value`,\n );\n }\n }\n\n if (Array.isArray(val)) {\n return xdr.ScVal.scvVec(\n val.map((v: unknown, idx: number) => {\n // There may be different type specifications for each element in\n // the array, so we need to apply those accordingly.\n if (Array.isArray(opts.type)) {\n return nativeToScVal(\n v,\n // only include a `{ type: ... }` if it's present (safer than\n // `{type: undefined}`)\n {\n ...(opts.type.length > idx && {\n type: opts.type[idx] as ScValType,\n }),\n },\n );\n }\n\n // Otherwise apply a generic (or missing) type specifier on it.\n return nativeToScVal(v, opts);\n }),\n );\n }\n\n if (val instanceof Map) {\n // For Maps, `opts.type` can take two forms:\n // - a `[keyType, valType]` pair applied to every entry (keys need not\n // be strings, so a per-key spec can't address them), or\n // - a per-key spec object (like the plain-object form below), which\n // only makes sense when the Map's keys are strings.\n let uniformKeyType: ScValType | null = null;\n let uniformValType: ScValType | null = null;\n let perKeySpec: ScValMapTypeSpec | null = null;\n if (Array.isArray(opts.type)) {\n if (opts.type.length > 2) {\n throw new TypeError(\n `expected a [keyType, valType] pair for a Map, got ${JSON.stringify(opts.type)}`,\n );\n }\n [uniformKeyType = null, uniformValType = null] = opts.type;\n } else if (typeof opts.type === \"object\" && opts.type !== null) {\n perKeySpec = opts.type;\n } else if (opts.type !== undefined) {\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for a Map`,\n );\n }\n\n const entries: xdr.ScMapEntry[] = [];\n for (const [k, v] of val) {\n let keyType = uniformKeyType;\n let valType = uniformValType;\n if (\n perKeySpec &&\n typeof k === \"string\" &&\n Object.hasOwn(perKeySpec, k)\n ) {\n [keyType = null, valType = null] = perKeySpec[k] ?? [];\n }\n entries.push(\n new xdr.ScMapEntry({\n key: nativeToScVal(k, keyType ? { type: keyType } : {}),\n val: nativeToScVal(v, valType ? { type: valType } : {}),\n }),\n );\n }\n return xdr.scvSortedMap(entries);\n }\n\n if (Object.getPrototypeOf(val) !== Object.prototype) {\n throw new TypeError(\n `cannot interpret ${\n val.constructor?.name\n } value as ScVal (${JSON.stringify(val)})`,\n );\n }\n\n const mapTypeSpec = (opts?.type ?? {}) as ScValMapTypeSpec;\n\n return xdr.ScVal.scvMap(\n Object.entries(val as Record<string, unknown>)\n // The Soroban runtime expects maps to have their keys in sorted\n // order, so let's do that here as part of the conversion to prevent\n // confusing error messages on execution.\n .sort(([key1], [key2]) => (key1 < key2 ? -1 : key1 > key2 ? 1 : 0))\n .map(([k, v]) => {\n // the type can be specified with an entry for the key and the value,\n // e.g. val = { 'hello': 1 } and opts.type = { hello: [ 'symbol',\n // 'u128' ]} or you can use `null` for the default interpretation\n const [keyType, valType] = Object.hasOwn(mapTypeSpec, k)\n ? (mapTypeSpec[k] ?? [null, null])\n : [null, null];\n const keyOpts: NativeToScValOpts = keyType ? { type: keyType } : {};\n const valOpts: NativeToScValOpts = valType ? { type: valType } : {};\n\n return new xdr.ScMapEntry({\n key: nativeToScVal(k, keyOpts),\n val: nativeToScVal(v, valOpts),\n });\n }),\n );\n }\n\n case \"number\":\n case \"bigint\": {\n const bigintVal = BigInt(val);\n switch (opts?.type) {\n case \"u32\":\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(val));\n case \"i32\":\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(val));\n\n default:\n break;\n }\n\n return new ScInt(val, { type: opts?.type as ScIntType }).toScVal();\n }\n case \"string\": {\n const optType = (opts?.type as string) ?? \"string\";\n switch (optType) {\n case \"string\":\n return xdr.ScVal.scvString(val);\n\n case \"symbol\":\n return xdr.ScVal.scvSymbol(val);\n\n case \"address\":\n return new Address(val).toScVal();\n\n case \"u32\": {\n const bigintVal = BigInt(val);\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(bigintVal));\n }\n\n case \"i32\": {\n const bigintVal = BigInt(val);\n // TODO: Update this check once xdr.Int32.MIN_VALUE in XDR is properly\n // set to negative. Check this globally.\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(bigintVal));\n }\n\n default:\n if (XdrLargeInt.isType(optType)) {\n return new XdrLargeInt(optType, val).toScVal();\n }\n\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for string value`,\n );\n }\n }\n\n case \"boolean\":\n return xdr.ScVal.scvBool(val);\n\n case \"undefined\":\n return xdr.ScVal.scvVoid();\n\n case \"function\": // FIXME: Is this too helpful?\n return nativeToScVal((val as () => unknown)());\n\n default:\n throw new TypeError(\n `failed to convert typeof ${typeof val} (${JSON.stringify(val)})`,\n );\n }\n}\n\n/**\n * Given a smart contract value, attempt to convert it to a native type.\n * Possible conversions include:\n *\n * - `void` → `null`\n * - `u32`, `i32` → `number`\n * - `u64`, `i64`, `u128`, `i128`, `u256`, `i256`, `timepoint`, `duration` →\n * `bigint`\n * - `vec` → `Array` of any of the above (via recursion)\n * - `map` → key-value object of any of the above (via recursion)\n * - `bool` → `boolean`\n * - `bytes` → `Uint8Array`\n * - `symbol` → `string`\n * - `string` → `string` IF the underlying buffer can be decoded as ascii/utf8,\n * `Uint8Array` of the raw contents in any error case\n *\n * If no viable conversion can be determined, this just \"unwraps\" the smart\n * value to return its underlying XDR value.\n *\n * @param scv - the input smart contract value\n *\n * @see nativeToScVal\n */\n\nexport function scValToNative(scv: xdr.ScVal): any {\n // we use the verbose xdr.ScValType.<type>.value form here because it's faster\n // than string comparisons and the underlying constants never need to be\n // updated\n switch (scv.switch().value) {\n case xdr.ScValType.scvVoid().value:\n return null;\n\n // these can be converted to bigints directly\n case xdr.ScValType.scvU64().value:\n case xdr.ScValType.scvI64().value:\n return (scv.value() as xdr.Int64 | xdr.Uint64).toBigInt();\n\n // these can be parsed by internal abstractions note that this can also\n // handle the above two cases, but it's not as efficient (another\n // type-check, parsing, etc.)\n case xdr.ScValType.scvU128().value:\n case xdr.ScValType.scvI128().value:\n case xdr.ScValType.scvU256().value:\n case xdr.ScValType.scvI256().value:\n return scValToBigInt(scv);\n\n case xdr.ScValType.scvVec().value:\n return (scv.vec() ?? []).map(scValToNative);\n\n case xdr.ScValType.scvAddress().value:\n return Address.fromScVal(scv).toString();\n\n case xdr.ScValType.scvMap().value:\n return Object.fromEntries(\n (scv.map() ?? []).map((entry: xdr.ScMapEntry) => [\n scValToNative(entry.key()),\n scValToNative(entry.val()),\n ]),\n );\n\n // these return the primitive type directly\n case xdr.ScValType.scvBool().value:\n case xdr.ScValType.scvU32().value:\n case xdr.ScValType.scvI32().value:\n case xdr.ScValType.scvBytes().value:\n return scv.value();\n\n // Symbols are limited to [a-zA-Z0-9_]+, so we can safely make ascii strings\n //\n // Strings, however, are \"presented\" as strings and we treat them as such\n // (in other words, string = bytes with a hint that it's text). If the user\n // encoded non-printable bytes in their string value, that's on them.\n //\n // Note that we assume a utf8 encoding (ascii-compatible). For other\n // encodings, you should probably use bytes anyway. If it cannot be decoded,\n // the raw bytes are returned.\n case xdr.ScValType.scvSymbol().value: {\n const v = scv.sym();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n case xdr.ScValType.scvString().value: {\n const v = scv.str();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n\n // these can be converted to bigint\n case xdr.ScValType.scvTimepoint().value:\n case xdr.ScValType.scvDuration().value:\n return (scv.value() as xdr.Uint64).toBigInt();\n\n case xdr.ScValType.scvError().value:\n switch (scv.error().switch().value) {\n // Distinguish errors from the user contract.\n case xdr.ScErrorType.sceContract().value:\n return { type: \"contract\", code: scv.error().contractCode() };\n default: {\n const err = scv.error();\n return {\n type: \"system\",\n code: err.code().value,\n value: err.code().name,\n };\n }\n }\n\n // in the fallthrough case, just return the underlying value directly\n default:\n return scv.value();\n }\n}\n\n/**\n * Build a sorted ScVal map from unsorted entries, sorted by key.\n *\n * @param items - the unsorted map entries\n */\nexport function scvSortedMap(items: xdr.ScMapEntry[]): xdr.ScVal {\n const sorted = Array.from(items).sort((a, b) => {\n // Both a and b are `ScMapEntry`s, so we need to sort by underlying key.\n //\n // We couldn't possibly handle every combination of keys since Soroban\n // maps don't enforce consistent types, so we do a best-effort and try\n // sorting by \"number-like\" or \"string-like.\"\n const nativeA = scValToNative(a.key()) as bigint | number | string;\n const nativeB = scValToNative(b.key()) as bigint | number | string;\n\n switch (typeof nativeA) {\n case \"number\":\n case \"bigint\":\n if (nativeA === nativeB) return 0;\n return nativeA < (nativeB as bigint | number) ? -1 : 1;\n\n default: {\n const strA = nativeA.toString();\n const strB = nativeB.toString();\n return strA < strB ? -1 : strA > strB ? 1 : 0;\n }\n }\n });\n\n return xdr.ScVal.scvMap(sorted);\n}\n\n// Inject a sortable map builder into the xdr module for backwards compatibility.\nxdr.scvSortedMap = scvSortedMap;\n"],"names":["xdr"],"mappings":"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"}
|
|
@@ -4,12 +4,51 @@ import { Spec } from "../contract/index.js";
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class ClientGenerator {
|
|
6
6
|
private spec;
|
|
7
|
+
private eventFilterMethodNames;
|
|
7
8
|
constructor(spec: Spec);
|
|
8
9
|
/**
|
|
9
10
|
* Generate client class
|
|
10
11
|
*/
|
|
11
12
|
generate(): string;
|
|
12
13
|
private generateImports;
|
|
14
|
+
/**
|
|
15
|
+
* Generate the parseEvent method, which delegates to the underlying Spec
|
|
16
|
+
* to decode a raw event's topics/data into a typed ContractEvent.
|
|
17
|
+
*/
|
|
18
|
+
private generateParseEventMethod;
|
|
19
|
+
private parseEventMethodName;
|
|
20
|
+
/**
|
|
21
|
+
* The `<camelCase>EventFilter` method name derived from an event name is
|
|
22
|
+
* not injective (e.g. "FooBar" and "foo_bar" both produce
|
|
23
|
+
* "fooBarEventFilter"), a contract may declare several events with the
|
|
24
|
+
* very same name (composed modules each emitting their own "transfer"),
|
|
25
|
+
* and it can just as easily collide with a generated contract function
|
|
26
|
+
* name (e.g. an event "transfer" plus a function "transferEventFilter").
|
|
27
|
+
* Since function member names are load-bearing (called directly by
|
|
28
|
+
* users) and event filter names are already synthetic, function names
|
|
29
|
+
* always win: they are reserved first, in spec-entry order. Events are
|
|
30
|
+
* then resolved in spec-entry order, appending the smallest integer 2 or
|
|
31
|
+
* greater needed to make the name unique (and reserving whatever name
|
|
32
|
+
* results, so later events see it too). This is deterministic for a
|
|
33
|
+
* given spec.
|
|
34
|
+
*/
|
|
35
|
+
private resolveEventFilterMethodNames;
|
|
36
|
+
/**
|
|
37
|
+
* Compute the resolved (possibly disambiguated) filter method name for an
|
|
38
|
+
* event; see {@link resolveEventFilterMethodNames}.
|
|
39
|
+
*/
|
|
40
|
+
private eventFilterMethodName;
|
|
41
|
+
/**
|
|
42
|
+
* The resolved (possibly disambiguated) filter method name of every event
|
|
43
|
+
* in the spec, in declaration order. Exposed so callers (e.g. the bindings
|
|
44
|
+
* generator's diagnostics) can report renames and duplicates.
|
|
45
|
+
*/
|
|
46
|
+
eventFilterMethodNamesInOrder(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Generate a per-event helper that builds a topics-filter row for
|
|
49
|
+
* `Api.EventFilter.topics`, suitable for passing to server.getEvents.
|
|
50
|
+
*/
|
|
51
|
+
private generateEventFilterMethod;
|
|
13
52
|
/**
|
|
14
53
|
* Generate interface method signature
|
|
15
54
|
*/
|
|
@@ -1,7 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/int.js';
|
|
2
|
+
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/hyper.js';
|
|
3
|
+
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-int.js';
|
|
4
|
+
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-hyper.js';
|
|
5
|
+
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/xdr-type.js';
|
|
6
|
+
import 'buffer';
|
|
7
|
+
import types from '../base/generated/curr_generated.js';
|
|
8
|
+
import '@noble/hashes/sha2.js';
|
|
9
|
+
import '../base/signing.js';
|
|
10
|
+
import '../base/keypair.js';
|
|
11
|
+
import 'base32.js';
|
|
12
|
+
import '../base/util/continued_fraction.js';
|
|
13
|
+
import '../base/util/bignumber.js';
|
|
14
|
+
import '../base/transaction_builder.js';
|
|
15
|
+
import '../base/muxed_account.js';
|
|
16
|
+
import '../base/scval.js';
|
|
17
|
+
import '../base/numbers/uint128.js';
|
|
18
|
+
import '../base/numbers/uint256.js';
|
|
19
|
+
import '../base/numbers/int128.js';
|
|
20
|
+
import '../base/numbers/int256.js';
|
|
21
|
+
import { generateTypeImports, formatImports, sanitizeIdentifier, toCamelCase, escapeStringLiteral, parseTypeFromTypeDef, formatJSDocComment } from './utils.js';
|
|
2
22
|
|
|
3
23
|
class ClientGenerator {
|
|
4
24
|
spec;
|
|
25
|
+
// event index (in declaration order) -> resolved (possibly disambiguated)
|
|
26
|
+
// filter method name. Keyed by index rather than raw name because a
|
|
27
|
+
// contract may declare several events with the same name.
|
|
28
|
+
// Lazily computed on first use; see resolveEventFilterMethodNames().
|
|
29
|
+
eventFilterMethodNames = null;
|
|
5
30
|
constructor(spec) {
|
|
6
31
|
this.spec = spec;
|
|
7
32
|
}
|
|
@@ -22,6 +47,13 @@ class ClientGenerator {
|
|
|
22
47
|
(entry) => `"${entry.toXDR("base64")}"`
|
|
23
48
|
);
|
|
24
49
|
const fromJSON = this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").map((func) => this.generateFromJSONMethod(func)).join(",");
|
|
50
|
+
const events = this.spec.events();
|
|
51
|
+
const parseEventMethodName = this.parseEventMethodName();
|
|
52
|
+
const eventMethods = events.length > 0 ? `
|
|
53
|
+
${this.generateParseEventMethod(parseEventMethodName)}
|
|
54
|
+
${events.map(
|
|
55
|
+
(event, eventIndex) => this.generateEventFilterMethod(event, eventIndex)
|
|
56
|
+
).join("\n")}` : "";
|
|
25
57
|
return `${imports}
|
|
26
58
|
|
|
27
59
|
export interface Client {
|
|
@@ -40,6 +72,7 @@ export class Client extends ContractClient {
|
|
|
40
72
|
public readonly fromJSON = {
|
|
41
73
|
${fromJSON}
|
|
42
74
|
};
|
|
75
|
+
${eventMethods}
|
|
43
76
|
}`;
|
|
44
77
|
}
|
|
45
78
|
generateImports() {
|
|
@@ -51,6 +84,25 @@ export class Client extends ContractClient {
|
|
|
51
84
|
return defs;
|
|
52
85
|
})
|
|
53
86
|
);
|
|
87
|
+
const events = this.spec.events();
|
|
88
|
+
if (events.length > 0) {
|
|
89
|
+
imports.typeFileImports.add("ContractEvent");
|
|
90
|
+
imports.stellarImports.add("xdr");
|
|
91
|
+
events.forEach((event) => {
|
|
92
|
+
const topicParams = event.params().filter(
|
|
93
|
+
(param) => param.location().value === types.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList().value
|
|
94
|
+
);
|
|
95
|
+
topicParams.forEach((param) => {
|
|
96
|
+
const nested = generateTypeImports([param.type()]);
|
|
97
|
+
nested.typeFileImports.forEach((t) => imports.typeFileImports.add(t));
|
|
98
|
+
nested.stellarContractImports.forEach(
|
|
99
|
+
(t) => imports.stellarContractImports.add(t)
|
|
100
|
+
);
|
|
101
|
+
nested.stellarImports.forEach((t) => imports.stellarImports.add(t));
|
|
102
|
+
imports.needsBufferImport = imports.needsBufferImport || nested.needsBufferImport;
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
54
106
|
return formatImports(imports, {
|
|
55
107
|
includeTypeFileImports: true,
|
|
56
108
|
// Client imports types
|
|
@@ -63,6 +115,124 @@ export class Client extends ContractClient {
|
|
|
63
115
|
]
|
|
64
116
|
});
|
|
65
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate the parseEvent method, which delegates to the underlying Spec
|
|
120
|
+
* to decode a raw event's topics/data into a typed ContractEvent.
|
|
121
|
+
*/
|
|
122
|
+
generateParseEventMethod(methodName) {
|
|
123
|
+
return ` /**
|
|
124
|
+
* Parse a raw contract event (topics + data) into a typed {@link ContractEvent}.
|
|
125
|
+
*/
|
|
126
|
+
${methodName}(topics: xdr.ScVal[] | string[], data: xdr.ScVal | string): ContractEvent | undefined {
|
|
127
|
+
return this.spec.parseEvent(topics, data) as ContractEvent | undefined;
|
|
128
|
+
}`;
|
|
129
|
+
}
|
|
130
|
+
parseEventMethodName() {
|
|
131
|
+
const reserved = new Set(
|
|
132
|
+
this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").map((func) => sanitizeIdentifier(func.name().toString()))
|
|
133
|
+
);
|
|
134
|
+
let candidate = "parseEvent";
|
|
135
|
+
let suffix = 2;
|
|
136
|
+
while (reserved.has(candidate)) {
|
|
137
|
+
candidate = `parseEvent${suffix}`;
|
|
138
|
+
suffix += 1;
|
|
139
|
+
}
|
|
140
|
+
return candidate;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The `<camelCase>EventFilter` method name derived from an event name is
|
|
144
|
+
* not injective (e.g. "FooBar" and "foo_bar" both produce
|
|
145
|
+
* "fooBarEventFilter"), a contract may declare several events with the
|
|
146
|
+
* very same name (composed modules each emitting their own "transfer"),
|
|
147
|
+
* and it can just as easily collide with a generated contract function
|
|
148
|
+
* name (e.g. an event "transfer" plus a function "transferEventFilter").
|
|
149
|
+
* Since function member names are load-bearing (called directly by
|
|
150
|
+
* users) and event filter names are already synthetic, function names
|
|
151
|
+
* always win: they are reserved first, in spec-entry order. Events are
|
|
152
|
+
* then resolved in spec-entry order, appending the smallest integer 2 or
|
|
153
|
+
* greater needed to make the name unique (and reserving whatever name
|
|
154
|
+
* results, so later events see it too). This is deterministic for a
|
|
155
|
+
* given spec.
|
|
156
|
+
*/
|
|
157
|
+
resolveEventFilterMethodNames() {
|
|
158
|
+
if (this.eventFilterMethodNames !== null) {
|
|
159
|
+
return this.eventFilterMethodNames;
|
|
160
|
+
}
|
|
161
|
+
const reserved = /* @__PURE__ */ new Set();
|
|
162
|
+
this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").forEach((func) => {
|
|
163
|
+
reserved.add(sanitizeIdentifier(func.name().toString()));
|
|
164
|
+
});
|
|
165
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
166
|
+
this.spec.events().forEach((event, eventIndex) => {
|
|
167
|
+
const preferred = `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;
|
|
168
|
+
let candidate = preferred;
|
|
169
|
+
let suffix = 2;
|
|
170
|
+
while (reserved.has(candidate)) {
|
|
171
|
+
candidate = `${preferred}${suffix}`;
|
|
172
|
+
suffix += 1;
|
|
173
|
+
}
|
|
174
|
+
reserved.add(candidate);
|
|
175
|
+
resolved.set(eventIndex, candidate);
|
|
176
|
+
});
|
|
177
|
+
this.eventFilterMethodNames = resolved;
|
|
178
|
+
return resolved;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Compute the resolved (possibly disambiguated) filter method name for an
|
|
182
|
+
* event; see {@link resolveEventFilterMethodNames}.
|
|
183
|
+
*/
|
|
184
|
+
eventFilterMethodName(event, eventIndex) {
|
|
185
|
+
const resolved = this.resolveEventFilterMethodNames().get(eventIndex);
|
|
186
|
+
if (resolved === void 0) {
|
|
187
|
+
return `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;
|
|
188
|
+
}
|
|
189
|
+
return resolved;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* The resolved (possibly disambiguated) filter method name of every event
|
|
193
|
+
* in the spec, in declaration order. Exposed so callers (e.g. the bindings
|
|
194
|
+
* generator's diagnostics) can report renames and duplicates.
|
|
195
|
+
*/
|
|
196
|
+
eventFilterMethodNamesInOrder() {
|
|
197
|
+
return this.spec.events().map(
|
|
198
|
+
(event, eventIndex) => this.eventFilterMethodName(event, eventIndex)
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Generate a per-event helper that builds a topics-filter row for
|
|
203
|
+
* `Api.EventFilter.topics`, suitable for passing to server.getEvents.
|
|
204
|
+
*/
|
|
205
|
+
generateEventFilterMethod(event, eventIndex) {
|
|
206
|
+
const rawName = event.name().toString();
|
|
207
|
+
const methodName = this.eventFilterMethodName(event, eventIndex);
|
|
208
|
+
const preferredMethodName = `${toCamelCase(sanitizeIdentifier(rawName))}EventFilter`;
|
|
209
|
+
const occurrence = this.spec.events().slice(0, eventIndex).filter((e) => e.name().toString() === rawName).length;
|
|
210
|
+
const occurrenceNote = occurrence > 0 ? ` This targets declaration ${occurrence + 1} of the "${rawName}" event in the contract spec.` : "";
|
|
211
|
+
const renameNote = methodName !== preferredMethodName ? ` Note: renamed from "${preferredMethodName}" to avoid a collision with another generated name.` : "";
|
|
212
|
+
const topicParams = event.params().filter(
|
|
213
|
+
(param) => param.location().value === types.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList().value
|
|
214
|
+
);
|
|
215
|
+
const fields = topicParams.map((param) => {
|
|
216
|
+
const rawParamName = param.name().toString();
|
|
217
|
+
const fieldName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName) ? rawParamName : `"${escapeStringLiteral(rawParamName)}"`;
|
|
218
|
+
const fieldType = parseTypeFromTypeDef(param.type(), true);
|
|
219
|
+
return `${fieldName}?: ${fieldType}`;
|
|
220
|
+
}).join("; ");
|
|
221
|
+
const doc = formatJSDocComment(
|
|
222
|
+
`Build a topics filter row for the "${rawName}" event, for use in \`Api.EventFilter.topics\` when calling \`server.getEvents\`. Omitted fields match any value.${occurrenceNote}${renameNote}`,
|
|
223
|
+
2
|
|
224
|
+
);
|
|
225
|
+
const escapedName = escapeStringLiteral(rawName);
|
|
226
|
+
const occurrenceArg = occurrence > 0 ? `, ${occurrence}` : "";
|
|
227
|
+
if (topicParams.length === 0) {
|
|
228
|
+
return `${doc} ${methodName}(): string[] {
|
|
229
|
+
return this.spec.eventTopicFilter("${escapedName}"${occurrence > 0 ? `, undefined${occurrenceArg}` : ""});
|
|
230
|
+
}`;
|
|
231
|
+
}
|
|
232
|
+
return `${doc} ${methodName}(topicValues?: { ${fields} }): string[] {
|
|
233
|
+
return this.spec.eventTopicFilter("${escapedName}", topicValues${occurrenceArg});
|
|
234
|
+
}`;
|
|
235
|
+
}
|
|
66
236
|
/**
|
|
67
237
|
* Generate interface method signature
|
|
68
238
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../../../src/bindings/client.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n formatJSDocComment,\n formatImports,\n} from \"./utils.js\";\n\n/**\n * Generates TypeScript client class for contract methods\n */\nexport class ClientGenerator {\n private spec: Spec;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate client class\n */\n generate(): string {\n // Generate constructor method if it exists\n let deployMethod = \"\";\n try {\n const constructorFunc = this.spec.getFunc(\"__constructor\");\n deployMethod = this.generateDeployMethod(constructorFunc);\n } catch {\n // For specs without a constructor, generate a deploy method without params\n deployMethod = this.generateDeployMethod(undefined);\n }\n // Generate interface methods\n const interfaceMethods = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateInterfaceMethod(func))\n .join(\"\\n\");\n\n const imports = this.generateImports();\n\n const specEntries = this.spec.entries.map(\n (entry) => `\"${entry.toXDR(\"base64\")}\"`,\n );\n\n const fromJSON = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateFromJSONMethod(func))\n .join(\",\");\n\n return `${imports}\n\nexport interface Client {\n${interfaceMethods}\n}\n\nexport class Client extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new Spec([${specEntries.join(\", \")}]),\n options\n );\n }\n\n ${deployMethod}\n public readonly fromJSON = {\n ${fromJSON}\n };\n}`;\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.funcs().flatMap((func) => {\n const inputs = func.inputs();\n const outputs = func.outputs();\n const defs = inputs.map((input) => input.type()).concat(outputs);\n return defs;\n }),\n );\n\n return formatImports(imports, {\n includeTypeFileImports: true, // Client imports types\n additionalStellarContractImports: [\n \"Spec\",\n \"AssembledTransaction\",\n \"Client as ContractClient\",\n \"ClientOptions as ContractClientOptions\",\n \"MethodOptions\",\n ],\n });\n }\n\n /**\n * Generate interface method signature\n */\n private generateInterfaceMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const inputs = func.inputs().map((input: any) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n const docs = formatJSDocComment(func.doc().toString(), 2);\n const params = this.formatMethodParameters(inputs);\n\n return `${docs} ${name}(${params}): Promise<AssembledTransaction<${outputType}>>;`;\n }\n\n private generateFromJSONMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n\n return ` ${name} : this.txFromJSON<${outputType}>`;\n }\n /**\n * Generate deploy method\n */\n private generateDeployMethod(\n constructorFunc: xdr.ScSpecFunctionV0 | undefined,\n ): string {\n // If no constructor, generate deploy with no params\n if (!constructorFunc) {\n const params = this.formatConstructorParameters([]);\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(null, options);\n }`;\n }\n const inputs = constructorFunc.inputs().map((input) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n\n const params = this.formatConstructorParameters(inputs);\n const inputsDestructure =\n inputs.length > 0 ? `{ ${inputs.map((i) => i.name).join(\", \")} }, ` : \"\";\n\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(${inputsDestructure}options);\n }`;\n }\n\n /**\n * Format method parameters\n */\n private formatMethodParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\"options?: MethodOptions\");\n\n return params.join(\", \");\n }\n\n /**\n * Format constructor parameters\n */\n private formatConstructorParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\n 'options: MethodOptions & Omit<ContractClientOptions, \\'contractId\\'> & { wasmHash: Buffer | string; salt?: Buffer | Uint8Array; format?: \"hex\" | \"base64\"; address?: string; }',\n );\n\n return params.join(\", \");\n }\n}\n"],"names":["params"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../../../src/bindings/client.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n escapeStringLiteral,\n formatJSDocComment,\n formatImports,\n toCamelCase,\n} from \"./utils.js\";\n\n/**\n * Generates TypeScript client class for contract methods\n */\nexport class ClientGenerator {\n private spec: Spec;\n\n // event index (in declaration order) -> resolved (possibly disambiguated)\n // filter method name. Keyed by index rather than raw name because a\n // contract may declare several events with the same name.\n // Lazily computed on first use; see resolveEventFilterMethodNames().\n private eventFilterMethodNames: Map<number, string> | null = null;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate client class\n */\n generate(): string {\n // Generate constructor method if it exists\n let deployMethod = \"\";\n try {\n const constructorFunc = this.spec.getFunc(\"__constructor\");\n deployMethod = this.generateDeployMethod(constructorFunc);\n } catch {\n // For specs without a constructor, generate a deploy method without params\n deployMethod = this.generateDeployMethod(undefined);\n }\n // Generate interface methods\n const interfaceMethods = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateInterfaceMethod(func))\n .join(\"\\n\");\n\n const imports = this.generateImports();\n\n const specEntries = this.spec.entries.map(\n (entry) => `\"${entry.toXDR(\"base64\")}\"`,\n );\n\n const fromJSON = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateFromJSONMethod(func))\n .join(\",\");\n\n const events = this.spec.events();\n const parseEventMethodName = this.parseEventMethodName();\n const eventMethods =\n events.length > 0\n ? `\\n${this.generateParseEventMethod(parseEventMethodName)}\\n${events\n .map((event, eventIndex) =>\n this.generateEventFilterMethod(event, eventIndex),\n )\n .join(\"\\n\")}`\n : \"\";\n\n return `${imports}\n\nexport interface Client {\n${interfaceMethods}\n}\n\nexport class Client extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new Spec([${specEntries.join(\", \")}]),\n options\n );\n }\n\n ${deployMethod}\n public readonly fromJSON = {\n ${fromJSON}\n };\n${eventMethods}\n}`;\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.funcs().flatMap((func) => {\n const inputs = func.inputs();\n const outputs = func.outputs();\n const defs = inputs.map((input) => input.type()).concat(outputs);\n return defs;\n }),\n );\n\n const events = this.spec.events();\n if (events.length > 0) {\n // parseEvent()'s return type is the ContractEvent union\n imports.typeFileImports.add(\"ContractEvent\");\n // parseEvent()'s topics/data parameters are typed using xdr.ScVal\n imports.stellarImports.add(\"xdr\");\n // Event filter helpers reference topic-list param types only; data\n // param types appear only in types.ts\n events.forEach((event) => {\n const topicParams = event\n .params()\n .filter(\n (param) =>\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList()\n .value,\n );\n topicParams.forEach((param) => {\n const nested = generateTypeImports([param.type()]);\n nested.typeFileImports.forEach((t) => imports.typeFileImports.add(t));\n nested.stellarContractImports.forEach((t) =>\n imports.stellarContractImports.add(t),\n );\n nested.stellarImports.forEach((t) => imports.stellarImports.add(t));\n imports.needsBufferImport =\n imports.needsBufferImport || nested.needsBufferImport;\n });\n });\n }\n\n return formatImports(imports, {\n includeTypeFileImports: true, // Client imports types\n additionalStellarContractImports: [\n \"Spec\",\n \"AssembledTransaction\",\n \"Client as ContractClient\",\n \"ClientOptions as ContractClientOptions\",\n \"MethodOptions\",\n ],\n });\n }\n\n /**\n * Generate the parseEvent method, which delegates to the underlying Spec\n * to decode a raw event's topics/data into a typed ContractEvent.\n */\n private generateParseEventMethod(methodName: string): string {\n return ` /**\n * Parse a raw contract event (topics + data) into a typed {@link ContractEvent}.\n */\n ${methodName}(topics: xdr.ScVal[] | string[], data: xdr.ScVal | string): ContractEvent | undefined {\n return this.spec.parseEvent(topics, data) as ContractEvent | undefined;\n }`;\n }\n\n private parseEventMethodName(): string {\n const reserved = new Set(\n this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => sanitizeIdentifier(func.name().toString())),\n );\n let candidate = \"parseEvent\";\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `parseEvent${suffix}`;\n suffix += 1;\n }\n return candidate;\n }\n\n /**\n * The `<camelCase>EventFilter` method name derived from an event name is\n * not injective (e.g. \"FooBar\" and \"foo_bar\" both produce\n * \"fooBarEventFilter\"), a contract may declare several events with the\n * very same name (composed modules each emitting their own \"transfer\"),\n * and it can just as easily collide with a generated contract function\n * name (e.g. an event \"transfer\" plus a function \"transferEventFilter\").\n * Since function member names are load-bearing (called directly by\n * users) and event filter names are already synthetic, function names\n * always win: they are reserved first, in spec-entry order. Events are\n * then resolved in spec-entry order, appending the smallest integer 2 or\n * greater needed to make the name unique (and reserving whatever name\n * results, so later events see it too). This is deterministic for a\n * given spec.\n */\n private resolveEventFilterMethodNames(): Map<number, string> {\n if (this.eventFilterMethodNames !== null) {\n return this.eventFilterMethodNames;\n }\n\n const reserved = new Set<string>();\n\n this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .forEach((func) => {\n reserved.add(sanitizeIdentifier(func.name().toString()));\n });\n\n const resolved = new Map<number, string>();\n\n this.spec.events().forEach((event, eventIndex) => {\n const preferred = `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;\n\n let candidate = preferred;\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `${preferred}${suffix}`;\n suffix += 1;\n }\n\n reserved.add(candidate);\n resolved.set(eventIndex, candidate);\n });\n\n this.eventFilterMethodNames = resolved;\n return resolved;\n }\n\n /**\n * Compute the resolved (possibly disambiguated) filter method name for an\n * event; see {@link resolveEventFilterMethodNames}.\n */\n private eventFilterMethodName(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const resolved = this.resolveEventFilterMethodNames().get(eventIndex);\n /* istanbul ignore next -- every event in the spec is reserved a name */\n if (resolved === undefined) {\n return `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;\n }\n return resolved;\n }\n\n /**\n * The resolved (possibly disambiguated) filter method name of every event\n * in the spec, in declaration order. Exposed so callers (e.g. the bindings\n * generator's diagnostics) can report renames and duplicates.\n */\n eventFilterMethodNamesInOrder(): string[] {\n return this.spec\n .events()\n .map((event, eventIndex) =>\n this.eventFilterMethodName(event, eventIndex),\n );\n }\n\n /**\n * Generate a per-event helper that builds a topics-filter row for\n * `Api.EventFilter.topics`, suitable for passing to server.getEvents.\n */\n private generateEventFilterMethod(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const rawName = event.name().toString();\n const methodName = this.eventFilterMethodName(event, eventIndex);\n const preferredMethodName = `${toCamelCase(sanitizeIdentifier(rawName))}EventFilter`;\n // Which same-named event this is (0-based, declaration order) — needed\n // so eventTopicFilter targets the right spec when names are duplicated.\n const occurrence = this.spec\n .events()\n .slice(0, eventIndex)\n .filter((e) => e.name().toString() === rawName).length;\n const occurrenceNote =\n occurrence > 0\n ? ` This targets declaration ${occurrence + 1} of the \"${rawName}\" event in the contract spec.`\n : \"\";\n const renameNote =\n methodName !== preferredMethodName\n ? ` Note: renamed from \"${preferredMethodName}\" to avoid a collision with another generated name.`\n : \"\";\n const topicParams = event\n .params()\n .filter(\n (param) =>\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList()\n .value,\n );\n\n // eventTopicFilter looks values up by the raw param names, so the\n // parameter type must use them too — quoted when they aren't valid\n // identifiers.\n const fields = topicParams\n .map((param) => {\n const rawParamName = param.name().toString();\n const fieldName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName)\n ? rawParamName\n : `\"${escapeStringLiteral(rawParamName)}\"`;\n const fieldType = parseTypeFromTypeDef(param.type(), true);\n return `${fieldName}?: ${fieldType}`;\n })\n .join(\"; \");\n\n const doc = formatJSDocComment(\n `Build a topics filter row for the \"${rawName}\" event, for use in ` +\n `\\`Api.EventFilter.topics\\` when calling \\`server.getEvents\\`. ` +\n `Omitted fields match any value.${occurrenceNote}${renameNote}`,\n 2,\n );\n\n const escapedName = escapeStringLiteral(rawName);\n const occurrenceArg = occurrence > 0 ? `, ${occurrence}` : \"\";\n\n if (topicParams.length === 0) {\n return `${doc} ${methodName}(): string[] {\n return this.spec.eventTopicFilter(\"${escapedName}\"${occurrence > 0 ? `, undefined${occurrenceArg}` : \"\"});\n }`;\n }\n\n return `${doc} ${methodName}(topicValues?: { ${fields} }): string[] {\n return this.spec.eventTopicFilter(\"${escapedName}\", topicValues${occurrenceArg});\n }`;\n }\n\n /**\n * Generate interface method signature\n */\n private generateInterfaceMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const inputs = func.inputs().map((input: any) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n const docs = formatJSDocComment(func.doc().toString(), 2);\n const params = this.formatMethodParameters(inputs);\n\n return `${docs} ${name}(${params}): Promise<AssembledTransaction<${outputType}>>;`;\n }\n\n private generateFromJSONMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n\n return ` ${name} : this.txFromJSON<${outputType}>`;\n }\n /**\n * Generate deploy method\n */\n private generateDeployMethod(\n constructorFunc: xdr.ScSpecFunctionV0 | undefined,\n ): string {\n // If no constructor, generate deploy with no params\n if (!constructorFunc) {\n const params = this.formatConstructorParameters([]);\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(null, options);\n }`;\n }\n const inputs = constructorFunc.inputs().map((input) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n\n const params = this.formatConstructorParameters(inputs);\n const inputsDestructure =\n inputs.length > 0 ? `{ ${inputs.map((i) => i.name).join(\", \")} }, ` : \"\";\n\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(${inputsDestructure}options);\n }`;\n }\n\n /**\n * Format method parameters\n */\n private formatMethodParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\"options?: MethodOptions\");\n\n return params.join(\", \");\n }\n\n /**\n * Format constructor parameters\n */\n private formatConstructorParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\n 'options: MethodOptions & Omit<ContractClientOptions, \\'contractId\\'> & { wasmHash: Buffer | string; salt?: Buffer | Uint8Array; format?: \"hex\" | \"base64\"; address?: string; }',\n );\n\n return params.join(\", \");\n }\n}\n"],"names":["xdr","params"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAeO,MAAM,eAAA,CAAgB;AAAA,EACnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAA,GAAqD,IAAA;AAAA,EAE7D,YAAY,IAAA,EAAY;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AAEjB,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,eAAe,CAAA;AACzD,MAAA,YAAA,GAAe,IAAA,CAAK,qBAAqB,eAAe,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AAEN,MAAA,YAAA,GAAe,IAAA,CAAK,qBAAqB,MAAS,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,IAAA,CAC3B,KAAA,EAAM,CACN,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,CAAE,QAAA,OAAe,eAAe,CAAA,CAC3D,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,wBAAwB,IAAI,CAAC,CAAA,CAChD,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AAErC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA;AAAA,MACpC,CAAC,KAAA,KAAU,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,KACtC;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CACnB,KAAA,EAAM,CACN,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,CAAE,QAAA,OAAe,eAAe,CAAA,CAC3D,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,uBAAuB,IAAI,CAAC,CAAA,CAC/C,IAAA,CAAK,GAAG,CAAA;AAEX,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO;AAChC,IAAA,MAAM,oBAAA,GAAuB,KAAK,oBAAA,EAAqB;AACvD,IAAA,MAAM,YAAA,GACJ,MAAA,CAAO,MAAA,GAAS,CAAA,GACZ;AAAA,EAAK,IAAA,CAAK,wBAAA,CAAyB,oBAAoB,CAAC;AAAA,EAAK,MAAA,CAC1D,GAAA;AAAA,MAAI,CAAC,KAAA,EAAO,UAAA,KACX,IAAA,CAAK,yBAAA,CAA0B,OAAO,UAAU;AAAA,KAClD,CACC,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACb,EAAA;AAEN,IAAA,OAAO,GAAG,OAAO;;AAAA;AAAA,EAGnB,gBAAgB;AAAA;;AAAA;AAAA;AAAA;AAAA,gBAAA,EAMA,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA;;AAAA,CAAA,EAKrC,YAAY;AAAA;AAAA,EAAA,EAEX,QAAQ;AAAA;AAAA,EAEV,YAAY;AAAA,CAAA,CAAA;AAAA,EAEZ;AAAA,EAEQ,eAAA,GAA0B;AAChC,IAAA,MAAM,OAAA,GAAU,mBAAA;AAAA,MACd,KAAK,IAAA,CAAK,KAAA,EAAM,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AAClC,QAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO;AAC3B,QAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAC7B,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC/D,QAAA,OAAO,IAAA;AAAA,MACT,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO;AAChC,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAErB,MAAA,OAAA,CAAQ,eAAA,CAAgB,IAAI,eAAe,CAAA;AAE3C,MAAA,OAAA,CAAQ,cAAA,CAAe,IAAI,KAAK,CAAA;AAGhC,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,QAAA,MAAM,WAAA,GAAc,KAAA,CACjB,MAAA,EAAO,CACP,MAAA;AAAA,UACC,CAAC,UACC,KAAA,CAAM,QAAA,GAAW,KAAA,KACjBA,KAAA,CAAI,0BAAA,CAA2B,iCAAA,EAAkC,CAC9D;AAAA,SACP;AACF,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC7B,UAAA,MAAM,SAAS,mBAAA,CAAoB,CAAC,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AACjD,UAAA,MAAA,CAAO,eAAA,CAAgB,QAAQ,CAAC,CAAA,KAAM,QAAQ,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAC,CAAA;AACpE,UAAA,MAAA,CAAO,sBAAA,CAAuB,OAAA;AAAA,YAAQ,CAAC,CAAA,KACrC,OAAA,CAAQ,sBAAA,CAAuB,IAAI,CAAC;AAAA,WACtC;AACA,UAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,CAAC,CAAA,KAAM,QAAQ,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAClE,UAAA,OAAA,CAAQ,iBAAA,GACN,OAAA,CAAQ,iBAAA,IAAqB,MAAA,CAAO,iBAAA;AAAA,QACxC,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,cAAc,OAAA,EAAS;AAAA,MAC5B,sBAAA,EAAwB,IAAA;AAAA;AAAA,MACxB,gCAAA,EAAkC;AAAA,QAChC,MAAA;AAAA,QACA,sBAAA;AAAA,QACA,0BAAA;AAAA,QACA,wCAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,UAAA,EAA4B;AAC3D,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA,EAAA,EAGP,UAAU,CAAA;AAAA;AAAA,GAAA,CAAA;AAAA,EAGZ;AAAA,EAEQ,oBAAA,GAA+B;AACrC,IAAA,MAAM,WAAW,IAAI,GAAA;AAAA,MACnB,IAAA,CAAK,KACF,KAAA,EAAM,CACN,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,CAAE,QAAA,OAAe,eAAe,CAAA,CAC3D,GAAA,CAAI,CAAC,IAAA,KAAS,kBAAA,CAAmB,KAAK,IAAA,EAAK,CAAE,QAAA,EAAU,CAAC;AAAA,KAC7D;AACA,IAAA,IAAI,SAAA,GAAY,YAAA;AAChB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,MAAA,SAAA,GAAY,aAAa,MAAM,CAAA,CAAA;AAC/B,MAAA,MAAA,IAAU,CAAA;AAAA,IACZ;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,6BAAA,GAAqD;AAC3D,IAAA,IAAI,IAAA,CAAK,2BAA2B,IAAA,EAAM;AACxC,MAAA,OAAO,IAAA,CAAK,sBAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,IAAA,IAAA,CAAK,IAAA,CACF,KAAA,EAAM,CACN,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,CAAE,UAAS,KAAM,eAAe,CAAA,CAC3D,OAAA,CAAQ,CAAC,IAAA,KAAS;AACjB,MAAA,QAAA,CAAS,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAK,CAAE,QAAA,EAAU,CAAC,CAAA;AAAA,IACzD,CAAC,CAAA;AAEH,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,IAAA,IAAA,CAAK,KAAK,MAAA,EAAO,CAAE,OAAA,CAAQ,CAAC,OAAO,UAAA,KAAe;AAChD,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,WAAA,CAAY,kBAAA,CAAmB,KAAA,CAAM,MAAK,CAAE,QAAA,EAAU,CAAC,CAAC,CAAA,WAAA,CAAA;AAE7E,MAAA,IAAI,SAAA,GAAY,SAAA;AAChB,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,QAAA,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,CAAA,CAAA;AACjC,QAAA,MAAA,IAAU,CAAA;AAAA,MACZ;AAEA,MAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AACtB,MAAA,QAAA,CAAS,GAAA,CAAI,YAAY,SAAS,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,sBAAA,GAAyB,QAAA;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,CACN,OACA,UAAA,EACQ;AACR,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,6BAAA,EAA8B,CAAE,IAAI,UAAU,CAAA;AAEpE,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,OAAO,CAAA,EAAG,YAAY,kBAAA,CAAmB,KAAA,CAAM,MAAK,CAAE,QAAA,EAAU,CAAC,CAAC,CAAA,WAAA,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,6BAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,IAAA,CACT,MAAA,EAAO,CACP,GAAA;AAAA,MAAI,CAAC,KAAA,EAAO,UAAA,KACX,IAAA,CAAK,qBAAA,CAAsB,OAAO,UAAU;AAAA,KAC9C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAA,CACN,OACA,UAAA,EACQ;AACR,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,QAAA,EAAS;AACtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,UAAU,CAAA;AAC/D,IAAA,MAAM,sBAAsB,CAAA,EAAG,WAAA,CAAY,kBAAA,CAAmB,OAAO,CAAC,CAAC,CAAA,WAAA,CAAA;AAGvE,IAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CACrB,QAAO,CACP,KAAA,CAAM,GAAG,UAAU,CAAA,CACnB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,GAAO,QAAA,EAAS,KAAM,OAAO,CAAA,CAAE,MAAA;AAClD,IAAA,MAAM,cAAA,GACJ,aAAa,CAAA,GACT,CAAA,0BAAA,EAA6B,aAAa,CAAC,CAAA,SAAA,EAAY,OAAO,CAAA,6BAAA,CAAA,GAC9D,EAAA;AACN,IAAA,MAAM,UAAA,GACJ,UAAA,KAAe,mBAAA,GACX,CAAA,qBAAA,EAAwB,mBAAmB,CAAA,mDAAA,CAAA,GAC3C,EAAA;AACN,IAAA,MAAM,WAAA,GAAc,KAAA,CACjB,MAAA,EAAO,CACP,MAAA;AAAA,MACC,CAAC,UACC,KAAA,CAAM,QAAA,GAAW,KAAA,KACjBA,KAAA,CAAI,0BAAA,CAA2B,iCAAA,EAAkC,CAC9D;AAAA,KACP;AAKF,IAAA,MAAM,MAAA,GAAS,WAAA,CACZ,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,EAAK,CAAE,QAAA,EAAS;AAC3C,MAAA,MAAM,SAAA,GAAY,6BAA6B,IAAA,CAAK,YAAY,IAC5D,YAAA,GACA,CAAA,CAAA,EAAI,mBAAA,CAAoB,YAAY,CAAC,CAAA,CAAA,CAAA;AACzC,MAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,CAAM,IAAA,IAAQ,IAAI,CAAA;AACzD,MAAA,OAAO,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,IACpC,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAA,MAAM,GAAA,GAAM,kBAAA;AAAA,MACV,CAAA,mCAAA,EAAsC,OAAO,CAAA,iHAAA,EAET,cAAc,GAAG,UAAU,CAAA,CAAA;AAAA,MAC/D;AAAA,KACF;AAEA,IAAA,MAAM,WAAA,GAAc,oBAAoB,OAAO,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,GAAI,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,GAAK,EAAA;AAE3D,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,UAAU,CAAA;AAAA,uCAAA,EACO,WAAW,CAAA,CAAA,EAAI,UAAA,GAAa,IAAI,CAAA,WAAA,EAAc,aAAa,KAAK,EAAE,CAAA;AAAA,GAAA,CAAA;AAAA,IAEvG;AAEA,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,UAAU,oBAAoB,MAAM,CAAA;AAAA,uCAAA,EACjB,WAAW,iBAAiB,aAAa,CAAA;AAAA,GAAA,CAAA;AAAA,EAEhF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,IAAA,EAAoC;AAClE,IAAA,MAAM,OAAO,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAK,CAAE,UAAU,CAAA;AACtD,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,KAAA,MAAgB;AAAA,MAChD,MAAM,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAK,CAAE,UAAU,CAAA;AAAA,MAChD,IAAA,EAAM,oBAAA,CAAqB,KAAA,CAAM,IAAA,IAAQ,IAAI;AAAA,KAC/C,CAAE,CAAA;AACF,IAAA,MAAM,UAAA,GACJ,IAAA,CAAK,OAAA,EAAQ,CAAE,MAAA,GAAS,CAAA,GACpB,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAQ,CAAE,CAAC,CAAC,CAAA,GACtC,MAAA;AACN,IAAA,MAAM,OAAO,kBAAA,CAAmB,IAAA,CAAK,KAAI,CAAE,QAAA,IAAY,CAAC,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,MAAM,CAAA;AAEjD,IAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,MAAM,mCAAmC,UAAU,CAAA,GAAA,CAAA;AAAA,EAChF;AAAA,EAEQ,uBAAuB,IAAA,EAAoC;AACjE,IAAA,MAAM,OAAO,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAK,CAAE,UAAU,CAAA;AACtD,IAAA,MAAM,UAAA,GACJ,IAAA,CAAK,OAAA,EAAQ,CAAE,MAAA,GAAS,CAAA,GACpB,oBAAA,CAAqB,IAAA,CAAK,OAAA,EAAQ,CAAE,CAAC,CAAC,CAAA,GACtC,MAAA;AAEN,IAAA,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAA,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAIQ,qBACN,eAAA,EACQ;AAER,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAMC,OAAAA,GAAS,IAAA,CAAK,2BAAA,CAA4B,EAAE,CAAA;AAClD,MAAA,OAAO,+BAA+BA,OAAM,CAAA;AAAA;AAAA,GAAA,CAAA;AAAA,IAG9C;AACA,IAAA,MAAM,SAAS,eAAA,CAAgB,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACtD,MAAM,kBAAA,CAAmB,KAAA,CAAM,IAAA,EAAK,CAAE,UAAU,CAAA;AAAA,MAChD,IAAA,EAAM,oBAAA,CAAqB,KAAA,CAAM,IAAA,IAAQ,IAAI;AAAA,KAC/C,CAAE,CAAA;AAEF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,2BAAA,CAA4B,MAAM,CAAA;AACtD,IAAA,MAAM,iBAAA,GACJ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,IAAA,CAAA,GAAS,EAAA;AAExE,IAAA,OAAO,+BAA+B,MAAM,CAAA;AAAA,iCAAA,EACb,iBAAiB,CAAA;AAAA,GAAA,CAAA;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,MAAA,EACQ;AACR,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,cAAc,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAC7E,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,IAAA,EAAO,WAAW,CAAA;AAAA,OAC7D;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,yBAAyB,CAAA;AAErC,IAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,4BACN,MAAA,EACQ;AACR,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,cAAc,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAC7E,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,IAAA,EAAO,WAAW,CAAA;AAAA,OAC7D;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,4KAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACzB;AACF;;;;"}
|
|
@@ -10,6 +10,28 @@ export type GenerateOptions = {
|
|
|
10
10
|
*/
|
|
11
11
|
contractName: string;
|
|
12
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* A note about an event whose generated names need the user's attention:
|
|
15
|
+
* either the contract declares the same event name more than once, or the
|
|
16
|
+
* generated names were renamed away from their preferred form to avoid a
|
|
17
|
+
* collision with another generated name.
|
|
18
|
+
*/
|
|
19
|
+
export type EventDiagnostic = {
|
|
20
|
+
/** The event name exactly as declared in the contract spec */
|
|
21
|
+
rawName: string;
|
|
22
|
+
/** 0-based index of this declaration among same-named events */
|
|
23
|
+
occurrence: number;
|
|
24
|
+
/** Total number of declarations of this raw name in the spec */
|
|
25
|
+
declarations: number;
|
|
26
|
+
/** The exported interface name generated in types.ts */
|
|
27
|
+
interfaceName: string;
|
|
28
|
+
/** The filter method name generated on the Client class */
|
|
29
|
+
filterMethodName: string;
|
|
30
|
+
/** True if the interface name differs from its preferred form */
|
|
31
|
+
interfaceRenamed: boolean;
|
|
32
|
+
/** True if the filter method name differs from its preferred form */
|
|
33
|
+
filterMethodRenamed: boolean;
|
|
34
|
+
};
|
|
13
35
|
/**
|
|
14
36
|
* The output of the binding generation process.
|
|
15
37
|
*
|
|
@@ -31,6 +53,11 @@ export type GeneratedBindings = {
|
|
|
31
53
|
readme: string;
|
|
32
54
|
/** The .gitignore file for the generated package */
|
|
33
55
|
gitignore: string;
|
|
56
|
+
/**
|
|
57
|
+
* Notes about events whose generated names need attention (duplicate
|
|
58
|
+
* declarations or collision-driven renames); empty when there are none
|
|
59
|
+
*/
|
|
60
|
+
diagnostics: EventDiagnostic[];
|
|
34
61
|
};
|
|
35
62
|
/**
|
|
36
63
|
* Generates TypeScript bindings for Stellar smart contracts.
|
|
@@ -182,6 +209,13 @@ export declare class BindingGenerator {
|
|
|
182
209
|
* ```
|
|
183
210
|
*/
|
|
184
211
|
generate(options: GenerateOptions): GeneratedBindings;
|
|
212
|
+
/**
|
|
213
|
+
* Collect an {@link EventDiagnostic} for every event that a user should
|
|
214
|
+
* review in the generated output: duplicate declarations of the same raw
|
|
215
|
+
* name, and generated names renamed away from their preferred form to
|
|
216
|
+
* avoid a collision.
|
|
217
|
+
*/
|
|
218
|
+
private eventDiagnostics;
|
|
185
219
|
/**
|
|
186
220
|
* Validates that required generation options are provided.
|
|
187
221
|
*
|
|
@@ -1,25 +1,12 @@
|
|
|
1
1
|
import 'buffer';
|
|
2
|
-
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/int.js';
|
|
3
|
-
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/hyper.js';
|
|
4
|
-
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-int.js';
|
|
5
|
-
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-hyper.js';
|
|
6
|
-
import '../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/xdr-type.js';
|
|
7
2
|
import '../base/generated/curr_generated.js';
|
|
8
|
-
import '@noble/hashes/sha2.js';
|
|
9
|
-
import '../base/signing.js';
|
|
10
3
|
import '../base/keypair.js';
|
|
11
4
|
import 'base32.js';
|
|
12
|
-
import '
|
|
13
|
-
import '../base/util/bignumber.js';
|
|
14
|
-
import '../base/transaction_builder.js';
|
|
15
|
-
import '../base/muxed_account.js';
|
|
5
|
+
import '@noble/hashes/sha2.js';
|
|
16
6
|
import '../base/scval.js';
|
|
17
|
-
import '../base/numbers/uint128.js';
|
|
18
|
-
import '../base/numbers/uint256.js';
|
|
19
|
-
import '../base/numbers/int128.js';
|
|
20
|
-
import '../base/numbers/int256.js';
|
|
21
7
|
import '../rpc/api.js';
|
|
22
8
|
import { Spec } from '../contract/spec.js';
|
|
9
|
+
import { sanitizeIdentifier, toPascalCase, toCamelCase } from './utils.js';
|
|
23
10
|
import { ConfigGenerator } from './config.js';
|
|
24
11
|
import { TypeGenerator } from './types.js';
|
|
25
12
|
import { ClientGenerator } from './client.js';
|
|
@@ -168,6 +155,7 @@ class BindingGenerator {
|
|
|
168
155
|
const clientGenerator = new ClientGenerator(this.spec);
|
|
169
156
|
const types = typeGenerator.generate();
|
|
170
157
|
const client = clientGenerator.generate();
|
|
158
|
+
const diagnostics = this.eventDiagnostics(typeGenerator, clientGenerator);
|
|
171
159
|
let index = `export { Client } from "./client.js";`;
|
|
172
160
|
if (types.trim() !== "") {
|
|
173
161
|
index = index.concat(`
|
|
@@ -182,9 +170,50 @@ export * from "./types.js";`);
|
|
|
182
170
|
packageJson,
|
|
183
171
|
tsConfig,
|
|
184
172
|
readme,
|
|
185
|
-
gitignore
|
|
173
|
+
gitignore,
|
|
174
|
+
diagnostics
|
|
186
175
|
};
|
|
187
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Collect an {@link EventDiagnostic} for every event that a user should
|
|
179
|
+
* review in the generated output: duplicate declarations of the same raw
|
|
180
|
+
* name, and generated names renamed away from their preferred form to
|
|
181
|
+
* avoid a collision.
|
|
182
|
+
*/
|
|
183
|
+
eventDiagnostics(typeGenerator, clientGenerator) {
|
|
184
|
+
const events = this.spec.events();
|
|
185
|
+
const interfaceNames = typeGenerator.eventInterfaceNamesInOrder();
|
|
186
|
+
const filterMethodNames = clientGenerator.eventFilterMethodNamesInOrder();
|
|
187
|
+
const declarationCounts = /* @__PURE__ */ new Map();
|
|
188
|
+
events.forEach((event) => {
|
|
189
|
+
const rawName = event.name().toString();
|
|
190
|
+
declarationCounts.set(rawName, (declarationCounts.get(rawName) ?? 0) + 1);
|
|
191
|
+
});
|
|
192
|
+
const occurrenceSoFar = /* @__PURE__ */ new Map();
|
|
193
|
+
return events.flatMap((event, eventIndex) => {
|
|
194
|
+
const rawName = event.name().toString();
|
|
195
|
+
const occurrence = occurrenceSoFar.get(rawName) ?? 0;
|
|
196
|
+
occurrenceSoFar.set(rawName, occurrence + 1);
|
|
197
|
+
const declarations = declarationCounts.get(rawName);
|
|
198
|
+
const sanitized = sanitizeIdentifier(rawName);
|
|
199
|
+
const interfaceRenamed = interfaceNames[eventIndex] !== `${toPascalCase(sanitized)}Event`;
|
|
200
|
+
const filterMethodRenamed = filterMethodNames[eventIndex] !== `${toCamelCase(sanitized)}EventFilter`;
|
|
201
|
+
if (declarations <= 1 && !interfaceRenamed && !filterMethodRenamed) {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
return [
|
|
205
|
+
{
|
|
206
|
+
rawName,
|
|
207
|
+
occurrence,
|
|
208
|
+
declarations,
|
|
209
|
+
interfaceName: interfaceNames[eventIndex],
|
|
210
|
+
filterMethodName: filterMethodNames[eventIndex],
|
|
211
|
+
interfaceRenamed,
|
|
212
|
+
filterMethodRenamed
|
|
213
|
+
}
|
|
214
|
+
];
|
|
215
|
+
});
|
|
216
|
+
}
|
|
188
217
|
/**
|
|
189
218
|
* Validates that required generation options are provided.
|
|
190
219
|
*
|