@powerhousedao/connect 1.0.21-staging.0 → 1.0.22-dev.1

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.
Files changed (37) hide show
  1. package/dist/.env +1 -1
  2. package/dist/assets/{app-B2txMMB6.js → app-B-5qYsgM.js} +8796 -3328
  3. package/dist/assets/app-B-5qYsgM.js.map +1 -0
  4. package/dist/assets/{app-CDOWlDp2.css → app-CmlD3Pwe.css} +119 -1
  5. package/dist/assets/{app-loader-uTr5bb-C.js → app-loader-DXPAMQYN.js} +681 -375
  6. package/dist/assets/app-loader-DXPAMQYN.js.map +1 -0
  7. package/dist/assets/{app-loader-DiF8OhX3.css → app-loader-DaCxVT0x.css} +134 -0
  8. package/dist/assets/browser-DC1g4ocI.js +27235 -0
  9. package/dist/assets/browser-DC1g4ocI.js.map +1 -0
  10. package/dist/assets/{ccip-Eu5ix3yZ.js → ccip-B4L3odPP.js} +5 -3
  11. package/dist/assets/ccip-B4L3odPP.js.map +1 -0
  12. package/dist/assets/{content-ZNvpO_Bf.js → content-D22zsKwo.js} +1052 -374
  13. package/dist/assets/content-D22zsKwo.js.map +1 -0
  14. package/dist/assets/{index-CdCNoFiu.js → index-CCV8LLva.js} +4 -3
  15. package/dist/assets/index-CCV8LLva.js.map +1 -0
  16. package/dist/assets/{index-CXtQlZED.js → index-CKPKk_m5.js} +24 -171
  17. package/dist/assets/index-CKPKk_m5.js.map +1 -0
  18. package/dist/assets/index-CWah4bZB.js +209 -0
  19. package/dist/assets/index-CWah4bZB.js.map +1 -0
  20. package/dist/assets/{index-BQuSynqj.js → index-bTL_WhmE.js} +8 -6
  21. package/dist/assets/index-bTL_WhmE.js.map +1 -0
  22. package/dist/assets/{main.D6_W-5oY.js → main.B0yzXDFz.js} +2 -1
  23. package/dist/assets/main.B0yzXDFz.js.map +1 -0
  24. package/dist/assets/reactor-analytics-BF1jqSpK.js +45 -0
  25. package/dist/assets/reactor-analytics-BF1jqSpK.js.map +1 -0
  26. package/dist/assets/router-C1-W7Dq7.js +1585 -0
  27. package/dist/assets/router-C1-W7Dq7.js.map +1 -0
  28. package/dist/assets/{style-Ce3V83BE.css → style-BPUyhu8E.css} +3 -0
  29. package/dist/external-packages.js +1 -0
  30. package/dist/external-packages.js.map +1 -0
  31. package/dist/hmr.js +1 -0
  32. package/dist/hmr.js.map +1 -0
  33. package/dist/index.html +1 -1
  34. package/dist/service-worker.js +1 -0
  35. package/dist/service-worker.js.map +1 -0
  36. package/dist/vite-envs.sh +1 -1
  37. package/package.json +10 -9
@@ -1,8 +1,8 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-loader-uTr5bb-C.js","assets/main.D6_W-5oY.js","assets/app-loader-DiF8OhX3.css"])))=>i.map(i=>d[i]);
2
- import { _ as __vitePreload } from "./main.D6_W-5oY.js";
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-loader-DXPAMQYN.js","assets/main.B0yzXDFz.js","assets/app-loader-DaCxVT0x.css"])))=>i.map(i=>d[i]);
2
+ import { _ as __vitePreload } from "./main.B0yzXDFz.js";
3
3
  import { createRoot } from "react-dom/client";
4
4
  async function renderApp(element) {
5
- const AppLoader = await __vitePreload(() => import("./app-loader-uTr5bb-C.js").then((n) => n.ca), true ? __vite__mapDeps([0,1,2]) : void 0);
5
+ const AppLoader = await __vitePreload(() => import("./app-loader-DXPAMQYN.js").then((n) => n.ca), true ? __vite__mapDeps([0,1,2]) : void 0);
6
6
  createRoot(element).render(AppLoader.default);
7
7
  }
8
8
  const AppElement = document.getElementById("app");
@@ -10,3 +10,4 @@ if (!AppElement) {
10
10
  throw new Error("#app element not found!");
11
11
  }
12
12
  renderApp(AppElement).catch(console.error);
13
+ //# sourceMappingURL=index-CCV8LLva.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":";;;AAEA,eAAe,UAAU,SAAsB;AACrC,oBAAY,MAAM,2BAAO,0BAA4B;AAC3D,aAAW,OAAO,EAAE,OAAO,UAAU,OAAO;AAChD;AAEA,MAAM,aAAa,SAAS,eAAe,KAAK;AAChD,IAAI,CAAC,YAAY;AACP,YAAI,MAAM,yBAAyB;AAC7C;AAEA,UAAU,UAAU,EAAE,MAAM,QAAQ,KAAK","names":[],"ignoreList":[],"sources":["../../src/index.ts"],"sourcesContent":["import { createRoot } from 'react-dom/client';\n\nasync function renderApp(element: HTMLElement) {\n const AppLoader = await import('./components/app-loader.js');\n createRoot(element).render(AppLoader.default);\n}\n\nconst AppElement = document.getElementById('app');\nif (!AppElement) {\n throw new Error('#app element not found!');\n}\n\nrenderApp(AppElement).catch(console.error);\n"],"file":"assets/index-CCV8LLva.js"}
@@ -1,22 +1,20 @@
1
- var __defProp = Object.defineProperty;
2
1
  var __typeError = (msg) => {
3
2
  throw TypeError(msg);
4
3
  };
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
4
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8
5
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
6
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
7
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
8
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12
- var _DB_NAME, _STORE_NAME, _KEY, _db, _BrowserKeyStorage_instances, useStore_fn, _subtleCrypto, _keyPair, _keyPairStorage, _did, _ConnectCrypto_instances, initCrypto_fn, initialize_fn, parseDid_fn, generateECDSAKeyPair_fn, exportKeyPair_fn, importKeyPair_fn, _sign, _verify, _store, _namespace, _BaseStorage_instances, buildKey_fn, _baseUrl, _store2, _connectId, _eventEmitter, _Renown_instances, updateUser_fn, getCredential_fn;
13
- import { _ as __vitePreload } from "./main.D6_W-5oY.js";
14
- import { r as rawKeyInHexfromUncompressed, c as compressedKeyInHexfromRaw, e as encodeDIDfromHexString, a as eventsExports, R as RENOWN_URL, g as getEnsInfo } from "./app-B2txMMB6.js";
15
- import { i, h, d, j, b, f, s } from "./app-B2txMMB6.js";
16
- import { ah as connectConfig, ac as logger } from "./app-loader-uTr5bb-C.js";
9
+ var _DB_NAME, _STORE_NAME, _KEY, _db, _BrowserKeyStorage_instances, useStore_fn, _store, _namespace, _BaseStorage_instances, buildKey_fn, _baseUrl, _store2, _connectId, _eventEmitter, _Renown_instances, updateUser_fn, getCredential_fn;
10
+ import { U as RENOWN_URL, V as getEnsInfo } from "./app-B-5qYsgM.js";
11
+ import { X, a1, a0, Z, a2, Y, _, $ } from "./app-B-5qYsgM.js";
12
+ import { ah as connectConfig, _ as logger } from "./app-loader-DXPAMQYN.js";
13
+ import "./main.B0yzXDFz.js";
17
14
  import "react/jsx-runtime";
18
15
  import "react";
19
16
  import "react-dom";
17
+ import "node:fs";
20
18
  const _BrowserKeyStorage = class _BrowserKeyStorage {
21
19
  constructor() {
22
20
  __privateAdd(this, _BrowserKeyStorage_instances);
@@ -74,157 +72,6 @@ __privateAdd(_BrowserKeyStorage, _DB_NAME, "browserKeyDB");
74
72
  __privateAdd(_BrowserKeyStorage, _STORE_NAME, "keyPairs");
75
73
  __privateAdd(_BrowserKeyStorage, _KEY, "keyPair");
76
74
  let BrowserKeyStorage = _BrowserKeyStorage;
77
- function ab2hex(ab) {
78
- return Array.prototype.map.call(
79
- new Uint8Array(ab),
80
- (x) => ("00" + x.toString(16)).slice(-2)
81
- ).join("");
82
- }
83
- const _ConnectCrypto = class _ConnectCrypto {
84
- constructor(keyPairStorage) {
85
- __privateAdd(this, _ConnectCrypto_instances);
86
- __privateAdd(this, _subtleCrypto);
87
- __privateAdd(this, _keyPair);
88
- __privateAdd(this, _keyPairStorage);
89
- __privateAdd(this, _did);
90
- __privateAdd(this, _sign, async (...args) => {
91
- return (await __privateGet(this, _subtleCrypto)).sign(...args);
92
- });
93
- __privateAdd(this, _verify, async (...args) => {
94
- return (await __privateGet(this, _subtleCrypto)).verify(...args);
95
- });
96
- __privateSet(this, _keyPairStorage, keyPairStorage);
97
- __privateSet(this, _subtleCrypto, __privateMethod(this, _ConnectCrypto_instances, initCrypto_fn).call(this));
98
- __privateSet(this, _did, __privateMethod(this, _ConnectCrypto_instances, initialize_fn).call(this));
99
- }
100
- did() {
101
- return __privateGet(this, _did);
102
- }
103
- async regenerateDid() {
104
- __privateSet(this, _keyPair, await __privateMethod(this, _ConnectCrypto_instances, generateECDSAKeyPair_fn).call(this));
105
- await __privateGet(this, _keyPairStorage).saveKeyPair(await __privateMethod(this, _ConnectCrypto_instances, exportKeyPair_fn).call(this));
106
- }
107
- async sign(data) {
108
- var _a;
109
- if ((_a = __privateGet(this, _keyPair)) == null ? void 0 : _a.privateKey) {
110
- const subtleCrypto = await __privateGet(this, _subtleCrypto);
111
- const arrayBuffer = await subtleCrypto.sign(
112
- _ConnectCrypto.signAlgorithm,
113
- __privateGet(this, _keyPair).privateKey,
114
- data.buffer
115
- );
116
- return new Uint8Array(arrayBuffer);
117
- } else {
118
- throw new Error("No private key available");
119
- }
120
- }
121
- };
122
- _subtleCrypto = new WeakMap();
123
- _keyPair = new WeakMap();
124
- _keyPairStorage = new WeakMap();
125
- _did = new WeakMap();
126
- _ConnectCrypto_instances = new WeakSet();
127
- initCrypto_fn = function() {
128
- return new Promise((resolve, reject) => {
129
- var _a;
130
- if (typeof window === "undefined") {
131
- __vitePreload(() => import("node:crypto"), true ? [] : void 0).then((module) => {
132
- resolve(module.webcrypto.subtle);
133
- }).catch(reject);
134
- } else {
135
- if (!((_a = window.crypto) == null ? void 0 : _a.subtle)) {
136
- reject(new Error("Crypto module not available"));
137
- }
138
- resolve(window.crypto.subtle);
139
- }
140
- });
141
- };
142
- initialize_fn = async function() {
143
- const loadedKeyPair = await __privateGet(this, _keyPairStorage).loadKeyPair();
144
- if (loadedKeyPair) {
145
- __privateSet(this, _keyPair, await __privateMethod(this, _ConnectCrypto_instances, importKeyPair_fn).call(this, loadedKeyPair));
146
- console.log("Found key pair");
147
- } else {
148
- __privateSet(this, _keyPair, await __privateMethod(this, _ConnectCrypto_instances, generateECDSAKeyPair_fn).call(this));
149
- console.log("Created key pair");
150
- await __privateGet(this, _keyPairStorage).saveKeyPair(await __privateMethod(this, _ConnectCrypto_instances, exportKeyPair_fn).call(this));
151
- }
152
- const did = await __privateMethod(this, _ConnectCrypto_instances, parseDid_fn).call(this);
153
- console.log("Connect DID:", did);
154
- return did;
155
- };
156
- parseDid_fn = async function() {
157
- if (!__privateGet(this, _keyPair)) {
158
- throw new Error("No key pair available");
159
- }
160
- const subtleCrypto = await __privateGet(this, _subtleCrypto);
161
- const publicKeyRaw = await subtleCrypto.exportKey(
162
- "raw",
163
- __privateGet(this, _keyPair).publicKey
164
- );
165
- const multicodecName = "p256-pub";
166
- const rawKey = rawKeyInHexfromUncompressed(ab2hex(publicKeyRaw));
167
- const compressedKey = compressedKeyInHexfromRaw(rawKey);
168
- const did = encodeDIDfromHexString(multicodecName, compressedKey);
169
- return did;
170
- };
171
- generateECDSAKeyPair_fn = async function() {
172
- const subtleCrypto = await __privateGet(this, _subtleCrypto);
173
- const keyPair = await subtleCrypto.generateKey(
174
- _ConnectCrypto.algorithm,
175
- true,
176
- ["sign", "verify"]
177
- );
178
- return keyPair;
179
- };
180
- exportKeyPair_fn = async function() {
181
- if (!__privateGet(this, _keyPair)) {
182
- throw new Error("No key pair available");
183
- }
184
- const subtleCrypto = await __privateGet(this, _subtleCrypto);
185
- const jwkKeyPair = {
186
- publicKey: await subtleCrypto.exportKey(
187
- "jwk",
188
- __privateGet(this, _keyPair).publicKey
189
- ),
190
- privateKey: await subtleCrypto.exportKey(
191
- "jwk",
192
- __privateGet(this, _keyPair).privateKey
193
- )
194
- };
195
- return jwkKeyPair;
196
- };
197
- importKeyPair_fn = async function(jwkKeyPair) {
198
- const subtleCrypto = await __privateGet(this, _subtleCrypto);
199
- return {
200
- publicKey: await subtleCrypto.importKey(
201
- "jwk",
202
- jwkKeyPair.publicKey,
203
- _ConnectCrypto.algorithm,
204
- true,
205
- ["verify"]
206
- ),
207
- privateKey: await subtleCrypto.importKey(
208
- "jwk",
209
- jwkKeyPair.privateKey,
210
- _ConnectCrypto.algorithm,
211
- true,
212
- ["sign"]
213
- )
214
- };
215
- };
216
- _sign = new WeakMap();
217
- _verify = new WeakMap();
218
- __publicField(_ConnectCrypto, "algorithm", {
219
- name: "ECDSA",
220
- namedCurve: "P-256"
221
- });
222
- __publicField(_ConnectCrypto, "signAlgorithm", {
223
- name: "ECDSA",
224
- namedCurve: "P-256",
225
- hash: "SHA-256"
226
- });
227
- let ConnectCrypto = _ConnectCrypto;
228
75
  function parsePkhDid(did) {
229
76
  const parts = did.split(":");
230
77
  if (!did.startsWith("did:pkh:") || parts.length !== 5) {
@@ -300,7 +147,7 @@ class Renown {
300
147
  __privateAdd(this, _baseUrl);
301
148
  __privateAdd(this, _store2);
302
149
  __privateAdd(this, _connectId);
303
- __privateAdd(this, _eventEmitter, new eventsExports.EventEmitter());
150
+ __privateAdd(this, _eventEmitter, new EventTarget());
304
151
  __privateSet(this, _store2, store2);
305
152
  __privateSet(this, _connectId, connectId);
306
153
  __privateSet(this, _baseUrl, baseUrl);
@@ -352,9 +199,12 @@ class Renown {
352
199
  __privateMethod(this, _Renown_instances, updateUser_fn).call(this, void 0);
353
200
  }
354
201
  on(event, listener) {
355
- __privateGet(this, _eventEmitter).on(event, listener);
202
+ const eventListener = (e) => {
203
+ listener(e.detail);
204
+ };
205
+ __privateGet(this, _eventEmitter).addEventListener(event, eventListener);
356
206
  return () => {
357
- __privateGet(this, _eventEmitter).removeListener(event, listener);
207
+ __privateGet(this, _eventEmitter).removeEventListener(event, eventListener);
358
208
  };
359
209
  }
360
210
  }
@@ -365,7 +215,9 @@ _eventEmitter = new WeakMap();
365
215
  _Renown_instances = new WeakSet();
366
216
  updateUser_fn = function(user) {
367
217
  user ? __privateGet(this, _store2).set("user", user) : __privateGet(this, _store2).delete("user");
368
- __privateGet(this, _eventEmitter).emit("user", user);
218
+ __privateGet(this, _eventEmitter).dispatchEvent(
219
+ new CustomEvent("user", { detail: user })
220
+ );
369
221
  };
370
222
  getCredential_fn = async function(address, chainId, connectId) {
371
223
  if (!__privateGet(this, _baseUrl)) {
@@ -388,17 +240,18 @@ getCredential_fn = async function(address, chainId, connectId) {
388
240
  export {
389
241
  BaseStorage,
390
242
  BrowserKeyStorage,
391
- ConnectCrypto,
392
- i as RENOWN_CHAIN_ID,
393
- h as RENOWN_NETWORK_ID,
243
+ X as ConnectCrypto,
244
+ a1 as RENOWN_CHAIN_ID,
245
+ a0 as RENOWN_NETWORK_ID,
394
246
  RENOWN_URL,
395
247
  Renown,
396
- d as addExternalPackage,
397
- j as getChain,
248
+ Z as addExternalPackage,
249
+ a2 as getChain,
398
250
  getEnsInfo,
399
- b as getHMRModule,
251
+ Y as getHMRModule,
400
252
  initRenownBrowser,
401
253
  parsePkhDid,
402
- f as removeExternalPackage,
403
- s as subscribeExternalPackages
254
+ _ as removeExternalPackage,
255
+ $ as subscribeExternalPackages
404
256
  };
257
+ //# sourceMappingURL=index-CKPKk_m5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CKPKk_m5.js","sources":["../../src/services/crypto/browser.ts","../../src/services/renown/utils.ts","../../src/services/storage/index.ts","../../src/services/storage/browser.ts","../../src/services/renown/browser.ts","../../src/services/renown/index.ts"],"sourcesContent":["import { type JsonWebKeyPairStorage, type JwkKeyPair } from './index.js';\n\nexport class BrowserKeyStorage implements JsonWebKeyPairStorage {\n static #DB_NAME = 'browserKeyDB';\n static #STORE_NAME = 'keyPairs';\n static #KEY = 'keyPair';\n\n #db: Promise<IDBDatabase>;\n constructor() {\n this.#db = new Promise((resolve, reject) => {\n const req = indexedDB.open(BrowserKeyStorage.#DB_NAME, 1);\n req.onupgradeneeded = () => {\n req.result.createObjectStore(BrowserKeyStorage.#STORE_NAME);\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error as Error);\n });\n }\n\n async #useStore(mode: IDBTransactionMode = 'readwrite') {\n const database = await this.#db;\n const transaction = database.transaction(\n BrowserKeyStorage.#STORE_NAME,\n mode,\n );\n const store = transaction.objectStore(BrowserKeyStorage.#STORE_NAME);\n return store;\n }\n\n async saveKeyPair(keyPair: JwkKeyPair) {\n const store = await this.#useStore();\n const request = store.put(keyPair, BrowserKeyStorage.#KEY);\n return new Promise<void>((resolve, reject) => {\n request.onsuccess = () => {\n resolve();\n };\n request.onerror = () => {\n reject(new Error('Failed to save key pair'));\n };\n });\n }\n\n async loadKeyPair(): Promise<JwkKeyPair | undefined> {\n const store = await this.#useStore('readonly');\n const request = store.getAll();\n\n return new Promise<JwkKeyPair | undefined>((resolve, reject) => {\n request.onsuccess = () => {\n const keyPair = request.result.length\n ? (request.result[0] as JwkKeyPair)\n : undefined;\n resolve(keyPair);\n };\n request.onerror = () => {\n reject(new Error('Failed to load key pair'));\n };\n });\n }\n}\n","export type PKHDid = {\n networkId: string;\n chainId: number;\n address: `0x${string}`;\n};\n\nexport function parsePkhDid(did: string): PKHDid {\n const parts = did.split(':');\n if (!did.startsWith('did:pkh:') || parts.length !== 5) {\n throw new Error('Invalid pkh did');\n }\n const [, , networkId, chainIdStr, address] = parts;\n\n if (!address.startsWith('0x')) {\n throw new Error(`Invalid address: ${address}`);\n }\n\n const chainId = Number(chainIdStr);\n if (isNaN(chainId)) {\n throw new Error(`Invalid chain id: ${chainIdStr}`);\n }\n\n return {\n chainId,\n networkId,\n address: address as PKHDid['address'],\n };\n}\n","export interface IStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> {\n get<Key extends keyof T>(key: Key): T[Key];\n set<Key extends keyof T>(key: Key, value?: T[Key]): void;\n delete<Key extends keyof T>(key: Key): void;\n}\n\nexport class BaseStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> implements IStorage<T>\n{\n #store: IStorage<T>;\n #namespace: string;\n\n protected constructor(store: IStorage<T>, namespace: string) {\n this.#store = store;\n this.#namespace = namespace;\n }\n\n #buildKey<Key extends keyof T>(key: Key): Key {\n return `${this.#namespace}:${key.toString()}` as Key;\n }\n\n get<Key extends keyof T>(key: Key): T[Key] {\n return this.#store.get(this.#buildKey(key));\n }\n set<Key extends keyof T>(key: Key, value?: T[Key] | undefined): void {\n return this.#store.set(this.#buildKey(key), value);\n }\n delete<Key extends keyof T>(key: Key): void {\n return this.#store.delete(this.#buildKey(key));\n }\n}\n","import connectConfig from '#connect-config';\nimport { BaseStorage, type IStorage } from './index.js';\n\nconst store: IStorage = {\n get: function <Key extends string>(key: Key): unknown {\n const value = localStorage.getItem(key);\n if (value) {\n return JSON.parse(value);\n }\n return undefined;\n },\n set: function <Key extends string>(key: Key, value?: unknown): void {\n return value\n ? localStorage.setItem(key, JSON.stringify(value))\n : localStorage.removeItem(key);\n },\n delete: function <Key extends string>(key: Key): void {\n return localStorage.removeItem(key);\n },\n};\n\nexport class BrowserStorage<\n T extends Record<string, unknown> = Record<string, unknown>,\n> extends BaseStorage<T> {\n constructor(namespace: string) {\n super(\n store as IStorage<T>,\n `${connectConfig.routerBasename}:${namespace}`,\n );\n }\n}\n","import { Renown } from './index.js';\nimport { BrowserStorage } from '../storage/browser.js';\n\nexport function initRenownBrowser(connectId: string) {\n return new Renown(new BrowserStorage('renown'), connectId);\n}\n","import { logger } from 'document-drive';\nimport type { IStorage } from '../storage/index.js';\nimport { getEnsInfo } from '../viem.js';\nimport { RENOWN_URL } from './constants.js';\nimport {\n type PowerhouseVerifiableCredential,\n type RenownStorage,\n type User,\n} from './types.js';\nimport { parsePkhDid } from './utils.js';\n\nexport * from './browser.js';\nexport * from './constants.js';\nexport * from './types.js';\nexport type {\n PowerhouseVerifiableCredential,\n Unsubscribe,\n User,\n} from './types.js';\nexport * from './utils.js';\n\nexport class Renown {\n #baseUrl: string;\n #store: RenownStorage;\n #connectId: string;\n #eventEmitter = new EventTarget();\n\n constructor(store: IStorage, connectId: string, baseUrl = RENOWN_URL) {\n this.#store = store as RenownStorage;\n this.#connectId = connectId;\n this.#baseUrl = baseUrl;\n\n if (this.user) {\n this.login(this.user.did).catch(() => void 0);\n }\n }\n\n get user() {\n return this.#store.get('user');\n }\n\n #updateUser(user: User | undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n user ? this.#store.set('user', user) : this.#store.delete('user');\n this.#eventEmitter.dispatchEvent(\n new CustomEvent('user', { detail: user }),\n );\n }\n\n set connectId(connectId: string) {\n this.#connectId = connectId;\n const user = this.user;\n\n this.#updateUser(undefined);\n\n // tries to login with new connectId\n if (user) {\n this.login(user.did).catch(e => {\n console.log('User no longer authenticated:', e);\n });\n }\n }\n\n async login(did: string): Promise<User> {\n try {\n const result = parsePkhDid(did);\n\n const credential = await this.#getCredential(\n result.address,\n result.chainId,\n this.#connectId,\n );\n if (!credential) {\n this.#updateUser(undefined);\n throw new Error('Credential not found');\n }\n const user: User = {\n ...result,\n did,\n credential,\n };\n\n getEnsInfo(user.address, user.chainId)\n .then(ens => {\n if (\n this.user?.address === user.address &&\n this.user.chainId === user.chainId\n ) {\n this.#updateUser({ ...this.user, ens });\n }\n })\n .catch(logger.error);\n\n this.#updateUser(user);\n return user;\n } catch (error) {\n logger.error(error);\n this.#updateUser(undefined);\n throw error;\n }\n }\n\n logout() {\n this.#updateUser(undefined);\n }\n\n on(event: 'user', listener: (user: User) => void) {\n const eventListener = ((e: CustomEvent<User>) => {\n listener(e.detail);\n }) as EventListener;\n\n this.#eventEmitter.addEventListener(event, eventListener);\n return () => {\n this.#eventEmitter.removeEventListener(event, eventListener);\n };\n }\n\n async #getCredential(\n address: string,\n chainId: number,\n connectId: string,\n ): Promise<PowerhouseVerifiableCredential | undefined> {\n if (!this.#baseUrl) {\n throw new Error('RENOWN_URL is not set');\n }\n const url = new URL(\n `/api/auth/credential?address=${encodeURIComponent(address)}&chainId=${encodeURIComponent(chainId)}&connectId=${encodeURIComponent(connectId)}`,\n this.#baseUrl,\n );\n const response = await fetch(url, {\n method: 'GET',\n });\n if (response.ok) {\n const result = (await response.json()) as {\n credential: PowerhouseVerifiableCredential;\n };\n return result.credential;\n } else {\n throw new Error('Failed to get credential');\n }\n }\n}\n"],"names":["store","_store"],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ import { a4 as AnalyticsPath, a3 as DateTime } from "./app-B-5qYsgM.js";
5
+ import { ak as childLogger } from "./app-loader-DXPAMQYN.js";
6
+ import "./main.B0yzXDFz.js";
7
+ import "react/jsx-runtime";
8
+ import "react";
9
+ import "react-dom";
10
+ import "node:fs";
11
+ function diffDocumentStates(doc1, doc2) {
12
+ const changes = [];
13
+ const globalChanges = diffStateObjects(doc1, doc2, "state.global", "global");
14
+ changes.push(...globalChanges);
15
+ const additions = changes.filter((c) => c.type === "add").length;
16
+ const removals = changes.filter((c) => c.type === "remove").length;
17
+ const changesByScope = {
18
+ global: changes.filter((c) => c.scope === "global")
19
+ };
20
+ return {
21
+ totalChanges: changes.length,
22
+ additions,
23
+ removals,
24
+ changesByScope,
25
+ changes
26
+ };
27
+ }
28
+ function diffStateObjects(obj1, obj2, path, scope) {
29
+ const changes = [];
30
+ if (typeof obj1 !== "object" || typeof obj2 !== "object" || obj1 === null || obj2 === null) {
31
+ if (obj1 !== obj2) {
32
+ if (typeof obj1 === "string" && typeof obj2 === "string") {
33
+ return diffStateStrings(obj1, obj2, path, scope);
34
+ } else {
35
+ changes.push({
36
+ type: "remove",
37
+ path,
38
+ oldValue: obj1,
39
+ scope
40
+ });
41
+ changes.push({
42
+ type: "add",
43
+ path,
44
+ newValue: obj2,
45
+ scope
46
+ });
47
+ }
48
+ }
49
+ return changes;
50
+ }
51
+ if (Array.isArray(obj1) && Array.isArray(obj2)) {
52
+ if (obj1.length !== obj2.length) {
53
+ changes.push({
54
+ type: "remove",
55
+ path,
56
+ oldValue: obj1,
57
+ scope
58
+ });
59
+ changes.push({
60
+ type: "add",
61
+ path,
62
+ newValue: obj2,
63
+ scope
64
+ });
65
+ return changes;
66
+ }
67
+ for (let i = 0; i < obj1.length; i++) {
68
+ const elementChanges = diffStateObjects(obj1[i], obj2[i], `${path}[${i}]`, scope);
69
+ changes.push(...elementChanges);
70
+ }
71
+ return changes;
72
+ }
73
+ const obj1Record = obj1;
74
+ const obj2Record = obj2;
75
+ const obj1Keys = Object.keys(obj1Record);
76
+ const obj2Keys = Object.keys(obj2Record);
77
+ for (const key of obj1Keys) {
78
+ if (!(key in obj2Record)) {
79
+ changes.push({
80
+ type: "remove",
81
+ path: `${path}.${key}`,
82
+ oldValue: obj1Record[key],
83
+ scope
84
+ });
85
+ }
86
+ }
87
+ for (const key of obj2Keys) {
88
+ if (!(key in obj1Record)) {
89
+ changes.push({
90
+ type: "add",
91
+ path: `${path}.${key}`,
92
+ newValue: obj2Record[key],
93
+ scope
94
+ });
95
+ } else if (obj1Record[key] !== obj2Record[key]) {
96
+ const nestedChanges = diffStateObjects(obj1Record[key], obj2Record[key], `${path}.${key}`, scope);
97
+ changes.push(...nestedChanges);
98
+ }
99
+ }
100
+ return changes;
101
+ }
102
+ function diffStateStrings(str1, str2, path, scope) {
103
+ const changes = [];
104
+ const maxLen = Math.max(str1.length, str2.length);
105
+ for (let i = 0; i < maxLen; i++) {
106
+ if (i >= str1.length) {
107
+ changes.push({
108
+ type: "add",
109
+ path: `${path}[${i}]`,
110
+ newValue: str2[i],
111
+ scope
112
+ });
113
+ } else if (i >= str2.length) {
114
+ changes.push({
115
+ type: "remove",
116
+ path: `${path}[${i}]`,
117
+ oldValue: str1[i],
118
+ scope
119
+ });
120
+ } else if (str1[i] !== str2[i]) {
121
+ changes.push({
122
+ type: "remove",
123
+ path: `${path}[${i}]`,
124
+ oldValue: str1[i],
125
+ scope
126
+ });
127
+ changes.push({
128
+ type: "add",
129
+ path: `${path}[${i}]`,
130
+ newValue: str2[i],
131
+ scope
132
+ });
133
+ }
134
+ }
135
+ return changes;
136
+ }
137
+ class DiffAnalyticsProcessor {
138
+ constructor(analyticsStore, logger = childLogger(["processor", "diff-analytics"])) {
139
+ __publicField(this, "analyticsStore");
140
+ __publicField(this, "logger");
141
+ this.analyticsStore = analyticsStore;
142
+ this.logger = logger;
143
+ }
144
+ async onStrands(strands) {
145
+ if (strands.length === 0) {
146
+ return;
147
+ }
148
+ const inputs = [];
149
+ for (const strand of strands) {
150
+ if (strand.operations.length === 0) {
151
+ continue;
152
+ }
153
+ const firstOp = strand.operations[0];
154
+ const source = AnalyticsPath.fromString(`ph/${strand.driveId}/${strand.documentId}/${strand.branch}/${strand.scope}`);
155
+ if (firstOp.index === 0) {
156
+ await this.clearSource(source);
157
+ }
158
+ for (const operation of strand.operations) {
159
+ const diff = diffDocumentStates(operation.previousState, operation.state);
160
+ for (const change of diff.changes) {
161
+ inputs.push(this.generateInput(strand.documentId, strand.branch, strand.scope, operation.index, change.type, 1, source, operation.timestamp, change.path));
162
+ }
163
+ }
164
+ }
165
+ if (inputs.length) {
166
+ await this.analyticsStore.addSeriesValues(inputs);
167
+ }
168
+ }
169
+ async onDisconnect() {
170
+ }
171
+ async clearSource(source) {
172
+ try {
173
+ await this.analyticsStore.clearSeriesBySource(source, true);
174
+ } catch (e) {
175
+ this.logger.error("Failed to clear source", e);
176
+ }
177
+ }
178
+ generateInput(documentId, branch, scope, revision, type, value, source, timestamp, path) {
179
+ const dimensions = {};
180
+ const changePath = path.split("[")[0].replaceAll(".", "/");
181
+ dimensions.changes = AnalyticsPath.fromString(`changes/${type}`);
182
+ dimensions.document = AnalyticsPath.fromString(`document/${documentId}/${branch}/${scope}/${revision}`);
183
+ dimensions.path = AnalyticsPath.fromString(`path/${changePath}`);
184
+ return {
185
+ dimensions,
186
+ metric: "Count",
187
+ start: DateTime.fromISO(timestamp),
188
+ source,
189
+ value
190
+ };
191
+ }
192
+ }
193
+ const processorFactory = (module) => (driveId) => {
194
+ return [
195
+ {
196
+ processor: new DiffAnalyticsProcessor(module.analyticsStore),
197
+ filter: {
198
+ branch: ["main"],
199
+ documentId: ["*"],
200
+ scope: ["*"],
201
+ documentType: ["*"]
202
+ }
203
+ }
204
+ ];
205
+ };
206
+ export {
207
+ processorFactory
208
+ };
209
+ //# sourceMappingURL=index-CWah4bZB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CWah4bZB.js","sources":["../../../../node_modules/.pnpm/@powerhousedao+diff-analyzer@0.0.0-dev.4_ejs5gza3ix5zkaodtz6ujwzivy/node_modules/@powerhousedao/diff-analyzer/dist/lib/document-diff.js","../../../../node_modules/.pnpm/@powerhousedao+diff-analyzer@0.0.0-dev.4_ejs5gza3ix5zkaodtz6ujwzivy/node_modules/@powerhousedao/diff-analyzer/dist/processors/diff-analytics/index.js","../../../../node_modules/.pnpm/@powerhousedao+diff-analyzer@0.0.0-dev.4_ejs5gza3ix5zkaodtz6ujwzivy/node_modules/@powerhousedao/diff-analyzer/dist/processors/index.js"],"sourcesContent":["/**\n * Calculates the difference between two document states\n */\nexport function diffDocumentStates(doc1, doc2) {\n const changes = [];\n // Compare global state\n const globalChanges = diffStateObjects(doc1, doc2, \"state.global\", \"global\");\n changes.push(...globalChanges);\n // Count changes by type\n const additions = changes.filter((c) => c.type === \"add\").length;\n const removals = changes.filter((c) => c.type === \"remove\").length;\n // Group changes by scope\n const changesByScope = {\n global: changes.filter((c) => c.scope === \"global\"),\n };\n return {\n totalChanges: changes.length,\n additions,\n removals,\n changesByScope,\n changes,\n };\n}\n/**\n * Recursively compares two state objects and returns a list of changes\n */\nfunction diffStateObjects(obj1, obj2, path, scope) {\n const changes = [];\n // Handle primitive values\n if (typeof obj1 !== \"object\" ||\n typeof obj2 !== \"object\" ||\n obj1 === null ||\n obj2 === null) {\n if (obj1 !== obj2) {\n // Special handling for strings to diff character by character\n if (typeof obj1 === \"string\" && typeof obj2 === \"string\") {\n return diffStateStrings(obj1, obj2, path, scope);\n }\n else {\n // For non-string primitives, treat a change as a remove + add\n changes.push({\n type: \"remove\",\n path,\n oldValue: obj1,\n scope,\n });\n changes.push({\n type: \"add\",\n path,\n newValue: obj2,\n scope,\n });\n }\n }\n return changes;\n }\n // Handle arrays\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\n // Compare array lengths\n if (obj1.length !== obj2.length) {\n // For arrays with different lengths, treat as a remove + add\n changes.push({\n type: \"remove\",\n path,\n oldValue: obj1,\n scope,\n });\n changes.push({\n type: \"add\",\n path,\n newValue: obj2,\n scope,\n });\n return changes;\n }\n // Compare array elements\n for (let i = 0; i < obj1.length; i++) {\n const elementChanges = diffStateObjects(obj1[i], obj2[i], `${path}[${i}]`, scope);\n changes.push(...elementChanges);\n }\n return changes;\n }\n // Handle objects\n const obj1Record = obj1;\n const obj2Record = obj2;\n const obj1Keys = Object.keys(obj1Record);\n const obj2Keys = Object.keys(obj2Record);\n // First, check for removed keys\n for (const key of obj1Keys) {\n if (!(key in obj2Record)) {\n // Key was removed\n changes.push({\n type: \"remove\",\n path: `${path}.${key}`,\n oldValue: obj1Record[key],\n scope,\n });\n }\n }\n // Then, check for added keys and modified values\n for (const key of obj2Keys) {\n if (!(key in obj1Record)) {\n // Key was added\n changes.push({\n type: \"add\",\n path: `${path}.${key}`,\n newValue: obj2Record[key],\n scope,\n });\n }\n else if (obj1Record[key] !== obj2Record[key]) {\n // For object changes, recursively diff the objects\n const nestedChanges = diffStateObjects(obj1Record[key], obj2Record[key], `${path}.${key}`, scope);\n changes.push(...nestedChanges);\n }\n }\n return changes;\n}\n/**\n * Compares two strings character by character and returns a list of changes\n */\nfunction diffStateStrings(str1, str2, path, scope) {\n const changes = [];\n const maxLen = Math.max(str1.length, str2.length);\n for (let i = 0; i < maxLen; i++) {\n if (i >= str1.length) {\n // Addition of new character\n changes.push({\n type: \"add\",\n path: `${path}[${i}]`,\n newValue: str2[i],\n scope,\n });\n }\n else if (i >= str2.length) {\n // Removal of character\n changes.push({\n type: \"remove\",\n path: `${path}[${i}]`,\n oldValue: str1[i],\n scope,\n });\n }\n else if (str1[i] !== str2[i]) {\n // Character changed\n changes.push({\n type: \"remove\",\n path: `${path}[${i}]`,\n oldValue: str1[i],\n scope,\n });\n changes.push({\n type: \"add\",\n path: `${path}[${i}]`,\n newValue: str2[i],\n scope,\n });\n }\n }\n return changes;\n}\n/**\n * Generates analytics data from a state diff summary\n */\nexport function generateStateAnalyticsData(diff) {\n return {\n totalChanges: diff.totalChanges,\n changesByType: {\n add: diff.additions,\n remove: diff.removals,\n },\n changesByScope: {\n global: diff.changesByScope.global.length,\n },\n changePaths: diff.changes.map((c) => c.path),\n };\n}\n","import { AnalyticsPath, } from \"@powerhousedao/analytics-engine-core\";\nimport { DateTime } from \"luxon\";\nimport { diffDocumentStates } from \"../../lib/document-diff.js\";\nimport { childLogger } from \"document-drive\";\nexport class DiffAnalyticsProcessor {\n analyticsStore;\n logger;\n constructor(analyticsStore, logger = childLogger([\"processor\", \"diff-analytics\"])) {\n this.analyticsStore = analyticsStore;\n this.logger = logger;\n //\n }\n async onStrands(strands) {\n if (strands.length === 0) {\n return;\n }\n const inputs = [];\n for (const strand of strands) {\n if (strand.operations.length === 0) {\n continue;\n }\n const firstOp = strand.operations[0];\n const source = AnalyticsPath.fromString(`ph/${strand.driveId}/${strand.documentId}/${strand.branch}/${strand.scope}`);\n if (firstOp.index === 0) {\n await this.clearSource(source);\n }\n for (const operation of strand.operations) {\n const diff = diffDocumentStates(operation.previousState, operation.state);\n for (const change of diff.changes) {\n inputs.push(this.generateInput(strand.documentId, strand.branch, strand.scope, operation.index, change.type, 1, source, operation.timestamp, change.path));\n }\n }\n }\n if (inputs.length) {\n await this.analyticsStore.addSeriesValues(inputs);\n }\n }\n async onDisconnect() { }\n async clearSource(source) {\n try {\n await this.analyticsStore.clearSeriesBySource(source, true);\n }\n catch (e) {\n this.logger.error(\"Failed to clear source\", e);\n }\n }\n generateInput(documentId, branch, scope, revision, type, value, source, timestamp, path) {\n const dimensions = {};\n const changePath = path.split(\"[\")[0].replaceAll(\".\", \"/\");\n dimensions.changes = AnalyticsPath.fromString(`changes/${type}`);\n dimensions.document = AnalyticsPath.fromString(`document/${documentId}/${branch}/${scope}/${revision}`);\n dimensions.path = AnalyticsPath.fromString(`path/${changePath}`);\n return {\n dimensions,\n metric: \"Count\",\n start: DateTime.fromISO(timestamp),\n source,\n value,\n };\n }\n}\n","/**\n * This is a scaffold file meant for customization.\n * Delete the file and run the code generator again to have it reset\n */\nimport { DiffAnalyticsProcessor } from \"./diff-analytics/index.js\";\nexport const processorFactory = (module) => (driveId) => {\n return [\n {\n processor: new DiffAnalyticsProcessor(module.analyticsStore),\n filter: {\n branch: [\"main\"],\n documentId: [\"*\"],\n scope: [\"*\"],\n documentType: [\"*\"],\n },\n },\n ];\n};\n"],"names":[],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1,10 +1,11 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { t as twMerge, ag as clsx, ah as get, ai as set, aj as appendErrors, ak as useFormContext, al as Primitive, am as cva, an as FormProvider, ao as Controller, ap as Slot, aq as useForm, ar as Root2, as as List, at as Trigger, au as Content, av as setModelName, aw as setModelId, ax as setModelDescription, ay as setModelExtension, az as setAuthorName, aA as setAuthorWebsite, aB as setStateSchema, aC as setInitialState, aD as addModule, aE as setModuleName, aF as deleteModule, aG as addOperation, aH as setOperationName, aI as setOperationSchema, aJ as setOperationDescription, aK as deleteOperation, aL as addOperationError, aM as deleteOperationError, aN as setOperationErrorName } from "./app-B2txMMB6.js";
3
- import { bb as inspect$1, bc as GraphQLError$1, bd as getNamedType, be as invariant$2, bf as isInputObjectType, bg as isScalarType, bh as isObjectType, bi as isInterfaceType, bj as isUnionType, bk as isEnumType, bl as print, bm as isPrintableAsBlockString, bn as Kind, bo as astFromValue$1, bp as DEFAULT_DEPRECATION_REASON, bq as isSpecifiedDirective, br as isSpecifiedScalarType, bs as isIntrospectionType, bt as z, bu as GraphQLScalarType, Z as pascalCase, bv as parse, bw as visit, bx as buildASTSchema, by as extendSchema, bz as getNullableType, bA as isListType, $ as getDefaultExportFromCjs, bB as snakeCase, bC as constantCase, bD as isAbstractType, bE as BREAK, bF as GraphQLInputObjectType, bG as GraphQLList, bH as GraphQLEnumType, bI as GraphQLObjectType, bJ as GraphQLInterfaceType, bK as SchemaMetaFieldDef, bL as TypeMetaFieldDef, bM as TypeNameMetaFieldDef, bN as isCompositeType, bO as isOutputType, bP as isInputType, bQ as GraphQLBoolean, bR as assertAbstractType, bS as doTypesOverlap, bT as DirectiveLocation, bU as specifiedRules$1, bV as NoUnusedFragmentsRule$1, bW as ExecutableDefinitionsRule$1, bX as validate$2, bY as validateSchema, bZ as GraphQLID, b_ as GraphQLString, b$ as GraphQLFloat, c0 as GraphQLInt, c1 as GraphQLDirective, c2 as GraphQLUnionType, c3 as isNonNullType, c4 as GraphQLNonNull, c5 as isNamedType, c6 as isLeafType, c7 as GraphQLSchema, c8 as buildSchema, c9 as sentenceCase, an as hashKey } from "./app-loader-uTr5bb-C.js";
2
+ import { t as twMerge, a6 as clsx, a7 as get, a8 as set, a9 as appendErrors, aa as useFormContext, ab as Primitive, ac as cva, ad as FormProvider, ae as Controller, af as Slot, ag as useForm, ah as Root2, ai as List, aj as Trigger, ak as Content, al as setModelName, am as setModelId, an as setModelDescription, ao as setModelExtension, ap as setAuthorName, aq as setAuthorWebsite, ar as setStateSchema, as as setInitialState, at as addModule, au as setModuleName, av as deleteModule, aw as addOperation, ax as setOperationName, ay as setOperationSchema, az as setOperationDescription, aA as deleteOperation, aB as addOperationError, aC as deleteOperationError, aD as setOperationErrorName } from "./app-B-5qYsgM.js";
3
+ import { aY as inspect$1, aZ as GraphQLError$1, a_ as getNamedType, a$ as invariant$2, b0 as isInputObjectType, b1 as isScalarType, b2 as isObjectType, b3 as isInterfaceType, b4 as isUnionType, b5 as isEnumType, b6 as print, b7 as isPrintableAsBlockString, b8 as Kind, b9 as astFromValue$1, ba as DEFAULT_DEPRECATION_REASON, bb as isSpecifiedDirective, bc as isSpecifiedScalarType, bd as isIntrospectionType, be as z, bf as GraphQLScalarType, Z as pascalCase, bg as parse, bh as visit, bi as buildASTSchema, bj as extendSchema, bk as getNullableType, bl as isListType, a0 as getDefaultExportFromCjs, bm as snakeCase, bn as constantCase, bo as isAbstractType, bp as BREAK, bq as GraphQLInputObjectType, br as GraphQLList, bs as GraphQLEnumType, bt as GraphQLObjectType, bu as GraphQLInterfaceType, bv as SchemaMetaFieldDef, bw as TypeMetaFieldDef, bx as TypeNameMetaFieldDef, by as isCompositeType, bz as isOutputType, bA as isInputType, bB as GraphQLBoolean, bC as assertAbstractType, bD as doTypesOverlap, bE as DirectiveLocation, bF as specifiedRules$1, bG as NoUnusedFragmentsRule$1, bH as ExecutableDefinitionsRule$1, bI as validate$2, al as process, bJ as validateSchema, bK as GraphQLID, bL as GraphQLString, bM as GraphQLFloat, bN as GraphQLInt, bO as GraphQLDirective, bP as GraphQLUnionType, bQ as isNonNullType, bR as GraphQLNonNull, bS as isNamedType, bT as isLeafType, bU as GraphQLSchema, bV as buildSchema, bW as sentenceCase, aq as generateId } from "./app-loader-DXPAMQYN.js";
4
4
  import * as React from "react";
5
5
  import React__default, { forwardRef, useRef, useCallback, useImperativeHandle, useEffect, useState, createContext, useContext, memo, useId, useMemo } from "react";
6
- import "./main.D6_W-5oY.js";
6
+ import "./main.B0yzXDFz.js";
7
7
  import "react-dom";
8
+ import "node:fs";
8
9
  const versionInfo = Object.freeze({
9
10
  major: 16,
10
11
  minor: 10,
@@ -46445,7 +46446,7 @@ function DocumentModelEditor(props) {
46445
46446
  resolve(void 0);
46446
46447
  return;
46447
46448
  }
46448
- const id = hashKey();
46449
+ const id = generateId();
46449
46450
  dispatch(addModule({ id, name: name2 }));
46450
46451
  resolve(id);
46451
46452
  } catch (error) {
@@ -46469,7 +46470,7 @@ function DocumentModelEditor(props) {
46469
46470
  resolve(void 0);
46470
46471
  return;
46471
46472
  }
46472
- const id = hashKey();
46473
+ const id = generateId();
46473
46474
  dispatch(addOperation({ id, moduleId, name: name2 }));
46474
46475
  resolve(id);
46475
46476
  } catch (error) {
@@ -46508,7 +46509,7 @@ function DocumentModelEditor(props) {
46508
46509
  resolve(void 0);
46509
46510
  return;
46510
46511
  }
46511
- const id = hashKey();
46512
+ const id = generateId();
46512
46513
  dispatch(addOperationError({ id, operationId, errorName }));
46513
46514
  resolve(id);
46514
46515
  } catch (error) {
@@ -46557,3 +46558,4 @@ export {
46557
46558
  DocumentModelEditor,
46558
46559
  documentModelEditorModule
46559
46560
  };
46561
+ //# sourceMappingURL=index-bTL_WhmE.js.map