Skip to content

Instantly share code, notes, and snippets.

@HerringtonDarkholme
Last active November 22, 2016 16:23
Show Gist options
  • Save HerringtonDarkholme/155a2963f461be0caf0b3f8bf2fc5ef9 to your computer and use it in GitHub Desktop.
Save HerringtonDarkholme/155a2963f461be0caf0b3f8bf2fc5ef9 to your computer and use it in GitHub Desktop.
WTF have I written?
export type HTML = {
div: IfTag<HTML, 'div'>
p: IfTag<HTML, 'p'>
ul: UL<HTML>
ol: OL<HTML>
img: () => HTML
}
export type Comp<Parent, End extends string> = {
props(prop: {[k: string]: any}): Comp<Parent, End>
nativeOn(prop: {[k: string]: any}): Comp<Parent, End>
} & StartTag<Parent, End>
export type IfTag<Parent, End extends string> = {
if(condition: boolean): StartTag<{[K in keyof Parent]: Parent[K] & {else: Parent[K]}}, End>
(str: TemplateStringsArray, ...args: any[]): IfTag<Parent, End>
} & StartTag<Parent, End>
export type StartTag<Parent, End extends string> = {
class(nameHash: {[k: string]: boolean}): StartTag<Parent, End>
on(handlerHash: {[k: string]: Function}): StartTag<Parent, End>
for<T>(list: T[], func: (t: T, i: number) => HTML): {[K in End]: () => Parent}
} & Tag<Parent, End>
export type Tag<Parent, End extends string> = {
div: IfTag<IfTag<Parent, End>, 'div'>
p: IfTag<IfTag<Parent, End>, 'p'>
ul: UL<IfTag<Parent, End>>
img: () => IfTag<Parent, End>
} & {[K in End]: () => Parent}
export type UL<Parent> = {
li: IfTag<UL<Parent>, 'li'>
ul(): Parent
(str: TemplateStringsArray, ...args: any[]): UL<Parent>
}
export type OL<Parent> = {
li: Tag<OL<Parent>, 'li'>
ol(): Parent
if(condition: boolean): OL<{[K in keyof Parent]: Parent[K] & {else: Parent[K]}}>
(str: TemplateStringsArray, ...args: any[]): OL<Parent>
}
declare var h: HTML
h = h
.div
.div()
var k = h.div
k = h.div
.div
.div()
var j = h.div
.div
.div()
j = k
k = h.div
.div
.div()
.div
.div()
k = h.div
.p
.p()
.div
.div()
// h.div
// .p
// .div()
var ul = h.ul
ul = h.ul
.li
.li()
ul.ul()
ul.li
.div
k = h.div
.img()
h = h.img()
h = h.div.if(true)
.div()
h = h.div.on({}).for([], _ => h)
.div()
h.div.if(false)
.div()
.img.else()
.div.if(true)
.p.p()
.div()
.p.else
.p()
h = h.div`.test`
.div()
k = h.div`.test`
.ul`.test2`
.ul()
// k = h.div`.test`
// h.div
// .ul()