@lark-apaas/client-toolkit 1.2.62-alpha.0 → 1.2.62-alpha.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 (31) hide show
  1. package/lib/apis/components/UniversalLink.d.ts +3 -0
  2. package/lib/apis/components/UniversalLink.js +42 -3
  3. package/lib/components/AppContainer/Watermark.d.ts +60 -0
  4. package/lib/components/AppContainer/Watermark.js +364 -0
  5. package/lib/components/AppContainer/__test__/Watermark.test.js +121 -0
  6. package/lib/components/AppContainer/__test__/safety-error-boundary.test.d.ts +1 -0
  7. package/lib/components/AppContainer/__test__/safety-error-boundary.test.js +53 -0
  8. package/lib/components/AppContainer/doubao-watermark-asset.d.ts +2 -0
  9. package/lib/components/AppContainer/doubao-watermark-asset.js +4 -0
  10. package/lib/components/AppContainer/index.js +9 -4
  11. package/lib/components/AppContainer/safety-error-boundary.d.ts +23 -0
  12. package/lib/components/AppContainer/safety-error-boundary.js +29 -0
  13. package/lib/components/AppContainer/safety.js +50 -0
  14. package/lib/hooks/useCurrentUserProfile.js +1 -1
  15. package/lib/index.d.ts +40 -0
  16. package/lib/index.js +32 -2
  17. package/lib/integrations/__test__/dataloom.test.d.ts +1 -0
  18. package/lib/integrations/__test__/dataloom.test.js +83 -0
  19. package/lib/integrations/dataloom.d.ts +1 -1
  20. package/lib/integrations/dataloom.js +5 -11
  21. package/lib/integrations/services/types.d.ts +43 -0
  22. package/lib/locales/messages.js +4 -0
  23. package/lib/runtime/index.js +0 -2
  24. package/lib/types/iframe-events.d.ts +12 -1
  25. package/lib/utils/postMessage.d.ts +1 -0
  26. package/lib/utils/postMessage.js +1 -1
  27. package/package.json +5 -4
  28. package/lib/runtime/preview-run.d.ts +0 -29
  29. package/lib/runtime/preview-run.js +0 -76
  30. package/lib/runtime/preview-run.spec.js +0 -94
  31. /package/lib/{runtime/preview-run.spec.d.ts → components/AppContainer/__test__/Watermark.test.d.ts} +0 -0
@@ -1,76 +0,0 @@
1
- const PREVIEW_RUN_ID_QUERY = '__miaoda_preview_run_id';
2
- const PREVIEW_RENDERED_MESSAGE_TYPE = 'MiaodaPreviewRendered';
3
- const PREVIEW_RUN_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
4
- const EPOCH_TIME_THRESHOLD_MS = 1000000000000;
5
- const ALLOWED_PARENT_ORIGINS = new Set([
6
- 'https://miaoda.feishu.cn',
7
- 'https://miaoda.feishu-pre.cn',
8
- 'https://miaoda.feishu-boe.cn'
9
- ]);
10
- function isFiniteNonNegative(value) {
11
- return 'number' == typeof value && Number.isFinite(value) && value >= 0;
12
- }
13
- function resolveRenderedAtEpochMs(renderedAtEpochMs, eventTimeStampMs, performanceTimeOriginMs) {
14
- if (isFiniteNonNegative(renderedAtEpochMs) && renderedAtEpochMs > 0) return renderedAtEpochMs;
15
- if (!isFiniteNonNegative(eventTimeStampMs)) return;
16
- if (eventTimeStampMs >= EPOCH_TIME_THRESHOLD_MS) return eventTimeStampMs;
17
- if (!isFiniteNonNegative(performanceTimeOriginMs) || performanceTimeOriginMs <= 0) return;
18
- return performanceTimeOriginMs + eventTimeStampMs;
19
- }
20
- function resolveParentOrigin(referrer) {
21
- try {
22
- const origin = new URL(referrer).origin;
23
- return ALLOWED_PARENT_ORIGINS.has(origin) ? origin : void 0;
24
- } catch {
25
- return;
26
- }
27
- }
28
- function createPreviewRenderedMessage(options) {
29
- const runID = new URLSearchParams(options.search).get(PREVIEW_RUN_ID_QUERY);
30
- const renderedAtEpochMs = resolveRenderedAtEpochMs(options.renderedAtEpochMs, options.eventTimeStampMs, options.performanceTimeOriginMs);
31
- if (!runID || !PREVIEW_RUN_ID_PATTERN.test(runID) || !isFiniteNonNegative(options.customTtiMs) || void 0 === renderedAtEpochMs) return;
32
- return {
33
- type: PREVIEW_RENDERED_MESSAGE_TYPE,
34
- data: {
35
- runID,
36
- customTtiMs: options.customTtiMs,
37
- renderedAtEpochMs
38
- }
39
- };
40
- }
41
- function createBrowserEnvironment() {
42
- const legacyNavigationStart = performance.timing?.navigationStart;
43
- const performanceTimeOriginMs = 'number' == typeof performance.timeOrigin && performance.timeOrigin > 0 ? performance.timeOrigin : legacyNavigationStart ?? 0;
44
- return {
45
- search: window.location.search,
46
- referrer: document.referrer,
47
- performanceTimeOriginMs,
48
- isEmbedded: window.parent !== window,
49
- addEventListener: (type, handler)=>window.addEventListener(type, handler),
50
- removeEventListener: (type, handler)=>window.removeEventListener(type, handler),
51
- postMessage: (message, targetOrigin)=>window.parent.postMessage(message, targetOrigin)
52
- };
53
- }
54
- function initPreviewRunReporting(environment = createBrowserEnvironment()) {
55
- const parentOrigin = resolveParentOrigin(environment.referrer);
56
- const runID = new URLSearchParams(environment.search).get(PREVIEW_RUN_ID_QUERY);
57
- if (!environment.isEmbedded || !parentOrigin || !runID || !PREVIEW_RUN_ID_PATTERN.test(runID)) return ()=>void 0;
58
- let lastRenderedAtEpochMs;
59
- const handleCustomTti = (event)=>{
60
- const detail = event.detail;
61
- if (!isFiniteNonNegative(detail?.time)) return;
62
- const message = createPreviewRenderedMessage({
63
- search: environment.search,
64
- customTtiMs: detail.time,
65
- eventTimeStampMs: event.timeStamp,
66
- performanceTimeOriginMs: environment.performanceTimeOriginMs,
67
- renderedAtEpochMs: 'number' == typeof detail.renderedAtEpochMs ? detail.renderedAtEpochMs : void 0
68
- });
69
- if (!message || lastRenderedAtEpochMs === message.data.renderedAtEpochMs) return;
70
- lastRenderedAtEpochMs = message.data.renderedAtEpochMs;
71
- environment.postMessage(message, parentOrigin);
72
- };
73
- environment.addEventListener('builderV3-custom-TTI', handleCustomTti);
74
- return ()=>environment.removeEventListener('builderV3-custom-TTI', handleCustomTti);
75
- }
76
- export { PREVIEW_RENDERED_MESSAGE_TYPE, PREVIEW_RUN_ID_QUERY, createPreviewRenderedMessage, initPreviewRunReporting };
@@ -1,94 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { PREVIEW_RENDERED_MESSAGE_TYPE, createPreviewRenderedMessage, initPreviewRunReporting } from "./preview-run.js";
3
- describe('createPreviewRenderedMessage', ()=>{
4
- it('使用 TTI 事件时间戳生成精确的 iframe 渲染完成消息', ()=>{
5
- expect(createPreviewRenderedMessage({
6
- search: '?__miaoda_preview_run_id=prv_test_123',
7
- customTtiMs: 8951.8,
8
- eventTimeStampMs: 12643.9,
9
- performanceTimeOriginMs: 1784022258000
10
- })).toEqual({
11
- type: PREVIEW_RENDERED_MESSAGE_TYPE,
12
- data: {
13
- runID: 'prv_test_123',
14
- customTtiMs: 8951.8,
15
- renderedAtEpochMs: 1784022270643.9
16
- }
17
- });
18
- });
19
- it('优先采用新版 TTI 显式提供的 epoch 时间', ()=>{
20
- expect(createPreviewRenderedMessage({
21
- search: '?__miaoda_preview_run_id=prv_explicit',
22
- customTtiMs: 321,
23
- eventTimeStampMs: 999,
24
- performanceTimeOriginMs: 1000,
25
- renderedAtEpochMs: 1720000000123
26
- })?.data.renderedAtEpochMs).toBe(1720000000123);
27
- });
28
- it('拒绝非法 run_id 和非有限耗时', ()=>{
29
- expect(createPreviewRenderedMessage({
30
- search: '?__miaoda_preview_run_id=invalid%2Frun',
31
- customTtiMs: 321,
32
- eventTimeStampMs: 999,
33
- performanceTimeOriginMs: 1000
34
- })).toBeUndefined();
35
- expect(createPreviewRenderedMessage({
36
- search: '?__miaoda_preview_run_id=prv_valid',
37
- customTtiMs: NaN,
38
- eventTimeStampMs: 999,
39
- performanceTimeOriginMs: 1000
40
- })).toBeUndefined();
41
- });
42
- });
43
- describe('initPreviewRunReporting', ()=>{
44
- it('只向可信妙搭父页面回传一次 TTI,并支持旧版 detail', ()=>{
45
- let listener;
46
- const postMessage = vi.fn();
47
- const cleanup = initPreviewRunReporting({
48
- search: '?__miaoda_preview_run_id=prv_runtime',
49
- referrer: 'https://miaoda.feishu-boe.cn/app/app_test',
50
- performanceTimeOriginMs: 1700000000000,
51
- isEmbedded: true,
52
- addEventListener: (_type, handler)=>{
53
- listener = handler;
54
- },
55
- removeEventListener: vi.fn(),
56
- postMessage
57
- });
58
- listener?.({
59
- timeStamp: 2345,
60
- detail: {
61
- time: 456
62
- }
63
- });
64
- listener?.({
65
- timeStamp: 2345,
66
- detail: {
67
- time: 456
68
- }
69
- });
70
- expect(postMessage).toHaveBeenCalledTimes(1);
71
- expect(postMessage).toHaveBeenCalledWith({
72
- type: PREVIEW_RENDERED_MESSAGE_TYPE,
73
- data: {
74
- runID: 'prv_runtime',
75
- customTtiMs: 456,
76
- renderedAtEpochMs: 1700000002345
77
- }
78
- }, 'https://miaoda.feishu-boe.cn');
79
- cleanup();
80
- });
81
- it('拒绝向非妙搭 referrer 回传', ()=>{
82
- const addEventListener = vi.fn();
83
- initPreviewRunReporting({
84
- search: '?__miaoda_preview_run_id=prv_runtime',
85
- referrer: 'https://evil.example/app',
86
- performanceTimeOriginMs: 1700000000000,
87
- isEmbedded: true,
88
- addEventListener,
89
- removeEventListener: vi.fn(),
90
- postMessage: vi.fn()
91
- });
92
- expect(addEventListener).not.toHaveBeenCalled();
93
- });
94
- });