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