@pinepaper.studio/mcp-server 1.6.20 → 1.6.21

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.
Files changed (91) hide show
  1. package/README.de.md +1 -1
  2. package/README.es.md +1 -1
  3. package/README.fr.md +1 -1
  4. package/README.hi.md +1 -1
  5. package/README.ja.md +1 -1
  6. package/README.ko.md +1 -1
  7. package/README.md +79 -5
  8. package/README.pt-BR.md +1 -1
  9. package/README.zh-CN.md +1 -1
  10. package/dist/build-info.json +3 -3
  11. package/dist/ontology/upstream-vocabulary.d.ts +2 -2
  12. package/dist/ontology/upstream-vocabulary.js +3 -3
  13. package/dist/ontology/upstream-vocabulary.js.map +1 -1
  14. package/dist/ontology/vocabulary.js +1 -1
  15. package/dist/ontology/vocabulary.js.map +1 -1
  16. package/dist/tools/choreograph.d.ts.map +1 -1
  17. package/dist/tools/choreograph.js +10 -0
  18. package/dist/tools/choreograph.js.map +1 -1
  19. package/dist/tools/craft-tools.d.ts +55 -0
  20. package/dist/tools/craft-tools.d.ts.map +1 -0
  21. package/dist/tools/craft-tools.js +139 -0
  22. package/dist/tools/craft-tools.js.map +1 -0
  23. package/dist/tools/definitions.d.ts.map +1 -1
  24. package/dist/tools/definitions.js +117 -7
  25. package/dist/tools/definitions.js.map +1 -1
  26. package/dist/tools/effect-class.d.ts.map +1 -1
  27. package/dist/tools/effect-class.js +6 -0
  28. package/dist/tools/effect-class.js.map +1 -1
  29. package/dist/tools/engine-lists.d.ts +2 -2
  30. package/dist/tools/engine-lists.js +2 -2
  31. package/dist/tools/engine-methods.d.ts.map +1 -1
  32. package/dist/tools/engine-methods.js +4 -0
  33. package/dist/tools/engine-methods.js.map +1 -1
  34. package/dist/tools/engine-surface.d.ts +1 -1
  35. package/dist/tools/engine-surface.d.ts.map +1 -1
  36. package/dist/tools/engine-surface.js +38 -5
  37. package/dist/tools/engine-surface.js.map +1 -1
  38. package/dist/tools/handlers/generate.d.ts +28 -28
  39. package/dist/tools/handlers.d.ts.map +1 -1
  40. package/dist/tools/handlers.js +125 -1
  41. package/dist/tools/handlers.js.map +1 -1
  42. package/dist/tools/minimal-descriptions.d.ts.map +1 -1
  43. package/dist/tools/minimal-descriptions.js +7 -0
  44. package/dist/tools/minimal-descriptions.js.map +1 -1
  45. package/dist/tools/shape-params.d.ts +2 -2
  46. package/dist/tools/shape-params.d.ts.map +1 -1
  47. package/dist/tools/shape-params.js +3 -2
  48. package/dist/tools/shape-params.js.map +1 -1
  49. package/dist/tools/stick-vocabulary.d.ts +1 -1
  50. package/dist/tools/stick-vocabulary.js +1 -1
  51. package/dist/tools/toolkits.d.ts.map +1 -1
  52. package/dist/tools/toolkits.js +9 -0
  53. package/dist/tools/toolkits.js.map +1 -1
  54. package/dist/types/code-generator.d.ts +10 -1
  55. package/dist/types/code-generator.d.ts.map +1 -1
  56. package/dist/types/code-generator.js +605 -107
  57. package/dist/types/code-generator.js.map +1 -1
  58. package/dist/types/schemas.d.ts +1745 -582
  59. package/dist/types/schemas.d.ts.map +1 -1
  60. package/dist/types/schemas.js +144 -4
  61. package/dist/types/schemas.js.map +1 -1
  62. package/dist/vendor/design/design-style.d.ts +2 -2
  63. package/dist/vendor/design/design-style.d.ts.map +1 -1
  64. package/dist/vendor/design/design-style.js +7 -2
  65. package/dist/vendor/design/design-style.js.map +1 -1
  66. package/dist/vendor/design/subdivision-tool-schema.d.ts +16 -0
  67. package/dist/vendor/design/subdivision-tool-schema.d.ts.map +1 -0
  68. package/dist/vendor/design/subdivision-tool-schema.js +104 -0
  69. package/dist/vendor/design/subdivision-tool-schema.js.map +1 -0
  70. package/dist/vendor/design/textile-tool-schema.d.ts +14 -0
  71. package/dist/vendor/design/textile-tool-schema.d.ts.map +1 -0
  72. package/dist/vendor/design/textile-tool-schema.js +195 -0
  73. package/dist/vendor/design/textile-tool-schema.js.map +1 -0
  74. package/dist/vendor/design/ui-kit-runtime.d.ts +49 -0
  75. package/dist/vendor/design/ui-kit-runtime.d.ts.map +1 -0
  76. package/dist/vendor/design/ui-kit-runtime.js +761 -0
  77. package/dist/vendor/design/ui-kit-runtime.js.map +1 -0
  78. package/dist/vendor/design/ui-kit-tool-schema.d.ts +280 -0
  79. package/dist/vendor/design/ui-kit-tool-schema.d.ts.map +1 -0
  80. package/dist/vendor/design/ui-kit-tool-schema.js +209 -0
  81. package/dist/vendor/design/ui-kit-tool-schema.js.map +1 -0
  82. package/manifest.json +29 -1
  83. package/package.json +2 -2
  84. package/dist/assets/repositories/openclipart.d.ts +0 -41
  85. package/dist/assets/repositories/openclipart.d.ts.map +0 -1
  86. package/dist/assets/repositories/openclipart.js +0 -139
  87. package/dist/assets/repositories/openclipart.js.map +0 -1
  88. package/dist/assets/repositories/svgrepo.d.ts +0 -61
  89. package/dist/assets/repositories/svgrepo.d.ts.map +0 -1
  90. package/dist/assets/repositories/svgrepo.js +0 -276
  91. package/dist/assets/repositories/svgrepo.js.map +0 -1
@@ -1,139 +0,0 @@
1
- /**
2
- * OpenClipart Asset Repository Adapter
3
- *
4
- * Fetches SVG assets from openclipart.org
5
- * Repository info: 150,000+ public domain clipart (CC0 license)
6
- */
7
- /**
8
- * OpenClipart adapter
9
- *
10
- * Uses the OpenClipart API to search and download public domain SVG clipart
11
- */
12
- export class OpenClipartAdapter {
13
- name = 'openclipart';
14
- baseUrl = 'https://openclipart.org';
15
- apiUrl = 'https://openclipart.org/search/json';
16
- /**
17
- * Search for assets on OpenClipart
18
- *
19
- * @param query Search term
20
- * @param limit Maximum results to return
21
- */
22
- async search(query, limit) {
23
- try {
24
- // OpenClipart API endpoint
25
- const searchUrl = `${this.apiUrl}?query=${encodeURIComponent(query)}&amount=${limit}`;
26
- const response = await fetch(searchUrl, {
27
- headers: {
28
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
29
- },
30
- });
31
- if (!response.ok) {
32
- throw new Error(`OpenClipart search failed: ${response.status} ${response.statusText}`);
33
- }
34
- const data = (await response.json());
35
- if (!data.payload || !Array.isArray(data.payload)) {
36
- return [];
37
- }
38
- // Convert to AssetResult format
39
- return data.payload.slice(0, limit).map((item) => ({
40
- id: `openclipart_${item.id}`,
41
- repository: 'openclipart',
42
- title: item.title || 'Untitled',
43
- description: item.description || `${item.title} from OpenClipart`,
44
- previewUrl: item.png_thumb?.url || item.svg?.url || '',
45
- downloadUrl: item.svg?.url || '',
46
- license: {
47
- type: 'CC0',
48
- name: 'Public Domain (CC0)',
49
- requiresAttribution: false,
50
- allowsCommercial: true,
51
- url: 'https://creativecommons.org/publicdomain/zero/1.0/',
52
- },
53
- tags: item.tags || [query],
54
- author: item.uploader?.name,
55
- }));
56
- }
57
- catch (error) {
58
- console.error('[OpenClipartAdapter] Search error:', error);
59
- throw error;
60
- }
61
- }
62
- /**
63
- * Download SVG content
64
- *
65
- * @param assetId Asset ID from search results
66
- */
67
- async download(assetId) {
68
- try {
69
- // For OpenClipart, the download URL should be stored with the asset
70
- // If we need to fetch it, we'd query the API again
71
- const clipartId = assetId.replace('openclipart_', '');
72
- // Fetch the detail page to get download URL
73
- const detailUrl = `${this.baseUrl}/detail/${clipartId}`;
74
- const response = await fetch(detailUrl, {
75
- headers: {
76
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
77
- },
78
- });
79
- if (!response.ok) {
80
- throw new Error(`Failed to fetch detail page: ${response.status}`);
81
- }
82
- const html = await response.text();
83
- // Extract SVG download URL from page
84
- const svgUrlMatch = html.match(/href="([^"]*\.svg)"/i);
85
- if (!svgUrlMatch) {
86
- throw new Error('Could not find SVG download URL');
87
- }
88
- const svgUrl = svgUrlMatch[1].startsWith('http')
89
- ? svgUrlMatch[1]
90
- : `${this.baseUrl}${svgUrlMatch[1]}`;
91
- // Download the SVG
92
- const svgResponse = await fetch(svgUrl, {
93
- headers: {
94
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
95
- },
96
- });
97
- if (!svgResponse.ok) {
98
- throw new Error(`Failed to download SVG: ${svgResponse.status}`);
99
- }
100
- const svg = await svgResponse.text();
101
- // Validate SVG
102
- if (!svg.trim().startsWith('<svg') && !svg.includes('<svg')) {
103
- throw new Error('Downloaded content is not valid SVG');
104
- }
105
- return svg;
106
- }
107
- catch (error) {
108
- console.error('[OpenClipartAdapter] Download error:', error);
109
- throw error;
110
- }
111
- }
112
- /**
113
- * Get asset metadata
114
- *
115
- * @param assetId Asset ID
116
- */
117
- async getMetadata(assetId) {
118
- return {
119
- id: assetId,
120
- repository: this.name,
121
- title: assetId.replace('openclipart_', ''),
122
- license: {
123
- type: 'CC0',
124
- name: 'Public Domain (CC0)',
125
- requiresAttribution: false,
126
- allowsCommercial: true,
127
- url: 'https://creativecommons.org/publicdomain/zero/1.0/',
128
- },
129
- downloadedAt: Date.now(),
130
- };
131
- }
132
- }
133
- /**
134
- * Create OpenClipart adapter instance
135
- */
136
- export function createOpenClipartAdapter() {
137
- return new OpenClipartAdapter();
138
- }
139
- //# sourceMappingURL=openclipart.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openclipart.js","sourceRoot":"","sources":["../../../src/assets/repositories/openclipart.ts"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- /**
2
- * SVGRepo Asset Repository Adapter
3
- *
4
- * Fetches SVG assets from svgrepo.com
5
- * Repository info: 500,000+ free SVG icons with various licenses
6
- */
7
- import { AssetRepository, AssetResult, AssetMetadata } from '../types.js';
8
- /**
9
- * SVGRepo adapter - Real implementation
10
- *
11
- * Searches and downloads SVG assets from svgrepo.com
12
- */
13
- export declare class SVGRepoAdapter implements AssetRepository {
14
- name: string;
15
- private baseUrl;
16
- private searchUrl;
17
- /**
18
- * Search for assets on SVGRepo
19
- *
20
- * @param query Search term (e.g., "rocket", "heart")
21
- * @param limit Maximum results to return
22
- */
23
- search(query: string, limit: number): Promise<AssetResult[]>;
24
- /**
25
- * Download SVG content
26
- *
27
- * @param assetId Asset ID from search results (format: svgrepo_12345_slug)
28
- */
29
- download(assetId: string): Promise<string>;
30
- /**
31
- * Get asset metadata
32
- *
33
- * @param assetId Asset ID
34
- */
35
- getMetadata(assetId: string): Promise<AssetMetadata>;
36
- /**
37
- * Parse search results from HTML
38
- */
39
- private parseSearchResults;
40
- /**
41
- * Parse license information from page HTML
42
- */
43
- private parseLicenseFromPage;
44
- /**
45
- * Extract download URL from asset page
46
- */
47
- private extractDownloadUrl;
48
- /**
49
- * Convert asset URL to asset ID
50
- */
51
- private urlToAssetId;
52
- /**
53
- * Convert asset ID back to URL
54
- */
55
- private assetIdToUrl;
56
- }
57
- /**
58
- * Create SVGRepo adapter instance
59
- */
60
- export declare function createSVGRepoAdapter(): AssetRepository;
61
- //# sourceMappingURL=svgrepo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"svgrepo.d.ts","sourceRoot":"","sources":["../../../src/assets/repositories/svgrepo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAWxF;;;;GAIG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,IAAI,SAAa;IAEjB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAqC;IAEtD;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAwClE;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkDhD;;;;OAIG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA+C1D;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6C1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,YAAY;CAQrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,CAEtD"}
@@ -1,276 +0,0 @@
1
- /**
2
- * SVGRepo Asset Repository Adapter
3
- *
4
- * Fetches SVG assets from svgrepo.com
5
- * Repository info: 500,000+ free SVG icons with various licenses
6
- */
7
- /**
8
- * SVGRepo adapter - Real implementation
9
- *
10
- * Searches and downloads SVG assets from svgrepo.com
11
- */
12
- export class SVGRepoAdapter {
13
- name = 'svgrepo';
14
- baseUrl = 'https://www.svgrepo.com';
15
- searchUrl = 'https://www.svgrepo.com/vectors';
16
- /**
17
- * Search for assets on SVGRepo
18
- *
19
- * @param query Search term (e.g., "rocket", "heart")
20
- * @param limit Maximum results to return
21
- */
22
- async search(query, limit) {
23
- try {
24
- // Encode query for URL
25
- const encodedQuery = encodeURIComponent(query);
26
- const searchUrl = `${this.searchUrl}/${encodedQuery}/1/`;
27
- // Fetch search results page
28
- const response = await fetch(searchUrl, {
29
- headers: {
30
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
31
- },
32
- });
33
- if (!response.ok) {
34
- throw new Error(`SVGRepo search failed: ${response.status} ${response.statusText}`);
35
- }
36
- const html = await response.text();
37
- // Parse HTML to extract results
38
- const results = this.parseSearchResults(html, limit);
39
- // Convert to AssetResult format
40
- return results.map((result) => ({
41
- id: this.urlToAssetId(result.url),
42
- repository: 'svgrepo',
43
- title: result.title,
44
- description: `${result.title} from SVGRepo`,
45
- previewUrl: result.previewUrl,
46
- downloadUrl: result.url,
47
- license: this.parseLicenseFromPage(html), // Default license
48
- tags: [query],
49
- }));
50
- }
51
- catch (error) {
52
- console.error('[SVGRepoAdapter] Search error:', error);
53
- // Rethrow: the AssetManager reports this source as 'error' by name
54
- throw error;
55
- }
56
- }
57
- /**
58
- * Download SVG content
59
- *
60
- * @param assetId Asset ID from search results (format: svgrepo_12345_slug)
61
- */
62
- async download(assetId) {
63
- try {
64
- // Convert asset ID back to URL
65
- const url = this.assetIdToUrl(assetId);
66
- // Fetch the asset page to get download link
67
- const pageResponse = await fetch(url, {
68
- headers: {
69
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
70
- },
71
- });
72
- if (!pageResponse.ok) {
73
- throw new Error(`Failed to fetch asset page: ${pageResponse.status}`);
74
- }
75
- const html = await pageResponse.text();
76
- // Extract download URL from page
77
- const downloadUrl = this.extractDownloadUrl(html, url);
78
- if (!downloadUrl) {
79
- throw new Error('Could not find download URL in page');
80
- }
81
- // Download the SVG file
82
- const svgResponse = await fetch(downloadUrl, {
83
- headers: {
84
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
85
- },
86
- });
87
- if (!svgResponse.ok) {
88
- throw new Error(`Failed to download SVG: ${svgResponse.status}`);
89
- }
90
- const svg = await svgResponse.text();
91
- // Validate it's actually SVG
92
- if (!svg.trim().startsWith('<svg') && !svg.includes('<svg')) {
93
- throw new Error('Downloaded content is not valid SVG');
94
- }
95
- return svg;
96
- }
97
- catch (error) {
98
- console.error('[SVGRepoAdapter] Download error:', error);
99
- throw error;
100
- }
101
- }
102
- /**
103
- * Get asset metadata
104
- *
105
- * @param assetId Asset ID
106
- */
107
- async getMetadata(assetId) {
108
- try {
109
- const url = this.assetIdToUrl(assetId);
110
- // Fetch page to extract metadata
111
- const response = await fetch(url, {
112
- headers: {
113
- 'User-Agent': 'PinePaper-MCP-Server/1.2.2',
114
- },
115
- });
116
- const html = await response.text();
117
- // Extract title
118
- const titleMatch = html.match(/<title>([^<]+)<\/title>/i);
119
- const title = titleMatch
120
- ? titleMatch[1].replace(' SVG Vector', '').replace(' - SVG Repo', '').trim()
121
- : assetId;
122
- // Extract license info
123
- const license = this.parseLicenseFromPage(html);
124
- return {
125
- id: assetId,
126
- repository: this.name,
127
- title,
128
- license,
129
- downloadedAt: Date.now(),
130
- };
131
- }
132
- catch (error) {
133
- console.error('[SVGRepoAdapter] Metadata error:', error);
134
- // Return minimal metadata on error
135
- return {
136
- id: assetId,
137
- repository: this.name,
138
- title: assetId,
139
- license: {
140
- type: 'Unknown',
141
- name: 'Unknown License',
142
- requiresAttribution: true,
143
- allowsCommercial: false,
144
- },
145
- downloadedAt: Date.now(),
146
- };
147
- }
148
- }
149
- /**
150
- * Parse search results from HTML
151
- */
152
- parseSearchResults(html, limit) {
153
- const results = [];
154
- // Look for SVG result cards in the HTML
155
- // Pattern: <a href="/svg/123456/icon-name">
156
- const linkRegex = /<a[^>]+href="(\/svg\/[^"]+)"[^>]*>/gi;
157
- const titleRegex = /title="([^"]+)"/i;
158
- const imgRegex = /<img[^>]+src="([^"]+)"/i;
159
- let match;
160
- const seenUrls = new Set();
161
- while ((match = linkRegex.exec(html)) !== null && results.length < limit) {
162
- const relativeUrl = match[1];
163
- const fullUrl = `${this.baseUrl}${relativeUrl}`;
164
- // Skip duplicates
165
- if (seenUrls.has(fullUrl))
166
- continue;
167
- seenUrls.add(fullUrl);
168
- // Get the surrounding HTML to extract title and image
169
- const startIdx = match.index;
170
- const endIdx = Math.min(startIdx + 500, html.length);
171
- const surroundingHtml = html.substring(startIdx, endIdx);
172
- // Extract title
173
- const titleMatch = surroundingHtml.match(titleRegex);
174
- const title = titleMatch
175
- ? titleMatch[1].replace(' SVG Vector', '').replace(' SVG File', '').trim()
176
- : relativeUrl.split('/').pop() || 'Untitled';
177
- // Extract preview image
178
- const imgMatch = surroundingHtml.match(imgRegex);
179
- const previewUrl = imgMatch ? imgMatch[1] : '';
180
- results.push({
181
- url: fullUrl,
182
- title,
183
- previewUrl: previewUrl.startsWith('http') ? previewUrl : `${this.baseUrl}${previewUrl}`,
184
- });
185
- }
186
- return results;
187
- }
188
- /**
189
- * Parse license information from page HTML
190
- */
191
- parseLicenseFromPage(html) {
192
- // Look for license information in the HTML
193
- if (html.includes('CC0') || html.includes('Public Domain')) {
194
- return {
195
- type: 'CC0',
196
- name: 'Public Domain (CC0)',
197
- requiresAttribution: false,
198
- allowsCommercial: true,
199
- url: 'https://creativecommons.org/publicdomain/zero/1.0/',
200
- };
201
- }
202
- if (html.includes('CC-BY')) {
203
- return {
204
- type: 'CC-BY-4.0',
205
- name: 'Creative Commons Attribution 4.0',
206
- requiresAttribution: true,
207
- allowsCommercial: true,
208
- url: 'https://creativecommons.org/licenses/by/4.0/',
209
- };
210
- }
211
- // Default to requiring attribution to be safe
212
- return {
213
- type: 'Mixed',
214
- name: 'Mixed Licenses (check individual asset)',
215
- requiresAttribution: true,
216
- allowsCommercial: true,
217
- url: this.baseUrl,
218
- };
219
- }
220
- /**
221
- * Extract download URL from asset page
222
- */
223
- extractDownloadUrl(html, assetUrl) {
224
- // Try to find direct download link
225
- // SVGRepo typically has download buttons with specific patterns
226
- const downloadMatch = html.match(/href="([^"]*download[^"]*)"/i);
227
- if (downloadMatch) {
228
- const url = downloadMatch[1];
229
- return url.startsWith('http') ? url : `${this.baseUrl}${url}`;
230
- }
231
- // Alternative: look for .svg file links
232
- const svgMatch = html.match(/href="([^"]*\.svg)"/i);
233
- if (svgMatch) {
234
- const url = svgMatch[1];
235
- return url.startsWith('http') ? url : `${this.baseUrl}${url}`;
236
- }
237
- // Fallback: try to construct download URL from asset URL
238
- // Pattern: /svg/123456/name -> /download/123456/name.svg
239
- const idMatch = assetUrl.match(/\/svg\/(\d+)\/([^/]+)/);
240
- if (idMatch) {
241
- return `${this.baseUrl}/download/${idMatch[1]}/${idMatch[2]}.svg`;
242
- }
243
- return null;
244
- }
245
- /**
246
- * Convert asset URL to asset ID
247
- */
248
- urlToAssetId(url) {
249
- // Extract ID and slug from URL
250
- // Format: https://www.svgrepo.com/svg/123456/icon-name
251
- const match = url.match(/\/svg\/(\d+)\/([^/]+)/);
252
- if (match) {
253
- return `svgrepo_${match[1]}_${match[2]}`;
254
- }
255
- // Fallback
256
- return `svgrepo_${Date.now()}`;
257
- }
258
- /**
259
- * Convert asset ID back to URL
260
- */
261
- assetIdToUrl(assetId) {
262
- // Format: svgrepo_123456_icon-name -> https://www.svgrepo.com/svg/123456/icon-name
263
- const match = assetId.match(/svgrepo_(\d+)_(.+)/);
264
- if (match) {
265
- return `${this.baseUrl}/svg/${match[1]}/${match[2]}`;
266
- }
267
- throw new Error(`Invalid SVGRepo asset ID format: ${assetId}`);
268
- }
269
- }
270
- /**
271
- * Create SVGRepo adapter instance
272
- */
273
- export function createSVGRepoAdapter() {
274
- return new SVGRepoAdapter();
275
- }
276
- //# sourceMappingURL=svgrepo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"svgrepo.js","sourceRoot":"","sources":["../../../src/assets/repositories/svgrepo.ts"],"names":[],"mappings":"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"}