@lynx-js/web-core 0.7.0
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/CHANGELOG.md +597 -0
- package/LICENSE.txt +202 -0
- package/Notice.txt +1 -0
- package/README.md +21 -0
- package/dist/apis/LynxView.d.ts +137 -0
- package/dist/apis/LynxView.js +368 -0
- package/dist/apis/createLynxView.d.ts +18 -0
- package/dist/apis/createLynxView.js +17 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +7 -0
- package/dist/types/LynxExposureModule.d.ts +4 -0
- package/dist/types/LynxExposureModule.js +5 -0
- package/dist/types/RuntimePropertyOnElement.d.ts +17 -0
- package/dist/types/RuntimePropertyOnElement.js +2 -0
- package/dist/types/UpdatePageCallback.d.ts +7 -0
- package/dist/types/UpdatePageCallback.js +2 -0
- package/dist/uiThread/bootWorkers.d.ts +8 -0
- package/dist/uiThread/bootWorkers.js +60 -0
- package/dist/uiThread/crossThreadHandlers/bootTimingSystem.d.ts +5 -0
- package/dist/uiThread/crossThreadHandlers/bootTimingSystem.js +50 -0
- package/dist/uiThread/crossThreadHandlers/createDispose.d.ts +3 -0
- package/dist/uiThread/crossThreadHandlers/createDispose.js +11 -0
- package/dist/uiThread/crossThreadHandlers/createExposureService.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/createExposureService.js +55 -0
- package/dist/uiThread/crossThreadHandlers/createUpdateData.d.ts +3 -0
- package/dist/uiThread/crossThreadHandlers/createUpdateData.js +14 -0
- package/dist/uiThread/crossThreadHandlers/queryNodes.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/queryNodes.js +65 -0
- package/dist/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.d.ts +18 -0
- package/dist/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.js +116 -0
- package/dist/uiThread/crossThreadHandlers/registerInvokeUIMethodHandler.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/registerInvokeUIMethodHandler.js +51 -0
- package/dist/uiThread/crossThreadHandlers/registerLoadNewTagHandler.d.ts +3 -0
- package/dist/uiThread/crossThreadHandlers/registerLoadNewTagHandler.js +7 -0
- package/dist/uiThread/crossThreadHandlers/registerNativeModulesCallHandler.d.ts +3 -0
- package/dist/uiThread/crossThreadHandlers/registerNativeModulesCallHandler.js +5 -0
- package/dist/uiThread/crossThreadHandlers/registerReportErrorHandler.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/registerReportErrorHandler.js +10 -0
- package/dist/uiThread/crossThreadHandlers/registerSelectComponentHandler.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/registerSelectComponentHandler.js +15 -0
- package/dist/uiThread/crossThreadHandlers/registerSetNativePropsHandler.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/registerSetNativePropsHandler.js +32 -0
- package/dist/uiThread/crossThreadHandlers/registerTriggerComponentEventHandler.d.ts +2 -0
- package/dist/uiThread/crossThreadHandlers/registerTriggerComponentEventHandler.js +14 -0
- package/dist/uiThread/decodeElementOperation.d.ts +13 -0
- package/dist/uiThread/decodeElementOperation.js +183 -0
- package/dist/uiThread/getElementTag.d.ts +1 -0
- package/dist/uiThread/getElementTag.js +20 -0
- package/dist/uiThread/startUIThread.d.ts +7 -0
- package/dist/uiThread/startUIThread.js +78 -0
- package/dist/utils/browser.d.ts +3 -0
- package/dist/utils/browser.js +9 -0
- package/dist/utils/createCrossThreadEvent.d.ts +2 -0
- package/dist/utils/createCrossThreadEvent.js +43 -0
- package/dist/utils/loadTemplate.d.ts +2 -0
- package/dist/utils/loadTemplate.js +53 -0
- package/index.css +66 -0
- package/package.json +34 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Copyright 2023 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
import { registerLoadNewTagHandler } from './crossThreadHandlers/registerLoadNewTagHandler.js';
|
|
5
|
+
import { createExposureService } from './crossThreadHandlers/createExposureService.js';
|
|
6
|
+
import { registerInvokeUIMethodHandler } from './crossThreadHandlers/registerInvokeUIMethodHandler.js';
|
|
7
|
+
import { registerNativePropsHandler } from './crossThreadHandlers/registerSetNativePropsHandler.js';
|
|
8
|
+
import { registerNativeModulesCallHandler } from './crossThreadHandlers/registerNativeModulesCallHandler.js';
|
|
9
|
+
import { bootWorkers } from './bootWorkers.js';
|
|
10
|
+
import { registerReportErrorHandler } from './crossThreadHandlers/registerReportErrorHandler.js';
|
|
11
|
+
import { registerFlushElementTreeHandler } from './crossThreadHandlers/registerFlushElementTreeHandler.js';
|
|
12
|
+
import { createDispose } from './crossThreadHandlers/createDispose.js';
|
|
13
|
+
import { bootTimingSystem } from './crossThreadHandlers/bootTimingSystem.js';
|
|
14
|
+
import { registerTriggerComponentEventHandler } from './crossThreadHandlers/registerTriggerComponentEventHandler.js';
|
|
15
|
+
import { registerSelectComponentHandler } from './crossThreadHandlers/registerSelectComponentHandler.js';
|
|
16
|
+
import { flushElementTreeEndpoint, loadNewTagEndpoint, mainThreadChunkReadyEndpoint, mainThreadStartEndpoint, sendGlobalEventEndpoint, uiThreadFpReadyEndpoint, } from '@lynx-js/web-constants';
|
|
17
|
+
import { loadTemplate } from '../utils/loadTemplate.js';
|
|
18
|
+
import { createUpdateData } from './crossThreadHandlers/createUpdateData.js';
|
|
19
|
+
export function startUIThread(templateUrl, configs, rootDom, callbacks, overrideTagMap = {}, nativeModulesUrl) {
|
|
20
|
+
const createLynxStartTiming = performance.now() + performance.timeOrigin;
|
|
21
|
+
const { entryId } = configs;
|
|
22
|
+
const currentLoadingTags = [];
|
|
23
|
+
const { mainThreadRpc, backgroundRpc, terminateWorkers, } = bootWorkers();
|
|
24
|
+
const sendGlobalEvent = backgroundRpc.createCall(sendGlobalEventEndpoint);
|
|
25
|
+
const uiThreadFpReady = backgroundRpc.createCall(uiThreadFpReadyEndpoint);
|
|
26
|
+
const mainThreadStart = mainThreadRpc.createCall(mainThreadStartEndpoint);
|
|
27
|
+
const { markTimingInternal, sendTimingResult } = bootTimingSystem(mainThreadRpc, backgroundRpc, rootDom);
|
|
28
|
+
markTimingInternal('create_lynx_start', undefined, createLynxStartTiming);
|
|
29
|
+
markTimingInternal('load_template_start');
|
|
30
|
+
loadTemplate(templateUrl).then((template) => {
|
|
31
|
+
markTimingInternal('load_template_end');
|
|
32
|
+
mainThreadStart({
|
|
33
|
+
...configs,
|
|
34
|
+
template,
|
|
35
|
+
nativeModulesUrl,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
registerLoadNewTagHandler(mainThreadRpc, loadNewTagEndpoint, (tag) => {
|
|
39
|
+
if (callbacks.loadNewTag) {
|
|
40
|
+
callbacks.loadNewTag(tag);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
if (!customElements.get(tag) && tag.includes('-')) {
|
|
44
|
+
throw new Error(`[lynx-web] cannot find custom element ${tag}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}, overrideTagMap, currentLoadingTags);
|
|
48
|
+
registerReportErrorHandler(mainThreadRpc, callbacks.onError);
|
|
49
|
+
mainThreadRpc.registerHandler(mainThreadChunkReadyEndpoint, (mainChunkInfo) => {
|
|
50
|
+
const { pageConfig } = mainChunkInfo;
|
|
51
|
+
registerFlushElementTreeHandler(mainThreadRpc, flushElementTreeEndpoint, {
|
|
52
|
+
pageConfig,
|
|
53
|
+
overrideTagMap,
|
|
54
|
+
backgroundRpc,
|
|
55
|
+
rootDom,
|
|
56
|
+
entryId,
|
|
57
|
+
currentLoadingTags,
|
|
58
|
+
}, (info) => {
|
|
59
|
+
const { pipelineId, timingFlags, isFP } = info;
|
|
60
|
+
if (isFP) {
|
|
61
|
+
registerInvokeUIMethodHandler(backgroundRpc, rootDom);
|
|
62
|
+
registerNativePropsHandler(backgroundRpc, rootDom);
|
|
63
|
+
registerTriggerComponentEventHandler(backgroundRpc, rootDom);
|
|
64
|
+
registerSelectComponentHandler(backgroundRpc, rootDom);
|
|
65
|
+
createExposureService(backgroundRpc, rootDom);
|
|
66
|
+
uiThreadFpReady();
|
|
67
|
+
}
|
|
68
|
+
sendTimingResult(pipelineId, timingFlags, isFP);
|
|
69
|
+
}, markTimingInternal);
|
|
70
|
+
});
|
|
71
|
+
registerNativeModulesCallHandler(backgroundRpc, callbacks.nativeModulesCall);
|
|
72
|
+
return {
|
|
73
|
+
updateData: createUpdateData(mainThreadRpc, backgroundRpc),
|
|
74
|
+
dispose: createDispose(backgroundRpc, terminateWorkers),
|
|
75
|
+
sendGlobalEvent,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=startUIThread.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const UA = window.navigator.userAgent;
|
|
2
|
+
export const isChromium = UA.includes('Chrome');
|
|
3
|
+
export const isWebkit = /\b(iPad|iPhone|iPod|OS X)\b/.test(UA)
|
|
4
|
+
&& !/Edge/.test(UA)
|
|
5
|
+
&& /WebKit/.test(UA)
|
|
6
|
+
// @ts-expect-error
|
|
7
|
+
&& !window.MSStream;
|
|
8
|
+
export const supportAtScope = !!globalThis.CSSScopeRule;
|
|
9
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Copyright 2023 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
import { lynxRuntimeValue, lynxUniqueIdAttribute, W3cEventNameToLynx, } from '@lynx-js/web-constants';
|
|
5
|
+
export function createCrossThreadEvent(domEvent) {
|
|
6
|
+
const targetElement = domEvent.target;
|
|
7
|
+
const currentTargetElement = domEvent
|
|
8
|
+
.currentTarget;
|
|
9
|
+
const type = domEvent.type;
|
|
10
|
+
const params = {};
|
|
11
|
+
if (type.match(/^transition/)) {
|
|
12
|
+
Object.assign(params, {
|
|
13
|
+
'animation_type': 'keyframe-animation',
|
|
14
|
+
'animation_name': domEvent.propertyName,
|
|
15
|
+
new_animator: true, // we support the new_animator only
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else if (type.match(/animation/)) {
|
|
19
|
+
Object.assign(params, {
|
|
20
|
+
'animation_type': 'keyframe-animation',
|
|
21
|
+
'animation_name': domEvent.animationName,
|
|
22
|
+
new_animator: true, // we support the new_animator only
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
type: W3cEventNameToLynx[type] ?? type,
|
|
27
|
+
timestamp: domEvent.timeStamp,
|
|
28
|
+
target: {
|
|
29
|
+
id: targetElement.id,
|
|
30
|
+
dataset: targetElement[lynxRuntimeValue].dataset,
|
|
31
|
+
uniqueId: parseFloat(targetElement.getAttribute(lynxUniqueIdAttribute)),
|
|
32
|
+
},
|
|
33
|
+
currentTarget: {
|
|
34
|
+
id: currentTargetElement.id,
|
|
35
|
+
dataset: currentTargetElement[lynxRuntimeValue]?.dataset ?? {},
|
|
36
|
+
uniqueId: parseFloat(currentTargetElement.getAttribute(lynxUniqueIdAttribute)),
|
|
37
|
+
},
|
|
38
|
+
// @ts-expect-error
|
|
39
|
+
detail: domEvent.detail ?? {},
|
|
40
|
+
params,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=createCrossThreadEvent.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const TemplateCache = {};
|
|
2
|
+
function createJsModuleUrl(content) {
|
|
3
|
+
return URL.createObjectURL(new Blob([content], { type: 'text/javascript' }));
|
|
4
|
+
}
|
|
5
|
+
function generateJavascriptUrl(obj, injectVars, injectWithBind) {
|
|
6
|
+
return Object.fromEntries(Object.entries(obj).map(([name, content]) => {
|
|
7
|
+
return [
|
|
8
|
+
name,
|
|
9
|
+
createJsModuleUrl(`globalThis.module.exports = function(lynx_runtime) {
|
|
10
|
+
const module= {exports:{}};let exports = module.exports;
|
|
11
|
+
var {${injectVars.join(',')}} = lynx_runtime;
|
|
12
|
+
${injectWithBind.map((nm) => `const ${nm} = lynx_runtime.${nm}?.bind(lynx_runtime)`).join(';')}
|
|
13
|
+
var globDynamicComponentEntry = '__Card__';
|
|
14
|
+
var {__globalProps} = lynx;
|
|
15
|
+
${content}
|
|
16
|
+
return module.exports;}`),
|
|
17
|
+
];
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
const mainThreadInjectVars = [
|
|
21
|
+
'lynx',
|
|
22
|
+
'globalThis',
|
|
23
|
+
];
|
|
24
|
+
const backgroundInjectVars = [
|
|
25
|
+
'NativeModules',
|
|
26
|
+
'globalThis',
|
|
27
|
+
'lynx',
|
|
28
|
+
'lynxCoreInject',
|
|
29
|
+
];
|
|
30
|
+
const backgroundInjectWithBind = [
|
|
31
|
+
'Card',
|
|
32
|
+
'Component',
|
|
33
|
+
];
|
|
34
|
+
export async function loadTemplate(url) {
|
|
35
|
+
const cachedTemplate = TemplateCache[url];
|
|
36
|
+
if (cachedTemplate)
|
|
37
|
+
return cachedTemplate;
|
|
38
|
+
const template = (await (await fetch(url, {
|
|
39
|
+
method: 'GET',
|
|
40
|
+
})).json());
|
|
41
|
+
const decodedTemplate = {
|
|
42
|
+
...template,
|
|
43
|
+
lepusCode: generateJavascriptUrl(template.lepusCode, mainThreadInjectVars, []),
|
|
44
|
+
manifest: generateJavascriptUrl(template.manifest, backgroundInjectVars, backgroundInjectWithBind),
|
|
45
|
+
};
|
|
46
|
+
TemplateCache[url] = decodedTemplate;
|
|
47
|
+
/**
|
|
48
|
+
* This will cause a memory leak, which is expected.
|
|
49
|
+
* We cannot ensure that the `URL.createObjectURL` created url will never be used, therefore here we keep it for the entire lifetime of this page.
|
|
50
|
+
*/
|
|
51
|
+
return decodedTemplate;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=loadTemplate.js.map
|
package/index.css
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
// Copyright 2023 The Lynx Authors. All rights reserved.
|
|
3
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
4
|
+
// LICENSE file in the root directory of this source tree.
|
|
5
|
+
*/
|
|
6
|
+
[lynx-default-display-linear="false"] * {
|
|
7
|
+
--lynx-display: flex;
|
|
8
|
+
--lynx-display-toggle: var(--lynx-display-flex);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
lynx-view {
|
|
12
|
+
contain: strict;
|
|
13
|
+
display: flex;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
lynx-view > #lynx-view-root {
|
|
17
|
+
display: contents;
|
|
18
|
+
width: 100%;
|
|
19
|
+
height: 100%;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
lynx-view[height="auto"] {
|
|
23
|
+
--lynx-view-height: 100%;
|
|
24
|
+
height: var(--lynx-view-height);
|
|
25
|
+
block-size: var(--lynx-view-height);
|
|
26
|
+
}
|
|
27
|
+
lynx-view[height="auto"] > #lynx-view-root {
|
|
28
|
+
height: unset;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
lynx-view[width="auto"] {
|
|
32
|
+
--lynx-view-width: 100%;
|
|
33
|
+
width: var(--lynx-view-width);
|
|
34
|
+
inline-size: var(--lynx-view-width);
|
|
35
|
+
}
|
|
36
|
+
lynx-view[width="auto"] > #lynx-view-root {
|
|
37
|
+
width: unset;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
lynx-view[height="auto"], lynx-view[width="auto"] {
|
|
41
|
+
contain-intrinsic-size: var(--lynx-view-width) var(--lynx-view-height);
|
|
42
|
+
}
|
|
43
|
+
lynx-view[height="auto"] > #lynx-view-root,
|
|
44
|
+
lynx-view[width="auto"] > #lynx-view-root {
|
|
45
|
+
display: unset;
|
|
46
|
+
position: fixed;
|
|
47
|
+
top: 0;
|
|
48
|
+
left: 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@property --lynx-view-width {
|
|
52
|
+
syntax: "<length> | <percentage>";
|
|
53
|
+
inherits: false;
|
|
54
|
+
initial-value: 100%;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@property --lynx-view-height {
|
|
58
|
+
syntax: "<length> | <percentage>";
|
|
59
|
+
inherits: false;
|
|
60
|
+
initial-value: 100%;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
lynx-view:not([width="auto"]):not([height="auto"]) [lynx-tag="page"] {
|
|
64
|
+
height: 100%;
|
|
65
|
+
width: 100%;
|
|
66
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lynx-js/web-core",
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "",
|
|
6
|
+
"keywords": [],
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"typings": "dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"!dist/**/*.js.map",
|
|
14
|
+
"LICENSE.txt",
|
|
15
|
+
"Notice.txt",
|
|
16
|
+
"CHANGELOG.md",
|
|
17
|
+
"README.md",
|
|
18
|
+
"index.css",
|
|
19
|
+
"**/*.css"
|
|
20
|
+
],
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@lynx-js/web-constants": "0.7.0",
|
|
23
|
+
"@lynx-js/web-worker-rpc": "0.7.0",
|
|
24
|
+
"@lynx-js/web-worker-runtime": "0.7.0"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@lynx-js/lynx-core": "0.1.0",
|
|
28
|
+
"@lynx-js/web-elements": "0.2.4"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@lynx-js/lynx-core": "0.1.0",
|
|
32
|
+
"@lynx-js/web-elements": ">=0.1.0"
|
|
33
|
+
}
|
|
34
|
+
}
|