airx 0.7.0 → 0.7.1

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 (145) hide show
  1. package/output/app/app.d.ts +32 -2
  2. package/output/app/app.d.ts.map +1 -1
  3. package/output/app/app.js +51 -0
  4. package/output/app/app.js.map +1 -0
  5. package/output/app/index.d.ts +1 -1
  6. package/output/app/index.d.ts.map +1 -1
  7. package/output/app/index.js +2 -0
  8. package/output/app/index.js.map +1 -0
  9. package/output/element/element.d.ts +67 -8
  10. package/output/element/element.d.ts.map +1 -1
  11. package/output/element/element.js +106 -0
  12. package/output/element/element.js.map +1 -0
  13. package/output/element/index.d.ts +1 -1
  14. package/output/element/index.d.ts.map +1 -1
  15. package/output/element/index.js +2 -0
  16. package/output/element/index.js.map +1 -0
  17. package/output/index.d.ts +39 -5
  18. package/output/index.d.ts.map +1 -1
  19. package/output/index.js +36 -711
  20. package/output/index.js.map +1 -0
  21. package/output/jsx-dev-runtime.d.ts +4 -0
  22. package/output/jsx-dev-runtime.d.ts.map +1 -0
  23. package/output/jsx-dev-runtime.js +9 -0
  24. package/output/jsx-dev-runtime.js.map +1 -0
  25. package/output/jsx-runtime.d.ts +23 -0
  26. package/output/jsx-runtime.d.ts.map +1 -0
  27. package/output/jsx-runtime.js +24 -0
  28. package/output/jsx-runtime.js.map +1 -0
  29. package/output/logger/index.d.ts +1 -1
  30. package/output/logger/index.d.ts.map +1 -1
  31. package/output/logger/index.js +2 -0
  32. package/output/logger/index.js.map +1 -0
  33. package/output/logger/logger.js +17 -0
  34. package/output/logger/logger.js.map +1 -0
  35. package/output/render/basic/common.d.ts +3 -3
  36. package/output/render/basic/common.d.ts.map +1 -1
  37. package/output/render/basic/common.js +436 -0
  38. package/output/render/basic/common.js.map +1 -0
  39. package/output/render/basic/hooks/hooks.d.ts +51 -1
  40. package/output/render/basic/hooks/hooks.d.ts.map +1 -1
  41. package/output/render/basic/hooks/hooks.js +72 -0
  42. package/output/render/basic/hooks/hooks.js.map +1 -0
  43. package/output/render/basic/hooks/index.d.ts +1 -1
  44. package/output/render/basic/hooks/index.d.ts.map +1 -1
  45. package/output/render/basic/hooks/index.js +2 -0
  46. package/output/render/basic/hooks/index.js.map +1 -0
  47. package/output/render/basic/index.d.ts +1 -1
  48. package/output/render/basic/index.d.ts.map +1 -1
  49. package/output/render/basic/index.js +2 -0
  50. package/output/render/basic/index.js.map +1 -0
  51. package/output/render/basic/plugins/context/context.d.ts +1 -1
  52. package/output/render/basic/plugins/context/context.d.ts.map +1 -1
  53. package/output/render/basic/plugins/context/context.js +12 -0
  54. package/output/render/basic/plugins/context/context.js.map +1 -0
  55. package/output/render/basic/plugins/context/index.d.ts +1 -1
  56. package/output/render/basic/plugins/context/index.d.ts.map +1 -1
  57. package/output/render/basic/plugins/context/index.js +2 -0
  58. package/output/render/basic/plugins/context/index.js.map +1 -0
  59. package/output/render/basic/plugins/index.d.ts +2 -2
  60. package/output/render/basic/plugins/index.d.ts.map +1 -1
  61. package/output/render/basic/plugins/index.js +2 -0
  62. package/output/render/basic/plugins/index.js.map +1 -0
  63. package/output/render/basic/plugins/internal/basic/basic.d.ts +3 -3
  64. package/output/render/basic/plugins/internal/basic/basic.d.ts.map +1 -1
  65. package/output/render/basic/plugins/internal/basic/basic.js +158 -0
  66. package/output/render/basic/plugins/internal/basic/basic.js.map +1 -0
  67. package/output/render/basic/plugins/internal/basic/index.d.ts +1 -1
  68. package/output/render/basic/plugins/internal/basic/index.d.ts.map +1 -1
  69. package/output/render/basic/plugins/internal/basic/index.js +2 -0
  70. package/output/render/basic/plugins/internal/basic/index.js.map +1 -0
  71. package/output/render/basic/plugins/internal/inject/index.d.ts +1 -1
  72. package/output/render/basic/plugins/internal/inject/index.d.ts.map +1 -1
  73. package/output/render/basic/plugins/internal/inject/index.js +2 -0
  74. package/output/render/basic/plugins/internal/inject/index.js.map +1 -0
  75. package/output/render/basic/plugins/internal/inject/inject.d.ts +2 -2
  76. package/output/render/basic/plugins/internal/inject/inject.d.ts.map +1 -1
  77. package/output/render/basic/plugins/internal/inject/inject.js +25 -0
  78. package/output/render/basic/plugins/internal/inject/inject.js.map +1 -0
  79. package/output/render/basic/plugins/plugin.d.ts +2 -2
  80. package/output/render/basic/plugins/plugin.d.ts.map +1 -1
  81. package/output/render/basic/plugins/plugin.js +2 -0
  82. package/output/render/basic/plugins/plugin.js.map +1 -0
  83. package/output/render/browser/browser.d.ts +3 -3
  84. package/output/render/browser/browser.d.ts.map +1 -1
  85. package/output/render/browser/browser.js +218 -0
  86. package/output/render/browser/browser.js.map +1 -0
  87. package/output/render/browser/index.d.ts +1 -1
  88. package/output/render/browser/index.d.ts.map +1 -1
  89. package/output/render/browser/index.js +2 -0
  90. package/output/render/browser/index.js.map +1 -0
  91. package/output/render/index.d.ts +4 -4
  92. package/output/render/index.d.ts.map +1 -1
  93. package/output/render/index.js +5 -0
  94. package/output/render/index.js.map +1 -0
  95. package/output/render/server/index.d.ts +1 -1
  96. package/output/render/server/index.d.ts.map +1 -1
  97. package/output/render/server/index.js +2 -0
  98. package/output/render/server/index.js.map +1 -0
  99. package/output/render/server/server.d.ts +2 -2
  100. package/output/render/server/server.d.ts.map +1 -1
  101. package/output/render/server/server.js +314 -0
  102. package/output/render/server/server.js.map +1 -0
  103. package/output/signal/index.d.ts +2 -2
  104. package/output/signal/index.d.ts.map +1 -1
  105. package/output/signal/index.js +2 -0
  106. package/output/signal/index.js.map +1 -0
  107. package/output/signal/signal.d.ts +1 -1
  108. package/output/signal/signal.js +46 -0
  109. package/output/signal/signal.js.map +1 -0
  110. package/output/symbol/index.js +2 -0
  111. package/output/symbol/index.js.map +1 -0
  112. package/output/types/index.d.ts +1 -1
  113. package/output/types/index.d.ts.map +1 -1
  114. package/output/types/index.js +2 -0
  115. package/output/types/index.js.map +1 -0
  116. package/output/types/types.d.ts +2 -2
  117. package/output/types/types.d.ts.map +1 -1
  118. package/output/types/types.js +2 -0
  119. package/output/types/types.js.map +1 -0
  120. package/package.json +17 -14
  121. package/output/app/app.test.d.ts +0 -2
  122. package/output/app/app.test.d.ts.map +0 -1
  123. package/output/element/element.test.d.ts +0 -2
  124. package/output/element/element.test.d.ts.map +0 -1
  125. package/output/index.umd.cjs +0 -1
  126. package/output/logger/logger.test.d.ts +0 -2
  127. package/output/logger/logger.test.d.ts.map +0 -1
  128. package/output/render/basic/common.test.d.ts +0 -2
  129. package/output/render/basic/common.test.d.ts.map +0 -1
  130. package/output/render/basic/hooks/hooks.test.d.ts +0 -2
  131. package/output/render/basic/hooks/hooks.test.d.ts.map +0 -1
  132. package/output/render/basic/plugins/context/context.test.d.ts +0 -2
  133. package/output/render/basic/plugins/context/context.test.d.ts.map +0 -1
  134. package/output/render/basic/plugins/internal/basic/basic.test.d.ts +0 -2
  135. package/output/render/basic/plugins/internal/basic/basic.test.d.ts.map +0 -1
  136. package/output/render/basic/plugins/internal/inject/inject.test.d.ts +0 -2
  137. package/output/render/basic/plugins/internal/inject/inject.test.d.ts.map +0 -1
  138. package/output/render/basic/plugins/plugin.test.d.ts +0 -2
  139. package/output/render/basic/plugins/plugin.test.d.ts.map +0 -1
  140. package/output/render/browser/browser.test.d.ts +0 -2
  141. package/output/render/browser/browser.test.d.ts.map +0 -1
  142. package/output/render/server/server.test.d.ts +0 -2
  143. package/output/render/server/server.test.d.ts.map +0 -1
  144. package/output/signal/signal.test.d.ts +0 -5
  145. package/output/signal/signal.test.d.ts.map +0 -1
@@ -1,5 +1,14 @@
1
- import { Plugin } from '../render';
2
- import { AirxComponent, AirxElement } from '../element';
1
+ import { Plugin } from '../render/index.js';
2
+ import { AirxComponent, AirxElement } from '../element/index.js';
3
+ /**
4
+ * Airx 应用实例。
5
+ *
6
+ * @example
7
+ * import { createApp } from 'airx'
8
+ * import { App } from './App.js'
9
+ *
10
+ * createApp(App).mount(document.getElementById('root')!)
11
+ */
3
12
  export interface AirxApp {
4
13
  mount: (container: HTMLElement) => AirxApp;
5
14
  /** @deprecated WIP */
@@ -7,5 +16,26 @@ export interface AirxApp {
7
16
  /** @deprecated WIP */
8
17
  renderToHTML: () => Promise<string>;
9
18
  }
19
+ /**
20
+ * 创建一个 Airx 应用。
21
+ *
22
+ * 支持直接传入组件函数,也支持传入已经创建好的元素。
23
+ *
24
+ * @param element 根组件或根元素。
25
+ * @returns 可继续链式调用的应用实例。
26
+ *
27
+ * @example
28
+ * import { createApp } from 'airx'
29
+ * import { App } from './App.js'
30
+ *
31
+ * createApp(App).mount(document.getElementById('root')!)
32
+ *
33
+ * @example
34
+ * import { createApp, createElement } from 'airx'
35
+ * import { App } from './App.js'
36
+ *
37
+ * const appElement = createElement(App, { title: 'Airx' })
38
+ * createApp(appElement).mount(document.getElementById('root')!)
39
+ */
10
40
  export declare function createApp(element: AirxElement<any> | AirxComponent): AirxApp;
11
41
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../source/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAiB,MAAM,WAAW,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAA;AAEtE,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAA;IAE1C,sBAAsB;IACtB,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAA;IACzC,sBAAsB;IACtB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACpC;AAGD,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,OAAO,CA+B5E"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../source/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AACvF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAA;AAE/E;;;;;;;;GAQG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAA;IAE1C,sBAAsB;IACtB,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAA;IACzC,sBAAsB;IACtB,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CACpC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,OAAO,CA+B5E"}
@@ -0,0 +1,51 @@
1
+ import { browserRender, serverRender, PluginContext } from '../render/index.js';
2
+ import { createElement } from '../element/index.js';
3
+ /**
4
+ * 创建一个 Airx 应用。
5
+ *
6
+ * 支持直接传入组件函数,也支持传入已经创建好的元素。
7
+ *
8
+ * @param element 根组件或根元素。
9
+ * @returns 可继续链式调用的应用实例。
10
+ *
11
+ * @example
12
+ * import { createApp } from 'airx'
13
+ * import { App } from './App.js'
14
+ *
15
+ * createApp(App).mount(document.getElementById('root')!)
16
+ *
17
+ * @example
18
+ * import { createApp, createElement } from 'airx'
19
+ * import { App } from './App.js'
20
+ *
21
+ * const appElement = createElement(App, { title: 'Airx' })
22
+ * createApp(appElement).mount(document.getElementById('root')!)
23
+ */
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ export function createApp(element) {
26
+ const appContext = new PluginContext();
27
+ const ensureAsElement = (element) => {
28
+ if (typeof element === 'function') {
29
+ return createElement(element, {});
30
+ }
31
+ return element;
32
+ };
33
+ const app = {
34
+ plugin: (...plugins) => {
35
+ appContext.registerPlugin(...plugins);
36
+ return app;
37
+ },
38
+ mount: (container) => {
39
+ container.innerHTML = ''; // 先清空再说
40
+ browserRender(appContext, ensureAsElement(element), container);
41
+ return app;
42
+ },
43
+ renderToHTML: () => {
44
+ return new Promise(resolve => {
45
+ serverRender(appContext, ensureAsElement(element), resolve);
46
+ });
47
+ }
48
+ };
49
+ return app;
50
+ }
51
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../source/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAU,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvF,OAAO,EAA8B,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAoB/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,OAAyC;IACjE,MAAM,UAAU,GAAG,IAAI,aAAa,EAAE,CAAA;IAEtC,MAAM,eAAe,GAAG,CAAC,OAAoC,EAAe,EAAE;QAC5E,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,OAAO,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACnC,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;IAED,MAAM,GAAG,GAAY;QACnB,MAAM,EAAE,CAAC,GAAG,OAAiB,EAAE,EAAE;YAC/B,UAAU,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,CAAA;YACrC,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,KAAK,EAAE,CAAC,SAAsB,EAAE,EAAE;YAChC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAA,CAAC,QAAQ;YACjC,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAA;YAC9D,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,YAAY,EAAE,GAAoB,EAAE;YAClC,OAAO,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE;gBACnC,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;YAC7D,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './app';
1
+ export * from './app.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './app.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA"}
@@ -1,34 +1,81 @@
1
- import * as symbol from '../symbol';
1
+ import * as symbol from '../symbol/index.js';
2
2
  type AirxElementType<P> = string | AirxComponent<P>;
3
3
  export type Props = {
4
4
  [propKey: string]: unknown;
5
5
  };
6
6
  /**
7
- * AirxElement 表示一个 Airx 元素
8
- * type 表示元素的类型,可能是一个 html 标签,
9
- * 也可能是一个自定义组件
10
- * props 表示元素的属性
11
- * children 表示元素的子元素
7
+ * Airx 虚拟节点结构。
8
+ *
9
+ * - type: 标签名或组件函数
10
+ * - props: 组件参数或标签属性
11
+ * - props.children: 子节点列表
12
+ *
13
+ * @example
14
+ * import { createElement, type AirxElement } from 'airx'
15
+ *
16
+ * const node: AirxElement = createElement('div', { id: 'app' }, 'hello')
12
17
  */
13
18
  export interface AirxElement<P = any> {
14
19
  type: AirxElementType<P>;
15
20
  props: Props & P;
16
21
  [symbol.airxElementSymbol]: true;
17
22
  }
23
+ /**
24
+ * 组件可返回的子节点类型。
25
+ */
18
26
  export type AirxChildren = null | string | number | boolean | undefined | AirxElement | Array<AirxChildren> | AirxComponentRender;
19
27
  /**
20
- * 函数式组件接收自己的 props,并返回一个 AirxElement
28
+ * 组件渲染函数类型。
29
+ *
30
+ * 组件函数返回值本身是一个 "render 函数",该函数最终返回子节点。
21
31
  */
22
32
  export type AirxComponentRender = () => AirxChildren;
23
33
  export type AirxComponent<P = unknown> = ReactiveComponent<P>;
24
34
  export type ReactiveComponent<P = unknown> = (props: P) => AirxComponentRender;
25
35
  /**
26
- * createElement 是用于创建 AirxElement 的工具函数
36
+ * 创建 Airx 虚拟节点。
37
+ *
38
+ * 可用于手写节点,也会被 JSX 转换后调用。
39
+ *
40
+ * @param type 标签名或组件函数。
41
+ * @param props 属性对象。
42
+ * @param children 可变子节点参数。
43
+ * @returns 标准化后的 AirxElement。
44
+ *
45
+ * @example
46
+ * import { createElement } from 'airx'
47
+ *
48
+ * const view = createElement('div', { class: 'box' }, 'hello')
49
+ *
50
+ * @example
51
+ * import { createElement } from 'airx'
52
+ *
53
+ * function Title(props: { text: string }) {
54
+ * return () => createElement('h1', null as never, props.text)
55
+ * }
56
+ *
57
+ * const node = createElement(Title, { text: 'Airx' })
27
58
  */
28
59
  export declare function createElement<P = any>(type: AirxElementType<P>, props: {
29
60
  [key: string]: unknown;
30
61
  } & P, ...children: AirxChildren[]): AirxElement<P>;
62
+ /**
63
+ * 判断一个值是否是合法的 AirxElement。
64
+ */
31
65
  export declare function isValidElement(element: unknown): element is AirxElement;
66
+ /**
67
+ * JSX Fragment 对应的运行时实现。
68
+ *
69
+ * @example
70
+ * function Card() {
71
+ * return () => (
72
+ * <>
73
+ * <h3>Title</h3>
74
+ * <p>Content</p>
75
+ * </>
76
+ * )
77
+ * }
78
+ */
32
79
  export declare function Fragment(props: {
33
80
  children: AirxElement;
34
81
  }): () => AirxElement<any>;
@@ -43,6 +90,18 @@ export type AirxComponentContext = AirxComponentLifecycle & {
43
90
  provide: <T = unknown>(key: unknown, value: T) => ProvideUpdater<T>;
44
91
  inject: <T = unknown>(key: unknown) => T | undefined;
45
92
  };
93
+ /**
94
+ * 为组件提供类型友好的包装。
95
+ *
96
+ * 主要用于在不使用 JSX 的场景下显式声明组件签名。
97
+ *
98
+ * @example
99
+ * import { component, createElement } from 'airx'
100
+ *
101
+ * const Hello = component<{ name: string }>((props) => {
102
+ * return () => createElement('h1', null as never, `Hello ${props.name}`)
103
+ * })
104
+ */
46
105
  export declare function component<P = unknown>(comp: AirxComponent<P>): AirxComponent<P>;
47
106
  export declare function createErrorRender(error: unknown): AirxComponentRender;
48
107
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../source/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,WAAW,CAAA;AAGnC,KAAK,eAAe,CAAC,CAAC,IAAI,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;AAEnD,MAAM,MAAM,KAAK,GAAG;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAElD;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IACxB,KAAK,EAAE,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAA;CACjC;AAED,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,GACT,WAAW,GACX,KAAK,CAAC,YAAY,CAAC,GACnB,mBAAmB,CAAA;AAEvB;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAA;AACpD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,mBAAmB,CAAA;AAE9E;;GAEG;AAEH,wBAAgB,aAAa,CAAC,CAAC,GAAG,GAAG,EACnC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EACxB,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,CAAC,EACrC,GAAG,QAAQ,EAAE,YAAY,EAAE,GAC1B,WAAW,CAAC,CAAC,CAAC,CAiBhB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,WAAW,CAIvE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,0BAExD;AAED,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAA;AACvD,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAA;AAEpE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,CAAC,QAAQ,EAAE,4BAA4B,KAAK,IAAI,CAAA;IAC3D,WAAW,EAAE,CAAC,QAAQ,EAAE,8BAA8B,KAAK,IAAI,CAAA;CAChE;AAED,KAAK,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAA;AAE1E,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,GAAG;IAC1D,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,CAAA;CACrD,CAAA;AAED,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAwBrE"}
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../source/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAG5C,KAAK,eAAe,CAAC,CAAC,IAAI,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;AAEnD,MAAM,MAAM,KAAK,GAAG;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAElD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IACxB,KAAK,EAAE,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,GACT,WAAW,GACX,KAAK,CAAC,YAAY,CAAC,GACnB,mBAAmB,CAAA;AAEvB;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAA;AACpD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,mBAAmB,CAAA;AAE9E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,wBAAgB,aAAa,CAAC,CAAC,GAAG,GAAG,EACnC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EACxB,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,CAAC,EACrC,GAAG,QAAQ,EAAE,YAAY,EAAE,GAC1B,WAAW,CAAC,CAAC,CAAC,CAiBhB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,WAAW,CAIvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAA;CAAE,0BAExD;AAED,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAA;AACvD,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAA;AAEpE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,CAAC,QAAQ,EAAE,4BAA4B,KAAK,IAAI,CAAA;IAC3D,WAAW,EAAE,CAAC,QAAQ,EAAE,8BAA8B,KAAK,IAAI,CAAA;CAChE;AAED,KAAK,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAA;AAE1E,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,GAAG;IAC1D,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,SAAS,CAAA;CACrD,CAAA;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAwBrE"}
@@ -0,0 +1,106 @@
1
+ import * as symbol from '../symbol/index.js';
2
+ /**
3
+ * 创建 Airx 虚拟节点。
4
+ *
5
+ * 可用于手写节点,也会被 JSX 转换后调用。
6
+ *
7
+ * @param type 标签名或组件函数。
8
+ * @param props 属性对象。
9
+ * @param children 可变子节点参数。
10
+ * @returns 标准化后的 AirxElement。
11
+ *
12
+ * @example
13
+ * import { createElement } from 'airx'
14
+ *
15
+ * const view = createElement('div', { class: 'box' }, 'hello')
16
+ *
17
+ * @example
18
+ * import { createElement } from 'airx'
19
+ *
20
+ * function Title(props: { text: string }) {
21
+ * return () => createElement('h1', null as never, props.text)
22
+ * }
23
+ *
24
+ * const node = createElement(Title, { text: 'Airx' })
25
+ */
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ export function createElement(type, props, ...children) {
28
+ const localChildren = [];
29
+ if (children.length > 0) {
30
+ localChildren.push(...children);
31
+ }
32
+ else if (props && props.children) {
33
+ localChildren.push(props.children);
34
+ }
35
+ return {
36
+ type,
37
+ props: {
38
+ ...props,
39
+ children: localChildren
40
+ },
41
+ [symbol.airxElementSymbol]: true
42
+ };
43
+ }
44
+ /**
45
+ * 判断一个值是否是合法的 AirxElement。
46
+ */
47
+ export function isValidElement(element) {
48
+ return typeof element === 'object'
49
+ && element !== null
50
+ && Reflect.get(element, symbol.airxElementSymbol) === true;
51
+ }
52
+ /**
53
+ * JSX Fragment 对应的运行时实现。
54
+ *
55
+ * @example
56
+ * function Card() {
57
+ * return () => (
58
+ * <>
59
+ * <h3>Title</h3>
60
+ * <p>Content</p>
61
+ * </>
62
+ * )
63
+ * }
64
+ */
65
+ export function Fragment(props) {
66
+ return () => props.children;
67
+ }
68
+ /**
69
+ * 为组件提供类型友好的包装。
70
+ *
71
+ * 主要用于在不使用 JSX 的场景下显式声明组件签名。
72
+ *
73
+ * @example
74
+ * import { component, createElement } from 'airx'
75
+ *
76
+ * const Hello = component<{ name: string }>((props) => {
77
+ * return () => createElement('h1', null as never, `Hello ${props.name}`)
78
+ * })
79
+ */
80
+ export function component(comp) {
81
+ return comp;
82
+ }
83
+ export function createErrorRender(error) {
84
+ console.error(error);
85
+ const handleClick = () => {
86
+ // 点击输出错误是为了避免
87
+ // 页面上多个组件同时出错时
88
+ // 无法定位错误与之对应的组件
89
+ console.error(error);
90
+ };
91
+ const formattingError = () => {
92
+ if (error == null)
93
+ return 'Unknown rendering error';
94
+ if (error instanceof Error)
95
+ return error.message;
96
+ return JSON.stringify(error);
97
+ };
98
+ const errorBlockStyle = {
99
+ padding: '8px',
100
+ fontSize: '20px',
101
+ color: 'rgb(255,255,255)',
102
+ backgroundColor: 'rgb(255, 0, 0)',
103
+ };
104
+ return () => createElement('div', { style: errorBlockStyle, onClick: handleClick }, formattingError());
105
+ }
106
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../../source/element/element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAgD5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,8DAA8D;AAC9D,MAAM,UAAU,aAAa,CAC3B,IAAwB,EACxB,KAAqC,EACrC,GAAG,QAAwB;IAE3B,MAAM,aAAa,GAAmB,EAAE,CAAA;IAExC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;IACjC,CAAC;SAAM,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAwB,CAAC,CAAA;IACpD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK,EAAE;YACL,GAAG,KAAK;YACR,QAAQ,EAAE,aAAa;SACxB;QACD,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI;KACjC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,OAAO,OAAO,KAAK,QAAQ;WAC7B,OAAO,KAAK,IAAI;WAChB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAA;AAC9D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAgC;IACvD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAA;AAC7B,CAAC;AAiBD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAc,IAAsB;IAC3D,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEpB,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,cAAc;QACd,eAAe;QACf,gBAAgB;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,GAAW,EAAE;QACnC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,yBAAyB,CAAA;QACnD,IAAI,KAAK,YAAY,KAAK;YAAE,OAAO,KAAK,CAAC,OAAO,CAAA;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC,CAAA;IAED,MAAM,eAAe,GAAkB;QACrC,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,kBAAkB;QACzB,eAAe,EAAE,gBAAgB;KAClC,CAAA;IAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,CAAA;AACxG,CAAC"}
@@ -1,2 +1,2 @@
1
- export { Props, AirxElement, AirxComponent, AirxChildren, createElement, AirxComponentRender, ReactiveComponent, Fragment, component, AirxComponentContext, isValidElement, AirxComponentMountedListener, AirxComponentUnmountedListener, createErrorRender } from './element';
1
+ export { Props, AirxElement, AirxComponent, AirxChildren, createElement, AirxComponentRender, ReactiveComponent, Fragment, component, AirxComponentContext, isValidElement, AirxComponentMountedListener, AirxComponentUnmountedListener, createErrorRender } from './element.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/element/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,oBAAoB,EACpB,cAAc,EACd,4BAA4B,EAC5B,8BAA8B,EAC9B,iBAAiB,EAClB,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/element/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,oBAAoB,EACpB,cAAc,EACd,4BAA4B,EAC5B,8BAA8B,EAC9B,iBAAiB,EAClB,MAAM,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { createElement, Fragment, component, isValidElement, createErrorRender } from './element.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/element/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,aAAa,EAGb,QAAQ,EACR,SAAS,EAET,cAAc,EAGd,iBAAiB,EAClB,MAAM,cAAc,CAAA"}
package/output/index.d.ts CHANGED
@@ -1,6 +1,40 @@
1
- export * from './types';
2
- export { type Plugin } from './render';
3
- export { type AirxApp, createApp } from './app';
4
- export { Fragment, component, createElement, type AirxComponent, type AirxElement, type AirxChildren, type AirxComponentContext } from './element';
5
- export { inject, provide, onMounted, onUnmounted } from './render';
1
+ /**
2
+ * JSX/DOM 属性类型定义。
3
+ */
4
+ export * from './types/index.js';
5
+ /**
6
+ * 渲染插件类型。
7
+ */
8
+ export { type Plugin } from './render/index.js';
9
+ /**
10
+ * 应用入口 API。
11
+ *
12
+ * @example
13
+ * import { createApp } from 'airx'
14
+ * import { App } from './App.js'
15
+ *
16
+ * createApp(App).mount(document.getElementById('root')!)
17
+ */
18
+ export { type AirxApp, createApp } from './app/index.js';
19
+ /**
20
+ * 节点和组件 API。
21
+ *
22
+ * @example
23
+ * import { createElement, component } from 'airx'
24
+ *
25
+ * const Title = component((props: { text: string }) => {
26
+ * return () => createElement('h1', null as never, props.text)
27
+ * })
28
+ */
29
+ export { Fragment, component, createElement, type AirxComponent, type AirxElement, type AirxChildren, type AirxComponentContext } from './element/index.js';
30
+ /**
31
+ * 组件上下文 Hook API。
32
+ *
33
+ * @example
34
+ * import { provide, inject } from 'airx'
35
+ *
36
+ * provide('lang', 'en')
37
+ * const lang = inject<string>('lang')
38
+ */
39
+ export { inject, provide, onMounted, onUnmounted } from './render/index.js';
6
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,KAAK,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE/C,OAAO,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACZ,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,kBAAkB,CAAA;AAEhC;;GAEG;AACH,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAExD;;;;;;;;;GASG;AACH,OAAO,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAA;AAE3B;;;;;;;;GAQG;AACH,OAAO,EACL,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACZ,MAAM,mBAAmB,CAAA"}