@plaidev/karte-action-sdk 1.1.179-28041859.8b5339d0 → 1.1.180-28041937.24d05b80

Sign up to get free protection for your applications and to get access to all the features.
@@ -275,10 +275,6 @@ const NOOP = (_args) => { }; // eslint-disable-line @typescript-eslint/no-unused
275
275
  const isPreview = () => {
276
276
  return true;
277
277
  };
278
- // prettier-ignore
279
- /** @internal */
280
- const actionId = ALL_ACTION_ID
281
- ;
282
278
  /** @internal */
283
279
  const setPreviousFocus = () => {
284
280
  const previously_focused = typeof document !== 'undefined' && document.activeElement;
@@ -1035,6 +1031,47 @@ function cloneToJson(data) {
1035
1031
  }
1036
1032
  }
1037
1033
 
1034
+ // prettier-ignore
1035
+ /** @internal */
1036
+ const actionId = ALL_ACTION_ID
1037
+ ;
1038
+ /** @internal */
1039
+ const ACTION_DESTROY_EVENT = `KARTE-ACTION-DESTROY-${actionId}`;
1040
+ /** @internal */
1041
+ const ACTION_SHOW_EVENT = `KARTE-ACTION-SHOW-${actionId}`;
1042
+ /** @internal */
1043
+ const ACTION_CLOSE_EVENT = `KARTE-ACTION-CLOSE-${actionId}`;
1044
+ /** @internal */
1045
+ const ACTION_CHANGE_STATE_EVENT = `KARTE-ACTION-CHANGE-STATE-${actionId}`;
1046
+ /** @internal */
1047
+ const send_event = (event_name, values) => {
1048
+ const setting = getSetting();
1049
+ setting?.send?.(event_name, values);
1050
+ };
1051
+ /** @internal */
1052
+ const initialize = (setting) => {
1053
+ const newSetting = setSetting(setting);
1054
+ if (newSetting.initialState) {
1055
+ setState$1(newSetting.initialState);
1056
+ }
1057
+ setOpened(true);
1058
+ setClosed(false); // deprecated
1059
+ return () => finalize();
1060
+ };
1061
+ /** @internal */
1062
+ const finalize = () => {
1063
+ resetSetting();
1064
+ };
1065
+ /**
1066
+ * Dispatch the event to destroy KARTE action
1067
+ *
1068
+ * @internal
1069
+ */
1070
+ function dispatchDestroyEvent() {
1071
+ const event = new CustomEvent(ACTION_DESTROY_EVENT);
1072
+ window.dispatchEvent(event);
1073
+ }
1074
+
1038
1075
  /**
1039
1076
  * モーダル(ポップアップ)のロジックを管理する
1040
1077
  */
@@ -1130,20 +1167,6 @@ function showOnTime(props, show = NOOP) {
1130
1167
  : null;
1131
1168
  }
1132
1169
 
1133
- /** @internal */
1134
- const ACTION_DESTROY_EVENT = `KARTE-ACTION-DESTROY-${actionId}`;
1135
- /** @internal */
1136
- const ACTION_SHOW_EVENT = `KARTE-ACTION-SHOW-${actionId}`;
1137
- /** @internal */
1138
- const ACTION_CLOSE_EVENT = `KARTE-ACTION-CLOSE-${actionId}`;
1139
- /** @internal */
1140
- const ACTION_CHANGE_STATE_EVENT = `KARTE-ACTION-CHANGE-STATE-${actionId}`;
1141
- /** @internal */
1142
- const send_event = (event_name, values) => {
1143
- const setting = getSetting();
1144
- setting?.send?.(event_name, values);
1145
- };
1146
-
1147
1170
  /**
1148
1171
  * アクションテーブルに関連するコードの管理
1149
1172
  */
@@ -1199,6 +1222,7 @@ function collection$1(config) {
1199
1222
  },
1200
1223
  };
1201
1224
  }
1225
+ /** @internal */
1202
1226
  function request(url, data, cb) {
1203
1227
  console.debug('[debug] request', isPreview(), url, JSON.stringify(data));
1204
1228
  fetch(url, {
@@ -1226,6 +1250,7 @@ const loadActionTableRows = async (config, api_key, endpoint) => {
1226
1250
  const loadActionTableQuery = async (config, api_key, endpoint) => {
1227
1251
  return new Promise((resolve, reject) => collection$1({ endpoint, api_key, table: config.query.table_name }).getByQuery(config.query.query_name, config.query.params, null, (err, data) => (err ? reject(err) : resolve(data))));
1228
1252
  };
1253
+ /** @internal */
1229
1254
  const loadActionTable = async (config, api_key, endpoint) => {
1230
1255
  console.debug('[debug] loadActionTable', isPreview(), api_key, endpoint, JSON.stringify(config));
1231
1256
  const results = config.map(c => c.preview_value)
@@ -1238,13 +1263,23 @@ const loadActionTable = async (config, api_key, endpoint) => {
1238
1263
  return acc;
1239
1264
  }, {});
1240
1265
  };
1266
+ /** @internal */
1267
+ async function setupActionTable(localVariablesQuery, apiKey) {
1268
+ const result = await loadActionTable(localVariablesQuery, apiKey);
1269
+ let success = false;
1270
+ if (Object.keys(result).length === localVariablesQuery.length) {
1271
+ setVariables(result);
1272
+ success = true;
1273
+ }
1274
+ return {
1275
+ success,
1276
+ };
1277
+ }
1241
1278
 
1242
1279
  /**
1243
- * Edgeが起動するアクションに関連するコードを管理する
1244
- *
1245
- * アクションのCreate, Destroyの状態はここで管理する。
1280
+ * モーダル(ポップアップ)に関連するコードの管理
1246
1281
  *
1247
- * FIXME: モーダルなどの機能ごとのコードを分離したい
1282
+ * アクションのShow, Close, ChangeStateの状態はここで管理する。
1248
1283
  */
1249
1284
  /** @internal */
1250
1285
  const handleState = (event) => {
@@ -1253,36 +1288,183 @@ const handleState = (event) => {
1253
1288
  setState$1(event.detail.to, { disableInPreview: event.detail.disableInPreview });
1254
1289
  }
1255
1290
  };
1256
- /** @internal */
1257
- const initialize = (setting) => {
1258
- const newSetting = setSetting(setting);
1259
- if (newSetting.initialState) {
1260
- setState$1(newSetting.initialState);
1291
+ /**
1292
+ * アクションが表示 (show) された後にフックする関数
1293
+ *
1294
+ * @param fn - 呼び出されるフック関数
1295
+ *
1296
+ * @public
1297
+ */
1298
+ function onShow(fn) {
1299
+ let { onShowHandlers } = getInternalHandlers();
1300
+ if (!onShowHandlers) {
1301
+ onShowHandlers = [];
1261
1302
  }
1262
- setOpened(true);
1263
- setClosed(false); // deprecated
1264
- return () => finalize();
1265
- };
1266
- /** @internal */
1267
- const finalize = () => {
1268
- resetSetting();
1269
- };
1303
+ onShowHandlers.push(fn);
1304
+ setInternalHandlers({ onShowHandlers });
1305
+ }
1270
1306
  /**
1271
- * アクションを作成する
1307
+ * アクションがクローズ (close) される前にフックする関数
1272
1308
  *
1273
- * @param App - Svelte コンポーネントのエントリポイント
1274
- * @param options - {@link ActionOptions | オプション}
1309
+ * @param fn - 呼び出されるフック関数
1275
1310
  *
1276
- * @returns アクションを破棄する関数
1311
+ * @public
1312
+ */
1313
+ function onClose(fn) {
1314
+ let { onCloseHandlers } = getInternalHandlers();
1315
+ if (!onCloseHandlers) {
1316
+ onCloseHandlers = [];
1317
+ }
1318
+ onCloseHandlers.push(fn);
1319
+ setInternalHandlers({ onCloseHandlers });
1320
+ }
1321
+ /**
1322
+ * アクションのステートが変更された (changeState) 後にフックする関数
1323
+ *
1324
+ * @param fn - 呼び出されるフック関数
1277
1325
  *
1278
1326
  * @public
1279
1327
  */
1280
- function create(App, options = {
1328
+ function onChangeState(fn) {
1329
+ let { onChangeStateHandlers } = getInternalHandlers();
1330
+ if (!onChangeStateHandlers) {
1331
+ onChangeStateHandlers = [];
1332
+ }
1333
+ onChangeStateHandlers.push(fn);
1334
+ setInternalHandlers({ onChangeStateHandlers });
1335
+ }
1336
+ /**
1337
+ * アクションを表示する
1338
+ *
1339
+ * @public
1340
+ */
1341
+ function showAction() {
1342
+ const event = new CustomEvent(ACTION_SHOW_EVENT, { detail: { trigger: 'custom' } });
1343
+ window.dispatchEvent(event);
1344
+ }
1345
+ /**
1346
+ * アクションを閉じる
1347
+ *
1348
+ * @param trigger - 閉じた時のトリガー。デフォルト `'none'`
1349
+ *
1350
+ * @public
1351
+ */
1352
+ function closeAction(trigger = 'none') {
1353
+ const event = new CustomEvent(ACTION_CLOSE_EVENT, { detail: { trigger } });
1354
+ window.dispatchEvent(event);
1355
+ }
1356
+ /**
1357
+ * アクションに CSS を適用する
1358
+ *
1359
+ * @param css - 適用する CSS
1360
+ *
1361
+ * @returns 適用された style 要素を返す Promise
1362
+ *
1363
+ * @public
1364
+ */
1365
+ async function applyCss(css) {
1366
+ return new Promise((resolve, reject) => {
1367
+ const style = document.createElement('style');
1368
+ style.textContent = css;
1369
+ const shadowRoot = getActionRoot();
1370
+ if (!shadowRoot)
1371
+ return;
1372
+ shadowRoot.append(style);
1373
+ style.addEventListener('load', () => resolve(style));
1374
+ style.addEventListener('error', () => reject(style));
1375
+ });
1376
+ }
1377
+ async function fixFontFaceIssue(href, cssRules) {
1378
+ const css = new CSSStyleSheet();
1379
+ // @ts-ignore
1380
+ await css.replace(cssRules);
1381
+ const rules = [];
1382
+ const fixedRules = [];
1383
+ Array.from(css.cssRules).forEach(cssRule => {
1384
+ if (cssRule.type !== 5) {
1385
+ rules.push(cssRule.cssText);
1386
+ }
1387
+ // type 5 is @font-face
1388
+ const split = href.split('/');
1389
+ const stylePath = split.slice(0, split.length - 1).join('/');
1390
+ const cssText = cssRule.cssText;
1391
+ const newCssText = cssText.replace(
1392
+ // relative paths
1393
+ /url\s*\(\s*['"]?(?!((\/)|((?:https?:)?\/\/)|(?:data:?:)))([^'")]+)['"]?\s*\)/g, `url("${stylePath}/$4")`);
1394
+ if (cssText === newCssText)
1395
+ return;
1396
+ fixedRules.push(newCssText);
1397
+ });
1398
+ return [rules.join('\n'), fixedRules.join('\n')];
1399
+ }
1400
+ /**
1401
+ * アクションにグローバルなスタイルを読み込む
1402
+ *
1403
+ * @param href - style ファイルのリンク URL
1404
+ *
1405
+ * @public
1406
+ */
1407
+ async function loadStyle(href) {
1408
+ const sr = getActionRoot();
1409
+ if (!sr)
1410
+ return;
1411
+ let cssRules = '';
1412
+ try {
1413
+ const res = await fetch(href);
1414
+ cssRules = await res.text();
1415
+ }
1416
+ catch (e) {
1417
+ // pass
1418
+ }
1419
+ if (!cssRules)
1420
+ return;
1421
+ // Chromeのバグで、Shadow Rootの@font-faceを絶対パスで指定する必要がある
1422
+ // @see https://stackoverflow.com/a/63717709
1423
+ const [rules, fontFaceRules] = await fixFontFaceIssue(href, cssRules);
1424
+ const css = new CSSStyleSheet();
1425
+ // @ts-ignore
1426
+ await css.replace(rules);
1427
+ const fontFaceCss = new CSSStyleSheet();
1428
+ // @ts-ignore
1429
+ await fontFaceCss.replace(fontFaceRules);
1430
+ // @ts-ignore
1431
+ sr.adoptedStyleSheets = [...sr.adoptedStyleSheets, css, fontFaceCss];
1432
+ // Chromeのバグで、ページとShadow Rootの両方に、@font-faceを設定する必要がある
1433
+ // @see https://stackoverflow.com/a/63717709
1434
+ // @ts-ignore
1435
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, css, fontFaceCss];
1436
+ }
1437
+ // @internal
1438
+ function getCssVariables(data) {
1439
+ return Object.entries(data)
1440
+ .filter(([key, value]) => {
1441
+ return ['string', 'number'].includes(typeof value) && key.startsWith('--');
1442
+ })
1443
+ .map(([key, value]) => `${key}:${value}`)
1444
+ .join(';');
1445
+ }
1446
+ /**
1447
+ * アクションのルートの DOM 要素を取得する
1448
+ *
1449
+ * @returns アクションがルートの DOM 要素 を持つ場合は DOM 要素を返します。ない場合は `null` を返します
1450
+ *
1451
+ * @public
1452
+ */
1453
+ function getActionRoot() {
1454
+ const root = document.querySelector(`.${KARTE_ACTION_ROOT}[data-${KARTE_ACTION_RID}='${actionId}']`);
1455
+ if (!root?.shadowRoot) {
1456
+ return null;
1457
+ }
1458
+ return root.shadowRoot;
1459
+ }
1460
+ /** @internal */
1461
+ function createModal(App, options = {
1281
1462
  send: () => { },
1282
1463
  publish: () => { },
1283
1464
  props: {},
1284
1465
  variables: {},
1285
1466
  localVariablesQuery: undefined,
1467
+ karteTemplate: {},
1286
1468
  }) {
1287
1469
  let app = null;
1288
1470
  const data = {
@@ -1295,19 +1477,6 @@ function create(App, options = {
1295
1477
  publish: options.publish,
1296
1478
  data,
1297
1479
  };
1298
- const handleDestroy = () => {
1299
- const { onDestroyHandlers } = getInternalHandlers();
1300
- onDestroyHandlers?.forEach(h => {
1301
- const actionHookLog = { name: 'onDestroy' };
1302
- console.info(`${ACTION_HOOK_LABEL}:${JSON.stringify(actionHookLog)}`);
1303
- h(actionProps);
1304
- });
1305
- // 旧Widget APIの内部で利用するため、実行ログは出力しない
1306
- const { onDestroyHandlers: onDestroyWidgetHandlers } = getWidgetHandlers();
1307
- if (onDestroyWidgetHandlers) {
1308
- onDestroyWidgetHandlers.forEach(h => h(actionProps));
1309
- }
1310
- };
1311
1480
  const close = (trigger = 'none') => {
1312
1481
  if (!app) {
1313
1482
  return NOOP;
@@ -1399,39 +1568,20 @@ function create(App, options = {
1399
1568
  };
1400
1569
  // ここからメインの処理
1401
1570
  initialize({ send: options.send, initialState: data.initial_state });
1402
- setSystem({
1403
- // @ts-ignore
1404
- apiKey: data.api_key || null,
1405
- shortenId: data.shorten_id || null,
1406
- campaignId: data.campaign_id || null,
1407
- });
1408
1571
  // ActionTable APIへの非同期リクエスト
1409
1572
  let actionTablePromise = null;
1410
1573
  if (options.localVariablesQuery && data.api_key) {
1411
- actionTablePromise = (async () => {
1412
- const result = await loadActionTable(options.localVariablesQuery, data.api_key);
1413
- let success = false;
1414
- if (Object.keys(result).length === options.localVariablesQuery.length) {
1415
- setVariables(result);
1416
- success = true;
1417
- }
1418
- return {
1419
- success,
1420
- };
1421
- })();
1574
+ actionTablePromise = setupActionTable(options.localVariablesQuery, data.api_key);
1422
1575
  }
1423
1576
  // NOTE: onCreateより前にListenする必要がある
1424
1577
  window.addEventListener(ACTION_SHOW_EVENT, handleShow);
1425
1578
  window.addEventListener(ACTION_CLOSE_EVENT, handleClose);
1426
1579
  window.addEventListener(ACTION_CHANGE_STATE_EVENT, handleState);
1427
- window.addEventListener(ACTION_DESTROY_EVENT, handleDestroy);
1428
- window.addEventListener('beforeunload', dispatchDestroyEvent, false);
1429
1580
  let showTriggerCleanups = [];
1430
1581
  let closeTriggerCleanups = [];
1431
1582
  {
1432
1583
  autoShow();
1433
1584
  }
1434
- const loggerCleanup = listenConsoleLogger() ;
1435
1585
  // 旧Widget API IFの処理
1436
1586
  const { onCreateHandlers } = getInternalHandlers();
1437
1587
  if (onCreateHandlers) {
@@ -1440,7 +1590,6 @@ function create(App, options = {
1440
1590
  console.debug(`${ACTION_HOOK_LABEL}: onCreate`);
1441
1591
  });
1442
1592
  }
1443
- // カスタムスクリプトの処理
1444
1593
  if (options.onCreate) {
1445
1594
  options.onCreate(actionProps);
1446
1595
  }
@@ -1452,9 +1601,6 @@ function create(App, options = {
1452
1601
  window.removeEventListener(ACTION_SHOW_EVENT, handleShow);
1453
1602
  window.removeEventListener(ACTION_CLOSE_EVENT, handleClose);
1454
1603
  window.removeEventListener(ACTION_CHANGE_STATE_EVENT, handleState);
1455
- window.removeEventListener(ACTION_DESTROY_EVENT, handleDestroy);
1456
- window.removeEventListener('beforeunload', dispatchDestroyEvent, false);
1457
- loggerCleanup();
1458
1604
  };
1459
1605
  return appCleanup;
1460
1606
  }
@@ -1482,53 +1628,13 @@ function ensureActionRoot(useShadow = true) {
1482
1628
  }
1483
1629
  }
1484
1630
  /**
1485
- * Dispatch the event to destroy KARTE action
1486
- *
1487
- * @internal
1488
- */
1489
- function dispatchDestroyEvent() {
1490
- const event = new CustomEvent(ACTION_DESTROY_EVENT);
1491
- window.dispatchEvent(event);
1492
- }
1493
- /**
1494
- * アクションの破棄する
1495
- *
1496
- * @public
1497
- */
1498
- function destroyAction() {
1499
- setDestroyed(true);
1500
- dispatchDestroyEvent();
1501
- }
1502
- /**
1503
- * アクションが作成 (create) される前にフックする関数
1504
- *
1505
- * @param fn - 呼び出されるフック関数
1506
- *
1507
- * @public
1508
- */
1509
- function onCreate(fn) {
1510
- let { onCreateHandlers } = getInternalHandlers();
1511
- if (!onCreateHandlers) {
1512
- onCreateHandlers = [];
1513
- }
1514
- onCreateHandlers.push(fn);
1515
- setInternalHandlers({ onCreateHandlers });
1516
- }
1517
- /**
1518
- * アクションが破棄 (destroy) される前にフックする関数
1631
+ * 非推奨
1519
1632
  *
1520
- * @param fn - 呼び出されるフック関数
1633
+ * @deprecated 非推奨
1521
1634
  *
1522
- * @public
1635
+ * @internal
1523
1636
  */
1524
- function onDestroy(fn) {
1525
- let { onDestroyHandlers } = getInternalHandlers();
1526
- if (!onDestroyHandlers) {
1527
- onDestroyHandlers = [];
1528
- }
1529
- onDestroyHandlers.push(fn);
1530
- setInternalHandlers({ onDestroyHandlers });
1531
- }
1637
+ const show = showAction;
1532
1638
  /**
1533
1639
  * 非推奨
1534
1640
  *
@@ -1536,7 +1642,7 @@ function onDestroy(fn) {
1536
1642
  *
1537
1643
  * @internal
1538
1644
  */
1539
- const showModal = create;
1645
+ const close = closeAction;
1540
1646
  /**
1541
1647
  * 非推奨
1542
1648
  *
@@ -1594,17 +1700,6 @@ function createApp(App, options = {
1594
1700
  },
1595
1701
  };
1596
1702
  }
1597
- /**
1598
- * 非推奨
1599
- *
1600
- * @deprecated 非推奨
1601
- *
1602
- * @internal
1603
- */
1604
- function destroy() {
1605
- setDestroyed(true);
1606
- dispatchDestroyEvent();
1607
- }
1608
1703
  /**
1609
1704
  * 非推奨
1610
1705
  *
@@ -1641,6 +1736,42 @@ function createFog({ color = '#000', opacity = '50%', zIndex = 999, onclick, })
1641
1736
  /**
1642
1737
  * スクリプト接客が利用するコードの管理
1643
1738
  */
1739
+ /** @internal */
1740
+ async function runScript$1(options = {
1741
+ send: () => { },
1742
+ publish: () => { },
1743
+ props: {},
1744
+ variables: {},
1745
+ localVariablesQuery: undefined,
1746
+ karteTemplate: {},
1747
+ }) {
1748
+ if (!options.onCreate)
1749
+ return;
1750
+ const data = {
1751
+ ...options.props,
1752
+ ...options.variables,
1753
+ ...getVariables(),
1754
+ };
1755
+ const actionProps = {
1756
+ send: options.send,
1757
+ publish: options.publish,
1758
+ data,
1759
+ };
1760
+ initialize({ send: options.send, initialState: data.initial_state });
1761
+ const { success } = await setupActionTable(options.localVariablesQuery, data.api_key);
1762
+ if (!success)
1763
+ return;
1764
+ // 旧Widget API IFの処理
1765
+ const { onCreateHandlers } = getInternalHandlers();
1766
+ if (onCreateHandlers) {
1767
+ onCreateHandlers.forEach(h => {
1768
+ h({ send: options.send, publish: options.publish, data });
1769
+ console.debug(`${ACTION_HOOK_LABEL}: onCreate`);
1770
+ });
1771
+ }
1772
+ options.onCreate(actionProps);
1773
+ finalize();
1774
+ }
1644
1775
  /**
1645
1776
  * ES Modules に対応していない JavaScript をページに読み込む
1646
1777
  *
@@ -1701,178 +1832,112 @@ async function loadGlobalStyle(href) {
1701
1832
  }
1702
1833
 
1703
1834
  /**
1704
- * モーダル(ポップアップ)に関連するコードの管理
1835
+ * Edgeが起動するアクションに関連するコードを管理する
1705
1836
  *
1706
- * アクションのShow, Close, ChangeStateの状態はここで管理する。
1837
+ * アクションのCreate, Destroyの状態はここで管理する。
1707
1838
  */
1708
1839
  /**
1709
- * アクションが表示 (show) された後にフックする関数
1710
- *
1711
- * @param fn - 呼び出されるフック関数
1840
+ * アクションを作成する
1712
1841
  *
1713
- * @public
1714
- */
1715
- function onShow(fn) {
1716
- let { onShowHandlers } = getInternalHandlers();
1717
- if (!onShowHandlers) {
1718
- onShowHandlers = [];
1719
- }
1720
- onShowHandlers.push(fn);
1721
- setInternalHandlers({ onShowHandlers });
1722
- }
1723
- /**
1724
- * アクションがクローズ (close) される前にフックする関数
1842
+ * @param App - Svelte コンポーネントのエントリポイント
1843
+ * @param options - {@link ActionOptions | オプション}
1725
1844
  *
1726
- * @param fn - 呼び出されるフック関数
1845
+ * @returns アクションを破棄する関数
1727
1846
  *
1728
1847
  * @public
1729
1848
  */
1730
- function onClose(fn) {
1731
- let { onCloseHandlers } = getInternalHandlers();
1732
- if (!onCloseHandlers) {
1733
- onCloseHandlers = [];
1849
+ function create(App, options = {
1850
+ send: () => { },
1851
+ publish: () => { },
1852
+ props: {},
1853
+ variables: {},
1854
+ localVariablesQuery: undefined,
1855
+ karteTemplate: {},
1856
+ }) {
1857
+ const data = {
1858
+ ...options.props,
1859
+ ...options.variables,
1860
+ ...getVariables(),
1861
+ };
1862
+ const actionProps = {
1863
+ send: options.send,
1864
+ publish: options.publish,
1865
+ data,
1866
+ };
1867
+ const handleDestroy = () => {
1868
+ const { onDestroyHandlers } = getInternalHandlers();
1869
+ onDestroyHandlers?.forEach(h => {
1870
+ const actionHookLog = { name: 'onDestroy' };
1871
+ console.info(`${ACTION_HOOK_LABEL}:${JSON.stringify(actionHookLog)}`);
1872
+ h(actionProps);
1873
+ });
1874
+ // 旧Widget APIの内部で利用するため、実行ログは出力しない
1875
+ const { onDestroyHandlers: onDestroyWidgetHandlers } = getWidgetHandlers();
1876
+ if (onDestroyWidgetHandlers) {
1877
+ onDestroyWidgetHandlers.forEach(h => h(actionProps));
1878
+ }
1879
+ };
1880
+ // ここからメインの処理
1881
+ setSystem({
1882
+ // @ts-ignore
1883
+ apiKey: data.api_key || null,
1884
+ shortenId: data.shorten_id || null,
1885
+ campaignId: data.campaign_id || null,
1886
+ });
1887
+ const loggerCleanup = listenConsoleLogger() ;
1888
+ window.addEventListener(ACTION_DESTROY_EVENT, handleDestroy);
1889
+ window.addEventListener('beforeunload', dispatchDestroyEvent, false);
1890
+ let modalCleanup = NOOP;
1891
+ if (options.karteTemplate?.template_type === 'script') {
1892
+ runScript$1(options);
1734
1893
  }
1735
- onCloseHandlers.push(fn);
1736
- setInternalHandlers({ onCloseHandlers });
1737
- }
1738
- /**
1739
- * アクションのステートが変更された (changeState) 後にフックする関数
1740
- *
1741
- * @param fn - 呼び出されるフック関数
1742
- *
1743
- * @public
1744
- */
1745
- function onChangeState(fn) {
1746
- let { onChangeStateHandlers } = getInternalHandlers();
1747
- if (!onChangeStateHandlers) {
1748
- onChangeStateHandlers = [];
1894
+ else {
1895
+ modalCleanup = createModal(App, options);
1749
1896
  }
1750
- onChangeStateHandlers.push(fn);
1751
- setInternalHandlers({ onChangeStateHandlers });
1752
- }
1753
- /**
1754
- * アクションを表示する
1755
- *
1756
- * @public
1757
- */
1758
- function showAction() {
1759
- const event = new CustomEvent(ACTION_SHOW_EVENT, { detail: { trigger: 'custom' } });
1760
- window.dispatchEvent(event);
1761
- }
1762
- /**
1763
- * アクションを閉じる
1764
- *
1765
- * @param trigger - 閉じた時のトリガー。デフォルト `'none'`
1766
- *
1767
- * @public
1768
- */
1769
- function closeAction(trigger = 'none') {
1770
- const event = new CustomEvent(ACTION_CLOSE_EVENT, { detail: { trigger } });
1771
- window.dispatchEvent(event);
1897
+ return () => {
1898
+ loggerCleanup();
1899
+ modalCleanup();
1900
+ window.removeEventListener(ACTION_DESTROY_EVENT, handleDestroy);
1901
+ };
1772
1902
  }
1773
1903
  /**
1774
- * アクションに CSS を適用する
1775
- *
1776
- * @param css - 適用する CSS
1777
- *
1778
- * @returns 適用された style 要素を返す Promise
1904
+ * アクションの破棄する
1779
1905
  *
1780
1906
  * @public
1781
1907
  */
1782
- async function applyCss(css) {
1783
- return new Promise((resolve, reject) => {
1784
- const style = document.createElement('style');
1785
- style.textContent = css;
1786
- const shadowRoot = getActionRoot();
1787
- if (!shadowRoot)
1788
- return;
1789
- shadowRoot.append(style);
1790
- style.addEventListener('load', () => resolve(style));
1791
- style.addEventListener('error', () => reject(style));
1792
- });
1793
- }
1794
- async function fixFontFaceIssue(href, cssRules) {
1795
- const css = new CSSStyleSheet();
1796
- // @ts-ignore
1797
- await css.replace(cssRules);
1798
- const rules = [];
1799
- const fixedRules = [];
1800
- Array.from(css.cssRules).forEach(cssRule => {
1801
- if (cssRule.type !== 5) {
1802
- rules.push(cssRule.cssText);
1803
- }
1804
- // type 5 is @font-face
1805
- const split = href.split('/');
1806
- const stylePath = split.slice(0, split.length - 1).join('/');
1807
- const cssText = cssRule.cssText;
1808
- const newCssText = cssText.replace(
1809
- // relative paths
1810
- /url\s*\(\s*['"]?(?!((\/)|((?:https?:)?\/\/)|(?:data:?:)))([^'")]+)['"]?\s*\)/g, `url("${stylePath}/$4")`);
1811
- if (cssText === newCssText)
1812
- return;
1813
- fixedRules.push(newCssText);
1814
- });
1815
- return [rules.join('\n'), fixedRules.join('\n')];
1908
+ function destroyAction() {
1909
+ setDestroyed(true);
1910
+ dispatchDestroyEvent();
1816
1911
  }
1817
1912
  /**
1818
- * アクションにグローバルなスタイルを読み込む
1913
+ * アクションが作成 (create) される前にフックする関数
1819
1914
  *
1820
- * @param href - style ファイルのリンク URL
1915
+ * @param fn - 呼び出されるフック関数
1821
1916
  *
1822
1917
  * @public
1823
1918
  */
1824
- async function loadStyle(href) {
1825
- const sr = getActionRoot();
1826
- if (!sr)
1827
- return;
1828
- let cssRules = '';
1829
- try {
1830
- const res = await fetch(href);
1831
- cssRules = await res.text();
1832
- }
1833
- catch (e) {
1834
- // pass
1919
+ function onCreate(fn) {
1920
+ let { onCreateHandlers } = getInternalHandlers();
1921
+ if (!onCreateHandlers) {
1922
+ onCreateHandlers = [];
1835
1923
  }
1836
- if (!cssRules)
1837
- return;
1838
- // Chromeのバグで、Shadow Rootの@font-faceを絶対パスで指定する必要がある
1839
- // @see https://stackoverflow.com/a/63717709
1840
- const [rules, fontFaceRules] = await fixFontFaceIssue(href, cssRules);
1841
- const css = new CSSStyleSheet();
1842
- // @ts-ignore
1843
- await css.replace(rules);
1844
- const fontFaceCss = new CSSStyleSheet();
1845
- // @ts-ignore
1846
- await fontFaceCss.replace(fontFaceRules);
1847
- // @ts-ignore
1848
- sr.adoptedStyleSheets = [...sr.adoptedStyleSheets, css, fontFaceCss];
1849
- // Chromeのバグで、ページとShadow Rootの両方に、@font-faceを設定する必要がある
1850
- // @see https://stackoverflow.com/a/63717709
1851
- // @ts-ignore
1852
- document.adoptedStyleSheets = [...document.adoptedStyleSheets, css, fontFaceCss];
1853
- }
1854
- // @internal
1855
- function getCssVariables(data) {
1856
- return Object.entries(data)
1857
- .filter(([key, value]) => {
1858
- return ['string', 'number'].includes(typeof value) && key.startsWith('--');
1859
- })
1860
- .map(([key, value]) => `${key}:${value}`)
1861
- .join(';');
1924
+ onCreateHandlers.push(fn);
1925
+ setInternalHandlers({ onCreateHandlers });
1862
1926
  }
1863
1927
  /**
1864
- * アクションのルートの DOM 要素を取得する
1928
+ * アクションが破棄 (destroy) される前にフックする関数
1865
1929
  *
1866
- * @returns アクションがルートの DOM 要素 を持つ場合は DOM 要素を返します。ない場合は `null` を返します
1930
+ * @param fn - 呼び出されるフック関数
1867
1931
  *
1868
1932
  * @public
1869
1933
  */
1870
- function getActionRoot() {
1871
- const root = document.querySelector(`.${KARTE_ACTION_ROOT}[data-${KARTE_ACTION_RID}='${actionId}']`);
1872
- if (!root?.shadowRoot) {
1873
- return null;
1934
+ function onDestroy(fn) {
1935
+ let { onDestroyHandlers } = getInternalHandlers();
1936
+ if (!onDestroyHandlers) {
1937
+ onDestroyHandlers = [];
1874
1938
  }
1875
- return root.shadowRoot;
1939
+ onDestroyHandlers.push(fn);
1940
+ setInternalHandlers({ onDestroyHandlers });
1876
1941
  }
1877
1942
  // -------- The following codes are deprecated --------
1878
1943
  /**
@@ -1882,7 +1947,7 @@ function getActionRoot() {
1882
1947
  *
1883
1948
  * @internal
1884
1949
  */
1885
- const show = showAction;
1950
+ const showModal = create;
1886
1951
  /**
1887
1952
  * 非推奨
1888
1953
  *
@@ -1890,7 +1955,10 @@ const show = showAction;
1890
1955
  *
1891
1956
  * @internal
1892
1957
  */
1893
- const close = closeAction;
1958
+ function destroy() {
1959
+ setDestroyed(true);
1960
+ dispatchDestroyEvent();
1961
+ }
1894
1962
 
1895
1963
  /**
1896
1964
  * エディタv1のWidget API 互換のインターフェース
@@ -2729,13 +2797,13 @@ function customAnimation(node, { transform, animationStyle, delay = 0, duration
2729
2797
  }
2730
2798
  }
2731
2799
 
2732
- /* src/components/BackgroundOverray.svelte generated by Svelte v3.53.1 */
2800
+ /* src/components/BackgroundOverlay.svelte generated by Svelte v3.53.1 */
2733
2801
 
2734
2802
  function add_css$s(target) {
2735
2803
  append_styles(target, "svelte-1d4fta", ".background.svelte-1d4fta{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0, 0, 0, 0.3);z-index:2147483646}");
2736
2804
  }
2737
2805
 
2738
- // (9:0) {#if backgroundOverray}
2806
+ // (9:0) {#if backgroundOverlay}
2739
2807
  function create_if_block$7(ctx) {
2740
2808
  let div;
2741
2809
  let mounted;
@@ -2773,7 +2841,7 @@ function create_if_block$7(ctx) {
2773
2841
 
2774
2842
  function create_fragment$v(ctx) {
2775
2843
  let if_block_anchor;
2776
- let if_block = /*backgroundOverray*/ ctx[0] && create_if_block$7(ctx);
2844
+ let if_block = /*backgroundOverlay*/ ctx[0] && create_if_block$7(ctx);
2777
2845
 
2778
2846
  return {
2779
2847
  c() {
@@ -2789,7 +2857,7 @@ function create_fragment$v(ctx) {
2789
2857
  insert_hydration(target, if_block_anchor, anchor);
2790
2858
  },
2791
2859
  p(ctx, [dirty]) {
2792
- if (/*backgroundOverray*/ ctx[0]) {
2860
+ if (/*backgroundOverlay*/ ctx[0]) {
2793
2861
  if (if_block) {
2794
2862
  if_block.p(ctx, dirty);
2795
2863
  } else {
@@ -2812,21 +2880,21 @@ function create_fragment$v(ctx) {
2812
2880
  }
2813
2881
 
2814
2882
  function instance$v($$self, $$props, $$invalidate) {
2815
- let { backgroundOverray = false } = $$props;
2883
+ let { backgroundOverlay = false } = $$props;
2816
2884
  const dispatch = createEventDispatcher();
2817
2885
  const click_handler = () => dispatch('click');
2818
2886
 
2819
2887
  $$self.$$set = $$props => {
2820
- if ('backgroundOverray' in $$props) $$invalidate(0, backgroundOverray = $$props.backgroundOverray);
2888
+ if ('backgroundOverlay' in $$props) $$invalidate(0, backgroundOverlay = $$props.backgroundOverlay);
2821
2889
  };
2822
2890
 
2823
- return [backgroundOverray, dispatch, click_handler];
2891
+ return [backgroundOverlay, dispatch, click_handler];
2824
2892
  }
2825
2893
 
2826
- class BackgroundOverray extends SvelteComponent {
2894
+ class BackgroundOverlay extends SvelteComponent {
2827
2895
  constructor(options) {
2828
2896
  super();
2829
- init(this, options, instance$v, create_fragment$v, safe_not_equal, { backgroundOverray: 0 }, add_css$s);
2897
+ init(this, options, instance$v, create_fragment$v, safe_not_equal, { backgroundOverlay: 0 }, add_css$s);
2830
2898
  }
2831
2899
  }
2832
2900
 
@@ -3651,20 +3719,20 @@ function create_default_slot$6(ctx) {
3651
3719
  }
3652
3720
 
3653
3721
  function create_fragment$t(ctx) {
3654
- let backgroundoverray;
3722
+ let backgroundoverlay;
3655
3723
  let t;
3656
3724
  let if_block_anchor;
3657
3725
  let current;
3658
3726
  let mounted;
3659
3727
  let dispose;
3660
3728
 
3661
- backgroundoverray = new BackgroundOverray({
3729
+ backgroundoverlay = new BackgroundOverlay({
3662
3730
  props: {
3663
- backgroundOverray: /*backgroundOverray*/ ctx[10]
3731
+ backgroundOverlay: /*backgroundOverlay*/ ctx[10]
3664
3732
  }
3665
3733
  });
3666
3734
 
3667
- backgroundoverray.$on("click", function () {
3735
+ backgroundoverlay.$on("click", function () {
3668
3736
  if (is_function(/*backgroundClick*/ ctx[18])) /*backgroundClick*/ ctx[18].apply(this, arguments);
3669
3737
  });
3670
3738
 
@@ -3672,19 +3740,19 @@ function create_fragment$t(ctx) {
3672
3740
 
3673
3741
  return {
3674
3742
  c() {
3675
- create_component(backgroundoverray.$$.fragment);
3743
+ create_component(backgroundoverlay.$$.fragment);
3676
3744
  t = space();
3677
3745
  if (if_block) if_block.c();
3678
3746
  if_block_anchor = empty();
3679
3747
  },
3680
3748
  l(nodes) {
3681
- claim_component(backgroundoverray.$$.fragment, nodes);
3749
+ claim_component(backgroundoverlay.$$.fragment, nodes);
3682
3750
  t = claim_space(nodes);
3683
3751
  if (if_block) if_block.l(nodes);
3684
3752
  if_block_anchor = empty();
3685
3753
  },
3686
3754
  m(target, anchor) {
3687
- mount_component(backgroundoverray, target, anchor);
3755
+ mount_component(backgroundoverlay, target, anchor);
3688
3756
  insert_hydration(target, t, anchor);
3689
3757
  if (if_block) if_block.m(target, anchor);
3690
3758
  insert_hydration(target, if_block_anchor, anchor);
@@ -3700,9 +3768,9 @@ function create_fragment$t(ctx) {
3700
3768
  },
3701
3769
  p(new_ctx, [dirty]) {
3702
3770
  ctx = new_ctx;
3703
- const backgroundoverray_changes = {};
3704
- if (dirty & /*backgroundOverray*/ 1024) backgroundoverray_changes.backgroundOverray = /*backgroundOverray*/ ctx[10];
3705
- backgroundoverray.$set(backgroundoverray_changes);
3771
+ const backgroundoverlay_changes = {};
3772
+ if (dirty & /*backgroundOverlay*/ 1024) backgroundoverlay_changes.backgroundOverlay = /*backgroundOverlay*/ ctx[10];
3773
+ backgroundoverlay.$set(backgroundoverlay_changes);
3706
3774
 
3707
3775
  if (/*visible*/ ctx[12]) {
3708
3776
  if (if_block) {
@@ -3729,17 +3797,17 @@ function create_fragment$t(ctx) {
3729
3797
  },
3730
3798
  i(local) {
3731
3799
  if (current) return;
3732
- transition_in(backgroundoverray.$$.fragment, local);
3800
+ transition_in(backgroundoverlay.$$.fragment, local);
3733
3801
  transition_in(if_block);
3734
3802
  current = true;
3735
3803
  },
3736
3804
  o(local) {
3737
- transition_out(backgroundoverray.$$.fragment, local);
3805
+ transition_out(backgroundoverlay.$$.fragment, local);
3738
3806
  transition_out(if_block);
3739
3807
  current = false;
3740
3808
  },
3741
3809
  d(detaching) {
3742
- destroy_component(backgroundoverray, detaching);
3810
+ destroy_component(backgroundoverlay, detaching);
3743
3811
  if (detaching) detach(t);
3744
3812
  if (if_block) if_block.d(detaching);
3745
3813
  if (detaching) detach(if_block_anchor);
@@ -3776,7 +3844,7 @@ function instance$t($$self, $$props, $$invalidate) {
3776
3844
  let { closeEventValue = null } = $$props;
3777
3845
  let { closeButtonColor = '#000000' } = $$props;
3778
3846
  let { _closeStyle = '' } = $$props;
3779
- let backgroundOverray = DefaultModalPlacement.backgroundOverlay;
3847
+ let backgroundOverlay = DefaultModalPlacement.backgroundOverlay;
3780
3848
  let backgroundClickFunction = DefaultModalPlacement.backgroundClick;
3781
3849
  let modal;
3782
3850
 
@@ -3827,7 +3895,7 @@ function instance$t($$self, $$props, $$invalidate) {
3827
3895
  if ($$self.$$.dirty & /*placement*/ 2097152) {
3828
3896
  {
3829
3897
  {
3830
- $$invalidate(10, backgroundOverray = false);
3898
+ $$invalidate(10, backgroundOverlay = false);
3831
3899
  }
3832
3900
  }
3833
3901
  }
@@ -3902,7 +3970,7 @@ function instance$t($$self, $$props, $$invalidate) {
3902
3970
  closeEventValue,
3903
3971
  closeButtonColor,
3904
3972
  _closeStyle,
3905
- backgroundOverray,
3973
+ backgroundOverlay,
3906
3974
  modal,
3907
3975
  visible,
3908
3976
  handle_keydown,