bobe-dom 0.0.68 → 0.0.70

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.
@@ -0,0 +1,442 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var parser = require('@babel/parser');
6
+ var node_fs = require('node:fs');
7
+ var path = require('node:path');
8
+ var node_module = require('node:module');
9
+
10
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
11
+ function _arrayLikeToArray(r, a) {
12
+ (null == a || a > r.length) && (a = r.length);
13
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
14
+ return n;
15
+ }
16
+ function _arrayWithHoles(r) {
17
+ if (Array.isArray(r)) return r;
18
+ }
19
+ function _iterableToArrayLimit(r, l) {
20
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
21
+ if (null != t) {
22
+ var e,
23
+ n,
24
+ i,
25
+ u,
26
+ a = [],
27
+ f = true,
28
+ o = false;
29
+ try {
30
+ if (i = (t = t.call(r)).next, 0 === l) {
31
+ if (Object(t) !== t) return;
32
+ f = !1;
33
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
34
+ } catch (r) {
35
+ o = true, n = r;
36
+ } finally {
37
+ try {
38
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
39
+ } finally {
40
+ if (o) throw n;
41
+ }
42
+ }
43
+ return a;
44
+ }
45
+ }
46
+ function _nonIterableRest() {
47
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
48
+ }
49
+ function _slicedToArray(r, e) {
50
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
51
+ }
52
+ function _unsupportedIterableToArray(r, a) {
53
+ if (r) {
54
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
55
+ var t = {}.toString.call(r).slice(8, -1);
56
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
57
+ }
58
+ }
59
+
60
+ const VIRTUAL_ID = 'virtual:bobe-iconify-icons';
61
+ const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}`;
62
+ const DEFAULT_API_BASE = 'https://api.iconify.design';
63
+ const DEFAULT_CACHE_DIR = 'bobe-iconify';
64
+ const DEFAULT_EXTENSIONS_RE = /\.(?:[cm]?[jt]sx?|mdx?)$/;
65
+ const ICON_NAME_RE = /^([a-z0-9]+(?:-[a-z0-9]+)*):([a-z0-9]+[-_:.a-z0-9]*)$/i;
66
+ const ICON_ATTR_RE = /\bicon\s*=\s*(['"])([^'"]+)\1/g;
67
+ const DYNAMIC_ICON_RE = /\bicon\s*=\s*(?:\{|(['"])[^'"]*$)/;
68
+ const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('iconify.cjs', document.baseURI).href)));
69
+ function bobeIconifyPlugin(options = {}) {
70
+ const icons = new Set();
71
+ const warnedDynamicIds = new Set();
72
+ const warnedInvalid = new Set();
73
+ const filter = createFilter(options.include, options.exclude);
74
+ let config;
75
+ let server;
76
+ let projectScanned = false;
77
+ let runtimeImports;
78
+ const addIcons = items => {
79
+ let changed = false;
80
+ for (const icon of items) {
81
+ if (icons.has(icon)) continue;
82
+ icons.add(icon);
83
+ changed = true;
84
+ }
85
+ if (changed && server) {
86
+ const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
87
+ if (mod) server.moduleGraph.invalidateModule(mod);
88
+ }
89
+ };
90
+ const scanCode = (code, id, warn) => {
91
+ const result = extractBobeIconifyIcons(code);
92
+ addIcons(result.icons);
93
+ if (options.warnDynamic !== false && result.dynamic > 0 && !warnedDynamicIds.has(id)) {
94
+ warnedDynamicIds.add(id);
95
+ warn(`[bobe-iconify] ${id} 中存在动态 iconify-icon icon 属性,插件会跳过静态注册并保留 Iconify runtime fallback。如需本地注册,请通过 icons 配置补充。`);
96
+ }
97
+ for (const icon of result.invalid) {
98
+ const key = `${id}:${icon}`;
99
+ if (warnedInvalid.has(key)) continue;
100
+ warnedInvalid.add(key);
101
+ warn(`[bobe-iconify] 忽略非法 icon 名称 "${icon}",仅支持 "prefix:name"。来源:${id}`);
102
+ }
103
+ };
104
+ return {
105
+ name: 'bobe-iconify',
106
+ configResolved(resolved) {
107
+ config = resolved;
108
+ runtimeImports = resolveRuntimeImports();
109
+ addIcons(normalizeIconList(options.icons || []));
110
+ },
111
+ configureServer(devServer) {
112
+ server = devServer;
113
+ },
114
+ async buildStart() {
115
+ addIcons(normalizeIconList(options.icons || []));
116
+ },
117
+ async transform(code, id) {
118
+ if (!filter(id)) return;
119
+ scanCode(code, id, message => this.warn(message));
120
+ },
121
+ transformIndexHtml: {
122
+ order: 'pre',
123
+ handler() {
124
+ if (config?.build?.ssr) return;
125
+ return [{
126
+ tag: 'script',
127
+ attrs: {
128
+ type: 'module',
129
+ src: `/${VIRTUAL_ID}`
130
+ },
131
+ injectTo: 'head'
132
+ }];
133
+ }
134
+ },
135
+ resolveId(id) {
136
+ if (id === VIRTUAL_ID || id === `/${VIRTUAL_ID}`) return RESOLVED_VIRTUAL_ID;
137
+ },
138
+ async load(id) {
139
+ if (id !== RESOLVED_VIRTUAL_ID) return;
140
+ await scanProjectOnce();
141
+ const cacheDir = getCacheDir(config, options);
142
+ const collections = await loadIconifyCollections(icons, {
143
+ apiBase: options.apiBase || DEFAULT_API_BASE,
144
+ cacheDir,
145
+ strict: options.strict,
146
+ warn: message => this.warn(message)
147
+ });
148
+ return createIconifyVirtualModule(groupIconsByPrefix(icons), collections, runtimeImports);
149
+ }
150
+ };
151
+ async function scanProjectOnce() {
152
+ if (projectScanned || !config) return;
153
+ projectScanned = true;
154
+ const files = await collectSourceFiles(config.root);
155
+ await Promise.all(files.map(async file => {
156
+ const id = path.normalize(file);
157
+ if (!filter(id) || id.endsWith('.md') || id.endsWith('.mdx')) return;
158
+ try {
159
+ const code = await node_fs.promises.readFile(file, 'utf8');
160
+ scanCode(code, id, message => config.logger.warn(message));
161
+ } catch {}
162
+ }));
163
+ }
164
+ }
165
+ function extractBobeIconifyIcons(code) {
166
+ const icons = new Set();
167
+ const invalid = new Set();
168
+ let dynamic = 0;
169
+ let ast;
170
+ try {
171
+ ast = parser.parse(code, {
172
+ sourceType: 'module',
173
+ errorRecovery: true,
174
+ plugins: ['typescript', 'jsx']
175
+ });
176
+ } catch {
177
+ return {
178
+ icons: [],
179
+ dynamic: 0,
180
+ invalid: []
181
+ };
182
+ }
183
+ walkAst(ast, node => {
184
+ if (node.type !== 'TaggedTemplateExpression' || !isBobeTag(node.tag)) return;
185
+ for (const quasi of node.quasi?.quasis || []) {
186
+ const raw = quasi.value?.raw ?? quasi.value?.cooked ?? '';
187
+ const result = extractIconifyIconsFromTemplate(raw);
188
+ for (const icon of result.icons) icons.add(icon);
189
+ for (const icon of result.invalid) invalid.add(icon);
190
+ dynamic += result.dynamic;
191
+ }
192
+ });
193
+ return {
194
+ icons: Array.from(icons).sort(),
195
+ dynamic,
196
+ invalid: Array.from(invalid).sort()
197
+ };
198
+ }
199
+ function extractIconifyIconsFromTemplate(template) {
200
+ const icons = new Set();
201
+ const invalid = new Set();
202
+ let dynamic = 0;
203
+ let inIconifyElement = false;
204
+ for (const line of template.split(/\r?\n/)) {
205
+ const trimmed = line.trim();
206
+ if (!trimmed || trimmed.startsWith('//')) continue;
207
+ const isContinuation = trimmed.startsWith('|');
208
+ const isIconifyElement = /^<?iconify-icon\b/.test(trimmed);
209
+ if (!isContinuation) inIconifyElement = isIconifyElement;
210
+ if (!isIconifyElement && !(inIconifyElement && isContinuation)) continue;
211
+ for (const icon of extractStaticIconAttributes(trimmed)) {
212
+ if (isValidIconName(icon)) {
213
+ icons.add(icon);
214
+ } else {
215
+ invalid.add(icon);
216
+ }
217
+ }
218
+ if (DYNAMIC_ICON_RE.test(trimmed)) dynamic++;
219
+ }
220
+ return {
221
+ icons: Array.from(icons).sort(),
222
+ dynamic,
223
+ invalid: Array.from(invalid).sort()
224
+ };
225
+ }
226
+ async function loadIconifyCollections(iconNames, options) {
227
+ const grouped = groupIconsByPrefix(iconNames);
228
+ const collections = {};
229
+ await node_fs.promises.mkdir(options.cacheDir, {
230
+ recursive: true
231
+ });
232
+ for (const _ref of grouped) {
233
+ var _ref2 = _slicedToArray(_ref, 2);
234
+ const prefix = _ref2[0];
235
+ const names = _ref2[1];
236
+ const cacheFile = path.join(options.cacheDir, `${prefix}.json`);
237
+ const cached = await readCachedCollection(cacheFile, prefix);
238
+ const missing = Array.from(names).filter(name => !hasIcon(cached, name));
239
+ let collection = cached;
240
+ if (missing.length) {
241
+ const remote = await fetchIconifyCollection(prefix, missing, options);
242
+ if (remote) {
243
+ collection = mergeCollections(prefix, cached, remote);
244
+ await node_fs.promises.writeFile(cacheFile, JSON.stringify(collection, null, 2), 'utf8');
245
+ }
246
+ }
247
+ collections[prefix] = collection;
248
+ }
249
+ return collections;
250
+ }
251
+ function createIconifyVirtualModule(iconsByPrefix, collections, runtimeImports = {
252
+ iconifyIcon: 'iconify-icon',
253
+ iconifyUtils: '@iconify/utils'
254
+ }) {
255
+ const icons = Object.fromEntries(Array.from(iconsByPrefix, ([prefix, names]) => [prefix, Array.from(names).sort()]));
256
+ return [`import ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`, `import { addIcon } from ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`, `import { getIconData } from ${JSON.stringify(toImportPath(runtimeImports.iconifyUtils))};`, `const collections = ${JSON.stringify(collections)};`, `const icons = ${JSON.stringify(icons)};`, `for (const prefix of Object.keys(icons)) {`, ` const collection = collections[prefix];`, ` if (!collection) continue;`, ` for (const name of icons[prefix]) {`, ` const data = getIconData(collection, name);`, ` if (data) addIcon(prefix + ':' + name, data);`, ` }`, `}`, ``].join('\n');
257
+ }
258
+ function groupIconsByPrefix(iconNames) {
259
+ const grouped = new Map();
260
+ for (const iconName of normalizeIconList(iconNames)) {
261
+ const match = ICON_NAME_RE.exec(iconName);
262
+ if (!match) continue;
263
+ const _match = _slicedToArray(match, 3),
264
+ prefix = _match[1],
265
+ name = _match[2];
266
+ if (!grouped.has(prefix)) grouped.set(prefix, new Set());
267
+ grouped.get(prefix).add(name);
268
+ }
269
+ return grouped;
270
+ }
271
+ function extractStaticIconAttributes(line) {
272
+ const icons = [];
273
+ ICON_ATTR_RE.lastIndex = 0;
274
+ let match = ICON_ATTR_RE.exec(line);
275
+ while (match) {
276
+ icons.push(match[2].trim());
277
+ match = ICON_ATTR_RE.exec(line);
278
+ }
279
+ return icons;
280
+ }
281
+ function isValidIconName(icon) {
282
+ return ICON_NAME_RE.test(icon);
283
+ }
284
+ function normalizeIconList(iconNames) {
285
+ return Array.from(iconNames).map(icon => String(icon).trim()).filter(Boolean).filter(isValidIconName).sort();
286
+ }
287
+ function isBobeTag(tag) {
288
+ if (!tag) return false;
289
+ if (tag.type === 'Identifier') return tag.name === 'bobe';
290
+ if (tag.type === 'MemberExpression') {
291
+ const property = tag.property;
292
+ return !tag.computed && property?.type === 'Identifier' && property.name === 'bobe';
293
+ }
294
+ return false;
295
+ }
296
+ function walkAst(node, visit) {
297
+ if (!node || typeof node !== 'object') return;
298
+ if (typeof node.type === 'string') visit(node);
299
+ for (const key of Object.keys(node)) {
300
+ if (key === 'loc' || key === 'start' || key === 'end' || key === 'extra') continue;
301
+ const value = node[key];
302
+ if (Array.isArray(value)) {
303
+ for (const item of value) walkAst(item, visit);
304
+ } else if (value && typeof value === 'object') {
305
+ walkAst(value, visit);
306
+ }
307
+ }
308
+ }
309
+ function createFilter(include, exclude) {
310
+ const includeMatchers = normalizeMatchers(include);
311
+ const excludeMatchers = normalizeMatchers(exclude);
312
+ return id => {
313
+ const normalized = normalizeId(id);
314
+ if (excludeMatchers.some(match => match(normalized))) return false;
315
+ if (includeMatchers.length) return includeMatchers.some(match => match(normalized));
316
+ return DEFAULT_EXTENSIONS_RE.test(normalized) && !normalized.includes('/node_modules/') && !normalized.includes('/dist/');
317
+ };
318
+ }
319
+ function normalizeMatchers(value) {
320
+ return (Array.isArray(value) ? value : value ? [value] : []).map(toMatcher);
321
+ }
322
+ function toMatcher(pattern) {
323
+ const normalized = normalizeId(pattern);
324
+ if (!normalized.includes('*')) return id => id.includes(normalized);
325
+ const source = normalized.split('*').map(escapeRegExp).join('.*');
326
+ const re = new RegExp(source);
327
+ return id => re.test(id);
328
+ }
329
+ function normalizeId(id) {
330
+ return id.split('?')[0].replace(/\\/g, '/');
331
+ }
332
+ function escapeRegExp(value) {
333
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
334
+ }
335
+ async function collectSourceFiles(root) {
336
+ const files = [];
337
+ await walkDir(root, files);
338
+ return files;
339
+ }
340
+ async function walkDir(dir, files) {
341
+ const base = path.basename(dir);
342
+ if (base === 'node_modules' || base === 'dist' || base === '.git') return;
343
+ let entries;
344
+ try {
345
+ entries = await node_fs.promises.readdir(dir, {
346
+ withFileTypes: true
347
+ });
348
+ } catch {
349
+ return;
350
+ }
351
+ await Promise.all(entries.map(async entry => {
352
+ const fullPath = path.join(dir, entry.name);
353
+ if (entry.isDirectory()) {
354
+ await walkDir(fullPath, files);
355
+ return;
356
+ }
357
+ if (entry.isFile() && DEFAULT_EXTENSIONS_RE.test(entry.name)) files.push(fullPath);
358
+ }));
359
+ }
360
+ async function readCachedCollection(file, prefix) {
361
+ try {
362
+ const raw = await node_fs.promises.readFile(file, 'utf8');
363
+ const parsed = JSON.parse(raw);
364
+ if (parsed?.prefix === prefix && parsed.icons && typeof parsed.icons === 'object') {
365
+ return parsed;
366
+ }
367
+ } catch {}
368
+ return {
369
+ prefix,
370
+ icons: {}
371
+ };
372
+ }
373
+ async function fetchIconifyCollection(prefix, names, options) {
374
+ const fetcher = options.fetcher || globalThis.fetch;
375
+ if (typeof fetcher !== 'function') {
376
+ return handleFetchFailure(prefix, names, options, new Error('global fetch is not available'));
377
+ }
378
+ const url = `${options.apiBase.replace(/\/$/, '')}/${prefix}.json?icons=${names.map(encodeURIComponent).join(',')}`;
379
+ try {
380
+ const response = await fetcher(url);
381
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
382
+ const json = await response.json();
383
+ if (!json?.icons || typeof json.icons !== 'object') throw new Error('invalid Iconify response');
384
+ return json;
385
+ } catch (error) {
386
+ return handleFetchFailure(prefix, names, options, error);
387
+ }
388
+ }
389
+ function handleFetchFailure(prefix, names, options, error) {
390
+ const message = `[bobe-iconify] 下载 ${prefix}:${names.join(',')} 失败,已保留 Iconify runtime fallback。${error instanceof Error ? error.message : String(error)}`;
391
+ if (options.strict) throw new Error(message);
392
+ options.warn?.(message);
393
+ return null;
394
+ }
395
+ function mergeCollections(prefix, cached, remote) {
396
+ return {
397
+ ...cached,
398
+ ...remote,
399
+ prefix,
400
+ icons: {
401
+ ...(cached.icons || {}),
402
+ ...(remote.icons || {})
403
+ },
404
+ aliases: mergeOptionalRecords(cached.aliases, remote.aliases)
405
+ };
406
+ }
407
+ function mergeOptionalRecords(a, b) {
408
+ const merged = {
409
+ ...(a || {}),
410
+ ...(b || {})
411
+ };
412
+ return Object.keys(merged).length ? merged : undefined;
413
+ }
414
+ function hasIcon(collection, name) {
415
+ return Boolean(collection.icons?.[name] || collection.aliases?.[name]);
416
+ }
417
+ function getCacheDir(config, options) {
418
+ if (options.cacheDir) {
419
+ return path.isAbsolute(options.cacheDir) ? options.cacheDir : path.resolve(config.root, options.cacheDir);
420
+ }
421
+ return path.resolve(config.cacheDir, DEFAULT_CACHE_DIR);
422
+ }
423
+ function resolveRuntimeImports() {
424
+ return {
425
+ iconifyIcon: requireResolve('iconify-icon/dist/iconify-icon.mjs'),
426
+ iconifyUtils: requireResolve('@iconify/utils')
427
+ };
428
+ }
429
+ function requireResolve(id) {
430
+ return require$1.resolve(id);
431
+ }
432
+ function toImportPath(id) {
433
+ return id.replace(/\\/g, '/');
434
+ }
435
+
436
+ exports.createIconifyVirtualModule = createIconifyVirtualModule;
437
+ exports.default = bobeIconifyPlugin;
438
+ exports.extractBobeIconifyIcons = extractBobeIconifyIcons;
439
+ exports.extractIconifyIconsFromTemplate = extractIconifyIconsFromTemplate;
440
+ exports.groupIconsByPrefix = groupIconsByPrefix;
441
+ exports.loadIconifyCollections = loadIconifyCollections;
442
+ //# sourceMappingURL=iconify.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconify.cjs","sources":["../src/plugins/iconify/index.ts"],"sourcesContent":["import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite';\nimport { parse } from '@babel/parser';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\n\nconst VIRTUAL_ID = 'virtual:bobe-iconify-icons';\nconst RESOLVED_VIRTUAL_ID = `\\0${VIRTUAL_ID}`;\nconst DEFAULT_API_BASE = 'https://api.iconify.design';\nconst DEFAULT_CACHE_DIR = 'bobe-iconify';\nconst DEFAULT_EXTENSIONS_RE = /\\.(?:[cm]?[jt]sx?|mdx?)$/;\nconst ICON_NAME_RE = /^([a-z0-9]+(?:-[a-z0-9]+)*):([a-z0-9]+[-_:.a-z0-9]*)$/i;\nconst ICON_ATTR_RE = /\\bicon\\s*=\\s*(['\"])([^'\"]+)\\1/g;\nconst DYNAMIC_ICON_RE = /\\bicon\\s*=\\s*(?:\\{|(['\"])[^'\"]*$)/;\nconst require = createRequire(import.meta.url);\n\nexport interface BobeIconifyPluginOptions {\n include?: string | string[];\n exclude?: string | string[];\n icons?: string[];\n apiBase?: string;\n cacheDir?: string;\n strict?: boolean;\n warnDynamic?: boolean;\n}\n\nexport interface ExtractBobeIconifyResult {\n icons: string[];\n dynamic: number;\n invalid: string[];\n}\n\ninterface IconifyJSON {\n prefix: string;\n icons: Record<string, unknown>;\n aliases?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface CollectionLoadOptions {\n apiBase: string;\n cacheDir: string;\n strict?: boolean;\n fetcher?: typeof fetch;\n warn?: (message: string) => void;\n}\n\ninterface RuntimeImportPaths {\n iconifyIcon: string;\n iconifyUtils: string;\n}\n\nexport default function bobeIconifyPlugin(options: BobeIconifyPluginOptions = {}): Plugin {\n const icons = new Set<string>();\n const warnedDynamicIds = new Set<string>();\n const warnedInvalid = new Set<string>();\n const filter = createFilter(options.include, options.exclude);\n let config: ResolvedConfig;\n let server: ViteDevServer | undefined;\n let projectScanned = false;\n let runtimeImports: RuntimeImportPaths;\n\n const addIcons = (items: Iterable<string>) => {\n let changed = false;\n for (const icon of items) {\n if (icons.has(icon)) continue;\n icons.add(icon);\n changed = true;\n }\n if (changed && server) {\n const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n };\n\n const scanCode = (code: string, id: string, warn: (message: string) => void) => {\n const result = extractBobeIconifyIcons(code);\n addIcons(result.icons);\n\n if (options.warnDynamic !== false && result.dynamic > 0 && !warnedDynamicIds.has(id)) {\n warnedDynamicIds.add(id);\n warn(`[bobe-iconify] ${id} 中存在动态 iconify-icon icon 属性,插件会跳过静态注册并保留 Iconify runtime fallback。如需本地注册,请通过 icons 配置补充。`);\n }\n\n for (const icon of result.invalid) {\n const key = `${id}:${icon}`;\n if (warnedInvalid.has(key)) continue;\n warnedInvalid.add(key);\n warn(`[bobe-iconify] 忽略非法 icon 名称 \"${icon}\",仅支持 \"prefix:name\"。来源:${id}`);\n }\n };\n\n return {\n name: 'bobe-iconify',\n\n configResolved(resolved) {\n config = resolved;\n runtimeImports = resolveRuntimeImports();\n addIcons(normalizeIconList(options.icons || []));\n },\n\n configureServer(devServer) {\n server = devServer;\n },\n\n async buildStart() {\n addIcons(normalizeIconList(options.icons || []));\n },\n\n async transform(code, id) {\n if (!filter(id)) return;\n scanCode(code, id, message => this.warn(message));\n },\n\n transformIndexHtml: {\n order: 'pre',\n handler() {\n if (config?.build?.ssr) return;\n return [\n {\n tag: 'script',\n attrs: { type: 'module', src: `/${VIRTUAL_ID}` },\n injectTo: 'head',\n },\n ];\n },\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID || id === `/${VIRTUAL_ID}`) return RESOLVED_VIRTUAL_ID;\n },\n\n async load(id) {\n if (id !== RESOLVED_VIRTUAL_ID) return;\n\n await scanProjectOnce();\n const cacheDir = getCacheDir(config, options);\n const collections = await loadIconifyCollections(icons, {\n apiBase: options.apiBase || DEFAULT_API_BASE,\n cacheDir,\n strict: options.strict,\n warn: message => this.warn(message),\n });\n\n return createIconifyVirtualModule(groupIconsByPrefix(icons), collections, runtimeImports);\n },\n };\n\n async function scanProjectOnce() {\n if (projectScanned || !config) return;\n projectScanned = true;\n\n const files = await collectSourceFiles(config.root);\n await Promise.all(files.map(async file => {\n const id = path.normalize(file);\n if (!filter(id) || id.endsWith('.md') || id.endsWith('.mdx')) return;\n try {\n const code = await fs.readFile(file, 'utf8');\n scanCode(code, id, message => config.logger.warn(message));\n } catch {\n // Ignore unreadable files during eager project scan. Vite transform still handles modules in graph.\n }\n }));\n }\n}\n\nexport function extractBobeIconifyIcons(code: string): ExtractBobeIconifyResult {\n const icons = new Set<string>();\n const invalid = new Set<string>();\n let dynamic = 0;\n\n let ast: any;\n try {\n ast = parse(code, {\n sourceType: 'module',\n errorRecovery: true,\n plugins: [\n 'typescript',\n 'jsx'\n ],\n });\n } catch {\n return { icons: [], dynamic: 0, invalid: [] };\n }\n\n walkAst(ast, node => {\n if (node.type !== 'TaggedTemplateExpression' || !isBobeTag(node.tag)) return;\n\n for (const quasi of node.quasi?.quasis || []) {\n const raw = quasi.value?.raw ?? quasi.value?.cooked ?? '';\n const result = extractIconifyIconsFromTemplate(raw);\n for (const icon of result.icons) icons.add(icon);\n for (const icon of result.invalid) invalid.add(icon);\n dynamic += result.dynamic;\n }\n });\n\n return {\n icons: Array.from(icons).sort(),\n dynamic,\n invalid: Array.from(invalid).sort(),\n };\n}\n\nexport function extractIconifyIconsFromTemplate(template: string): ExtractBobeIconifyResult {\n const icons = new Set<string>();\n const invalid = new Set<string>();\n let dynamic = 0;\n let inIconifyElement = false;\n\n for (const line of template.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//')) continue;\n\n const isContinuation = trimmed.startsWith('|');\n const isIconifyElement = /^<?iconify-icon\\b/.test(trimmed);\n if (!isContinuation) inIconifyElement = isIconifyElement;\n\n if (!isIconifyElement && !(inIconifyElement && isContinuation)) continue;\n\n for (const icon of extractStaticIconAttributes(trimmed)) {\n if (isValidIconName(icon)) {\n icons.add(icon);\n } else {\n invalid.add(icon);\n }\n }\n\n if (DYNAMIC_ICON_RE.test(trimmed)) dynamic++;\n }\n\n return {\n icons: Array.from(icons).sort(),\n dynamic,\n invalid: Array.from(invalid).sort(),\n };\n}\n\nexport async function loadIconifyCollections(iconNames: Iterable<string>, options: CollectionLoadOptions) {\n const grouped = groupIconsByPrefix(iconNames);\n const collections: Record<string, IconifyJSON> = {};\n await fs.mkdir(options.cacheDir, { recursive: true });\n\n for (const [prefix, names] of grouped) {\n const cacheFile = path.join(options.cacheDir, `${prefix}.json`);\n const cached = await readCachedCollection(cacheFile, prefix);\n const missing = Array.from(names).filter(name => !hasIcon(cached, name));\n let collection = cached;\n\n if (missing.length) {\n const remote = await fetchIconifyCollection(prefix, missing, options);\n if (remote) {\n collection = mergeCollections(prefix, cached, remote);\n await fs.writeFile(cacheFile, JSON.stringify(collection, null, 2), 'utf8');\n }\n }\n\n collections[prefix] = collection;\n }\n\n return collections;\n}\n\nexport function createIconifyVirtualModule(\n iconsByPrefix: Map<string, Set<string>>,\n collections: Record<string, IconifyJSON>,\n runtimeImports: RuntimeImportPaths = {\n iconifyIcon: 'iconify-icon',\n iconifyUtils: '@iconify/utils',\n }\n) {\n const icons = Object.fromEntries(\n Array.from(iconsByPrefix, ([prefix, names]) => [prefix, Array.from(names).sort()])\n );\n\n return [\n `import ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`,\n `import { addIcon } from ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`,\n `import { getIconData } from ${JSON.stringify(toImportPath(runtimeImports.iconifyUtils))};`,\n `const collections = ${JSON.stringify(collections)};`,\n `const icons = ${JSON.stringify(icons)};`,\n `for (const prefix of Object.keys(icons)) {`,\n ` const collection = collections[prefix];`,\n ` if (!collection) continue;`,\n ` for (const name of icons[prefix]) {`,\n ` const data = getIconData(collection, name);`,\n ` if (data) addIcon(prefix + ':' + name, data);`,\n ` }`,\n `}`,\n ``,\n ].join('\\n');\n}\n\nexport function groupIconsByPrefix(iconNames: Iterable<string>) {\n const grouped = new Map<string, Set<string>>();\n for (const iconName of normalizeIconList(iconNames)) {\n const match = ICON_NAME_RE.exec(iconName);\n if (!match) continue;\n const [, prefix, name] = match;\n if (!grouped.has(prefix)) grouped.set(prefix, new Set());\n grouped.get(prefix)!.add(name);\n }\n return grouped;\n}\n\nfunction extractStaticIconAttributes(line: string) {\n const icons: string[] = [];\n ICON_ATTR_RE.lastIndex = 0;\n let match = ICON_ATTR_RE.exec(line);\n while (match) {\n icons.push(match[2].trim());\n match = ICON_ATTR_RE.exec(line);\n }\n return icons;\n}\n\nfunction isValidIconName(icon: string) {\n return ICON_NAME_RE.test(icon);\n}\n\nfunction normalizeIconList(iconNames: Iterable<string>) {\n return Array.from(iconNames)\n .map(icon => String(icon).trim())\n .filter(Boolean)\n .filter(isValidIconName)\n .sort();\n}\n\nfunction isBobeTag(tag: any) {\n if (!tag) return false;\n if (tag.type === 'Identifier') return tag.name === 'bobe';\n if (tag.type === 'MemberExpression') {\n const property = tag.property;\n return !tag.computed && property?.type === 'Identifier' && property.name === 'bobe';\n }\n return false;\n}\n\nfunction walkAst(node: any, visit: (node: any) => void) {\n if (!node || typeof node !== 'object') return;\n if (typeof node.type === 'string') visit(node);\n\n for (const key of Object.keys(node)) {\n if (key === 'loc' || key === 'start' || key === 'end' || key === 'extra') continue;\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) walkAst(item, visit);\n } else if (value && typeof value === 'object') {\n walkAst(value, visit);\n }\n }\n}\n\nfunction createFilter(include?: string | string[], exclude?: string | string[]) {\n const includeMatchers = normalizeMatchers(include);\n const excludeMatchers = normalizeMatchers(exclude);\n\n return (id: string) => {\n const normalized = normalizeId(id);\n if (excludeMatchers.some(match => match(normalized))) return false;\n if (includeMatchers.length) return includeMatchers.some(match => match(normalized));\n return DEFAULT_EXTENSIONS_RE.test(normalized) && !normalized.includes('/node_modules/') && !normalized.includes('/dist/');\n };\n}\n\nfunction normalizeMatchers(value?: string | string[]) {\n return (Array.isArray(value) ? value : value ? [value] : []).map(toMatcher);\n}\n\nfunction toMatcher(pattern: string) {\n const normalized = normalizeId(pattern);\n if (!normalized.includes('*')) return (id: string) => id.includes(normalized);\n const source = normalized\n .split('*')\n .map(escapeRegExp)\n .join('.*');\n const re = new RegExp(source);\n return (id: string) => re.test(id);\n}\n\nfunction normalizeId(id: string) {\n return id.split('?')[0].replace(/\\\\/g, '/');\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nasync function collectSourceFiles(root: string) {\n const files: string[] = [];\n await walkDir(root, files);\n return files;\n}\n\nasync function walkDir(dir: string, files: string[]) {\n const base = path.basename(dir);\n if (base === 'node_modules' || base === 'dist' || base === '.git') return;\n\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(entries.map(async entry => {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walkDir(fullPath, files);\n return;\n }\n if (entry.isFile() && DEFAULT_EXTENSIONS_RE.test(entry.name)) files.push(fullPath);\n }));\n}\n\nasync function readCachedCollection(file: string, prefix: string): Promise<IconifyJSON> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n const parsed = JSON.parse(raw);\n if (parsed?.prefix === prefix && parsed.icons && typeof parsed.icons === 'object') {\n return parsed;\n }\n } catch {\n // Missing or invalid cache is treated as an empty collection.\n }\n\n return { prefix, icons: {} };\n}\n\nasync function fetchIconifyCollection(prefix: string, names: string[], options: CollectionLoadOptions) {\n const fetcher = options.fetcher || globalThis.fetch;\n if (typeof fetcher !== 'function') {\n return handleFetchFailure(prefix, names, options, new Error('global fetch is not available'));\n }\n\n const url = `${options.apiBase.replace(/\\/$/, '')}/${prefix}.json?icons=${names.map(encodeURIComponent).join(',')}`;\n try {\n const response = await fetcher(url);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const json = await response.json();\n if (!json?.icons || typeof json.icons !== 'object') throw new Error('invalid Iconify response');\n return json as IconifyJSON;\n } catch (error) {\n return handleFetchFailure(prefix, names, options, error);\n }\n}\n\nfunction handleFetchFailure(prefix: string, names: string[], options: CollectionLoadOptions, error: unknown) {\n const message = `[bobe-iconify] 下载 ${prefix}:${names.join(',')} 失败,已保留 Iconify runtime fallback。${error instanceof Error ? error.message : String(error)}`;\n if (options.strict) throw new Error(message);\n options.warn?.(message);\n return null;\n}\n\nfunction mergeCollections(prefix: string, cached: IconifyJSON, remote: IconifyJSON): IconifyJSON {\n return {\n ...cached,\n ...remote,\n prefix,\n icons: {\n ...(cached.icons || {}),\n ...(remote.icons || {}),\n },\n aliases: mergeOptionalRecords(cached.aliases, remote.aliases),\n };\n}\n\nfunction mergeOptionalRecords(a?: Record<string, unknown>, b?: Record<string, unknown>) {\n const merged = { ...(a || {}), ...(b || {}) };\n return Object.keys(merged).length ? merged : undefined;\n}\n\nfunction hasIcon(collection: IconifyJSON, name: string) {\n return Boolean(collection.icons?.[name] || collection.aliases?.[name]);\n}\n\nfunction getCacheDir(config: ResolvedConfig, options: BobeIconifyPluginOptions) {\n if (options.cacheDir) {\n return path.isAbsolute(options.cacheDir)\n ? options.cacheDir\n : path.resolve(config.root, options.cacheDir);\n }\n return path.resolve(config.cacheDir, DEFAULT_CACHE_DIR);\n}\n\nfunction resolveRuntimeImports(): RuntimeImportPaths {\n return {\n iconifyIcon: requireResolve('iconify-icon/dist/iconify-icon.mjs'),\n iconifyUtils: requireResolve('@iconify/utils'),\n };\n}\n\nfunction requireResolve(id: string) {\n return require.resolve(id);\n}\n\nfunction toImportPath(id: string) {\n return id.replace(/\\\\/g, '/');\n}\n"],"names":["VIRTUAL_ID","RESOLVED_VIRTUAL_ID","DEFAULT_API_BASE","DEFAULT_CACHE_DIR","DEFAULT_EXTENSIONS_RE","ICON_NAME_RE","ICON_ATTR_RE","DYNAMIC_ICON_RE","require","createRequire","import","bobeIconifyPlugin","options","icons","Set","warnedDynamicIds","warnedInvalid","filter","createFilter","include","exclude","config","server","projectScanned","runtimeImports","addIcons","items","changed","icon","has","add","mod","moduleGraph","getModuleById","invalidateModule","scanCode","code","id","warn","result","extractBobeIconifyIcons","warnDynamic","dynamic","invalid","key","name","configResolved","resolved","resolveRuntimeImports","normalizeIconList","configureServer","devServer","buildStart","transform","message","transformIndexHtml","order","handler","build","ssr","tag","attrs","type","src","injectTo","resolveId","load","scanProjectOnce","cacheDir","getCacheDir","collections","loadIconifyCollections","apiBase","strict","createIconifyVirtualModule","groupIconsByPrefix","files","collectSourceFiles","root","Promise","all","map","file","path","normalize","endsWith","fs","readFile","logger","ast","parse","sourceType","errorRecovery","plugins","walkAst","node","isBobeTag","quasi","quasis","raw","value","cooked","extractIconifyIconsFromTemplate","Array","from","sort","template","inIconifyElement","line","split","trimmed","trim","startsWith","isContinuation","isIconifyElement","test","extractStaticIconAttributes","isValidIconName","iconNames","grouped","mkdir","recursive","_ref","_ref2","_slicedToArray","prefix","names","cacheFile","join","cached","readCachedCollection","missing","hasIcon","collection","length","remote","fetchIconifyCollection","mergeCollections","writeFile","JSON","stringify","iconsByPrefix","iconifyIcon","iconifyUtils","Object","fromEntries","toImportPath","Map","iconName","match","exec","_match","set","get","lastIndex","push","String","Boolean","property","computed","visit","keys","isArray","item","includeMatchers","normalizeMatchers","excludeMatchers","normalized","normalizeId","some","includes","toMatcher","pattern","source","escapeRegExp","re","RegExp","replace","walkDir","dir","base","basename","entries","readdir","withFileTypes","entry","fullPath","isDirectory","isFile","parsed","fetcher","globalThis","fetch","handleFetchFailure","Error","url","encodeURIComponent","response","ok","status","json","error","aliases","mergeOptionalRecords","a","b","merged","undefined","isAbsolute","resolve","requireResolve"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ interface BobeIconifyPluginOptions {
4
+ include?: string | string[];
5
+ exclude?: string | string[];
6
+ icons?: string[];
7
+ apiBase?: string;
8
+ cacheDir?: string;
9
+ strict?: boolean;
10
+ warnDynamic?: boolean;
11
+ }
12
+ interface ExtractBobeIconifyResult {
13
+ icons: string[];
14
+ dynamic: number;
15
+ invalid: string[];
16
+ }
17
+ interface IconifyJSON {
18
+ prefix: string;
19
+ icons: Record<string, unknown>;
20
+ aliases?: Record<string, unknown>;
21
+ [key: string]: unknown;
22
+ }
23
+ interface CollectionLoadOptions {
24
+ apiBase: string;
25
+ cacheDir: string;
26
+ strict?: boolean;
27
+ fetcher?: typeof fetch;
28
+ warn?: (message: string) => void;
29
+ }
30
+ interface RuntimeImportPaths {
31
+ iconifyIcon: string;
32
+ iconifyUtils: string;
33
+ }
34
+ declare function bobeIconifyPlugin(options?: BobeIconifyPluginOptions): Plugin;
35
+ declare function extractBobeIconifyIcons(code: string): ExtractBobeIconifyResult;
36
+ declare function extractIconifyIconsFromTemplate(template: string): ExtractBobeIconifyResult;
37
+ declare function loadIconifyCollections(iconNames: Iterable<string>, options: CollectionLoadOptions): Promise<Record<string, IconifyJSON>>;
38
+ declare function createIconifyVirtualModule(iconsByPrefix: Map<string, Set<string>>, collections: Record<string, IconifyJSON>, runtimeImports?: RuntimeImportPaths): string;
39
+ declare function groupIconsByPrefix(iconNames: Iterable<string>): Map<string, Set<string>>;
40
+
41
+ export { createIconifyVirtualModule, bobeIconifyPlugin as default, extractBobeIconifyIcons, extractIconifyIconsFromTemplate, groupIconsByPrefix, loadIconifyCollections };
42
+ export type { BobeIconifyPluginOptions, ExtractBobeIconifyResult };
@@ -0,0 +1,432 @@
1
+ import { parse } from '@babel/parser';
2
+ import { promises } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createRequire } from 'node:module';
5
+
6
+ function _arrayLikeToArray(r, a) {
7
+ (null == a || a > r.length) && (a = r.length);
8
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
9
+ return n;
10
+ }
11
+ function _arrayWithHoles(r) {
12
+ if (Array.isArray(r)) return r;
13
+ }
14
+ function _iterableToArrayLimit(r, l) {
15
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
16
+ if (null != t) {
17
+ var e,
18
+ n,
19
+ i,
20
+ u,
21
+ a = [],
22
+ f = true,
23
+ o = false;
24
+ try {
25
+ if (i = (t = t.call(r)).next, 0 === l) {
26
+ if (Object(t) !== t) return;
27
+ f = !1;
28
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
29
+ } catch (r) {
30
+ o = true, n = r;
31
+ } finally {
32
+ try {
33
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
34
+ } finally {
35
+ if (o) throw n;
36
+ }
37
+ }
38
+ return a;
39
+ }
40
+ }
41
+ function _nonIterableRest() {
42
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
43
+ }
44
+ function _slicedToArray(r, e) {
45
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
46
+ }
47
+ function _unsupportedIterableToArray(r, a) {
48
+ if (r) {
49
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
50
+ var t = {}.toString.call(r).slice(8, -1);
51
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
52
+ }
53
+ }
54
+
55
+ const VIRTUAL_ID = 'virtual:bobe-iconify-icons';
56
+ const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}`;
57
+ const DEFAULT_API_BASE = 'https://api.iconify.design';
58
+ const DEFAULT_CACHE_DIR = 'bobe-iconify';
59
+ const DEFAULT_EXTENSIONS_RE = /\.(?:[cm]?[jt]sx?|mdx?)$/;
60
+ const ICON_NAME_RE = /^([a-z0-9]+(?:-[a-z0-9]+)*):([a-z0-9]+[-_:.a-z0-9]*)$/i;
61
+ const ICON_ATTR_RE = /\bicon\s*=\s*(['"])([^'"]+)\1/g;
62
+ const DYNAMIC_ICON_RE = /\bicon\s*=\s*(?:\{|(['"])[^'"]*$)/;
63
+ const require$1 = createRequire(import.meta.url);
64
+ function bobeIconifyPlugin(options = {}) {
65
+ const icons = new Set();
66
+ const warnedDynamicIds = new Set();
67
+ const warnedInvalid = new Set();
68
+ const filter = createFilter(options.include, options.exclude);
69
+ let config;
70
+ let server;
71
+ let projectScanned = false;
72
+ let runtimeImports;
73
+ const addIcons = items => {
74
+ let changed = false;
75
+ for (const icon of items) {
76
+ if (icons.has(icon)) continue;
77
+ icons.add(icon);
78
+ changed = true;
79
+ }
80
+ if (changed && server) {
81
+ const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
82
+ if (mod) server.moduleGraph.invalidateModule(mod);
83
+ }
84
+ };
85
+ const scanCode = (code, id, warn) => {
86
+ const result = extractBobeIconifyIcons(code);
87
+ addIcons(result.icons);
88
+ if (options.warnDynamic !== false && result.dynamic > 0 && !warnedDynamicIds.has(id)) {
89
+ warnedDynamicIds.add(id);
90
+ warn(`[bobe-iconify] ${id} 中存在动态 iconify-icon icon 属性,插件会跳过静态注册并保留 Iconify runtime fallback。如需本地注册,请通过 icons 配置补充。`);
91
+ }
92
+ for (const icon of result.invalid) {
93
+ const key = `${id}:${icon}`;
94
+ if (warnedInvalid.has(key)) continue;
95
+ warnedInvalid.add(key);
96
+ warn(`[bobe-iconify] 忽略非法 icon 名称 "${icon}",仅支持 "prefix:name"。来源:${id}`);
97
+ }
98
+ };
99
+ return {
100
+ name: 'bobe-iconify',
101
+ configResolved(resolved) {
102
+ config = resolved;
103
+ runtimeImports = resolveRuntimeImports();
104
+ addIcons(normalizeIconList(options.icons || []));
105
+ },
106
+ configureServer(devServer) {
107
+ server = devServer;
108
+ },
109
+ async buildStart() {
110
+ addIcons(normalizeIconList(options.icons || []));
111
+ },
112
+ async transform(code, id) {
113
+ if (!filter(id)) return;
114
+ scanCode(code, id, message => this.warn(message));
115
+ },
116
+ transformIndexHtml: {
117
+ order: 'pre',
118
+ handler() {
119
+ if (config?.build?.ssr) return;
120
+ return [{
121
+ tag: 'script',
122
+ attrs: {
123
+ type: 'module',
124
+ src: `/${VIRTUAL_ID}`
125
+ },
126
+ injectTo: 'head'
127
+ }];
128
+ }
129
+ },
130
+ resolveId(id) {
131
+ if (id === VIRTUAL_ID || id === `/${VIRTUAL_ID}`) return RESOLVED_VIRTUAL_ID;
132
+ },
133
+ async load(id) {
134
+ if (id !== RESOLVED_VIRTUAL_ID) return;
135
+ await scanProjectOnce();
136
+ const cacheDir = getCacheDir(config, options);
137
+ const collections = await loadIconifyCollections(icons, {
138
+ apiBase: options.apiBase || DEFAULT_API_BASE,
139
+ cacheDir,
140
+ strict: options.strict,
141
+ warn: message => this.warn(message)
142
+ });
143
+ return createIconifyVirtualModule(groupIconsByPrefix(icons), collections, runtimeImports);
144
+ }
145
+ };
146
+ async function scanProjectOnce() {
147
+ if (projectScanned || !config) return;
148
+ projectScanned = true;
149
+ const files = await collectSourceFiles(config.root);
150
+ await Promise.all(files.map(async file => {
151
+ const id = path.normalize(file);
152
+ if (!filter(id) || id.endsWith('.md') || id.endsWith('.mdx')) return;
153
+ try {
154
+ const code = await promises.readFile(file, 'utf8');
155
+ scanCode(code, id, message => config.logger.warn(message));
156
+ } catch {}
157
+ }));
158
+ }
159
+ }
160
+ function extractBobeIconifyIcons(code) {
161
+ const icons = new Set();
162
+ const invalid = new Set();
163
+ let dynamic = 0;
164
+ let ast;
165
+ try {
166
+ ast = parse(code, {
167
+ sourceType: 'module',
168
+ errorRecovery: true,
169
+ plugins: ['typescript', 'jsx']
170
+ });
171
+ } catch {
172
+ return {
173
+ icons: [],
174
+ dynamic: 0,
175
+ invalid: []
176
+ };
177
+ }
178
+ walkAst(ast, node => {
179
+ if (node.type !== 'TaggedTemplateExpression' || !isBobeTag(node.tag)) return;
180
+ for (const quasi of node.quasi?.quasis || []) {
181
+ const raw = quasi.value?.raw ?? quasi.value?.cooked ?? '';
182
+ const result = extractIconifyIconsFromTemplate(raw);
183
+ for (const icon of result.icons) icons.add(icon);
184
+ for (const icon of result.invalid) invalid.add(icon);
185
+ dynamic += result.dynamic;
186
+ }
187
+ });
188
+ return {
189
+ icons: Array.from(icons).sort(),
190
+ dynamic,
191
+ invalid: Array.from(invalid).sort()
192
+ };
193
+ }
194
+ function extractIconifyIconsFromTemplate(template) {
195
+ const icons = new Set();
196
+ const invalid = new Set();
197
+ let dynamic = 0;
198
+ let inIconifyElement = false;
199
+ for (const line of template.split(/\r?\n/)) {
200
+ const trimmed = line.trim();
201
+ if (!trimmed || trimmed.startsWith('//')) continue;
202
+ const isContinuation = trimmed.startsWith('|');
203
+ const isIconifyElement = /^<?iconify-icon\b/.test(trimmed);
204
+ if (!isContinuation) inIconifyElement = isIconifyElement;
205
+ if (!isIconifyElement && !(inIconifyElement && isContinuation)) continue;
206
+ for (const icon of extractStaticIconAttributes(trimmed)) {
207
+ if (isValidIconName(icon)) {
208
+ icons.add(icon);
209
+ } else {
210
+ invalid.add(icon);
211
+ }
212
+ }
213
+ if (DYNAMIC_ICON_RE.test(trimmed)) dynamic++;
214
+ }
215
+ return {
216
+ icons: Array.from(icons).sort(),
217
+ dynamic,
218
+ invalid: Array.from(invalid).sort()
219
+ };
220
+ }
221
+ async function loadIconifyCollections(iconNames, options) {
222
+ const grouped = groupIconsByPrefix(iconNames);
223
+ const collections = {};
224
+ await promises.mkdir(options.cacheDir, {
225
+ recursive: true
226
+ });
227
+ for (const _ref of grouped) {
228
+ var _ref2 = _slicedToArray(_ref, 2);
229
+ const prefix = _ref2[0];
230
+ const names = _ref2[1];
231
+ const cacheFile = path.join(options.cacheDir, `${prefix}.json`);
232
+ const cached = await readCachedCollection(cacheFile, prefix);
233
+ const missing = Array.from(names).filter(name => !hasIcon(cached, name));
234
+ let collection = cached;
235
+ if (missing.length) {
236
+ const remote = await fetchIconifyCollection(prefix, missing, options);
237
+ if (remote) {
238
+ collection = mergeCollections(prefix, cached, remote);
239
+ await promises.writeFile(cacheFile, JSON.stringify(collection, null, 2), 'utf8');
240
+ }
241
+ }
242
+ collections[prefix] = collection;
243
+ }
244
+ return collections;
245
+ }
246
+ function createIconifyVirtualModule(iconsByPrefix, collections, runtimeImports = {
247
+ iconifyIcon: 'iconify-icon',
248
+ iconifyUtils: '@iconify/utils'
249
+ }) {
250
+ const icons = Object.fromEntries(Array.from(iconsByPrefix, ([prefix, names]) => [prefix, Array.from(names).sort()]));
251
+ return [`import ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`, `import { addIcon } from ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`, `import { getIconData } from ${JSON.stringify(toImportPath(runtimeImports.iconifyUtils))};`, `const collections = ${JSON.stringify(collections)};`, `const icons = ${JSON.stringify(icons)};`, `for (const prefix of Object.keys(icons)) {`, ` const collection = collections[prefix];`, ` if (!collection) continue;`, ` for (const name of icons[prefix]) {`, ` const data = getIconData(collection, name);`, ` if (data) addIcon(prefix + ':' + name, data);`, ` }`, `}`, ``].join('\n');
252
+ }
253
+ function groupIconsByPrefix(iconNames) {
254
+ const grouped = new Map();
255
+ for (const iconName of normalizeIconList(iconNames)) {
256
+ const match = ICON_NAME_RE.exec(iconName);
257
+ if (!match) continue;
258
+ const _match = _slicedToArray(match, 3),
259
+ prefix = _match[1],
260
+ name = _match[2];
261
+ if (!grouped.has(prefix)) grouped.set(prefix, new Set());
262
+ grouped.get(prefix).add(name);
263
+ }
264
+ return grouped;
265
+ }
266
+ function extractStaticIconAttributes(line) {
267
+ const icons = [];
268
+ ICON_ATTR_RE.lastIndex = 0;
269
+ let match = ICON_ATTR_RE.exec(line);
270
+ while (match) {
271
+ icons.push(match[2].trim());
272
+ match = ICON_ATTR_RE.exec(line);
273
+ }
274
+ return icons;
275
+ }
276
+ function isValidIconName(icon) {
277
+ return ICON_NAME_RE.test(icon);
278
+ }
279
+ function normalizeIconList(iconNames) {
280
+ return Array.from(iconNames).map(icon => String(icon).trim()).filter(Boolean).filter(isValidIconName).sort();
281
+ }
282
+ function isBobeTag(tag) {
283
+ if (!tag) return false;
284
+ if (tag.type === 'Identifier') return tag.name === 'bobe';
285
+ if (tag.type === 'MemberExpression') {
286
+ const property = tag.property;
287
+ return !tag.computed && property?.type === 'Identifier' && property.name === 'bobe';
288
+ }
289
+ return false;
290
+ }
291
+ function walkAst(node, visit) {
292
+ if (!node || typeof node !== 'object') return;
293
+ if (typeof node.type === 'string') visit(node);
294
+ for (const key of Object.keys(node)) {
295
+ if (key === 'loc' || key === 'start' || key === 'end' || key === 'extra') continue;
296
+ const value = node[key];
297
+ if (Array.isArray(value)) {
298
+ for (const item of value) walkAst(item, visit);
299
+ } else if (value && typeof value === 'object') {
300
+ walkAst(value, visit);
301
+ }
302
+ }
303
+ }
304
+ function createFilter(include, exclude) {
305
+ const includeMatchers = normalizeMatchers(include);
306
+ const excludeMatchers = normalizeMatchers(exclude);
307
+ return id => {
308
+ const normalized = normalizeId(id);
309
+ if (excludeMatchers.some(match => match(normalized))) return false;
310
+ if (includeMatchers.length) return includeMatchers.some(match => match(normalized));
311
+ return DEFAULT_EXTENSIONS_RE.test(normalized) && !normalized.includes('/node_modules/') && !normalized.includes('/dist/');
312
+ };
313
+ }
314
+ function normalizeMatchers(value) {
315
+ return (Array.isArray(value) ? value : value ? [value] : []).map(toMatcher);
316
+ }
317
+ function toMatcher(pattern) {
318
+ const normalized = normalizeId(pattern);
319
+ if (!normalized.includes('*')) return id => id.includes(normalized);
320
+ const source = normalized.split('*').map(escapeRegExp).join('.*');
321
+ const re = new RegExp(source);
322
+ return id => re.test(id);
323
+ }
324
+ function normalizeId(id) {
325
+ return id.split('?')[0].replace(/\\/g, '/');
326
+ }
327
+ function escapeRegExp(value) {
328
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
329
+ }
330
+ async function collectSourceFiles(root) {
331
+ const files = [];
332
+ await walkDir(root, files);
333
+ return files;
334
+ }
335
+ async function walkDir(dir, files) {
336
+ const base = path.basename(dir);
337
+ if (base === 'node_modules' || base === 'dist' || base === '.git') return;
338
+ let entries;
339
+ try {
340
+ entries = await promises.readdir(dir, {
341
+ withFileTypes: true
342
+ });
343
+ } catch {
344
+ return;
345
+ }
346
+ await Promise.all(entries.map(async entry => {
347
+ const fullPath = path.join(dir, entry.name);
348
+ if (entry.isDirectory()) {
349
+ await walkDir(fullPath, files);
350
+ return;
351
+ }
352
+ if (entry.isFile() && DEFAULT_EXTENSIONS_RE.test(entry.name)) files.push(fullPath);
353
+ }));
354
+ }
355
+ async function readCachedCollection(file, prefix) {
356
+ try {
357
+ const raw = await promises.readFile(file, 'utf8');
358
+ const parsed = JSON.parse(raw);
359
+ if (parsed?.prefix === prefix && parsed.icons && typeof parsed.icons === 'object') {
360
+ return parsed;
361
+ }
362
+ } catch {}
363
+ return {
364
+ prefix,
365
+ icons: {}
366
+ };
367
+ }
368
+ async function fetchIconifyCollection(prefix, names, options) {
369
+ const fetcher = options.fetcher || globalThis.fetch;
370
+ if (typeof fetcher !== 'function') {
371
+ return handleFetchFailure(prefix, names, options, new Error('global fetch is not available'));
372
+ }
373
+ const url = `${options.apiBase.replace(/\/$/, '')}/${prefix}.json?icons=${names.map(encodeURIComponent).join(',')}`;
374
+ try {
375
+ const response = await fetcher(url);
376
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
377
+ const json = await response.json();
378
+ if (!json?.icons || typeof json.icons !== 'object') throw new Error('invalid Iconify response');
379
+ return json;
380
+ } catch (error) {
381
+ return handleFetchFailure(prefix, names, options, error);
382
+ }
383
+ }
384
+ function handleFetchFailure(prefix, names, options, error) {
385
+ const message = `[bobe-iconify] 下载 ${prefix}:${names.join(',')} 失败,已保留 Iconify runtime fallback。${error instanceof Error ? error.message : String(error)}`;
386
+ if (options.strict) throw new Error(message);
387
+ options.warn?.(message);
388
+ return null;
389
+ }
390
+ function mergeCollections(prefix, cached, remote) {
391
+ return {
392
+ ...cached,
393
+ ...remote,
394
+ prefix,
395
+ icons: {
396
+ ...(cached.icons || {}),
397
+ ...(remote.icons || {})
398
+ },
399
+ aliases: mergeOptionalRecords(cached.aliases, remote.aliases)
400
+ };
401
+ }
402
+ function mergeOptionalRecords(a, b) {
403
+ const merged = {
404
+ ...(a || {}),
405
+ ...(b || {})
406
+ };
407
+ return Object.keys(merged).length ? merged : undefined;
408
+ }
409
+ function hasIcon(collection, name) {
410
+ return Boolean(collection.icons?.[name] || collection.aliases?.[name]);
411
+ }
412
+ function getCacheDir(config, options) {
413
+ if (options.cacheDir) {
414
+ return path.isAbsolute(options.cacheDir) ? options.cacheDir : path.resolve(config.root, options.cacheDir);
415
+ }
416
+ return path.resolve(config.cacheDir, DEFAULT_CACHE_DIR);
417
+ }
418
+ function resolveRuntimeImports() {
419
+ return {
420
+ iconifyIcon: requireResolve('iconify-icon/dist/iconify-icon.mjs'),
421
+ iconifyUtils: requireResolve('@iconify/utils')
422
+ };
423
+ }
424
+ function requireResolve(id) {
425
+ return require$1.resolve(id);
426
+ }
427
+ function toImportPath(id) {
428
+ return id.replace(/\\/g, '/');
429
+ }
430
+
431
+ export { createIconifyVirtualModule, bobeIconifyPlugin as default, extractBobeIconifyIcons, extractIconifyIconsFromTemplate, groupIconsByPrefix, loadIconifyCollections };
432
+ //# sourceMappingURL=iconify.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconify.esm.js","sources":["../src/plugins/iconify/index.ts"],"sourcesContent":["import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite';\nimport { parse } from '@babel/parser';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\n\nconst VIRTUAL_ID = 'virtual:bobe-iconify-icons';\nconst RESOLVED_VIRTUAL_ID = `\\0${VIRTUAL_ID}`;\nconst DEFAULT_API_BASE = 'https://api.iconify.design';\nconst DEFAULT_CACHE_DIR = 'bobe-iconify';\nconst DEFAULT_EXTENSIONS_RE = /\\.(?:[cm]?[jt]sx?|mdx?)$/;\nconst ICON_NAME_RE = /^([a-z0-9]+(?:-[a-z0-9]+)*):([a-z0-9]+[-_:.a-z0-9]*)$/i;\nconst ICON_ATTR_RE = /\\bicon\\s*=\\s*(['\"])([^'\"]+)\\1/g;\nconst DYNAMIC_ICON_RE = /\\bicon\\s*=\\s*(?:\\{|(['\"])[^'\"]*$)/;\nconst require = createRequire(import.meta.url);\n\nexport interface BobeIconifyPluginOptions {\n include?: string | string[];\n exclude?: string | string[];\n icons?: string[];\n apiBase?: string;\n cacheDir?: string;\n strict?: boolean;\n warnDynamic?: boolean;\n}\n\nexport interface ExtractBobeIconifyResult {\n icons: string[];\n dynamic: number;\n invalid: string[];\n}\n\ninterface IconifyJSON {\n prefix: string;\n icons: Record<string, unknown>;\n aliases?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface CollectionLoadOptions {\n apiBase: string;\n cacheDir: string;\n strict?: boolean;\n fetcher?: typeof fetch;\n warn?: (message: string) => void;\n}\n\ninterface RuntimeImportPaths {\n iconifyIcon: string;\n iconifyUtils: string;\n}\n\nexport default function bobeIconifyPlugin(options: BobeIconifyPluginOptions = {}): Plugin {\n const icons = new Set<string>();\n const warnedDynamicIds = new Set<string>();\n const warnedInvalid = new Set<string>();\n const filter = createFilter(options.include, options.exclude);\n let config: ResolvedConfig;\n let server: ViteDevServer | undefined;\n let projectScanned = false;\n let runtimeImports: RuntimeImportPaths;\n\n const addIcons = (items: Iterable<string>) => {\n let changed = false;\n for (const icon of items) {\n if (icons.has(icon)) continue;\n icons.add(icon);\n changed = true;\n }\n if (changed && server) {\n const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n };\n\n const scanCode = (code: string, id: string, warn: (message: string) => void) => {\n const result = extractBobeIconifyIcons(code);\n addIcons(result.icons);\n\n if (options.warnDynamic !== false && result.dynamic > 0 && !warnedDynamicIds.has(id)) {\n warnedDynamicIds.add(id);\n warn(`[bobe-iconify] ${id} 中存在动态 iconify-icon icon 属性,插件会跳过静态注册并保留 Iconify runtime fallback。如需本地注册,请通过 icons 配置补充。`);\n }\n\n for (const icon of result.invalid) {\n const key = `${id}:${icon}`;\n if (warnedInvalid.has(key)) continue;\n warnedInvalid.add(key);\n warn(`[bobe-iconify] 忽略非法 icon 名称 \"${icon}\",仅支持 \"prefix:name\"。来源:${id}`);\n }\n };\n\n return {\n name: 'bobe-iconify',\n\n configResolved(resolved) {\n config = resolved;\n runtimeImports = resolveRuntimeImports();\n addIcons(normalizeIconList(options.icons || []));\n },\n\n configureServer(devServer) {\n server = devServer;\n },\n\n async buildStart() {\n addIcons(normalizeIconList(options.icons || []));\n },\n\n async transform(code, id) {\n if (!filter(id)) return;\n scanCode(code, id, message => this.warn(message));\n },\n\n transformIndexHtml: {\n order: 'pre',\n handler() {\n if (config?.build?.ssr) return;\n return [\n {\n tag: 'script',\n attrs: { type: 'module', src: `/${VIRTUAL_ID}` },\n injectTo: 'head',\n },\n ];\n },\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID || id === `/${VIRTUAL_ID}`) return RESOLVED_VIRTUAL_ID;\n },\n\n async load(id) {\n if (id !== RESOLVED_VIRTUAL_ID) return;\n\n await scanProjectOnce();\n const cacheDir = getCacheDir(config, options);\n const collections = await loadIconifyCollections(icons, {\n apiBase: options.apiBase || DEFAULT_API_BASE,\n cacheDir,\n strict: options.strict,\n warn: message => this.warn(message),\n });\n\n return createIconifyVirtualModule(groupIconsByPrefix(icons), collections, runtimeImports);\n },\n };\n\n async function scanProjectOnce() {\n if (projectScanned || !config) return;\n projectScanned = true;\n\n const files = await collectSourceFiles(config.root);\n await Promise.all(files.map(async file => {\n const id = path.normalize(file);\n if (!filter(id) || id.endsWith('.md') || id.endsWith('.mdx')) return;\n try {\n const code = await fs.readFile(file, 'utf8');\n scanCode(code, id, message => config.logger.warn(message));\n } catch {\n // Ignore unreadable files during eager project scan. Vite transform still handles modules in graph.\n }\n }));\n }\n}\n\nexport function extractBobeIconifyIcons(code: string): ExtractBobeIconifyResult {\n const icons = new Set<string>();\n const invalid = new Set<string>();\n let dynamic = 0;\n\n let ast: any;\n try {\n ast = parse(code, {\n sourceType: 'module',\n errorRecovery: true,\n plugins: [\n 'typescript',\n 'jsx'\n ],\n });\n } catch {\n return { icons: [], dynamic: 0, invalid: [] };\n }\n\n walkAst(ast, node => {\n if (node.type !== 'TaggedTemplateExpression' || !isBobeTag(node.tag)) return;\n\n for (const quasi of node.quasi?.quasis || []) {\n const raw = quasi.value?.raw ?? quasi.value?.cooked ?? '';\n const result = extractIconifyIconsFromTemplate(raw);\n for (const icon of result.icons) icons.add(icon);\n for (const icon of result.invalid) invalid.add(icon);\n dynamic += result.dynamic;\n }\n });\n\n return {\n icons: Array.from(icons).sort(),\n dynamic,\n invalid: Array.from(invalid).sort(),\n };\n}\n\nexport function extractIconifyIconsFromTemplate(template: string): ExtractBobeIconifyResult {\n const icons = new Set<string>();\n const invalid = new Set<string>();\n let dynamic = 0;\n let inIconifyElement = false;\n\n for (const line of template.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//')) continue;\n\n const isContinuation = trimmed.startsWith('|');\n const isIconifyElement = /^<?iconify-icon\\b/.test(trimmed);\n if (!isContinuation) inIconifyElement = isIconifyElement;\n\n if (!isIconifyElement && !(inIconifyElement && isContinuation)) continue;\n\n for (const icon of extractStaticIconAttributes(trimmed)) {\n if (isValidIconName(icon)) {\n icons.add(icon);\n } else {\n invalid.add(icon);\n }\n }\n\n if (DYNAMIC_ICON_RE.test(trimmed)) dynamic++;\n }\n\n return {\n icons: Array.from(icons).sort(),\n dynamic,\n invalid: Array.from(invalid).sort(),\n };\n}\n\nexport async function loadIconifyCollections(iconNames: Iterable<string>, options: CollectionLoadOptions) {\n const grouped = groupIconsByPrefix(iconNames);\n const collections: Record<string, IconifyJSON> = {};\n await fs.mkdir(options.cacheDir, { recursive: true });\n\n for (const [prefix, names] of grouped) {\n const cacheFile = path.join(options.cacheDir, `${prefix}.json`);\n const cached = await readCachedCollection(cacheFile, prefix);\n const missing = Array.from(names).filter(name => !hasIcon(cached, name));\n let collection = cached;\n\n if (missing.length) {\n const remote = await fetchIconifyCollection(prefix, missing, options);\n if (remote) {\n collection = mergeCollections(prefix, cached, remote);\n await fs.writeFile(cacheFile, JSON.stringify(collection, null, 2), 'utf8');\n }\n }\n\n collections[prefix] = collection;\n }\n\n return collections;\n}\n\nexport function createIconifyVirtualModule(\n iconsByPrefix: Map<string, Set<string>>,\n collections: Record<string, IconifyJSON>,\n runtimeImports: RuntimeImportPaths = {\n iconifyIcon: 'iconify-icon',\n iconifyUtils: '@iconify/utils',\n }\n) {\n const icons = Object.fromEntries(\n Array.from(iconsByPrefix, ([prefix, names]) => [prefix, Array.from(names).sort()])\n );\n\n return [\n `import ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`,\n `import { addIcon } from ${JSON.stringify(toImportPath(runtimeImports.iconifyIcon))};`,\n `import { getIconData } from ${JSON.stringify(toImportPath(runtimeImports.iconifyUtils))};`,\n `const collections = ${JSON.stringify(collections)};`,\n `const icons = ${JSON.stringify(icons)};`,\n `for (const prefix of Object.keys(icons)) {`,\n ` const collection = collections[prefix];`,\n ` if (!collection) continue;`,\n ` for (const name of icons[prefix]) {`,\n ` const data = getIconData(collection, name);`,\n ` if (data) addIcon(prefix + ':' + name, data);`,\n ` }`,\n `}`,\n ``,\n ].join('\\n');\n}\n\nexport function groupIconsByPrefix(iconNames: Iterable<string>) {\n const grouped = new Map<string, Set<string>>();\n for (const iconName of normalizeIconList(iconNames)) {\n const match = ICON_NAME_RE.exec(iconName);\n if (!match) continue;\n const [, prefix, name] = match;\n if (!grouped.has(prefix)) grouped.set(prefix, new Set());\n grouped.get(prefix)!.add(name);\n }\n return grouped;\n}\n\nfunction extractStaticIconAttributes(line: string) {\n const icons: string[] = [];\n ICON_ATTR_RE.lastIndex = 0;\n let match = ICON_ATTR_RE.exec(line);\n while (match) {\n icons.push(match[2].trim());\n match = ICON_ATTR_RE.exec(line);\n }\n return icons;\n}\n\nfunction isValidIconName(icon: string) {\n return ICON_NAME_RE.test(icon);\n}\n\nfunction normalizeIconList(iconNames: Iterable<string>) {\n return Array.from(iconNames)\n .map(icon => String(icon).trim())\n .filter(Boolean)\n .filter(isValidIconName)\n .sort();\n}\n\nfunction isBobeTag(tag: any) {\n if (!tag) return false;\n if (tag.type === 'Identifier') return tag.name === 'bobe';\n if (tag.type === 'MemberExpression') {\n const property = tag.property;\n return !tag.computed && property?.type === 'Identifier' && property.name === 'bobe';\n }\n return false;\n}\n\nfunction walkAst(node: any, visit: (node: any) => void) {\n if (!node || typeof node !== 'object') return;\n if (typeof node.type === 'string') visit(node);\n\n for (const key of Object.keys(node)) {\n if (key === 'loc' || key === 'start' || key === 'end' || key === 'extra') continue;\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) walkAst(item, visit);\n } else if (value && typeof value === 'object') {\n walkAst(value, visit);\n }\n }\n}\n\nfunction createFilter(include?: string | string[], exclude?: string | string[]) {\n const includeMatchers = normalizeMatchers(include);\n const excludeMatchers = normalizeMatchers(exclude);\n\n return (id: string) => {\n const normalized = normalizeId(id);\n if (excludeMatchers.some(match => match(normalized))) return false;\n if (includeMatchers.length) return includeMatchers.some(match => match(normalized));\n return DEFAULT_EXTENSIONS_RE.test(normalized) && !normalized.includes('/node_modules/') && !normalized.includes('/dist/');\n };\n}\n\nfunction normalizeMatchers(value?: string | string[]) {\n return (Array.isArray(value) ? value : value ? [value] : []).map(toMatcher);\n}\n\nfunction toMatcher(pattern: string) {\n const normalized = normalizeId(pattern);\n if (!normalized.includes('*')) return (id: string) => id.includes(normalized);\n const source = normalized\n .split('*')\n .map(escapeRegExp)\n .join('.*');\n const re = new RegExp(source);\n return (id: string) => re.test(id);\n}\n\nfunction normalizeId(id: string) {\n return id.split('?')[0].replace(/\\\\/g, '/');\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nasync function collectSourceFiles(root: string) {\n const files: string[] = [];\n await walkDir(root, files);\n return files;\n}\n\nasync function walkDir(dir: string, files: string[]) {\n const base = path.basename(dir);\n if (base === 'node_modules' || base === 'dist' || base === '.git') return;\n\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(entries.map(async entry => {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await walkDir(fullPath, files);\n return;\n }\n if (entry.isFile() && DEFAULT_EXTENSIONS_RE.test(entry.name)) files.push(fullPath);\n }));\n}\n\nasync function readCachedCollection(file: string, prefix: string): Promise<IconifyJSON> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n const parsed = JSON.parse(raw);\n if (parsed?.prefix === prefix && parsed.icons && typeof parsed.icons === 'object') {\n return parsed;\n }\n } catch {\n // Missing or invalid cache is treated as an empty collection.\n }\n\n return { prefix, icons: {} };\n}\n\nasync function fetchIconifyCollection(prefix: string, names: string[], options: CollectionLoadOptions) {\n const fetcher = options.fetcher || globalThis.fetch;\n if (typeof fetcher !== 'function') {\n return handleFetchFailure(prefix, names, options, new Error('global fetch is not available'));\n }\n\n const url = `${options.apiBase.replace(/\\/$/, '')}/${prefix}.json?icons=${names.map(encodeURIComponent).join(',')}`;\n try {\n const response = await fetcher(url);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const json = await response.json();\n if (!json?.icons || typeof json.icons !== 'object') throw new Error('invalid Iconify response');\n return json as IconifyJSON;\n } catch (error) {\n return handleFetchFailure(prefix, names, options, error);\n }\n}\n\nfunction handleFetchFailure(prefix: string, names: string[], options: CollectionLoadOptions, error: unknown) {\n const message = `[bobe-iconify] 下载 ${prefix}:${names.join(',')} 失败,已保留 Iconify runtime fallback。${error instanceof Error ? error.message : String(error)}`;\n if (options.strict) throw new Error(message);\n options.warn?.(message);\n return null;\n}\n\nfunction mergeCollections(prefix: string, cached: IconifyJSON, remote: IconifyJSON): IconifyJSON {\n return {\n ...cached,\n ...remote,\n prefix,\n icons: {\n ...(cached.icons || {}),\n ...(remote.icons || {}),\n },\n aliases: mergeOptionalRecords(cached.aliases, remote.aliases),\n };\n}\n\nfunction mergeOptionalRecords(a?: Record<string, unknown>, b?: Record<string, unknown>) {\n const merged = { ...(a || {}), ...(b || {}) };\n return Object.keys(merged).length ? merged : undefined;\n}\n\nfunction hasIcon(collection: IconifyJSON, name: string) {\n return Boolean(collection.icons?.[name] || collection.aliases?.[name]);\n}\n\nfunction getCacheDir(config: ResolvedConfig, options: BobeIconifyPluginOptions) {\n if (options.cacheDir) {\n return path.isAbsolute(options.cacheDir)\n ? options.cacheDir\n : path.resolve(config.root, options.cacheDir);\n }\n return path.resolve(config.cacheDir, DEFAULT_CACHE_DIR);\n}\n\nfunction resolveRuntimeImports(): RuntimeImportPaths {\n return {\n iconifyIcon: requireResolve('iconify-icon/dist/iconify-icon.mjs'),\n iconifyUtils: requireResolve('@iconify/utils'),\n };\n}\n\nfunction requireResolve(id: string) {\n return require.resolve(id);\n}\n\nfunction toImportPath(id: string) {\n return id.replace(/\\\\/g, '/');\n}\n"],"names":["VIRTUAL_ID","RESOLVED_VIRTUAL_ID","DEFAULT_API_BASE","DEFAULT_CACHE_DIR","DEFAULT_EXTENSIONS_RE","ICON_NAME_RE","ICON_ATTR_RE","DYNAMIC_ICON_RE","require","createRequire","import","meta","url","bobeIconifyPlugin","options","icons","Set","warnedDynamicIds","warnedInvalid","filter","createFilter","include","exclude","config","server","projectScanned","runtimeImports","addIcons","items","changed","icon","has","add","mod","moduleGraph","getModuleById","invalidateModule","scanCode","code","id","warn","result","extractBobeIconifyIcons","warnDynamic","dynamic","invalid","key","name","configResolved","resolved","resolveRuntimeImports","normalizeIconList","configureServer","devServer","buildStart","transform","message","transformIndexHtml","order","handler","build","ssr","tag","attrs","type","src","injectTo","resolveId","load","scanProjectOnce","cacheDir","getCacheDir","collections","loadIconifyCollections","apiBase","strict","createIconifyVirtualModule","groupIconsByPrefix","files","collectSourceFiles","root","Promise","all","map","file","path","normalize","endsWith","fs","readFile","logger","ast","parse","sourceType","errorRecovery","plugins","walkAst","node","isBobeTag","quasi","quasis","raw","value","cooked","extractIconifyIconsFromTemplate","Array","from","sort","template","inIconifyElement","line","split","trimmed","trim","startsWith","isContinuation","isIconifyElement","test","extractStaticIconAttributes","isValidIconName","iconNames","grouped","mkdir","recursive","_ref","_ref2","_slicedToArray","prefix","names","cacheFile","join","cached","readCachedCollection","missing","hasIcon","collection","length","remote","fetchIconifyCollection","mergeCollections","writeFile","JSON","stringify","iconsByPrefix","iconifyIcon","iconifyUtils","Object","fromEntries","toImportPath","Map","iconName","match","exec","_match","set","get","lastIndex","push","String","Boolean","property","computed","visit","keys","isArray","item","includeMatchers","normalizeMatchers","excludeMatchers","normalized","normalizeId","some","includes","toMatcher","pattern","source","escapeRegExp","re","RegExp","replace","walkDir","dir","base","basename","entries","readdir","withFileTypes","entry","fullPath","isDirectory","isFile","parsed","fetcher","globalThis","fetch","handleFetchFailure","Error","encodeURIComponent","response","ok","status","json","error","aliases","mergeOptionalRecords","a","b","merged","undefined","isAbsolute","resolve","requireResolve"],"mappings":"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"}
package/dist/index.css CHANGED
@@ -1,4 +1,4 @@
1
- .code-block{border:1px solid var(--md-border,#3c3f47);border-radius:6px;height:700px;margin:16px 0;overflow:hidden}.code-block,.code-block-full{background:var(--md-bg,#1b1b1f);display:flex;flex-direction:column}.code-block-full{height:100vh;left:0;opacity:0;pointer-events:none;position:fixed;top:0;width:100vw;z-index:9999}.code-block-full-active{opacity:1;pointer-events:auto}.code-tabs{background:var(--md-bg-secondary,#22222a);border-bottom:1px solid var(--md-border,#3c3f47);display:flex;flex:0 0 auto;overflow-x:auto}.code-panel-preview{display:flex;flex:1 1 auto;height:1px}.full-button{background:none;border-right:0 solid var(--md-border,#3c3f47);border:solid var(--md-border,#3c3f47);border-radius:4px 0 0 0;border-width:0 1px 0 0;color:var(--md-text-muted,#9898a5);cursor:pointer;flex-shrink:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:12px;padding:6px 14px;transition:color .15s,border-color .15s;white-space:nowrap}.full-button:hover{color:var(--md-accent-focus,#539bf5)}.code-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--md-text-muted,#9898a5);cursor:pointer;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:13px;padding:8px 16px;white-space:nowrap}.code-tab:hover{background:var(--md-bg-code,#282c38);color:var(--md-text,#e1e1e5)}.code-tab-active{background:var(--md-bg,#1b1b1f);border-bottom-color:var(--md-accent-focus,#539bf5);color:var(--md-text,#e1e1e5);font-weight:500}.code-panel-preview .code-panel{flex:1 1 1px;margin-bottom:0;overflow:auto}.code-panel code.hljs{overflow-x:visible}.code-panel pre{font-size:13px;line-height:1.5;margin:0;padding:16px}.code-preview{flex:1 1 1px}:root{--md-text:#e1e1e5;--md-text-muted:#9898a5;--md-text-link:#6cb2ff;--md-bg:#1b1b1f;--md-bg-secondary:#22222a;--md-bg-code:#282c38;--md-bg-inline-code:#282c38;--md-bg-mark:#f2c94e26;--md-bg-transparent:transparent;--md-border:#3c3f47;--md-border-muted:#3c3f47b3;--md-accent-focus:#539bf5;--md-syntax-keyword:#ff7b72;--md-syntax-string:#9ecbff;--md-syntax-number:#7ac0ff;--md-syntax-function:#d2a8ff;--md-syntax-builtin:#7ee787;--md-syntax-variable:#ffa860;--md-syntax-meta:#f2cc60;--md-diff-del-text:#ffdcd7;--md-diff-del-bg:#5c1a1e;--md-diff-add-text:#aff5b4;--md-diff-add-bg:#0d3b20;--md-diff-changed-text:#ffdfb6;--md-diff-changed-bg:#5c2d0e;--md-diff-meta-bg:#1a5fb4;--md-danger-fg:#f85149;--md-danger-bg:#a12525;--md-alert-note-border:#539bf5;--md-alert-note-title:#6cb2ff;--md-alert-important-border:#986ee2;--md-alert-important-title:#b992f8;--md-alert-warning-border:#b0881a;--md-alert-warning-title:#e0b044;--md-alert-tip-border:#2ea855;--md-alert-tip-title:#4ec96a;--md-alert-caution-border:#e04a45;--md-alert-caution-title:#f85149;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;word-wrap:break-word;background-color:var(--md-bg);color:var(--md-text);color-scheme:dark;flex:1 1 auto;font-family:Yu Mincho,STSong,华文宋体,serif,-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;font-weight:400;line-height:1.5;margin:0}.markdown-body a{text-decoration:underline;text-underline-offset:.2rem}.markdown{align-items:flex-start;display:flex;gap:24px;justify-content:space-between}.markdown-body{flex:1 1 auto;min-width:0}.markdown-aside{flex:0 0 220px;max-height:calc(100vh - 32px);overflow-y:auto;position:sticky;scrollbar-color:var(--md-border) transparent;scrollbar-width:thin;top:0;width:220px}.markdown-aside-content{position:relative}.markdown-aside-border{background:var(--md-border);bottom:0;left:2.5px;pointer-events:none;position:absolute;top:0;width:1px;z-index:0}.markdown-aside-indicator{background:var(--md-accent-focus);border-radius:999px;height:25px;left:1px;margin-bottom:-25px;opacity:0;pointer-events:none;position:relative;top:0;transition:transform .2s ease,height .2s ease,opacity .15s ease;width:4px;z-index:1}.markdown-aside-indicator-active{opacity:1}.markdown-aside-item{border-radius:4px;color:var(--md-text-muted);display:block;line-height:1.35;margin:1px 0 1px 12px;overflow-wrap:anywhere;padding:4px 8px 4px 12px;position:relative;text-decoration:none;transition:color .15s,background-color .15s;z-index:2}.markdown-aside-item:hover{text-decoration:none}.markdown-aside-item-active,.markdown-aside-item:hover{background-color:var(--md-bg-secondary);color:var(--md-text)}.markdown-aside-item-active{font-weight:600}.markdown-aside-depth-1{font-size:14px;font-weight:600}.markdown-aside-depth-2{font-size:13px;font-weight:500;padding-left:20px}.markdown-aside-depth-3{font-size:12px;opacity:.9;padding-left:32px}.markdown-aside-depth-4,.markdown-aside-depth-5,.markdown-aside-depth-6{font-size:12px;opacity:.75;padding-left:44px}@media (max-width:960px){.markdown{display:block}.markdown-aside{display:none}}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{background-color:currentColor;content:" ";display:inline-block;height:16px;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0z"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0z"/></svg>');width:16px}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:var(--md-bg-transparent);color:var(--md-text-link);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:600}.markdown-body dfn{font-style:italic}.markdown-body h1{font-size:2em;margin:.67em 0;padding-bottom:.3em}.markdown-body mark{background-color:var(--md-bg-mark);color:var(--md-text)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;box-sizing:content-box;max-width:100%}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em 2.5rem}.markdown-body hr{background:var(--md-bg-transparent);background-color:var(--md-border);border:0;box-sizing:content-box;height:.25em;margin:1.5rem 0;overflow:hidden;padding:0}.markdown-body input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button;appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::placeholder{color:var(--md-text-muted);opacity:1}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0;display:block;font-variant:tabular-nums;max-width:100%;overflow:auto;width:max-content}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body [role=button]:focus,.markdown-body a:focus,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=radio]:focus{box-shadow:none;outline:2px solid var(--borderColor-accent-emphasis);outline-offset:-2px}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}.markdown-body [role=button]:focus-visible,.markdown-body a:focus-visible,.markdown-body input[type=checkbox]:focus-visible,.markdown-body input[type=radio]:focus-visible{box-shadow:none;outline:2px solid var(--borderColor-accent-emphasis);outline-offset:-2px}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible{outline-offset:0}.markdown-body kbd{background-color:var(--md-bg-secondary);border-bottom-color:var(--borderColor-muted);border:1px solid var(--borderColor-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-muted);color:var(--md-text);display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:.25rem;vertical-align:middle}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:500;letter-spacing:.05em;line-height:1.25;margin-bottom:1rem;margin-top:1.5rem}.markdown-body h2{font-size:1.5em;padding-bottom:.3em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:var(--md-text-muted);font-size:.85em}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{border-left:.25em solid var(--md-border);color:var(--md-text-muted);margin:0;padding:0 1em}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre,.markdown-body samp,.markdown-body tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{word-wrap:normal;margin-bottom:0;margin-top:0}.markdown-body .octicon{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{appearance:none;margin:0}.markdown-body .mr-2{margin-right:.5rem!important}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--md-danger-fg)}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:.25rem}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body details,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:1rem;margin-top:0}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--md-text);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit;padding:0 .2em}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{border-bottom:0;padding-bottom:0}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol[type="a s"]{list-style-type:lower-alpha}.markdown-body ol[type="A s"]{list-style-type:upper-alpha}.markdown-body ol[type="i s"]{list-style-type:lower-roman}.markdown-body ol[type="I s"]{list-style-type:upper-roman}.markdown-body div>ol:not([type]),.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:1rem}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:1rem;padding:0}.markdown-body dl dd{margin-bottom:1rem;padding:0 1rem}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{border:1px solid var(--md-border);padding:6px 13px}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--md-bg);border-top:1px solid var(--md-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--md-bg-secondary)}.markdown-body table img{background-color:var(--md-bg-transparent)}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:var(--md-bg-transparent);max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid var(--md-border);display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:var(--md-text);display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body p>code{background-color:var(--md-bg-inline-code)}.markdown-body code,.markdown-body tt{background-color:var(--md-bg-code);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em;white-space:break-spaces}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{background:var(--md-bg-transparent);border:0;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:1rem}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:var(--md-bg-secondary);border-radius:6px;color:var(--md-text);font-size:85%;line-height:1.45;overflow:auto;padding:1rem}.markdown-body pre code,.markdown-body pre tt{word-wrap:normal;background-color:var(--md-bg-transparent);border:0;display:inline;line-height:inherit;margin:0;overflow:visible;padding:0}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{background:var(--md-bg);border:0;padding:10px .5rem 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:var(--md-bg-secondary);border-top:0;font-weight:600}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{border-top:1px solid var(--md-border);color:var(--md-text-muted);font-size:12px}.markdown-body .footnotes ol{padding-left:1rem}.markdown-body .footnotes ol ul{display:inline-block;margin-top:1rem;padding-left:1rem}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{border:2px solid var(--md-accent-focus);border-radius:6px;bottom:-.5rem;content:"";left:-1.5rem;pointer-events:none;position:absolute;right:-.5rem;top:-.5rem}.markdown-body .footnotes li:target{color:var(--md-text)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .pl-c{color:var(--md-text-muted)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--md-syntax-number)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--md-syntax-function)}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:var(--md-text)}.markdown-body .pl-ent{color:var(--md-syntax-builtin)}.markdown-body .pl-k{color:var(--md-syntax-keyword)}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:var(--md-syntax-string)}.markdown-body .pl-smw,.markdown-body .pl-v{color:var(--md-syntax-variable)}.markdown-body .pl-bu{color:var(--md-danger-fg)}.markdown-body .pl-ii{background-color:var(--bgColor-danger-muted);color:var(--fgColor-danger)}.markdown-body .pl-c2{background-color:var(--md-danger-bg);color:var(--md-text)}.markdown-body .pl-sr .pl-cce{color:var(--md-syntax-builtin);font-weight:700}.markdown-body .pl-ml{color:var(--md-syntax-meta)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:var(--md-accent-focus);font-weight:700}.markdown-body .pl-mi{color:var(--md-text);font-style:italic}.markdown-body .pl-mb{color:var(--md-text);font-weight:700}.markdown-body .pl-md{background-color:var(--md-diff-del-bg);color:var(--md-diff-del-text)}.markdown-body .pl-mi1{background-color:var(--md-diff-add-bg);color:var(--md-diff-add-text)}.markdown-body .pl-mc{background-color:var(--md-diff-changed-bg);color:var(--md-diff-changed-text)}.markdown-body .pl-mi2{background-color:var(--md-diff-meta-bg);color:var(--md-text)}.markdown-body .pl-mdr{color:var(--md-syntax-function);font-weight:700}.markdown-body .pl-ba{color:var(--md-text-muted)}.markdown-body .pl-sg{color:var(--md-border)}.markdown-body .pl-corl{color:var(--md-syntax-string);text-decoration:underline}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible),.markdown-body button:focus:not(:focus-visible),.markdown-body summary:focus:not(:focus-visible){box-shadow:none;outline:none}.markdown-body [tabindex="0"]:focus:not(:focus-visible),.markdown-body details-dialog:focus:not(:focus-visible){outline:none}.markdown-body g-emoji{display:inline-block;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:400;line-height:1;min-width:1ch;vertical-align:-.075em}.markdown-body g-emoji img{height:1em;width:1em}.markdown-body a:has(>p,>div,>pre,>blockquote){display:block}.markdown-body a:has(>p,>div,>pre,>blockquote):not(:has(.snippet-clipboard-content,>pre)){width:fit-content}.markdown-body a:has(>p,>div,>pre,>blockquote):has(.snippet-clipboard-content,>pre):focus-visible{outline:2px solid var(--borderColor-accent-emphasis);outline-offset:2px}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:400}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:.25rem}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list:focus-within .task-list-item-convert-container,.markdown-body .contains-task-list:hover .task-list-item-convert-container{clip-path:none;display:block;height:24px;overflow:visible;width:auto}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}.markdown-body .markdown-alert{border-left:.25em solid var(--md-border);color:inherit;margin-bottom:1rem;padding:.5rem 1rem}.markdown-body .markdown-alert>:first-child{margin-top:0}.markdown-body .markdown-alert>:last-child{margin-bottom:0}.markdown-body .markdown-alert .markdown-alert-title{align-items:center;display:flex;font-weight:500;line-height:1}.markdown-body .markdown-alert.markdown-alert-note{border-left-color:var(--md-alert-note-border)}.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--md-text-link)}.markdown-body .markdown-alert.markdown-alert-important{border-left-color:var(--md-alert-important-border)}.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--md-alert-important-title)}.markdown-body .markdown-alert.markdown-alert-warning{border-left-color:var(--md-alert-warning-border)}.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--md-alert-warning-title)}.markdown-body .markdown-alert.markdown-alert-tip{border-left-color:var(--md-alert-tip-border)}.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--md-alert-tip-title)}.markdown-body .markdown-alert.markdown-alert-caution{border-left-color:var(--md-alert-caution-border)}.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--md-danger-fg)}.markdown-body>:first-child>.heading-element:first-child{margin-top:0!important}.markdown-body .highlight pre:has(+.zeroclipboard-container){min-height:52px}@font-face{font-family:Twilio;font-style:normal;font-weight:400;src:url(fonts/twilio.woff2) format("woff2")}pre code.hljs{-webkit-font-feature-settings:"calt" 1;font-feature-settings:"calt" 1;display:block;font-family:Twilio,monospace;font-variant-ligatures:common-ligatures contextual;letter-spacing:.1;line-height:2.2;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}
1
+ .code-block{border:1px solid var(--md-border,#3c3f47);border-radius:6px;height:700px;margin:16px 0;overflow:hidden}.code-block,.code-block-full{background:var(--md-bg,#1b1b1f);display:flex;flex-direction:column}.code-block-full{height:100vh;left:0;opacity:0;pointer-events:none;position:fixed;top:0;width:100vw;z-index:9999}.code-block-full-active{opacity:1;pointer-events:auto}.code-tabs{background:var(--md-bg-secondary,#22222a);border-bottom:1px solid var(--md-border,#3c3f47);display:flex;flex:0 0 auto;overflow-x:auto}.code-panel-preview{display:flex;flex:1 1 auto;height:1px}.full-button{background:none;border-right:0 solid var(--md-border,#3c3f47);border:solid var(--md-border,#3c3f47);border-radius:4px 0 0 0;border-width:0 1px 0 0;color:var(--md-text-muted,#9898a5);cursor:pointer;flex-shrink:0;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:12px;padding:6px 14px;transition:color .15s,border-color .15s;white-space:nowrap}.full-button:hover{color:var(--md-accent-focus,#539bf5)}.code-tab{background:none;border:none;border-bottom:2px solid transparent;color:var(--md-text-muted,#9898a5);cursor:pointer;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:13px;padding:8px 16px;white-space:nowrap}.code-tab:hover{background:var(--md-bg-code,#282c38);color:var(--md-text,#e1e1e5)}.code-tab-active{background:var(--md-bg,#1b1b1f);border-bottom-color:var(--md-accent-focus,#539bf5);color:var(--md-text,#e1e1e5);font-weight:500}.code-panel-preview .code-panel{flex:1 1 1px;margin-bottom:0;overflow:auto}.code-panel code.hljs{overflow-x:visible}.code-panel pre{font-size:13px;line-height:1.5;margin:0;padding:16px}.code-preview{flex:1 1 1px}:root{--md-text:#e1e1e5;--md-text-muted:#9898a5;--md-text-link:#6cb2ff;--md-bg:#1b1b1f;--md-bg-secondary:#22222a;--md-bg-code:#282c38;--md-bg-inline-code:#282c38;--md-bg-mark:#f2c94e26;--md-bg-transparent:transparent;--md-border:#3c3f47;--md-border-muted:#3c3f47b3;--md-accent-focus:#539bf5;--md-syntax-keyword:#ff7b72;--md-syntax-string:#9ecbff;--md-syntax-number:#7ac0ff;--md-syntax-function:#d2a8ff;--md-syntax-builtin:#7ee787;--md-syntax-variable:#ffa860;--md-syntax-meta:#f2cc60;--md-code-comment:#565f89;--md-code-red:#f7768e;--md-code-orange:#ff9e64;--md-code-yellow:#e0af68;--md-code-cyan:#2ac3de;--md-code-blue:#7dcfff;--md-code-teal:#73daca;--md-code-green:#9ece6a;--md-code-indigo:#7aa2f7;--md-code-purple:#bb9af7;--md-code-punctuation:#c0caf5;--md-code-text:#9aa5ce;--md-diff-del-text:#ffdcd7;--md-diff-del-bg:#5c1a1e;--md-diff-add-text:#aff5b4;--md-diff-add-bg:#0d3b20;--md-diff-changed-text:#ffdfb6;--md-diff-changed-bg:#5c2d0e;--md-diff-meta-bg:#1a5fb4;--md-danger-fg:#f85149;--md-danger-bg:#a12525;--md-alert-note-border:#539bf5;--md-alert-note-title:#6cb2ff;--md-alert-important-border:#986ee2;--md-alert-important-title:#b992f8;--md-alert-warning-border:#b0881a;--md-alert-warning-title:#e0b044;--md-alert-tip-border:#2ea855;--md-alert-tip-title:#4ec96a;--md-alert-caution-border:#e04a45;--md-alert-caution-title:#f85149;--md-scrollbar-thumb:#dfdfdf59;--md-scrollbar-track:#2d2d36;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;word-wrap:break-word;background-color:var(--md-bg);color:var(--md-text);color-scheme:dark;flex:1 1 auto;font-family:Yu Mincho,STSong,华文宋体,serif,-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;font-weight:400;line-height:1.5;margin:0}:root[data-theme=light]{--md-text:#2f2a24;--md-text-muted:#746a5f;--md-text-link:#8a4f2b;--md-bg:#eee6da;--md-bg-secondary:#eadbca;--md-bg-code:#e0d3c2;--md-bg-inline-code:#e0d3c2;--md-bg-mark:#e1c789;--md-border:#cdbcaa;--md-border-muted:#d8c8b7;--md-accent-focus:#9f5f38;--md-syntax-keyword:#9b1f2e;--md-syntax-string:#176226;--md-syntax-number:#85400f;--md-syntax-function:#0f5f95;--md-syntax-builtin:#0a6657;--md-syntax-variable:#6c2698;--md-syntax-meta:#744c0c;--md-code-comment:#746b62;--md-code-red:#ad3744;--md-code-orange:#98551f;--md-code-yellow:#84601f;--md-code-cyan:#1f7467;--md-code-blue:#2c719a;--md-code-teal:#1f7467;--md-code-green:#32733c;--md-code-indigo:#3f67af;--md-code-purple:#8248ac;--md-code-punctuation:#6f655b;--md-code-text:#5f554b;--md-diff-del-text:#7c2f28;--md-diff-del-bg:#efd8d2;--md-diff-add-text:#365f35;--md-diff-add-bg:#dbe7d4;--md-diff-changed-text:#7a5520;--md-diff-changed-bg:#efe0c6;--md-diff-meta-bg:#d9d1c4;--md-danger-fg:#a13d33;--md-danger-bg:#efd8d2;--md-alert-note-border:#9f5f38;--md-alert-note-title:#8a4f2b;--md-alert-important-border:#7a5f8f;--md-alert-important-title:#704f8a;--md-alert-warning-border:#9a6a2f;--md-alert-warning-title:#8b5e28;--md-alert-tip-border:#5f7b4a;--md-alert-tip-title:#4f6f45;--md-alert-caution-border:#a13d33;--md-alert-caution-title:#a13d33;--md-scrollbar-thumb:#c1ae98;--md-scrollbar-track:#e4d8c8;color-scheme:light}*{scrollbar-color:var(--md-scrollbar-thumb) var(--md-scrollbar-track);scrollbar-width:thin}.markdown-body a{text-decoration:underline;text-underline-offset:.2rem}.markdown{align-items:flex-start;display:flex;gap:24px;justify-content:space-between}.markdown-body{flex:1 1 auto;min-width:0}.markdown-aside{flex:0 0 220px;max-height:calc(100vh - 32px);overflow-y:auto;position:sticky;scrollbar-color:var(--md-border) transparent;scrollbar-width:thin;top:0;width:220px}.markdown-aside-content{position:relative}.markdown-aside-border{background:var(--md-border);bottom:0;left:2.5px;pointer-events:none;position:absolute;top:0;width:1px;z-index:0}.markdown-aside-indicator{background:var(--md-accent-focus);border-radius:999px;height:25px;left:1px;margin-bottom:-25px;opacity:0;pointer-events:none;position:relative;top:0;transition:transform .2s ease,height .2s ease,opacity .15s ease;width:4px;z-index:1}.markdown-aside-indicator-active{opacity:1}.markdown-aside-item{border-radius:4px;color:var(--md-text-muted);display:block;line-height:1.35;margin:1px 0 1px 12px;overflow-wrap:anywhere;padding:4px 8px 4px 12px;position:relative;text-decoration:none;transition:color .15s,background-color .15s;z-index:2}.markdown-aside-item:hover{text-decoration:none}.markdown-aside-item-active,.markdown-aside-item:hover{background-color:var(--md-bg-secondary);color:var(--md-text)}.markdown-aside-item-active{font-weight:600}.markdown-aside-depth-1{font-size:14px;font-weight:600}.markdown-aside-depth-2{font-size:13px;font-weight:500;padding-left:20px}.markdown-aside-depth-3{font-size:12px;opacity:.9;padding-left:32px}.markdown-aside-depth-4,.markdown-aside-depth-5,.markdown-aside-depth-6{font-size:12px;opacity:.75;padding-left:44px}@media (max-width:960px){.markdown{display:block}.markdown-aside{display:none}}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{background-color:currentColor;content:" ";display:inline-block;height:16px;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0z"/></svg>');mask-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 0 0 1.06 1.06l1.25-1.25a2 2 0 1 1 2.83 2.83l-2.5 2.5a2 2 0 0 1-2.83 0 .75.75 0 0 0-1.06 1.06 3.5 3.5 0 0 0 4.95 0l2.5-2.5a3.5 3.5 0 0 0-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 0 1 0-2.83l2.5-2.5a2 2 0 0 1 2.83 0 .75.75 0 0 0 1.06-1.06 3.5 3.5 0 0 0-4.95 0l-2.5 2.5a3.5 3.5 0 0 0 4.95 4.95l1.25-1.25a.75.75 0 0 0-1.06-1.06l-1.25 1.25a2 2 0 0 1-2.83 0z"/></svg>');width:16px}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:var(--md-bg-transparent);color:var(--md-text-link);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:600}.markdown-body dfn{font-style:italic}.markdown-body h1{font-size:2em;margin:.67em 0;padding-bottom:.3em}.markdown-body mark{background-color:var(--md-bg-mark);color:var(--md-text)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;box-sizing:content-box;max-width:100%}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em 2.5rem}.markdown-body hr{background:var(--md-bg-transparent);background-color:var(--md-border);border:0;box-sizing:content-box;height:.25em;margin:1.5rem 0;overflow:hidden;padding:0}.markdown-body input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button;appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::placeholder{color:var(--md-text-muted);opacity:1}.markdown-body hr:after,.markdown-body hr:before{content:"";display:table}.markdown-body hr:after{clear:both}.markdown-body table{border-collapse:collapse;border-spacing:0;display:block;font-variant:tabular-nums;max-width:100%;overflow:auto;width:max-content}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body [role=button]:focus,.markdown-body a:focus,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=radio]:focus{box-shadow:none;outline:2px solid var(--borderColor-accent-emphasis);outline-offset:-2px}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}.markdown-body [role=button]:focus-visible,.markdown-body a:focus-visible,.markdown-body input[type=checkbox]:focus-visible,.markdown-body input[type=radio]:focus-visible{box-shadow:none;outline:2px solid var(--borderColor-accent-emphasis);outline-offset:-2px}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible{outline-offset:0}.markdown-body kbd{background-color:var(--md-bg-secondary);border-bottom-color:var(--borderColor-muted);border:1px solid var(--borderColor-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-muted);color:var(--md-text);display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:.25rem;vertical-align:middle}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:500;letter-spacing:.05em;line-height:1.25;margin-bottom:1rem;margin-top:1.5rem}.markdown-body h2{font-size:1.5em;padding-bottom:.3em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:var(--md-text-muted);font-size:.85em}.markdown-body p{margin-bottom:10px;margin-top:0}.markdown-body blockquote{border-left:.25em solid var(--md-border);color:var(--md-text-muted);margin:0;padding:0 1em}.markdown-body ol,.markdown-body ul{margin-bottom:0;margin-top:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ol ol ol,.markdown-body ol ul ol,.markdown-body ul ol ol,.markdown-body ul ul ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body code,.markdown-body pre,.markdown-body samp,.markdown-body tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}.markdown-body pre{word-wrap:normal;margin-bottom:0;margin-top:0}.markdown-body .octicon{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}.markdown-body input::-webkit-inner-spin-button,.markdown-body input::-webkit-outer-spin-button{appearance:none;margin:0}.markdown-body .mr-2{margin-right:.5rem!important}.markdown-body:after,.markdown-body:before{content:"";display:table}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--md-danger-fg)}.markdown-body .anchor{float:left;line-height:1;margin-left:-20px;padding-right:.25rem}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body details,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-bottom:1rem;margin-top:0}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--md-text);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit;padding:0 .2em}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{border-bottom:0;padding-bottom:0}.markdown-body ol.no-list,.markdown-body ul.no-list{list-style-type:none;padding:0}.markdown-body ol[type="a s"]{list-style-type:lower-alpha}.markdown-body ol[type="A s"]{list-style-type:upper-alpha}.markdown-body ol[type="i s"]{list-style-type:lower-roman}.markdown-body ol[type="I s"]{list-style-type:upper-roman}.markdown-body div>ol:not([type]),.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-bottom:0;margin-top:0}.markdown-body li>p{margin-top:1rem}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:600;margin-top:1rem;padding:0}.markdown-body dl dd{margin-bottom:1rem;padding:0 1rem}.markdown-body table th{font-weight:600}.markdown-body table td,.markdown-body table th{border:1px solid var(--md-border);padding:6px 13px}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--md-bg);border-top:1px solid var(--md-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--md-bg-secondary)}.markdown-body table img{background-color:var(--md-bg-transparent)}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{background-color:var(--md-bg-transparent);max-width:none;vertical-align:text-top}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{border:1px solid var(--md-border);display:block;float:left;margin:13px 0 0;overflow:hidden;padding:7px;width:auto}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{clear:both;color:var(--md-text);display:block;padding:5px 0 0}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body p>code{background-color:var(--md-bg-inline-code)}.markdown-body code,.markdown-body tt{background-color:var(--md-bg-code);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em;white-space:break-spaces}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{background:var(--md-bg-transparent);border:0;margin:0;padding:0;white-space:pre;word-break:normal}.markdown-body .highlight{margin-bottom:1rem}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{background-color:var(--md-bg-secondary);border-radius:6px;color:var(--md-text);font-size:85%;line-height:1.45;overflow:auto;padding:1rem}.markdown-body pre code,.markdown-body pre tt{word-wrap:normal;background-color:var(--md-bg-transparent);border:0;display:inline;line-height:inherit;margin:0;overflow:visible;padding:0}.markdown-body .csv-data td,.markdown-body .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{background:var(--md-bg);border:0;padding:10px .5rem 9px;text-align:right}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{background:var(--md-bg-secondary);border-top:0;font-weight:600}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{border-top:1px solid var(--md-border);color:var(--md-text-muted);font-size:12px}.markdown-body .footnotes ol{padding-left:1rem}.markdown-body .footnotes ol ul{display:inline-block;margin-top:1rem;padding-left:1rem}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{border:2px solid var(--md-accent-focus);border-radius:6px;bottom:-.5rem;content:"";left:-1.5rem;pointer-events:none;position:absolute;right:-.5rem;top:-.5rem}.markdown-body .footnotes li:target{color:var(--md-text)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .pl-c{color:var(--md-text-muted)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--md-syntax-number)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--md-syntax-function)}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:var(--md-text)}.markdown-body .pl-ent{color:var(--md-syntax-builtin)}.markdown-body .pl-k{color:var(--md-syntax-keyword)}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:var(--md-syntax-string)}.markdown-body .pl-smw,.markdown-body .pl-v{color:var(--md-syntax-variable)}.markdown-body .pl-bu{color:var(--md-danger-fg)}.markdown-body .pl-ii{background-color:var(--bgColor-danger-muted);color:var(--fgColor-danger)}.markdown-body .pl-c2{background-color:var(--md-danger-bg);color:var(--md-text)}.markdown-body .pl-sr .pl-cce{color:var(--md-syntax-builtin);font-weight:700}.markdown-body .pl-ml{color:var(--md-syntax-meta)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:var(--md-accent-focus);font-weight:700}.markdown-body .pl-mi{color:var(--md-text);font-style:italic}.markdown-body .pl-mb{color:var(--md-text);font-weight:700}.markdown-body .pl-md{background-color:var(--md-diff-del-bg);color:var(--md-diff-del-text)}.markdown-body .pl-mi1{background-color:var(--md-diff-add-bg);color:var(--md-diff-add-text)}.markdown-body .pl-mc{background-color:var(--md-diff-changed-bg);color:var(--md-diff-changed-text)}.markdown-body .pl-mi2{background-color:var(--md-diff-meta-bg);color:var(--md-text)}.markdown-body .pl-mdr{color:var(--md-syntax-function);font-weight:700}.markdown-body .pl-ba{color:var(--md-text-muted)}.markdown-body .pl-sg{color:var(--md-border)}.markdown-body .pl-corl{color:var(--md-syntax-string);text-decoration:underline}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible),.markdown-body button:focus:not(:focus-visible),.markdown-body summary:focus:not(:focus-visible){box-shadow:none;outline:none}.markdown-body [tabindex="0"]:focus:not(:focus-visible),.markdown-body details-dialog:focus:not(:focus-visible){outline:none}.markdown-body g-emoji{display:inline-block;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:400;line-height:1;min-width:1ch;vertical-align:-.075em}.markdown-body g-emoji img{height:1em;width:1em}.markdown-body a:has(>p,>div,>pre,>blockquote){display:block}.markdown-body a:has(>p,>div,>pre,>blockquote):not(:has(.snippet-clipboard-content,>pre)){width:fit-content}.markdown-body a:has(>p,>div,>pre,>blockquote):has(.snippet-clipboard-content,>pre):focus-visible{outline:2px solid var(--borderColor-accent-emphasis);outline-offset:2px}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:400}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:.25rem}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list:focus-within .task-list-item-convert-container,.markdown-body .contains-task-list:hover .task-list-item-convert-container{clip-path:none;display:block;height:24px;overflow:visible;width:auto}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}.markdown-body .markdown-alert{border-left:.25em solid var(--md-border);color:inherit;margin-bottom:1rem;padding:.5rem 1rem}.markdown-body .markdown-alert>:first-child{margin-top:0}.markdown-body .markdown-alert>:last-child{margin-bottom:0}.markdown-body .markdown-alert .markdown-alert-title{align-items:center;display:flex;font-weight:500;line-height:1}.markdown-body .markdown-alert.markdown-alert-note{border-left-color:var(--md-alert-note-border)}.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--md-text-link)}.markdown-body .markdown-alert.markdown-alert-important{border-left-color:var(--md-alert-important-border)}.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--md-alert-important-title)}.markdown-body .markdown-alert.markdown-alert-warning{border-left-color:var(--md-alert-warning-border)}.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--md-alert-warning-title)}.markdown-body .markdown-alert.markdown-alert-tip{border-left-color:var(--md-alert-tip-border)}.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--md-alert-tip-title)}.markdown-body .markdown-alert.markdown-alert-caution{border-left-color:var(--md-alert-caution-border)}.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--md-danger-fg)}.markdown-body>:first-child>.heading-element:first-child{margin-top:0!important}.markdown-body .highlight pre:has(+.zeroclipboard-container){min-height:52px}@font-face{font-family:Twilio;font-style:normal;font-weight:400;src:url(fonts/twilio.woff2) format("woff2")}pre code.hljs{-webkit-font-feature-settings:"calt" 1;font-feature-settings:"calt" 1;display:block;font-family:Twilio,monospace;font-variant-ligatures:common-ligatures contextual;letter-spacing:.1;line-height:2.2;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}
2
2
  /*!
3
3
  Theme: Tokyo-night-Dark
4
4
  origin: https://github.com/enkia/tokyo-night-vscode-theme
@@ -6,4 +6,4 @@
6
6
  Author: (c) Henri Vandersleyen <hvandersleyen@gmail.com>
7
7
  License: see project LICENSE
8
8
  Touched: 2022
9
- */.hljs-comment,.hljs-meta{color:#565f89}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:#f7768e}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:#ff9e64}.hljs-attribute,.hljs-built_in{color:#e0af68}.hljs-selector-tag{color:#2ac3de}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#7dcfff}.hljs-selector-tag{color:#73daca}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:#9ece6a}.hljs-code,.hljs-formula,.hljs-section{color:#7aa2f7}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:#bb9af7}.hljs-punctuation{color:#c0caf5}.hljs{background:#1a1b26;color:#9aa5ce}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}
9
+ */.hljs-comment,.hljs-meta{color:var(--md-code-comment)}.hljs-deletion,.hljs-doctag,.hljs-regexp,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-selector-pseudo,.hljs-tag,.hljs-template-tag,.hljs-variable.language_{color:var(--md-code-red)}.hljs-link,.hljs-literal,.hljs-number,.hljs-params,.hljs-template-variable,.hljs-type,.hljs-variable{color:var(--md-code-orange)}.hljs-attribute,.hljs-built_in{color:var(--md-code-yellow)}.hljs-selector-tag{color:var(--md-code-cyan)}.hljs-keyword,.hljs-property,.hljs-subst,.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:var(--md-code-blue)}.hljs-selector-tag{color:var(--md-code-teal)}.hljs-addition,.hljs-bullet,.hljs-quote,.hljs-string,.hljs-symbol{color:var(--md-code-green)}.hljs-code,.hljs-formula,.hljs-section{color:var(--md-code-indigo)}.hljs-attr,.hljs-char.escape_,.hljs-keyword,.hljs-name,.hljs-operator{color:var(--md-code-purple)}.hljs-punctuation{color:var(--md-code-punctuation)}.hljs{background:var(--md-bg-code);color:var(--md-code-text)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bobe-dom",
3
- "version": "0.0.68",
3
+ "version": "0.0.70",
4
4
  "type": "module",
5
5
  "main": "dist/bobe-dom.cjs",
6
6
  "module": "dist/bobe-dom.esm.js",
@@ -8,11 +8,14 @@
8
8
  "types": "dist/index.d.ts",
9
9
  "private": false,
10
10
  "dependencies": {
11
+ "@babel/parser": "^8.0.0",
12
+ "@iconify/utils": "^3.1.3",
11
13
  "gray-matter": "^4.0.3",
12
14
  "highlight.js": "^11.11.1",
13
15
  "htmlparser2": "^12.0.0",
16
+ "iconify-icon": "^3.0.2",
14
17
  "marked": "^18.0.4",
15
- "bobe": "0.0.68"
18
+ "bobe": "0.0.70"
16
19
  },
17
20
  "devDependencies": {
18
21
  "vitest": "^4.1.7"
@@ -28,6 +31,11 @@
28
31
  "import": "./dist/markdown.esm.js",
29
32
  "require": "./dist/markdown.cjs"
30
33
  },
34
+ "./plugin-iconify": {
35
+ "types": "./dist/iconify.d.ts",
36
+ "import": "./dist/iconify.esm.js",
37
+ "require": "./dist/iconify.cjs"
38
+ },
31
39
  "./plugin-markdown/code": {
32
40
  "types": "./dist/code.d.ts",
33
41
  "import": "./dist/code.esm.js",