@effindomv2/fui-as 0.1.37 → 0.1.39
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/browser/routed-app-conventions.ts +1 -1
- package/browser/src/common-harness.ts +1 -27
- package/browser/src/index.ts +19 -26
- package/browser/src/routed-harness.ts +1 -194
- package/browser/src/shared-browser.ts +6 -0
- package/package.json +23 -13
- package/scripts/build.sh +47 -46
- package/scripts/framework-host-services.ts +1 -1
- package/scripts/generate-host-events.ts +15 -241
- package/scripts/generate-host-services.ts +13 -261
- package/scripts/hostgen/assemblyscript-host-events.ts +165 -0
- package/scripts/hostgen/assemblyscript-host-services.ts +207 -0
- package/scripts/hostgen/common.ts +73 -0
- package/scripts/hostgen/registry.ts +159 -0
- package/src/Fui.ts +65 -5
- package/src/FuiExports.ts +12 -1
- package/src/bindings/ui.ts +157 -8
- package/src/controls/Button.ts +98 -71
- package/src/controls/Checkbox.ts +23 -21
- package/src/controls/ComboBox.ts +1201 -0
- package/src/controls/ContextMenu.ts +279 -165
- package/src/controls/Dialog.ts +91 -17
- package/src/controls/Dropdown.ts +101 -333
- package/src/controls/NavLink.ts +29 -6
- package/src/controls/Popup.ts +10 -5
- package/src/controls/ProgressBar.ts +1 -2
- package/src/controls/RadioButton.ts +34 -13
- package/src/controls/RadioGroup.ts +32 -19
- package/src/controls/Slider.ts +21 -23
- package/src/controls/Switch.ts +34 -17
- package/src/controls/index.ts +2 -1
- package/src/controls/internal/ButtonPresenter.ts +5 -2
- package/src/controls/internal/CheckboxIndicatorPresenter.ts +10 -10
- package/src/controls/internal/DropdownChevronPresenter.ts +3 -3
- package/src/controls/internal/DropdownFieldPresenter.ts +6 -6
- package/src/controls/internal/DropdownOptionRowPresenter.ts +5 -4
- package/src/controls/internal/PressableLabeledControl.ts +4 -7
- package/src/controls/internal/RadioIndicatorPresenter.ts +7 -7
- package/src/controls/internal/SelectablePopupList.ts +463 -0
- package/src/controls/internal/SliderPresenter.ts +5 -5
- package/src/controls/internal/SwitchIndicatorPresenter.ts +63 -17
- package/src/controls/internal/TextInputCore.ts +307 -41
- package/src/controls/internal/TextInputPresenter.ts +2 -2
- package/src/controls/templating.ts +10 -0
- package/src/core/Application.ts +17 -8
- package/src/core/Bitmap.ts +192 -3
- package/src/core/ContextMenuManager.ts +128 -44
- package/src/core/DebugApi.ts +17 -2
- package/src/core/DragGesture.ts +8 -7
- package/src/core/EventRouter.ts +332 -12
- package/src/core/Fetch.ts +15 -7
- package/src/core/FetchFfi.ts +1 -15
- package/src/core/File.ts +75 -34
- package/src/core/FocusAdornerManager.ts +3 -3
- package/src/core/FocusVisibility.ts +7 -0
- package/src/core/FrameScheduler.ts +104 -5
- package/src/core/ImageSampling.ts +43 -0
- package/src/core/Logger.ts +2 -0
- package/src/core/MobileTextSelectionToolbarManager.ts +901 -0
- package/src/core/Node.ts +1039 -97
- package/src/core/Platform.ts +16 -16
- package/src/core/SelectionHandleAdornerManager.ts +697 -0
- package/src/core/Theme.ts +34 -20
- package/src/core/ToolTipManager.ts +3 -3
- package/src/core/Typography.ts +411 -19
- package/src/core/Worker.ts +69 -33
- package/src/core/event_exports.ts +123 -5
- package/src/core/ffi.ts +5 -865
- package/src/core/generated/FetchHostAbi.ts +10 -0
- package/src/core/generated/FrameworkHostServices.ts +1 -1
- package/src/core/generated/HostAbi.ts +220 -0
- package/src/core/generated/UiAbi.ts +356 -0
- package/src/core/generated/UiEnums.ts +186 -0
- package/src/drawing/DrawCallback.ts +17 -1
- package/src/drawing/DrawContext.ts +140 -32
- package/src/nodes/CustomDrawable.ts +8 -1
- package/src/nodes/FlexBox.ts +40 -11
- package/src/nodes/Grid.ts +5 -5
- package/src/nodes/Image.ts +20 -1
- package/src/nodes/RichText.ts +36 -25
- package/src/nodes/ScrollBar.ts +2 -1
- package/src/nodes/ScrollBox.ts +7 -2
- package/src/nodes/ScrollView.ts +17 -6
- package/src/nodes/Svg.ts +18 -1
- package/src/nodes/Text.ts +1 -1
- package/src/nodes/TextCore.ts +115 -20
- package/src/nodes/index.ts +1 -1
- package/src/text/DynamicTextLayout.ts +275 -0
- package/src/text/TextLayout.ts +308 -0
- package/src/worker/Worker.ts +3 -36
- package/src/worker/WorkerJob.ts +5 -9
- package/src/worker/ffi.ts +0 -6
- package/browser/src/common-harness/host-imports.ts +0 -447
- package/browser/src/common-harness/interop.ts +0 -39
- package/browser/src/common-harness/managed-harness-bitmap-host.ts +0 -92
- package/browser/src/common-harness/managed-harness-canvas-host.ts +0 -72
- package/browser/src/common-harness/managed-harness-fetch-host.ts +0 -201
- package/browser/src/common-harness/managed-harness-file-host.ts +0 -1066
- package/browser/src/common-harness/managed-harness-file-payloads.ts +0 -143
- package/browser/src/common-harness/managed-harness-file-types.ts +0 -71
- package/browser/src/common-harness/managed-harness-session.ts +0 -15
- package/browser/src/common-harness/managed-harness.ts +0 -1472
- package/browser/src/common-harness/managed-history.ts +0 -168
- package/browser/src/common-harness/persisted-restore-policy.ts +0 -50
- package/browser/src/common-harness/persisted-ui-state-controller.ts +0 -309
- package/browser/src/common-harness/text-session-bridge.ts +0 -452
- package/browser/src/common-harness/types.ts +0 -206
- package/browser/src/common-harness/ui-chrome.ts +0 -206
- package/browser/src/common-harness/ui-imports.ts +0 -559
- package/browser/src/common-harness/wasm-module-cache.ts +0 -47
- package/browser/src/file-processing-worker.ts +0 -89
- package/browser/src/host-events.ts +0 -118
- package/browser/src/host-services.ts +0 -483
- package/browser/src/persisted-ui-state.ts +0 -206
- package/browser/src/routed-app-conventions.ts +0 -292
- package/browser/src/worker-bootstrap.ts +0 -916
- package/browser/src/worker-manager.ts +0 -234
- package/browser/src/worker-types.ts +0 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from '
|
|
1
|
+
export * from '../../browser-bridge/src/routed-app-conventions.js';
|
|
@@ -1,27 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
HarnessAppOptions,
|
|
3
|
-
HarnessContext,
|
|
4
|
-
HarnessController,
|
|
5
|
-
HarnessDebugApi,
|
|
6
|
-
HarnessExports,
|
|
7
|
-
HarnessNavigationMode,
|
|
8
|
-
HarnessOptions,
|
|
9
|
-
HarnessState,
|
|
10
|
-
ManagedHarnessOptions,
|
|
11
|
-
ManagedHistoryState,
|
|
12
|
-
} from './common-harness/types';
|
|
13
|
-
|
|
14
|
-
export {
|
|
15
|
-
canManagedNavigateBack,
|
|
16
|
-
canManagedNavigateForward,
|
|
17
|
-
pushManagedHistoryEntry,
|
|
18
|
-
readManagedHistoryState,
|
|
19
|
-
replaceManagedHistoryEntry,
|
|
20
|
-
setCurrentManagedHistorySnapshotId,
|
|
21
|
-
syncManagedHistoryPop,
|
|
22
|
-
} from './common-harness/managed-history';
|
|
23
|
-
|
|
24
|
-
export {
|
|
25
|
-
startHarness,
|
|
26
|
-
startManagedHarness,
|
|
27
|
-
} from './common-harness/managed-harness';
|
|
1
|
+
export * from './shared-browser';
|
package/browser/src/index.ts
CHANGED
|
@@ -8,7 +8,7 @@ export {
|
|
|
8
8
|
replaceManagedHistoryEntry,
|
|
9
9
|
setCurrentManagedHistorySnapshotId,
|
|
10
10
|
syncManagedHistoryPop,
|
|
11
|
-
} from './
|
|
11
|
+
} from './shared-browser';
|
|
12
12
|
|
|
13
13
|
export type {
|
|
14
14
|
HarnessAppOptions,
|
|
@@ -21,30 +21,17 @@ export type {
|
|
|
21
21
|
HarnessState,
|
|
22
22
|
ManagedHarnessOptions,
|
|
23
23
|
ManagedHistoryState,
|
|
24
|
-
} from './
|
|
25
|
-
|
|
26
|
-
export {
|
|
27
|
-
buildRoutedHarnessRoutes,
|
|
28
|
-
defineRoutedAppManifest,
|
|
29
|
-
renderRoutedPageHead,
|
|
30
|
-
resolveRouteManifest,
|
|
31
|
-
resolveRoutePath,
|
|
32
|
-
routeDef,
|
|
33
|
-
routeHead,
|
|
34
|
-
} from './routed-app-conventions';
|
|
24
|
+
} from './shared-browser';
|
|
35
25
|
|
|
36
26
|
export {
|
|
37
27
|
startRoutedHarness,
|
|
38
28
|
} from './routed-harness';
|
|
39
29
|
|
|
40
|
-
export
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
ResolvedRoutedAppRoute,
|
|
46
|
-
ResolvedRoutedAppRouteManifest,
|
|
47
|
-
} from './routed-app-conventions';
|
|
30
|
+
export {
|
|
31
|
+
BuildMode,
|
|
32
|
+
DevToolsDomMirrorMode,
|
|
33
|
+
PageZoomMode,
|
|
34
|
+
} from '@effindomv2/runtime';
|
|
48
35
|
|
|
49
36
|
export type {
|
|
50
37
|
RoutedHarnessConfig,
|
|
@@ -53,24 +40,30 @@ export type {
|
|
|
53
40
|
} from './routed-harness';
|
|
54
41
|
|
|
55
42
|
export type {
|
|
43
|
+
RoutedAppHeadTag,
|
|
44
|
+
RoutedAppRoute,
|
|
45
|
+
RoutedAppRouteDefinition,
|
|
46
|
+
RoutedAppRouteManifest,
|
|
47
|
+
ResolvedRoutedAppRoute,
|
|
48
|
+
ResolvedRoutedAppRouteManifest,
|
|
56
49
|
RoutedHarnessRouteSpec,
|
|
57
|
-
} from './
|
|
50
|
+
} from './shared-browser';
|
|
58
51
|
|
|
59
52
|
export {
|
|
60
53
|
defineHostEvents,
|
|
61
54
|
hostEvent,
|
|
62
|
-
} from './
|
|
55
|
+
} from './shared-browser';
|
|
63
56
|
|
|
64
57
|
export type {
|
|
65
58
|
HostEventMethodDefinition,
|
|
66
59
|
HostEventsDefinition,
|
|
67
60
|
NormalizedHostEventMethod,
|
|
68
|
-
} from './
|
|
61
|
+
} from './shared-browser';
|
|
69
62
|
|
|
70
63
|
export {
|
|
71
64
|
defineHostServices,
|
|
72
65
|
hostService,
|
|
73
|
-
} from './
|
|
66
|
+
} from './shared-browser';
|
|
74
67
|
|
|
75
68
|
export type {
|
|
76
69
|
HostServiceImportIo,
|
|
@@ -78,8 +71,8 @@ export type {
|
|
|
78
71
|
HostServiceTypeName,
|
|
79
72
|
HostServicesDefinition,
|
|
80
73
|
NormalizedHostServiceMethod,
|
|
81
|
-
} from './
|
|
74
|
+
} from './shared-browser';
|
|
82
75
|
|
|
83
76
|
export type {
|
|
84
77
|
WorkerHostServicesBundleConfig,
|
|
85
|
-
} from './
|
|
78
|
+
} from './shared-browser';
|
|
@@ -1,194 +1 @@
|
|
|
1
|
-
|
|
2
|
-
pushManagedHistoryEntry,
|
|
3
|
-
replaceManagedHistoryEntry,
|
|
4
|
-
startManagedHarness,
|
|
5
|
-
type HarnessAppOptions,
|
|
6
|
-
type HarnessController,
|
|
7
|
-
type HarnessExports,
|
|
8
|
-
type HarnessState,
|
|
9
|
-
} from './common-harness';
|
|
10
|
-
import type { HostEventsDefinition } from './host-events';
|
|
11
|
-
import type { HostServicesDefinition } from './host-services';
|
|
12
|
-
import type { WorkerHostServicesBundleConfig } from './worker-types';
|
|
13
|
-
import type { RoutedHarnessRouteSpec } from './routed-app-conventions';
|
|
14
|
-
|
|
15
|
-
type NavigationMode = 'push' | 'replace' | 'pop';
|
|
16
|
-
|
|
17
|
-
declare global {
|
|
18
|
-
interface Window {
|
|
19
|
-
__fuiAsReady?: boolean;
|
|
20
|
-
__fuiAsError?: string;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type RoutedHarnessRoute = RoutedHarnessRouteSpec & {
|
|
25
|
-
readonly matchPath?: string;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export interface RoutedHarnessManagerState {
|
|
29
|
-
readonly shellId: string;
|
|
30
|
-
readonly routePath: string;
|
|
31
|
-
readonly activeWasmPath: string;
|
|
32
|
-
readonly routeLoads: Readonly<Record<string, number>>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface RoutedHarnessConfig<
|
|
36
|
-
TExports extends HarnessExports,
|
|
37
|
-
TRoute extends RoutedHarnessRoute = RoutedHarnessRoute,
|
|
38
|
-
> {
|
|
39
|
-
readonly shellId: string;
|
|
40
|
-
readonly routeBase: string;
|
|
41
|
-
readonly routes: readonly TRoute[];
|
|
42
|
-
readonly hostEvents?: HostEventsDefinition;
|
|
43
|
-
readonly hostServices?: HostServicesDefinition;
|
|
44
|
-
readonly workerHostServices?: WorkerHostServicesBundleConfig;
|
|
45
|
-
readonly recreateRuntimeOnWarmRouteSwap?: boolean;
|
|
46
|
-
readonly showLoadingOverlay?: (isWarmRouteSwap: boolean, route: TRoute) => boolean | undefined;
|
|
47
|
-
readonly onBooting?: () => void;
|
|
48
|
-
readonly onRouteLoading?: (route: TRoute) => void;
|
|
49
|
-
readonly onRouteReady?: (state: RoutedHarnessManagerState, route: TRoute) => void;
|
|
50
|
-
readonly onHarnessStateUpdated?: (state: HarnessState) => void;
|
|
51
|
-
readonly onHarnessError?: (error: unknown) => void;
|
|
52
|
-
readonly run: (exports: TExports, route: TRoute) => void;
|
|
53
|
-
readonly onDispose?: (exports: TExports, route: TRoute) => void;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function normalizeRoutePath(
|
|
57
|
-
pathname: string,
|
|
58
|
-
routeBase: string,
|
|
59
|
-
routeByPath: ReadonlyMap<string, RoutedHarnessRoute>,
|
|
60
|
-
fallbackRoutePath: string,
|
|
61
|
-
): string {
|
|
62
|
-
let normalized = pathname;
|
|
63
|
-
if (normalized.endsWith('/index.html')) {
|
|
64
|
-
normalized = normalized.slice(0, -'index.html'.length);
|
|
65
|
-
}
|
|
66
|
-
if (!normalized.endsWith('/')) {
|
|
67
|
-
normalized += '/';
|
|
68
|
-
}
|
|
69
|
-
if (normalized === routeBase) {
|
|
70
|
-
return fallbackRoutePath;
|
|
71
|
-
}
|
|
72
|
-
return routeByPath.has(normalized) ? normalized : fallbackRoutePath;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function resolveRouteMatchPath(route: RoutedHarnessRoute): string {
|
|
76
|
-
return route.matchPath ?? route.routePath;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function currentBrowserPath(): string {
|
|
80
|
-
let pathname = window.location.pathname;
|
|
81
|
-
if (pathname.endsWith('/index.html')) {
|
|
82
|
-
pathname = pathname.slice(0, -'index.html'.length);
|
|
83
|
-
}
|
|
84
|
-
return pathname.endsWith('/') ? pathname : `${pathname}/`;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function startRoutedHarness<
|
|
88
|
-
TExports extends HarnessExports,
|
|
89
|
-
TRoute extends RoutedHarnessRoute = RoutedHarnessRoute,
|
|
90
|
-
>(config: RoutedHarnessConfig<TExports, TRoute>): void {
|
|
91
|
-
const routeByPath = new Map<string, TRoute>(config.routes.map((route) => [resolveRouteMatchPath(route), route]));
|
|
92
|
-
const fallbackRoute = config.routes[0];
|
|
93
|
-
const routeLoads: Record<string, number> = {};
|
|
94
|
-
let activeRoute: TRoute | null = null;
|
|
95
|
-
let navigationQueue: Promise<void> = Promise.resolve();
|
|
96
|
-
|
|
97
|
-
if (fallbackRoute === undefined) {
|
|
98
|
-
throw new Error('startRoutedHarness requires at least one route.');
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function resolveRoute(pathname: string): TRoute {
|
|
102
|
-
const normalizedPath = normalizeRoutePath(
|
|
103
|
-
pathname,
|
|
104
|
-
config.routeBase,
|
|
105
|
-
routeByPath,
|
|
106
|
-
resolveRouteMatchPath(fallbackRoute),
|
|
107
|
-
);
|
|
108
|
-
return routeByPath.get(normalizedPath) ?? fallbackRoute;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function sameBrowserLocation(route: TRoute): boolean {
|
|
112
|
-
return currentBrowserPath() === resolveRouteMatchPath(route);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function buildManagerState(route: TRoute): RoutedHarnessManagerState {
|
|
116
|
-
return {
|
|
117
|
-
shellId: config.shellId,
|
|
118
|
-
routePath: route.routePath,
|
|
119
|
-
activeWasmPath: route.wasmPath,
|
|
120
|
-
routeLoads: { ...routeLoads },
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async function navigateToRoute(
|
|
125
|
-
controller: HarnessController,
|
|
126
|
-
targetUrl: URL,
|
|
127
|
-
mode: NavigationMode,
|
|
128
|
-
): Promise<void> {
|
|
129
|
-
const route = resolveRoute(targetUrl.pathname);
|
|
130
|
-
if (mode !== 'pop' && sameBrowserLocation(route) && activeRoute?.routePath === route.routePath) {
|
|
131
|
-
config.onRouteReady?.(buildManagerState(route), route);
|
|
132
|
-
window.__fuiAsReady = true;
|
|
133
|
-
delete window.__fuiAsError;
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const destination = new URL(route.routePath, window.location.origin);
|
|
138
|
-
destination.search = targetUrl.search;
|
|
139
|
-
destination.hash = targetUrl.hash;
|
|
140
|
-
if (mode === 'push') {
|
|
141
|
-
pushManagedHistoryEntry(destination);
|
|
142
|
-
} else if (mode === 'replace' && !sameBrowserLocation(route)) {
|
|
143
|
-
replaceManagedHistoryEntry(destination);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
window.__fuiAsReady = false;
|
|
147
|
-
config.onRouteLoading?.(route);
|
|
148
|
-
const isWarmRouteSwap = activeRoute !== null;
|
|
149
|
-
if (isWarmRouteSwap && config.recreateRuntimeOnWarmRouteSwap === true) {
|
|
150
|
-
await controller.recreateRuntime();
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const appOptions: HarnessAppOptions<TExports> = {
|
|
154
|
-
wasmPath: route.wasmPath,
|
|
155
|
-
persistedRestoreMode: activeRoute === null ? 'initial' : (mode === 'pop' ? 'pop' : 'none'),
|
|
156
|
-
hostEvents: config.hostEvents,
|
|
157
|
-
hostServices: config.hostServices,
|
|
158
|
-
workerHostServices: config.workerHostServices,
|
|
159
|
-
run(exports): void {
|
|
160
|
-
config.run(exports, route);
|
|
161
|
-
},
|
|
162
|
-
onDispose(exports): void {
|
|
163
|
-
config.onDispose?.(exports, route);
|
|
164
|
-
},
|
|
165
|
-
onStateUpdated(state): void {
|
|
166
|
-
config.onHarnessStateUpdated?.(state);
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
const showLoadingOverlay = config.showLoadingOverlay?.(isWarmRouteSwap, route);
|
|
170
|
-
appOptions.showLoadingOverlay = showLoadingOverlay ?? !isWarmRouteSwap;
|
|
171
|
-
|
|
172
|
-
await controller.loadApp(appOptions);
|
|
173
|
-
routeLoads[route.routePath] = (routeLoads[route.routePath] ?? 0) + 1;
|
|
174
|
-
activeRoute = route;
|
|
175
|
-
config.onRouteReady?.(buildManagerState(route), route);
|
|
176
|
-
window.__fuiAsReady = true;
|
|
177
|
-
delete window.__fuiAsError;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
startManagedHarness({
|
|
181
|
-
onReady: async (controller): Promise<void> => {
|
|
182
|
-
controller.setSameOriginNavigationHandler((target, mode) => {
|
|
183
|
-
navigationQueue = navigationQueue.then(() => navigateToRoute(controller, target, mode));
|
|
184
|
-
return navigationQueue;
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
config.onBooting?.();
|
|
188
|
-
await navigateToRoute(controller, new URL(window.location.href), 'replace');
|
|
189
|
-
},
|
|
190
|
-
onError(error): void {
|
|
191
|
-
config.onHarnessError?.(error);
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
}
|
|
1
|
+
export * from './shared-browser';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from '../../../browser-bridge/src/managed-harness.js';
|
|
2
|
+
export * from '../../../browser-bridge/src/managed-harness/abi-version.js';
|
|
3
|
+
export * from '../../../browser-bridge/src/managed-harness/persisted-restore-policy.js';
|
|
4
|
+
export * from '../../../browser-bridge/src/managed-harness/ui-chrome.js';
|
|
5
|
+
export * from '../../../browser-bridge/src/routed-app-conventions.js';
|
|
6
|
+
export * from '../../../browser-bridge/src/routed-harness.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effindomv2/fui-as",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.39",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "AGPL-3.0-only OR LicenseRef-EffinDom-Commercial",
|
|
6
6
|
"description": "EffinDom v2 AssemblyScript frontend framework SDK and browser harness",
|
|
@@ -45,21 +45,25 @@
|
|
|
45
45
|
"types": "./browser/src/common-harness.ts",
|
|
46
46
|
"default": "./browser/src/common-harness.ts"
|
|
47
47
|
},
|
|
48
|
+
"./browser/shared-browser": {
|
|
49
|
+
"types": "./browser/src/shared-browser.ts",
|
|
50
|
+
"default": "./browser/src/shared-browser.ts"
|
|
51
|
+
},
|
|
48
52
|
"./browser/routed-harness": {
|
|
49
53
|
"types": "./browser/src/routed-harness.ts",
|
|
50
54
|
"default": "./browser/src/routed-harness.ts"
|
|
51
55
|
},
|
|
52
56
|
"./browser/host-events": {
|
|
53
|
-
"types": "./browser/src/
|
|
54
|
-
"default": "./browser/src/
|
|
57
|
+
"types": "./browser/src/shared-browser.ts",
|
|
58
|
+
"default": "./browser/src/shared-browser.ts"
|
|
55
59
|
},
|
|
56
60
|
"./browser/host-services": {
|
|
57
|
-
"types": "./browser/src/
|
|
58
|
-
"default": "./browser/src/
|
|
61
|
+
"types": "./browser/src/shared-browser.ts",
|
|
62
|
+
"default": "./browser/src/shared-browser.ts"
|
|
59
63
|
},
|
|
60
64
|
"./browser/worker-types": {
|
|
61
|
-
"types": "./browser/src/
|
|
62
|
-
"default": "./browser/src/
|
|
65
|
+
"types": "./browser/src/shared-browser.ts",
|
|
66
|
+
"default": "./browser/src/shared-browser.ts"
|
|
63
67
|
}
|
|
64
68
|
},
|
|
65
69
|
"files": [
|
|
@@ -76,22 +80,28 @@
|
|
|
76
80
|
],
|
|
77
81
|
"scripts": {
|
|
78
82
|
"guard:runtime-dependency": "bash scripts/check-runtime-dependency.sh",
|
|
83
|
+
"generate:abi": "mkdir -p build && esbuild ../abi/generate.ts --bundle --format=esm --platform=node --target=node20 --packages=external --outfile=build/generate-abi.mjs && node build/generate-abi.mjs fui-as-ui && node build/generate-abi.mjs fui-as-host && node build/generate-abi.mjs fui-as-enums",
|
|
84
|
+
"check:abi": "mkdir -p build && esbuild ../abi/generate.ts --bundle --format=esm --platform=node --target=node20 --packages=external --outfile=build/generate-abi.mjs && node build/generate-abi.mjs fui-as-ui --check && node build/generate-abi.mjs fui-as-host --check && node build/generate-abi.mjs fui-as-enums --check",
|
|
85
|
+
"generate:ui-abi": "npm run generate:abi",
|
|
86
|
+
"check:ui-abi": "npm run check:abi",
|
|
79
87
|
"build": "npm run guard:runtime-dependency && bash scripts/build.sh",
|
|
80
88
|
"build:only": "npm run guard:runtime-dependency && bash scripts/build.sh",
|
|
81
89
|
"build:full": "npm run guard:runtime-dependency && bash scripts/build.sh",
|
|
82
90
|
"build:demo:as": "bash scripts/build-demo-as.sh",
|
|
91
|
+
"lint": "cd ../.. && npm run lint:v2",
|
|
92
|
+
"prepublishOnly": "npm run check:abi && npm run lint && npm run typecheck",
|
|
83
93
|
"test:unit": "npm run guard:runtime-dependency && asp --verbose -c as-pect.config.mjs -a as-pect.asconfig.json",
|
|
84
|
-
"test:integration": "npm run build:full && playwright test -c playwright.config.ts",
|
|
85
|
-
"typecheck": "npm run guard:runtime-dependency && tsc -p tsconfig.json --noEmit"
|
|
94
|
+
"test:integration": "npm --prefix ../.. run build:v2:browser-bridge && npm run build:full && playwright test -c playwright.config.ts",
|
|
95
|
+
"typecheck": "npm run guard:runtime-dependency && npm run check:abi && tsc -p tsconfig.json --noEmit"
|
|
86
96
|
},
|
|
87
97
|
"dependencies": {
|
|
88
98
|
"@assemblyscript/loader": "^0.28.19",
|
|
89
|
-
"@effindomv2/runtime": "0.1.
|
|
99
|
+
"@effindomv2/runtime": "0.1.20"
|
|
90
100
|
},
|
|
91
101
|
"devDependencies": {
|
|
92
|
-
"@as-pect/assembly": "
|
|
93
|
-
"@as-pect/cli": "
|
|
94
|
-
"@as-pect/core": "
|
|
102
|
+
"@as-pect/assembly": "9.0.0",
|
|
103
|
+
"@as-pect/cli": "9.0.0",
|
|
104
|
+
"@as-pect/core": "9.0.0",
|
|
95
105
|
"@playwright/test": "1.59.1",
|
|
96
106
|
"@types/node": "^24.10.1",
|
|
97
107
|
"assemblyscript": "0.28.19",
|
package/scripts/build.sh
CHANGED
|
@@ -13,11 +13,11 @@ WORKER_BOOTSTRAP_BUILD="${PACKAGE_DIR}/build/worker-bootstrap.js"
|
|
|
13
13
|
WORKER_BOOTSTRAP_MAP_BUILD="${PACKAGE_DIR}/build/worker-bootstrap.js.map"
|
|
14
14
|
WORKER_HOST_SERVICES_BUILD="${PACKAGE_DIR}/build/worker-host-services.js"
|
|
15
15
|
WORKER_HOST_SERVICES_MAP_BUILD="${PACKAGE_DIR}/build/worker-host-services.js.map"
|
|
16
|
-
WORKER_MANIFEST_BUILD="${PACKAGE_DIR}/build/worker-manifest.json"
|
|
17
16
|
FILE_PROCESSING_WORKER_BUILD="${PACKAGE_DIR}/build/file-processing-worker.js"
|
|
18
17
|
FILE_PROCESSING_WORKER_MAP_BUILD="${PACKAGE_DIR}/build/file-processing-worker.js.map"
|
|
19
18
|
HOST_SERVICE_GENERATOR_BUILD="${PACKAGE_DIR}/build/generate-host-services.mjs"
|
|
20
19
|
HOST_EVENT_GENERATOR_BUILD="${PACKAGE_DIR}/build/generate-host-events.mjs"
|
|
20
|
+
ABI_GENERATOR_BUILD="${PACKAGE_DIR}/build/generate-abi.mjs"
|
|
21
21
|
RUNTIME_CONFIG_FILE="effindom-runtime-config.js"
|
|
22
22
|
DEFAULT_MANIFEST_PATH="./runtime/dist/effindom.v2.manifest.json"
|
|
23
23
|
LOADING_OVERLAY_STYLES_FILE="${PACKAGE_DIR}/browser/loading-overlay-styles.html"
|
|
@@ -37,6 +37,30 @@ else
|
|
|
37
37
|
exit 1
|
|
38
38
|
fi
|
|
39
39
|
|
|
40
|
+
ESBUILD_RUNTIME_ALIAS_ARGS=()
|
|
41
|
+
if [ -f "${REPO_ROOT}/v2/browser-bridge/src/index.ts" ]; then
|
|
42
|
+
ESBUILD_RUNTIME_ALIAS_ARGS+=(
|
|
43
|
+
"--alias:@effindomv2/runtime=${REPO_ROOT}/v2/browser-bridge/src/index.ts"
|
|
44
|
+
"--alias:@effindomv2/runtime/core-types=${REPO_ROOT}/v2/browser-bridge/src/core-types.ts"
|
|
45
|
+
)
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
generate_abi() {
|
|
49
|
+
npx esbuild "${REPO_ROOT}/v2/abi/generate.ts" \
|
|
50
|
+
--bundle \
|
|
51
|
+
--format=esm \
|
|
52
|
+
--platform=node \
|
|
53
|
+
--target=node20 \
|
|
54
|
+
--packages=external \
|
|
55
|
+
--outfile="${ABI_GENERATOR_BUILD}"
|
|
56
|
+
|
|
57
|
+
node "${ABI_GENERATOR_BUILD}" fui-as-ui
|
|
58
|
+
node "${ABI_GENERATOR_BUILD}" fui-as-host
|
|
59
|
+
node "${ABI_GENERATOR_BUILD}" fui-as-enums
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
generate_abi
|
|
63
|
+
|
|
40
64
|
"${TSC_BIN}" -p tsconfig.json --noEmit
|
|
41
65
|
|
|
42
66
|
build_app() {
|
|
@@ -119,6 +143,10 @@ find_worker_entries() {
|
|
|
119
143
|
|
|
120
144
|
resolve_runtime_dist_dir() {
|
|
121
145
|
local candidate=""
|
|
146
|
+
local public_runtime_dir="${REPO_ROOT}/public/v2/browser-bridge"
|
|
147
|
+
local package_runtime_dir="${REPO_ROOT}/v2/browser-bridge/dist"
|
|
148
|
+
local public_manifest="${public_runtime_dir}/effindom.v2.manifest.json"
|
|
149
|
+
local package_manifest="${package_runtime_dir}/effindom.v2.manifest.json"
|
|
122
150
|
local candidates=()
|
|
123
151
|
|
|
124
152
|
if [ -n "${EFFINDOM_RUNTIME_DIST_DIR:-}" ]; then
|
|
@@ -126,12 +154,18 @@ resolve_runtime_dist_dir() {
|
|
|
126
154
|
fi
|
|
127
155
|
|
|
128
156
|
candidates+=(
|
|
129
|
-
"${
|
|
130
|
-
"${
|
|
157
|
+
"${public_runtime_dir}"
|
|
158
|
+
"${package_runtime_dir}"
|
|
131
159
|
"${PACKAGE_DIR}/node_modules/@effindomv2/runtime/dist"
|
|
132
160
|
"${REPO_ROOT}/node_modules/@effindomv2/runtime/dist"
|
|
133
161
|
)
|
|
134
162
|
|
|
163
|
+
if [ -f "${public_manifest}" ] && [ -f "${package_manifest}" ] && ! cmp -s "${public_manifest}" "${package_manifest}"; then
|
|
164
|
+
echo "Note: using ${public_runtime_dir} for monorepo runtime assets." >&2
|
|
165
|
+
echo " ${package_runtime_dir} is a staged package copy and may be stale." >&2
|
|
166
|
+
echo " For ABI changes, run repo-root ./build.sh (or npm run build:v2:abi)." >&2
|
|
167
|
+
fi
|
|
168
|
+
|
|
135
169
|
for candidate in "${candidates[@]}"; do
|
|
136
170
|
if [ -f "${candidate}/bridge.js" ] && [ -f "${candidate}/effindom.v2.manifest.json" ] && [ -d "${candidate}/runtime" ]; then
|
|
137
171
|
printf '%s\n' "${candidate}"
|
|
@@ -144,8 +178,9 @@ resolve_runtime_dist_dir() {
|
|
|
144
178
|
echo " - \$EFFINDOM_RUNTIME_DIST_DIR" >&2
|
|
145
179
|
echo " - ${PACKAGE_DIR}/node_modules/@effindomv2/runtime/dist" >&2
|
|
146
180
|
echo " - ${REPO_ROOT}/node_modules/@effindomv2/runtime/dist" >&2
|
|
147
|
-
echo " - ${REPO_ROOT}/v2/browser-bridge/dist" >&2
|
|
148
181
|
echo " - ${REPO_ROOT}/public/v2/browser-bridge" >&2
|
|
182
|
+
echo " - ${REPO_ROOT}/v2/browser-bridge/dist" >&2
|
|
183
|
+
echo "Monorepo note: repo-root ./build.sh (or npm run build:v2:abi) refreshes the runtime assets used here." >&2
|
|
149
184
|
echo "Install @effindomv2/runtime or build runtime assets first." >&2
|
|
150
185
|
exit 1
|
|
151
186
|
}
|
|
@@ -158,7 +193,8 @@ write_runtime_config() {
|
|
|
158
193
|
|
|
159
194
|
cat > "${destination}/${RUNTIME_CONFIG_FILE}" <<EOF
|
|
160
195
|
window.__effindomRuntime = Object.assign({}, window.__effindomRuntime, {
|
|
161
|
-
manifestUrl: '${manifest_url}',
|
|
196
|
+
manifestUrl: new URL('${manifest_url}', document.currentScript && document.currentScript.src ? document.currentScript.src : document.baseURI).toString(),
|
|
197
|
+
buildMode: 'debug',
|
|
162
198
|
});
|
|
163
199
|
EOF
|
|
164
200
|
}
|
|
@@ -222,43 +258,6 @@ build_workers() {
|
|
|
222
258
|
done < <(find_worker_entries)
|
|
223
259
|
}
|
|
224
260
|
|
|
225
|
-
write_worker_manifest() {
|
|
226
|
-
local tmp_entries
|
|
227
|
-
tmp_entries="$(mktemp)"
|
|
228
|
-
local worker_entry=""
|
|
229
|
-
while IFS= read -r worker_entry; do
|
|
230
|
-
[ -n "${worker_entry}" ] || continue
|
|
231
|
-
local worker_name
|
|
232
|
-
worker_name="$(basename "${worker_entry}" .ts)"
|
|
233
|
-
local export_name=""
|
|
234
|
-
while IFS= read -r export_name; do
|
|
235
|
-
[ -n "${export_name}" ] || continue
|
|
236
|
-
if grep -q "^${export_name} " "${tmp_entries}" 2>/dev/null; then
|
|
237
|
-
echo "Duplicate worker export name: ${export_name}" >&2
|
|
238
|
-
rm -f "${tmp_entries}"
|
|
239
|
-
exit 1
|
|
240
|
-
fi
|
|
241
|
-
echo "${export_name} ./workers/${worker_name}.wasm" >> "${tmp_entries}"
|
|
242
|
-
done < <(rg 'export function ([A-Za-z_][A-Za-z0-9_]*)\s*\(' "${worker_entry}" -or '$1')
|
|
243
|
-
done < <(find_worker_entries)
|
|
244
|
-
|
|
245
|
-
{
|
|
246
|
-
printf '{\n "version": 1,\n "entries": {\n'
|
|
247
|
-
local first=1
|
|
248
|
-
local line=""
|
|
249
|
-
sort "${tmp_entries}" | while IFS=' ' read -r entry_name entry_path; do
|
|
250
|
-
[ -n "${entry_name}" ] || continue
|
|
251
|
-
if [ "${first}" -eq 0 ]; then
|
|
252
|
-
printf ',\n'
|
|
253
|
-
fi
|
|
254
|
-
first=0
|
|
255
|
-
printf ' "%s": "%s"' "${entry_name}" "${entry_path}"
|
|
256
|
-
done
|
|
257
|
-
printf '\n }\n}\n'
|
|
258
|
-
} > "${WORKER_MANIFEST_BUILD}"
|
|
259
|
-
rm -f "${tmp_entries}"
|
|
260
|
-
}
|
|
261
|
-
|
|
262
261
|
copy_worker_assets() {
|
|
263
262
|
local destination="$1"
|
|
264
263
|
rm -rf "${destination}/workers"
|
|
@@ -273,7 +272,6 @@ copy_worker_assets() {
|
|
|
273
272
|
cp "${WORKER_BOOTSTRAP_MAP_BUILD}" "${destination}/worker-bootstrap.js.map"
|
|
274
273
|
cp "${WORKER_HOST_SERVICES_BUILD}" "${destination}/worker-host-services.js"
|
|
275
274
|
cp "${WORKER_HOST_SERVICES_MAP_BUILD}" "${destination}/worker-host-services.js.map"
|
|
276
|
-
cp "${WORKER_MANIFEST_BUILD}" "${destination}/worker-manifest.json"
|
|
277
275
|
}
|
|
278
276
|
|
|
279
277
|
generate_host_services "demo/src/host-services.ts" "demoHostServices" "demo/src/generated/HostServices.ts"
|
|
@@ -289,7 +287,6 @@ build_app "demo/src/routes/templated-controls.ts" "${DEMO_OUT_DIR}/templated-con
|
|
|
289
287
|
build_app "demo/src/routes/demo_scrollbar_gutter.ts" "${DEMO_OUT_DIR}/scrollbar-gutter.wasm"
|
|
290
288
|
build_app "demo/src/routes/demo_immediate_drawing.ts" "${DEMO_OUT_DIR}/immediate-drawing.wasm"
|
|
291
289
|
build_workers
|
|
292
|
-
write_worker_manifest
|
|
293
290
|
|
|
294
291
|
npx esbuild "${SMOKE_FIXTURE_DIR}/harness.ts" \
|
|
295
292
|
--bundle \
|
|
@@ -297,6 +294,7 @@ npx esbuild "${SMOKE_FIXTURE_DIR}/harness.ts" \
|
|
|
297
294
|
--platform=browser \
|
|
298
295
|
--target=es2020 \
|
|
299
296
|
--minify \
|
|
297
|
+
"${ESBUILD_RUNTIME_ALIAS_ARGS[@]}" \
|
|
300
298
|
--outfile="${OUT_DIR}/harness.js" \
|
|
301
299
|
--sourcemap
|
|
302
300
|
|
|
@@ -306,15 +304,17 @@ npx esbuild "${PACKAGE_DIR}/demo/harness.ts" \
|
|
|
306
304
|
--platform=browser \
|
|
307
305
|
--target=es2020 \
|
|
308
306
|
--minify \
|
|
307
|
+
"${ESBUILD_RUNTIME_ALIAS_ARGS[@]}" \
|
|
309
308
|
--outfile="${DEMO_OUT_DIR}/harness.js" \
|
|
310
309
|
--sourcemap
|
|
311
310
|
|
|
312
|
-
npx esbuild "${
|
|
311
|
+
npx esbuild "${REPO_ROOT}/v2/browser-bridge/src/managed-harness/file-processing-worker.ts" \
|
|
313
312
|
--bundle \
|
|
314
313
|
--format=iife \
|
|
315
314
|
--platform=browser \
|
|
316
315
|
--target=es2020 \
|
|
317
316
|
--minify \
|
|
317
|
+
"${ESBUILD_RUNTIME_ALIAS_ARGS[@]}" \
|
|
318
318
|
--outfile="${FILE_PROCESSING_WORKER_BUILD}" \
|
|
319
319
|
--sourcemap
|
|
320
320
|
|
|
@@ -323,12 +323,13 @@ cp "${FILE_PROCESSING_WORKER_MAP_BUILD}" "${OUT_DIR}/file-processing-worker.js.m
|
|
|
323
323
|
cp "${FILE_PROCESSING_WORKER_BUILD}" "${DEMO_OUT_DIR}/file-processing-worker.js"
|
|
324
324
|
cp "${FILE_PROCESSING_WORKER_MAP_BUILD}" "${DEMO_OUT_DIR}/file-processing-worker.js.map"
|
|
325
325
|
|
|
326
|
-
npx esbuild "${
|
|
326
|
+
npx esbuild "${REPO_ROOT}/v2/browser-bridge/src/managed-harness/worker-bootstrap.ts" \
|
|
327
327
|
--bundle \
|
|
328
328
|
--format=iife \
|
|
329
329
|
--platform=browser \
|
|
330
330
|
--target=es2020 \
|
|
331
331
|
--minify \
|
|
332
|
+
"${ESBUILD_RUNTIME_ALIAS_ARGS[@]}" \
|
|
332
333
|
--outfile="${WORKER_BOOTSTRAP_BUILD}" \
|
|
333
334
|
--sourcemap
|
|
334
335
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineHostServices, hostService } from "../browser/src/
|
|
1
|
+
import { defineHostServices, hostService } from "../browser/src/shared-browser";
|
|
2
2
|
|
|
3
3
|
function unsupported(): never {
|
|
4
4
|
throw new Error("Framework host service definitions are generator metadata only.");
|