marko 6.0.101 → 6.0.103

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.
@@ -136,6 +136,55 @@ function _assert_hoist(value) {
136
136
  );
137
137
  }
138
138
  }
139
+ function assertExclusiveAttrs(attrs, onError = throwErr) {
140
+ if (attrs) {
141
+ let exclusiveAttrs;
142
+ if (attrs.checkedChange) {
143
+ (exclusiveAttrs ||= []).push("checkedChange");
144
+ }
145
+ if (attrs.checkedValue) {
146
+ (exclusiveAttrs ||= []).push("checkedValue");
147
+ if (attrs.checked) {
148
+ exclusiveAttrs.push("checked");
149
+ }
150
+ } else if (attrs.checkedValueChange) {
151
+ (exclusiveAttrs ||= []).push("checkedValueChange");
152
+ if (attrs.checked) {
153
+ exclusiveAttrs.push("checked");
154
+ }
155
+ }
156
+ if (attrs.valueChange) {
157
+ (exclusiveAttrs ||= []).push("valueChange");
158
+ }
159
+ if (exclusiveAttrs && exclusiveAttrs.length > 1) {
160
+ onError(
161
+ `The attributes ${joinWithAnd(exclusiveAttrs)} are mutually exclusive.`
162
+ );
163
+ }
164
+ }
165
+ }
166
+ function assertValidTagName(tagName) {
167
+ if (!/^[a-z][a-z0-9._-]*$/i.test(tagName)) {
168
+ throw new Error(
169
+ `Invalid tag name: "${tagName}". Tag names must start with a letter and contain only letters, numbers, periods, hyphens, and underscores.`
170
+ );
171
+ }
172
+ }
173
+ function throwErr(msg) {
174
+ throw new Error(msg);
175
+ }
176
+ function joinWithAnd(a) {
177
+ switch (a.length) {
178
+ case 0:
179
+ return "";
180
+ case 1:
181
+ return a[0];
182
+ case 2:
183
+ return `${a[0]} and ${a[1]}`;
184
+ default:
185
+ return `${a.slice(0, -1).join(", ")}, and ${a[a.length - 1]}`;
186
+ }
187
+ }
139
188
 
140
189
  // src/common/helpers.ts
141
190
  function classValue(classValue2) {
@@ -2848,6 +2897,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2848
2897
  let events;
2849
2898
  switch (tagName) {
2850
2899
  case "input":
2900
+ if (true) {
2901
+ assertExclusiveAttrs(data);
2902
+ }
2851
2903
  if (data.checkedChange) {
2852
2904
  result += _attr_input_checked(
2853
2905
  scopeId,
@@ -3003,6 +3055,7 @@ var RENDER_BODY_ID = prefix + (true ? "renderBody" : "b");
3003
3055
  // src/common/meta.ts
3004
3056
  var DEFAULT_RUNTIME_ID = "M";
3005
3057
  var DEFAULT_RENDER_ID = "_";
3058
+ var DYNAMIC_TAG_SCRIPT_REGISTER_ID = true ? "_dynamicTagScript" : "d";
3006
3059
 
3007
3060
  // src/html/dynamic-tag.ts
3008
3061
  var voidElementsReg = /^(?:area|b(?:ase|r)|col|embed|hr|i(?:mg|nput)|link|meta|param|source|track|wbr)$/;
@@ -3019,11 +3072,14 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
3019
3072
  let rendered = false;
3020
3073
  let result;
3021
3074
  if (typeof renderer === "string") {
3075
+ if (true) {
3076
+ assertValidTagName(renderer);
3077
+ }
3022
3078
  const input = (inputIsArgs ? inputOrArgs[0] : inputOrArgs) || {};
3023
3079
  rendered = true;
3024
3080
  _scope_id();
3025
3081
  _html(
3026
- `<${renderer}${_attrs(input, true ? `#${renderer}/0` : 0, branchId, renderer)}>`
3082
+ `<${renderer}${_attrs(input, true ? `#${renderer}/0` : "a", branchId, renderer)}>`
3027
3083
  );
3028
3084
  if (!voidElementsReg.test(renderer)) {
3029
3085
  const renderContent = content || normalizeDynamicRenderer(input.content);
@@ -3036,7 +3092,7 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
3036
3092
  _html(
3037
3093
  _attr_textarea_value(
3038
3094
  branchId,
3039
- true ? `#${renderer}/0` : 0,
3095
+ true ? `#${renderer}/0` : "a",
3040
3096
  input.value,
3041
3097
  input.valueChange
3042
3098
  )
@@ -3050,7 +3106,7 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
3050
3106
  if (renderer === "select" && ("value" in input || "valueChange" in input)) {
3051
3107
  _attr_select_value(
3052
3108
  branchId,
3053
- true ? `#${renderer}/0` : 0,
3109
+ true ? `#${renderer}/0` : "a",
3054
3110
  input.value,
3055
3111
  input.valueChange,
3056
3112
  renderContent
@@ -3058,7 +3114,7 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
3058
3114
  } else {
3059
3115
  _dynamic_tag(
3060
3116
  branchId,
3061
- true ? `#${renderer}/0` : 0,
3117
+ true ? `#${renderer}/0` : "a",
3062
3118
  renderContent,
3063
3119
  [],
3064
3120
  0,
@@ -3073,6 +3129,11 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
3073
3129
  `Body content is not supported for the \`<${renderer}>\` tag.`
3074
3130
  );
3075
3131
  }
3132
+ const childScope = getScopeById(branchId);
3133
+ if (childScope && (childScope["EventAttributes:" /* EventAttributes */ + (true ? `#${renderer}/0` : "a")] || childScope["ControlledHandler:" /* ControlledHandler */ + (true ? `#${renderer}/0` : "a")])) {
3134
+ childScope["#Renderer" /* Renderer */] = renderer;
3135
+ _script(branchId, DYNAMIC_TAG_SCRIPT_REGISTER_ID);
3136
+ }
3076
3137
  if (shouldResume) {
3077
3138
  _html(
3078
3139
  state.mark(
@@ -44,6 +44,55 @@ function _assert_hoist(value) {
44
44
  );
45
45
  }
46
46
  }
47
+ function assertExclusiveAttrs(attrs, onError = throwErr) {
48
+ if (attrs) {
49
+ let exclusiveAttrs;
50
+ if (attrs.checkedChange) {
51
+ (exclusiveAttrs ||= []).push("checkedChange");
52
+ }
53
+ if (attrs.checkedValue) {
54
+ (exclusiveAttrs ||= []).push("checkedValue");
55
+ if (attrs.checked) {
56
+ exclusiveAttrs.push("checked");
57
+ }
58
+ } else if (attrs.checkedValueChange) {
59
+ (exclusiveAttrs ||= []).push("checkedValueChange");
60
+ if (attrs.checked) {
61
+ exclusiveAttrs.push("checked");
62
+ }
63
+ }
64
+ if (attrs.valueChange) {
65
+ (exclusiveAttrs ||= []).push("valueChange");
66
+ }
67
+ if (exclusiveAttrs && exclusiveAttrs.length > 1) {
68
+ onError(
69
+ `The attributes ${joinWithAnd(exclusiveAttrs)} are mutually exclusive.`
70
+ );
71
+ }
72
+ }
73
+ }
74
+ function assertValidTagName(tagName) {
75
+ if (!/^[a-z][a-z0-9._-]*$/i.test(tagName)) {
76
+ throw new Error(
77
+ `Invalid tag name: "${tagName}". Tag names must start with a letter and contain only letters, numbers, periods, hyphens, and underscores.`
78
+ );
79
+ }
80
+ }
81
+ function throwErr(msg) {
82
+ throw new Error(msg);
83
+ }
84
+ function joinWithAnd(a) {
85
+ switch (a.length) {
86
+ case 0:
87
+ return "";
88
+ case 1:
89
+ return a[0];
90
+ case 2:
91
+ return `${a[0]} and ${a[1]}`;
92
+ default:
93
+ return `${a.slice(0, -1).join(", ")}, and ${a[a.length - 1]}`;
94
+ }
95
+ }
47
96
 
48
97
  // src/common/helpers.ts
49
98
  function classValue(classValue2) {
@@ -2756,6 +2805,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2756
2805
  let events;
2757
2806
  switch (tagName) {
2758
2807
  case "input":
2808
+ if (true) {
2809
+ assertExclusiveAttrs(data);
2810
+ }
2759
2811
  if (data.checkedChange) {
2760
2812
  result += _attr_input_checked(
2761
2813
  scopeId,
@@ -2911,6 +2963,7 @@ var RENDER_BODY_ID = prefix + (true ? "renderBody" : "b");
2911
2963
  // src/common/meta.ts
2912
2964
  var DEFAULT_RUNTIME_ID = "M";
2913
2965
  var DEFAULT_RENDER_ID = "_";
2966
+ var DYNAMIC_TAG_SCRIPT_REGISTER_ID = true ? "_dynamicTagScript" : "d";
2914
2967
 
2915
2968
  // src/html/dynamic-tag.ts
2916
2969
  var voidElementsReg = /^(?:area|b(?:ase|r)|col|embed|hr|i(?:mg|nput)|link|meta|param|source|track|wbr)$/;
@@ -2927,11 +2980,14 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2927
2980
  let rendered = false;
2928
2981
  let result;
2929
2982
  if (typeof renderer === "string") {
2983
+ if (true) {
2984
+ assertValidTagName(renderer);
2985
+ }
2930
2986
  const input = (inputIsArgs ? inputOrArgs[0] : inputOrArgs) || {};
2931
2987
  rendered = true;
2932
2988
  _scope_id();
2933
2989
  _html(
2934
- `<${renderer}${_attrs(input, true ? `#${renderer}/0` : 0, branchId, renderer)}>`
2990
+ `<${renderer}${_attrs(input, true ? `#${renderer}/0` : "a", branchId, renderer)}>`
2935
2991
  );
2936
2992
  if (!voidElementsReg.test(renderer)) {
2937
2993
  const renderContent = content || normalizeDynamicRenderer(input.content);
@@ -2944,7 +3000,7 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2944
3000
  _html(
2945
3001
  _attr_textarea_value(
2946
3002
  branchId,
2947
- true ? `#${renderer}/0` : 0,
3003
+ true ? `#${renderer}/0` : "a",
2948
3004
  input.value,
2949
3005
  input.valueChange
2950
3006
  )
@@ -2958,7 +3014,7 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2958
3014
  if (renderer === "select" && ("value" in input || "valueChange" in input)) {
2959
3015
  _attr_select_value(
2960
3016
  branchId,
2961
- true ? `#${renderer}/0` : 0,
3017
+ true ? `#${renderer}/0` : "a",
2962
3018
  input.value,
2963
3019
  input.valueChange,
2964
3020
  renderContent
@@ -2966,7 +3022,7 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2966
3022
  } else {
2967
3023
  _dynamic_tag(
2968
3024
  branchId,
2969
- true ? `#${renderer}/0` : 0,
3025
+ true ? `#${renderer}/0` : "a",
2970
3026
  renderContent,
2971
3027
  [],
2972
3028
  0,
@@ -2981,6 +3037,11 @@ var _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2981
3037
  `Body content is not supported for the \`<${renderer}>\` tag.`
2982
3038
  );
2983
3039
  }
3040
+ const childScope = getScopeById(branchId);
3041
+ if (childScope && (childScope["EventAttributes:" /* EventAttributes */ + (true ? `#${renderer}/0` : "a")] || childScope["ControlledHandler:" /* ControlledHandler */ + (true ? `#${renderer}/0` : "a")])) {
3042
+ childScope["#Renderer" /* Renderer */] = renderer;
3043
+ _script(branchId, DYNAMIC_TAG_SCRIPT_REGISTER_ID);
3044
+ }
2984
3045
  if (shouldResume) {
2985
3046
  _html(
2986
3047
  state.mark(
@@ -1,3 +1,3 @@
1
- import type { Scope } from "../common/types";
1
+ import { type Scope } from "../common/types";
2
2
  export declare function $signalReset(scope: Scope, id: string | number): void;
3
3
  export declare function $signal(scope: Scope, id: string | number): AbortSignal;
@@ -1,16 +1,17 @@
1
- import { type Accessor, type BranchScope, type Scope } from "../common/types";
1
+ import { type Accessor, AccessorProp, type BranchScope, type EncodedAccessor, type Scope } from "../common/types";
2
2
  import { type Renderer } from "./renderer";
3
3
  import { type Signal } from "./signals";
4
- export declare function _await(nodeAccessor: Accessor, renderer: Renderer): (scope: Scope, promise: Promise<unknown>) => void;
5
- export declare function _try(nodeAccessor: Accessor, content: Renderer): (scope: Scope, input: {
4
+ export declare function _await(nodeAccessor: EncodedAccessor, renderer: Renderer): (scope: Scope, promise: Promise<unknown>) => void;
5
+ export declare function _try(nodeAccessor: EncodedAccessor, content: Renderer): (scope: Scope, input: {
6
6
  catch: unknown;
7
7
  placeholder: unknown;
8
8
  }) => void;
9
9
  export declare function renderCatch(scope: Scope, error: unknown): void;
10
- export declare function _if(nodeAccessor: Accessor, ...branches: Renderer[]): (scope: Scope, newBranch: number) => void;
10
+ export declare function _if(nodeAccessor: EncodedAccessor, ...branches: Renderer[]): (scope: Scope, newBranch: number) => void;
11
11
  export declare function patchDynamicTag(fn: <T extends typeof _dynamic_tag>(cond: T) => T): void;
12
- export declare let _dynamic_tag: (nodeAccessor: Accessor, getContent?: ((scope: Scope) => Renderer) | 0, getTagVar?: (() => Signal<unknown>) | 0, inputIsArgs?: 1) => Signal<Renderer | string | undefined>;
13
- export declare function setConditionalRenderer<T>(scope: Scope, nodeAccessor: Accessor, newRenderer: T, createBranch: ($global: Scope["$global"], renderer: NonNullable<T>, parentScope: Scope, parentNode: ParentNode) => BranchScope): void;
12
+ export declare let _dynamic_tag: (nodeAccessor: EncodedAccessor, getContent?: ((scope: Scope) => Renderer) | 0, getTagVar?: (() => Signal<unknown>) | 0, inputIsArgs?: 1) => Signal<Renderer | string | undefined>;
13
+ export declare function _resume_dynamic_tag(): void;
14
+ export declare function setConditionalRenderer<T>(scope: Scope, nodeAccessor: Accessor, newRenderer: T, createBranch: ($global: Scope[AccessorProp.Global], renderer: NonNullable<T>, parentScope: Scope, parentNode: ParentNode) => BranchScope): void;
14
15
  export declare function _for_of(nodeAccessor: Accessor, renderer: Renderer): (scope: Scope, value: [all: unknown[], by?: ((item: unknown, index: number) => unknown) | undefined]) => void;
15
16
  export declare function _for_in(nodeAccessor: Accessor, renderer: Renderer): (scope: Scope, value: [obj: {}, by?: ((key: string, v: unknown) => unknown) | undefined]) => void;
16
17
  export declare function _for_to(nodeAccessor: Accessor, renderer: Renderer): (scope: Scope, value: [to: number, from: number, step: number, by?: ((v: number) => unknown) | undefined]) => void;
@@ -1,4 +1,4 @@
1
- import type { Scope } from "../common/types";
1
+ import { type Scope } from "../common/types";
2
2
  import type { Signal } from "./signals";
3
3
  type ExecFn<S extends Scope = Scope> = (scope: S, arg?: any) => void;
4
4
  export declare const caughtError: WeakSet<unknown[]>;
@@ -1,2 +1,2 @@
1
- import type { BranchScope } from "../common/types";
1
+ import { type BranchScope } from "../common/types";
2
2
  export declare function reconcile(parent: ParentNode, oldBranches: BranchScope[], newBranches: BranchScope[], afterReference: Node | null): void;
@@ -1,4 +1,4 @@
1
- import { type Accessor, type BranchScope, type Scope } from "../common/types";
1
+ import { type Accessor, AccessorProp, type BranchScope, type Scope } from "../common/types";
2
2
  import { type Signal, type SignalFn } from "./signals";
3
3
  export type Renderer = {
4
4
  ___id: string;
@@ -11,8 +11,8 @@ export type Renderer = {
11
11
  ___localClosureValues?: Record<Accessor, unknown>;
12
12
  };
13
13
  type SetupFn = (scope: Scope) => void;
14
- export declare function createBranch($global: Scope["$global"], renderer: Renderer | string, parentScope: Scope | undefined, parentNode: ParentNode): BranchScope;
15
- export declare function createAndSetupBranch($global: Scope["$global"], renderer: Renderer, parentScope: Scope | undefined, parentNode: ParentNode): BranchScope;
14
+ export declare function createBranch($global: Scope[AccessorProp.Global], renderer: Renderer | string, parentScope: Scope | undefined, parentNode: ParentNode): BranchScope;
15
+ export declare function createAndSetupBranch($global: Scope[AccessorProp.Global], renderer: Renderer, parentScope: Scope | undefined, parentNode: ParentNode): BranchScope;
16
16
  export declare function setupBranch(renderer: Renderer, branch: BranchScope): BranchScope;
17
17
  export declare function _content(id: string, template: string | 0, walks?: string | 0, setup?: {
18
18
  _: Signal<unknown>;
@@ -1,9 +1,9 @@
1
- import { type Scope } from "../common/types";
1
+ import { type EncodedAccessor, type Scope } from "../common/types";
2
2
  import type { Signal } from "./signals";
3
3
  export declare function enableBranches(): void;
4
4
  export declare function init(runtimeId?: string): void;
5
5
  export declare let isResuming: undefined | 0 | 1;
6
+ export declare function getRegisteredWithScope(id: string, scope?: Scope): unknown;
6
7
  export declare function _resume<T>(id: string, obj: T): T;
7
8
  export declare function _var_resume<T extends Signal<unknown>>(id: string, signal: T): T;
8
- export declare function getRegisteredWithScope(id: string, scope?: Scope): unknown;
9
- export declare function _el(id: string, key: string): (scope: Scope) => () => any;
9
+ export declare function _el(id: string, accessor: EncodedAccessor): (scope: Scope) => () => any;
@@ -1,5 +1,5 @@
1
- import type { BranchScope, Scope } from "../common/types";
2
- export declare function createScope($global: Scope["$global"], closestBranch?: BranchScope): Scope;
1
+ import { AccessorProp, type BranchScope, type Scope } from "../common/types";
2
+ export declare function createScope($global: Scope[AccessorProp.Global], closestBranch?: BranchScope): Scope;
3
3
  export declare function skipScope(): number;
4
4
  export declare function findBranchWithKey(scope: Scope, key: string): BranchScope | undefined;
5
5
  export declare function destroyBranch(branch: BranchScope): void;
@@ -1,16 +1,16 @@
1
- import { type Accessor, type Scope } from "../common/types";
1
+ import { type Accessor, AccessorProp, type EncodedAccessor, type Scope } from "../common/types";
2
2
  export type SignalFn = (scope: Scope) => void;
3
3
  export type Signal<T> = ((scope: Scope, value: T) => void) & {
4
4
  ___subscribe?(scope: Scope): void;
5
5
  };
6
- export declare function _let<T>(valueAccessor: Accessor, fn?: SignalFn): (scope: Scope, value: T, valueChange?: (v: T) => void) => T;
7
- export declare function _const<T>(valueAccessor: Accessor, fn?: SignalFn): Signal<T>;
6
+ export declare function _let<T>(id: EncodedAccessor, fn?: SignalFn): (scope: Scope, value: T, valueChange?: (v: T) => void) => T;
7
+ export declare function _const<T>(valueAccessor: EncodedAccessor, fn?: SignalFn): Signal<T>;
8
8
  export declare function _or(id: number, fn: SignalFn, defaultPending?: number, scopeIdAccessor?: Accessor): Signal<never>;
9
- export declare function _for_closure(ownerLoopNodeAccessor: Accessor, fn: SignalFn): SignalFn;
10
- export declare function _if_closure(ownerConditionalNodeAccessor: Accessor, branch: number, fn: SignalFn): SignalFn;
9
+ export declare function _for_closure(ownerLoopNodeAccessor: EncodedAccessor, fn: SignalFn): SignalFn;
10
+ export declare function _if_closure(ownerConditionalNodeAccessor: EncodedAccessor, branch: number, fn: SignalFn): SignalFn;
11
11
  export declare function subscribeToScopeSet(ownerScope: Scope, accessor: Accessor, scope: Scope): void;
12
12
  export declare function _closure(...closureSignals: ReturnType<typeof _closure_get>[]): (scope: Scope) => void;
13
- export declare function _closure_get(valueAccessor: Accessor, fn: SignalFn, getOwnerScope?: (scope: Scope) => Scope): SignalFn & {
13
+ export declare function _closure_get(valueAccessor: EncodedAccessor, fn: SignalFn, getOwnerScope?: (scope: Scope) => Scope): SignalFn & {
14
14
  ___scopeInstancesAccessor: string;
15
15
  ___signalIndexAccessor: string;
16
16
  ___index: number;
@@ -22,11 +22,11 @@ export declare function _child_setup(setup: Signal<never> & {
22
22
  } & {
23
23
  _: Signal<Scope>;
24
24
  };
25
- export declare function _var(scope: Scope, childAccessor: Accessor, signal: Signal<unknown>): void;
25
+ export declare function _var(scope: Scope, childAccessor: EncodedAccessor, signal: Signal<unknown>): void;
26
26
  export declare const _return: (scope: Scope, value: unknown) => any;
27
27
  export declare function _return_change(scope: Scope, changeHandler?: ((value: unknown) => void) | null | false): void;
28
28
  export declare const _var_change: (scope: Scope, value: unknown, name?: string) => void;
29
- export declare function _id({ $global }: Scope): string;
29
+ export declare function _id({ [AccessorProp.Global]: $global }: Scope): string;
30
30
  export declare function _script(id: string, fn: (scope: Scope) => void): (scope: Scope) => void;
31
31
  export declare function _el_read<T>(value: T): T;
32
32
  export declare function _hoist(...path: Accessor[]): (scope: Scope) => (...args: unknown[]) => any;
package/dist/dom.d.ts CHANGED
@@ -4,7 +4,7 @@ export { forIn, forOf, forTo, forUntil } from "./common/for";
4
4
  export { _call } from "./common/helpers";
5
5
  export { $signal, $signalReset } from "./dom/abort-signal";
6
6
  export { compat } from "./dom/compat";
7
- export { _await, _dynamic_tag, _for_in, _for_of, _for_to, _for_until, _if, _try, } from "./dom/control-flow";
7
+ export { _await, _dynamic_tag, _for_in, _for_of, _for_to, _for_until, _if, _resume_dynamic_tag, _try, } from "./dom/control-flow";
8
8
  export { _attr_details_or_dialog_open as _attr_details_open, _attr_details_or_dialog_open_script as _attr_details_open_script, _attr_details_or_dialog_open as _attr_dialog_open, _attr_details_or_dialog_open_script as _attr_dialog_open_script, _attr_input_checked, _attr_input_checked_script, _attr_input_checkedValue, _attr_input_checkedValue_script, _attr_input_value, _attr_input_value_script, _attr_select_value, _attr_select_value_script, _attr_textarea_value, _attr_textarea_value_script, } from "./dom/controllable";
9
9
  export { _attr, _attr_class, _attr_class_item, _attr_class_items, _attr_content, _attr_style, _attr_style_item, _attr_style_items, _attrs, _attrs_content, _attrs_partial, _attrs_partial_content, _attrs_script, _html, _lifecycle, _text, _text_content, } from "./dom/dom";
10
10
  export { _on } from "./dom/event";