@latticexyz/common 2.2.18-90aac1d4acce19ac592d47a090732dd11c1c3e7a → 2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2
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/dist/actions.cjs +334 -0
- package/dist/actions.cjs.map +1 -0
- package/dist/actions.d.cts +27 -0
- package/dist/actions.js +39 -1
- package/dist/actions.js.map +1 -1
- package/dist/chains.cjs +106 -0
- package/dist/chains.cjs.map +1 -0
- package/dist/chains.d.cts +968 -0
- package/dist/chains.js +75 -1
- package/dist/chains.js.map +1 -1
- package/dist/chunk-D4GDXAMP.js +64 -0
- package/dist/{chunk-ZIUX7JCQ.js.map → chunk-D4GDXAMP.js.map} +1 -1
- package/dist/chunk-IYZZFDNO.js +16 -0
- package/dist/{chunk-ZV2KGJCD.js.map → chunk-IYZZFDNO.js.map} +1 -1
- package/dist/chunk-MF5NFUW7.js +12 -0
- package/dist/{chunk-QQCZY3XJ.js.map → chunk-MF5NFUW7.js.map} +1 -1
- package/dist/chunk-MK6UECU7.js +11 -0
- package/dist/{chunk-TCWGPC6G.js.map → chunk-MK6UECU7.js.map} +1 -1
- package/dist/chunk-MYWRXQQH.js +208 -0
- package/dist/{chunk-6FIKI2CG.js.map → chunk-MYWRXQQH.js.map} +1 -1
- package/dist/chunk-Z6SVAIZN.js +70 -0
- package/dist/{chunk-DPUUE7NM.js.map → chunk-Z6SVAIZN.js.map} +1 -1
- package/dist/codegen.cjs +889 -0
- package/dist/codegen.cjs.map +1 -0
- package/dist/codegen.d.cts +228 -0
- package/dist/codegen.js +706 -49
- package/dist/codegen.js.map +1 -1
- package/dist/errors.cjs +38 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +5 -0
- package/dist/errors.js +6 -1
- package/dist/foundry.cjs +105 -0
- package/dist/foundry.cjs.map +1 -0
- package/dist/foundry.d.cts +69 -0
- package/dist/foundry.js +71 -2
- package/dist/foundry.js.map +1 -1
- package/dist/getContract-CA0EdVg6.d.cts +20 -0
- package/dist/index.cjs +597 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +160 -0
- package/dist/index.js +233 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +459 -0
- package/dist/internal.cjs.map +1 -0
- package/dist/internal.d.cts +36 -0
- package/dist/internal.js +205 -9
- package/dist/internal.js.map +1 -1
- package/dist/kms.cjs +204 -0
- package/dist/kms.cjs.map +1 -0
- package/dist/kms.d.cts +18 -0
- package/dist/kms.js +168 -1
- package/dist/kms.js.map +1 -1
- package/dist/type-utils.cjs +19 -0
- package/dist/type-utils.cjs.map +1 -0
- package/dist/type-utils.d.cts +19 -0
- package/dist/utils.cjs +174 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +40 -0
- package/dist/utils.js +122 -1
- package/dist/utils.js.map +1 -1
- package/package.json +104 -16
- package/dist/chunk-6FIKI2CG.js +0 -2
- package/dist/chunk-DPUUE7NM.js +0 -2
- package/dist/chunk-QQCZY3XJ.js +0 -2
- package/dist/chunk-TCWGPC6G.js +0 -2
- package/dist/chunk-ZIUX7JCQ.js +0 -2
- package/dist/chunk-ZV2KGJCD.js +0 -2
package/dist/kms.js
CHANGED
|
@@ -1,2 +1,169 @@
|
|
|
1
|
-
|
|
1
|
+
// src/account/kms/kmsKeyToAccount.ts
|
|
2
|
+
import { KMSClient as KMSClient3 } from "@aws-sdk/client-kms";
|
|
3
|
+
import { hashMessage, hashTypedData, keccak256, serializeTransaction, signatureToHex as signatureToHex2 } from "viem";
|
|
4
|
+
import { toAccount } from "viem/accounts";
|
|
5
|
+
|
|
6
|
+
// src/account/kms/signWithKms.ts
|
|
7
|
+
import { isAddressEqual, signatureToHex, toHex } from "viem";
|
|
8
|
+
import { recoverAddress } from "viem/utils";
|
|
9
|
+
|
|
10
|
+
// src/account/kms/sign.ts
|
|
11
|
+
import { SignCommand } from "@aws-sdk/client-kms";
|
|
12
|
+
import { fromHex } from "viem";
|
|
13
|
+
async function sign({
|
|
14
|
+
keyId,
|
|
15
|
+
hash,
|
|
16
|
+
client
|
|
17
|
+
}) {
|
|
18
|
+
const formatted = Buffer.from(fromHex(hash, "bytes"));
|
|
19
|
+
const command = new SignCommand({
|
|
20
|
+
KeyId: keyId,
|
|
21
|
+
Message: formatted,
|
|
22
|
+
SigningAlgorithm: "ECDSA_SHA_256",
|
|
23
|
+
MessageType: "DIGEST"
|
|
24
|
+
});
|
|
25
|
+
return client.send(command);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/account/kms/signWithKms.ts
|
|
29
|
+
import asn1 from "asn1.js";
|
|
30
|
+
var EcdsaSigAsnParse = asn1.define("EcdsaSig", function() {
|
|
31
|
+
this.seq().obj(this.key("r").int(), this.key("s").int());
|
|
32
|
+
});
|
|
33
|
+
async function getRS(signParams) {
|
|
34
|
+
const signature = await sign(signParams);
|
|
35
|
+
if (signature.Signature === void 0) {
|
|
36
|
+
throw new Error("Signature is undefined.");
|
|
37
|
+
}
|
|
38
|
+
const decoded = EcdsaSigAsnParse.decode(Buffer.from(signature.Signature), "der");
|
|
39
|
+
const r = BigInt(decoded.r);
|
|
40
|
+
let s = BigInt(decoded.s);
|
|
41
|
+
const secp256k1N = BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141");
|
|
42
|
+
const secp256k1halfN = secp256k1N / 2n;
|
|
43
|
+
if (s > secp256k1halfN) {
|
|
44
|
+
s = secp256k1N - s;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
r: toHex(r),
|
|
48
|
+
s: toHex(s)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function getRecovery(hash, r, s, expectedAddress) {
|
|
52
|
+
let recovery;
|
|
53
|
+
for (recovery = 0; recovery <= 1; recovery++) {
|
|
54
|
+
const signature = signatureToHex({
|
|
55
|
+
r,
|
|
56
|
+
s,
|
|
57
|
+
v: recovery ? 28n : 27n,
|
|
58
|
+
yParity: recovery
|
|
59
|
+
});
|
|
60
|
+
const address = await recoverAddress({ hash, signature });
|
|
61
|
+
if (isAddressEqual(address, expectedAddress)) {
|
|
62
|
+
return recovery;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
throw new Error("Failed to calculate recovery param");
|
|
66
|
+
}
|
|
67
|
+
async function signWithKms({ hash, address, keyId, client }) {
|
|
68
|
+
const { r, s } = await getRS({ keyId, hash, client });
|
|
69
|
+
const recovery = await getRecovery(hash, r, s, address);
|
|
70
|
+
return {
|
|
71
|
+
r,
|
|
72
|
+
s,
|
|
73
|
+
v: recovery ? 28n : 27n,
|
|
74
|
+
yParity: recovery
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// src/account/kms/getAddressFromKms.ts
|
|
79
|
+
import { toHex as toHex2 } from "viem";
|
|
80
|
+
import { publicKeyToAddress } from "viem/utils";
|
|
81
|
+
|
|
82
|
+
// src/account/kms/getPublicKey.ts
|
|
83
|
+
import {
|
|
84
|
+
GetPublicKeyCommand
|
|
85
|
+
} from "@aws-sdk/client-kms";
|
|
86
|
+
function getPublicKey({
|
|
87
|
+
keyId,
|
|
88
|
+
client
|
|
89
|
+
}) {
|
|
90
|
+
const command = new GetPublicKeyCommand({ KeyId: keyId });
|
|
91
|
+
return client.send(command);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/account/kms/getAddressFromKms.ts
|
|
95
|
+
import asn12 from "asn1.js";
|
|
96
|
+
var EcdsaPubKey = asn12.define("EcdsaPubKey", function() {
|
|
97
|
+
this.seq().obj(this.key("algo").seq().obj(this.key("a").objid(), this.key("b").objid()), this.key("pubKey").bitstr());
|
|
98
|
+
});
|
|
99
|
+
function publicKeyKmsToAddress(publicKey) {
|
|
100
|
+
const res = EcdsaPubKey.decode(Buffer.from(publicKey));
|
|
101
|
+
const publicKeyBuffer = res.pubKey.data;
|
|
102
|
+
const publicKeyHex = toHex2(publicKeyBuffer);
|
|
103
|
+
const address = publicKeyToAddress(publicKeyHex);
|
|
104
|
+
return address;
|
|
105
|
+
}
|
|
106
|
+
async function getAddressFromKms({
|
|
107
|
+
keyId,
|
|
108
|
+
client
|
|
109
|
+
}) {
|
|
110
|
+
const KMSKey = await getPublicKey({ keyId, client });
|
|
111
|
+
return publicKeyKmsToAddress(KMSKey.PublicKey);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/account/kms/kmsKeyToAccount.ts
|
|
115
|
+
async function kmsKeyToAccount({
|
|
116
|
+
keyId,
|
|
117
|
+
client = new KMSClient3()
|
|
118
|
+
}) {
|
|
119
|
+
const address = await getAddressFromKms({ keyId, client });
|
|
120
|
+
const account = toAccount({
|
|
121
|
+
address,
|
|
122
|
+
async signMessage({ message }) {
|
|
123
|
+
const signature = await signWithKms({
|
|
124
|
+
client,
|
|
125
|
+
keyId,
|
|
126
|
+
hash: hashMessage(message),
|
|
127
|
+
address
|
|
128
|
+
});
|
|
129
|
+
return signatureToHex2(signature);
|
|
130
|
+
},
|
|
131
|
+
// The logic of this function should be align with viem's signTransaction
|
|
132
|
+
// https://github.com/wevm/viem/blob/main/src/accounts/utils/signTransaction.ts
|
|
133
|
+
async signTransaction(transaction, { serializer = serializeTransaction } = {}) {
|
|
134
|
+
const signableTransaction = (() => {
|
|
135
|
+
if (transaction.type === "eip4844")
|
|
136
|
+
return {
|
|
137
|
+
...transaction,
|
|
138
|
+
sidecars: false
|
|
139
|
+
};
|
|
140
|
+
return transaction;
|
|
141
|
+
})();
|
|
142
|
+
const signature = await signWithKms({
|
|
143
|
+
client,
|
|
144
|
+
keyId,
|
|
145
|
+
hash: keccak256(serializer(signableTransaction)),
|
|
146
|
+
address
|
|
147
|
+
});
|
|
148
|
+
return serializer(transaction, signature);
|
|
149
|
+
},
|
|
150
|
+
async signTypedData(typedData) {
|
|
151
|
+
const signature = await signWithKms({
|
|
152
|
+
client,
|
|
153
|
+
keyId,
|
|
154
|
+
hash: hashTypedData(typedData),
|
|
155
|
+
address
|
|
156
|
+
});
|
|
157
|
+
return signatureToHex2(signature);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
...account,
|
|
162
|
+
source: "aws-kms",
|
|
163
|
+
getKeyId: () => keyId
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
kmsKeyToAccount
|
|
168
|
+
};
|
|
2
169
|
//# sourceMappingURL=kms.js.map
|
package/dist/kms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/account/kms/kmsKeyToAccount.ts","../src/account/kms/signWithKms.ts","../src/account/kms/sign.ts","../src/account/kms/getAddressFromKms.ts","../src/account/kms/getPublicKey.ts"],"sourcesContent":["import { KMSClient } from \"@aws-sdk/client-kms\";\nimport { LocalAccount, hashMessage, hashTypedData, keccak256, serializeTransaction, signatureToHex } from \"viem\";\nimport { toAccount } from \"viem/accounts\";\nimport { signWithKms } from \"./signWithKms\";\nimport { getAddressFromKms } from \"./getAddressFromKms\";\n\nexport type KmsKeyToAccountOptions = {\n keyId: string;\n client?: KMSClient;\n};\n\nexport type KmsAccount = LocalAccount<\"aws-kms\"> & {\n getKeyId(): string;\n};\n\n/**\n * @description Creates an Account from a KMS key.\n *\n * @returns A Local Account.\n */\nexport async function kmsKeyToAccount({\n keyId,\n client = new KMSClient(),\n}: KmsKeyToAccountOptions): Promise<KmsAccount> {\n const address = await getAddressFromKms({ keyId, client });\n\n const account = toAccount({\n address,\n async signMessage({ message }) {\n const signature = await signWithKms({\n client,\n keyId,\n hash: hashMessage(message),\n address,\n });\n\n return signatureToHex(signature);\n },\n // The logic of this function should be align with viem's signTransaction\n // https://github.com/wevm/viem/blob/main/src/accounts/utils/signTransaction.ts\n async signTransaction(transaction, { serializer = serializeTransaction } = {}) {\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n const signableTransaction = (() => {\n // For EIP-4844 Transactions, we want to sign the transaction payload body (tx_payload_body) without the sidecars (ie. without the network wrapper).\n // See: https://github.com/ethereum/EIPs/blob/e00f4daa66bd56e2dbd5f1d36d09fd613811a48b/EIPS/eip-4844.md#networking\n if (transaction.type === \"eip4844\")\n return {\n ...transaction,\n sidecars: false,\n };\n return transaction;\n })();\n\n const signature = await signWithKms({\n client,\n keyId,\n hash: keccak256(serializer(signableTransaction)),\n address,\n });\n\n return serializer(transaction, signature);\n },\n async signTypedData(typedData) {\n const signature = await signWithKms({\n client,\n keyId,\n hash: hashTypedData(typedData),\n address,\n });\n\n return signatureToHex(signature);\n },\n });\n\n return {\n ...account,\n source: \"aws-kms\",\n getKeyId: () => keyId,\n };\n}\n","import { Hex, Signature, isAddressEqual, signatureToHex, toHex } from \"viem\";\nimport { recoverAddress } from \"viem/utils\";\nimport { KMSClient, SignCommandInput } from \"@aws-sdk/client-kms\";\nimport { sign } from \"./sign\";\n// @ts-expect-error Could not find a declaration file for module 'asn1.js'.\nimport asn1 from \"asn1.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst EcdsaSigAsnParse = asn1.define(\"EcdsaSig\", function (this: any) {\n this.seq().obj(this.key(\"r\").int(), this.key(\"s\").int());\n});\n\nasync function getRS(signParams: {\n hash: Hex;\n keyId: SignCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<{ r: Hex; s: Hex }> {\n const signature = await sign(signParams);\n\n if (signature.Signature === undefined) {\n throw new Error(\"Signature is undefined.\");\n }\n\n const decoded = EcdsaSigAsnParse.decode(Buffer.from(signature.Signature), \"der\");\n\n const r = BigInt(decoded.r);\n let s = BigInt(decoded.s);\n\n const secp256k1N = BigInt(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\n const secp256k1halfN = secp256k1N / 2n;\n\n if (s > secp256k1halfN) {\n s = secp256k1N - s;\n }\n\n return {\n r: toHex(r),\n s: toHex(s),\n };\n}\n\nasync function getRecovery(hash: Hex, r: Hex, s: Hex, expectedAddress: Hex): Promise<number> {\n let recovery: number;\n for (recovery = 0; recovery <= 1; recovery++) {\n const signature = signatureToHex({\n r,\n s,\n v: recovery ? 28n : 27n,\n yParity: recovery,\n });\n\n const address = await recoverAddress({ hash, signature });\n\n if (isAddressEqual(address, expectedAddress)) {\n return recovery;\n }\n }\n throw new Error(\"Failed to calculate recovery param\");\n}\n\ntype SignParameters = {\n hash: Hex;\n keyId: SignCommandInput[\"KeyId\"];\n client: KMSClient;\n address: Hex;\n};\n\ntype SignReturnType = Signature;\n\n/**\n * @description Signs a hash with a given KMS key.\n *\n * @param hash The hash to sign.\n *\n * @returns The signature.\n */\nexport async function signWithKms({ hash, address, keyId, client }: SignParameters): Promise<SignReturnType> {\n const { r, s } = await getRS({ keyId, hash, client });\n const recovery = await getRecovery(hash, r, s, address);\n\n return {\n r,\n s,\n v: recovery ? 28n : 27n,\n yParity: recovery,\n };\n}\n","import { KMSClient, SignCommand, SignCommandInput, SignCommandOutput } from \"@aws-sdk/client-kms\";\nimport { Hex, fromHex } from \"viem\";\n\nexport async function sign({\n keyId,\n hash,\n client,\n}: {\n hash: Hex;\n keyId: SignCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<SignCommandOutput> {\n const formatted = Buffer.from(fromHex(hash, \"bytes\"));\n\n const command = new SignCommand({\n KeyId: keyId,\n Message: formatted,\n SigningAlgorithm: \"ECDSA_SHA_256\",\n MessageType: \"DIGEST\",\n });\n\n return client.send(command);\n}\n","import { Address, toHex } from \"viem\";\nimport { publicKeyToAddress } from \"viem/utils\";\nimport { GetPublicKeyCommandInput, KMSClient } from \"@aws-sdk/client-kms\";\nimport { getPublicKey } from \"./getPublicKey\";\n// @ts-expect-error Could not find a declaration file for module 'asn1.js'.\nimport asn1 from \"asn1.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst EcdsaPubKey = asn1.define(\"EcdsaPubKey\", function (this: any) {\n this.seq().obj(this.key(\"algo\").seq().obj(this.key(\"a\").objid(), this.key(\"b\").objid()), this.key(\"pubKey\").bitstr());\n});\n\nfunction publicKeyKmsToAddress(publicKey: Uint8Array): Address {\n const res = EcdsaPubKey.decode(Buffer.from(publicKey));\n\n const publicKeyBuffer: Buffer = res.pubKey.data;\n\n const publicKeyHex = toHex(publicKeyBuffer);\n const address = publicKeyToAddress(publicKeyHex);\n\n return address;\n}\n\nexport async function getAddressFromKms({\n keyId,\n client,\n}: {\n keyId: GetPublicKeyCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<Address> {\n const KMSKey = await getPublicKey({ keyId, client });\n\n return publicKeyKmsToAddress(KMSKey.PublicKey as Uint8Array);\n}\n","import {\n GetPublicKeyCommand,\n GetPublicKeyCommandInput,\n GetPublicKeyCommandOutput,\n KMSClient,\n} from \"@aws-sdk/client-kms\";\n\nexport function getPublicKey({\n keyId,\n client,\n}: {\n keyId: GetPublicKeyCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<GetPublicKeyCommandOutput> {\n const command = new GetPublicKeyCommand({ KeyId: keyId });\n\n return client.send(command);\n}\n"],"mappings":"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","names":["KMSClient","hashMessage","hashTypedData","keccak256","serializeTransaction","signatureToHex","toAccount","isAddressEqual","signatureToHex","toHex","recoverAddress","SignCommand","fromHex","sign","keyId","hash","client","formatted","command","asn1","EcdsaSigAsnParse","getRS","signParams","signature","sign","decoded","r","s","secp256k1N","secp256k1halfN","toHex","getRecovery","hash","expectedAddress","recovery","signatureToHex","address","recoverAddress","isAddressEqual","signWithKms","keyId","client","toHex","publicKeyToAddress","GetPublicKeyCommand","getPublicKey","keyId","client","command","asn1","EcdsaPubKey","publicKeyKmsToAddress","publicKey","publicKeyBuffer","publicKeyHex","toHex","publicKeyToAddress","getAddressFromKms","keyId","client","KMSKey","getPublicKey","kmsKeyToAccount","keyId","client","KMSClient","address","getAddressFromKms","toAccount","message","signature","signWithKms","hashMessage","signatureToHex","transaction","serializer","serializeTransaction","signableTransaction","keccak256","typedData","hashTypedData"]}
|
|
1
|
+
{"version":3,"sources":["../src/account/kms/kmsKeyToAccount.ts","../src/account/kms/signWithKms.ts","../src/account/kms/sign.ts","../src/account/kms/getAddressFromKms.ts","../src/account/kms/getPublicKey.ts"],"sourcesContent":["import { KMSClient } from \"@aws-sdk/client-kms\";\nimport { LocalAccount, hashMessage, hashTypedData, keccak256, serializeTransaction, signatureToHex } from \"viem\";\nimport { toAccount } from \"viem/accounts\";\nimport { signWithKms } from \"./signWithKms\";\nimport { getAddressFromKms } from \"./getAddressFromKms\";\n\nexport type KmsKeyToAccountOptions = {\n keyId: string;\n client?: KMSClient;\n};\n\nexport type KmsAccount = LocalAccount<\"aws-kms\"> & {\n getKeyId(): string;\n};\n\n/**\n * @description Creates an Account from a KMS key.\n *\n * @returns A Local Account.\n */\nexport async function kmsKeyToAccount({\n keyId,\n client = new KMSClient(),\n}: KmsKeyToAccountOptions): Promise<KmsAccount> {\n const address = await getAddressFromKms({ keyId, client });\n\n const account = toAccount({\n address,\n async signMessage({ message }) {\n const signature = await signWithKms({\n client,\n keyId,\n hash: hashMessage(message),\n address,\n });\n\n return signatureToHex(signature);\n },\n // The logic of this function should be align with viem's signTransaction\n // https://github.com/wevm/viem/blob/main/src/accounts/utils/signTransaction.ts\n async signTransaction(transaction, { serializer = serializeTransaction } = {}) {\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n const signableTransaction = (() => {\n // For EIP-4844 Transactions, we want to sign the transaction payload body (tx_payload_body) without the sidecars (ie. without the network wrapper).\n // See: https://github.com/ethereum/EIPs/blob/e00f4daa66bd56e2dbd5f1d36d09fd613811a48b/EIPS/eip-4844.md#networking\n if (transaction.type === \"eip4844\")\n return {\n ...transaction,\n sidecars: false,\n };\n return transaction;\n })();\n\n const signature = await signWithKms({\n client,\n keyId,\n hash: keccak256(serializer(signableTransaction)),\n address,\n });\n\n return serializer(transaction, signature);\n },\n async signTypedData(typedData) {\n const signature = await signWithKms({\n client,\n keyId,\n hash: hashTypedData(typedData),\n address,\n });\n\n return signatureToHex(signature);\n },\n });\n\n return {\n ...account,\n source: \"aws-kms\",\n getKeyId: () => keyId,\n };\n}\n","import { Hex, Signature, isAddressEqual, signatureToHex, toHex } from \"viem\";\nimport { recoverAddress } from \"viem/utils\";\nimport { KMSClient, SignCommandInput } from \"@aws-sdk/client-kms\";\nimport { sign } from \"./sign\";\n// @ts-expect-error Could not find a declaration file for module 'asn1.js'.\nimport asn1 from \"asn1.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst EcdsaSigAsnParse = asn1.define(\"EcdsaSig\", function (this: any) {\n this.seq().obj(this.key(\"r\").int(), this.key(\"s\").int());\n});\n\nasync function getRS(signParams: {\n hash: Hex;\n keyId: SignCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<{ r: Hex; s: Hex }> {\n const signature = await sign(signParams);\n\n if (signature.Signature === undefined) {\n throw new Error(\"Signature is undefined.\");\n }\n\n const decoded = EcdsaSigAsnParse.decode(Buffer.from(signature.Signature), \"der\");\n\n const r = BigInt(decoded.r);\n let s = BigInt(decoded.s);\n\n const secp256k1N = BigInt(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\n const secp256k1halfN = secp256k1N / 2n;\n\n if (s > secp256k1halfN) {\n s = secp256k1N - s;\n }\n\n return {\n r: toHex(r),\n s: toHex(s),\n };\n}\n\nasync function getRecovery(hash: Hex, r: Hex, s: Hex, expectedAddress: Hex): Promise<number> {\n let recovery: number;\n for (recovery = 0; recovery <= 1; recovery++) {\n const signature = signatureToHex({\n r,\n s,\n v: recovery ? 28n : 27n,\n yParity: recovery,\n });\n\n const address = await recoverAddress({ hash, signature });\n\n if (isAddressEqual(address, expectedAddress)) {\n return recovery;\n }\n }\n throw new Error(\"Failed to calculate recovery param\");\n}\n\ntype SignParameters = {\n hash: Hex;\n keyId: SignCommandInput[\"KeyId\"];\n client: KMSClient;\n address: Hex;\n};\n\ntype SignReturnType = Signature;\n\n/**\n * @description Signs a hash with a given KMS key.\n *\n * @param hash The hash to sign.\n *\n * @returns The signature.\n */\nexport async function signWithKms({ hash, address, keyId, client }: SignParameters): Promise<SignReturnType> {\n const { r, s } = await getRS({ keyId, hash, client });\n const recovery = await getRecovery(hash, r, s, address);\n\n return {\n r,\n s,\n v: recovery ? 28n : 27n,\n yParity: recovery,\n };\n}\n","import { KMSClient, SignCommand, SignCommandInput, SignCommandOutput } from \"@aws-sdk/client-kms\";\nimport { Hex, fromHex } from \"viem\";\n\nexport async function sign({\n keyId,\n hash,\n client,\n}: {\n hash: Hex;\n keyId: SignCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<SignCommandOutput> {\n const formatted = Buffer.from(fromHex(hash, \"bytes\"));\n\n const command = new SignCommand({\n KeyId: keyId,\n Message: formatted,\n SigningAlgorithm: \"ECDSA_SHA_256\",\n MessageType: \"DIGEST\",\n });\n\n return client.send(command);\n}\n","import { Address, toHex } from \"viem\";\nimport { publicKeyToAddress } from \"viem/utils\";\nimport { GetPublicKeyCommandInput, KMSClient } from \"@aws-sdk/client-kms\";\nimport { getPublicKey } from \"./getPublicKey\";\n// @ts-expect-error Could not find a declaration file for module 'asn1.js'.\nimport asn1 from \"asn1.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst EcdsaPubKey = asn1.define(\"EcdsaPubKey\", function (this: any) {\n this.seq().obj(this.key(\"algo\").seq().obj(this.key(\"a\").objid(), this.key(\"b\").objid()), this.key(\"pubKey\").bitstr());\n});\n\nfunction publicKeyKmsToAddress(publicKey: Uint8Array): Address {\n const res = EcdsaPubKey.decode(Buffer.from(publicKey));\n\n const publicKeyBuffer: Buffer = res.pubKey.data;\n\n const publicKeyHex = toHex(publicKeyBuffer);\n const address = publicKeyToAddress(publicKeyHex);\n\n return address;\n}\n\nexport async function getAddressFromKms({\n keyId,\n client,\n}: {\n keyId: GetPublicKeyCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<Address> {\n const KMSKey = await getPublicKey({ keyId, client });\n\n return publicKeyKmsToAddress(KMSKey.PublicKey as Uint8Array);\n}\n","import {\n GetPublicKeyCommand,\n GetPublicKeyCommandInput,\n GetPublicKeyCommandOutput,\n KMSClient,\n} from \"@aws-sdk/client-kms\";\n\nexport function getPublicKey({\n keyId,\n client,\n}: {\n keyId: GetPublicKeyCommandInput[\"KeyId\"];\n client: KMSClient;\n}): Promise<GetPublicKeyCommandOutput> {\n const command = new GetPublicKeyCommand({ KeyId: keyId });\n\n return client.send(command);\n}\n"],"mappings":"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","names":["KMSClient","signatureToHex","toHex","asn1","toHex","KMSClient","signatureToHex"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/type-utils/index.ts
|
|
17
|
+
var type_utils_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(type_utils_exports);
|
|
19
|
+
//# sourceMappingURL=type-utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/type-utils/index.ts"],"sourcesContent":["export * from \"./abi\";\nexport * from \"./common\";\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AbiType, StaticArray } from '@latticexyz/schema-type/deprecated';
|
|
2
|
+
|
|
3
|
+
type RequireKeys<T extends Record<string, unknown>, P extends string> = T & Required<Pick<T, P>>;
|
|
4
|
+
type StringForUnion = string & Record<never, never>;
|
|
5
|
+
type AsDependent<T> = T extends infer P ? P : never;
|
|
6
|
+
type OrDefault<T, Default> = T extends undefined ? Default : T;
|
|
7
|
+
type OrDefaults<T extends object, Defaults> = {
|
|
8
|
+
[key in keyof Defaults]: key extends keyof T ? OrDefault<T[key], Defaults[key]> : Defaults[key];
|
|
9
|
+
};
|
|
10
|
+
type UnionOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : never;
|
|
11
|
+
type UnionKeys<T> = T extends any ? keyof T : never;
|
|
12
|
+
type UnionPick<T, K extends UnionKeys<T>> = T extends any ? Pick<T, Extract<K, keyof T>> : never;
|
|
13
|
+
type ReverseMap<T extends Record<any, any>> = {
|
|
14
|
+
[K in keyof T as T[K]]: K;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type ExtractUserTypes<UnknownTypes extends StringForUnion> = Exclude<UnknownTypes, AbiType | StaticArray>;
|
|
18
|
+
|
|
19
|
+
export type { AsDependent, ExtractUserTypes, OrDefault, OrDefaults, RequireKeys, ReverseMap, StringForUnion, UnionKeys, UnionOmit, UnionPick };
|
package/dist/utils.cjs
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils/index.ts
|
|
21
|
+
var utils_exports = {};
|
|
22
|
+
__export(utils_exports, {
|
|
23
|
+
assertExhaustive: () => assertExhaustive,
|
|
24
|
+
bigIntMax: () => bigIntMax,
|
|
25
|
+
bigIntMin: () => bigIntMin,
|
|
26
|
+
bigIntSort: () => bigIntSort,
|
|
27
|
+
chunk: () => chunk,
|
|
28
|
+
groupBy: () => groupBy,
|
|
29
|
+
identity: () => identity,
|
|
30
|
+
includes: () => includes,
|
|
31
|
+
indent: () => indent,
|
|
32
|
+
isDefined: () => isDefined,
|
|
33
|
+
isNotNull: () => isNotNull,
|
|
34
|
+
iteratorToArray: () => iteratorToArray,
|
|
35
|
+
mapObject: () => mapObject,
|
|
36
|
+
unique: () => unique,
|
|
37
|
+
uniqueBy: () => uniqueBy,
|
|
38
|
+
wait: () => wait,
|
|
39
|
+
waitForIdle: () => waitForIdle
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(utils_exports);
|
|
42
|
+
|
|
43
|
+
// src/utils/assertExhaustive.ts
|
|
44
|
+
function assertExhaustive(value, message) {
|
|
45
|
+
throw new Error(message ?? `Unexpected value: ${value}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/utils/bigIntMax.ts
|
|
49
|
+
function bigIntMax(...args) {
|
|
50
|
+
return args.reduce((m, e) => e > m ? e : m);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/utils/bigIntMin.ts
|
|
54
|
+
function bigIntMin(...args) {
|
|
55
|
+
return args.reduce((m, e) => e < m ? e : m);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// src/utils/bigIntSort.ts
|
|
59
|
+
function bigIntSort(a, b) {
|
|
60
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/utils/chunk.ts
|
|
64
|
+
function* chunk(arr, n) {
|
|
65
|
+
for (let i = 0; i < arr.length; i += n) {
|
|
66
|
+
yield arr.slice(i, i + n);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/utils/groupBy.ts
|
|
71
|
+
function groupBy(values, getKey) {
|
|
72
|
+
const map = /* @__PURE__ */ new Map();
|
|
73
|
+
for (const value of values) {
|
|
74
|
+
const key = getKey(value);
|
|
75
|
+
if (!map.has(key)) map.set(key, []);
|
|
76
|
+
map.get(key).push(value);
|
|
77
|
+
}
|
|
78
|
+
return map;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// src/utils/identity.ts
|
|
82
|
+
function identity(value) {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/utils/includes.ts
|
|
87
|
+
function includes(items, value) {
|
|
88
|
+
return items.includes(value);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// src/utils/indent.ts
|
|
92
|
+
function indent(message, indentation = " ") {
|
|
93
|
+
return message.replaceAll(/(^|\n)/g, `$1${indentation}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/utils/isDefined.ts
|
|
97
|
+
function isDefined(argument) {
|
|
98
|
+
return argument !== void 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// src/utils/isNotNull.ts
|
|
102
|
+
function isNotNull(argument) {
|
|
103
|
+
return argument !== null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// src/utils/iteratorToArray.ts
|
|
107
|
+
async function iteratorToArray(iterator) {
|
|
108
|
+
const items = [];
|
|
109
|
+
for await (const item of iterator) {
|
|
110
|
+
items.push(item);
|
|
111
|
+
}
|
|
112
|
+
return items;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/utils/mapObject.ts
|
|
116
|
+
function mapObject(source, valueMap) {
|
|
117
|
+
return Object.fromEntries(
|
|
118
|
+
Object.entries(source).map(([key, value]) => [key, valueMap(value, key)])
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/utils/unique.ts
|
|
123
|
+
function unique(values) {
|
|
124
|
+
return Array.from(new Set(values));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/utils/uniqueBy.ts
|
|
128
|
+
function uniqueBy(values, getKey) {
|
|
129
|
+
const map = /* @__PURE__ */ new Map();
|
|
130
|
+
for (const value of values) {
|
|
131
|
+
const key = getKey(value);
|
|
132
|
+
if (!map.has(key)) {
|
|
133
|
+
map.set(key, value);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return Array.from(map.values());
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/utils/wait.ts
|
|
140
|
+
function wait(ms) {
|
|
141
|
+
return new Promise((resolve) => setTimeout(() => resolve(), ms));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// src/utils/waitForIdle.ts
|
|
145
|
+
function waitForIdle() {
|
|
146
|
+
return new Promise((resolve) => {
|
|
147
|
+
if (typeof requestIdleCallback !== "undefined") {
|
|
148
|
+
requestIdleCallback(() => resolve());
|
|
149
|
+
} else {
|
|
150
|
+
setTimeout(() => resolve(), 1);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
155
|
+
0 && (module.exports = {
|
|
156
|
+
assertExhaustive,
|
|
157
|
+
bigIntMax,
|
|
158
|
+
bigIntMin,
|
|
159
|
+
bigIntSort,
|
|
160
|
+
chunk,
|
|
161
|
+
groupBy,
|
|
162
|
+
identity,
|
|
163
|
+
includes,
|
|
164
|
+
indent,
|
|
165
|
+
isDefined,
|
|
166
|
+
isNotNull,
|
|
167
|
+
iteratorToArray,
|
|
168
|
+
mapObject,
|
|
169
|
+
unique,
|
|
170
|
+
uniqueBy,
|
|
171
|
+
wait,
|
|
172
|
+
waitForIdle
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/index.ts","../src/utils/assertExhaustive.ts","../src/utils/bigIntMax.ts","../src/utils/bigIntMin.ts","../src/utils/bigIntSort.ts","../src/utils/chunk.ts","../src/utils/groupBy.ts","../src/utils/identity.ts","../src/utils/includes.ts","../src/utils/indent.ts","../src/utils/isDefined.ts","../src/utils/isNotNull.ts","../src/utils/iteratorToArray.ts","../src/utils/mapObject.ts","../src/utils/unique.ts","../src/utils/uniqueBy.ts","../src/utils/wait.ts","../src/utils/waitForIdle.ts"],"sourcesContent":["export * from \"./assertExhaustive\";\nexport * from \"./bigIntMax\";\nexport * from \"./bigIntMin\";\nexport * from \"./bigIntSort\";\nexport * from \"./chunk\";\nexport * from \"./groupBy\";\nexport * from \"./identity\";\nexport * from \"./includes\";\nexport * from \"./indent\";\nexport * from \"./isDefined\";\nexport * from \"./isNotNull\";\nexport * from \"./iteratorToArray\";\nexport * from \"./mapObject\";\nexport * from \"./unique\";\nexport * from \"./uniqueBy\";\nexport * from \"./wait\";\nexport * from \"./waitForIdle\";\n","export function assertExhaustive(value: never, message?: string): never {\n throw new Error(message ?? `Unexpected value: ${value}`);\n}\n","export function bigIntMax(...args: bigint[]): bigint {\n return args.reduce((m, e) => (e > m ? e : m));\n}\n","export function bigIntMin(...args: bigint[]): bigint {\n return args.reduce((m, e) => (e < m ? e : m));\n}\n","export function bigIntSort(a: bigint, b: bigint): -1 | 0 | 1 {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","export function* chunk<T>(arr: readonly T[], n: number): Generator<readonly T[], void> {\n for (let i = 0; i < arr.length; i += n) {\n yield arr.slice(i, i + n);\n }\n}\n","export function groupBy<value, key>(\n values: readonly value[],\n getKey: (value: value) => key,\n): Map<key, readonly value[]> {\n const map = new Map<key, readonly value[]>();\n for (const value of values) {\n const key = getKey(value);\n if (!map.has(key)) map.set(key, []);\n (map.get(key) as value[]).push(value);\n }\n return map;\n}\n","export function identity<T>(value: T): T {\n return value;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function includes<item>(items: item[], value: any): value is item {\n return items.includes(value);\n}\n","export function indent(message: string, indentation = \" \"): string {\n return message.replaceAll(/(^|\\n)/g, `$1${indentation}`);\n}\n","export function isDefined<T>(argument: T | undefined): argument is T {\n return argument !== undefined;\n}\n","export function isNotNull<T>(argument: T | null): argument is T {\n return argument !== null;\n}\n","export async function iteratorToArray<T>(iterator: AsyncIterable<T>): Promise<readonly T[]> {\n const items: T[] = [];\n for await (const item of iterator) {\n items.push(item);\n }\n return items;\n}\n","/**\n * Map each key of a source object via a given valueMap function\n */\nexport function mapObject<\n Source extends Record<string | number | symbol, unknown>,\n Target extends { [key in keyof Source]: unknown },\n>(source: Source, valueMap: (value: Source[typeof key], key: keyof Source) => Target[typeof key]): Target {\n return Object.fromEntries(\n Object.entries(source).map(([key, value]) => [key, valueMap(value as Source[keyof Source], key)]),\n ) as Target;\n}\n","export function unique<value>(values: readonly value[]): readonly value[] {\n return Array.from(new Set(values));\n}\n","export function uniqueBy<value, key>(values: readonly value[], getKey: (value: value) => key): readonly value[] {\n const map = new Map<key, value>();\n for (const value of values) {\n const key = getKey(value);\n if (!map.has(key)) {\n map.set(key, value);\n }\n }\n return Array.from(map.values());\n}\n","export function wait(ms: number): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n}\n","export function waitForIdle(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (typeof requestIdleCallback !== \"undefined\") {\n requestIdleCallback(() => resolve());\n } else {\n setTimeout(() => resolve(), 1);\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,iBAAiB,OAAc,SAAyB;AACtE,QAAM,IAAI,MAAM,WAAW,qBAAqB,KAAK,EAAE;AACzD;;;ACFO,SAAS,aAAa,MAAwB;AACnD,SAAO,KAAK,OAAO,CAAC,GAAG,MAAO,IAAI,IAAI,IAAI,CAAE;AAC9C;;;ACFO,SAAS,aAAa,MAAwB;AACnD,SAAO,KAAK,OAAO,CAAC,GAAG,MAAO,IAAI,IAAI,IAAI,CAAE;AAC9C;;;ACFO,SAAS,WAAW,GAAW,GAAuB;AAC3D,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;;;ACFO,UAAU,MAAS,KAAmB,GAA0C;AACrF,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,EAC1B;AACF;;;ACJO,SAAS,QACd,QACA,QAC4B;AAC5B,QAAM,MAAM,oBAAI,IAA2B;AAC3C,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,IAAI,IAAI,GAAG,EAAG,KAAI,IAAI,KAAK,CAAC,CAAC;AAClC,IAAC,IAAI,IAAI,GAAG,EAAc,KAAK,KAAK;AAAA,EACtC;AACA,SAAO;AACT;;;ACXO,SAAS,SAAY,OAAa;AACvC,SAAO;AACT;;;ACDO,SAAS,SAAe,OAAe,OAA2B;AACvE,SAAO,MAAM,SAAS,KAAK;AAC7B;;;ACHO,SAAS,OAAO,SAAiB,cAAc,MAAc;AAClE,SAAO,QAAQ,WAAW,WAAW,KAAK,WAAW,EAAE;AACzD;;;ACFO,SAAS,UAAa,UAAwC;AACnE,SAAO,aAAa;AACtB;;;ACFO,SAAS,UAAa,UAAmC;AAC9D,SAAO,aAAa;AACtB;;;ACFA,eAAsB,gBAAmB,UAAmD;AAC1F,QAAM,QAAa,CAAC;AACpB,mBAAiB,QAAQ,UAAU;AACjC,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AACT;;;ACHO,SAAS,UAGd,QAAgB,UAAwF;AACxG,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,SAAS,OAA+B,GAAG,CAAC,CAAC;AAAA,EAClG;AACF;;;ACVO,SAAS,OAAc,QAA4C;AACxE,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;AACnC;;;ACFO,SAAS,SAAqB,QAA0B,QAAiD;AAC9G,QAAM,MAAM,oBAAI,IAAgB;AAChC,aAAW,SAAS,QAAQ;AAC1B,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,IAAI,IAAI,GAAG,GAAG;AACjB,UAAI,IAAI,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AAChC;;;ACTO,SAAS,KAAK,IAA2B;AAC9C,SAAO,IAAI,QAAc,CAAC,YAAY,WAAW,MAAM,QAAQ,GAAG,EAAE,CAAC;AACvE;;;ACFO,SAAS,cAA6B;AAC3C,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,QAAI,OAAO,wBAAwB,aAAa;AAC9C,0BAAoB,MAAM,QAAQ,CAAC;AAAA,IACrC,OAAO;AACL,iBAAW,MAAM,QAAQ,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/dist/utils.d.cts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
declare function assertExhaustive(value: never, message?: string): never;
|
|
2
|
+
|
|
3
|
+
declare function bigIntMax(...args: bigint[]): bigint;
|
|
4
|
+
|
|
5
|
+
declare function bigIntMin(...args: bigint[]): bigint;
|
|
6
|
+
|
|
7
|
+
declare function bigIntSort(a: bigint, b: bigint): -1 | 0 | 1;
|
|
8
|
+
|
|
9
|
+
declare function chunk<T>(arr: readonly T[], n: number): Generator<readonly T[], void>;
|
|
10
|
+
|
|
11
|
+
declare function groupBy<value, key>(values: readonly value[], getKey: (value: value) => key): Map<key, readonly value[]>;
|
|
12
|
+
|
|
13
|
+
declare function identity<T>(value: T): T;
|
|
14
|
+
|
|
15
|
+
declare function includes<item>(items: item[], value: any): value is item;
|
|
16
|
+
|
|
17
|
+
declare function indent(message: string, indentation?: string): string;
|
|
18
|
+
|
|
19
|
+
declare function isDefined<T>(argument: T | undefined): argument is T;
|
|
20
|
+
|
|
21
|
+
declare function isNotNull<T>(argument: T | null): argument is T;
|
|
22
|
+
|
|
23
|
+
declare function iteratorToArray<T>(iterator: AsyncIterable<T>): Promise<readonly T[]>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Map each key of a source object via a given valueMap function
|
|
27
|
+
*/
|
|
28
|
+
declare function mapObject<Source extends Record<string | number | symbol, unknown>, Target extends {
|
|
29
|
+
[key in keyof Source]: unknown;
|
|
30
|
+
}>(source: Source, valueMap: (value: Source[typeof key], key: keyof Source) => Target[typeof key]): Target;
|
|
31
|
+
|
|
32
|
+
declare function unique<value>(values: readonly value[]): readonly value[];
|
|
33
|
+
|
|
34
|
+
declare function uniqueBy<value, key>(values: readonly value[], getKey: (value: value) => key): readonly value[];
|
|
35
|
+
|
|
36
|
+
declare function wait(ms: number): Promise<void>;
|
|
37
|
+
|
|
38
|
+
declare function waitForIdle(): Promise<void>;
|
|
39
|
+
|
|
40
|
+
export { assertExhaustive, bigIntMax, bigIntMin, bigIntSort, chunk, groupBy, identity, includes, indent, isDefined, isNotNull, iteratorToArray, mapObject, unique, uniqueBy, wait, waitForIdle };
|
package/dist/utils.js
CHANGED
|
@@ -1,2 +1,123 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
uniqueBy
|
|
3
|
+
} from "./chunk-IYZZFDNO.js";
|
|
4
|
+
|
|
5
|
+
// src/utils/assertExhaustive.ts
|
|
6
|
+
function assertExhaustive(value, message) {
|
|
7
|
+
throw new Error(message ?? `Unexpected value: ${value}`);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// src/utils/bigIntMax.ts
|
|
11
|
+
function bigIntMax(...args) {
|
|
12
|
+
return args.reduce((m, e) => e > m ? e : m);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/utils/bigIntMin.ts
|
|
16
|
+
function bigIntMin(...args) {
|
|
17
|
+
return args.reduce((m, e) => e < m ? e : m);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/utils/bigIntSort.ts
|
|
21
|
+
function bigIntSort(a, b) {
|
|
22
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// src/utils/chunk.ts
|
|
26
|
+
function* chunk(arr, n) {
|
|
27
|
+
for (let i = 0; i < arr.length; i += n) {
|
|
28
|
+
yield arr.slice(i, i + n);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// src/utils/groupBy.ts
|
|
33
|
+
function groupBy(values, getKey) {
|
|
34
|
+
const map = /* @__PURE__ */ new Map();
|
|
35
|
+
for (const value of values) {
|
|
36
|
+
const key = getKey(value);
|
|
37
|
+
if (!map.has(key)) map.set(key, []);
|
|
38
|
+
map.get(key).push(value);
|
|
39
|
+
}
|
|
40
|
+
return map;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/utils/identity.ts
|
|
44
|
+
function identity(value) {
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/utils/includes.ts
|
|
49
|
+
function includes(items, value) {
|
|
50
|
+
return items.includes(value);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/utils/indent.ts
|
|
54
|
+
function indent(message, indentation = " ") {
|
|
55
|
+
return message.replaceAll(/(^|\n)/g, `$1${indentation}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// src/utils/isDefined.ts
|
|
59
|
+
function isDefined(argument) {
|
|
60
|
+
return argument !== void 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/utils/isNotNull.ts
|
|
64
|
+
function isNotNull(argument) {
|
|
65
|
+
return argument !== null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/utils/iteratorToArray.ts
|
|
69
|
+
async function iteratorToArray(iterator) {
|
|
70
|
+
const items = [];
|
|
71
|
+
for await (const item of iterator) {
|
|
72
|
+
items.push(item);
|
|
73
|
+
}
|
|
74
|
+
return items;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/utils/mapObject.ts
|
|
78
|
+
function mapObject(source, valueMap) {
|
|
79
|
+
return Object.fromEntries(
|
|
80
|
+
Object.entries(source).map(([key, value]) => [key, valueMap(value, key)])
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/utils/unique.ts
|
|
85
|
+
function unique(values) {
|
|
86
|
+
return Array.from(new Set(values));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// src/utils/wait.ts
|
|
90
|
+
function wait(ms) {
|
|
91
|
+
return new Promise((resolve) => setTimeout(() => resolve(), ms));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/utils/waitForIdle.ts
|
|
95
|
+
function waitForIdle() {
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
if (typeof requestIdleCallback !== "undefined") {
|
|
98
|
+
requestIdleCallback(() => resolve());
|
|
99
|
+
} else {
|
|
100
|
+
setTimeout(() => resolve(), 1);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
assertExhaustive,
|
|
106
|
+
bigIntMax,
|
|
107
|
+
bigIntMin,
|
|
108
|
+
bigIntSort,
|
|
109
|
+
chunk,
|
|
110
|
+
groupBy,
|
|
111
|
+
identity,
|
|
112
|
+
includes,
|
|
113
|
+
indent,
|
|
114
|
+
isDefined,
|
|
115
|
+
isNotNull,
|
|
116
|
+
iteratorToArray,
|
|
117
|
+
mapObject,
|
|
118
|
+
unique,
|
|
119
|
+
uniqueBy,
|
|
120
|
+
wait,
|
|
121
|
+
waitForIdle
|
|
122
|
+
};
|
|
2
123
|
//# sourceMappingURL=utils.js.map
|