@frontmcp/uipack 1.10.8 → 1.10.9-rc.2

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.
@@ -1,661 +1,3 @@
1
- // libs/uipack/src/resolver/cdn-registry.ts
2
- var DEFAULT_CDN_REGISTRY = {
3
- react: {
4
- packageName: "react",
5
- defaultVersion: "19.2.4",
6
- providers: {
7
- cloudflare: {
8
- url: "https://cdnjs.cloudflare.com/ajax/libs/react/19.2.4/umd/react.production.min.js",
9
- global: "React",
10
- crossorigin: "anonymous"
11
- },
12
- jsdelivr: {
13
- url: "https://cdn.jsdelivr.net/npm/react@19.2.4/umd/react.production.min.js",
14
- global: "React",
15
- crossorigin: "anonymous"
16
- },
17
- unpkg: {
18
- url: "https://unpkg.com/react@19.2.4/umd/react.production.min.js",
19
- global: "React",
20
- crossorigin: "anonymous"
21
- },
22
- "esm.sh": {
23
- url: "https://esm.sh/react@19.2.4",
24
- esm: true,
25
- crossorigin: "anonymous"
26
- }
27
- },
28
- preferredProviders: ["esm.sh", "cloudflare", "jsdelivr", "unpkg"],
29
- metadata: {
30
- description: "A JavaScript library for building user interfaces",
31
- homepage: "https://react.dev",
32
- license: "MIT"
33
- }
34
- },
35
- "react-dom": {
36
- packageName: "react-dom",
37
- defaultVersion: "19.2.4",
38
- providers: {
39
- cloudflare: {
40
- url: "https://cdnjs.cloudflare.com/ajax/libs/react-dom/19.2.4/umd/react-dom.production.min.js",
41
- global: "ReactDOM",
42
- crossorigin: "anonymous",
43
- peerDependencies: ["react"]
44
- },
45
- jsdelivr: {
46
- url: "https://cdn.jsdelivr.net/npm/react-dom@19.2.4/umd/react-dom.production.min.js",
47
- global: "ReactDOM",
48
- crossorigin: "anonymous",
49
- peerDependencies: ["react"]
50
- },
51
- unpkg: {
52
- url: "https://unpkg.com/react-dom@19.2.4/umd/react-dom.production.min.js",
53
- global: "ReactDOM",
54
- crossorigin: "anonymous",
55
- peerDependencies: ["react"]
56
- },
57
- "esm.sh": {
58
- url: "https://esm.sh/react-dom@19.2.4",
59
- esm: true,
60
- crossorigin: "anonymous",
61
- peerDependencies: ["react"]
62
- }
63
- },
64
- preferredProviders: ["esm.sh", "cloudflare", "jsdelivr", "unpkg"],
65
- metadata: {
66
- description: "React package for working with the DOM",
67
- homepage: "https://react.dev",
68
- license: "MIT"
69
- }
70
- },
71
- "chart.js": {
72
- packageName: "chart.js",
73
- defaultVersion: "4.5.1",
74
- providers: {
75
- cloudflare: {
76
- url: "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.5.1/chart.umd.min.js",
77
- global: "Chart",
78
- crossorigin: "anonymous"
79
- },
80
- jsdelivr: {
81
- url: "https://cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js",
82
- global: "Chart",
83
- crossorigin: "anonymous"
84
- },
85
- unpkg: {
86
- url: "https://unpkg.com/chart.js@4.5.1/dist/chart.umd.min.js",
87
- global: "Chart",
88
- crossorigin: "anonymous"
89
- }
90
- },
91
- preferredProviders: ["esm.sh", "cloudflare", "jsdelivr", "unpkg"],
92
- metadata: {
93
- description: "Simple yet flexible JavaScript charting library",
94
- homepage: "https://www.chartjs.org",
95
- license: "MIT"
96
- }
97
- },
98
- d3: {
99
- packageName: "d3",
100
- defaultVersion: "7.9.0",
101
- providers: {
102
- cloudflare: {
103
- url: "https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js",
104
- integrity: "sha512-vc58qvvBdrDR4etbxMdlTt4GBQk1qjvyORR2nrsPsFPyrs+/u5c3+1Ct6upOgdZoIl7eq6k3a1UPDSNAQi/32A==",
105
- global: "d3",
106
- crossorigin: "anonymous"
107
- },
108
- jsdelivr: {
109
- url: "https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js",
110
- global: "d3",
111
- crossorigin: "anonymous"
112
- },
113
- unpkg: {
114
- url: "https://unpkg.com/d3@7.9.0/dist/d3.min.js",
115
- global: "d3",
116
- crossorigin: "anonymous"
117
- }
118
- },
119
- preferredProviders: ["esm.sh", "cloudflare", "jsdelivr", "unpkg"],
120
- metadata: {
121
- description: "Data-Driven Documents",
122
- homepage: "https://d3js.org",
123
- license: "ISC"
124
- }
125
- },
126
- lodash: {
127
- packageName: "lodash",
128
- defaultVersion: "4.17.21",
129
- providers: {
130
- cloudflare: {
131
- url: "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js",
132
- integrity: "sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==",
133
- global: "_",
134
- crossorigin: "anonymous"
135
- },
136
- jsdelivr: {
137
- url: "https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js",
138
- global: "_",
139
- crossorigin: "anonymous"
140
- },
141
- unpkg: {
142
- url: "https://unpkg.com/lodash@4.17.21/lodash.min.js",
143
- global: "_",
144
- crossorigin: "anonymous"
145
- }
146
- },
147
- preferredProviders: ["esm.sh", "cloudflare", "jsdelivr", "unpkg"],
148
- metadata: {
149
- description: "A modern JavaScript utility library",
150
- homepage: "https://lodash.com",
151
- license: "MIT"
152
- }
153
- }
154
- };
155
- function lookupPackage(packageName, registry = DEFAULT_CDN_REGISTRY) {
156
- return registry[packageName];
157
- }
158
- function getPackageCDNUrl(packageName, providerOrder = ["esm.sh", "cloudflare", "jsdelivr", "unpkg"], registry = DEFAULT_CDN_REGISTRY) {
159
- const entry = lookupPackage(packageName, registry);
160
- if (!entry) return void 0;
161
- for (const provider of providerOrder) {
162
- const config = entry.providers[provider];
163
- if (config?.url) {
164
- return config.url;
165
- }
166
- }
167
- for (const provider of Object.keys(entry.providers)) {
168
- const config = entry.providers[provider];
169
- if (config?.url) {
170
- return config.url;
171
- }
172
- }
173
- return void 0;
174
- }
175
- function getRegisteredPackages(registry = DEFAULT_CDN_REGISTRY) {
176
- return Object.keys(registry);
177
- }
178
- function isPackageRegistered(packageName, registry = DEFAULT_CDN_REGISTRY) {
179
- return packageName in registry;
180
- }
181
- function mergeRegistries(customRegistry) {
182
- return {
183
- ...DEFAULT_CDN_REGISTRY,
184
- ...customRegistry
185
- };
186
- }
187
- function getPackagePeerDependencies(packageName, registry = DEFAULT_CDN_REGISTRY) {
188
- const entry = lookupPackage(packageName, registry);
189
- if (!entry) return [];
190
- for (const provider of Object.keys(entry.providers)) {
191
- const config = entry.providers[provider];
192
- if (config?.peerDependencies) {
193
- return config.peerDependencies;
194
- }
195
- }
196
- return [];
197
- }
198
-
199
- // libs/uipack/src/resolver/import-parser.ts
200
- var IMPORT_PATTERNS = {
201
- named: /import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,
202
- default: /import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,
203
- namespace: /import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,
204
- sideEffect: /import\s*['"]([^'"]+)['"]/g,
205
- dynamic: /(?:await\s+)?import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
206
- defaultAndNamed: /import\s+(\w+)\s*,\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,
207
- defaultAndNamespace: /import\s+(\w+)\s*,\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,
208
- reExport: /export\s*\{[^}]+\}\s*from\s*['"]([^'"]+)['"]/g,
209
- reExportAll: /export\s*\*\s*from\s*['"]([^'"]+)['"]/g
210
- };
211
- function parseNamedImports(namedString) {
212
- return namedString.split(",").map((s) => s.trim()).filter((s) => s.length > 0).map((s) => {
213
- const asMatch = s.match(/^(\w+)\s+as\s+\w+$/);
214
- return asMatch ? asMatch[1] : s;
215
- });
216
- }
217
- function isRelativeImport(specifier) {
218
- return specifier.startsWith("./") || specifier.startsWith("../") || specifier.startsWith("/");
219
- }
220
- function isExternalImport(specifier) {
221
- return !isRelativeImport(specifier) && !specifier.startsWith("#");
222
- }
223
- function getPackageName(specifier) {
224
- if (specifier.startsWith("@")) {
225
- const parts = specifier.split("/");
226
- if (parts.length >= 2) {
227
- return `${parts[0]}/${parts[1]}`;
228
- }
229
- return specifier;
230
- }
231
- const firstSlash = specifier.indexOf("/");
232
- return firstSlash === -1 ? specifier : specifier.slice(0, firstSlash);
233
- }
234
- function getLineNumber(source, index) {
235
- let line = 1;
236
- for (let i = 0; i < index && i < source.length; i++) {
237
- if (source[i] === "\n") {
238
- line++;
239
- }
240
- }
241
- return line;
242
- }
243
- function getColumnNumber(source, index) {
244
- let column = 0;
245
- for (let i = index - 1; i >= 0 && source[i] !== "\n"; i--) {
246
- column++;
247
- }
248
- return column;
249
- }
250
- function parseImports(source) {
251
- const imports = [];
252
- const seenStatements = /* @__PURE__ */ new Set();
253
- const addImport = (imp) => {
254
- const key = `${imp.type}:${imp.specifier}:${imp.statement}`;
255
- if (!seenStatements.has(key)) {
256
- seenStatements.add(key);
257
- imports.push(imp);
258
- }
259
- };
260
- let match;
261
- const defaultAndNamedRegex = new RegExp(IMPORT_PATTERNS.defaultAndNamed.source, "g");
262
- while ((match = defaultAndNamedRegex.exec(source)) !== null) {
263
- const [statement, defaultName, namedString, specifier] = match;
264
- addImport({
265
- statement,
266
- specifier,
267
- type: "default",
268
- defaultImport: defaultName,
269
- namedImports: parseNamedImports(namedString),
270
- line: getLineNumber(source, match.index),
271
- column: getColumnNumber(source, match.index)
272
- });
273
- }
274
- const defaultAndNamespaceRegex = new RegExp(IMPORT_PATTERNS.defaultAndNamespace.source, "g");
275
- while ((match = defaultAndNamespaceRegex.exec(source)) !== null) {
276
- const [statement, defaultName, namespaceName, specifier] = match;
277
- addImport({
278
- statement,
279
- specifier,
280
- type: "default",
281
- defaultImport: defaultName,
282
- namespaceImport: namespaceName,
283
- line: getLineNumber(source, match.index),
284
- column: getColumnNumber(source, match.index)
285
- });
286
- }
287
- const namedRegex = new RegExp(IMPORT_PATTERNS.named.source, "g");
288
- while ((match = namedRegex.exec(source)) !== null) {
289
- const [statement, namedString, specifier] = match;
290
- addImport({
291
- statement,
292
- specifier,
293
- type: "named",
294
- namedImports: parseNamedImports(namedString),
295
- line: getLineNumber(source, match.index),
296
- column: getColumnNumber(source, match.index)
297
- });
298
- }
299
- const defaultRegex = new RegExp(IMPORT_PATTERNS.default.source, "g");
300
- while ((match = defaultRegex.exec(source)) !== null) {
301
- const [statement, defaultName, specifier] = match;
302
- const afterMatch = source.slice(match.index + match[0].length - specifier.length - 2);
303
- if (afterMatch.startsWith(",")) continue;
304
- addImport({
305
- statement,
306
- specifier,
307
- type: "default",
308
- defaultImport: defaultName,
309
- line: getLineNumber(source, match.index),
310
- column: getColumnNumber(source, match.index)
311
- });
312
- }
313
- const namespaceRegex = new RegExp(IMPORT_PATTERNS.namespace.source, "g");
314
- while ((match = namespaceRegex.exec(source)) !== null) {
315
- const [statement, namespaceName, specifier] = match;
316
- addImport({
317
- statement,
318
- specifier,
319
- type: "namespace",
320
- namespaceImport: namespaceName,
321
- line: getLineNumber(source, match.index),
322
- column: getColumnNumber(source, match.index)
323
- });
324
- }
325
- const sideEffectRegex = new RegExp(IMPORT_PATTERNS.sideEffect.source, "g");
326
- while ((match = sideEffectRegex.exec(source)) !== null) {
327
- const [statement, specifier] = match;
328
- const beforeMatch = source.slice(Math.max(0, match.index - 50), match.index);
329
- if (beforeMatch.includes("from")) continue;
330
- addImport({
331
- statement,
332
- specifier,
333
- type: "side-effect",
334
- line: getLineNumber(source, match.index),
335
- column: getColumnNumber(source, match.index)
336
- });
337
- }
338
- const dynamicRegex = new RegExp(IMPORT_PATTERNS.dynamic.source, "g");
339
- while ((match = dynamicRegex.exec(source)) !== null) {
340
- const [statement, specifier] = match;
341
- addImport({
342
- statement,
343
- specifier,
344
- type: "dynamic",
345
- line: getLineNumber(source, match.index),
346
- column: getColumnNumber(source, match.index)
347
- });
348
- }
349
- const reExportRegex = new RegExp(IMPORT_PATTERNS.reExport.source, "g");
350
- while ((match = reExportRegex.exec(source)) !== null) {
351
- const [statement, specifier] = match;
352
- addImport({
353
- statement,
354
- specifier,
355
- type: "named",
356
- line: getLineNumber(source, match.index),
357
- column: getColumnNumber(source, match.index)
358
- });
359
- }
360
- const reExportAllRegex = new RegExp(IMPORT_PATTERNS.reExportAll.source, "g");
361
- while ((match = reExportAllRegex.exec(source)) !== null) {
362
- const [statement, specifier] = match;
363
- addImport({
364
- statement,
365
- specifier,
366
- type: "namespace",
367
- line: getLineNumber(source, match.index),
368
- column: getColumnNumber(source, match.index)
369
- });
370
- }
371
- const externalImports = imports.filter((imp) => isExternalImport(imp.specifier));
372
- const relativeImports = imports.filter((imp) => isRelativeImport(imp.specifier));
373
- const externalPackages = [...new Set(externalImports.map((imp) => getPackageName(imp.specifier)))];
374
- return {
375
- imports,
376
- externalImports,
377
- relativeImports,
378
- externalPackages
379
- };
380
- }
381
- function extractExternalPackages(source) {
382
- return parseImports(source).externalPackages;
383
- }
384
-
385
- // libs/uipack/src/resolver/esm-sh.resolver.ts
386
- var DEFAULT_FALLBACK_CDN = "https://esm.sh";
387
- function createResolverWithOverrides(overrides, baseOptions) {
388
- const base = createEsmShResolver(baseOptions);
389
- return {
390
- overrides,
391
- resolve(specifier, context) {
392
- if (overrides[specifier]) {
393
- return { value: overrides[specifier], type: "url" };
394
- }
395
- for (const [prefix, url] of Object.entries(overrides)) {
396
- if (specifier.startsWith(prefix + "/")) {
397
- const subpath = specifier.slice(prefix.length);
398
- return { value: url + subpath, type: "url" };
399
- }
400
- }
401
- return base.resolve(specifier, context);
402
- }
403
- };
404
- }
405
- function createEsmShResolver(options = {}) {
406
- const {
407
- fallbackCdnBase = DEFAULT_FALLBACK_CDN,
408
- registry = DEFAULT_CDN_REGISTRY,
409
- providerOrder = ["esm.sh", "cloudflare", "jsdelivr", "unpkg"]
410
- } = options;
411
- return {
412
- resolve(specifier, _context) {
413
- if (specifier.startsWith("./") || specifier.startsWith("../") || specifier.startsWith("/")) {
414
- return null;
415
- }
416
- if (specifier.startsWith("node:") || specifier.startsWith("#")) {
417
- return null;
418
- }
419
- const pkgName = getPackageName(specifier);
420
- const entry = lookupPackage(pkgName, registry);
421
- if (entry) {
422
- for (const provider of providerOrder) {
423
- const config = entry.providers[provider];
424
- if (config?.url) {
425
- const subpath = specifier.slice(pkgName.length);
426
- if (subpath && config.url.includes("esm.sh/")) {
427
- return {
428
- value: config.url + subpath,
429
- type: "url",
430
- integrity: config.integrity
431
- };
432
- }
433
- if (subpath) {
434
- return {
435
- value: `${fallbackCdnBase}/${specifier}`,
436
- type: "url"
437
- };
438
- }
439
- if (config.global && !config.esm) {
440
- return {
441
- value: config.url,
442
- type: "url",
443
- integrity: config.integrity
444
- };
445
- }
446
- return {
447
- value: config.url,
448
- type: "url",
449
- integrity: config.integrity
450
- };
451
- }
452
- }
453
- }
454
- return {
455
- value: `${fallbackCdnBase}/${specifier}`,
456
- type: "url"
457
- };
458
- }
459
- };
460
- }
461
-
462
- // libs/uipack/src/utils/index.ts
463
- function escapeHtmlAttr(str) {
464
- return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;");
465
- }
466
-
467
- // libs/uipack/src/resolver/import-map.ts
468
- function createImportMapFromResolved(resolved) {
469
- const imports = {};
470
- const integrity = {};
471
- for (const [specifier, res] of Object.entries(resolved)) {
472
- if (res.type === "url") {
473
- imports[specifier] = res.value;
474
- if (res.integrity) {
475
- integrity[res.value] = res.integrity;
476
- }
477
- }
478
- }
479
- return {
480
- imports,
481
- integrity: Object.keys(integrity).length > 0 ? integrity : void 0
482
- };
483
- }
484
- function createImportMap(dependencies) {
485
- const imports = {};
486
- const integrity = {};
487
- for (const dep of dependencies) {
488
- imports[dep.packageName] = dep.cdnUrl;
489
- if (dep.integrity) {
490
- integrity[dep.cdnUrl] = dep.integrity;
491
- }
492
- }
493
- return {
494
- imports,
495
- integrity: Object.keys(integrity).length > 0 ? integrity : void 0
496
- };
497
- }
498
- function mergeImportMaps(...maps) {
499
- const imports = {};
500
- const integrity = {};
501
- const scopes = {};
502
- for (const map of maps) {
503
- Object.assign(imports, map.imports);
504
- if (map.integrity) {
505
- Object.assign(integrity, map.integrity);
506
- }
507
- if (map.scopes) {
508
- for (const [scope, mappings] of Object.entries(map.scopes)) {
509
- scopes[scope] = { ...scopes[scope], ...mappings };
510
- }
511
- }
512
- }
513
- return {
514
- imports,
515
- integrity: Object.keys(integrity).length > 0 ? integrity : void 0,
516
- scopes: Object.keys(scopes).length > 0 ? scopes : void 0
517
- };
518
- }
519
- function generateImportMapScriptTag(map) {
520
- const json = JSON.stringify(map, null, 2).replace(/<\//g, "<\\/");
521
- return `<script type="importmap">
1
+ var DEFAULT_CDN_REGISTRY={react:{packageName:"react",defaultVersion:"19.2.4",providers:{cloudflare:{url:"https://cdnjs.cloudflare.com/ajax/libs/react/19.2.4/umd/react.production.min.js",global:"React",crossorigin:"anonymous"},jsdelivr:{url:"https://cdn.jsdelivr.net/npm/react@19.2.4/umd/react.production.min.js",global:"React",crossorigin:"anonymous"},unpkg:{url:"https://unpkg.com/react@19.2.4/umd/react.production.min.js",global:"React",crossorigin:"anonymous"},"esm.sh":{url:"https://esm.sh/react@19.2.4",esm:true,crossorigin:"anonymous"}},preferredProviders:["esm.sh","cloudflare","jsdelivr","unpkg"],metadata:{description:"A JavaScript library for building user interfaces",homepage:"https://react.dev",license:"MIT"}},"react-dom":{packageName:"react-dom",defaultVersion:"19.2.4",providers:{cloudflare:{url:"https://cdnjs.cloudflare.com/ajax/libs/react-dom/19.2.4/umd/react-dom.production.min.js",global:"ReactDOM",crossorigin:"anonymous",peerDependencies:["react"]},jsdelivr:{url:"https://cdn.jsdelivr.net/npm/react-dom@19.2.4/umd/react-dom.production.min.js",global:"ReactDOM",crossorigin:"anonymous",peerDependencies:["react"]},unpkg:{url:"https://unpkg.com/react-dom@19.2.4/umd/react-dom.production.min.js",global:"ReactDOM",crossorigin:"anonymous",peerDependencies:["react"]},"esm.sh":{url:"https://esm.sh/react-dom@19.2.4",esm:true,crossorigin:"anonymous",peerDependencies:["react"]}},preferredProviders:["esm.sh","cloudflare","jsdelivr","unpkg"],metadata:{description:"React package for working with the DOM",homepage:"https://react.dev",license:"MIT"}},"chart.js":{packageName:"chart.js",defaultVersion:"4.5.1",providers:{cloudflare:{url:"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.5.1/chart.umd.min.js",global:"Chart",crossorigin:"anonymous"},jsdelivr:{url:"https://cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js",global:"Chart",crossorigin:"anonymous"},unpkg:{url:"https://unpkg.com/chart.js@4.5.1/dist/chart.umd.min.js",global:"Chart",crossorigin:"anonymous"}},preferredProviders:["esm.sh","cloudflare","jsdelivr","unpkg"],metadata:{description:"Simple yet flexible JavaScript charting library",homepage:"https://www.chartjs.org",license:"MIT"}},d3:{packageName:"d3",defaultVersion:"7.9.0",providers:{cloudflare:{url:"https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js",integrity:"sha512-vc58qvvBdrDR4etbxMdlTt4GBQk1qjvyORR2nrsPsFPyrs+/u5c3+1Ct6upOgdZoIl7eq6k3a1UPDSNAQi/32A==",global:"d3",crossorigin:"anonymous"},jsdelivr:{url:"https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js",global:"d3",crossorigin:"anonymous"},unpkg:{url:"https://unpkg.com/d3@7.9.0/dist/d3.min.js",global:"d3",crossorigin:"anonymous"}},preferredProviders:["esm.sh","cloudflare","jsdelivr","unpkg"],metadata:{description:"Data-Driven Documents",homepage:"https://d3js.org",license:"ISC"}},lodash:{packageName:"lodash",defaultVersion:"4.17.21",providers:{cloudflare:{url:"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js",integrity:"sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==",global:"_",crossorigin:"anonymous"},jsdelivr:{url:"https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js",global:"_",crossorigin:"anonymous"},unpkg:{url:"https://unpkg.com/lodash@4.17.21/lodash.min.js",global:"_",crossorigin:"anonymous"}},preferredProviders:["esm.sh","cloudflare","jsdelivr","unpkg"],metadata:{description:"A modern JavaScript utility library",homepage:"https://lodash.com",license:"MIT"}}};function lookupPackage(packageName,registry=DEFAULT_CDN_REGISTRY){return registry[packageName]}function getPackageCDNUrl(packageName,providerOrder=["esm.sh","cloudflare","jsdelivr","unpkg"],registry=DEFAULT_CDN_REGISTRY){const entry=lookupPackage(packageName,registry);if(!entry)return void 0;for(const provider of providerOrder){const config=entry.providers[provider];if(config?.url){return config.url}}for(const provider of Object.keys(entry.providers)){const config=entry.providers[provider];if(config?.url){return config.url}}return void 0}function getRegisteredPackages(registry=DEFAULT_CDN_REGISTRY){return Object.keys(registry)}function isPackageRegistered(packageName,registry=DEFAULT_CDN_REGISTRY){return packageName in registry}function mergeRegistries(customRegistry){return{...DEFAULT_CDN_REGISTRY,...customRegistry}}function getPackagePeerDependencies(packageName,registry=DEFAULT_CDN_REGISTRY){const entry=lookupPackage(packageName,registry);if(!entry)return[];for(const provider of Object.keys(entry.providers)){const config=entry.providers[provider];if(config?.peerDependencies){return config.peerDependencies}}return[]}var IMPORT_PATTERNS={named:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,default:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,namespace:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sideEffect:/import\s*['"]([^'"]+)['"]/g,dynamic:/(?:await\s+)?import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,defaultAndNamed:/import\s+(\w+)\s*,\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,defaultAndNamespace:/import\s+(\w+)\s*,\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,reExport:/export\s*\{[^}]+\}\s*from\s*['"]([^'"]+)['"]/g,reExportAll:/export\s*\*\s*from\s*['"]([^'"]+)['"]/g};function parseNamedImports(namedString){return namedString.split(",").map(s=>s.trim()).filter(s=>s.length>0).map(s=>{const asMatch=s.match(/^(\w+)\s+as\s+\w+$/);return asMatch?asMatch[1]:s})}function isRelativeImport(specifier){return specifier.startsWith("./")||specifier.startsWith("../")||specifier.startsWith("/")}function isExternalImport(specifier){return!isRelativeImport(specifier)&&!specifier.startsWith("#")}function getPackageName(specifier){if(specifier.startsWith("@")){const parts=specifier.split("/");if(parts.length>=2){return`${parts[0]}/${parts[1]}`}return specifier}const firstSlash=specifier.indexOf("/");return firstSlash===-1?specifier:specifier.slice(0,firstSlash)}function getLineNumber(source,index){let line=1;for(let i=0;i<index&&i<source.length;i++){if(source[i]==="\n"){line++}}return line}function getColumnNumber(source,index){let column=0;for(let i=index-1;i>=0&&source[i]!=="\n";i--){column++}return column}function parseImports(source){const imports=[];const seenStatements=new Set;const addImport=imp=>{const key=`${imp.type}:${imp.specifier}:${imp.statement}`;if(!seenStatements.has(key)){seenStatements.add(key);imports.push(imp)}};let match;const defaultAndNamedRegex=new RegExp(IMPORT_PATTERNS.defaultAndNamed.source,"g");while((match=defaultAndNamedRegex.exec(source))!==null){const[statement,defaultName,namedString,specifier]=match;addImport({statement,specifier,type:"default",defaultImport:defaultName,namedImports:parseNamedImports(namedString),line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const defaultAndNamespaceRegex=new RegExp(IMPORT_PATTERNS.defaultAndNamespace.source,"g");while((match=defaultAndNamespaceRegex.exec(source))!==null){const[statement,defaultName,namespaceName,specifier]=match;addImport({statement,specifier,type:"default",defaultImport:defaultName,namespaceImport:namespaceName,line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const namedRegex=new RegExp(IMPORT_PATTERNS.named.source,"g");while((match=namedRegex.exec(source))!==null){const[statement,namedString,specifier]=match;addImport({statement,specifier,type:"named",namedImports:parseNamedImports(namedString),line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const defaultRegex=new RegExp(IMPORT_PATTERNS.default.source,"g");while((match=defaultRegex.exec(source))!==null){const[statement,defaultName,specifier]=match;const afterMatch=source.slice(match.index+match[0].length-specifier.length-2);if(afterMatch.startsWith(","))continue;addImport({statement,specifier,type:"default",defaultImport:defaultName,line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const namespaceRegex=new RegExp(IMPORT_PATTERNS.namespace.source,"g");while((match=namespaceRegex.exec(source))!==null){const[statement,namespaceName,specifier]=match;addImport({statement,specifier,type:"namespace",namespaceImport:namespaceName,line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const sideEffectRegex=new RegExp(IMPORT_PATTERNS.sideEffect.source,"g");while((match=sideEffectRegex.exec(source))!==null){const[statement,specifier]=match;const beforeMatch=source.slice(Math.max(0,match.index-50),match.index);if(beforeMatch.includes("from"))continue;addImport({statement,specifier,type:"side-effect",line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const dynamicRegex=new RegExp(IMPORT_PATTERNS.dynamic.source,"g");while((match=dynamicRegex.exec(source))!==null){const[statement,specifier]=match;addImport({statement,specifier,type:"dynamic",line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const reExportRegex=new RegExp(IMPORT_PATTERNS.reExport.source,"g");while((match=reExportRegex.exec(source))!==null){const[statement,specifier]=match;addImport({statement,specifier,type:"named",line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const reExportAllRegex=new RegExp(IMPORT_PATTERNS.reExportAll.source,"g");while((match=reExportAllRegex.exec(source))!==null){const[statement,specifier]=match;addImport({statement,specifier,type:"namespace",line:getLineNumber(source,match.index),column:getColumnNumber(source,match.index)})}const externalImports=imports.filter(imp=>isExternalImport(imp.specifier));const relativeImports=imports.filter(imp=>isRelativeImport(imp.specifier));const externalPackages=[...new Set(externalImports.map(imp=>getPackageName(imp.specifier)))];return{imports,externalImports,relativeImports,externalPackages}}function extractExternalPackages(source){return parseImports(source).externalPackages}var DEFAULT_FALLBACK_CDN="https://esm.sh";function createResolverWithOverrides(overrides,baseOptions){const base=createEsmShResolver(baseOptions);return{overrides,resolve(specifier,context){if(overrides[specifier]){return{value:overrides[specifier],type:"url"}}for(const[prefix,url]of Object.entries(overrides)){if(specifier.startsWith(prefix+"/")){const subpath=specifier.slice(prefix.length);return{value:url+subpath,type:"url"}}}return base.resolve(specifier,context)}}}function createEsmShResolver(options={}){const{fallbackCdnBase=DEFAULT_FALLBACK_CDN,registry=DEFAULT_CDN_REGISTRY,providerOrder=["esm.sh","cloudflare","jsdelivr","unpkg"]}=options;return{resolve(specifier,_context){if(specifier.startsWith("./")||specifier.startsWith("../")||specifier.startsWith("/")){return null}if(specifier.startsWith("node:")||specifier.startsWith("#")){return null}const pkgName=getPackageName(specifier);const entry=lookupPackage(pkgName,registry);if(entry){for(const provider of providerOrder){const config=entry.providers[provider];if(config?.url){const subpath=specifier.slice(pkgName.length);if(subpath&&config.url.includes("esm.sh/")){return{value:config.url+subpath,type:"url",integrity:config.integrity}}if(subpath){return{value:`${fallbackCdnBase}/${specifier}`,type:"url"}}if(config.global&&!config.esm){return{value:config.url,type:"url",integrity:config.integrity}}return{value:config.url,type:"url",integrity:config.integrity}}}}return{value:`${fallbackCdnBase}/${specifier}`,type:"url"}}}}function escapeHtmlAttr(str){return str.replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function createImportMapFromResolved(resolved){const imports={};const integrity={};for(const[specifier,res]of Object.entries(resolved)){if(res.type==="url"){imports[specifier]=res.value;if(res.integrity){integrity[res.value]=res.integrity}}}return{imports,integrity:Object.keys(integrity).length>0?integrity:void 0}}function createImportMap(dependencies){const imports={};const integrity={};for(const dep of dependencies){imports[dep.packageName]=dep.cdnUrl;if(dep.integrity){integrity[dep.cdnUrl]=dep.integrity}}return{imports,integrity:Object.keys(integrity).length>0?integrity:void 0}}function mergeImportMaps(...maps){const imports={};const integrity={};const scopes={};for(const map of maps){Object.assign(imports,map.imports);if(map.integrity){Object.assign(integrity,map.integrity)}if(map.scopes){for(const[scope,mappings]of Object.entries(map.scopes)){scopes[scope]={...scopes[scope],...mappings}}}}return{imports,integrity:Object.keys(integrity).length>0?integrity:void 0,scopes:Object.keys(scopes).length>0?scopes:void 0}}function generateImportMapScriptTag(map){const json=JSON.stringify(map,null,2).replace(/<\//g,"<\\/");return`<script type="importmap">
522
2
  ${json}
523
- </script>`;
524
- }
525
- function generateImportMapScriptTagMinified(map) {
526
- const json = JSON.stringify(map).replace(/<\//g, "<\\/");
527
- return `<script type="importmap">${json}</script>`;
528
- }
529
- function generateCDNScriptTags(dependencies) {
530
- return dependencies.filter((dep) => !dep.esm).map((dep) => {
531
- const attrs = [`src="${escapeHtmlAttr(dep.cdnUrl)}"`];
532
- if (dep.integrity) {
533
- attrs.push(`integrity="${escapeHtmlAttr(dep.integrity)}"`);
534
- }
535
- attrs.push('crossorigin="anonymous"');
536
- return `<script ${attrs.join(" ")}></script>`;
537
- });
538
- }
539
- function generateDependencyHTML(dependencies, options = {}) {
540
- const { minify = false } = options;
541
- const parts = [];
542
- const importMap = createImportMap(dependencies);
543
- const importMapTag = minify ? generateImportMapScriptTagMinified(importMap) : generateImportMapScriptTag(importMap);
544
- parts.push(importMapTag);
545
- const umdTags = generateCDNScriptTags(dependencies);
546
- parts.push(...umdTags);
547
- return parts.join(minify ? "" : "\n");
548
- }
549
- function validateImportMap(map) {
550
- const errors = [];
551
- if (typeof map !== "object" || map === null) {
552
- return { valid: false, errors: ["Import map must be an object"] };
553
- }
554
- const obj = map;
555
- if (!obj["imports"]) {
556
- errors.push('Import map must have an "imports" field');
557
- } else if (typeof obj["imports"] !== "object" || obj["imports"] === null) {
558
- errors.push('"imports" must be an object');
559
- } else {
560
- const imports = obj["imports"];
561
- for (const [key, value] of Object.entries(imports)) {
562
- if (typeof value !== "string") {
563
- errors.push(`Import "${key}" must map to a string URL`);
564
- } else if (!value.startsWith("https://")) {
565
- errors.push(`Import "${key}" URL must use HTTPS: ${value}`);
566
- }
567
- }
568
- }
569
- if (obj["integrity"] !== void 0) {
570
- if (typeof obj["integrity"] !== "object" || obj["integrity"] === null) {
571
- errors.push('"integrity" must be an object');
572
- } else {
573
- const integrity = obj["integrity"];
574
- for (const [url, hash] of Object.entries(integrity)) {
575
- if (typeof hash !== "string") {
576
- errors.push(`Integrity for "${url}" must be a string`);
577
- } else if (!hash.match(/^sha(256|384|512)-/)) {
578
- errors.push(`Invalid integrity hash format for "${url}": ${hash}`);
579
- }
580
- }
581
- }
582
- }
583
- return { valid: errors.length === 0, errors };
584
- }
585
-
586
- // libs/uipack/src/resolver/import-rewriter.ts
587
- function rewriteImports(source, options = {}) {
588
- const { resolver = createEsmShResolver(), skipPackages = [], overrides = {} } = options;
589
- const skipSet = new Set(skipPackages);
590
- const rewrites = /* @__PURE__ */ new Map();
591
- const fallbackPackages = [];
592
- const parsed = parseImports(source);
593
- const specifierMap = /* @__PURE__ */ new Map();
594
- for (const imp of parsed.externalImports) {
595
- const specifier = imp.specifier;
596
- if (specifierMap.has(specifier)) continue;
597
- if (specifier.startsWith("node:")) continue;
598
- const pkgName = getPackageName(specifier);
599
- if (skipSet.has(pkgName)) continue;
600
- if (overrides[specifier]) {
601
- specifierMap.set(specifier, overrides[specifier]);
602
- continue;
603
- }
604
- if (overrides[pkgName]) {
605
- const subpath = specifier.slice(pkgName.length);
606
- specifierMap.set(specifier, overrides[pkgName] + subpath);
607
- continue;
608
- }
609
- const resolved = resolver.resolve(specifier);
610
- if (resolved && resolved.type === "url") {
611
- specifierMap.set(specifier, resolved.value);
612
- }
613
- }
614
- let code = source;
615
- for (const [specifier, cdnUrl] of specifierMap) {
616
- const escaped = escapeRegExp(specifier);
617
- const singleQuotePattern = new RegExp(`((?:import|export)\\s+(?:[^'"]*\\s+)?from\\s+)'${escaped}'`, "g");
618
- const doubleQuotePattern = new RegExp(`((?:import|export)\\s+(?:[^'"]*\\s+)?from\\s+)"${escaped}"`, "g");
619
- const dynamicSinglePattern = new RegExp(`(import\\s*\\(\\s*)'${escaped}'`, "g");
620
- const dynamicDoublePattern = new RegExp(`(import\\s*\\(\\s*)"${escaped}"`, "g");
621
- const sideEffectSinglePattern = new RegExp(`(import\\s+)'${escaped}'`, "g");
622
- const sideEffectDoublePattern = new RegExp(`(import\\s+)"${escaped}"`, "g");
623
- const beforeLength = code.length;
624
- code = code.replace(singleQuotePattern, `$1'${cdnUrl}'`).replace(doubleQuotePattern, `$1"${cdnUrl}"`).replace(dynamicSinglePattern, `$1'${cdnUrl}'`).replace(dynamicDoublePattern, `$1"${cdnUrl}"`).replace(sideEffectSinglePattern, `$1'${cdnUrl}'`).replace(sideEffectDoublePattern, `$1"${cdnUrl}"`);
625
- if (code.length !== beforeLength || code !== source) {
626
- rewrites.set(specifier, cdnUrl);
627
- }
628
- }
629
- return {
630
- code,
631
- rewrittenCount: rewrites.size,
632
- rewrites,
633
- fallbackPackages
634
- };
635
- }
636
- function escapeRegExp(str) {
637
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
638
- }
639
- export {
640
- DEFAULT_CDN_REGISTRY,
641
- createEsmShResolver,
642
- createImportMap,
643
- createImportMapFromResolved,
644
- createResolverWithOverrides,
645
- extractExternalPackages,
646
- generateCDNScriptTags,
647
- generateDependencyHTML,
648
- generateImportMapScriptTag,
649
- generateImportMapScriptTagMinified,
650
- getPackageCDNUrl,
651
- getPackageName,
652
- getPackagePeerDependencies,
653
- getRegisteredPackages,
654
- isPackageRegistered,
655
- lookupPackage,
656
- mergeImportMaps,
657
- mergeRegistries,
658
- parseImports,
659
- rewriteImports,
660
- validateImportMap
661
- };
3
+ </script>`}function generateImportMapScriptTagMinified(map){const json=JSON.stringify(map).replace(/<\//g,"<\\/");return`<script type="importmap">${json}</script>`}function generateCDNScriptTags(dependencies){return dependencies.filter(dep=>!dep.esm).map(dep=>{const attrs=[`src="${escapeHtmlAttr(dep.cdnUrl)}"`];if(dep.integrity){attrs.push(`integrity="${escapeHtmlAttr(dep.integrity)}"`)}attrs.push('crossorigin="anonymous"');return`<script ${attrs.join(" ")}></script>`})}function generateDependencyHTML(dependencies,options={}){const{minify=false}=options;const parts=[];const importMap=createImportMap(dependencies);const importMapTag=minify?generateImportMapScriptTagMinified(importMap):generateImportMapScriptTag(importMap);parts.push(importMapTag);const umdTags=generateCDNScriptTags(dependencies);parts.push(...umdTags);return parts.join(minify?"":"\n")}function validateImportMap(map){const errors=[];if(typeof map!=="object"||map===null){return{valid:false,errors:["Import map must be an object"]}}const obj=map;if(!obj["imports"]){errors.push('Import map must have an "imports" field')}else if(typeof obj["imports"]!=="object"||obj["imports"]===null){errors.push('"imports" must be an object')}else{const imports=obj["imports"];for(const[key,value]of Object.entries(imports)){if(typeof value!=="string"){errors.push(`Import "${key}" must map to a string URL`)}else if(!value.startsWith("https://")){errors.push(`Import "${key}" URL must use HTTPS: ${value}`)}}}if(obj["integrity"]!==void 0){if(typeof obj["integrity"]!=="object"||obj["integrity"]===null){errors.push('"integrity" must be an object')}else{const integrity=obj["integrity"];for(const[url,hash]of Object.entries(integrity)){if(typeof hash!=="string"){errors.push(`Integrity for "${url}" must be a string`)}else if(!hash.match(/^sha(256|384|512)-/)){errors.push(`Invalid integrity hash format for "${url}": ${hash}`)}}}}return{valid:errors.length===0,errors}}function rewriteImports(source,options={}){const{resolver=createEsmShResolver(),skipPackages=[],overrides={}}=options;const skipSet=new Set(skipPackages);const rewrites=new Map;const fallbackPackages=[];const parsed=parseImports(source);const specifierMap=new Map;for(const imp of parsed.externalImports){const specifier=imp.specifier;if(specifierMap.has(specifier))continue;if(specifier.startsWith("node:"))continue;const pkgName=getPackageName(specifier);if(skipSet.has(pkgName))continue;if(overrides[specifier]){specifierMap.set(specifier,overrides[specifier]);continue}if(overrides[pkgName]){const subpath=specifier.slice(pkgName.length);specifierMap.set(specifier,overrides[pkgName]+subpath);continue}const resolved=resolver.resolve(specifier);if(resolved&&resolved.type==="url"){specifierMap.set(specifier,resolved.value)}}let code=source;for(const[specifier,cdnUrl]of specifierMap){const escaped=escapeRegExp(specifier);const singleQuotePattern=new RegExp(`((?:import|export)\\s+(?:[^'"]*\\s+)?from\\s+)'${escaped}'`,"g");const doubleQuotePattern=new RegExp(`((?:import|export)\\s+(?:[^'"]*\\s+)?from\\s+)"${escaped}"`,"g");const dynamicSinglePattern=new RegExp(`(import\\s*\\(\\s*)'${escaped}'`,"g");const dynamicDoublePattern=new RegExp(`(import\\s*\\(\\s*)"${escaped}"`,"g");const sideEffectSinglePattern=new RegExp(`(import\\s+)'${escaped}'`,"g");const sideEffectDoublePattern=new RegExp(`(import\\s+)"${escaped}"`,"g");const beforeLength=code.length;code=code.replace(singleQuotePattern,`$1'${cdnUrl}'`).replace(doubleQuotePattern,`$1"${cdnUrl}"`).replace(dynamicSinglePattern,`$1'${cdnUrl}'`).replace(dynamicDoublePattern,`$1"${cdnUrl}"`).replace(sideEffectSinglePattern,`$1'${cdnUrl}'`).replace(sideEffectDoublePattern,`$1"${cdnUrl}"`);if(code.length!==beforeLength||code!==source){rewrites.set(specifier,cdnUrl)}}return{code,rewrittenCount:rewrites.size,rewrites,fallbackPackages}}function escapeRegExp(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}export{DEFAULT_CDN_REGISTRY,createEsmShResolver,createImportMap,createImportMapFromResolved,createResolverWithOverrides,extractExternalPackages,generateCDNScriptTags,generateDependencyHTML,generateImportMapScriptTag,generateImportMapScriptTagMinified,getPackageCDNUrl,getPackageName,getPackagePeerDependencies,getRegisteredPackages,isPackageRegistered,lookupPackage,mergeImportMaps,mergeRegistries,parseImports,rewriteImports,validateImportMap};