subay 0.0.7 → 0.0.8
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/README.md +543 -239
- package/README.zh.md +682 -377
- package/examples/todo-app.html +286 -0
- package/lib/h.d.ts.map +1 -1
- package/lib/h.js +50 -32
- package/lib/h.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.dev.js +3 -0
- package/lib/index.js +1 -2
- package/lib/index.js.map +1 -1
- package/lib/name.d.ts +2 -0
- package/lib/name.d.ts.map +1 -0
- package/lib/name.js +58 -0
- package/lib/name.js.map +1 -0
- package/lib/s.d.ts +13 -1
- package/lib/s.d.ts.map +1 -1
- package/lib/s.js +60 -64
- package/lib/s.js.map +1 -1
- package/package.json +12 -9
- package/src/h.ts +56 -42
- package/src/index.ts +0 -2
- package/src/name.ts +60 -0
- package/src/s.ts +95 -95
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/s.ts","../src/h.ts"],"sourcesContent":["interface IUpdater {\r\n (): void;\r\n _whoIOwn: Array<IUpdater>;\r\n _whoINeed: Array<ITrigger>;\r\n _dirty: boolean;\r\n _onCleanupCallback: Array<() => void>;\r\n}\r\n\r\ninterface ITrigger {\r\n _whoNeedMe: Array<IUpdater>;\r\n _data: IO<any>;\r\n _pendingValue: any;\r\n}\r\n\r\ninterface IS<T> {\r\n (): T;\r\n}\r\n\r\ninterface IO<T> {\r\n (): T;\r\n (nextValue: T): T;\r\n}\r\n\r\nlet currentUpdate: IUpdater | undefined = undefined;\r\nconst NoValue: unique symbol = Symbol();\r\nlet triggerQueue: Array<ITrigger> | undefined = undefined;\r\nconst fun2s = new WeakMap<(...args: any[]) => any, IUpdater>();\r\nclass Reactive {}\r\nclass Observable extends Reactive {}\r\nclass Computation extends Reactive {}\r\nconst cProto = new Computation();\r\nconst oProto = new Observable();\r\n\r\nexport const root = <T>(fn: (destroy: () => void) => T): T => {\r\n const backup = currentUpdate;\r\n const rootUpdate: IUpdater = (() => {}) as any;\r\n resetUpdate(rootUpdate);\r\n rootUpdate._dirty = false;\r\n currentUpdate = rootUpdate;\r\n const result = fn(() => {\r\n recycleUpdate(rootUpdate);\r\n currentUpdate = undefined;\r\n });\r\n currentUpdate = backup;\r\n return result;\r\n};\r\nexport const S = <T>(fn: (pv: T | undefined) => T, value?: T): IS<T> => {\r\n const data = () => {\r\n if (update._dirty) {\r\n update();\r\n } else if (currentUpdate) {\r\n update._whoINeed.forEach((t) => t._data());\r\n }\r\n return value as T;\r\n };\r\n Object.setPrototypeOf(data, cProto);\r\n const update: IUpdater = (() => {\r\n const backup = currentUpdate;\r\n recycleUpdate(update);\r\n update._dirty = false;\r\n currentUpdate = update;\r\n value = fn(value);\r\n currentUpdate = backup;\r\n }) as any;\r\n if (currentUpdate) {\r\n currentUpdate._whoIOwn.push(update);\r\n }\r\n resetUpdate(update);\r\n update();\r\n fun2s.set(fn, update);\r\n return data;\r\n};\r\nexport const o = <T>(value: T): IO<T> => {\r\n function data(): T;\r\n function data(nextValue: T): T;\r\n function data(nextValue?: T) {\r\n if (arguments.length === 0) {\r\n if (currentUpdate) {\r\n if (!currentUpdate._whoINeed.includes(trigger)) {\r\n currentUpdate._whoINeed.push(trigger);\r\n }\r\n if (!trigger._whoNeedMe.includes(currentUpdate)) {\r\n trigger._whoNeedMe.push(currentUpdate);\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n if (triggerQueue) {\r\n if (trigger._pendingValue === NoValue) {\r\n triggerQueue.push(trigger);\r\n }\r\n trigger._pendingValue = nextValue;\r\n return nextValue;\r\n }\r\n\r\n value = nextValue!;\r\n\r\n const backup = currentUpdate;\r\n currentUpdate = undefined;\r\n\r\n const whoNeedMeLasttime = trigger._whoNeedMe.filter((it) => {\r\n return it._whoINeed.includes(trigger);\r\n });\r\n whoNeedMeLasttime.forEach((u) => {\r\n u._dirty = true;\r\n });\r\n trigger._whoNeedMe = [];\r\n whoNeedMeLasttime.forEach((u) => {\r\n if (u._dirty) {\r\n u();\r\n }\r\n });\r\n\r\n currentUpdate = backup;\r\n\r\n return value;\r\n }\r\n\r\n Object.setPrototypeOf(data, oProto);\r\n\r\n const trigger: ITrigger = {\r\n _whoNeedMe: [],\r\n _data: data,\r\n _pendingValue: NoValue,\r\n };\r\n\r\n return data;\r\n};\r\nconst recycleUpdate = (update: IUpdater) => {\r\n update._whoIOwn.forEach(recycleUpdate);\r\n update._dirty = false;\r\n update._onCleanupCallback.forEach((f) => f());\r\n resetUpdate(update);\r\n};\r\n\r\nconst resetUpdate = (update: IUpdater) => {\r\n update._whoINeed = [];\r\n update._whoIOwn = [];\r\n update._onCleanupCallback = [];\r\n};\r\n\r\nexport const cleanup = <T extends () => void>(f: T): T => {\r\n if (currentUpdate) {\r\n currentUpdate._onCleanupCallback.push(f);\r\n }\r\n return f;\r\n};\r\n\r\nexport const transaction = <T>(f: () => T): T => {\r\n const fallback = triggerQueue;\r\n triggerQueue = [] as ITrigger[];\r\n const result = f();\r\n const workedQueue = triggerQueue;\r\n triggerQueue = fallback;\r\n\r\n workedQueue.forEach((t) => {\r\n if (t._pendingValue !== NoValue) {\r\n const pv = t._pendingValue;\r\n t._pendingValue = NoValue;\r\n t._data(pv);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\nexport { o as observable };\r\n\r\nexport const sample = <T>(f: () => T): T => {\r\n const fallback = currentUpdate;\r\n currentUpdate = undefined;\r\n const value = f();\r\n currentUpdate = fallback;\r\n return value;\r\n};\r\n\r\nexport const isListening = () => !!currentUpdate;\r\n\r\nexport const subscribe = (f: () => void) => {\r\n S(f);\r\n return () => unsubscribe(f);\r\n};\r\nexport const unsubscribe = (f: () => void) => {\r\n const update = fun2s.get(f);\r\n if (update) {\r\n recycleUpdate(update);\r\n }\r\n};\r\n\r\nexport const isObservable = (o: any): o is IO<any> => o instanceof Observable;\r\nexport const isComputed = (o: any): o is IS<any> => o instanceof Computation;\r\nexport const isReactive = (o: any): o is IO<any> | IS<any> => o instanceof Reactive;\r\n","/** @format */\r\n\r\nimport { cleanup, isReactive, root, S, sample } from './s.js';\r\n\r\nconst enum InterNodeType {\r\n Text = 1,\r\n Element = 2,\r\n Attribute = 3,\r\n}\r\n\r\ntype InterTreeNode = InterTextNode | InterElementNode;\r\n\r\ntype InterTextNode = {\r\n _type: InterNodeType.Text;\r\n _data: Array<string | number>;\r\n};\r\ntype InterElementNode = {\r\n _ns: string | null;\r\n _tag: Array<string | number>;\r\n _type: InterNodeType.Element;\r\n _attrs: InterAttributeNode[];\r\n _content: Array<InterTreeNode>;\r\n _sourceNode: Element | null;\r\n _sourceIndex: number;\r\n};\r\n\r\ntype InterAttributeNode = {\r\n _type: InterNodeType.Attribute;\r\n _name: Array<string | number>;\r\n _value: Array<string | number>;\r\n};\r\n\r\nconst cache = new Map<TemplateStringsArray, InterTreeNode[]>();\r\nfunction random6LetterString() {\r\n const BASE = 36;\r\n const power5 = BASE ** 5;\r\n const min = 10 * power5;\r\n const length = 26 * power5;\r\n return Math.floor(Math.random() * length + min).toString(BASE);\r\n}\r\nconst MarkStart = random6LetterString();\r\nconst MarkEnd = random6LetterString();\r\nconst MarkReg = new RegExp(`([\\\\s\\\\S]*?)${MarkStart}(\\\\d+)${MarkEnd}([\\\\s\\\\S]*?)(?=${MarkStart}\\\\d+${MarkEnd}|$)`, 'g');\r\nconst BlankText = /\\s*\\n\\s*/g;\r\nconst domParser = new DOMParser();\r\n\r\nconst parseText = (data: string) => {\r\n const result: Array<string | number> = [];\r\n data = data.replace(BlankText, '');\r\n if (data.includes(MarkStart) && data.includes(MarkEnd)) {\r\n for (const res of data.matchAll(MarkReg)) {\r\n const [, prefix, index, suffix] = res;\r\n if (prefix) {\r\n result.push(prefix);\r\n }\r\n if (index) {\r\n result.push(Number(index));\r\n }\r\n if (suffix) {\r\n result.push(suffix);\r\n }\r\n }\r\n } else if (data) {\r\n result.push(data);\r\n }\r\n return result;\r\n};\r\n\r\nconst unparseText = (data: Array<string | number>, values: any[]) => {\r\n if (data.length === 1) {\r\n if (typeof data[0] === 'number') {\r\n return values[data[0]!];\r\n }\r\n return data[0];\r\n }\r\n return S(() => {\r\n return data\r\n .map((it) => {\r\n if (typeof it === 'number') {\r\n const value = values[it];\r\n if (typeof value === 'function') {\r\n return value();\r\n }\r\n return value;\r\n }\r\n return it;\r\n })\r\n .join('');\r\n });\r\n};\r\n\r\nconst parse = (\r\n docType: DOMParserSupportedType,\r\n wrapSource: (source: string) => string,\r\n unwrapNode: (node: Document) => NodeList,\r\n segments: TemplateStringsArray,\r\n indexMap: number[],\r\n): InterTreeNode[] => {\r\n if (cache.has(segments)) {\r\n return cache.get(segments)!;\r\n }\r\n\r\n const htmlStr = segments\r\n .flatMap((segment, index, { length }) => {\r\n if (index === length - 1) {\r\n return [segment];\r\n }\r\n return [segment, MarkStart, indexMap[index], MarkEnd];\r\n })\r\n .join('');\r\n\r\n const wrappedHtmlStr = wrapSource(htmlStr);\r\n\r\n const document = domParser.parseFromString(wrappedHtmlStr, docType);\r\n\r\n const dom2treenode = (domNodeList: NodeList) => {\r\n const nodeList: InterTreeNode[] = [];\r\n for (\r\n let item: Node | undefined | null = domNodeList.item(0), nextSibling = item?.nextSibling, index = 0;\r\n item != null;\r\n item = nextSibling, nextSibling = nextSibling?.nextSibling, index++\r\n ) {\r\n do\r\n remove_and_dec_index: {\r\n if (item.nodeType === Node.ELEMENT_NODE) {\r\n const el = item as Element;\r\n const tag = parseText(el.tagName.toLowerCase());\r\n const isVariableElem = tag.length > 1 || typeof tag[0] === 'number';\r\n\r\n nodeList.push({\r\n _ns: el.namespaceURI,\r\n _type: InterNodeType.Element,\r\n _tag: tag,\r\n _attrs: Array.from(el.attributes).flatMap((attr) => {\r\n const name = parseText(attr.nodeName);\r\n const value = parseText(attr.value);\r\n const isVariableAttr =\r\n name.length > 1 ||\r\n typeof name[0] === 'number' ||\r\n value.length > 1 ||\r\n typeof value[0] === 'number';\r\n\r\n if (!isVariableElem && !isVariableAttr) {\r\n return [];\r\n } else {\r\n el.removeAttribute(attr.nodeName);\r\n }\r\n return [\r\n {\r\n _type: InterNodeType.Attribute,\r\n _name: name,\r\n _value: value,\r\n } satisfies InterAttributeNode,\r\n ];\r\n }),\r\n _content: el.childNodes.length > 0 ? dom2treenode(el.childNodes) : [],\r\n _sourceNode: isVariableElem ? null : el,\r\n _sourceIndex: index,\r\n });\r\n\r\n if (!isVariableElem) {\r\n break remove_and_dec_index;\r\n }\r\n } else if (item.nodeType === Node.TEXT_NODE) {\r\n const data = (item as Text).data;\r\n const result = parseText(data);\r\n if (result.length > 0) {\r\n nodeList.push({\r\n _type: InterNodeType.Text,\r\n _data: result,\r\n });\r\n }\r\n }\r\n (item as Comment | Text | Element).remove();\r\n index--;\r\n }\r\n while (false);\r\n }\r\n return nodeList;\r\n };\r\n\r\n const rootList = unwrapNode(document);\r\n\r\n const treeNode = dom2treenode(rootList);\r\n\r\n cache.set(segments, treeNode);\r\n\r\n return treeNode;\r\n};\r\n\r\nconst element = (\r\n ns: string | null,\r\n sourceNode: Element | null,\r\n tagName: string | (() => string),\r\n child: (node: Element) => Node[],\r\n): Node[] => {\r\n if (typeof tagName === 'function') {\r\n return fragment(() => {\r\n const realTagName = tagName();\r\n if (typeof realTagName === 'string') {\r\n return element(ns, null, realTagName, child);\r\n }\r\n return [];\r\n });\r\n }\r\n if (typeof tagName !== 'string') {\r\n return [];\r\n }\r\n const el = sourceNode || (ns ? document.createElementNS(ns, tagName) : document.createElement(tagName));\r\n S(() => {\r\n const subnodes = child(el);\r\n if (subnodes.length === 0) {\r\n return;\r\n }\r\n if (!el.firstChild) {\r\n // @domact\r\n el.append(...subnodes);\r\n } else {\r\n for (let left: Element | null = el.firstElementChild, rightIndex = 0; rightIndex < subnodes.length; rightIndex++) {\r\n const right = subnodes[rightIndex]!;\r\n if (left === right) {\r\n left = left.nextElementSibling;\r\n } else {\r\n // @domact\r\n el.insertBefore(right, left);\r\n }\r\n }\r\n }\r\n });\r\n cleanup(() => el.remove());\r\n return [el];\r\n};\r\n\r\nconst fragment = (child: (head: Node) => Node[]): Node[] => {\r\n const firstNode = document.createComment('start-frag');\r\n cleanup(() => firstNode.remove());\r\n const tempArray: Node[] = [firstNode];\r\n S(() => {\r\n const c = child(firstNode);\r\n const carr = Array.isArray(c) ? c : [c];\r\n\r\n const nodified = carr.map((c) => {\r\n if (c instanceof Node) {\r\n return c;\r\n }\r\n const node = document.createTextNode(c);\r\n cleanup(() => node.remove());\r\n return node;\r\n });\r\n\r\n if (firstNode.isConnected) {\r\n firstNode.after(...nodified);\r\n } else {\r\n tempArray.push(...nodified);\r\n }\r\n });\r\n\r\n return tempArray;\r\n};\r\nfunction arrTrans<T>(a: readonly T[], b: readonly T[], a2b: (a: T) => void, dela: (a: T) => void, keep: (a: T) => void): void {\r\n const aLen = a.length;\r\n const bLen = b.length;\r\n\r\n if (a === b || (aLen === 0 && bLen === 0)) {\r\n return;\r\n }\r\n\r\n let start = 0;\r\n const minLen = Math.min(aLen, bLen);\r\n while (start < minLen && a[start] === b[start]) {\r\n start++;\r\n }\r\n\r\n let end = 0;\r\n while (end < minLen - start && a[aLen - 1 - end] === b[bLen - 1 - end]) {\r\n end++;\r\n }\r\n\r\n const aMidLen = aLen - start - end;\r\n const bMidLen = bLen - start - end;\r\n\r\n if (aMidLen === 0 && bMidLen === 0) {\r\n for (let i = 0; i < start; i++) {\r\n keep(a[i]!);\r\n }\r\n for (let i = 0; i < end; i++) {\r\n keep(a[aLen - end + i]!);\r\n }\r\n return;\r\n }\r\n\r\n const bIndexMap = new Map<T, number>();\r\n for (let i = 0; i < bMidLen; i++) {\r\n bIndexMap.set(b[start + i]!, i);\r\n }\r\n\r\n const indices: number[] = [];\r\n for (let i = 0; i < aMidLen; i++) {\r\n const val = a[start + i]!;\r\n const bIdx = bIndexMap.get(val);\r\n if (bIdx !== undefined) {\r\n indices.push(bIdx);\r\n }\r\n }\r\n\r\n const tails: number[] = [];\r\n const parents: number[] = new Array(indices.length).fill(-1);\r\n const tailIndices: number[] = [];\r\n\r\n for (let i = 0; i < indices.length; i++) {\r\n const idx = indices[i]!;\r\n\r\n let left = 0;\r\n let right = tails.length;\r\n while (left < right) {\r\n const mid = (left + right) >> 1;\r\n if (tails[mid]! < idx) {\r\n left = mid + 1;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n const pos = left;\r\n if (pos === tails.length) {\r\n tails.push(idx);\r\n tailIndices.push(i);\r\n } else {\r\n tails[pos] = idx;\r\n tailIndices[pos] = i;\r\n }\r\n\r\n if (pos > 0) {\r\n parents[i] = tailIndices[pos - 1]!;\r\n }\r\n }\r\n\r\n const keepSet = new Set<T>();\r\n let curr = tailIndices.length > 0 ? tailIndices[tailIndices.length - 1]! : -1;\r\n while (curr !== -1) {\r\n const bIdx = indices[curr]!;\r\n keepSet.add(b[start + bIdx]!);\r\n curr = parents[curr]!;\r\n }\r\n\r\n for (let i = 0; i < start; i++) {\r\n keep(a[i]!);\r\n }\r\n\r\n for (let i = 0; i < aMidLen; i++) {\r\n const val = a[start + i]!;\r\n if (!keepSet.has(val)) {\r\n dela(val);\r\n }\r\n }\r\n\r\n for (let i = 0; i < bMidLen; i++) {\r\n const val = b[start + i]!;\r\n if (keepSet.has(val)) {\r\n keep(val);\r\n } else {\r\n a2b(val);\r\n }\r\n }\r\n\r\n for (let i = 0; i < end; i++) {\r\n keep(a[aLen - end + i]!);\r\n }\r\n}\r\ninterface MapState<T> {\r\n _itemDestroyer: Array<() => void>;\r\n _domNodesOfItem: Node[][];\r\n _arrayValue: T[];\r\n}\r\nexport const map = <T>(array: () => T[], f: (item: T) => Node[]): Node[] => {\r\n return fragment((headNode) => {\r\n cleanup(() => {\r\n mapState()._itemDestroyer.forEach((f) => f());\r\n });\r\n const createItem = (item: T) => {\r\n return root((destroyItem) => {\r\n const domNodes = f(item);\r\n return [destroyItem, domNodes] as [() => void, Node[]];\r\n });\r\n };\r\n const mapState = S<MapState<T>>(\r\n (\r\n preState = {\r\n _arrayValue: [] as T[],\r\n _domNodesOfItem: [],\r\n _itemDestroyer: [],\r\n },\r\n ) => {\r\n const currentArrayValue = array();\r\n const preArrayValue = preState._arrayValue;\r\n const newState: MapState<T> = {\r\n _arrayValue: currentArrayValue,\r\n _domNodesOfItem: [],\r\n _itemDestroyer: [],\r\n };\r\n arrTrans(\r\n preArrayValue,\r\n currentArrayValue,\r\n (newItem) => {\r\n const [destroyer, domNodes] = createItem(newItem);\r\n const preNode = newState._domNodesOfItem.at(-1)?.at(-1) ?? headNode;\r\n (preNode as Element | Comment).after(...domNodes);\r\n newState._domNodesOfItem.push(domNodes);\r\n newState._itemDestroyer.push(destroyer);\r\n },\r\n (oldItem) => {\r\n const i = preArrayValue.indexOf(oldItem);\r\n preState._itemDestroyer[i]!();\r\n },\r\n (oldItem) => {\r\n const i = preArrayValue.indexOf(oldItem);\r\n newState._domNodesOfItem.push(preState._domNodesOfItem[i]!);\r\n newState._itemDestroyer.push(preState._itemDestroyer[i]!);\r\n },\r\n );\r\n return newState;\r\n },\r\n );\r\n return sample(() => mapState()._domNodesOfItem.flat());\r\n });\r\n};\r\n\r\nconst isPropertyOf = (domEl: HTMLElement | SVGElement, traitName: string) => {\r\n let descriptor;\r\n do {\r\n descriptor = Object.getOwnPropertyDescriptor(domEl, traitName);\r\n domEl = Object.getPrototypeOf(domEl);\r\n } while (domEl && !descriptor);\r\n if (!descriptor) {\r\n return false;\r\n }\r\n if (false === descriptor.writable) {\r\n return false;\r\n }\r\n if (descriptor.get && !descriptor.set) {\r\n return false;\r\n }\r\n return true;\r\n};\r\nconst attribute = (node: Element, key: string | (() => string), val: string | (() => any)) => {\r\n if (typeof key !== 'function' && !isReactive(val)) {\r\n if (!node) {\r\n return;\r\n }\r\n if (!(node instanceof Element)) {\r\n return;\r\n }\r\n const isProp = isPropertyOf(node as any, key);\r\n if (isProp) {\r\n const preValue = (node as any)[key];\r\n (node as any)[key] = val;\r\n cleanup(() => {\r\n (node as any)[key] = preValue;\r\n });\r\n } else {\r\n node.setAttribute(key, val);\r\n cleanup(() => {\r\n node.removeAttribute(key);\r\n });\r\n }\r\n } else {\r\n S(() => {\r\n attribute(node, typeof key === 'function' ? key() : key, isReactive(val) ? val() : val);\r\n });\r\n }\r\n};\r\n\r\nconst spreadAttrs = (node: Element, value: () => any) => {\r\n S(() => {\r\n const attrs = value();\r\n for (const key in attrs) {\r\n attribute(node, key, attrs[key]);\r\n }\r\n });\r\n};\r\n\r\nconst tree2dom = (ns: string | null, node: InterTreeNode, values: any[]): Node[] => {\r\n if (node._type === InterNodeType.Text) {\r\n return node._data.flatMap((part) => {\r\n if (typeof part === 'string') {\r\n const textNode = document.createTextNode(part);\r\n cleanup(() => textNode.remove());\r\n return textNode;\r\n } else if (typeof part === 'number') {\r\n const value = values[part];\r\n if (typeof value === 'function') {\r\n return fragment(value);\r\n } else {\r\n const textNode = document.createTextNode(String(value));\r\n cleanup(() => textNode.remove());\r\n return textNode;\r\n }\r\n }\r\n return [];\r\n });\r\n } else {\r\n const { _attrs: attrs, _content: content, _tag: tag, _sourceNode: sourceNode } = node;\r\n const tagValue = unparseText(tag, values);\r\n const currentNs = node._ns ?? ns;\r\n return element(currentNs, sourceNode, tagValue, (node) => {\r\n for (const { _name: name, _value: value } of attrs) {\r\n if (name[0] === '...' && typeof name[1] === 'number') {\r\n spreadAttrs(node, unparseText(name.slice(1), values));\r\n } else {\r\n attribute(node, unparseText(name, values), unparseText(value, values));\r\n }\r\n }\r\n return content.flatMap((t) => tree2dom(currentNs, t, values));\r\n });\r\n }\r\n};\r\n\r\nconst cloneTreeNode = (treeNode: InterTreeNode, parentNode: Element | null): InterTreeNode => {\r\n if (treeNode._type === InterNodeType.Text) {\r\n return treeNode;\r\n } else {\r\n if (!treeNode._sourceNode) {\r\n return treeNode;\r\n }\r\n const currentNode =\r\n parentNode ?\r\n (parentNode.childNodes.item(treeNode._sourceIndex) as Element)\r\n : (treeNode._sourceNode.cloneNode(true) as Element);\r\n return {\r\n ...treeNode,\r\n _sourceNode: currentNode,\r\n _content: treeNode._content.map((node) => cloneTreeNode(node, currentNode)),\r\n } satisfies InterElementNode;\r\n }\r\n};\r\n\r\nconst tag =\r\n (\r\n ns: string | null,\r\n docType: DOMParserSupportedType,\r\n wrapSource: (source: string) => string,\r\n unwrapNode: (node: Document) => NodeList,\r\n ) =>\r\n (segments: TemplateStringsArray, ...values: any[]): Node[] => {\r\n const tree = parse(\r\n docType,\r\n wrapSource,\r\n unwrapNode,\r\n segments,\r\n values.map((it) => values.indexOf(it)),\r\n );\r\n const clonedTree = tree.map((tree) => cloneTreeNode(tree, null));\r\n return fragment(() => {\r\n return clonedTree.flatMap((item) => tree2dom(ns, item, values));\r\n });\r\n };\r\nconst svgns = 'http://www.w3.org/2000/svg';\r\nexport const svg = tag(\r\n svgns,\r\n 'text/xml',\r\n (svg) => `<svg xmlns=\"${svgns}\">${svg}</svg>`,\r\n (doc) => doc.firstChild!.childNodes,\r\n);\r\nexport const html = tag(\r\n null,\r\n 'text/html',\r\n (html) => html,\r\n (doc) => doc.body.childNodes,\r\n);\r\n"],"names":["currentUpdate","NoValue","Symbol","triggerQueue","fun2s","WeakMap","Reactive","Observable","Computation","cProto","oProto","root","fn","backup","rootUpdate","resetUpdate","_dirty","result","recycleUpdate","undefined","S","value","data","update","_whoINeed","forEach","t","_data","Object","setPrototypeOf","_whoIOwn","push","set","o","nextValue","arguments","length","includes","trigger","_whoNeedMe","_pendingValue","whoNeedMeLasttime","filter","it","u","_onCleanupCallback","f","cleanup","transaction","fallback","workedQueue","pv","sample","isListening","subscribe","unsubscribe","get","isObservable","isComputed","isReactive","cache","Map","random6LetterString","Math","floor","random","toString","MarkStart","MarkEnd","MarkReg","RegExp","BlankText","domParser","DOMParser","parseText","replace","res","matchAll","prefix","index","suffix","Number","unparseText","values","map","join","element","ns","sourceNode","tagName","child","fragment","realTagName","el","document","createElementNS","createElement","subnodes","firstChild","left","firstElementChild","rightIndex","right","nextElementSibling","insertBefore","append","remove","firstNode","createComment","tempArray","c","nodified","Array","isArray","Node","node","createTextNode","isConnected","after","array","headNode","mapState","_itemDestroyer","preState","_arrayValue","_domNodesOfItem","currentArrayValue","preArrayValue","newState","a","b","a2b","dela","keep","aLen","bLen","start","minLen","min","end","aMidLen","bMidLen","i","bIndexMap","indices","bIdx","tails","parents","fill","tailIndices","idx","mid","pos","keepSet","Set","curr","add","val","has","arrTrans","newItem","_newState$_domNodesOf","_newState$_domNodesOf2","destroyer","domNodes","item","destroyItem","at","oldItem","indexOf","flat","attribute","key","Element","isPropertyOf","domEl","traitName","descriptor","getOwnPropertyDescriptor","getPrototypeOf","writable","preValue","setAttribute","removeAttribute","spreadAttrs","attrs","tree2dom","_type","flatMap","part","textNode","String","_node$_ns","_attrs","_content","content","_tag","tag","_sourceNode","tagValue","currentNs","_ns","_name","name","_value","slice","cloneTreeNode","treeNode","parentNode","currentNode","childNodes","_sourceIndex","cloneNode","_extends","docType","wrapSource","unwrapNode","segments","tree","parse","indexMap","wrappedHtmlStr","segment","parseFromString","dom2treenode","domNodeList","nodeList","nextSibling","_item","_nextSibling","remove_and_dec_index","nodeType","ELEMENT_NODE","toLowerCase","isVariableElem","namespaceURI","from","attributes","attr","nodeName","TEXT_NODE","rootList","clonedTree","svgns","svg","doc","html","body"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
|
package/lib/name.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAkDA,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,WAAW,MAAM,KAAG,CAStF,CAAC"}
|
package/lib/name.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const url2src = new Map();
|
|
2
|
+
const getLeftName = function getLeftName() {
|
|
3
|
+
const stack = new Error().stack;
|
|
4
|
+
if (!stack) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const urlRegex = /((?:\w+:\/\/)[-a-zA-Z0-9:@;?&=\/%\+\.\*!'\(\),\$_\{\}\^~\[\]`#|]+):(\d+):(\d+)/;
|
|
8
|
+
const lines = stack.split('\n');
|
|
9
|
+
const currentLineIndex = lines.findIndex((line) => {
|
|
10
|
+
return line.includes(import.meta.url) && line.includes(getLeftName.name);
|
|
11
|
+
});
|
|
12
|
+
if (currentLineIndex > -1) {
|
|
13
|
+
const offset = 3;
|
|
14
|
+
const line = lines[currentLineIndex + offset];
|
|
15
|
+
if (!line) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const location = line.match(urlRegex);
|
|
19
|
+
if (!location) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const url = location[1];
|
|
23
|
+
const lineNo = location[2];
|
|
24
|
+
const colNo = location[3];
|
|
25
|
+
if (!url || !lineNo || !colNo) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
let src;
|
|
29
|
+
if (url2src.has(url)) {
|
|
30
|
+
src = url2src.get(url);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const xhr = new XMLHttpRequest();
|
|
34
|
+
xhr.open('GET', url, false);
|
|
35
|
+
xhr.send();
|
|
36
|
+
src = xhr.responseText;
|
|
37
|
+
url2src.set(url, src);
|
|
38
|
+
}
|
|
39
|
+
const reg = new RegExp(`(?:.*\r?\n){${Number(lineNo) - 1}}.{${Number(colNo) - 1}}`);
|
|
40
|
+
const segment = src.match(reg);
|
|
41
|
+
if (!segment) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return segment[0].match(/(\w+)\s*=\s*$/)?.[1];
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
};
|
|
48
|
+
export const namedFunc = (f, fallback) => {
|
|
49
|
+
const leftName = getLeftName() ?? fallback;
|
|
50
|
+
if (!leftName) {
|
|
51
|
+
return f;
|
|
52
|
+
}
|
|
53
|
+
const g = new Function(`return function ${leftName} (...args) {return ${leftName}._(...args)}`)();
|
|
54
|
+
g._ = f;
|
|
55
|
+
Object.setPrototypeOf(g, f);
|
|
56
|
+
return g;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=name.js.map
|
package/lib/name.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name.js","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"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"}
|
package/lib/s.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
interface IS<T> {
|
|
2
|
-
(): T;
|
|
2
|
+
(force?: typeof Yes): T;
|
|
3
|
+
_whoIOwn: Array<IS<any>>;
|
|
4
|
+
_whoINeed: Set<IO<any> | IS<any>>;
|
|
5
|
+
_whoNeedMe: Array<IS<any>>;
|
|
6
|
+
_dirty: boolean;
|
|
7
|
+
_onCleanupCallback: Array<() => void>;
|
|
8
|
+
$o: number;
|
|
9
|
+
_birthtime: number;
|
|
3
10
|
}
|
|
4
11
|
interface IO<T> {
|
|
5
12
|
(): T;
|
|
6
13
|
(nextValue: T): T;
|
|
14
|
+
_whoNeedMe: Array<IS<any>>;
|
|
15
|
+
_pendingValue: any;
|
|
16
|
+
$o: number;
|
|
17
|
+
_birthtime: number;
|
|
7
18
|
}
|
|
19
|
+
declare const Yes: unique symbol;
|
|
8
20
|
export declare const root: <T>(fn: (destroy: () => void) => T) => T;
|
|
9
21
|
export declare const S: <T>(fn: (pv: T | undefined) => T, value?: T) => IS<T>;
|
|
10
22
|
export declare const o: <T>(value: T) => IO<T>;
|
package/lib/s.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"s.d.ts","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"AAIA,UAAU,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,kBAAkB,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACtB;AAaD,UAAU,EAAE,CAAC,CAAC;IACV,IAAI,CAAC,CAAC;IACN,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACtB;AAID,QAAA,MAAM,GAAG,EAAE,OAAO,MAAiB,CAAC;AAKpC,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,KAAG,CAYxD,CAAC;AACF,eAAO,MAAM,CAAC,GAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAG,EAAE,CAAC,CAAC,CAyBlE,CAAC;AACF,eAAO,MAAM,CAAC,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,EAAE,CAAC,CAAC,CAiDnC,CAAC;AAiBF,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,IAAI,EAAE,GAAG,CAAC,KAAG,CAGpD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,GAAG,MAAM,CAAC,KAAG,CAc3C,CAAC;AAEF,OAAO,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;AAE3B,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,GAAG,MAAM,CAAC,KAAG,CAMtC,CAAC;AAEF,eAAO,MAAM,WAAW,eAAwB,CAAC;AAEjD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,IAAI,eAGtC,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,IAAI,SAKxC,CAAC;AACF,eAAO,MAAM,YAAY,GAAI,GAAG,GAAG,KAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAoB,CAAC;AACtE,eAAO,MAAM,UAAU,GAAI,GAAG,GAAG,KAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAoB,CAAC;AACpE,eAAO,MAAM,UAAU,GAAI,GAAG,GAAG,KAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAU,CAAC"}
|
package/lib/s.js
CHANGED
|
@@ -1,86 +1,82 @@
|
|
|
1
|
+
const namedFunc = typeof __SUBAY_DEV__ === 'boolean' && __SUBAY_DEV__ ? (await import('./name.js')).namedFunc : (f) => f;
|
|
1
2
|
let currentUpdate = undefined;
|
|
2
3
|
const NoValue = Symbol();
|
|
4
|
+
const Yes = Symbol();
|
|
3
5
|
let triggerQueue = undefined;
|
|
4
6
|
const fun2s = new WeakMap();
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
class Observable extends Reactive {
|
|
8
|
-
}
|
|
9
|
-
class Computation extends Reactive {
|
|
10
|
-
}
|
|
11
|
-
const cProto = new Computation();
|
|
12
|
-
const oProto = new Observable();
|
|
7
|
+
let clock = 0;
|
|
13
8
|
export const root = (fn) => {
|
|
14
9
|
const backup = currentUpdate;
|
|
15
10
|
const rootUpdate = (() => { });
|
|
16
|
-
|
|
11
|
+
resetS(rootUpdate);
|
|
17
12
|
rootUpdate._dirty = false;
|
|
18
13
|
currentUpdate = rootUpdate;
|
|
19
14
|
const result = fn(() => {
|
|
20
|
-
|
|
15
|
+
recycleS(rootUpdate);
|
|
21
16
|
currentUpdate = undefined;
|
|
22
17
|
});
|
|
23
18
|
currentUpdate = backup;
|
|
24
19
|
return result;
|
|
25
20
|
};
|
|
26
21
|
export const S = (fn, value) => {
|
|
27
|
-
const data = () => {
|
|
28
|
-
if (
|
|
29
|
-
|
|
22
|
+
const data = namedFunc(resetS((force) => {
|
|
23
|
+
if (force === Yes || data._dirty) {
|
|
24
|
+
const backup = currentUpdate;
|
|
25
|
+
recycleS(data);
|
|
26
|
+
data._dirty = false;
|
|
27
|
+
currentUpdate = data;
|
|
28
|
+
value = fn(value);
|
|
29
|
+
currentUpdate = backup;
|
|
30
30
|
}
|
|
31
|
-
else if (currentUpdate) {
|
|
32
|
-
|
|
31
|
+
else if (currentUpdate && !currentUpdate._whoINeed.has(data)) {
|
|
32
|
+
currentUpdate._whoINeed.add(data);
|
|
33
|
+
data._whoNeedMe.push(currentUpdate);
|
|
33
34
|
}
|
|
34
35
|
return value;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const backup = currentUpdate;
|
|
39
|
-
recycleUpdate(update);
|
|
40
|
-
update._dirty = false;
|
|
41
|
-
currentUpdate = update;
|
|
42
|
-
value = fn(value);
|
|
43
|
-
currentUpdate = backup;
|
|
44
|
-
});
|
|
36
|
+
}));
|
|
37
|
+
data.$o = 0xc03;
|
|
38
|
+
data._birthtime = clock++;
|
|
45
39
|
if (currentUpdate) {
|
|
46
|
-
currentUpdate._whoIOwn.push(
|
|
40
|
+
currentUpdate._whoIOwn.push(data);
|
|
47
41
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
fun2s.set(fn, update);
|
|
42
|
+
data(Yes);
|
|
43
|
+
fun2s.set(fn, data);
|
|
51
44
|
return data;
|
|
52
45
|
};
|
|
53
46
|
export const o = (value) => {
|
|
54
|
-
function
|
|
47
|
+
function d(nextValue) {
|
|
55
48
|
if (arguments.length === 0) {
|
|
56
|
-
if (currentUpdate) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
if (!trigger._whoNeedMe.includes(currentUpdate)) {
|
|
61
|
-
trigger._whoNeedMe.push(currentUpdate);
|
|
62
|
-
}
|
|
49
|
+
if (currentUpdate && !currentUpdate._whoINeed.has(data)) {
|
|
50
|
+
currentUpdate._whoINeed.add(data);
|
|
51
|
+
data._whoNeedMe.push(currentUpdate);
|
|
63
52
|
}
|
|
64
53
|
return value;
|
|
65
54
|
}
|
|
66
55
|
if (triggerQueue) {
|
|
67
|
-
if (
|
|
68
|
-
triggerQueue.push(
|
|
56
|
+
if (data._pendingValue === NoValue) {
|
|
57
|
+
triggerQueue.push(data);
|
|
69
58
|
}
|
|
70
|
-
|
|
59
|
+
data._pendingValue = nextValue;
|
|
71
60
|
return nextValue;
|
|
72
61
|
}
|
|
73
62
|
value = nextValue;
|
|
74
63
|
const backup = currentUpdate;
|
|
75
64
|
currentUpdate = undefined;
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
65
|
+
const collection = new Set();
|
|
66
|
+
const collect = (it, by) => {
|
|
67
|
+
if (!it._whoINeed.has(by) || collection.has(it)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
collection.add(it);
|
|
71
|
+
it._whoNeedMe.forEach((i) => collect(i, it));
|
|
72
|
+
};
|
|
73
|
+
data._whoNeedMe.forEach((it) => collect(it, data));
|
|
74
|
+
const whoNeedMeLasttime = Array.from(collection);
|
|
79
75
|
whoNeedMeLasttime.forEach((u) => {
|
|
80
76
|
u._dirty = true;
|
|
81
77
|
});
|
|
82
|
-
|
|
83
|
-
whoNeedMeLasttime.forEach((u) => {
|
|
78
|
+
data._whoNeedMe = [];
|
|
79
|
+
whoNeedMeLasttime.sort(byBirthTime).forEach((u) => {
|
|
84
80
|
if (u._dirty) {
|
|
85
81
|
u();
|
|
86
82
|
}
|
|
@@ -88,29 +84,29 @@ export const o = (value) => {
|
|
|
88
84
|
currentUpdate = backup;
|
|
89
85
|
return value;
|
|
90
86
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
};
|
|
87
|
+
const data = namedFunc(d);
|
|
88
|
+
data._whoNeedMe = [];
|
|
89
|
+
data._pendingValue = NoValue;
|
|
90
|
+
data.$o = 0x0b5;
|
|
91
|
+
data._birthtime = clock++;
|
|
97
92
|
return data;
|
|
98
93
|
};
|
|
99
|
-
const
|
|
100
|
-
|
|
94
|
+
const byBirthTime = (a, b) => a._birthtime - b._birthtime;
|
|
95
|
+
const recycleS = (update) => {
|
|
96
|
+
update._whoIOwn.forEach(recycleS);
|
|
101
97
|
update._dirty = false;
|
|
102
98
|
update._onCleanupCallback.forEach((f) => f());
|
|
103
|
-
|
|
99
|
+
resetS(update);
|
|
104
100
|
};
|
|
105
|
-
const
|
|
106
|
-
update._whoINeed =
|
|
101
|
+
const resetS = (update) => {
|
|
102
|
+
update._whoINeed = new Set();
|
|
103
|
+
update._whoNeedMe = [];
|
|
107
104
|
update._whoIOwn = [];
|
|
108
105
|
update._onCleanupCallback = [];
|
|
106
|
+
return update;
|
|
109
107
|
};
|
|
110
108
|
export const cleanup = (f) => {
|
|
111
|
-
|
|
112
|
-
currentUpdate._onCleanupCallback.push(f);
|
|
113
|
-
}
|
|
109
|
+
currentUpdate?._onCleanupCallback.push(f);
|
|
114
110
|
return f;
|
|
115
111
|
};
|
|
116
112
|
export const transaction = (f) => {
|
|
@@ -123,7 +119,7 @@ export const transaction = (f) => {
|
|
|
123
119
|
if (t._pendingValue !== NoValue) {
|
|
124
120
|
const pv = t._pendingValue;
|
|
125
121
|
t._pendingValue = NoValue;
|
|
126
|
-
t
|
|
122
|
+
t(pv);
|
|
127
123
|
}
|
|
128
124
|
});
|
|
129
125
|
return result;
|
|
@@ -144,10 +140,10 @@ export const subscribe = (f) => {
|
|
|
144
140
|
export const unsubscribe = (f) => {
|
|
145
141
|
const update = fun2s.get(f);
|
|
146
142
|
if (update) {
|
|
147
|
-
|
|
143
|
+
recycleS(update);
|
|
148
144
|
}
|
|
149
145
|
};
|
|
150
|
-
export const isObservable = (o) => o
|
|
151
|
-
export const isComputed = (o) => o
|
|
152
|
-
export const isReactive = (o) => o
|
|
146
|
+
export const isObservable = (o) => o?.$o === 0x0b5;
|
|
147
|
+
export const isComputed = (o) => o?.$o === 0xc03;
|
|
148
|
+
export const isReactive = (o) => o?.$o;
|
|
153
149
|
//# sourceMappingURL=s.js.map
|
package/lib/s.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s.js","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"s.js","sourceRoot":"","sources":["../src/s.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "subay",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "A lightweight reactive UI library with state management and template rendering",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"reactive",
|
|
@@ -18,12 +18,14 @@
|
|
|
18
18
|
"author": "j-sen",
|
|
19
19
|
"type": "module",
|
|
20
20
|
"module": "./lib/index.js",
|
|
21
|
+
"main": "./lib/index.js",
|
|
22
|
+
"types": "./src/index.d.ts",
|
|
21
23
|
"exports": {
|
|
22
|
-
"default": "./lib/index.js",
|
|
23
|
-
"unpkg": "./lib/index.js",
|
|
24
24
|
".": {
|
|
25
|
-
"import": "./lib/index.js"
|
|
26
|
-
|
|
25
|
+
"import": "./lib/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./dev": {
|
|
28
|
+
"import": "./lib/index.dev.js"
|
|
27
29
|
}
|
|
28
30
|
},
|
|
29
31
|
"devDependencies": {
|
|
@@ -32,9 +34,10 @@
|
|
|
32
34
|
"scripts": {
|
|
33
35
|
"test": "npx http-server -c-1 -o /test/test.html",
|
|
34
36
|
"dev": "tsc --build --watch ./tsconfig.json",
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
37
|
+
"types": "tsc -d --outDir lib",
|
|
38
|
+
"bundle-dev": "npx esbuild --bundle src/index.ts --outfile=lib/index.dev.js --minify \"--mangle-props=^_\" --format=esm --define:__SUBAY_DEV__=true",
|
|
39
|
+
"bundle-prod": "npx esbuild --bundle src/index.ts --outfile=lib/index.js --minify \"--mangle-props=^_\" --format=esm --define:__SUBAY_DEV__=false",
|
|
40
|
+
"bundle": "npm run bundle-dev & npm run bundle-prod",
|
|
41
|
+
"build": "npm run types && npm run bundle"
|
|
39
42
|
}
|
|
40
43
|
}
|