@ilokesto/utilinent 1.0.9 → 1.0.11
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/dist/components/For.d.ts +2 -0
- package/dist/components/For.js +18 -0
- package/dist/components/Show.d.ts +2 -0
- package/dist/components/Show.js +26 -0
- package/dist/constants/htmlTags.d.ts +1 -15
- package/dist/constants/htmlTags.js +1 -11
- package/dist/types/for.d.ts +93 -17
- package/dist/types/index.d.ts +0 -12
- package/dist/types/repeat.d.ts +88 -13
- package/dist/types/show.d.ts +92 -22
- package/package.json +1 -1
- package/dist/components/For/index.d.ts +0 -5
- package/dist/components/For/index.js +0 -32
- package/dist/components/For/processForrable.d.ts +0 -4
- package/dist/components/For/processForrable.js +0 -28
- package/dist/components/Show/index.d.ts +0 -11
- package/dist/components/Show/index.js +0 -25
- package/dist/components/Show/processShowable.d.ts +0 -9
- package/dist/components/Show/processShowable.js +0 -45
- package/dist/components/Show/renderShowContent.d.ts +0 -8
- package/dist/components/Show/renderShowContent.js +0 -17
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createElement, forwardRef } from "react";
|
|
3
|
+
import { htmlTags } from "../constants/htmlTags";
|
|
4
|
+
function BaseFor({ each, children, fallback = null, before, after, }) {
|
|
5
|
+
const content = each && each.length > 0 ? each.map(children) : fallback;
|
|
6
|
+
return (_jsxs(_Fragment, { children: [before, content, after] }));
|
|
7
|
+
}
|
|
8
|
+
const renderForTag = (tag) =>
|
|
9
|
+
// forward ref so consumers can attach a ref to the underlying DOM element
|
|
10
|
+
forwardRef(({ each, children, fallback = null, before, after, ...props }, ref) => {
|
|
11
|
+
const content = each && each.length > 0 ? each.map(children) : fallback;
|
|
12
|
+
return createElement(tag, { ...props, ref }, before, content, after);
|
|
13
|
+
});
|
|
14
|
+
const tagEntries = htmlTags.reduce((acc, tag) => {
|
|
15
|
+
acc[tag] = renderForTag(tag);
|
|
16
|
+
return acc;
|
|
17
|
+
}, {});
|
|
18
|
+
export const For = Object.assign(BaseFor, tagEntries);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createElement, forwardRef } from "react";
|
|
2
|
+
import { htmlTags } from "../constants/htmlTags";
|
|
3
|
+
const BaseShow = ({ when, children, fallback = null }) => {
|
|
4
|
+
const shouldRender = Array.isArray(when) ? when.every(Boolean) : !!when;
|
|
5
|
+
return shouldRender
|
|
6
|
+
? typeof children === "function"
|
|
7
|
+
? children(when)
|
|
8
|
+
: children
|
|
9
|
+
: fallback;
|
|
10
|
+
};
|
|
11
|
+
const renderForTag = (tag) =>
|
|
12
|
+
// forward ref so consumers like Observer can pass a ref to the real DOM element
|
|
13
|
+
forwardRef(function Render({ when, children, fallback = null, ...props }, ref) {
|
|
14
|
+
const shouldRender = Array.isArray(when) ? when.every(Boolean) : !!when;
|
|
15
|
+
const content = shouldRender
|
|
16
|
+
? typeof children === "function"
|
|
17
|
+
? children(when)
|
|
18
|
+
: children
|
|
19
|
+
: fallback;
|
|
20
|
+
return createElement(tag, { ...props, ref }, content);
|
|
21
|
+
});
|
|
22
|
+
const tagEntries = htmlTags.reduce((acc, tag) => {
|
|
23
|
+
acc[tag] = renderForTag(tag);
|
|
24
|
+
return acc;
|
|
25
|
+
}, {});
|
|
26
|
+
export const Show = Object.assign(BaseShow, tagEntries);
|
|
@@ -1,15 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 지원되는 HTML 태그 목록
|
|
3
|
-
* const assertion을 사용하여 타입 레벨에서도 활용 가능
|
|
4
|
-
*
|
|
5
|
-
* 제외된 태그:
|
|
6
|
-
* - data: 일반적인 prop 이름과 충돌
|
|
7
|
-
* - map: Array.prototype.map, Map 객체와 충돌
|
|
8
|
-
* - var: JavaScript 예약어 (속성으로는 사용 가능하나 혼동 방지)
|
|
9
|
-
* - s: 너무 짧고 흔한 변수명
|
|
10
|
-
*/
|
|
11
|
-
export declare const htmlTags: readonly ["a", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "blockquote", "button", "canvas", "cite", "code", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "mark", "menu", "meter", "nav", "ol", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "samp", "section", "select", "small", "span", "strong", "sub", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "tr", "u", "ul", "video"];
|
|
12
|
-
/**
|
|
13
|
-
* HTML 태그 이름의 유니온 타입
|
|
14
|
-
*/
|
|
15
|
-
export type HtmlTag = typeof htmlTags[number];
|
|
1
|
+
export declare const htmlTags: string[];
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 지원되는 HTML 태그 목록
|
|
3
|
-
* const assertion을 사용하여 타입 레벨에서도 활용 가능
|
|
4
|
-
*
|
|
5
|
-
* 제외된 태그:
|
|
6
|
-
* - data: 일반적인 prop 이름과 충돌
|
|
7
|
-
* - map: Array.prototype.map, Map 객체와 충돌
|
|
8
|
-
* - var: JavaScript 예약어 (속성으로는 사용 가능하나 혼동 방지)
|
|
9
|
-
* - s: 너무 짧고 흔한 변수명
|
|
10
|
-
*/
|
|
11
1
|
export const htmlTags = [
|
|
12
|
-
"a", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "blockquote", "button", "canvas", "cite", "code", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "mark", "menu", "meter", "nav", "ol", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "samp", "section", "select", "small", "span", "strong", "sub", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "tr", "u", "ul", "video"
|
|
2
|
+
"a", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "blockquote", "button", "canvas", "cite", "code", "data", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "menu", "meter", "nav", "ol", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "small", "span", "strong", "sub", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "tr", "u", "ul", "var", "video"
|
|
13
3
|
];
|
package/dist/types/for.d.ts
CHANGED
|
@@ -1,24 +1,100 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Fallback, HtmlTagHelpers } from ".";
|
|
3
|
-
/**
|
|
4
|
-
* For 컴포넌트의 props 타입
|
|
5
|
-
* each가 null/undefined이거나 빈 배열이면 fallback 렌더링
|
|
6
|
-
*/
|
|
1
|
+
import { Fallback } from ".";
|
|
7
2
|
export interface ForProps<T extends Array<unknown>> extends Fallback {
|
|
8
3
|
each: T | null | undefined;
|
|
9
|
-
children: (
|
|
4
|
+
children: (item: T[number], index: number) => React.ReactNode;
|
|
5
|
+
before?: React.ReactNode;
|
|
6
|
+
after?: React.ReactNode;
|
|
10
7
|
}
|
|
11
|
-
/**
|
|
12
|
-
* 특정 HTML 태그를 위한 For 헬퍼 타입
|
|
13
|
-
*/
|
|
14
8
|
type ForTagHelper<K extends keyof JSX.IntrinsicElements> = {
|
|
15
|
-
<T extends Array<unknown>>(props: ForProps<T> & Omit<ComponentPropsWithRef<K>, 'children'>): React.ReactNode;
|
|
9
|
+
<const T extends Array<unknown>>(props: ForProps<T> & Omit<React.ComponentPropsWithRef<K>, 'children'>): React.ReactNode;
|
|
16
10
|
};
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
export interface ForType {
|
|
12
|
+
<const T extends Array<unknown>>(props: ForProps<T>): React.ReactNode;
|
|
13
|
+
a: ForTagHelper<"a">;
|
|
14
|
+
abbr: ForTagHelper<"abbr">;
|
|
15
|
+
address: ForTagHelper<"address">;
|
|
16
|
+
article: ForTagHelper<"article">;
|
|
17
|
+
aside: ForTagHelper<"aside">;
|
|
18
|
+
b: ForTagHelper<"b">;
|
|
19
|
+
bdi: ForTagHelper<"bdi">;
|
|
20
|
+
bdo: ForTagHelper<"bdo">;
|
|
21
|
+
blockquote: ForTagHelper<"blockquote">;
|
|
22
|
+
button: ForTagHelper<"button">;
|
|
23
|
+
canvas: ForTagHelper<"canvas">;
|
|
24
|
+
cite: ForTagHelper<"cite">;
|
|
25
|
+
code: ForTagHelper<"code">;
|
|
26
|
+
data: ForTagHelper<"data">;
|
|
27
|
+
datalist: ForTagHelper<"datalist">;
|
|
28
|
+
dd: ForTagHelper<"dd">;
|
|
29
|
+
del: ForTagHelper<"del">;
|
|
30
|
+
details: ForTagHelper<"details">;
|
|
31
|
+
dfn: ForTagHelper<"dfn">;
|
|
32
|
+
dialog: ForTagHelper<"dialog">;
|
|
33
|
+
div: ForTagHelper<"div">;
|
|
34
|
+
dl: ForTagHelper<"dl">;
|
|
35
|
+
dt: ForTagHelper<"dt">;
|
|
36
|
+
em: ForTagHelper<"em">;
|
|
37
|
+
fieldset: ForTagHelper<"fieldset">;
|
|
38
|
+
figcaption: ForTagHelper<"figcaption">;
|
|
39
|
+
figure: ForTagHelper<"figure">;
|
|
40
|
+
footer: ForTagHelper<"footer">;
|
|
41
|
+
form: ForTagHelper<"form">;
|
|
42
|
+
h1: ForTagHelper<"h1">;
|
|
43
|
+
h2: ForTagHelper<"h2">;
|
|
44
|
+
h3: ForTagHelper<"h3">;
|
|
45
|
+
h4: ForTagHelper<"h4">;
|
|
46
|
+
h5: ForTagHelper<"h5">;
|
|
47
|
+
h6: ForTagHelper<"h6">;
|
|
48
|
+
header: ForTagHelper<"header">;
|
|
49
|
+
hr: ForTagHelper<"hr">;
|
|
50
|
+
i: ForTagHelper<"i">;
|
|
51
|
+
img: ForTagHelper<"img">;
|
|
52
|
+
input: ForTagHelper<"input">;
|
|
53
|
+
ins: ForTagHelper<"ins">;
|
|
54
|
+
kbd: ForTagHelper<"kbd">;
|
|
55
|
+
label: ForTagHelper<"label">;
|
|
56
|
+
legend: ForTagHelper<"legend">;
|
|
57
|
+
li: ForTagHelper<"li">;
|
|
58
|
+
main: ForTagHelper<"main">;
|
|
59
|
+
map: ForTagHelper<"map">;
|
|
60
|
+
mark: ForTagHelper<"mark">;
|
|
61
|
+
menu: ForTagHelper<"menu">;
|
|
62
|
+
meter: ForTagHelper<"meter">;
|
|
63
|
+
nav: ForTagHelper<"nav">;
|
|
64
|
+
ol: ForTagHelper<"ol">;
|
|
65
|
+
option: ForTagHelper<"option">;
|
|
66
|
+
output: ForTagHelper<"output">;
|
|
67
|
+
p: ForTagHelper<"p">;
|
|
68
|
+
picture: ForTagHelper<"picture">;
|
|
69
|
+
pre: ForTagHelper<"pre">;
|
|
70
|
+
progress: ForTagHelper<"progress">;
|
|
71
|
+
q: ForTagHelper<"q">;
|
|
72
|
+
rp: ForTagHelper<"rp">;
|
|
73
|
+
rt: ForTagHelper<"rt">;
|
|
74
|
+
ruby: ForTagHelper<"ruby">;
|
|
75
|
+
s: ForTagHelper<"s">;
|
|
76
|
+
samp: ForTagHelper<"samp">;
|
|
77
|
+
section: ForTagHelper<"section">;
|
|
78
|
+
select: ForTagHelper<"select">;
|
|
79
|
+
small: ForTagHelper<"small">;
|
|
80
|
+
span: ForTagHelper<"span">;
|
|
81
|
+
strong: ForTagHelper<"strong">;
|
|
82
|
+
sub: ForTagHelper<"sub">;
|
|
83
|
+
summary: ForTagHelper<"summary">;
|
|
84
|
+
sup: ForTagHelper<"sup">;
|
|
85
|
+
table: ForTagHelper<"table">;
|
|
86
|
+
tbody: ForTagHelper<"tbody">;
|
|
87
|
+
td: ForTagHelper<"td">;
|
|
88
|
+
textarea: ForTagHelper<"textarea">;
|
|
89
|
+
tfoot: ForTagHelper<"tfoot">;
|
|
90
|
+
th: ForTagHelper<"th">;
|
|
91
|
+
thead: ForTagHelper<"thead">;
|
|
92
|
+
time: ForTagHelper<"time">;
|
|
93
|
+
tr: ForTagHelper<"tr">;
|
|
94
|
+
u: ForTagHelper<"u">;
|
|
95
|
+
ul: ForTagHelper<"ul">;
|
|
96
|
+
var: ForTagHelper<"var">;
|
|
97
|
+
video: ForTagHelper<"video">;
|
|
98
|
+
[x: string]: ForTagHelper<any>;
|
|
23
99
|
}
|
|
24
100
|
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,22 +1,10 @@
|
|
|
1
1
|
import type { ReactElement } from "react";
|
|
2
|
-
import type { HtmlTag } from "../constants/htmlTags";
|
|
3
2
|
export interface Fallback {
|
|
4
3
|
fallback?: React.ReactNode;
|
|
5
4
|
}
|
|
6
5
|
export type NonNullableElements<T extends readonly any[]> = {
|
|
7
6
|
-readonly [P in keyof T]: NonNullable<T[P]>;
|
|
8
7
|
};
|
|
9
|
-
/**
|
|
10
|
-
* HTML 태그별 헬퍼 타입을 자동 생성하는 유틸리티
|
|
11
|
-
* @template Helper - 각 태그에 대한 헬퍼 타입
|
|
12
|
-
*/
|
|
13
|
-
export type HtmlTagHelpers<Helper> = {
|
|
14
|
-
[K in HtmlTag]: Helper extends {
|
|
15
|
-
tag: infer _T;
|
|
16
|
-
} ? Helper : Helper;
|
|
17
|
-
} & {
|
|
18
|
-
[x: string]: Helper;
|
|
19
|
-
};
|
|
20
8
|
export interface OptionalWrapperProps {
|
|
21
9
|
when: boolean;
|
|
22
10
|
children: React.ReactNode;
|
package/dist/types/repeat.d.ts
CHANGED
|
@@ -1,24 +1,99 @@
|
|
|
1
1
|
import { ComponentPropsWithRef } from "react";
|
|
2
|
-
import { Fallback
|
|
3
|
-
/**
|
|
4
|
-
* Repeat 컴포넌트의 props 타입
|
|
5
|
-
* times만큼 children을 반복 렌더링
|
|
6
|
-
*/
|
|
2
|
+
import { Fallback } from ".";
|
|
7
3
|
export interface RepeatProps extends Fallback {
|
|
8
4
|
times: number;
|
|
9
5
|
children: (index: number) => React.ReactNode;
|
|
10
6
|
}
|
|
11
|
-
/**
|
|
12
|
-
* 특정 HTML 태그를 위한 Repeat 헬퍼 타입
|
|
13
|
-
*/
|
|
14
7
|
type RepeatTagHelper<K extends keyof JSX.IntrinsicElements> = {
|
|
15
8
|
(props: RepeatProps & Omit<ComponentPropsWithRef<K>, "children">): React.ReactNode;
|
|
16
9
|
};
|
|
17
|
-
|
|
18
|
-
* Repeat 컴포넌트의 전체 타입
|
|
19
|
-
* 기본 사용과 HTML 태그별 헬퍼를 모두 포함
|
|
20
|
-
*/
|
|
21
|
-
export interface RepeatType extends HtmlTagHelpers<RepeatTagHelper<any>> {
|
|
10
|
+
export interface RepeatType {
|
|
22
11
|
(props: RepeatProps): React.ReactNode;
|
|
12
|
+
a: RepeatTagHelper<"a">;
|
|
13
|
+
abbr: RepeatTagHelper<"abbr">;
|
|
14
|
+
address: RepeatTagHelper<"address">;
|
|
15
|
+
article: RepeatTagHelper<"article">;
|
|
16
|
+
aside: RepeatTagHelper<"aside">;
|
|
17
|
+
b: RepeatTagHelper<"b">;
|
|
18
|
+
bdi: RepeatTagHelper<"bdi">;
|
|
19
|
+
bdo: RepeatTagHelper<"bdo">;
|
|
20
|
+
blockquote: RepeatTagHelper<"blockquote">;
|
|
21
|
+
button: RepeatTagHelper<"button">;
|
|
22
|
+
canvas: RepeatTagHelper<"canvas">;
|
|
23
|
+
cite: RepeatTagHelper<"cite">;
|
|
24
|
+
code: RepeatTagHelper<"code">;
|
|
25
|
+
data: RepeatTagHelper<"data">;
|
|
26
|
+
datalist: RepeatTagHelper<"datalist">;
|
|
27
|
+
dd: RepeatTagHelper<"dd">;
|
|
28
|
+
del: RepeatTagHelper<"del">;
|
|
29
|
+
details: RepeatTagHelper<"details">;
|
|
30
|
+
dfn: RepeatTagHelper<"dfn">;
|
|
31
|
+
dialog: RepeatTagHelper<"dialog">;
|
|
32
|
+
div: RepeatTagHelper<"div">;
|
|
33
|
+
dl: RepeatTagHelper<"dl">;
|
|
34
|
+
dt: RepeatTagHelper<"dt">;
|
|
35
|
+
em: RepeatTagHelper<"em">;
|
|
36
|
+
fieldset: RepeatTagHelper<"fieldset">;
|
|
37
|
+
figcaption: RepeatTagHelper<"figcaption">;
|
|
38
|
+
figure: RepeatTagHelper<"figure">;
|
|
39
|
+
footer: RepeatTagHelper<"footer">;
|
|
40
|
+
form: RepeatTagHelper<"form">;
|
|
41
|
+
h1: RepeatTagHelper<"h1">;
|
|
42
|
+
h2: RepeatTagHelper<"h2">;
|
|
43
|
+
h3: RepeatTagHelper<"h3">;
|
|
44
|
+
h4: RepeatTagHelper<"h4">;
|
|
45
|
+
h5: RepeatTagHelper<"h5">;
|
|
46
|
+
h6: RepeatTagHelper<"h6">;
|
|
47
|
+
header: RepeatTagHelper<"header">;
|
|
48
|
+
hr: RepeatTagHelper<"hr">;
|
|
49
|
+
i: RepeatTagHelper<"i">;
|
|
50
|
+
img: RepeatTagHelper<"img">;
|
|
51
|
+
input: RepeatTagHelper<"input">;
|
|
52
|
+
ins: RepeatTagHelper<"ins">;
|
|
53
|
+
kbd: RepeatTagHelper<"kbd">;
|
|
54
|
+
label: RepeatTagHelper<"label">;
|
|
55
|
+
legend: RepeatTagHelper<"legend">;
|
|
56
|
+
li: RepeatTagHelper<"li">;
|
|
57
|
+
main: RepeatTagHelper<"main">;
|
|
58
|
+
map: RepeatTagHelper<"map">;
|
|
59
|
+
mark: RepeatTagHelper<"mark">;
|
|
60
|
+
menu: RepeatTagHelper<"menu">;
|
|
61
|
+
meter: RepeatTagHelper<"meter">;
|
|
62
|
+
nav: RepeatTagHelper<"nav">;
|
|
63
|
+
ol: RepeatTagHelper<"ol">;
|
|
64
|
+
option: RepeatTagHelper<"option">;
|
|
65
|
+
output: RepeatTagHelper<"output">;
|
|
66
|
+
p: RepeatTagHelper<"p">;
|
|
67
|
+
picture: RepeatTagHelper<"picture">;
|
|
68
|
+
pre: RepeatTagHelper<"pre">;
|
|
69
|
+
progress: RepeatTagHelper<"progress">;
|
|
70
|
+
q: RepeatTagHelper<"q">;
|
|
71
|
+
rp: RepeatTagHelper<"rp">;
|
|
72
|
+
rt: RepeatTagHelper<"rt">;
|
|
73
|
+
ruby: RepeatTagHelper<"ruby">;
|
|
74
|
+
s: RepeatTagHelper<"s">;
|
|
75
|
+
samp: RepeatTagHelper<"samp">;
|
|
76
|
+
section: RepeatTagHelper<"section">;
|
|
77
|
+
select: RepeatTagHelper<"select">;
|
|
78
|
+
small: RepeatTagHelper<"small">;
|
|
79
|
+
span: RepeatTagHelper<"span">;
|
|
80
|
+
strong: RepeatTagHelper<"strong">;
|
|
81
|
+
sub: RepeatTagHelper<"sub">;
|
|
82
|
+
summary: RepeatTagHelper<"summary">;
|
|
83
|
+
sup: RepeatTagHelper<"sup">;
|
|
84
|
+
table: RepeatTagHelper<"table">;
|
|
85
|
+
tbody: RepeatTagHelper<"tbody">;
|
|
86
|
+
td: RepeatTagHelper<"td">;
|
|
87
|
+
textarea: RepeatTagHelper<"textarea">;
|
|
88
|
+
tfoot: RepeatTagHelper<"tfoot">;
|
|
89
|
+
th: RepeatTagHelper<"th">;
|
|
90
|
+
thead: RepeatTagHelper<"thead">;
|
|
91
|
+
time: RepeatTagHelper<"time">;
|
|
92
|
+
tr: RepeatTagHelper<"tr">;
|
|
93
|
+
u: RepeatTagHelper<"u">;
|
|
94
|
+
ul: RepeatTagHelper<"ul">;
|
|
95
|
+
var: RepeatTagHelper<"var">;
|
|
96
|
+
video: RepeatTagHelper<"video">;
|
|
97
|
+
[x: string]: RepeatTagHelper<any>;
|
|
23
98
|
}
|
|
24
99
|
export {};
|
package/dist/types/show.d.ts
CHANGED
|
@@ -1,35 +1,105 @@
|
|
|
1
1
|
import { ComponentPropsWithRef } from "react";
|
|
2
|
-
import { Fallback,
|
|
3
|
-
/**
|
|
4
|
-
* Show 컴포넌트의 배열 props 타입
|
|
5
|
-
* when이 배열인 경우 모든 요소가 truthy여야 렌더링
|
|
6
|
-
*/
|
|
2
|
+
import { Fallback, NonNullableElements } from "./";
|
|
7
3
|
export interface ShowPropsArray<T extends unknown[]> extends Fallback {
|
|
8
4
|
when: T;
|
|
9
5
|
children: React.ReactNode | ((item: NonNullableElements<T>) => React.ReactNode);
|
|
10
6
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Show 컴포넌트의 기본 props 타입
|
|
13
|
-
* when이 truthy일 때 children 렌더링
|
|
14
|
-
*/
|
|
15
7
|
export interface ShowProps<T = unknown> extends Fallback {
|
|
16
8
|
when: T;
|
|
17
9
|
children: React.ReactNode | ((item: NonNullable<T>) => React.ReactNode);
|
|
18
10
|
}
|
|
19
|
-
/**
|
|
20
|
-
* 특정 HTML 태그를 위한 Show 헬퍼 타입
|
|
21
|
-
* 배열과 단일 값 모두 지원
|
|
22
|
-
*/
|
|
23
11
|
type ShowTagHelper<K extends keyof JSX.IntrinsicElements> = {
|
|
24
|
-
<T extends unknown[]>(props: Omit<ComponentPropsWithRef<K>, "children"> & ShowPropsArray<T>): React.ReactNode;
|
|
25
|
-
<T extends unknown>(props: Omit<ComponentPropsWithRef<K>, "children"> & ShowProps<T>): React.ReactNode;
|
|
12
|
+
<const T extends unknown[]>(props: Omit<ComponentPropsWithRef<K>, "children"> & ShowPropsArray<T>): React.ReactNode;
|
|
13
|
+
<const T extends unknown>(props: Omit<ComponentPropsWithRef<K>, "children"> & ShowProps<T>): React.ReactNode;
|
|
26
14
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
15
|
+
export interface ShowType {
|
|
16
|
+
<const T extends unknown[]>(props: ShowPropsArray<T>): React.ReactNode;
|
|
17
|
+
<const T extends unknown>(props: ShowProps<T>): React.ReactNode;
|
|
18
|
+
a: ShowTagHelper<"a">;
|
|
19
|
+
abbr: ShowTagHelper<"abbr">;
|
|
20
|
+
address: ShowTagHelper<"address">;
|
|
21
|
+
article: ShowTagHelper<"article">;
|
|
22
|
+
aside: ShowTagHelper<"aside">;
|
|
23
|
+
b: ShowTagHelper<"b">;
|
|
24
|
+
bdi: ShowTagHelper<"bdi">;
|
|
25
|
+
bdo: ShowTagHelper<"bdo">;
|
|
26
|
+
blockquote: ShowTagHelper<"blockquote">;
|
|
27
|
+
button: ShowTagHelper<"button">;
|
|
28
|
+
canvas: ShowTagHelper<"canvas">;
|
|
29
|
+
cite: ShowTagHelper<"cite">;
|
|
30
|
+
code: ShowTagHelper<"code">;
|
|
31
|
+
data: ShowTagHelper<"data">;
|
|
32
|
+
datalist: ShowTagHelper<"datalist">;
|
|
33
|
+
dd: ShowTagHelper<"dd">;
|
|
34
|
+
del: ShowTagHelper<"del">;
|
|
35
|
+
details: ShowTagHelper<"details">;
|
|
36
|
+
dfn: ShowTagHelper<"dfn">;
|
|
37
|
+
dialog: ShowTagHelper<"dialog">;
|
|
38
|
+
div: ShowTagHelper<"div">;
|
|
39
|
+
dl: ShowTagHelper<"dl">;
|
|
40
|
+
dt: ShowTagHelper<"dt">;
|
|
41
|
+
em: ShowTagHelper<"em">;
|
|
42
|
+
fieldset: ShowTagHelper<"fieldset">;
|
|
43
|
+
figcaption: ShowTagHelper<"figcaption">;
|
|
44
|
+
figure: ShowTagHelper<"figure">;
|
|
45
|
+
footer: ShowTagHelper<"footer">;
|
|
46
|
+
form: ShowTagHelper<"form">;
|
|
47
|
+
h1: ShowTagHelper<"h1">;
|
|
48
|
+
h2: ShowTagHelper<"h2">;
|
|
49
|
+
h3: ShowTagHelper<"h3">;
|
|
50
|
+
h4: ShowTagHelper<"h4">;
|
|
51
|
+
h5: ShowTagHelper<"h5">;
|
|
52
|
+
h6: ShowTagHelper<"h6">;
|
|
53
|
+
header: ShowTagHelper<"header">;
|
|
54
|
+
hr: ShowTagHelper<"hr">;
|
|
55
|
+
i: ShowTagHelper<"i">;
|
|
56
|
+
img: ShowTagHelper<"img">;
|
|
57
|
+
input: ShowTagHelper<"input">;
|
|
58
|
+
ins: ShowTagHelper<"ins">;
|
|
59
|
+
kbd: ShowTagHelper<"kbd">;
|
|
60
|
+
label: ShowTagHelper<"label">;
|
|
61
|
+
legend: ShowTagHelper<"legend">;
|
|
62
|
+
li: ShowTagHelper<"li">;
|
|
63
|
+
main: ShowTagHelper<"main">;
|
|
64
|
+
map: ShowTagHelper<"map">;
|
|
65
|
+
mark: ShowTagHelper<"mark">;
|
|
66
|
+
menu: ShowTagHelper<"menu">;
|
|
67
|
+
meter: ShowTagHelper<"meter">;
|
|
68
|
+
nav: ShowTagHelper<"nav">;
|
|
69
|
+
ol: ShowTagHelper<"ol">;
|
|
70
|
+
option: ShowTagHelper<"option">;
|
|
71
|
+
output: ShowTagHelper<"output">;
|
|
72
|
+
p: ShowTagHelper<"p">;
|
|
73
|
+
picture: ShowTagHelper<"picture">;
|
|
74
|
+
pre: ShowTagHelper<"pre">;
|
|
75
|
+
progress: ShowTagHelper<"progress">;
|
|
76
|
+
q: ShowTagHelper<"q">;
|
|
77
|
+
rp: ShowTagHelper<"rp">;
|
|
78
|
+
rt: ShowTagHelper<"rt">;
|
|
79
|
+
ruby: ShowTagHelper<"ruby">;
|
|
80
|
+
s: ShowTagHelper<"s">;
|
|
81
|
+
samp: ShowTagHelper<"samp">;
|
|
82
|
+
section: ShowTagHelper<"section">;
|
|
83
|
+
select: ShowTagHelper<"select">;
|
|
84
|
+
small: ShowTagHelper<"small">;
|
|
85
|
+
span: ShowTagHelper<"span">;
|
|
86
|
+
strong: ShowTagHelper<"strong">;
|
|
87
|
+
sub: ShowTagHelper<"sub">;
|
|
88
|
+
summary: ShowTagHelper<"summary">;
|
|
89
|
+
sup: ShowTagHelper<"sup">;
|
|
90
|
+
table: ShowTagHelper<"table">;
|
|
91
|
+
tbody: ShowTagHelper<"tbody">;
|
|
92
|
+
td: ShowTagHelper<"td">;
|
|
93
|
+
textarea: ShowTagHelper<"textarea">;
|
|
94
|
+
tfoot: ShowTagHelper<"tfoot">;
|
|
95
|
+
th: ShowTagHelper<"th">;
|
|
96
|
+
thead: ShowTagHelper<"thead">;
|
|
97
|
+
time: ShowTagHelper<"time">;
|
|
98
|
+
tr: ShowTagHelper<"tr">;
|
|
99
|
+
u: ShowTagHelper<"u">;
|
|
100
|
+
ul: ShowTagHelper<"ul">;
|
|
101
|
+
var: ShowTagHelper<"var">;
|
|
102
|
+
video: ShowTagHelper<"video">;
|
|
103
|
+
[x: string]: ShowTagHelper<any>;
|
|
34
104
|
}
|
|
35
105
|
export {};
|
package/package.json
CHANGED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createElement, forwardRef } from "react";
|
|
3
|
-
import { htmlTags } from "../../constants/htmlTags";
|
|
4
|
-
import { processForrable } from "./processForrable";
|
|
5
|
-
export const Forrable = ({ children }) => {
|
|
6
|
-
return _jsx(_Fragment, { children: children });
|
|
7
|
-
};
|
|
8
|
-
function BaseFor({ each, children, fallback = null, }) {
|
|
9
|
-
// children이 함수인 경우 (기존 방식)
|
|
10
|
-
if (typeof children === "function") {
|
|
11
|
-
const content = each && each.length > 0 ? each.map(children) : fallback;
|
|
12
|
-
return _jsx(_Fragment, { children: content });
|
|
13
|
-
}
|
|
14
|
-
// children이 ReactNode인 경우 (Forrable 패턴)
|
|
15
|
-
return _jsx(_Fragment, { children: processForrable(children, each, fallback) });
|
|
16
|
-
}
|
|
17
|
-
const renderForTag = (tag) =>
|
|
18
|
-
// forward ref so consumers can attach a ref to the underlying DOM element
|
|
19
|
-
forwardRef(({ each, children, fallback = null, ...props }, ref) => {
|
|
20
|
-
// children이 함수인 경우 (기존 방식)
|
|
21
|
-
if (typeof children === "function") {
|
|
22
|
-
const content = each && each.length > 0 ? each.map(children) : fallback;
|
|
23
|
-
return createElement(tag, { ...props, ref }, content);
|
|
24
|
-
}
|
|
25
|
-
// children이 ReactNode인 경우 (Forrable 패턴)
|
|
26
|
-
return createElement(tag, { ...props, ref }, processForrable(children, each, fallback));
|
|
27
|
-
});
|
|
28
|
-
const tagEntries = htmlTags.reduce((acc, tag) => {
|
|
29
|
-
acc[tag] = renderForTag(tag);
|
|
30
|
-
return acc;
|
|
31
|
-
}, {});
|
|
32
|
-
export const For = Object.assign(BaseFor, tagEntries);
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Children, isValidElement } from "react";
|
|
2
|
-
import { Forrable } from ".";
|
|
3
|
-
/**
|
|
4
|
-
* Forrable 컴포넌트인지 확인하는 헬퍼 함수
|
|
5
|
-
*/
|
|
6
|
-
function isForrable(child) {
|
|
7
|
-
return isValidElement(child) && child.type === Forrable;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Forrable 패턴을 처리하는 공통 함수
|
|
11
|
-
*/
|
|
12
|
-
export function processForrable(children, each, fallback) {
|
|
13
|
-
const childrenArray = Children.toArray(children);
|
|
14
|
-
const forrable = childrenArray.find(isForrable);
|
|
15
|
-
if (forrable) {
|
|
16
|
-
const forrableChildren = forrable.props.children;
|
|
17
|
-
if (typeof forrableChildren === "function") {
|
|
18
|
-
const content = each && each.length > 0 ? each.map(forrableChildren) : fallback;
|
|
19
|
-
return childrenArray.map((child) => {
|
|
20
|
-
if (child === forrable) {
|
|
21
|
-
return content;
|
|
22
|
-
}
|
|
23
|
-
return child;
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return children;
|
|
28
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { ShowType } from "../../types/show";
|
|
2
|
-
/**
|
|
3
|
-
* Showable 컴포넌트는 실제로는 렌더링되지 않고,
|
|
4
|
-
* Show 컴포넌트가 이를 찾아서 when 값을 전달하고 조건부 렌더링 처리
|
|
5
|
-
* Forrable과 동일한 패턴
|
|
6
|
-
*/
|
|
7
|
-
export declare const Showable: ({ children, fallback }: {
|
|
8
|
-
children: React.ReactNode | ((value: any) => React.ReactNode);
|
|
9
|
-
fallback?: React.ReactNode;
|
|
10
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
-
export declare const Show: ShowType;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createElement, forwardRef } from "react";
|
|
3
|
-
import { htmlTags } from "../../constants/htmlTags";
|
|
4
|
-
import { renderShowContent } from "./renderShowContent";
|
|
5
|
-
/**
|
|
6
|
-
* Showable 컴포넌트는 실제로는 렌더링되지 않고,
|
|
7
|
-
* Show 컴포넌트가 이를 찾아서 when 값을 전달하고 조건부 렌더링 처리
|
|
8
|
-
* Forrable과 동일한 패턴
|
|
9
|
-
*/
|
|
10
|
-
export const Showable = ({ children, fallback = null }) => {
|
|
11
|
-
return _jsx(_Fragment, { children: children });
|
|
12
|
-
};
|
|
13
|
-
const BaseShow = ({ when, children, fallback = null }) => {
|
|
14
|
-
return _jsx(_Fragment, { children: renderShowContent(when, children, fallback) });
|
|
15
|
-
};
|
|
16
|
-
const renderForTag = (tag) =>
|
|
17
|
-
// forward ref so consumers like Observer can pass a ref to the real DOM element
|
|
18
|
-
forwardRef(function Render({ when, children, fallback = null, ...props }, ref) {
|
|
19
|
-
return createElement(tag, { ...props, ref }, renderShowContent(when, children, fallback));
|
|
20
|
-
});
|
|
21
|
-
const tagEntries = htmlTags.reduce((acc, tag) => {
|
|
22
|
-
acc[tag] = renderForTag(tag);
|
|
23
|
-
return acc;
|
|
24
|
-
}, {});
|
|
25
|
-
export const Show = Object.assign(BaseShow, tagEntries);
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Showable 패턴을 처리하는 공통 함수
|
|
3
|
-
*
|
|
4
|
-
* Forrable과 동일한 패턴:
|
|
5
|
-
* - Showable을 찾아서 when 값을 기반으로 조건부 렌더링
|
|
6
|
-
* - 다른 children은 그대로 유지
|
|
7
|
-
* - Showable 위치에 렌더링 결과 삽입
|
|
8
|
-
*/
|
|
9
|
-
export declare function processShowable(children: React.ReactNode, when: any, fallback: React.ReactNode): import("react").ReactNode;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { Children, isValidElement } from "react";
|
|
2
|
-
import { Showable } from ".";
|
|
3
|
-
/**
|
|
4
|
-
* Showable 컴포넌트인지 확인하는 헬퍼 함수
|
|
5
|
-
*/
|
|
6
|
-
function isShowable(child) {
|
|
7
|
-
return isValidElement(child) && child.type === Showable;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Showable 패턴을 처리하는 공통 함수
|
|
11
|
-
*
|
|
12
|
-
* Forrable과 동일한 패턴:
|
|
13
|
-
* - Showable을 찾아서 when 값을 기반으로 조건부 렌더링
|
|
14
|
-
* - 다른 children은 그대로 유지
|
|
15
|
-
* - Showable 위치에 렌더링 결과 삽입
|
|
16
|
-
*/
|
|
17
|
-
export function processShowable(children, when, fallback) {
|
|
18
|
-
const childrenArray = Children.toArray(children);
|
|
19
|
-
const showable = childrenArray.find(isShowable);
|
|
20
|
-
const shouldRender = Array.isArray(when) ? when.every(Boolean) : !!when;
|
|
21
|
-
// Showable이 없으면 children 그대로 반환 (일반 children들)
|
|
22
|
-
if (!showable) {
|
|
23
|
-
return children;
|
|
24
|
-
}
|
|
25
|
-
// Showable을 찾아서 조건부 렌더링 처리
|
|
26
|
-
const showableChildren = showable.props.children;
|
|
27
|
-
const showableFallback = showable.props.fallback ?? fallback;
|
|
28
|
-
// when 조건에 따라 Showable의 content 결정
|
|
29
|
-
let showableContent;
|
|
30
|
-
if (typeof showableChildren === "function") {
|
|
31
|
-
// 함수인 경우: when 값을 전달하고 조건부 렌더링
|
|
32
|
-
showableContent = shouldRender ? showableChildren(when) : showableFallback;
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
// ReactNode인 경우: 조건부 렌더링
|
|
36
|
-
showableContent = shouldRender ? showableChildren : showableFallback;
|
|
37
|
-
}
|
|
38
|
-
// children 배열에서 Showable만 교체
|
|
39
|
-
return childrenArray.map((child) => {
|
|
40
|
-
if (child === showable) {
|
|
41
|
-
return showableContent;
|
|
42
|
-
}
|
|
43
|
-
return child;
|
|
44
|
-
});
|
|
45
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* children 렌더링을 처리하는 공통 함수
|
|
3
|
-
*
|
|
4
|
-
* 두 가지 사용 패턴:
|
|
5
|
-
* 1. 함수 children: Show 자체가 조건부 렌더링 (<Show when={x}>{(val) => ...}</Show>)
|
|
6
|
-
* 2. ReactNode children: Show는 항상 렌더링, Showable만 조건부 (<Show.div when={x}><Showable>...</Showable></Show.div>)
|
|
7
|
-
*/
|
|
8
|
-
export declare function renderShowContent(when: any, children: React.ReactNode | ((value: any) => React.ReactNode), fallback: React.ReactNode): React.ReactNode;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { processShowable } from "./processShowable";
|
|
2
|
-
/**
|
|
3
|
-
* children 렌더링을 처리하는 공통 함수
|
|
4
|
-
*
|
|
5
|
-
* 두 가지 사용 패턴:
|
|
6
|
-
* 1. 함수 children: Show 자체가 조건부 렌더링 (<Show when={x}>{(val) => ...}</Show>)
|
|
7
|
-
* 2. ReactNode children: Show는 항상 렌더링, Showable만 조건부 (<Show.div when={x}><Showable>...</Showable></Show.div>)
|
|
8
|
-
*/
|
|
9
|
-
export function renderShowContent(when, children, fallback) {
|
|
10
|
-
// children이 함수인 경우 (기존 방식 - Show 자체가 조건부 렌더링)
|
|
11
|
-
if (typeof children === "function") {
|
|
12
|
-
const shouldRender = Array.isArray(when) ? when.every(Boolean) : !!when;
|
|
13
|
-
return shouldRender ? children(when) : fallback;
|
|
14
|
-
}
|
|
15
|
-
// children이 ReactNode인 경우 (Showable 패턴 - Show는 항상 렌더링, Showable만 조건부)
|
|
16
|
-
return processShowable(children, when, fallback);
|
|
17
|
-
}
|