@vibe-agent-toolkit/resources 0.1.11 → 0.1.12

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,96 @@
1
+ /**
2
+ * Cache entry for external link validation results
3
+ */
4
+ interface CacheEntry {
5
+ statusCode: number;
6
+ statusMessage: string;
7
+ timestamp: number;
8
+ }
9
+ /**
10
+ * External link validation cache
11
+ *
12
+ * Stores results of external URL checks to minimize redundant network requests.
13
+ * Uses file-based storage for persistence across runs.
14
+ *
15
+ * Cache keys are SHA-256 hashes of normalized URLs to handle long URLs and
16
+ * special characters safely in filenames.
17
+ *
18
+ * Example:
19
+ * ```typescript
20
+ * const cache = new ExternalLinkCache('/tmp/cache', 24);
21
+ *
22
+ * // Store a result
23
+ * await cache.set('https://example.com', 200, 'OK');
24
+ *
25
+ * // Retrieve a result
26
+ * const result = await cache.get('https://example.com');
27
+ * if (result) {
28
+ * console.log(`Status: ${result.statusCode}`);
29
+ * }
30
+ * ```
31
+ */
32
+ export declare class ExternalLinkCache {
33
+ private readonly cacheDir;
34
+ private readonly ttlHours;
35
+ private readonly cacheFile;
36
+ private cache;
37
+ /**
38
+ * Create a new external link cache
39
+ *
40
+ * @param cacheDir - Directory to store cache files
41
+ * @param ttlHours - Time-to-live in hours (default: 24)
42
+ */
43
+ constructor(cacheDir: string, ttlHours?: number);
44
+ /**
45
+ * Load cache from disk
46
+ */
47
+ private loadCache;
48
+ /**
49
+ * Save cache to disk
50
+ */
51
+ private saveCache;
52
+ /**
53
+ * Normalize URL for caching
54
+ *
55
+ * Removes trailing slashes and anchors to treat variations as the same URL.
56
+ */
57
+ private normalizeUrl;
58
+ /**
59
+ * Generate cache key for URL
60
+ *
61
+ * Uses SHA-256 hash to handle long URLs and special characters.
62
+ */
63
+ private getCacheKey;
64
+ /**
65
+ * Check if cache entry is expired
66
+ */
67
+ private isExpired;
68
+ /**
69
+ * Get cached result for URL
70
+ *
71
+ * @param url - URL to look up
72
+ * @returns Cache entry or null if not found/expired
73
+ */
74
+ get(url: string): Promise<CacheEntry | null>;
75
+ /**
76
+ * Store validation result in cache
77
+ *
78
+ * @param url - URL to cache
79
+ * @param statusCode - HTTP status code
80
+ * @param statusMessage - HTTP status message
81
+ */
82
+ set(url: string, statusCode: number, statusMessage: string): Promise<void>;
83
+ /**
84
+ * Clear all cache entries
85
+ */
86
+ clear(): Promise<void>;
87
+ /**
88
+ * Get cache statistics
89
+ */
90
+ getStats(): Promise<{
91
+ total: number;
92
+ expired: number;
93
+ }>;
94
+ }
95
+ export {};
96
+ //# sourceMappingURL=external-link-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-link-cache.d.ts","sourceRoot":"","sources":["../src/external-link-cache.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,UAAU,UAAU;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB;AASD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAA0B;IAEvC;;;;;OAKG;gBACS,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAK;IAM3C;;OAEG;YACW,SAAS;IAsBvB;;OAEG;YACW,SAAS;IAWvB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAiBpB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkBlD;;;;;;OAMG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAiB7D"}
@@ -0,0 +1,183 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ /**
5
+ * External link validation cache
6
+ *
7
+ * Stores results of external URL checks to minimize redundant network requests.
8
+ * Uses file-based storage for persistence across runs.
9
+ *
10
+ * Cache keys are SHA-256 hashes of normalized URLs to handle long URLs and
11
+ * special characters safely in filenames.
12
+ *
13
+ * Example:
14
+ * ```typescript
15
+ * const cache = new ExternalLinkCache('/tmp/cache', 24);
16
+ *
17
+ * // Store a result
18
+ * await cache.set('https://example.com', 200, 'OK');
19
+ *
20
+ * // Retrieve a result
21
+ * const result = await cache.get('https://example.com');
22
+ * if (result) {
23
+ * console.log(`Status: ${result.statusCode}`);
24
+ * }
25
+ * ```
26
+ */
27
+ export class ExternalLinkCache {
28
+ cacheDir;
29
+ ttlHours;
30
+ cacheFile;
31
+ cache = null;
32
+ /**
33
+ * Create a new external link cache
34
+ *
35
+ * @param cacheDir - Directory to store cache files
36
+ * @param ttlHours - Time-to-live in hours (default: 24)
37
+ */
38
+ constructor(cacheDir, ttlHours = 24) {
39
+ this.cacheDir = cacheDir;
40
+ this.ttlHours = ttlHours;
41
+ this.cacheFile = path.join(cacheDir, 'external-links.json');
42
+ }
43
+ /**
44
+ * Load cache from disk
45
+ */
46
+ async loadCache() {
47
+ if (this.cache !== null) {
48
+ return this.cache;
49
+ }
50
+ try {
51
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheDir is constructor parameter, controlled by caller
52
+ await fs.mkdir(this.cacheDir, { recursive: true });
53
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheFile is derived from cacheDir
54
+ const data = await fs.readFile(this.cacheFile, 'utf-8');
55
+ this.cache = JSON.parse(data);
56
+ return this.cache;
57
+ }
58
+ catch (error) {
59
+ // Handle missing file or corrupted JSON - start with empty cache
60
+ if (error.code === 'ENOENT' || error instanceof SyntaxError) {
61
+ this.cache = {};
62
+ return this.cache;
63
+ }
64
+ throw error;
65
+ }
66
+ }
67
+ /**
68
+ * Save cache to disk
69
+ */
70
+ async saveCache() {
71
+ if (this.cache === null) {
72
+ return;
73
+ }
74
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheDir is constructor parameter, controlled by caller
75
+ await fs.mkdir(this.cacheDir, { recursive: true });
76
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- cacheFile is derived from cacheDir
77
+ await fs.writeFile(this.cacheFile, JSON.stringify(this.cache, null, 2), 'utf-8');
78
+ }
79
+ /**
80
+ * Normalize URL for caching
81
+ *
82
+ * Removes trailing slashes and anchors to treat variations as the same URL.
83
+ */
84
+ normalizeUrl(url) {
85
+ try {
86
+ const parsed = new URL(url);
87
+ // Remove hash/anchor
88
+ parsed.hash = '';
89
+ // Remove trailing slash
90
+ let normalized = parsed.toString();
91
+ if (normalized.endsWith('/')) {
92
+ normalized = normalized.slice(0, -1);
93
+ }
94
+ return normalized;
95
+ }
96
+ catch {
97
+ // If URL parsing fails, use as-is
98
+ return url;
99
+ }
100
+ }
101
+ /**
102
+ * Generate cache key for URL
103
+ *
104
+ * Uses SHA-256 hash to handle long URLs and special characters.
105
+ */
106
+ getCacheKey(url) {
107
+ const normalized = this.normalizeUrl(url);
108
+ return createHash('sha256').update(normalized).digest('hex');
109
+ }
110
+ /**
111
+ * Check if cache entry is expired
112
+ */
113
+ isExpired(entry) {
114
+ const now = Date.now();
115
+ const age = now - entry.timestamp;
116
+ const ttlMs = this.ttlHours * 60 * 60 * 1000;
117
+ return age > ttlMs;
118
+ }
119
+ /**
120
+ * Get cached result for URL
121
+ *
122
+ * @param url - URL to look up
123
+ * @returns Cache entry or null if not found/expired
124
+ */
125
+ async get(url) {
126
+ const cache = await this.loadCache();
127
+ const key = this.getCacheKey(url);
128
+ const entry = cache[key];
129
+ if (!entry) {
130
+ return null;
131
+ }
132
+ if (this.isExpired(entry)) {
133
+ delete cache[key];
134
+ await this.saveCache();
135
+ return null;
136
+ }
137
+ return entry;
138
+ }
139
+ /**
140
+ * Store validation result in cache
141
+ *
142
+ * @param url - URL to cache
143
+ * @param statusCode - HTTP status code
144
+ * @param statusMessage - HTTP status message
145
+ */
146
+ async set(url, statusCode, statusMessage) {
147
+ const cache = await this.loadCache();
148
+ const key = this.getCacheKey(url);
149
+ cache[key] = {
150
+ statusCode,
151
+ statusMessage,
152
+ timestamp: Date.now(),
153
+ };
154
+ await this.saveCache();
155
+ }
156
+ /**
157
+ * Clear all cache entries
158
+ */
159
+ async clear() {
160
+ this.cache = {};
161
+ await this.saveCache();
162
+ }
163
+ /**
164
+ * Get cache statistics
165
+ */
166
+ async getStats() {
167
+ const cache = await this.loadCache();
168
+ const keys = Object.keys(cache);
169
+ const expired = keys.filter((key) => {
170
+ const entry = cache[key];
171
+ // Type guard: ensure entry exists before checking expiration
172
+ if (entry === undefined) {
173
+ return false;
174
+ }
175
+ return this.isExpired(entry);
176
+ }).length;
177
+ return {
178
+ total: keys.length,
179
+ expired,
180
+ };
181
+ }
182
+ }
183
+ //# sourceMappingURL=external-link-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-link-cache.js","sourceRoot":"","sources":["../src/external-link-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Configuration options for external link validation
3
+ */
4
+ export interface ExternalLinkValidatorOptions {
5
+ /** Time-to-live for cache entries in hours (default: 24) */
6
+ cacheTtlHours?: number;
7
+ /** Request timeout in milliseconds (default: 5000) */
8
+ timeout?: number;
9
+ /** Number of retries for failed requests (default: 2) */
10
+ retries?: number;
11
+ /** User agent string for requests (default: generic) */
12
+ userAgent?: string;
13
+ }
14
+ /**
15
+ * Result of validating a single external link
16
+ */
17
+ export interface LinkValidationResult {
18
+ /** The URL that was validated */
19
+ url: string;
20
+ /** Validation status: 'ok' = working, 'error' = broken */
21
+ status: 'ok' | 'error';
22
+ /** HTTP status code (e.g., 200, 404) */
23
+ statusCode: number;
24
+ /** Error message if validation failed */
25
+ error?: string;
26
+ /** Whether result came from cache */
27
+ cached: boolean;
28
+ }
29
+ /**
30
+ * Validates external URLs in markdown content
31
+ *
32
+ * Uses markdown-link-check library with caching to efficiently validate
33
+ * external links. Respects cache TTL and provides detailed error information.
34
+ *
35
+ * Example:
36
+ * ```typescript
37
+ * const validator = new ExternalLinkValidator('/tmp/cache', {
38
+ * cacheTtlHours: 24,
39
+ * timeout: 5000,
40
+ * });
41
+ *
42
+ * const result = await validator.validateLink('https://example.com');
43
+ * if (result.status === 'error') {
44
+ * console.error(`Broken link: ${result.url} - ${result.error}`);
45
+ * }
46
+ * ```
47
+ */
48
+ export declare class ExternalLinkValidator {
49
+ private readonly cache;
50
+ private readonly options;
51
+ /**
52
+ * Create a new external link validator
53
+ *
54
+ * @param cacheDir - Directory for storing cache
55
+ * @param options - Validation options
56
+ */
57
+ constructor(cacheDir: string, options?: ExternalLinkValidatorOptions);
58
+ /**
59
+ * Validate a single external link
60
+ *
61
+ * @param url - URL to validate
62
+ * @returns Validation result
63
+ */
64
+ validateLink(url: string): Promise<LinkValidationResult>;
65
+ /**
66
+ * Validate multiple links
67
+ *
68
+ * @param urls - URLs to validate
69
+ * @returns Array of validation results
70
+ */
71
+ validateLinks(urls: string[]): Promise<LinkValidationResult[]>;
72
+ /**
73
+ * Check a link using markdown-link-check
74
+ */
75
+ private checkLink;
76
+ /**
77
+ * Clear the validation cache
78
+ */
79
+ clearCache(): Promise<void>;
80
+ /**
81
+ * Get cache statistics
82
+ */
83
+ getCacheStats(): Promise<{
84
+ total: number;
85
+ expired: number;
86
+ }>;
87
+ }
88
+ //# sourceMappingURL=external-link-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-link-validator.d.ts","sourceRoot":"","sources":["../src/external-link-validator.ts"],"names":[],"mappings":"AAyCA;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC5C,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAEjE;;;;;OAKG;gBACS,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,4BAAiC;IAaxE;;;;;OAKG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsC9D;;;;;OAKG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAIpE;;OAEG;YACW,SAAS;IAkEvB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAGlE"}
@@ -0,0 +1,194 @@
1
+ import markdownLinkCheck from 'markdown-link-check';
2
+ import { ExternalLinkCache } from './external-link-cache.js';
3
+ /**
4
+ * Safely serialize an error to a string, preventing [object Object] issues.
5
+ * Handles Error objects, strings, objects, and edge cases.
6
+ */
7
+ function safeSerializeError(err) {
8
+ if (!err) {
9
+ return undefined;
10
+ }
11
+ if (typeof err === 'string') {
12
+ // Return undefined for empty strings so fallback message is used
13
+ return err.trim() || undefined;
14
+ }
15
+ if (err instanceof Error) {
16
+ // Return undefined for empty messages so fallback is used
17
+ return err.message.trim() || undefined;
18
+ }
19
+ // For objects, try JSON.stringify with fallback
20
+ try {
21
+ const serialized = JSON.stringify(err);
22
+ // Avoid returning literal "{}" which isn't helpful
23
+ if (serialized === '{}') {
24
+ // Try to extract something useful from the object
25
+ const msg = err.message;
26
+ return typeof msg === 'string' && msg.trim() ? msg : 'Unknown error';
27
+ }
28
+ return serialized;
29
+ }
30
+ catch {
31
+ // JSON.stringify can fail on circular references
32
+ // Try to extract message property if it exists
33
+ const msg = err.message;
34
+ return typeof msg === 'string' && msg.trim() ? msg : 'Error (unserializable)';
35
+ }
36
+ }
37
+ /**
38
+ * Validates external URLs in markdown content
39
+ *
40
+ * Uses markdown-link-check library with caching to efficiently validate
41
+ * external links. Respects cache TTL and provides detailed error information.
42
+ *
43
+ * Example:
44
+ * ```typescript
45
+ * const validator = new ExternalLinkValidator('/tmp/cache', {
46
+ * cacheTtlHours: 24,
47
+ * timeout: 5000,
48
+ * });
49
+ *
50
+ * const result = await validator.validateLink('https://example.com');
51
+ * if (result.status === 'error') {
52
+ * console.error(`Broken link: ${result.url} - ${result.error}`);
53
+ * }
54
+ * ```
55
+ */
56
+ export class ExternalLinkValidator {
57
+ cache;
58
+ options;
59
+ /**
60
+ * Create a new external link validator
61
+ *
62
+ * @param cacheDir - Directory for storing cache
63
+ * @param options - Validation options
64
+ */
65
+ constructor(cacheDir, options = {}) {
66
+ this.options = {
67
+ cacheTtlHours: options.cacheTtlHours ?? 24,
68
+ timeout: options.timeout ?? 5000,
69
+ retries: options.retries ?? 2,
70
+ userAgent: options.userAgent ??
71
+ 'Mozilla/5.0 (compatible; VAT-LinkChecker/1.0; +https://github.com/jdutton/vibe-agent-toolkit)',
72
+ };
73
+ this.cache = new ExternalLinkCache(cacheDir, this.options.cacheTtlHours);
74
+ }
75
+ /**
76
+ * Validate a single external link
77
+ *
78
+ * @param url - URL to validate
79
+ * @returns Validation result
80
+ */
81
+ async validateLink(url) {
82
+ // Check cache first
83
+ const cached = await this.cache.get(url);
84
+ if (cached) {
85
+ const isOk = cached.statusCode >= 200 && cached.statusCode < 400;
86
+ // Return success result without error property (exactOptionalPropertyTypes)
87
+ if (isOk) {
88
+ return {
89
+ url,
90
+ status: 'ok',
91
+ statusCode: cached.statusCode,
92
+ cached: true,
93
+ };
94
+ }
95
+ // Return error result with error property
96
+ return {
97
+ url,
98
+ status: 'error',
99
+ statusCode: cached.statusCode,
100
+ cached: true,
101
+ error: cached.statusMessage,
102
+ };
103
+ }
104
+ // Validate using markdown-link-check
105
+ const result = await this.checkLink(url);
106
+ // Store in cache
107
+ await this.cache.set(url, result.statusCode, result.error ?? 'OK');
108
+ return {
109
+ ...result,
110
+ cached: false,
111
+ };
112
+ }
113
+ /**
114
+ * Validate multiple links
115
+ *
116
+ * @param urls - URLs to validate
117
+ * @returns Array of validation results
118
+ */
119
+ async validateLinks(urls) {
120
+ return Promise.all(urls.map((url) => this.validateLink(url)));
121
+ }
122
+ /**
123
+ * Check a link using markdown-link-check
124
+ */
125
+ async checkLink(url) {
126
+ return new Promise((resolve) => {
127
+ const markdown = `[link](${url})`;
128
+ markdownLinkCheck(markdown, {
129
+ timeout: `${this.options.timeout}ms`,
130
+ retryOn429: true,
131
+ retryCount: this.options.retries,
132
+ aliveStatusCodes: [200, 206, 301, 302, 307, 308],
133
+ ignorePatterns: [],
134
+ httpHeaders: [
135
+ {
136
+ urls: [url],
137
+ headers: {
138
+ 'User-Agent': this.options.userAgent,
139
+ },
140
+ },
141
+ ],
142
+ }, (error, results) => {
143
+ if (error) {
144
+ resolve({
145
+ url,
146
+ status: 'error',
147
+ statusCode: 0,
148
+ error: error.message,
149
+ });
150
+ return;
151
+ }
152
+ const result = results[0];
153
+ if (!result) {
154
+ resolve({
155
+ url,
156
+ status: 'error',
157
+ statusCode: 0,
158
+ error: 'No result from markdown-link-check',
159
+ });
160
+ return;
161
+ }
162
+ if (result.status === 'alive') {
163
+ resolve({
164
+ url,
165
+ status: 'ok',
166
+ statusCode: result.statusCode,
167
+ });
168
+ }
169
+ else {
170
+ const errorMessage = safeSerializeError(result.err) ?? `Link status: ${result.status}`;
171
+ resolve({
172
+ url,
173
+ status: 'error',
174
+ statusCode: result.statusCode,
175
+ error: errorMessage,
176
+ });
177
+ }
178
+ });
179
+ });
180
+ }
181
+ /**
182
+ * Clear the validation cache
183
+ */
184
+ async clearCache() {
185
+ await this.cache.clear();
186
+ }
187
+ /**
188
+ * Get cache statistics
189
+ */
190
+ async getCacheStats() {
191
+ return this.cache.getStats();
192
+ }
193
+ }
194
+ //# sourceMappingURL=external-link-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-link-validator.js","sourceRoot":"","sources":["../src/external-link-validator.ts"],"names":[],"mappings":"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"}
@@ -100,6 +100,17 @@ function extractLinks(tree) {
100
100
  };
101
101
  links.push(link);
102
102
  });
103
+ // Visit definition nodes (reference-style link definitions: [ref]: url)
104
+ // These provide the actual URLs for linkReference nodes
105
+ visit(tree, 'definition', (node) => {
106
+ const link = {
107
+ text: node.identifier,
108
+ href: node.url,
109
+ type: classifyLink(node.url),
110
+ line: node.position?.start.line,
111
+ };
112
+ links.push(link);
113
+ });
103
114
  return links;
104
115
  }
105
116
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,iBAAiB,MAAM,oBAAoB,CAAC;AACnD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAiBzC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,8BAA8B;IAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,+GAA+G;QAC/G,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,+GAA+G;QAC/G,IAAI,CAAC,QAAQ,CAAC;KACf,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IAC7B,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,qCAAqC;IACrC,MAAM,SAAS,GAAG,OAAO,EAAE;SACxB,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAS,CAAC;IAE9C,gBAAgB;IAChB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEjC,uCAAuC;IACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,sBAAsB;IACtB,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE1E,oFAAoF;IACpF,wCAAwC;IACxC,OAAO;QACL,KAAK;QACL,QAAQ;QACR,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;QACjD,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,CAAC;QAC3D,OAAO;QACP,SAAS;QACT,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,YAAY,CAAC,IAAU;IAC9B,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,iDAAiD;IACjD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE;QACjC,MAAM,IAAI,GAAiB;YACzB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,GAAG;YACd,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;SAChC,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,IAAmB,EAAE,EAAE;QACnD,2DAA2D;QAC3D,qEAAqE;QACrE,iDAAiD;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QAC7B,MAAM,IAAI,GAAiB;YACzB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;YAC3B,IAAI;YACJ,IAAI,EAAE,SAAS,EAAE,6CAA6C;YAC9D,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;SAChC,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,wDAAwD;IACxD,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,IAAgB,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAiB;YACzB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,IAAI,EAAE,IAAI,CAAC,GAAG;YACd,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;SAChC,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAA0B;IACjD,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,gDAAgD;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,mCAAmC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,mFAAmF;IACnF,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5E,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,kEAAkE;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,SAAS,eAAe,CAAC,IAAU;IACjC,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,qDAAqD;IACrD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAgB;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI;YACJ,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI;SAChC,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,OAAO,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAa;IACvC,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAC9B,QAA8D;IAE9D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,KAAe,CAAC;QAC/B,CAAC;QACD,sDAAsD;QACtD,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,IAAI,EAAE;SACN,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,uBAAuB;SACnD,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACtD,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;AACzD,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,gBAAgB,CAAC,YAA2B;IACnD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,4BAA4B;QAC5B,MAAM,mBAAmB,GAAgB;YACvC,GAAG,OAAO;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,kEAAkE;QAClE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACvE,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,+BAA+B;YAC/B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC;gBACvB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClC,CAAC;IAED,wDAAwD;IACxD,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAAuB;IACnD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3D,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,IAAU;IAIpC,IAAI,eAAoD,CAAC;IACzD,IAAI,YAAgC,CAAC;IAErC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAuB,EAAE,EAAE;QAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7B,0BAA0B;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5E,eAAe,GAAG,MAAiC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,OAAO;QACL,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QACtE,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}