@satorijs/element 1.1.3 → 2.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
@@ -9,20 +9,21 @@ function isElement(source) {
9
9
  }
10
10
  __name(isElement, "isElement");
11
11
  function toElement(content) {
12
- if (typeof content !== "string")
12
+ if (typeof content === "string") {
13
+ if (content)
14
+ return Element("text", { content });
15
+ } else if (isElement(content)) {
13
16
  return content;
14
- return Element("text", { content });
17
+ } else if (!(0, import_cosmokit.isNullable)(content)) {
18
+ throw new TypeError(`Invalid content: ${content}`);
19
+ }
15
20
  }
16
21
  __name(toElement, "toElement");
17
- function toElementArray(input) {
18
- if (Array.isArray(input)) {
19
- return input.map(toElement);
20
- } else if (typeof input === "string") {
21
- return [toElement(input)];
22
- } else if (!input.type) {
23
- return input.children;
22
+ function toElementArray(content) {
23
+ if (Array.isArray(content)) {
24
+ return content.map(toElement).filter((x) => x);
24
25
  } else {
25
- return [input];
26
+ return [toElement(content)].filter((x) => x);
26
27
  }
27
28
  }
28
29
  __name(toElementArray, "toElementArray");
@@ -34,11 +35,9 @@ var ElementConstructor = class {
34
35
  if (this.type === "text")
35
36
  return Element.escape(this.attrs.content);
36
37
  const inner = this.children.map((child) => child.toString(strip)).join("");
37
- if (!this.type || strip)
38
+ if (strip)
38
39
  return inner;
39
40
  const attrs = Object.entries(this.attrs).map(([key, value]) => {
40
- if ((0, import_cosmokit.isNullable)(value))
41
- return "";
42
41
  key = (0, import_cosmokit.hyphenate)(key);
43
42
  if (value === "")
44
43
  return ` ${key}`;
@@ -59,25 +58,29 @@ function Element(type, ...args) {
59
58
  for (const [key, value] of Object.entries(args.shift())) {
60
59
  if ((0, import_cosmokit.isNullable)(value))
61
60
  continue;
62
- if (value === true) {
61
+ if (key === "children") {
62
+ children = toElementArray(value);
63
+ } else if (value === true) {
63
64
  attrs[key] = "";
64
65
  } else if (value === false) {
65
66
  attrs["no" + (0, import_cosmokit.capitalize)(key)] = "";
66
- } else {
67
+ } else if (!(0, import_cosmokit.isNullable)(value)) {
67
68
  attrs[key] = "" + value;
68
69
  }
69
70
  }
70
71
  }
71
- if (args[0])
72
- children = toElementArray(args[0]);
72
+ for (const child of args) {
73
+ children.push(...toElementArray(child));
74
+ }
73
75
  return Object.assign(el, { type, attrs, children });
74
76
  }
75
77
  __name(Element, "Element");
76
78
  ((Element2) => {
79
+ Element2.Fragment = "template";
77
80
  function normalize(source) {
78
81
  if (typeof source !== "string")
79
- return Element2(null, source);
80
- return Element2.parse(source, true);
82
+ return toElementArray(source);
83
+ return Element2.parse(source);
81
84
  }
82
85
  Element2.normalize = normalize;
83
86
  __name(normalize, "normalize");
@@ -88,7 +91,7 @@ __name(Element, "Element");
88
91
  Element2.escape = escape;
89
92
  __name(escape, "escape");
90
93
  function unescape(source) {
91
- return source.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&amp;/g, "&");
94
+ return source.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#(\d+);/g, (_, code) => code === "38" ? _ : String.fromCharCode(+code)).replace(/&#x([0-9a-f]+);/gi, (_, code) => code === "26" ? _ : String.fromCharCode(parseInt(code, 16))).replace(/&(amp|#38|#x26);/g, "&");
92
95
  }
93
96
  Element2.unescape = unescape;
94
97
  __name(unescape, "unescape");
@@ -160,9 +163,9 @@ __name(Element, "Element");
160
163
  }
161
164
  Element2.select = select;
162
165
  __name(select, "select");
163
- const tagRegExp = /<(\/?)\s*([^\s>/]+)([^>]*?)\s*(\/?)>/;
166
+ const tagRegExp = /<(\/?)\s*([^\s>/]*)([^>]*?)\s*(\/?)>/;
164
167
  const attrRegExp = /([^\s=]+)(?:="([^"]*)"|=([^"\s]+))?/g;
165
- function parse(source, fragment = false) {
168
+ function parse(source) {
166
169
  const tokens = [];
167
170
  let tagCap;
168
171
  while (tagCap = tagRegExp.exec(source)) {
@@ -170,7 +173,7 @@ __name(Element, "Element");
170
173
  tokens.push(unescape(source.slice(0, tagCap.index)));
171
174
  }
172
175
  const [_, close, tag, attrs, empty] = tagCap;
173
- const token = { source: _, tag, close, empty, attrs: {} };
176
+ const token = { source: _, tag: tag || Element2.Fragment, close, empty, attrs: {} };
174
177
  let attrCap;
175
178
  while (attrCap = attrRegExp.exec(attrs)) {
176
179
  const [_2, key, v1 = "", v2 = v1] = attrCap;
@@ -181,7 +184,7 @@ __name(Element, "Element");
181
184
  }
182
185
  if (source)
183
186
  tokens.push(unescape(source));
184
- const stack = [Element2(null)];
187
+ const stack = [Element2(Element2.Fragment)];
185
188
  function rollback(index) {
186
189
  for (; index > 0; index--) {
187
190
  const { children } = stack.shift();
@@ -193,7 +196,8 @@ __name(Element, "Element");
193
196
  __name(rollback, "rollback");
194
197
  for (const token of tokens) {
195
198
  if (typeof token === "string") {
196
- stack[0].children.push(Element2("text", { content: token }));
199
+ const content = token.replace(/^\s*\n\s*/, "").replace(/\s*\n\s*$/, "");
200
+ stack[0].children.push(Element2("text", { content }));
197
201
  } else if (token.close) {
198
202
  let index = 0;
199
203
  while (index < stack.length && stack[index].type !== token.tag)
@@ -215,21 +219,21 @@ __name(Element, "Element");
215
219
  }
216
220
  }
217
221
  rollback(stack.length - 1);
218
- return fragment ? stack[0] : stack[0].children;
222
+ return stack[0].children;
219
223
  }
220
224
  Element2.parse = parse;
221
225
  __name(parse, "parse");
222
- function transform(source, rules) {
226
+ function transform(source, rules, session) {
223
227
  const elements = typeof source === "string" ? parse(source) : source;
224
228
  const output = [];
225
- elements.forEach((element, index, elements2) => {
229
+ elements.forEach((element) => {
226
230
  var _a, _b;
227
- let result = (_b = (_a = rules[element.type]) != null ? _a : rules.default) != null ? _b : true;
231
+ const { type, attrs, children } = element;
232
+ let result = (_b = (_a = rules[type]) != null ? _a : rules.default) != null ? _b : true;
228
233
  if (typeof result === "function") {
229
- result = result(element.attrs, index, elements2);
234
+ result = result(attrs, children, session);
230
235
  }
231
236
  if (result === true) {
232
- const { type, attrs, children } = element;
233
237
  output.push(Element2(type, attrs, transform(children, rules)));
234
238
  } else if (result !== false) {
235
239
  output.push(...toElementArray(result));
@@ -239,16 +243,16 @@ __name(Element, "Element");
239
243
  }
240
244
  Element2.transform = transform;
241
245
  __name(transform, "transform");
242
- async function transformAsync(source, rules) {
246
+ async function transformAsync(source, rules, session) {
243
247
  const elements = typeof source === "string" ? parse(source) : source;
244
- const children = (await Promise.all(elements.map(async (element, index, elements2) => {
248
+ const children = (await Promise.all(elements.map(async (element) => {
245
249
  var _a, _b;
246
- let result = (_b = (_a = rules[element.type]) != null ? _a : rules.default) != null ? _b : true;
250
+ const { type, attrs, children: children2 } = element;
251
+ let result = (_b = (_a = rules[type]) != null ? _a : rules.default) != null ? _b : true;
247
252
  if (typeof result === "function") {
248
- result = await result(element.attrs, index, elements2);
253
+ result = await result(attrs, children2, session);
249
254
  }
250
255
  if (result === true) {
251
- const { type, attrs, children: children2 } = element;
252
256
  return [Element2(type, attrs, await transformAsync(children2, rules))];
253
257
  } else if (result !== false) {
254
258
  return toElementArray(result);
package/lib/index.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, is, isNullable } from 'cosmokit'\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 if (this.type === 'text') return Element.escape(this.attrs.content)\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (!this.type || strip) return inner\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 (is('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (is('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": ";;;;AAAA,sBAAiG;AAEjG,IAAM,WAAW,OAAO,SAAS;AAEjC,SAAS,UAAU,QAAgC;AACjD,SAAO,UAAU,OAAO,WAAW,YAAY,OAAO;AACxD;AAFS;AAIT,SAAS,UAAU,SAA2B;AAC5C,MAAI,OAAO,YAAY;AAAU,WAAO;AACxC,SAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC;AACpC;AAHS;AAKT,SAAS,eAAe,OAAwB;AAC9C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,SAAS;AAAA,EAC5B,WAAW,OAAO,UAAU,UAAU;AACpC,WAAO,CAAC,UAAU,KAAK,CAAC;AAAA,EAC1B,WAAW,CAAC,MAAM,MAAM;AACtB,WAAO,MAAM;AAAA,EACf,OAAO;AACL,WAAO,CAAC,KAAK;AAAA,EACf;AACF;AAVS;AAyBT,IAAM,qBAAN,MAAyB;AAAA,EACvB,IAAI,OAAO;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,QAAQ,OAAO;AACtB,QAAI,KAAK,SAAS;AAAQ,aAAO,QAAQ,OAAO,KAAK,MAAM,OAAO;AAClE,UAAM,QAAQ,KAAK,SAAS,IAAI,WAAS,MAAM,SAAS,KAAK,CAAC,EAAE,KAAK,EAAE;AACvE,QAAI,CAAC,KAAK,QAAQ;AAAO,aAAO;AAChC,UAAM,QAAQ,OAAO,QAAQ,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7D,cAAI,4BAAW,KAAK;AAAG,eAAO;AAC9B,gBAAM,2BAAU,GAAG;AACnB,UAAI,UAAU;AAAI,eAAO,IAAI;AAC7B,aAAO,IAAI,QAAQ,QAAQ,OAAO,OAAO,IAAI;AAAA,IAC/C,CAAC,EAAE,KAAK,EAAE;AACV,QAAI,CAAC,KAAK,SAAS;AAAQ,aAAO,IAAI,KAAK,OAAO;AAClD,WAAO,IAAI,KAAK,OAAO,SAAS,UAAU,KAAK;AAAA,EACjD;AACF;AAlBM;AAAA,IAoBN,gCAAe,oBAAoB,QAAQ,SAAS;AAAA,IACpD,gCAAe,mBAAmB,WAAW,UAAU,IAAI;AAI3D,SAAS,QAAQ,SAAiB,MAAa;AAC7C,QAAM,KAAK,OAAO,OAAO,mBAAmB,SAAS;AACrD,MAAI,QAAsB,CAAC,GAAG,WAAsB,CAAC;AACrD,MAAI,KAAK,MAAM,OAAO,KAAK,OAAO,YAAY,CAAC,UAAU,KAAK,EAAE,KAAK,CAAC,MAAM,QAAQ,KAAK,EAAE,GAAG;AAC5F,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,CAAC,GAAG;AACvD,cAAI,4BAAW,KAAK;AAAG;AACvB,UAAI,UAAU,MAAM;AAClB,cAAM,OAAO;AAAA,MACf,WAAW,UAAU,OAAO;AAC1B,cAAM,WAAO,4BAAW,GAAG,KAAK;AAAA,MAClC,OAAO;AACL,cAAM,OAAO,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK;AAAI,eAAW,eAAe,KAAK,EAAE;AAC9C,SAAO,OAAO,OAAO,IAAI,EAAE,MAAM,OAAO,SAAS,CAAC;AACpD;AAjBS;AAAA,CAmBT,CAAUA,aAAV;AAKS,WAAS,UAAU,QAA0B;AAClD,QAAI,OAAO,WAAW;AAAU,aAAOA,SAAQ,MAAM,MAAM;AAC3D,WAAOA,SAAQ,MAAM,QAAQ,IAAI;AAAA,EACnC;AAHO,EAAAA,SAAS;AAAA;AAKT,WAAS,OAAO,QAAgB,SAAS,OAAO;AACrD,UAAM,SAAS,OACZ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACvB,WAAO,SACH,OAAO,QAAQ,MAAM,QAAQ,IAC7B;AAAA,EACN;AARO,EAAAA,SAAS;AAAA;AAUT,WAAS,SAAS,QAAgB;AACvC,WAAO,OACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG;AAAA,EAC1B;AANO,EAAAA,SAAS;AAAA;AAcT,WAAS,KAAK,QAAgB,UAAuB,CAAC,GAAY;AApH3E;AAqHI,UAAM,WAAW,MAAM,MAAM;AAC7B,QAAI,QAAQ,OAAO;AACjB,UAAI,QAAQ,UAAQ,cAAS,OAAT,mBAAa,UAAS,QAAQ;AAAM;AACxD,aAAO,SAAS;AAAA,IAClB;AACA,WAAO,OAAO,UAAU,QAAQ,QAAQ,GAAG,EAAE;AAAA,EAC/C;AAPO,EAAAA,SAAS;AAAA;AAgBhB,QAAM,aAAa;AAEZ,WAAS,cAAc,OAA6B;AACzD,WAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU;AACrC,YAAM,YAAwB,CAAC;AAC/B,cAAQ,MAAM,KAAK;AACnB,UAAI,SAA0B,aAAyB;AACvD,aAAQ,UAAU,WAAW,KAAK,KAAK,GAAI;AACzC,kBAAU,KAAK,EAAE,MAAM,MAAM,MAAM,GAAG,QAAQ,KAAK,GAAG,WAAW,CAAC;AAClE,qBAAa,QAAQ;AACrB,gBAAQ,MAAM,MAAM,QAAQ,QAAQ,QAAQ,GAAG,MAAM;AAAA,MACvD;AACA,gBAAU,KAAK,EAAE,MAAM,OAAO,WAAW,CAAC;AAC1C,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAbO,EAAAA,SAAS;AAAA;AAeT,WAAS,OAAO,QAA4B,OAAyC;AAC1F,QAAI,OAAO,WAAW;AAAU,eAAS,MAAM,MAAM;AACrD,QAAI,OAAO,UAAU;AAAU,cAAQ,cAAc,KAAK;AAC1D,QAAI,CAAC,MAAM;AAAQ;AACnB,QAAI,WAAyB,CAAC;AAC9B,UAAM,UAAqB,CAAC;AAC5B,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,GAAG;AAC/C,YAAM,QAAsB,CAAC;AAC7B,YAAM,QAAQ,CAAC,GAAG,OAAO,GAAG,QAAQ;AACpC,iBAAW,CAAC;AACZ,UAAI,UAAU;AACd,iBAAW,SAAS,OAAO;AACzB,cAAM,EAAE,MAAM,WAAW,IAAI,MAAM;AACnC,YAAI,SAAS,QAAQ,QAAQ,SAAS,KAAK;AACzC,cAAI,MAAM,WAAW,GAAG;AACtB,sBAAU;AAAA,UACZ,WAAW,CAAC,KAAK,GAAG,EAAE,SAAS,MAAM,GAAG,UAAU,GAAG;AACnD,kBAAM,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,UAC3B,WAAW,MAAM,GAAG,eAAe,KAAK;AACtC,qBAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,UAC9B,OAAO;AACL,kBAAM,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,UAC3B;AAAA,QACF;AACA,YAAI,eAAe,KAAK;AACtB,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AACA,UAAI;AAAS,gBAAQ,KAAK,OAAO,MAAM;AACvC,cAAQ,KAAK,GAAG,OAAO,QAAQ,UAAU,KAAK,CAAC;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAhCO,EAAAA,SAAS;AAAA;AAkChB,QAAM,YAAY;AAClB,QAAM,aAAa;AAYZ,WAAS,MAAM,QAAgB,WAAW,OAAO;AACtD,UAAM,SAA6B,CAAC;AACpC,QAAI;AACJ,WAAQ,SAAS,UAAU,KAAK,MAAM,GAAI;AACxC,UAAI,OAAO,OAAO;AAChB,eAAO,KAAK,SAAS,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC,CAAC;AAAA,MACrD;AACA,YAAM,CAAC,GAAG,OAAO,KAAK,OAAO,KAAK,IAAI;AACtC,YAAM,QAAe,EAAE,QAAQ,GAAG,KAAK,OAAO,OAAO,OAAO,CAAC,EAAE;AAC/D,UAAI;AACJ,aAAQ,UAAU,WAAW,KAAK,KAAK,GAAI;AACzC,cAAM,CAACC,IAAG,KAAK,KAAK,IAAI,KAAK,EAAE,IAAI;AACnC,cAAM,UAAM,0BAAS,GAAG,KAAK,SAAS,EAAE;AAAA,MAC1C;AACA,aAAO,KAAK,KAAK;AACjB,eAAS,OAAO,MAAM,OAAO,QAAQ,OAAO,GAAG,MAAM;AAAA,IACvD;AACA,QAAI;AAAQ,aAAO,KAAK,SAAS,MAAM,CAAC;AACxC,UAAM,QAAQ,CAACD,SAAQ,IAAI,CAAC;AAC5B,aAAS,SAAS,OAAe;AAC/B,aAAO,QAAQ,GAAG,SAAS;AACzB,cAAM,EAAE,SAAS,IAAI,MAAM,MAAM;AACjC,cAAM,EAAE,QAAAE,QAAO,IAAI,MAAM,GAAG,SAAS,IAAI;AACzC,cAAM,GAAG,SAAS,KAAKF,SAAQ,QAAQ,EAAE,SAASE,QAAO,CAAC,CAAC;AAC3D,cAAM,GAAG,SAAS,KAAK,GAAG,QAAQ;AAAA,MACpC;AAAA,IACF;AAPS;AAQT,eAAW,SAAS,QAAQ;AAC1B,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,GAAG,SAAS,KAAKF,SAAQ,QAAQ,EAAE,SAAS,MAAM,CAAC,CAAC;AAAA,MAC5D,WAAW,MAAM,OAAO;AACtB,YAAI,QAAQ;AACZ,eAAO,QAAQ,MAAM,UAAU,MAAM,OAAO,SAAS,MAAM;AAAK;AAChE,YAAI,UAAU,MAAM,QAAQ;AAE1B,gBAAM,GAAG,SAAS,KAAKA,SAAQ,QAAQ,EAAE,SAAS,MAAM,OAAO,CAAC,CAAC;AAAA,QACnE,OAAO;AACL,mBAAS,KAAK;AACd,gBAAM,UAAU,MAAM,MAAM;AAC5B,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF,OAAO;AACL,cAAM,UAAUA,SAAQ,MAAM,KAAK,MAAM,KAAK;AAC9C,cAAM,GAAG,SAAS,KAAK,OAAO;AAC9B,YAAI,CAAC,MAAM,OAAO;AAChB,kBAAQ,SAAS,MAAM;AACvB,gBAAM,QAAQ,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,aAAS,MAAM,SAAS,CAAC;AACzB,WAAO,WAAW,MAAM,KAAK,MAAM,GAAG;AAAA,EACxC;AApDO,EAAAA,SAAS;AAAA;AAwDT,WAAS,UAAU,QAA4B,OAA0B;AAC9E,UAAM,WAAW,OAAO,WAAW,WAAW,MAAM,MAAM,IAAI;AAC9D,UAAM,SAAoB,CAAC;AAC3B,aAAS,QAAQ,CAAC,SAAS,OAAOG,cAAa;AA/PnD;AAgQM,UAAI,UAAS,iBAAM,QAAQ,UAAd,YAAuB,MAAM,YAA7B,YAAwC;AACrD,UAAI,OAAO,WAAW,YAAY;AAChC,iBAAS,OAAO,QAAQ,OAAO,OAAOA,SAAQ;AAAA,MAChD;AACA,UAAI,WAAW,MAAM;AACnB,cAAM,EAAE,MAAM,OAAO,SAAS,IAAI;AAClC,eAAO,KAAKH,SAAQ,MAAM,OAAO,UAAU,UAAU,KAAK,CAAC,CAAC;AAAA,MAC9D,WAAW,WAAW,OAAO;AAC3B,eAAO,KAAK,GAAG,eAAe,MAAM,CAAC;AAAA,MACvC;AAAA,IACF,CAAC;AACD,WAAO,OAAO,WAAW,WAAW,OAAO,KAAK,EAAE,IAAI;AAAA,EACxD;AAhBO,EAAAA,SAAS;AAAA;AAoBhB,iBAAsB,eAAe,QAA4B,OAA+B;AAC9F,UAAM,WAAW,OAAO,WAAW,WAAW,MAAM,MAAM,IAAI;AAC9D,UAAM,YAAY,MAAM,QAAQ,IAAI,SAAS,IAAI,OAAO,SAAS,OAAOG,cAAa;AAlRzF;AAmRM,UAAI,UAAS,iBAAM,QAAQ,UAAd,YAAuB,MAAM,YAA7B,YAAwC;AACrD,UAAI,OAAO,WAAW,YAAY;AAChC,iBAAS,MAAM,OAAO,QAAQ,OAAO,OAAOA,SAAQ;AAAA,MACtD;AACA,UAAI,WAAW,MAAM;AACnB,cAAM,EAAE,MAAM,OAAO,UAAAC,UAAS,IAAI;AAClC,eAAO,CAACJ,SAAQ,MAAM,OAAO,MAAM,eAAeI,WAAU,KAAK,CAAC,CAAC;AAAA,MACrE,WAAW,WAAW,OAAO;AAC3B,eAAO,eAAe,MAAM;AAAA,MAC9B,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC,CAAC,GAAG,KAAK,CAAC;AACX,WAAO,OAAO,WAAW,WAAW,SAAS,KAAK,EAAE,IAAI;AAAA,EAC1D;AAjBA,EAAAJ,SAAsB;AAAA;AAoBf,WAAS,KAAK,UAAqB;AACxC,WAAO,SAAS,KAAK,EAAE;AAAA,EACzB;AAFO,EAAAA,SAAS;AAAA;AAMhB,WAAS,cAAuC,SAAiB,MAA4B;AAC3F,WAAO,IAAI,SAAgB;AACzB,YAAM,UAAUA,SAAQ,IAAI;AAC5B,WAAK,QAAQ,CAAC,KAAK,UAAU;AAC3B,YAAI,KAAC,4BAAW,KAAK,MAAM,GAAG;AAC5B,kBAAQ,MAAM,OAAO,KAAK;AAAA,QAC5B;AAAA,MACF,CAAC;AACD,UAAI,KAAK,KAAK,SAAS;AACrB,eAAO,OAAO,QAAQ,OAAO,KAAK,KAAK,OAAO;AAAA,MAChD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAbS;AAeT,WAAS,mBAAmB,MAA8D;AACxF,WAAO,CAAC,OAAO,QAAQ,CAAC,MAAM;AAC5B,cAAI,oBAAG,UAAU,KAAK,GAAG;AACvB,gBAAQ,cAAc,MAAM,SAAS,QAAQ;AAAA,MAC/C,eAAW,oBAAG,eAAe,KAAK,GAAG;AACnC,gBAAQ,cAAc,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ;AAAA,MAC5D;AACA,aAAOA,SAAQ,MAAM,EAAE,GAAG,OAAO,KAAK,MAAM,CAAC;AAAA,IAC/C;AAAA,EACF;AATS;AAWF,EAAMA,SAAA,KAAK,cAAyB,MAAM,IAAI;AAC9C,EAAMA,SAAA,QAAQ,cAAyB,SAAS,IAAI;AACpD,EAAMA,SAAA,QAAQ,cAAyB,SAAS,IAAI;AACpD,EAAMA,SAAA,QAAQ,mBAAmB,OAAO;AACxC,EAAMA,SAAA,QAAQ,mBAAmB,OAAO;AACxC,EAAMA,SAAA,QAAQ,mBAAmB,OAAO;AACxC,EAAMA,SAAA,OAAO,mBAAmB,MAAM;AAAA,GAxPrC;AA2PV,iBAAS;",
6
- "names": ["Element", "_", "source", "elements", "children"]
4
+ "sourcesContent": ["import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, is, isNullable } from 'cosmokit'\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') {\n if (content) return Element('text', { content })\n } else if (isElement(content)) {\n return content\n } else if (!isNullable(content)) {\n throw new TypeError(`Invalid content: ${content}`)\n }\n}\n\nfunction toElementArray(content: Element.Fragment) {\n if (Array.isArray(content)) {\n return content.map(toElement).filter(x => x)\n } else {\n return [toElement(content)].filter(x => x)\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 if (this.type === 'text') return Element.escape(this.attrs.content)\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (strip) return inner\n const attrs = Object.entries(this.attrs).map(([key, value]) => {\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.Fragment[]): Element\nfunction Element(type: string, attrs: Dict, ...children: Element.Fragment[]): 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 // https://github.com/reactjs/rfcs/pull/107\n if (key === 'children') {\n children = toElementArray(value as Element.Fragment)\n } else if (value === true) {\n attrs[key] = ''\n } else if (value === false) {\n attrs['no' + capitalize(key)] = ''\n } else if (!isNullable(value)) {\n attrs[key] = '' + value\n }\n }\n }\n for (const child of args) {\n children.push(...toElementArray(child))\n }\n return Object.assign(el, { type, attrs, children })\n}\n\nnamespace Element {\n export const Fragment = 'template'\n\n export type Fragment = string | Element | (string | Element)[]\n export type Render<T, S> = (attrs: Dict<any>, children: Element[], session: S) => T\n export type Transformer<S> = boolean | Fragment | Render<boolean | Fragment, S>\n export type AsyncTransformer<S> = boolean | Fragment | Render<Awaitable<boolean | Fragment>, S>\n\n export function normalize(source: Fragment) {\n if (typeof source !== 'string') return toElementArray(source)\n return Element.parse(source)\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(/&#(\\d+);/g, (_, code) => code === '38' ? _ : String.fromCharCode(+code))\n .replace(/&#x([0-9a-f]+);/gi, (_, code) => code === '26' ? _ : String.fromCharCode(parseInt(code, 16)))\n .replace(/&(amp|#38|#x26);/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) {\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: tag || Fragment, 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(Fragment)]\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 const content = token\n .replace(/^\\s*\\n\\s*/, '')\n .replace(/\\s*\\n\\s*$/, '')\n stack[0].children.push(Element('text', { content }))\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 stack[0].children\n }\n\n export function transform<S>(source: string, rules: Dict<Transformer<S>>, session?: S): string\n export function transform<S>(source: Element[], rules: Dict<Transformer<S>>, session?: S): Element[]\n export function transform<S>(source: string | Element[], rules: Dict<Transformer<S>>, session?: S) {\n const elements = typeof source === 'string' ? parse(source) : source\n const output: Element[] = []\n elements.forEach((element) => {\n const { type, attrs, children } = element\n let result = rules[type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = result(attrs, children, session)\n }\n if (result === true) {\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<S>(source: string, rules: Dict<AsyncTransformer<S>>, session?: S): Promise<string>\n export async function transformAsync<S>(source: Element[], rules: Dict<AsyncTransformer<S>>, session?: S): Promise<Element[]>\n export async function transformAsync<S>(source: string | Element[], rules: Dict<AsyncTransformer<S>>, session?: S) {\n const elements = typeof source === 'string' ? parse(source) : source\n const children = (await Promise.all(elements.map(async (element) => {\n const { type, attrs, children } = element\n let result = rules[type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = await result(attrs, children, session)\n }\n if (result === true) {\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 (is('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (is('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", "children"]
7
7
  }
package/lib/index.d.ts CHANGED
@@ -11,13 +11,15 @@ interface Element {
11
11
  source?: string;
12
12
  toString(strip?: boolean): string;
13
13
  }
14
- declare function Element(type: string, children?: Element.Content): Element;
15
- declare function Element(type: string, attrs: Dict<any>, children?: Element.Content): Element;
14
+ declare function Element(type: string, ...children: Element.Fragment[]): Element;
15
+ declare function Element(type: string, attrs: Dict, ...children: Element.Fragment[]): Element;
16
16
  declare namespace Element {
17
- export type Content = string | Element | (string | Element)[];
18
- export type Transformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => boolean | Content);
19
- export type AsyncTransformer = boolean | Content | ((attrs: Dict<string>, index: number, array: Element[]) => Awaitable<boolean | Content>);
20
- export function normalize(source: string | Element): Element;
17
+ export const Fragment = "template";
18
+ export type Fragment = string | Element | (string | Element)[];
19
+ export type Render<T, S> = (attrs: Dict<any>, children: Element[], session: S) => T;
20
+ export type Transformer<S> = boolean | Fragment | Render<boolean | Fragment, S>;
21
+ export type AsyncTransformer<S> = boolean | Fragment | Render<Awaitable<boolean | Fragment>, S>;
22
+ export function normalize(source: Fragment): Element[];
21
23
  export function escape(source: string, inline?: boolean): string;
22
24
  export function unescape(source: string): string;
23
25
  export interface FindOptions {
@@ -34,11 +36,10 @@ declare namespace Element {
34
36
  export function parseSelector(input: string): Selector[][];
35
37
  export function select(source: string | Element[], query: string | Selector[][]): Element[];
36
38
  export function parse(source: string): Element[];
37
- export function parse(source: string, fragment: true): Element;
38
- export function transform(source: string, rules: Dict<Transformer>): string;
39
- export function transform(source: Element[], rules: Dict<Transformer>): Element[];
40
- export function transformAsync(source: string, rules: Dict<AsyncTransformer>): Promise<string>;
41
- export function transformAsync(source: Element[], rules: Dict<AsyncTransformer>): Promise<Element[]>;
39
+ export function transform<S>(source: string, rules: Dict<Transformer<S>>, session?: S): string;
40
+ export function transform<S>(source: Element[], rules: Dict<Transformer<S>>, session?: S): Element[];
41
+ export function transformAsync<S>(source: string, rules: Dict<AsyncTransformer<S>>, session?: S): Promise<string>;
42
+ export function transformAsync<S>(source: Element[], rules: Dict<AsyncTransformer<S>>, session?: S): Promise<Element[]>;
42
43
  /** @deprecated use `elements.join('')` instead */
43
44
  export function join(elements: Element[]): string;
44
45
  export type Factory<R extends any[]> = (...args: [...rest: R, attrs?: Dict<any>]) => Element;
package/lib/index.mjs CHANGED
@@ -15,20 +15,21 @@ var require_src = __commonJS({
15
15
  }
16
16
  __name(isElement, "isElement");
17
17
  function toElement(content) {
18
- if (typeof content !== "string")
18
+ if (typeof content === "string") {
19
+ if (content)
20
+ return Element("text", { content });
21
+ } else if (isElement(content)) {
19
22
  return content;
20
- return Element("text", { content });
23
+ } else if (!isNullable(content)) {
24
+ throw new TypeError(`Invalid content: ${content}`);
25
+ }
21
26
  }
22
27
  __name(toElement, "toElement");
23
- function toElementArray(input) {
24
- if (Array.isArray(input)) {
25
- return input.map(toElement);
26
- } else if (typeof input === "string") {
27
- return [toElement(input)];
28
- } else if (!input.type) {
29
- return input.children;
28
+ function toElementArray(content) {
29
+ if (Array.isArray(content)) {
30
+ return content.map(toElement).filter((x) => x);
30
31
  } else {
31
- return [input];
32
+ return [toElement(content)].filter((x) => x);
32
33
  }
33
34
  }
34
35
  __name(toElementArray, "toElementArray");
@@ -40,11 +41,9 @@ var require_src = __commonJS({
40
41
  if (this.type === "text")
41
42
  return Element.escape(this.attrs.content);
42
43
  const inner = this.children.map((child) => child.toString(strip)).join("");
43
- if (!this.type || strip)
44
+ if (strip)
44
45
  return inner;
45
46
  const attrs = Object.entries(this.attrs).map(([key, value]) => {
46
- if (isNullable(value))
47
- return "";
48
47
  key = hyphenate(key);
49
48
  if (value === "")
50
49
  return ` ${key}`;
@@ -65,25 +64,29 @@ var require_src = __commonJS({
65
64
  for (const [key, value] of Object.entries(args.shift())) {
66
65
  if (isNullable(value))
67
66
  continue;
68
- if (value === true) {
67
+ if (key === "children") {
68
+ children = toElementArray(value);
69
+ } else if (value === true) {
69
70
  attrs[key] = "";
70
71
  } else if (value === false) {
71
72
  attrs["no" + capitalize(key)] = "";
72
- } else {
73
+ } else if (!isNullable(value)) {
73
74
  attrs[key] = "" + value;
74
75
  }
75
76
  }
76
77
  }
77
- if (args[0])
78
- children = toElementArray(args[0]);
78
+ for (const child of args) {
79
+ children.push(...toElementArray(child));
80
+ }
79
81
  return Object.assign(el, { type, attrs, children });
80
82
  }
81
83
  __name(Element, "Element");
82
84
  ((Element2) => {
85
+ Element2.Fragment = "template";
83
86
  function normalize(source) {
84
87
  if (typeof source !== "string")
85
- return Element2(null, source);
86
- return Element2.parse(source, true);
88
+ return toElementArray(source);
89
+ return Element2.parse(source);
87
90
  }
88
91
  Element2.normalize = normalize;
89
92
  __name(normalize, "normalize");
@@ -94,7 +97,7 @@ var require_src = __commonJS({
94
97
  Element2.escape = escape;
95
98
  __name(escape, "escape");
96
99
  function unescape(source) {
97
- return source.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&amp;/g, "&");
100
+ return source.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#(\d+);/g, (_, code) => code === "38" ? _ : String.fromCharCode(+code)).replace(/&#x([0-9a-f]+);/gi, (_, code) => code === "26" ? _ : String.fromCharCode(parseInt(code, 16))).replace(/&(amp|#38|#x26);/g, "&");
98
101
  }
99
102
  Element2.unescape = unescape;
100
103
  __name(unescape, "unescape");
@@ -165,9 +168,9 @@ var require_src = __commonJS({
165
168
  }
166
169
  Element2.select = select;
167
170
  __name(select, "select");
168
- const tagRegExp = /<(\/?)\s*([^\s>/]+)([^>]*?)\s*(\/?)>/;
171
+ const tagRegExp = /<(\/?)\s*([^\s>/]*)([^>]*?)\s*(\/?)>/;
169
172
  const attrRegExp = /([^\s=]+)(?:="([^"]*)"|=([^"\s]+))?/g;
170
- function parse(source, fragment = false) {
173
+ function parse(source) {
171
174
  const tokens = [];
172
175
  let tagCap;
173
176
  while (tagCap = tagRegExp.exec(source)) {
@@ -175,7 +178,7 @@ var require_src = __commonJS({
175
178
  tokens.push(unescape(source.slice(0, tagCap.index)));
176
179
  }
177
180
  const [_, close, tag, attrs, empty] = tagCap;
178
- const token = { source: _, tag, close, empty, attrs: {} };
181
+ const token = { source: _, tag: tag || Element2.Fragment, close, empty, attrs: {} };
179
182
  let attrCap;
180
183
  while (attrCap = attrRegExp.exec(attrs)) {
181
184
  const [_2, key, v1 = "", v2 = v1] = attrCap;
@@ -186,7 +189,7 @@ var require_src = __commonJS({
186
189
  }
187
190
  if (source)
188
191
  tokens.push(unescape(source));
189
- const stack = [Element2(null)];
192
+ const stack = [Element2(Element2.Fragment)];
190
193
  function rollback(index) {
191
194
  for (; index > 0; index--) {
192
195
  const { children } = stack.shift();
@@ -198,7 +201,8 @@ var require_src = __commonJS({
198
201
  __name(rollback, "rollback");
199
202
  for (const token of tokens) {
200
203
  if (typeof token === "string") {
201
- stack[0].children.push(Element2("text", { content: token }));
204
+ const content = token.replace(/^\s*\n\s*/, "").replace(/\s*\n\s*$/, "");
205
+ stack[0].children.push(Element2("text", { content }));
202
206
  } else if (token.close) {
203
207
  let index = 0;
204
208
  while (index < stack.length && stack[index].type !== token.tag)
@@ -220,20 +224,20 @@ var require_src = __commonJS({
220
224
  }
221
225
  }
222
226
  rollback(stack.length - 1);
223
- return fragment ? stack[0] : stack[0].children;
227
+ return stack[0].children;
224
228
  }
225
229
  Element2.parse = parse;
226
230
  __name(parse, "parse");
227
- function transform(source, rules) {
231
+ function transform(source, rules, session) {
228
232
  const elements = typeof source === "string" ? parse(source) : source;
229
233
  const output = [];
230
- elements.forEach((element, index, elements2) => {
231
- let result = rules[element.type] ?? rules.default ?? true;
234
+ elements.forEach((element) => {
235
+ const { type, attrs, children } = element;
236
+ let result = rules[type] ?? rules.default ?? true;
232
237
  if (typeof result === "function") {
233
- result = result(element.attrs, index, elements2);
238
+ result = result(attrs, children, session);
234
239
  }
235
240
  if (result === true) {
236
- const { type, attrs, children } = element;
237
241
  output.push(Element2(type, attrs, transform(children, rules)));
238
242
  } else if (result !== false) {
239
243
  output.push(...toElementArray(result));
@@ -243,15 +247,15 @@ var require_src = __commonJS({
243
247
  }
244
248
  Element2.transform = transform;
245
249
  __name(transform, "transform");
246
- async function transformAsync(source, rules) {
250
+ async function transformAsync(source, rules, session) {
247
251
  const elements = typeof source === "string" ? parse(source) : source;
248
- const children = (await Promise.all(elements.map(async (element, index, elements2) => {
249
- let result = rules[element.type] ?? rules.default ?? true;
252
+ const children = (await Promise.all(elements.map(async (element) => {
253
+ const { type, attrs, children: children2 } = element;
254
+ let result = rules[type] ?? rules.default ?? true;
250
255
  if (typeof result === "function") {
251
- result = await result(element.attrs, index, elements2);
256
+ result = await result(attrs, children2, session);
252
257
  }
253
258
  if (result === true) {
254
- const { type, attrs, children: children2 } = element;
255
259
  return [Element2(type, attrs, await transformAsync(children2, rules))];
256
260
  } else if (result !== false) {
257
261
  return toElementArray(result);
package/lib/index.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, is, isNullable } from 'cosmokit'\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 if (this.type === 'text') return Element.escape(this.attrs.content)\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (!this.type || strip) return inner\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 (is('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (is('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"]
4
+ "sourcesContent": ["import { Awaitable, camelize, capitalize, defineProperty, Dict, hyphenate, is, isNullable } from 'cosmokit'\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') {\n if (content) return Element('text', { content })\n } else if (isElement(content)) {\n return content\n } else if (!isNullable(content)) {\n throw new TypeError(`Invalid content: ${content}`)\n }\n}\n\nfunction toElementArray(content: Element.Fragment) {\n if (Array.isArray(content)) {\n return content.map(toElement).filter(x => x)\n } else {\n return [toElement(content)].filter(x => x)\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 if (this.type === 'text') return Element.escape(this.attrs.content)\n const inner = this.children.map(child => child.toString(strip)).join('')\n if (strip) return inner\n const attrs = Object.entries(this.attrs).map(([key, value]) => {\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.Fragment[]): Element\nfunction Element(type: string, attrs: Dict, ...children: Element.Fragment[]): 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 // https://github.com/reactjs/rfcs/pull/107\n if (key === 'children') {\n children = toElementArray(value as Element.Fragment)\n } else if (value === true) {\n attrs[key] = ''\n } else if (value === false) {\n attrs['no' + capitalize(key)] = ''\n } else if (!isNullable(value)) {\n attrs[key] = '' + value\n }\n }\n }\n for (const child of args) {\n children.push(...toElementArray(child))\n }\n return Object.assign(el, { type, attrs, children })\n}\n\nnamespace Element {\n export const Fragment = 'template'\n\n export type Fragment = string | Element | (string | Element)[]\n export type Render<T, S> = (attrs: Dict<any>, children: Element[], session: S) => T\n export type Transformer<S> = boolean | Fragment | Render<boolean | Fragment, S>\n export type AsyncTransformer<S> = boolean | Fragment | Render<Awaitable<boolean | Fragment>, S>\n\n export function normalize(source: Fragment) {\n if (typeof source !== 'string') return toElementArray(source)\n return Element.parse(source)\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(/&#(\\d+);/g, (_, code) => code === '38' ? _ : String.fromCharCode(+code))\n .replace(/&#x([0-9a-f]+);/gi, (_, code) => code === '26' ? _ : String.fromCharCode(parseInt(code, 16)))\n .replace(/&(amp|#38|#x26);/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) {\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: tag || Fragment, 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(Fragment)]\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 const content = token\n .replace(/^\\s*\\n\\s*/, '')\n .replace(/\\s*\\n\\s*$/, '')\n stack[0].children.push(Element('text', { content }))\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 stack[0].children\n }\n\n export function transform<S>(source: string, rules: Dict<Transformer<S>>, session?: S): string\n export function transform<S>(source: Element[], rules: Dict<Transformer<S>>, session?: S): Element[]\n export function transform<S>(source: string | Element[], rules: Dict<Transformer<S>>, session?: S) {\n const elements = typeof source === 'string' ? parse(source) : source\n const output: Element[] = []\n elements.forEach((element) => {\n const { type, attrs, children } = element\n let result = rules[type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = result(attrs, children, session)\n }\n if (result === true) {\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<S>(source: string, rules: Dict<AsyncTransformer<S>>, session?: S): Promise<string>\n export async function transformAsync<S>(source: Element[], rules: Dict<AsyncTransformer<S>>, session?: S): Promise<Element[]>\n export async function transformAsync<S>(source: string | Element[], rules: Dict<AsyncTransformer<S>>, session?: S) {\n const elements = typeof source === 'string' ? parse(source) : source\n const children = (await Promise.all(elements.map(async (element) => {\n const { type, attrs, children } = element\n let result = rules[type] ?? rules.default ?? true\n if (typeof result === 'function') {\n result = await result(attrs, children, session)\n }\n if (result === true) {\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 (is('Buffer', value)) {\n value = 'base64://' + value.toString('base64')\n } else if (is('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", "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.1.3",
4
+ "version": "2.1.0",
5
5
  "main": "lib/index.cjs",
6
6
  "module": "lib/index.mjs",
7
7
  "typings": "lib/index.d.ts",