@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.
Files changed (58) hide show
  1. package/CHANGELOG.md +597 -0
  2. package/LICENSE.txt +202 -0
  3. package/Notice.txt +1 -0
  4. package/README.md +21 -0
  5. package/dist/apis/LynxView.d.ts +137 -0
  6. package/dist/apis/LynxView.js +368 -0
  7. package/dist/apis/createLynxView.d.ts +18 -0
  8. package/dist/apis/createLynxView.js +17 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.js +7 -0
  11. package/dist/types/LynxExposureModule.d.ts +4 -0
  12. package/dist/types/LynxExposureModule.js +5 -0
  13. package/dist/types/RuntimePropertyOnElement.d.ts +17 -0
  14. package/dist/types/RuntimePropertyOnElement.js +2 -0
  15. package/dist/types/UpdatePageCallback.d.ts +7 -0
  16. package/dist/types/UpdatePageCallback.js +2 -0
  17. package/dist/uiThread/bootWorkers.d.ts +8 -0
  18. package/dist/uiThread/bootWorkers.js +60 -0
  19. package/dist/uiThread/crossThreadHandlers/bootTimingSystem.d.ts +5 -0
  20. package/dist/uiThread/crossThreadHandlers/bootTimingSystem.js +50 -0
  21. package/dist/uiThread/crossThreadHandlers/createDispose.d.ts +3 -0
  22. package/dist/uiThread/crossThreadHandlers/createDispose.js +11 -0
  23. package/dist/uiThread/crossThreadHandlers/createExposureService.d.ts +2 -0
  24. package/dist/uiThread/crossThreadHandlers/createExposureService.js +55 -0
  25. package/dist/uiThread/crossThreadHandlers/createUpdateData.d.ts +3 -0
  26. package/dist/uiThread/crossThreadHandlers/createUpdateData.js +14 -0
  27. package/dist/uiThread/crossThreadHandlers/queryNodes.d.ts +2 -0
  28. package/dist/uiThread/crossThreadHandlers/queryNodes.js +65 -0
  29. package/dist/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.d.ts +18 -0
  30. package/dist/uiThread/crossThreadHandlers/registerFlushElementTreeHandler.js +116 -0
  31. package/dist/uiThread/crossThreadHandlers/registerInvokeUIMethodHandler.d.ts +2 -0
  32. package/dist/uiThread/crossThreadHandlers/registerInvokeUIMethodHandler.js +51 -0
  33. package/dist/uiThread/crossThreadHandlers/registerLoadNewTagHandler.d.ts +3 -0
  34. package/dist/uiThread/crossThreadHandlers/registerLoadNewTagHandler.js +7 -0
  35. package/dist/uiThread/crossThreadHandlers/registerNativeModulesCallHandler.d.ts +3 -0
  36. package/dist/uiThread/crossThreadHandlers/registerNativeModulesCallHandler.js +5 -0
  37. package/dist/uiThread/crossThreadHandlers/registerReportErrorHandler.d.ts +2 -0
  38. package/dist/uiThread/crossThreadHandlers/registerReportErrorHandler.js +10 -0
  39. package/dist/uiThread/crossThreadHandlers/registerSelectComponentHandler.d.ts +2 -0
  40. package/dist/uiThread/crossThreadHandlers/registerSelectComponentHandler.js +15 -0
  41. package/dist/uiThread/crossThreadHandlers/registerSetNativePropsHandler.d.ts +2 -0
  42. package/dist/uiThread/crossThreadHandlers/registerSetNativePropsHandler.js +32 -0
  43. package/dist/uiThread/crossThreadHandlers/registerTriggerComponentEventHandler.d.ts +2 -0
  44. package/dist/uiThread/crossThreadHandlers/registerTriggerComponentEventHandler.js +14 -0
  45. package/dist/uiThread/decodeElementOperation.d.ts +13 -0
  46. package/dist/uiThread/decodeElementOperation.js +183 -0
  47. package/dist/uiThread/getElementTag.d.ts +1 -0
  48. package/dist/uiThread/getElementTag.js +20 -0
  49. package/dist/uiThread/startUIThread.d.ts +7 -0
  50. package/dist/uiThread/startUIThread.js +78 -0
  51. package/dist/utils/browser.d.ts +3 -0
  52. package/dist/utils/browser.js +9 -0
  53. package/dist/utils/createCrossThreadEvent.d.ts +2 -0
  54. package/dist/utils/createCrossThreadEvent.js +43 -0
  55. package/dist/utils/loadTemplate.d.ts +2 -0
  56. package/dist/utils/loadTemplate.js +53 -0
  57. package/index.css +66 -0
  58. 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,3 @@
1
+ export declare const isChromium: boolean;
2
+ export declare const isWebkit: boolean;
3
+ export declare const supportAtScope = true;
@@ -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,2 @@
1
+ import { type LynxCrossThreadEvent } from '@lynx-js/web-constants';
2
+ export declare function createCrossThreadEvent(domEvent: Event): LynxCrossThreadEvent;
@@ -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,2 @@
1
+ import type { LynxTemplate } from '@lynx-js/web-constants';
2
+ export declare function loadTemplate(url: string): Promise<LynxTemplate>;
@@ -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
+ }