Skip to content

Commit 66a6e6e

Browse files
committed
Restructuring modules
1 parent 5165e06 commit 66a6e6e

25 files changed

+249
-118
lines changed

.storybook/webpack.config.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,32 @@ module.exports = ({ config }) => {
1414
const alias = (config.resolve && config.resolve.alias) || {}
1515

1616
alias['js-element$'] = path.resolve(__dirname, '../src/main/js-element.ts')
17+
18+
alias['js-element/web$'] = path.resolve(
19+
__dirname,
20+
'../src/main/js-element-web.ts'
21+
)
22+
1723
alias['js-element/hooks$'] = path.resolve(
1824
__dirname,
1925
'../src/main/js-element-hooks.ts'
2026
)
27+
2128
alias['js-element/utils$'] = path.resolve(
2229
__dirname,
2330
'../src/main/js-element-utils.ts'
2431
)
32+
33+
alias['js-element/lit$'] = path.resolve(
34+
__dirname,
35+
'../src/main/js-element-lit.ts'
36+
)
37+
38+
alias['js-element/uhtml$'] = path.resolve(
39+
__dirname,
40+
'../src/main/js-element-uhtml.ts'
41+
)
42+
2543
config.resolve.alias = alias
2644
config.resolve.extensions.push('.ts', '.tsx')
2745

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ render(<SayHello salutation="Hi" name="Jane Doe" />, '#app')
3333
### Example 2
3434

3535
```jsx
36-
import { attr, define, h, render, Attr } from 'js-element'
36+
import { attr, define, h, render, Attr } from 'js-element/web'
3737
import { useEffect, useOnMount, useState, useStyles } from 'js-element/hooks'
3838
import counterStyles from './counter.css'
3939

@@ -81,7 +81,7 @@ render(<Counter />, '#app')
8181
### Example 3
8282

8383
```jsx
84-
import { define, h, render } from 'js-element'
84+
import { define, h, render } from 'js-element/web'
8585
import { useTimer } from 'js-element/hooks'
8686

8787
const Clock = define('demo-clock', () => {

package.json

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "js-element",
3-
"version": "0.0.22",
3+
"version": "0.0.23",
44
"description": "",
55
"license": "LGPL-3.0",
66
"main": "./index.js",
@@ -27,6 +27,26 @@
2727
"require": "./dist/js-element.cjs.production.js"
2828
}
2929
},
30+
"./web": {
31+
"development": {
32+
"browser": "./dist/js-element-web.umd.development.js",
33+
"umd": "./dist/js-element-web.umd.development.js",
34+
"import": "./dist/js-element-web.esm.development.js",
35+
"require": "./dist/js-element-web.cjs.development.js"
36+
},
37+
"production": {
38+
"browser": "./dist/js-element-web.umd.production.js",
39+
"umd": "./dist/js-element-web.umd.production.js",
40+
"import": "./dist/js-element-web.esm.production.js",
41+
"require": "./dist/js-element-web.cjs.production.js"
42+
},
43+
"default": {
44+
"browser": "./dist/js-element-web.umd.production.js",
45+
"umd": "./dist/js-element-web.umd.production.js",
46+
"import": "./dist/js-element-web.esm.production.js",
47+
"require": "./dist/js-element-web.cjs.production.js"
48+
}
49+
},
3050
"./hooks": {
3151
"development": {
3252
"browser": "./dist/js-element-hooks.umd.development.js",
@@ -112,6 +132,7 @@
112132
},
113133
"files": [
114134
"dist",
135+
"web",
115136
"hooks",
116137
"utils",
117138
"lit",

rollup.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import brotli from 'rollup-plugin-brotli'
88

99
const configs = []
1010

11-
for (const pkg of ['root', 'hooks', 'utils', 'lit', 'uhtml']) {
11+
for (const pkg of ['root', 'web', 'hooks', 'utils', 'lit', 'uhtml']) {
1212
for (const format of ['esm', 'umd', 'cjs']) {
1313
for (const productive of [false, true]) {
1414
configs.push(createConfig(pkg, format, productive))

src/main/js-element-lit.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
import { createDefiner, createRenderer } from 'js-element'
22
import { render as litRender, TemplateResult } from 'lit-html'
33

4-
export { attr, event, hook, ref, Attr } from 'js-element'
54
export { html, svg, TemplateResult } from 'lit-html'
65

6+
export {
7+
attr,
8+
event,
9+
hook,
10+
ref,
11+
Attr,
12+
EventHandler,
13+
MethodsOf,
14+
Ref,
15+
UIEvent
16+
} from 'js-element'
17+
718
export const define = createDefiner<TemplateResult>('define', litRender)
819

920
export const render = createRenderer<TemplateResult>(

src/main/js-element-uhtml.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
import { createDefiner, createRenderer } from 'js-element'
22
import { render as uhtmlRender, Hole } from 'uhtml'
33

4-
export { attr, event, hook, ref, Attr } from 'js-element'
4+
export {
5+
attr,
6+
event,
7+
hook,
8+
ref,
9+
Attr,
10+
EventHandler,
11+
MethodsOf,
12+
Ref,
13+
UIEvent
14+
} from 'js-element'
15+
516
export { html, svg, Hole } from 'uhtml'
617

718
export const define = createDefiner<Hole>('define', renderContent)

src/main/js-element-utils.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import { h } from 'js-element'
2-
import htm from 'htm'
3-
4-
export { html, initStore }
5-
6-
// === html ==========================================================
7-
8-
const html = htm.bind(h)
1+
export { initStore }
92

103
// === store =========================================================
114

src/main/js-element-web.ts

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { h as createElement, text, patch } from './lib/patched-superfine'
2+
import htm from 'htm'
3+
import { createDefiner, createRenderer, Component } from 'js-element'
4+
5+
export {
6+
attr,
7+
event,
8+
hook,
9+
ref,
10+
Attr,
11+
EventHandler,
12+
MethodsOf,
13+
Ref,
14+
UIEvent
15+
} from 'js-element'
16+
17+
export const define = createDefiner<VNode>('define', renderContent)
18+
19+
export const render = createRenderer<VNode>(
20+
'render',
21+
(it: any) => !!it && it.isVElement === true,
22+
renderContent
23+
)
24+
25+
export { h, VNode, VElement }
26+
export const html = htm.bind(h)
27+
28+
// === types =========================================================
29+
30+
type Props = Record<string, any> // TODO
31+
type VElement<T extends Props = Props> = Record<any, any> // TODO!!!!!
32+
type VNode = null | boolean | number | string | VElement | Iterable<VNode>
33+
34+
// === helpers =======================================================
35+
36+
function renderContent(content: VNode, target: Element) {
37+
if (target.hasChildNodes()) {
38+
patch(target.firstChild, content)
39+
} else {
40+
const newTarget = document.createElement('span')
41+
42+
target.append(newTarget)
43+
patch(newTarget, content)
44+
}
45+
}
46+
47+
function asVNode(x: any): any {
48+
return typeof x === 'number' || typeof x === 'string' ? text(x, null) : x
49+
}
50+
51+
// === h ==============================================================
52+
53+
function h(
54+
type: string,
55+
props?: Props | null, // TODO!!!
56+
...children: VNode[]
57+
): VElement
58+
59+
function h<P extends Props>(
60+
type: Component<P>,
61+
props?: Partial<P> | null,
62+
...children: VNode[]
63+
): VElement
64+
65+
function h(type: string | Component<any>, props?: Props | null): VElement {
66+
const argc = arguments.length
67+
const tagName = typeof type === 'function' ? (type as any).tagName : type
68+
69+
if (process.env.NODE_ENV === ('development' as string)) {
70+
if (typeof tagName !== 'string') {
71+
throw new Error('[h] First argument must be a string or a component')
72+
}
73+
}
74+
75+
const children = argc > 2 ? [] : EMPTY_ARR
76+
77+
if (argc > 2) {
78+
for (let i = 2; i < argc; ++i) {
79+
const child = arguments[i]
80+
81+
if (!Array.isArray(child)) {
82+
children.push(asVNode(child))
83+
} else {
84+
for (let j = 0; j < child.length; ++j) {
85+
children.push(asVNode(child[j]))
86+
}
87+
}
88+
}
89+
}
90+
91+
const ret: any = createElement(tagName, props || EMPTY_OBJ, children)
92+
ret.isVElement = true
93+
return ret
94+
}
95+
96+
// === constants =====================================================
97+
98+
const EMPTY_ARR: any[] = []
99+
const EMPTY_OBJ = {}

0 commit comments

Comments
 (0)