ilha 0.12.0 → 0.13.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.
@@ -1,5 +1,13 @@
1
- import { S as NativeEventModifier, T as RawHtml, x as NativeEventHandler } from "./index-DZI0fEmR.js";
1
+ import { S as NativeEventModifier, T as RawHtml, k as TemplateNode, x as NativeEventHandler } from "./index-CVOjC94p.js";
2
2
  //#region src/internal.d.ts
3
+ type ServerAction<A extends unknown[] = unknown[], R = unknown> = ((...args: A) => R) & {
4
+ with: (...args: unknown[]) => (...runtimeArgs: unknown[]) => unknown;
5
+ };
6
+ type ServerActionBinder = <A extends unknown[], R>(fn: (...args: A) => R, manifestId?: string) => ServerAction<A, R>;
7
+ /** @internal Register core's action branding implementation. */
8
+ declare function setServerActionBinder(binder: ServerActionBinder): void;
9
+ /** @internal Brand an external server action for hydration-manifest replay. */
10
+ declare function bindServerAction<A extends unknown[], R>(fn: (...args: A) => R, manifestId?: string): ServerAction<A, R>;
3
11
  /** Registry of live island mount handles keyed by host element. */
4
12
  declare const ISLAND_MOUNT_HANDLES: WeakMap<Element, {
5
13
  unmount: () => void | Promise<void>;
@@ -37,6 +45,14 @@ declare function __ilhaJsxSlot(options: {
37
45
  props: Record<string, unknown> | undefined;
38
46
  key: string | undefined;
39
47
  }): RawHtml;
48
+ type TemplateRenderer = (node: TemplateNode) => RawHtml;
49
+ /** Register the core's template→HTML renderer. Internal — called once by ilha. */
50
+ declare function setTemplateRenderer(renderer: TemplateRenderer): void;
51
+ /**
52
+ * @internal Render a template IR node to RawHtml. Used by the JSX runtime so
53
+ * elements skip the html`` string/parse round-trip.
54
+ */
55
+ declare function __ilhaRenderTemplate(node: TemplateNode): RawHtml;
40
56
  /** A hydration-manifest entry: sentinel key → action id or captured payload. */
41
57
  type ManifestEntry = string | {
42
58
  k: string;
@@ -58,4 +74,4 @@ declare function setServerManifestSerializer(serializer: ServerManifestSerialize
58
74
  /** @internal Used by island rendering to serialize nested child manifests. */
59
75
  declare function serializeServerManifest(manifest: Map<string, ManifestEntry>): string;
60
76
  //#endregion
61
- export { ISLAND_MOUNT_HANDLES, ISLAND_MOUNT_INTERNAL, JsxEventRegistration, JsxRuntimeBridge, ManifestEntry, ServerManifestSerializer, __ilhaJsxEvent, __ilhaJsxSlot, serializeServerManifest, setJsxRuntimeBridge, setServerManifestSerializer };
77
+ export { ISLAND_MOUNT_HANDLES, ISLAND_MOUNT_INTERNAL, JsxEventRegistration, JsxRuntimeBridge, ManifestEntry, ServerAction, ServerManifestSerializer, __ilhaJsxEvent, __ilhaJsxSlot, __ilhaRenderTemplate, bindServerAction, serializeServerManifest, setJsxRuntimeBridge, setServerActionBinder, setServerManifestSerializer, setTemplateRenderer };
package/dist/internal.js CHANGED
@@ -1,4 +1,14 @@
1
1
  //#region src/internal.ts
2
+ let serverActionBinder;
3
+ /** @internal Register core's action branding implementation. */
4
+ function setServerActionBinder(binder) {
5
+ serverActionBinder = binder;
6
+ }
7
+ /** @internal Brand an external server action for hydration-manifest replay. */
8
+ function bindServerAction(fn, manifestId) {
9
+ if (!serverActionBinder) throw new Error("ilha: server action binder is unavailable");
10
+ return serverActionBinder(fn, manifestId);
11
+ }
2
12
  /** Registry of live island mount handles keyed by host element. */
3
13
  const ISLAND_MOUNT_HANDLES = /* @__PURE__ */ new WeakMap();
4
14
  /** Hook a parent's mountSlots uses to mount a child island and keep a handle
@@ -20,6 +30,19 @@ function __ilhaJsxSlot(options) {
20
30
  value: ""
21
31
  };
22
32
  }
33
+ let templateRenderer = null;
34
+ /** Register the core's template→HTML renderer. Internal — called once by ilha. */
35
+ function setTemplateRenderer(renderer) {
36
+ templateRenderer = renderer;
37
+ }
38
+ /**
39
+ * @internal Render a template IR node to RawHtml. Used by the JSX runtime so
40
+ * elements skip the html`` string/parse round-trip.
41
+ */
42
+ function __ilhaRenderTemplate(node) {
43
+ if (!templateRenderer) throw new Error("ilha: template renderer is unavailable");
44
+ return templateRenderer(node);
45
+ }
23
46
  let serverManifestSerializer = null;
24
47
  /**
25
48
  * Register the server-manifest serializer. Owned by @ilha/router — core only
@@ -36,4 +59,4 @@ function serializeServerManifest(manifest) {
36
59
  }
37
60
 
38
61
  //#endregion
39
- export { ISLAND_MOUNT_HANDLES, ISLAND_MOUNT_INTERNAL, __ilhaJsxEvent, __ilhaJsxSlot, serializeServerManifest, setJsxRuntimeBridge, setServerManifestSerializer };
62
+ export { ISLAND_MOUNT_HANDLES, ISLAND_MOUNT_INTERNAL, __ilhaJsxEvent, __ilhaJsxSlot, __ilhaRenderTemplate, bindServerAction, serializeServerManifest, setJsxRuntimeBridge, setServerActionBinder, setServerManifestSerializer, setTemplateRenderer };
@@ -1,2 +1,2 @@
1
- import { a as JSX, r as jsxDEV, t as Fragment } from "./jsx-runtime-BCGuHwTg.js";
1
+ import { a as JSX, r as jsxDEV, t as Fragment } from "./jsx-runtime-CzU-60tX.js";
2
2
  export { Fragment, type JSX, jsxDEV };
@@ -1,3 +1,3 @@
1
- import { Fragment, jsxDEV } from "./jsx-runtime.js";
1
+ import { r as jsxDEV, t as Fragment } from "./jsx-runtime-DreKruAt.js";
2
2
 
3
3
  export { Fragment, jsxDEV };
@@ -1,4 +1,4 @@
1
- import { E as SignalAccessor, O as SignalWriter, S as NativeEventModifier, T as RawHtml, x as NativeEventHandler } from "./index-DZI0fEmR.js";
1
+ import { D as SignalWriter, E as SignalAccessor, S as NativeEventModifier, T as RawHtml, x as NativeEventHandler } from "./index-CVOjC94p.js";
2
2
  //#region src/jsx-types.d.ts
3
3
  declare namespace JSX {
4
4
  export type Child = unknown;
@@ -0,0 +1,124 @@
1
+ import { __ilhaJsxSlot, __ilhaRenderTemplate } from "./internal.js";
2
+ import { raw } from "./index.js";
3
+
4
+ //#region src/template.ts
5
+ function elementTemplate(tag, props, children) {
6
+ const attrs = { ...props };
7
+ delete attrs.children;
8
+ return {
9
+ kind: "element",
10
+ tag,
11
+ props: attrs,
12
+ children: children.flat(Infinity).map((value) => ({
13
+ kind: "dynamic",
14
+ value
15
+ }))
16
+ };
17
+ }
18
+ function fragmentTemplate(children) {
19
+ return {
20
+ kind: "fragment",
21
+ children: children.flat(Infinity).map((value) => ({
22
+ kind: "dynamic",
23
+ value
24
+ }))
25
+ };
26
+ }
27
+
28
+ //#endregion
29
+ //#region src/jsx-runtime.ts
30
+ const RAW = Symbol.for("ilha.raw");
31
+ const ISLAND = Symbol.for("ilha.island");
32
+ const ISLAND_CALL = Symbol.for("ilha.islandCall");
33
+ const RENDER_PART = Symbol.for("ilha.renderPart");
34
+ function isRawHtml(v) {
35
+ return !!(v && typeof v === "object" && RAW in v);
36
+ }
37
+ function isIsland(v) {
38
+ return typeof v === "function" && ISLAND in v;
39
+ }
40
+ function isIslandCall(v) {
41
+ if (v == null || typeof v !== "object" && typeof v !== "function") return false;
42
+ if (ISLAND_CALL in v) return true;
43
+ return typeof v === "object" && "island" in v && isIsland(v.island);
44
+ }
45
+ function normalizeJsxChildren(props, children) {
46
+ const propChildren = props && "children" in props ? props.children : void 0;
47
+ return (children.length > 0 ? children : propChildren === void 0 ? [] : [propChildren]).flat(1);
48
+ }
49
+ function normalizeJsxSlotKey(rawKey) {
50
+ const key = String(rawKey);
51
+ if (key.trim().length === 0) throw new Error("jsx key requires a non-empty string.");
52
+ if (key.includes(":")) throw new Error(`jsx key cannot contain the slot separator ":" (got "${key}").`);
53
+ return key;
54
+ }
55
+ function extractJsxSlotKey(props, keyArg) {
56
+ const fromProps = props?.key;
57
+ const rawKey = keyArg ?? (typeof fromProps === "string" || typeof fromProps === "number" ? fromProps : void 0);
58
+ if (rawKey == null) return void 0;
59
+ return normalizeJsxSlotKey(rawKey);
60
+ }
61
+ function escapeAttrValue(value) {
62
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
63
+ }
64
+ function injectDataKey(out, key) {
65
+ const m = /^\s*<([a-zA-Z][a-zA-Z0-9:._-]*)/.exec(out.value);
66
+ if (!m) return out;
67
+ const openEnd = out.value.indexOf(">", m.index);
68
+ const openTag = out.value.slice(m.index, openEnd === -1 ? void 0 : openEnd);
69
+ if (/\sdata-key\s*=/.test(openTag)) return out;
70
+ const insertAt = m.index + m[0].length;
71
+ return raw(`${out.value.slice(0, insertAt)} data-key="${escapeAttrValue(key)}"${out.value.slice(insertAt)}`);
72
+ }
73
+ function renderJsxValue(value) {
74
+ return __ilhaRenderTemplate(fragmentTemplate([value]));
75
+ }
76
+ function renderJsxElement({ type, props, children, slotKey }) {
77
+ const attrs = { ...props ?? {} };
78
+ delete attrs.children;
79
+ if (slotKey !== void 0) attrs.key = slotKey;
80
+ return __ilhaRenderTemplate(elementTemplate(type, attrs, children));
81
+ }
82
+ function jsx(type, props, maybeKey, ...restChildren) {
83
+ const hasKeyArg = typeof maybeKey === "string" || typeof maybeKey === "number";
84
+ const keyFromArg = hasKeyArg ? maybeKey : void 0;
85
+ const normalizedChildren = normalizeJsxChildren(props, hasKeyArg || maybeKey === void 0 ? restChildren : [maybeKey, ...restChildren]);
86
+ const slotKey = extractJsxSlotKey(props, typeof keyFromArg === "string" || typeof keyFromArg === "number" ? keyFromArg : void 0);
87
+ if (typeof type === "function") {
88
+ const componentProps = {
89
+ ...props,
90
+ ...normalizedChildren.length > 0 ? { children: normalizedChildren } : {}
91
+ };
92
+ delete componentProps.key;
93
+ const out = type(Object.keys(componentProps).length ? componentProps : {});
94
+ if (isIslandCall(out)) {
95
+ if (slotKey !== void 0) out.key = slotKey;
96
+ return renderJsxValue(out);
97
+ }
98
+ if (isRawHtml(out)) return slotKey !== void 0 ? injectDataKey(out, slotKey) : out;
99
+ if (typeof out === "string" && isIsland(type)) return __ilhaJsxSlot({
100
+ island: type,
101
+ props: componentProps,
102
+ key: slotKey
103
+ });
104
+ if (typeof out === "string") return renderJsxValue(out);
105
+ if (typeof out === "object" && out !== null && Object.getPrototypeOf(out) === Object.prototype && out[RENDER_PART] === true && typeof out.toString === "function") return raw(String(out));
106
+ return renderJsxValue(out);
107
+ }
108
+ return renderJsxElement({
109
+ type,
110
+ props,
111
+ children: normalizedChildren,
112
+ slotKey
113
+ });
114
+ }
115
+ const jsxs = jsx;
116
+ function Fragment(props, ...children) {
117
+ return __ilhaRenderTemplate(fragmentTemplate(normalizeJsxChildren(props, children)));
118
+ }
119
+ function jsxDEV(type, props, maybeKey, _source, _self) {
120
+ return jsx(type, props, maybeKey);
121
+ }
122
+
123
+ //#endregion
124
+ export { jsxs as i, jsx as n, jsxDEV as r, Fragment as t };
@@ -1,2 +1,2 @@
1
- import { a as JSX, i as jsxs, n as jsx, r as jsxDEV, t as Fragment } from "./jsx-runtime-BCGuHwTg.js";
1
+ import { a as JSX, i as jsxs, n as jsx, r as jsxDEV, t as Fragment } from "./jsx-runtime-CzU-60tX.js";
2
2
  export { Fragment, type JSX, jsx, jsxDEV, jsxs };
@@ -1,237 +1,3 @@
1
- import { __ilhaJsxEvent, __ilhaJsxSlot } from "./internal.js";
2
- import { html, isSafeUrlAttrValue, isUrlAttributeName, raw, serializeStyle } from "./index.js";
1
+ import { i as jsxs, n as jsx, r as jsxDEV, t as Fragment } from "./jsx-runtime-DreKruAt.js";
3
2
 
4
- //#region src/jsx-runtime.ts
5
- function toTemplateStrings(chunks) {
6
- return Object.assign(chunks, { raw: chunks });
7
- }
8
- const RAW = Symbol.for("ilha.raw");
9
- const SIGNAL_ACCESSOR = Symbol.for("ilha.signalAccessor");
10
- const ISLAND = Symbol.for("ilha.island");
11
- const ISLAND_CALL = Symbol.for("ilha.islandCall");
12
- const RENDER_PART = Symbol.for("ilha.renderPart");
13
- const SAFE_NAME_RE = /^[A-Za-z_:][A-Za-z0-9:._-]*$/;
14
- const SAFE_BIND_LOCAL_RE = /^[A-Za-z][A-Za-z0-9]*$/;
15
- const SAFE_EVENT_PROP_RE = /^on([a-z][a-z0-9-]*)(?::(abortable|once|capture|passive))?$/;
16
- const JSX_ATTRIBUTE_ALIASES = {
17
- className: "class",
18
- htmlFor: "for",
19
- acceptCharset: "accept-charset",
20
- httpEquiv: "http-equiv",
21
- accentHeight: "accent-height",
22
- alignmentBaseline: "alignment-baseline",
23
- baselineShift: "baseline-shift",
24
- clipPath: "clip-path",
25
- clipRule: "clip-rule",
26
- dominantBaseline: "dominant-baseline",
27
- fillOpacity: "fill-opacity",
28
- fillRule: "fill-rule",
29
- floodColor: "flood-color",
30
- floodOpacity: "flood-opacity",
31
- fontFamily: "font-family",
32
- fontSize: "font-size",
33
- fontStyle: "font-style",
34
- fontWeight: "font-weight",
35
- markerEnd: "marker-end",
36
- markerMid: "marker-mid",
37
- markerStart: "marker-start",
38
- stopColor: "stop-color",
39
- stopOpacity: "stop-opacity",
40
- strokeDasharray: "stroke-dasharray",
41
- strokeDashoffset: "stroke-dashoffset",
42
- strokeLinecap: "stroke-linecap",
43
- strokeLinejoin: "stroke-linejoin",
44
- strokeMiterlimit: "stroke-miterlimit",
45
- strokeOpacity: "stroke-opacity",
46
- strokeWidth: "stroke-width",
47
- textAnchor: "text-anchor",
48
- vectorEffect: "vector-effect",
49
- xlinkHref: "xlink:href"
50
- };
51
- const STRING_BOOLEAN_ATTRIBUTES = /* @__PURE__ */ new Set([
52
- "contenteditable",
53
- "draggable",
54
- "spellcheck"
55
- ]);
56
- const VOID_ELEMENTS = /* @__PURE__ */ new Set([
57
- "area",
58
- "base",
59
- "br",
60
- "col",
61
- "embed",
62
- "hr",
63
- "img",
64
- "input",
65
- "link",
66
- "meta",
67
- "param",
68
- "source",
69
- "track",
70
- "wbr"
71
- ]);
72
- function isRawHtml(v) {
73
- return !!(v && typeof v === "object" && RAW in v);
74
- }
75
- function isSignalAccessor(v) {
76
- return typeof v === "function" && SIGNAL_ACCESSOR in v;
77
- }
78
- function isIsland(v) {
79
- return typeof v === "function" && ISLAND in v;
80
- }
81
- function isIslandCall(v) {
82
- if (v == null || typeof v !== "object" && typeof v !== "function") return false;
83
- if (ISLAND_CALL in v) return true;
84
- return typeof v === "object" && "island" in v && isIsland(v.island);
85
- }
86
- function normalizeClass(value) {
87
- if (Array.isArray(value)) return value.filter(Boolean).join(" ");
88
- if (value && typeof value === "object") return Object.entries(value).filter(([, enabled]) => Boolean(enabled)).map(([name]) => name).join(" ");
89
- return String(value);
90
- }
91
- function normalizeJsxChildren(props, children) {
92
- const propChildren = props && "children" in props ? props.children : void 0;
93
- return (children.length > 0 ? children : propChildren === void 0 ? [] : [propChildren]).flat(1);
94
- }
95
- function normalizeJsxSlotKey(rawKey) {
96
- const key = String(rawKey);
97
- if (key.trim().length === 0) throw new Error("jsx key requires a non-empty string.");
98
- if (key.includes(":")) throw new Error(`jsx key cannot contain the slot separator ":" (got "${key}").`);
99
- return key;
100
- }
101
- function extractJsxSlotKey(props, keyArg) {
102
- const fromProps = props?.key;
103
- const rawKey = keyArg ?? (typeof fromProps === "string" || typeof fromProps === "number" ? fromProps : void 0);
104
- if (rawKey == null) return void 0;
105
- return normalizeJsxSlotKey(rawKey);
106
- }
107
- function pushJsxAttr({ chunks, values, eventSpecs, tagName, name, value }) {
108
- if (value == null || name === "children" || name === "key") return;
109
- if (name === "__proto__" || name === "constructor" || name === "prototype") return;
110
- if (name.startsWith("bind:")) {
111
- const [prefix, localName, ...rest] = name.split(":");
112
- if (prefix !== "bind" || rest.length > 0 || !localName || !SAFE_BIND_LOCAL_RE.test(localName)) return;
113
- if (!isSignalAccessor(value)) return;
114
- chunks[chunks.length - 1] += ` ${prefix}:${localName}=`;
115
- values.push(value);
116
- chunks.push("");
117
- return;
118
- }
119
- if (!SAFE_NAME_RE.test(name)) return;
120
- const safeName = JSX_ATTRIBUTE_ALIASES[name] ?? name;
121
- if (safeName.startsWith("on")) {
122
- const eventMatch = SAFE_EVENT_PROP_RE.exec(safeName);
123
- if (typeof value !== "function" || !eventMatch) return;
124
- const eventName = eventMatch[1];
125
- const modifier = eventMatch[2];
126
- const index = __ilhaJsxEvent({
127
- type: eventName,
128
- handler: value,
129
- modifier
130
- });
131
- if (index !== void 0) eventSpecs.push(`${eventName}:${index}`);
132
- return;
133
- }
134
- const securityName = safeName.toLowerCase();
135
- if (securityName === "srcdoc") return;
136
- const stringBoolean = securityName.startsWith("aria-") || STRING_BOOLEAN_ATTRIBUTES.has(securityName);
137
- if (typeof value === "boolean" && stringBoolean) value = String(value);
138
- else if (value === false) return;
139
- if (safeName === "class" && !isRawHtml(value)) value = normalizeClass(value);
140
- if (safeName === "style" && value && typeof value === "object" && !isRawHtml(value)) value = serializeStyle(value);
141
- if (isUrlAttributeName(securityName) && !isSafeUrlAttrValue(tagName, securityName, typeof value === "string" ? value : String(value))) return;
142
- if (value === true) {
143
- chunks[chunks.length - 1] += ` ${safeName}`;
144
- return;
145
- }
146
- chunks[chunks.length - 1] += ` ${safeName}="`;
147
- values.push(value);
148
- chunks.push("\"");
149
- }
150
- function escapeAttrValue(value) {
151
- return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
152
- }
153
- function injectDataKey(out, key) {
154
- const m = /^\s*<([a-zA-Z][a-zA-Z0-9:._-]*)/.exec(out.value);
155
- if (!m) return out;
156
- const openEnd = out.value.indexOf(">", m.index);
157
- const openTag = out.value.slice(m.index, openEnd === -1 ? void 0 : openEnd);
158
- if (/\sdata-key\s*=/.test(openTag)) return out;
159
- const insertAt = m.index + m[0].length;
160
- return raw(`${out.value.slice(0, insertAt)} data-key="${escapeAttrValue(key)}"${out.value.slice(insertAt)}`);
161
- }
162
- function renderJsxElement({ type, props, children, slotKey }) {
163
- const chunks = [`<${type}`];
164
- const values = [];
165
- const eventSpecs = [];
166
- if (props) for (const [name, value] of Object.entries(props)) pushJsxAttr({
167
- chunks,
168
- values,
169
- eventSpecs,
170
- tagName: type,
171
- name,
172
- value
173
- });
174
- if (slotKey !== void 0 && props?.["data-key"] == null) pushJsxAttr({
175
- chunks,
176
- values,
177
- eventSpecs,
178
- tagName: type,
179
- name: "data-key",
180
- value: slotKey
181
- });
182
- if (eventSpecs.length > 0) chunks[chunks.length - 1] += ` data-ilha-on="${eventSpecs.join(",")}"`;
183
- chunks[chunks.length - 1] += ">";
184
- if (!VOID_ELEMENTS.has(type)) {
185
- for (const child of children) {
186
- values.push(child);
187
- chunks.push("");
188
- }
189
- chunks[chunks.length - 1] += `</${type}>`;
190
- }
191
- return html(toTemplateStrings(chunks), ...values);
192
- }
193
- function jsx(type, props, maybeKey, ...restChildren) {
194
- const hasKeyArg = typeof maybeKey === "string" || typeof maybeKey === "number";
195
- const keyFromArg = hasKeyArg ? maybeKey : void 0;
196
- const normalizedChildren = normalizeJsxChildren(props, hasKeyArg || maybeKey === void 0 ? restChildren : [maybeKey, ...restChildren]);
197
- const slotKey = extractJsxSlotKey(props, typeof keyFromArg === "string" || typeof keyFromArg === "number" ? keyFromArg : void 0);
198
- if (typeof type === "function") {
199
- const componentProps = {
200
- ...props,
201
- ...normalizedChildren.length > 0 ? { children: normalizedChildren } : {}
202
- };
203
- delete componentProps.key;
204
- const out = type(Object.keys(componentProps).length ? componentProps : {});
205
- if (isIslandCall(out)) {
206
- if (slotKey !== void 0) out.key = slotKey;
207
- return html`${out}`;
208
- }
209
- if (isRawHtml(out)) return slotKey !== void 0 ? injectDataKey(out, slotKey) : out;
210
- if (typeof out === "string" && isIsland(type)) return __ilhaJsxSlot({
211
- island: type,
212
- props: componentProps,
213
- key: slotKey
214
- });
215
- if (typeof out === "string") return html`${out}`;
216
- if (typeof out === "object" && out !== null && Object.getPrototypeOf(out) === Object.prototype && out[RENDER_PART] === true && typeof out.toString === "function") return raw(String(out));
217
- return html`${out}`;
218
- }
219
- return renderJsxElement({
220
- type,
221
- props,
222
- children: normalizedChildren,
223
- slotKey
224
- });
225
- }
226
- const jsxs = jsx;
227
- function Fragment(props, ...children) {
228
- const normalizedChildren = normalizeJsxChildren(props, children);
229
- const chunks = ["", ...normalizedChildren.map(() => "")];
230
- return html(toTemplateStrings(chunks), ...normalizedChildren);
231
- }
232
- function jsxDEV(type, props, maybeKey, _source, _self) {
233
- return jsx(type, props, maybeKey);
234
- }
235
-
236
- //#endregion
237
3
  export { Fragment, jsx, jsxDEV, jsxs };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ilha",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "A tiny, framework-free island architecture library",
5
5
  "keywords": [
6
6
  "framework-free",