@satorijs/element 1.0.2 → 1.1.0

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/lib/index.cjs CHANGED
@@ -179,7 +179,7 @@ __name(Element, "Element");
179
179
  tokens.push(unescape(source.slice(0, tagCap.index)));
180
180
  }
181
181
  const [_, close, tag, attrs, empty] = tagCap;
182
- const token = { tag, close, empty, attrs: {} };
182
+ const token = { source: _, tag, close, empty, attrs: {} };
183
183
  let attrCap;
184
184
  while (attrCap = attrRegExp.exec(attrs)) {
185
185
  const [_2, key, v1 = "", v2 = v1] = attrCap;
@@ -191,20 +191,40 @@ __name(Element, "Element");
191
191
  if (source)
192
192
  tokens.push(unescape(source));
193
193
  const stack = [Element2(null)];
194
+ function rollback(index) {
195
+ for (; index > 0; index--) {
196
+ const { children } = stack.shift();
197
+ const { source: source2 } = stack[0].children.pop();
198
+ stack[0].children.push(Element2("text", { content: source2 }));
199
+ stack[0].children.push(...children);
200
+ }
201
+ }
202
+ __name(rollback, "rollback");
194
203
  for (const token of tokens) {
195
204
  if (typeof token === "string") {
196
205
  stack[0].children.push(Element2("text", { content: token }));
197
206
  } else if (token.close) {
198
- stack.shift();
207
+ let index = 0;
208
+ while (index < stack.length && stack[index].type !== token.tag)
209
+ index++;
210
+ if (index === stack.length) {
211
+ stack[0].children.push(Element2("text", { content: token.source }));
212
+ } else {
213
+ rollback(index);
214
+ const element = stack.shift();
215
+ delete element.source;
216
+ }
199
217
  } else {
200
218
  const element = Element2(token.tag, token.attrs);
201
219
  stack[0].children.push(element);
202
- if (!token.empty)
220
+ if (!token.empty) {
221
+ element.source = token.source;
203
222
  stack.unshift(element);
223
+ }
204
224
  }
205
225
  }
206
- const root2 = stack[stack.length - 1];
207
- return fragment ? root2 : root2.children;
226
+ rollback(stack.length - 1);
227
+ return fragment ? stack[0] : stack[0].children;
208
228
  }
209
229
  Element2.parse = parse;
210
230
  __name(parse, "parse");
package/lib/index.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/utils.ts"],
4
- "sourcesContent": ["import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, isNullable } from 'cosmokit'\nimport { isType } from './utils'\n\nconst kElement = Symbol('element')\n\nfunction isElement(source: any): source is Element {\n return source && typeof source === 'object' && source[kElement]\n}\n\nfunction toElement(content: string | Element) {\n if (typeof content !== 'string') return content\n return Element('text', { content })\n}\n\nfunction toElementArray(input: Element.Content) {\n if (Array.isArray(input)) {\n return input.map(toElement)\n } else if (typeof input === 'string') {\n return [toElement(input)]\n } else if (!input.type) {\n return input.children\n } else {\n return [input]\n }\n}\n\ninterface Element {\n [kElement]: true\n type: string\n attrs: Dict<string>\n /** @deprecated use `attrs` instead */\n data: Dict<string>\n children: Element[]\n toString(strip?: boolean): string\n}\n\ninterface ElementConstructor extends Element {}\n\nclass ElementConstructor {\n get data() {\n return this.attrs\n }\n\n toString(strip = false) {\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (!this.type || strip) return inner\n if (this.type === 'text') return Element.escape(this.attrs.content)\n const attrs = Object.entries(this.attrs).map(([key, value]) => {\n if (isNullable(value)) return ''\n key = hyphenate(key)\n if (value === '') return ` ${key}`\n return ` ${key}=\"${Element.escape(value, true)}\"`\n }).join('')\n if (!this.children.length) return `<${this.type}${attrs}/>`\n return `<${this.type}${attrs}>${inner}</${this.type}>`\n }\n}\n\ndefineProperty(ElementConstructor, 'name', 'Element')\ndefineProperty(ElementConstructor.prototype, kElement, true)\n\nfunction Element(type: string, children?: Element.Content): Element\nfunction Element(type: string, attrs: Dict<any>, children?: Element.Content): Element\nfunction Element(type: string, ...args: any[]) {\n const el = Object.create(ElementConstructor.prototype)\n let attrs: Dict<string> = {}, children: Element[] = []\n if (args[0] && typeof args[0] === 'object' && !isElement(args[0]) && !Array.isArray(args[0])) {\n for (const [key, value] of Object.entries(args.shift())) {\n if (isNullable(value)) continue\n if (value === true) {\n attrs[key] = ''\n } else if (value === false) {\n attrs['no' + capitalize(key)] = ''\n } else {\n attrs[key] = '' + value\n }\n }\n }\n if (args[0]) children = toElementArray(args[0])\n return Object.assign(el, { type, attrs, children })\n}\n\nnamespace Element {\n export type Content = string | Element | (string | Element)[]\n export type Transformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => boolean | Content)\n export type AsyncTransformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => Awaitable<boolean | Content>)\n\n export function normalize(source: string | Element) {\n if (typeof source !== 'string') return Element(null, source)\n return Element.parse(source, true)\n }\n\n export function escape(source: string, inline = false) {\n const result = source\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n return inline\n ? result.replace(/\"/g, '&quot;')\n : result\n }\n\n export function unescape(source: string) {\n return source\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, '&')\n }\n\n export interface FindOptions {\n type?: string\n caret?: boolean\n }\n\n /** @deprecated use `Element.select()` instead */\n export function from(source: string, options: FindOptions = {}): Element {\n const elements = parse(source)\n if (options.caret) {\n if (options.type && elements[0]?.type !== options.type) return\n return elements[0]\n }\n return select(elements, options.type || '*')[0]\n }\n\n type Combinator = ' ' | '>' | '+' | '~'\n\n export interface Selector {\n type: string\n combinator: Combinator\n }\n\n const combRegExp = / *([ >+~]) */g\n\n export function parseSelector(input: string): Selector[][] {\n return input.split(',').map((query) => {\n const selectors: Selector[] = []\n query = query.trim()\n let combCap: RegExpExecArray, combinator: Combinator = ' '\n while ((combCap = combRegExp.exec(query))) {\n selectors.push({ type: query.slice(0, combCap.index), combinator })\n combinator = combCap[1] as Combinator\n query = query.slice(combCap.index + combCap[0].length)\n }\n selectors.push({ type: query, combinator })\n return selectors\n })\n }\n\n export function select(source: string | Element[], query: string | Selector[][]): Element[] {\n if (typeof source === 'string') source = parse(source)\n if (typeof query === 'string') query = parseSelector(query)\n if (!query.length) return\n let adjacent: Selector[][] = []\n const results: Element[] = []\n for (const [index, element] of source.entries()) {\n const inner: Selector[][] = []\n const local = [...query, ...adjacent]\n adjacent = []\n let matched = false\n for (const group of local) {\n const { type, combinator } = group[0]\n if (type === element.type || type === '*') {\n if (group.length === 1) {\n matched = true\n } else if ([' ', '>'].includes(group[1].combinator)) {\n inner.push(group.slice(1))\n } else if (group[1].combinator === '+') {\n adjacent.push(group.slice(1))\n } else {\n query.push(group.slice(1))\n }\n }\n if (combinator === ' ') {\n inner.push(group)\n }\n }\n if (matched) results.push(source[index])\n results.push(...select(element.children, inner))\n }\n return results\n }\n\n const tagRegExp = /<(\\/?)\\s*([^\\s>]+)([^>]*?)\\s*(\\/?)>/\n const attrRegExp = /([^\\s=]+)(?:=\"([^\"]*)\"|=([^\"\\s]+))?/g\n\n interface Token {\n tag: string\n close: string\n empty: string\n attrs: Dict<string>\n }\n\n export function parse(source: string): Element[]\n export function parse(source: string, fragment: true): Element\n export function parse(source: string, fragment = false) {\n const tokens: (string | Token)[] = []\n let tagCap: RegExpExecArray\n while ((tagCap = tagRegExp.exec(source))) {\n if (tagCap.index) {\n tokens.push(unescape(source.slice(0, tagCap.index)))\n }\n const [_, close, tag, attrs, empty] = tagCap\n const token: Token = { tag, close, empty, attrs: {} }\n let attrCap: RegExpExecArray\n while ((attrCap = attrRegExp.exec(attrs))) {\n const [_, key, v1 = '', v2 = v1] = attrCap\n token.attrs[camelize(key)] = unescape(v2)\n }\n tokens.push(token)\n source = source.slice(tagCap.index + tagCap[0].length)\n }\n if (source) tokens.push(unescape(source))\n const stack = [Element(null)]\n for (const token of tokens) {\n if (typeof token === 'string') {\n stack[0].children.push(Element('text', { content: token }))\n } else if (token.close) {\n stack.shift()\n } else {\n const element = Element(token.tag, token.attrs)\n stack[0].children.push(element)\n if (!token.empty) stack.unshift(element)\n }\n }\n const root = stack[stack.length - 1]\n return fragment ? root : root.children\n }\n\n export function transform(source: string, rules: Dict<Transformer>): string\n export function transform(source: Element[], rules: Dict<Transformer>): Element[]\n export function transform(source: string | Element[], rules: Dict<Transformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const output: Element[] = []\n elements.forEach((element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n output.push(Element(type, attrs, transform(children, rules)))\n } else if (result !== false) {\n output.push(...toElementArray(result))\n }\n })\n return typeof source === 'string' ? output.join('') : output\n }\n\n export async function transformAsync(source: string, rules: Dict<AsyncTransformer>): Promise<string>\n export async function transformAsync(source: Element[], rules: Dict<AsyncTransformer>): Promise<Element[]>\n export async function transformAsync(source: string | Element[], rules: Dict<AsyncTransformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const children = (await Promise.all(elements.map(async (element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = await result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n return [Element(type, attrs, await transformAsync(children, rules))]\n } else if (result !== false) {\n return toElementArray(result)\n } else {\n return []\n }\n }))).flat(1)\n return typeof source === 'string' ? children.join('') : children\n }\n\n /** @deprecated use `elements.join('')` instead */\n export function join(elements: Element[]) {\n return elements.join('')\n }\n\n export type Factory<R extends any[]> = (...args: [...rest: R, attrs?: Dict<any>]) => Element\n\n function createFactory<R extends any[] = any[]>(type: string, ...keys: string[]): Factory<R> {\n return (...args: any[]) => {\n const element = Element(type)\n keys.forEach((key, index) => {\n if (!isNullable(args[index])) {\n element.attrs[key] = args[index]\n }\n })\n if (args[keys.length]) {\n Object.assign(element.attrs, args[keys.length])\n }\n return element\n }\n }\n\n function createAssetFactory(type: string): Factory<[data: string | Buffer | ArrayBuffer]> {\n return (value, attrs = {}) => {\n if (isType('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (isType('ArrayBuffer', value)) {\n value = 'base64://' + Buffer.from(value).toString('base64')\n }\n return Element(type, { ...attrs, url: value })\n }\n }\n\n export const at = createFactory<[id: any]>('at', 'id')\n export const sharp = createFactory<[id: any]>('sharp', 'id')\n export const quote = createFactory<[id: any]>('quote', 'id')\n export const image = createAssetFactory('image')\n export const video = createAssetFactory('video')\n export const audio = createAssetFactory('audio')\n export const file = createAssetFactory('file')\n}\n\nexport = Element\n", "type Global = NodeJS.Global & Window & typeof globalThis\n\ntype GlobalClass = {\n [K in keyof Global]: Global[K] extends new (...args: any[]) => infer T ? T : never\n}\n\nconst root: any = typeof self !== 'undefined' ? self : global\n\nexport function isType<K extends keyof GlobalClass>(type: K, value: any): value is GlobalClass[K] {\n return type in root && value instanceof root[type]\n || Object.prototype.toString.call(value).slice(8, -1) === type\n}\n"],
5
- "mappings": "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",
6
- "names": ["Element", "_", "root", "elements", "children"]
4
+ "sourcesContent": ["import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, isNullable } from 'cosmokit'\nimport { isType } from './utils'\n\nconst kElement = Symbol('element')\n\nfunction isElement(source: any): source is Element {\n return source && typeof source === 'object' && source[kElement]\n}\n\nfunction toElement(content: string | Element) {\n if (typeof content !== 'string') return content\n return Element('text', { content })\n}\n\nfunction toElementArray(input: Element.Content) {\n if (Array.isArray(input)) {\n return input.map(toElement)\n } else if (typeof input === 'string') {\n return [toElement(input)]\n } else if (!input.type) {\n return input.children\n } else {\n return [input]\n }\n}\n\ninterface Element {\n [kElement]: true\n type: string\n attrs: Dict<string>\n /** @deprecated use `attrs` instead */\n data: Dict<string>\n children: Element[]\n source?: string\n toString(strip?: boolean): string\n}\n\ninterface ElementConstructor extends Element {}\n\nclass ElementConstructor {\n get data() {\n return this.attrs\n }\n\n toString(strip = false) {\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (!this.type || strip) return inner\n if (this.type === 'text') return Element.escape(this.attrs.content)\n const attrs = Object.entries(this.attrs).map(([key, value]) => {\n if (isNullable(value)) return ''\n key = hyphenate(key)\n if (value === '') return ` ${key}`\n return ` ${key}=\"${Element.escape(value, true)}\"`\n }).join('')\n if (!this.children.length) return `<${this.type}${attrs}/>`\n return `<${this.type}${attrs}>${inner}</${this.type}>`\n }\n}\n\ndefineProperty(ElementConstructor, 'name', 'Element')\ndefineProperty(ElementConstructor.prototype, kElement, true)\n\nfunction Element(type: string, children?: Element.Content): Element\nfunction Element(type: string, attrs: Dict<any>, children?: Element.Content): Element\nfunction Element(type: string, ...args: any[]) {\n const el = Object.create(ElementConstructor.prototype)\n let attrs: Dict<string> = {}, children: Element[] = []\n if (args[0] && typeof args[0] === 'object' && !isElement(args[0]) && !Array.isArray(args[0])) {\n for (const [key, value] of Object.entries(args.shift())) {\n if (isNullable(value)) continue\n if (value === true) {\n attrs[key] = ''\n } else if (value === false) {\n attrs['no' + capitalize(key)] = ''\n } else {\n attrs[key] = '' + value\n }\n }\n }\n if (args[0]) children = toElementArray(args[0])\n return Object.assign(el, { type, attrs, children })\n}\n\nnamespace Element {\n export type Content = string | Element | (string | Element)[]\n export type Transformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => boolean | Content)\n export type AsyncTransformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => Awaitable<boolean | Content>)\n\n export function normalize(source: string | Element) {\n if (typeof source !== 'string') return Element(null, source)\n return Element.parse(source, true)\n }\n\n export function escape(source: string, inline = false) {\n const result = source\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n return inline\n ? result.replace(/\"/g, '&quot;')\n : result\n }\n\n export function unescape(source: string) {\n return source\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, '&')\n }\n\n export interface FindOptions {\n type?: string\n caret?: boolean\n }\n\n /** @deprecated use `Element.select()` instead */\n export function from(source: string, options: FindOptions = {}): Element {\n const elements = parse(source)\n if (options.caret) {\n if (options.type && elements[0]?.type !== options.type) return\n return elements[0]\n }\n return select(elements, options.type || '*')[0]\n }\n\n type Combinator = ' ' | '>' | '+' | '~'\n\n export interface Selector {\n type: string\n combinator: Combinator\n }\n\n const combRegExp = / *([ >+~]) */g\n\n export function parseSelector(input: string): Selector[][] {\n return input.split(',').map((query) => {\n const selectors: Selector[] = []\n query = query.trim()\n let combCap: RegExpExecArray, combinator: Combinator = ' '\n while ((combCap = combRegExp.exec(query))) {\n selectors.push({ type: query.slice(0, combCap.index), combinator })\n combinator = combCap[1] as Combinator\n query = query.slice(combCap.index + combCap[0].length)\n }\n selectors.push({ type: query, combinator })\n return selectors\n })\n }\n\n export function select(source: string | Element[], query: string | Selector[][]): Element[] {\n if (typeof source === 'string') source = parse(source)\n if (typeof query === 'string') query = parseSelector(query)\n if (!query.length) return\n let adjacent: Selector[][] = []\n const results: Element[] = []\n for (const [index, element] of source.entries()) {\n const inner: Selector[][] = []\n const local = [...query, ...adjacent]\n adjacent = []\n let matched = false\n for (const group of local) {\n const { type, combinator } = group[0]\n if (type === element.type || type === '*') {\n if (group.length === 1) {\n matched = true\n } else if ([' ', '>'].includes(group[1].combinator)) {\n inner.push(group.slice(1))\n } else if (group[1].combinator === '+') {\n adjacent.push(group.slice(1))\n } else {\n query.push(group.slice(1))\n }\n }\n if (combinator === ' ') {\n inner.push(group)\n }\n }\n if (matched) results.push(source[index])\n results.push(...select(element.children, inner))\n }\n return results\n }\n\n const tagRegExp = /<(\\/?)\\s*([^\\s>]+)([^>]*?)\\s*(\\/?)>/\n const attrRegExp = /([^\\s=]+)(?:=\"([^\"]*)\"|=([^\"\\s]+))?/g\n\n interface Token {\n tag: string\n close: string\n empty: string\n attrs: Dict<string>\n source: string\n }\n\n export function parse(source: string): Element[]\n export function parse(source: string, fragment: true): Element\n export function parse(source: string, fragment = false) {\n const tokens: (string | Token)[] = []\n let tagCap: RegExpExecArray\n while ((tagCap = tagRegExp.exec(source))) {\n if (tagCap.index) {\n tokens.push(unescape(source.slice(0, tagCap.index)))\n }\n const [_, close, tag, attrs, empty] = tagCap\n const token: Token = { source: _, tag, close, empty, attrs: {} }\n let attrCap: RegExpExecArray\n while ((attrCap = attrRegExp.exec(attrs))) {\n const [_, key, v1 = '', v2 = v1] = attrCap\n token.attrs[camelize(key)] = unescape(v2)\n }\n tokens.push(token)\n source = source.slice(tagCap.index + tagCap[0].length)\n }\n if (source) tokens.push(unescape(source))\n const stack = [Element(null)]\n function rollback(index: number) {\n for (; index > 0; index--) {\n const { children } = stack.shift()\n const { source } = stack[0].children.pop()\n stack[0].children.push(Element('text', { content: source }))\n stack[0].children.push(...children)\n }\n }\n for (const token of tokens) {\n if (typeof token === 'string') {\n stack[0].children.push(Element('text', { content: token }))\n } else if (token.close) {\n let index = 0\n while (index < stack.length && stack[index].type !== token.tag) index++\n if (index === stack.length) {\n // no matching open tag\n stack[0].children.push(Element('text', { content: token.source }))\n } else {\n rollback(index)\n const element = stack.shift()\n delete element.source\n }\n } else {\n const element = Element(token.tag, token.attrs)\n stack[0].children.push(element)\n if (!token.empty) {\n element.source = token.source\n stack.unshift(element)\n }\n }\n }\n rollback(stack.length - 1)\n return fragment ? stack[0] : stack[0].children\n }\n\n export function transform(source: string, rules: Dict<Transformer>): string\n export function transform(source: Element[], rules: Dict<Transformer>): Element[]\n export function transform(source: string | Element[], rules: Dict<Transformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const output: Element[] = []\n elements.forEach((element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n output.push(Element(type, attrs, transform(children, rules)))\n } else if (result !== false) {\n output.push(...toElementArray(result))\n }\n })\n return typeof source === 'string' ? output.join('') : output\n }\n\n export async function transformAsync(source: string, rules: Dict<AsyncTransformer>): Promise<string>\n export async function transformAsync(source: Element[], rules: Dict<AsyncTransformer>): Promise<Element[]>\n export async function transformAsync(source: string | Element[], rules: Dict<AsyncTransformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const children = (await Promise.all(elements.map(async (element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = await result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n return [Element(type, attrs, await transformAsync(children, rules))]\n } else if (result !== false) {\n return toElementArray(result)\n } else {\n return []\n }\n }))).flat(1)\n return typeof source === 'string' ? children.join('') : children\n }\n\n /** @deprecated use `elements.join('')` instead */\n export function join(elements: Element[]) {\n return elements.join('')\n }\n\n export type Factory<R extends any[]> = (...args: [...rest: R, attrs?: Dict<any>]) => Element\n\n function createFactory<R extends any[] = any[]>(type: string, ...keys: string[]): Factory<R> {\n return (...args: any[]) => {\n const element = Element(type)\n keys.forEach((key, index) => {\n if (!isNullable(args[index])) {\n element.attrs[key] = args[index]\n }\n })\n if (args[keys.length]) {\n Object.assign(element.attrs, args[keys.length])\n }\n return element\n }\n }\n\n function createAssetFactory(type: string): Factory<[data: string | Buffer | ArrayBuffer]> {\n return (value, attrs = {}) => {\n if (isType('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (isType('ArrayBuffer', value)) {\n value = 'base64://' + Buffer.from(value).toString('base64')\n }\n return Element(type, { ...attrs, url: value })\n }\n }\n\n export const at = createFactory<[id: any]>('at', 'id')\n export const sharp = createFactory<[id: any]>('sharp', 'id')\n export const quote = createFactory<[id: any]>('quote', 'id')\n export const image = createAssetFactory('image')\n export const video = createAssetFactory('video')\n export const audio = createAssetFactory('audio')\n export const file = createAssetFactory('file')\n}\n\nexport = Element\n", "type Global = NodeJS.Global & Window & typeof globalThis\n\ntype GlobalClass = {\n [K in keyof Global]: Global[K] extends new (...args: any[]) => infer T ? T : never\n}\n\nconst root: any = typeof self !== 'undefined' ? self : global\n\nexport function isType<K extends keyof GlobalClass>(type: K, value: any): value is GlobalClass[K] {\n return type in root && value instanceof root[type]\n || Object.prototype.toString.call(value).slice(8, -1) === type\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Element", "_", "source", "elements", "children"]
7
7
  }
package/lib/index.d.ts CHANGED
@@ -8,6 +8,7 @@ interface Element {
8
8
  /** @deprecated use `attrs` instead */
9
9
  data: Dict<string>;
10
10
  children: Element[];
11
+ source?: string;
11
12
  toString(strip?: boolean): string;
12
13
  }
13
14
  declare function Element(type: string, children?: Element.Content): Element;
package/lib/index.mjs CHANGED
@@ -191,7 +191,7 @@ var require_src = __commonJS({
191
191
  tokens.push(unescape(source.slice(0, tagCap.index)));
192
192
  }
193
193
  const [_, close, tag, attrs, empty] = tagCap;
194
- const token = { tag, close, empty, attrs: {} };
194
+ const token = { source: _, tag, close, empty, attrs: {} };
195
195
  let attrCap;
196
196
  while (attrCap = attrRegExp.exec(attrs)) {
197
197
  const [_2, key, v1 = "", v2 = v1] = attrCap;
@@ -203,20 +203,40 @@ var require_src = __commonJS({
203
203
  if (source)
204
204
  tokens.push(unescape(source));
205
205
  const stack = [Element2(null)];
206
+ function rollback(index) {
207
+ for (; index > 0; index--) {
208
+ const { children } = stack.shift();
209
+ const { source: source2 } = stack[0].children.pop();
210
+ stack[0].children.push(Element2("text", { content: source2 }));
211
+ stack[0].children.push(...children);
212
+ }
213
+ }
214
+ __name(rollback, "rollback");
206
215
  for (const token of tokens) {
207
216
  if (typeof token === "string") {
208
217
  stack[0].children.push(Element2("text", { content: token }));
209
218
  } else if (token.close) {
210
- stack.shift();
219
+ let index = 0;
220
+ while (index < stack.length && stack[index].type !== token.tag)
221
+ index++;
222
+ if (index === stack.length) {
223
+ stack[0].children.push(Element2("text", { content: token.source }));
224
+ } else {
225
+ rollback(index);
226
+ const element = stack.shift();
227
+ delete element.source;
228
+ }
211
229
  } else {
212
230
  const element = Element2(token.tag, token.attrs);
213
231
  stack[0].children.push(element);
214
- if (!token.empty)
232
+ if (!token.empty) {
233
+ element.source = token.source;
215
234
  stack.unshift(element);
235
+ }
216
236
  }
217
237
  }
218
- const root2 = stack[stack.length - 1];
219
- return fragment ? root2 : root2.children;
238
+ rollback(stack.length - 1);
239
+ return fragment ? stack[0] : stack[0].children;
220
240
  }
221
241
  Element2.parse = parse;
222
242
  __name(parse, "parse");
package/lib/index.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/utils.ts", "../src/index.ts"],
4
- "sourcesContent": ["type Global = NodeJS.Global & Window & typeof globalThis\n\ntype GlobalClass = {\n [K in keyof Global]: Global[K] extends new (...args: any[]) => infer T ? T : never\n}\n\nconst root: any = typeof self !== 'undefined' ? self : global\n\nexport function isType<K extends keyof GlobalClass>(type: K, value: any): value is GlobalClass[K] {\n return type in root && value instanceof root[type]\n || Object.prototype.toString.call(value).slice(8, -1) === type\n}\n", "import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, isNullable } from 'cosmokit'\nimport { isType } from './utils'\n\nconst kElement = Symbol('element')\n\nfunction isElement(source: any): source is Element {\n return source && typeof source === 'object' && source[kElement]\n}\n\nfunction toElement(content: string | Element) {\n if (typeof content !== 'string') return content\n return Element('text', { content })\n}\n\nfunction toElementArray(input: Element.Content) {\n if (Array.isArray(input)) {\n return input.map(toElement)\n } else if (typeof input === 'string') {\n return [toElement(input)]\n } else if (!input.type) {\n return input.children\n } else {\n return [input]\n }\n}\n\ninterface Element {\n [kElement]: true\n type: string\n attrs: Dict<string>\n /** @deprecated use `attrs` instead */\n data: Dict<string>\n children: Element[]\n toString(strip?: boolean): string\n}\n\ninterface ElementConstructor extends Element {}\n\nclass ElementConstructor {\n get data() {\n return this.attrs\n }\n\n toString(strip = false) {\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (!this.type || strip) return inner\n if (this.type === 'text') return Element.escape(this.attrs.content)\n const attrs = Object.entries(this.attrs).map(([key, value]) => {\n if (isNullable(value)) return ''\n key = hyphenate(key)\n if (value === '') return ` ${key}`\n return ` ${key}=\"${Element.escape(value, true)}\"`\n }).join('')\n if (!this.children.length) return `<${this.type}${attrs}/>`\n return `<${this.type}${attrs}>${inner}</${this.type}>`\n }\n}\n\ndefineProperty(ElementConstructor, 'name', 'Element')\ndefineProperty(ElementConstructor.prototype, kElement, true)\n\nfunction Element(type: string, children?: Element.Content): Element\nfunction Element(type: string, attrs: Dict<any>, children?: Element.Content): Element\nfunction Element(type: string, ...args: any[]) {\n const el = Object.create(ElementConstructor.prototype)\n let attrs: Dict<string> = {}, children: Element[] = []\n if (args[0] && typeof args[0] === 'object' && !isElement(args[0]) && !Array.isArray(args[0])) {\n for (const [key, value] of Object.entries(args.shift())) {\n if (isNullable(value)) continue\n if (value === true) {\n attrs[key] = ''\n } else if (value === false) {\n attrs['no' + capitalize(key)] = ''\n } else {\n attrs[key] = '' + value\n }\n }\n }\n if (args[0]) children = toElementArray(args[0])\n return Object.assign(el, { type, attrs, children })\n}\n\nnamespace Element {\n export type Content = string | Element | (string | Element)[]\n export type Transformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => boolean | Content)\n export type AsyncTransformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => Awaitable<boolean | Content>)\n\n export function normalize(source: string | Element) {\n if (typeof source !== 'string') return Element(null, source)\n return Element.parse(source, true)\n }\n\n export function escape(source: string, inline = false) {\n const result = source\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n return inline\n ? result.replace(/\"/g, '&quot;')\n : result\n }\n\n export function unescape(source: string) {\n return source\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, '&')\n }\n\n export interface FindOptions {\n type?: string\n caret?: boolean\n }\n\n /** @deprecated use `Element.select()` instead */\n export function from(source: string, options: FindOptions = {}): Element {\n const elements = parse(source)\n if (options.caret) {\n if (options.type && elements[0]?.type !== options.type) return\n return elements[0]\n }\n return select(elements, options.type || '*')[0]\n }\n\n type Combinator = ' ' | '>' | '+' | '~'\n\n export interface Selector {\n type: string\n combinator: Combinator\n }\n\n const combRegExp = / *([ >+~]) */g\n\n export function parseSelector(input: string): Selector[][] {\n return input.split(',').map((query) => {\n const selectors: Selector[] = []\n query = query.trim()\n let combCap: RegExpExecArray, combinator: Combinator = ' '\n while ((combCap = combRegExp.exec(query))) {\n selectors.push({ type: query.slice(0, combCap.index), combinator })\n combinator = combCap[1] as Combinator\n query = query.slice(combCap.index + combCap[0].length)\n }\n selectors.push({ type: query, combinator })\n return selectors\n })\n }\n\n export function select(source: string | Element[], query: string | Selector[][]): Element[] {\n if (typeof source === 'string') source = parse(source)\n if (typeof query === 'string') query = parseSelector(query)\n if (!query.length) return\n let adjacent: Selector[][] = []\n const results: Element[] = []\n for (const [index, element] of source.entries()) {\n const inner: Selector[][] = []\n const local = [...query, ...adjacent]\n adjacent = []\n let matched = false\n for (const group of local) {\n const { type, combinator } = group[0]\n if (type === element.type || type === '*') {\n if (group.length === 1) {\n matched = true\n } else if ([' ', '>'].includes(group[1].combinator)) {\n inner.push(group.slice(1))\n } else if (group[1].combinator === '+') {\n adjacent.push(group.slice(1))\n } else {\n query.push(group.slice(1))\n }\n }\n if (combinator === ' ') {\n inner.push(group)\n }\n }\n if (matched) results.push(source[index])\n results.push(...select(element.children, inner))\n }\n return results\n }\n\n const tagRegExp = /<(\\/?)\\s*([^\\s>]+)([^>]*?)\\s*(\\/?)>/\n const attrRegExp = /([^\\s=]+)(?:=\"([^\"]*)\"|=([^\"\\s]+))?/g\n\n interface Token {\n tag: string\n close: string\n empty: string\n attrs: Dict<string>\n }\n\n export function parse(source: string): Element[]\n export function parse(source: string, fragment: true): Element\n export function parse(source: string, fragment = false) {\n const tokens: (string | Token)[] = []\n let tagCap: RegExpExecArray\n while ((tagCap = tagRegExp.exec(source))) {\n if (tagCap.index) {\n tokens.push(unescape(source.slice(0, tagCap.index)))\n }\n const [_, close, tag, attrs, empty] = tagCap\n const token: Token = { tag, close, empty, attrs: {} }\n let attrCap: RegExpExecArray\n while ((attrCap = attrRegExp.exec(attrs))) {\n const [_, key, v1 = '', v2 = v1] = attrCap\n token.attrs[camelize(key)] = unescape(v2)\n }\n tokens.push(token)\n source = source.slice(tagCap.index + tagCap[0].length)\n }\n if (source) tokens.push(unescape(source))\n const stack = [Element(null)]\n for (const token of tokens) {\n if (typeof token === 'string') {\n stack[0].children.push(Element('text', { content: token }))\n } else if (token.close) {\n stack.shift()\n } else {\n const element = Element(token.tag, token.attrs)\n stack[0].children.push(element)\n if (!token.empty) stack.unshift(element)\n }\n }\n const root = stack[stack.length - 1]\n return fragment ? root : root.children\n }\n\n export function transform(source: string, rules: Dict<Transformer>): string\n export function transform(source: Element[], rules: Dict<Transformer>): Element[]\n export function transform(source: string | Element[], rules: Dict<Transformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const output: Element[] = []\n elements.forEach((element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n output.push(Element(type, attrs, transform(children, rules)))\n } else if (result !== false) {\n output.push(...toElementArray(result))\n }\n })\n return typeof source === 'string' ? output.join('') : output\n }\n\n export async function transformAsync(source: string, rules: Dict<AsyncTransformer>): Promise<string>\n export async function transformAsync(source: Element[], rules: Dict<AsyncTransformer>): Promise<Element[]>\n export async function transformAsync(source: string | Element[], rules: Dict<AsyncTransformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const children = (await Promise.all(elements.map(async (element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = await result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n return [Element(type, attrs, await transformAsync(children, rules))]\n } else if (result !== false) {\n return toElementArray(result)\n } else {\n return []\n }\n }))).flat(1)\n return typeof source === 'string' ? children.join('') : children\n }\n\n /** @deprecated use `elements.join('')` instead */\n export function join(elements: Element[]) {\n return elements.join('')\n }\n\n export type Factory<R extends any[]> = (...args: [...rest: R, attrs?: Dict<any>]) => Element\n\n function createFactory<R extends any[] = any[]>(type: string, ...keys: string[]): Factory<R> {\n return (...args: any[]) => {\n const element = Element(type)\n keys.forEach((key, index) => {\n if (!isNullable(args[index])) {\n element.attrs[key] = args[index]\n }\n })\n if (args[keys.length]) {\n Object.assign(element.attrs, args[keys.length])\n }\n return element\n }\n }\n\n function createAssetFactory(type: string): Factory<[data: string | Buffer | ArrayBuffer]> {\n return (value, attrs = {}) => {\n if (isType('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (isType('ArrayBuffer', value)) {\n value = 'base64://' + Buffer.from(value).toString('base64')\n }\n return Element(type, { ...attrs, url: value })\n }\n }\n\n export const at = createFactory<[id: any]>('at', 'id')\n export const sharp = createFactory<[id: any]>('sharp', 'id')\n export const quote = createFactory<[id: any]>('quote', 'id')\n export const image = createAssetFactory('image')\n export const video = createAssetFactory('video')\n export const audio = createAssetFactory('audio')\n export const file = createAssetFactory('file')\n}\n\nexport = Element\n"],
5
- "mappings": "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",
6
- "names": ["Element", "_", "root", "elements", "children"]
4
+ "sourcesContent": ["type Global = NodeJS.Global & Window & typeof globalThis\n\ntype GlobalClass = {\n [K in keyof Global]: Global[K] extends new (...args: any[]) => infer T ? T : never\n}\n\nconst root: any = typeof self !== 'undefined' ? self : global\n\nexport function isType<K extends keyof GlobalClass>(type: K, value: any): value is GlobalClass[K] {\n return type in root && value instanceof root[type]\n || Object.prototype.toString.call(value).slice(8, -1) === type\n}\n", "import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, isNullable } from 'cosmokit'\nimport { isType } from './utils'\n\nconst kElement = Symbol('element')\n\nfunction isElement(source: any): source is Element {\n return source && typeof source === 'object' && source[kElement]\n}\n\nfunction toElement(content: string | Element) {\n if (typeof content !== 'string') return content\n return Element('text', { content })\n}\n\nfunction toElementArray(input: Element.Content) {\n if (Array.isArray(input)) {\n return input.map(toElement)\n } else if (typeof input === 'string') {\n return [toElement(input)]\n } else if (!input.type) {\n return input.children\n } else {\n return [input]\n }\n}\n\ninterface Element {\n [kElement]: true\n type: string\n attrs: Dict<string>\n /** @deprecated use `attrs` instead */\n data: Dict<string>\n children: Element[]\n source?: string\n toString(strip?: boolean): string\n}\n\ninterface ElementConstructor extends Element {}\n\nclass ElementConstructor {\n get data() {\n return this.attrs\n }\n\n toString(strip = false) {\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (!this.type || strip) return inner\n if (this.type === 'text') return Element.escape(this.attrs.content)\n const attrs = Object.entries(this.attrs).map(([key, value]) => {\n if (isNullable(value)) return ''\n key = hyphenate(key)\n if (value === '') return ` ${key}`\n return ` ${key}=\"${Element.escape(value, true)}\"`\n }).join('')\n if (!this.children.length) return `<${this.type}${attrs}/>`\n return `<${this.type}${attrs}>${inner}</${this.type}>`\n }\n}\n\ndefineProperty(ElementConstructor, 'name', 'Element')\ndefineProperty(ElementConstructor.prototype, kElement, true)\n\nfunction Element(type: string, children?: Element.Content): Element\nfunction Element(type: string, attrs: Dict<any>, children?: Element.Content): Element\nfunction Element(type: string, ...args: any[]) {\n const el = Object.create(ElementConstructor.prototype)\n let attrs: Dict<string> = {}, children: Element[] = []\n if (args[0] && typeof args[0] === 'object' && !isElement(args[0]) && !Array.isArray(args[0])) {\n for (const [key, value] of Object.entries(args.shift())) {\n if (isNullable(value)) continue\n if (value === true) {\n attrs[key] = ''\n } else if (value === false) {\n attrs['no' + capitalize(key)] = ''\n } else {\n attrs[key] = '' + value\n }\n }\n }\n if (args[0]) children = toElementArray(args[0])\n return Object.assign(el, { type, attrs, children })\n}\n\nnamespace Element {\n export type Content = string | Element | (string | Element)[]\n export type Transformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => boolean | Content)\n export type AsyncTransformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => Awaitable<boolean | Content>)\n\n export function normalize(source: string | Element) {\n if (typeof source !== 'string') return Element(null, source)\n return Element.parse(source, true)\n }\n\n export function escape(source: string, inline = false) {\n const result = source\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n return inline\n ? result.replace(/\"/g, '&quot;')\n : result\n }\n\n export function unescape(source: string) {\n return source\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&amp;/g, '&')\n }\n\n export interface FindOptions {\n type?: string\n caret?: boolean\n }\n\n /** @deprecated use `Element.select()` instead */\n export function from(source: string, options: FindOptions = {}): Element {\n const elements = parse(source)\n if (options.caret) {\n if (options.type && elements[0]?.type !== options.type) return\n return elements[0]\n }\n return select(elements, options.type || '*')[0]\n }\n\n type Combinator = ' ' | '>' | '+' | '~'\n\n export interface Selector {\n type: string\n combinator: Combinator\n }\n\n const combRegExp = / *([ >+~]) */g\n\n export function parseSelector(input: string): Selector[][] {\n return input.split(',').map((query) => {\n const selectors: Selector[] = []\n query = query.trim()\n let combCap: RegExpExecArray, combinator: Combinator = ' '\n while ((combCap = combRegExp.exec(query))) {\n selectors.push({ type: query.slice(0, combCap.index), combinator })\n combinator = combCap[1] as Combinator\n query = query.slice(combCap.index + combCap[0].length)\n }\n selectors.push({ type: query, combinator })\n return selectors\n })\n }\n\n export function select(source: string | Element[], query: string | Selector[][]): Element[] {\n if (typeof source === 'string') source = parse(source)\n if (typeof query === 'string') query = parseSelector(query)\n if (!query.length) return\n let adjacent: Selector[][] = []\n const results: Element[] = []\n for (const [index, element] of source.entries()) {\n const inner: Selector[][] = []\n const local = [...query, ...adjacent]\n adjacent = []\n let matched = false\n for (const group of local) {\n const { type, combinator } = group[0]\n if (type === element.type || type === '*') {\n if (group.length === 1) {\n matched = true\n } else if ([' ', '>'].includes(group[1].combinator)) {\n inner.push(group.slice(1))\n } else if (group[1].combinator === '+') {\n adjacent.push(group.slice(1))\n } else {\n query.push(group.slice(1))\n }\n }\n if (combinator === ' ') {\n inner.push(group)\n }\n }\n if (matched) results.push(source[index])\n results.push(...select(element.children, inner))\n }\n return results\n }\n\n const tagRegExp = /<(\\/?)\\s*([^\\s>]+)([^>]*?)\\s*(\\/?)>/\n const attrRegExp = /([^\\s=]+)(?:=\"([^\"]*)\"|=([^\"\\s]+))?/g\n\n interface Token {\n tag: string\n close: string\n empty: string\n attrs: Dict<string>\n source: string\n }\n\n export function parse(source: string): Element[]\n export function parse(source: string, fragment: true): Element\n export function parse(source: string, fragment = false) {\n const tokens: (string | Token)[] = []\n let tagCap: RegExpExecArray\n while ((tagCap = tagRegExp.exec(source))) {\n if (tagCap.index) {\n tokens.push(unescape(source.slice(0, tagCap.index)))\n }\n const [_, close, tag, attrs, empty] = tagCap\n const token: Token = { source: _, tag, close, empty, attrs: {} }\n let attrCap: RegExpExecArray\n while ((attrCap = attrRegExp.exec(attrs))) {\n const [_, key, v1 = '', v2 = v1] = attrCap\n token.attrs[camelize(key)] = unescape(v2)\n }\n tokens.push(token)\n source = source.slice(tagCap.index + tagCap[0].length)\n }\n if (source) tokens.push(unescape(source))\n const stack = [Element(null)]\n function rollback(index: number) {\n for (; index > 0; index--) {\n const { children } = stack.shift()\n const { source } = stack[0].children.pop()\n stack[0].children.push(Element('text', { content: source }))\n stack[0].children.push(...children)\n }\n }\n for (const token of tokens) {\n if (typeof token === 'string') {\n stack[0].children.push(Element('text', { content: token }))\n } else if (token.close) {\n let index = 0\n while (index < stack.length && stack[index].type !== token.tag) index++\n if (index === stack.length) {\n // no matching open tag\n stack[0].children.push(Element('text', { content: token.source }))\n } else {\n rollback(index)\n const element = stack.shift()\n delete element.source\n }\n } else {\n const element = Element(token.tag, token.attrs)\n stack[0].children.push(element)\n if (!token.empty) {\n element.source = token.source\n stack.unshift(element)\n }\n }\n }\n rollback(stack.length - 1)\n return fragment ? stack[0] : stack[0].children\n }\n\n export function transform(source: string, rules: Dict<Transformer>): string\n export function transform(source: Element[], rules: Dict<Transformer>): Element[]\n export function transform(source: string | Element[], rules: Dict<Transformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const output: Element[] = []\n elements.forEach((element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n output.push(Element(type, attrs, transform(children, rules)))\n } else if (result !== false) {\n output.push(...toElementArray(result))\n }\n })\n return typeof source === 'string' ? output.join('') : output\n }\n\n export async function transformAsync(source: string, rules: Dict<AsyncTransformer>): Promise<string>\n export async function transformAsync(source: Element[], rules: Dict<AsyncTransformer>): Promise<Element[]>\n export async function transformAsync(source: string | Element[], rules: Dict<AsyncTransformer>) {\n const elements = typeof source === 'string' ? parse(source) : source\n const children = (await Promise.all(elements.map(async (element, index, elements) => {\n let result = rules[element.type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = await result(element.attrs, index, elements)\n }\n if (result === true) {\n const { type, attrs, children } = element\n return [Element(type, attrs, await transformAsync(children, rules))]\n } else if (result !== false) {\n return toElementArray(result)\n } else {\n return []\n }\n }))).flat(1)\n return typeof source === 'string' ? children.join('') : children\n }\n\n /** @deprecated use `elements.join('')` instead */\n export function join(elements: Element[]) {\n return elements.join('')\n }\n\n export type Factory<R extends any[]> = (...args: [...rest: R, attrs?: Dict<any>]) => Element\n\n function createFactory<R extends any[] = any[]>(type: string, ...keys: string[]): Factory<R> {\n return (...args: any[]) => {\n const element = Element(type)\n keys.forEach((key, index) => {\n if (!isNullable(args[index])) {\n element.attrs[key] = args[index]\n }\n })\n if (args[keys.length]) {\n Object.assign(element.attrs, args[keys.length])\n }\n return element\n }\n }\n\n function createAssetFactory(type: string): Factory<[data: string | Buffer | ArrayBuffer]> {\n return (value, attrs = {}) => {\n if (isType('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (isType('ArrayBuffer', value)) {\n value = 'base64://' + Buffer.from(value).toString('base64')\n }\n return Element(type, { ...attrs, url: value })\n }\n }\n\n export const at = createFactory<[id: any]>('at', 'id')\n export const sharp = createFactory<[id: any]>('sharp', 'id')\n export const quote = createFactory<[id: any]>('quote', 'id')\n export const image = createAssetFactory('image')\n export const video = createAssetFactory('video')\n export const audio = createAssetFactory('audio')\n export const file = createAssetFactory('file')\n}\n\nexport = Element\n"],
5
+ "mappings": "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",
6
+ "names": ["Element", "_", "source", "elements", "children"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@satorijs/element",
3
3
  "description": "Element Manipulation",
4
- "version": "1.0.2",
4
+ "version": "1.1.0",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "lib/index.mjs",
7
7
  "typings": "lib/index.d.ts",