@kittl/sdk 0.0.7 → 0.0.9

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/kittl-sdk.js CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  "use strict";
5
5
  (() => {
6
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/shared/commands.js
6
+
7
7
  var FROM_EXTENSION_COMMANDS = {
8
8
  /** SDK API call */
9
9
  SDK_CALL: "sdk-call",
@@ -69,7 +69,6 @@
69
69
  APP_STATE_UPDATE: "app-state-update"
70
70
  };
71
71
 
72
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/types/toExtensions.js
73
72
  var isSDKResponseMessage = (data) => {
74
73
  return typeof data === "object" && data !== null && "command" in data && data.command === TO_EXTENSION_COMMANDS.SDK_RESPONSE && "messageId" in data && typeof data.messageId === "string";
75
74
  };
@@ -92,7 +91,13 @@
92
91
  return typeof data === "object" && data !== null && "command" in data && data.command === TO_EXTENSION_COMMANDS.FILE_BROWSER_FETCH_CONTENT_REQUEST && "requestId" in data && typeof data.requestId === "string" && "subscriptionId" in data && typeof data.subscriptionId === "string";
93
92
  };
94
93
 
95
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/shared/createApiProxyCore.js
94
+ var generateMessageId = () => {
95
+ if (crypto?.randomUUID && typeof crypto.randomUUID === "function") {
96
+ return crypto.randomUUID();
97
+ }
98
+ return Math.random().toString(36).substring(7);
99
+ };
100
+
96
101
  var buildMethodPath = (rootPrefix, pathSegments) => {
97
102
  if (!rootPrefix) {
98
103
  return pathSegments.join(".");
@@ -128,10 +133,6 @@
128
133
  return createNode([]);
129
134
  };
130
135
 
131
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/shared/index.js
132
- var EDITOR_URL = typeof window !== "undefined" ? window.location?.origin : "";
133
-
134
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/utils/approvedDomain/approvedDomain.js
135
136
  var parentDomain;
136
137
  var APPROVED_EXTENSION_COMMUNICATION_DOMAINS = [
137
138
  "https://app.stagingdesigner.com",
@@ -191,14 +192,7 @@
191
192
  return parentDomain;
192
193
  };
193
194
 
194
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/messageSender.js
195
195
  var pendingRequests = /* @__PURE__ */ new Map();
196
- var generateMessageId = () => {
197
- if (crypto?.randomUUID && typeof crypto.randomUUID === "function") {
198
- return crypto.randomUUID();
199
- }
200
- return Math.random().toString(36).substring(7);
201
- };
202
196
  var postMessageToParent = (message) => {
203
197
  window.parent.postMessage(message, getParentDomain());
204
198
  };
@@ -222,7 +216,6 @@
222
216
  postMessageToParent(message);
223
217
  };
224
218
 
225
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/apiProxy/index.js
226
219
  var createSDKCallMessage = {
227
220
  ai: (dots, args, messageId) => ({
228
221
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
@@ -245,6 +238,13 @@
245
238
  messageId,
246
239
  apiType: "design"
247
240
  }),
241
+ export: (dots, args, messageId) => ({
242
+ command: FROM_EXTENSION_COMMANDS.SDK_CALL,
243
+ dots,
244
+ args,
245
+ messageId,
246
+ apiType: "export"
247
+ }),
248
248
  font: (dots, args, messageId) => ({
249
249
  command: FROM_EXTENSION_COMMANDS.SDK_CALL,
250
250
  dots,
@@ -288,7 +288,6 @@
288
288
  });
289
289
  }
290
290
 
291
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/apiProxy/aiApiProxy.js
292
291
  var generationHandlers = /* @__PURE__ */ new Map();
293
292
  var generationSubscriptions = /* @__PURE__ */ new Map();
294
293
  var dispatchAIGenerationUpdate = (subscriptionId, update) => {
@@ -390,9 +389,11 @@
390
389
  };
391
390
  }
392
391
 
393
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/apiProxy/fileBrowserApiProxy.js
394
392
  var fetchContentHandlers = /* @__PURE__ */ new Map();
395
393
  var tabIdToSubscriptionId = /* @__PURE__ */ new Map();
394
+ var removeSubscriptionHandlers = (subscriptionId) => {
395
+ fetchContentHandlers.delete(subscriptionId);
396
+ };
396
397
  var dispatchFileBrowserFetchContentRequest = (requestId, subscriptionId, params) => {
397
398
  const handler = fetchContentHandlers.get(subscriptionId);
398
399
  if (!handler) {
@@ -412,12 +413,12 @@
412
413
  next: result.next
413
414
  };
414
415
  postMessageToParent(responseMessage);
415
- }).catch((e) => {
416
+ }).catch((error) => {
416
417
  const responseMessage = {
417
418
  command: FROM_EXTENSION_COMMANDS.FILE_BROWSER_FETCH_CONTENT_RESPONSE,
418
419
  requestId,
419
420
  content: [],
420
- error: e instanceof Error ? e.message : "Unknown error"
421
+ error: error instanceof Error ? error.message : "Unknown error"
421
422
  };
422
423
  postMessageToParent(responseMessage);
423
424
  });
@@ -428,7 +429,7 @@
428
429
  const subscriptionId = generateMessageId();
429
430
  const existingSubscriptionId = tabIdToSubscriptionId.get(tab.id);
430
431
  if (existingSubscriptionId) {
431
- fetchContentHandlers.delete(existingSubscriptionId);
432
+ removeSubscriptionHandlers(existingSubscriptionId);
432
433
  }
433
434
  fetchContentHandlers.set(subscriptionId, tab.fetchContent);
434
435
  tabIdToSubscriptionId.set(tab.id, subscriptionId);
@@ -437,12 +438,14 @@
437
438
  messageId: generateMessageId(),
438
439
  tabId: tab.id,
439
440
  label: tab.label,
441
+ order: tab.order,
442
+ emptyState: tab.emptyState,
440
443
  subscriptionId
441
444
  };
442
445
  try {
443
446
  const response = await sendMessage(registerMessage);
444
447
  if (!response.isOk) {
445
- fetchContentHandlers.delete(subscriptionId);
448
+ removeSubscriptionHandlers(subscriptionId);
446
449
  tabIdToSubscriptionId.delete(tab.id);
447
450
  return {
448
451
  isOk: false,
@@ -454,7 +457,8 @@
454
457
  result: void 0
455
458
  };
456
459
  } catch {
457
- fetchContentHandlers.delete(subscriptionId);
460
+ removeSubscriptionHandlers(subscriptionId);
461
+ tabIdToSubscriptionId.delete(tab.id);
458
462
  return {
459
463
  isOk: false,
460
464
  error: {
@@ -467,7 +471,6 @@
467
471
  };
468
472
  }
469
473
 
470
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/appState/index.js
471
474
  var sendUnsubscribe = (selectorIds) => {
472
475
  const message = {
473
476
  command: FROM_EXTENSION_COMMANDS.APP_STATE_UNSUBSCRIBE,
@@ -532,105 +535,126 @@
532
535
  return { subscribe, dispatch };
533
536
  };
534
537
 
535
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/authBridge/index.js
536
- var hashPKCECode = async (input) => {
537
- const textAsBuffer = new TextEncoder().encode(input);
538
- const hashBuffer = await window.crypto.subtle.digest("SHA-256", textAsBuffer);
539
- const hashArray = new Uint8Array(hashBuffer);
540
- const binaryString = String.fromCharCode(...hashArray);
541
- const base64 = btoa(binaryString);
542
- return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
543
- };
544
- var generatePKCECode = () => {
545
- if (!window.crypto) {
546
- throw new Error("Crypto API not available");
538
+ var SandboxedAuthClient = class {
539
+ /**
540
+ * Binds the public start method because the exported SDK API may pass it
541
+ * around without its client object as the receiver.
542
+ */
543
+ constructor() {
544
+ this.startAuth = this.startAuth.bind(this);
547
545
  }
548
- const array = new Uint32Array(56);
549
- window.crypto.getRandomValues(array);
550
- return Array.from(array, (dec) => `0${dec.toString(16)}`.slice(-2)).join("");
551
- };
552
- var createAuthBridgeApi = () => {
553
- return {
554
- startAuth: async (request) => {
555
- const state = generateMessageId();
556
- let pkceCode = "";
557
- let code_verifier = "";
558
- if (request.generatePKCE) {
559
- code_verifier = generatePKCECode();
560
- pkceCode = await hashPKCECode(code_verifier);
546
+ /**
547
+ * Starts provider authentication and optionally adds an RFC 7636 PKCE
548
+ * challenge to the request. Successful responses include the verifier that
549
+ * the caller must pass to {@link exchangeCode}.
550
+ */
551
+ async startAuth(request) {
552
+ const state = generateMessageId();
553
+ let pkceCode = "";
554
+ let code_verifier = "";
555
+ if (request.generatePKCE) {
556
+ code_verifier = this.generatePKCECode();
557
+ pkceCode = await this.hashPKCECode(code_verifier);
558
+ }
559
+ const message = {
560
+ command: FROM_EXTENSION_COMMANDS.AUTH_START,
561
+ messageId: generateMessageId(),
562
+ state,
563
+ provider: request.provider,
564
+ params: {
565
+ ...request.params,
566
+ ...pkceCode ? {
567
+ code_challenge: pkceCode,
568
+ code_challenge_method: "S256"
569
+ } : {}
561
570
  }
562
- const message = {
563
- command: FROM_EXTENSION_COMMANDS.AUTH_START,
564
- messageId: generateMessageId(),
565
- state,
566
- provider: request.provider,
567
- params: {
568
- ...request.params,
569
- ...pkceCode ? {
570
- code_challenge: pkceCode,
571
- code_challenge_method: "S256"
572
- } : {}
573
- }
574
- };
575
- const response = await sendMessage(message);
576
- if (!response.isOk) {
577
- return response;
571
+ };
572
+ const response = await sendMessage(message);
573
+ if (!response.isOk) {
574
+ return response;
575
+ }
576
+ return {
577
+ ...response,
578
+ result: {
579
+ ...response.result,
580
+ code_verifier
578
581
  }
579
- return {
580
- ...response,
581
- result: {
582
- ...response.result,
583
- code_verifier
584
- }
585
- };
586
- },
587
- exchangeCode: (request) => {
588
- const message = {
589
- command: FROM_EXTENSION_COMMANDS.AUTH_EXCHANGE,
590
- messageId: generateMessageId(),
591
- code: request.code,
592
- code_verifier: request.code_verifier,
593
- provider: request.provider,
594
- params: request.params,
595
- headers: request.headers
596
- };
597
- return sendMessage(message);
598
- },
599
- getAuthToken: (request) => {
600
- const message = {
601
- command: FROM_EXTENSION_COMMANDS.AUTH_GET_TOKEN,
602
- messageId: generateMessageId(),
603
- provider: request.provider
604
- };
605
- return sendMessage(message);
606
- },
607
- refreshToken: (request) => {
608
- const message = {
609
- command: FROM_EXTENSION_COMMANDS.AUTH_REFRESH,
610
- messageId: generateMessageId(),
611
- provider: request.provider
612
- };
613
- return sendMessage(message);
614
- },
615
- logout: (request) => {
616
- const message = {
617
- command: FROM_EXTENSION_COMMANDS.AUTH_LOGOUT,
618
- messageId: generateMessageId(),
619
- provider: request.provider
620
- };
621
- return sendMessage(message);
622
- },
623
- getUserToken: () => {
624
- const message = {
625
- command: "auth-get-user-token",
626
- messageId: generateMessageId()
627
- };
628
- return sendMessage(message);
582
+ };
583
+ }
584
+ /** Exchanges the provider authorization code for an auth token. */
585
+ exchangeCode(request) {
586
+ const message = {
587
+ command: FROM_EXTENSION_COMMANDS.AUTH_EXCHANGE,
588
+ messageId: generateMessageId(),
589
+ code: request.code,
590
+ code_verifier: request.code_verifier,
591
+ provider: request.provider,
592
+ params: request.params,
593
+ headers: request.headers
594
+ };
595
+ return sendMessage(message);
596
+ }
597
+ /** Requests the current auth token for a provider. */
598
+ getAuthToken(request) {
599
+ const message = {
600
+ command: FROM_EXTENSION_COMMANDS.AUTH_GET_TOKEN,
601
+ messageId: generateMessageId(),
602
+ provider: request.provider
603
+ };
604
+ return sendMessage(message);
605
+ }
606
+ /** Refreshes the auth token for a provider. */
607
+ refreshToken(request) {
608
+ const message = {
609
+ command: FROM_EXTENSION_COMMANDS.AUTH_REFRESH,
610
+ messageId: generateMessageId(),
611
+ provider: request.provider
612
+ };
613
+ return sendMessage(message);
614
+ }
615
+ /** Logs the current user out of a provider. */
616
+ logout(request) {
617
+ const message = {
618
+ command: FROM_EXTENSION_COMMANDS.AUTH_LOGOUT,
619
+ messageId: generateMessageId(),
620
+ provider: request.provider
621
+ };
622
+ return sendMessage(message);
623
+ }
624
+ /** Requests the authenticated user's user token from the parent window. */
625
+ getUserToken() {
626
+ const message = {
627
+ command: FROM_EXTENSION_COMMANDS.AUTH_GET_USER_TOKEN,
628
+ messageId: generateMessageId()
629
+ };
630
+ return sendMessage(message);
631
+ }
632
+ /** Hashes a PKCE verifier and encodes the SHA-256 digest as Base64URL. */
633
+ async hashPKCECode(input) {
634
+ const subtle = window.crypto?.subtle;
635
+ if (!subtle) {
636
+ throw new Error("Web Crypto SubtleCrypto API not available");
629
637
  }
630
- };
638
+ const textAsBuffer = new TextEncoder().encode(input);
639
+ const hashBuffer = await subtle.digest("SHA-256", textAsBuffer);
640
+ const hashArray = new Uint8Array(hashBuffer);
641
+ const binaryString = String.fromCharCode(...hashArray);
642
+ const base64 = btoa(binaryString);
643
+ return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
644
+ }
645
+ /** Generates a high-entropy RFC 7636-compatible PKCE verifier. */
646
+ generatePKCECode() {
647
+ if (!window.crypto) {
648
+ throw new Error("Crypto API not available");
649
+ }
650
+ const array = new Uint32Array(56);
651
+ window.crypto.getRandomValues(array);
652
+ return Array.from(array, (dec) => `0${dec.toString(16)}`.slice(-2)).join(
653
+ ""
654
+ );
655
+ }
631
656
  };
632
657
 
633
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/batch/index.js
634
658
  var createBatch = async () => {
635
659
  const response = await sendMessage({
636
660
  command: FROM_EXTENSION_COMMANDS.BATCH_CREATE,
@@ -675,7 +699,6 @@
675
699
  return buildNode([]);
676
700
  };
677
701
 
678
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/context/contextBridge.js
679
702
  var createContextBridgeApi = () => {
680
703
  const contextProxy = createApiProxy("context");
681
704
  const subscriptionCallbacks = /* @__PURE__ */ new Map();
@@ -722,7 +745,6 @@
722
745
  return { api, dispatch };
723
746
  };
724
747
 
725
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/designState/index.js
726
748
  var sendUnsubscribe2 = (selectorIds) => {
727
749
  const message = {
728
750
  command: FROM_EXTENSION_COMMANDS.DESIGN_STATE_UNSUBSCRIBE,
@@ -789,7 +811,6 @@
789
811
  return { subscribe, dispatch };
790
812
  };
791
813
 
792
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers/stateless/index.js
793
814
  var createStatelessBridgeApi = () => {
794
815
  const subscribers = /* @__PURE__ */ new Map();
795
816
  return {
@@ -839,11 +860,11 @@
839
860
  };
840
861
  };
841
862
 
842
- // ../../packages/editor-core/sdk/sdk-bridge/dist/bridge/sandboxed/handlers.js
843
863
  var statelessApi = createStatelessBridgeApi();
844
864
  var designStateApi = createDesignStateBridgeApi();
845
865
  var appStateApi = createAppStateBridgeApi();
846
866
  var { api: contextApi, dispatch: dispatchContextUpdate } = createContextBridgeApi();
867
+ var authClient = new SandboxedAuthClient();
847
868
  var handleIncomingMessage = (event) => {
848
869
  const parent = window.parent;
849
870
  if (!parent || parent === window) {
@@ -897,11 +918,12 @@
897
918
  design: createApiProxy("design"),
898
919
  designStore: designStateApi,
899
920
  appStore: appStateApi,
921
+ export: createApiProxy("export"),
900
922
  font: createApiProxy("font"),
901
923
  state: createApiProxy("state"),
902
924
  upload: createApiProxy("upload"),
903
925
  fileBrowser: createFileBrowserApiProxy(),
904
- auth: createAuthBridgeApi(),
926
+ auth: authClient,
905
927
  stateless: statelessApi,
906
928
  createBatch
907
929
  };
@@ -1175,6 +1197,31 @@
1175
1197
  }
1176
1198
  };
1177
1199
 
1200
+ // src/createEditorSDKAPIs.ts
1201
+ function createEditorSDKAPIs() {
1202
+ return {
1203
+ ai: bridgeHandlers.ai,
1204
+ data: bridgeHandlers.data,
1205
+ design: bridgeHandlers.design,
1206
+ export: bridgeHandlers.export,
1207
+ designStore: bridgeHandlers.designStore,
1208
+ appStore: bridgeHandlers.appStore,
1209
+ context: bridgeHandlers.context,
1210
+ dragAndDrop: new DragAndDropApi({
1211
+ state: bridgeHandlers.state,
1212
+ context: bridgeHandlers.context,
1213
+ design: bridgeHandlers.design,
1214
+ upload: bridgeHandlers.upload
1215
+ }),
1216
+ state: bridgeHandlers.state,
1217
+ auth: bridgeHandlers.auth,
1218
+ upload: bridgeHandlers.upload,
1219
+ stateless: bridgeHandlers.stateless,
1220
+ font: bridgeHandlers.font,
1221
+ createBatch: bridgeHandlers.createBatch
1222
+ };
1223
+ }
1224
+
1178
1225
  // src/utils/syncHtmlDataThemeFromHostContext.ts
1179
1226
  async function syncHtmlDataThemeFromHostContext(kittl2) {
1180
1227
  if (typeof document === "undefined") {
@@ -1193,44 +1240,47 @@
1193
1240
  });
1194
1241
  }
1195
1242
 
1196
- // src/index.ts
1197
- var kittl = {
1198
- onLoadedCallback: null,
1199
- loaded: false,
1200
- onReady: (cb) => {
1201
- if (kittl.loaded) {
1202
- cb();
1203
- return;
1204
- }
1205
- kittl.onLoadedCallback = cb;
1206
- },
1207
- ...bridgeHandlers,
1208
- dragAndDrop: new DragAndDropApi({
1209
- state: bridgeHandlers.state,
1210
- context: bridgeHandlers.context,
1211
- design: bridgeHandlers.design,
1212
- upload: bridgeHandlers.upload
1213
- })
1214
- };
1215
- var initSdk = () => {
1216
- kittl.loaded = true;
1217
- window.addEventListener(
1218
- "message",
1219
- (event) => {
1220
- handleIncomingMessage(event);
1243
+ // src/createKittlSDK.ts
1244
+ function createKittlSDK(apis) {
1245
+ const kittl2 = {
1246
+ onLoadedCallback: null,
1247
+ loaded: false,
1248
+ onReady: (callback) => {
1249
+ if (kittl2.loaded) {
1250
+ callback();
1251
+ return;
1252
+ }
1253
+ kittl2.onLoadedCallback = callback;
1254
+ },
1255
+ ...apis
1256
+ };
1257
+ const initSdk = () => {
1258
+ kittl2.loaded = true;
1259
+ window.addEventListener(
1260
+ "message",
1261
+ (event) => {
1262
+ handleIncomingMessage(event);
1263
+ }
1264
+ );
1265
+ void syncHtmlDataThemeFromHostContext(kittl2).then(() => {
1266
+ kittl2.onLoadedCallback?.();
1267
+ sendLoaded();
1268
+ });
1269
+ };
1270
+ if (typeof document !== "undefined" && typeof window !== "undefined") {
1271
+ window.kittl = kittl2;
1272
+ if (document.readyState === "loading") {
1273
+ document.addEventListener("DOMContentLoaded", initSdk);
1274
+ } else {
1275
+ initSdk();
1221
1276
  }
1222
- );
1223
- void syncHtmlDataThemeFromHostContext(kittl).then(() => {
1224
- kittl.onLoadedCallback?.();
1225
- sendLoaded();
1226
- });
1227
- };
1228
- if (typeof document !== "undefined" && typeof window !== "undefined") {
1229
- window.kittl = kittl;
1230
- if (document.readyState === "loading") {
1231
- document.addEventListener("DOMContentLoaded", initSdk);
1232
- } else {
1233
- initSdk();
1234
1277
  }
1278
+ return kittl2;
1235
1279
  }
1280
+
1281
+ // src/index.ts
1282
+ var kittl = createKittlSDK({
1283
+ ...createEditorSDKAPIs(),
1284
+ fileBrowser: bridgeHandlers.fileBrowser
1285
+ });
1236
1286
  })();