@memberjunction/core-actions 2.50.0 → 2.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom/{send-single-message.action.d.ts → communication/send-single-message.action.d.ts} +1 -0
- package/dist/custom/communication/send-single-message.action.d.ts.map +1 -0
- package/dist/custom/{send-single-message.action.js → communication/send-single-message.action.js} +8 -7
- package/dist/custom/communication/send-single-message.action.js.map +1 -0
- package/dist/custom/demo/calculate-expression.action.d.ts.map +1 -0
- package/dist/custom/{calculate-expression.action.js → demo/calculate-expression.action.js} +1 -1
- package/dist/custom/demo/calculate-expression.action.js.map +1 -0
- package/dist/custom/demo/color-converter.action.d.ts.map +1 -0
- package/dist/custom/{color-converter.action.js → demo/color-converter.action.js} +1 -1
- package/dist/custom/demo/color-converter.action.js.map +1 -0
- package/dist/custom/demo/get-stock-price.action.d.ts.map +1 -0
- package/dist/custom/{get-stock-price.action.js → demo/get-stock-price.action.js} +1 -1
- package/dist/custom/demo/get-stock-price.action.js.map +1 -0
- package/dist/custom/{get-weather.action.d.ts → demo/get-weather.action.d.ts} +9 -0
- package/dist/custom/demo/get-weather.action.d.ts.map +1 -0
- package/dist/custom/{get-weather.action.js → demo/get-weather.action.js} +104 -14
- package/dist/custom/demo/get-weather.action.js.map +1 -0
- package/dist/custom/demo/text-analyzer.action.d.ts.map +1 -0
- package/dist/custom/{text-analyzer.action.js → demo/text-analyzer.action.js} +2 -2
- package/dist/custom/demo/text-analyzer.action.js.map +1 -0
- package/dist/custom/demo/unit-converter.action.d.ts.map +1 -0
- package/dist/custom/{unit-converter.action.js → demo/unit-converter.action.js} +3 -3
- package/dist/custom/demo/unit-converter.action.js.map +1 -0
- package/dist/custom/utilities/business-days-calculator.action.d.ts.map +1 -0
- package/dist/custom/{business-days-calculator.action.js → utilities/business-days-calculator.action.js} +6 -6
- package/dist/custom/utilities/business-days-calculator.action.js.map +1 -0
- package/dist/custom/utilities/census-data-lookup.action.d.ts.map +1 -0
- package/dist/custom/{census-data-lookup.action.js → utilities/census-data-lookup.action.js} +4 -4
- package/dist/custom/utilities/census-data-lookup.action.js.map +1 -0
- package/dist/custom/{external-change-detection.action.d.ts → utilities/external-change-detection.action.d.ts} +1 -0
- package/dist/custom/utilities/external-change-detection.action.d.ts.map +1 -0
- package/dist/custom/{external-change-detection.action.js → utilities/external-change-detection.action.js} +3 -2
- package/dist/custom/utilities/external-change-detection.action.js.map +1 -0
- package/dist/custom/utilities/ip-geolocation.action.d.ts.map +1 -0
- package/dist/custom/{ip-geolocation.action.js → utilities/ip-geolocation.action.js} +1 -1
- package/dist/custom/utilities/ip-geolocation.action.js.map +1 -0
- package/dist/custom/utilities/qr-code.action.d.ts +89 -0
- package/dist/custom/utilities/qr-code.action.d.ts.map +1 -0
- package/dist/custom/utilities/qr-code.action.js +300 -0
- package/dist/custom/utilities/qr-code.action.js.map +1 -0
- package/dist/custom/utilities/vectorize-entity.action.d.ts.map +1 -0
- package/dist/custom/{vectorize-entity.action.js → utilities/vectorize-entity.action.js} +1 -1
- package/dist/custom/utilities/vectorize-entity.action.js.map +1 -0
- package/dist/custom/web/url-link-validator.action.d.ts +74 -0
- package/dist/custom/web/url-link-validator.action.d.ts.map +1 -0
- package/dist/custom/web/url-link-validator.action.js +286 -0
- package/dist/custom/web/url-link-validator.action.js.map +1 -0
- package/dist/custom/web/url-metadata-extractor.action.d.ts +104 -0
- package/dist/custom/web/url-metadata-extractor.action.d.ts.map +1 -0
- package/dist/custom/web/url-metadata-extractor.action.js +438 -0
- package/dist/custom/web/url-metadata-extractor.action.js.map +1 -0
- package/dist/custom/web/web-page-content.action.d.ts +90 -0
- package/dist/custom/web/web-page-content.action.d.ts.map +1 -0
- package/dist/custom/web/web-page-content.action.js +416 -0
- package/dist/custom/web/web-page-content.action.js.map +1 -0
- package/dist/custom/web/web-search.action.d.ts +69 -0
- package/dist/custom/web/web-search.action.d.ts.map +1 -0
- package/dist/custom/web/web-search.action.js +382 -0
- package/dist/custom/web/web-search.action.js.map +1 -0
- package/dist/index.d.ts +17 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -11
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
- package/dist/custom/business-days-calculator.action.d.ts.map +0 -1
- package/dist/custom/business-days-calculator.action.js.map +0 -1
- package/dist/custom/calculate-expression.action.d.ts.map +0 -1
- package/dist/custom/calculate-expression.action.js.map +0 -1
- package/dist/custom/census-data-lookup.action.d.ts.map +0 -1
- package/dist/custom/census-data-lookup.action.js.map +0 -1
- package/dist/custom/color-converter.action.d.ts.map +0 -1
- package/dist/custom/color-converter.action.js.map +0 -1
- package/dist/custom/external-change-detection.action.d.ts.map +0 -1
- package/dist/custom/external-change-detection.action.js.map +0 -1
- package/dist/custom/get-stock-price.action.d.ts.map +0 -1
- package/dist/custom/get-stock-price.action.js.map +0 -1
- package/dist/custom/get-weather.action.d.ts.map +0 -1
- package/dist/custom/get-weather.action.js.map +0 -1
- package/dist/custom/ip-geolocation.action.d.ts.map +0 -1
- package/dist/custom/ip-geolocation.action.js.map +0 -1
- package/dist/custom/send-single-message.action.d.ts.map +0 -1
- package/dist/custom/send-single-message.action.js.map +0 -1
- package/dist/custom/text-analyzer.action.d.ts.map +0 -1
- package/dist/custom/text-analyzer.action.js.map +0 -1
- package/dist/custom/unit-converter.action.d.ts.map +0 -1
- package/dist/custom/unit-converter.action.js.map +0 -1
- package/dist/custom/vectorize-entity.action.d.ts.map +0 -1
- package/dist/custom/vectorize-entity.action.js.map +0 -1
- /package/dist/custom/{calculate-expression.action.d.ts → demo/calculate-expression.action.d.ts} +0 -0
- /package/dist/custom/{color-converter.action.d.ts → demo/color-converter.action.d.ts} +0 -0
- /package/dist/custom/{get-stock-price.action.d.ts → demo/get-stock-price.action.d.ts} +0 -0
- /package/dist/custom/{text-analyzer.action.d.ts → demo/text-analyzer.action.d.ts} +0 -0
- /package/dist/custom/{unit-converter.action.d.ts → demo/unit-converter.action.d.ts} +0 -0
- /package/dist/custom/{business-days-calculator.action.d.ts → utilities/business-days-calculator.action.d.ts} +0 -0
- /package/dist/custom/{census-data-lookup.action.d.ts → utilities/census-data-lookup.action.d.ts} +0 -0
- /package/dist/custom/{ip-geolocation.action.d.ts → utilities/ip-geolocation.action.d.ts} +0 -0
- /package/dist/custom/{vectorize-entity.action.d.ts → utilities/vectorize-entity.action.d.ts} +0 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LoadURLLinkValidatorAction = exports.URLLinkValidatorAction = void 0;
|
|
10
|
+
const actions_1 = require("@memberjunction/actions");
|
|
11
|
+
const global_1 = require("@memberjunction/global");
|
|
12
|
+
/**
|
|
13
|
+
* Action that validates URLs by checking accessibility, response codes, and basic health checks
|
|
14
|
+
* Provides detailed information about URL status, redirects, and response headers
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Validate a single URL
|
|
19
|
+
* await runAction({
|
|
20
|
+
* ActionName: 'URL Link Validator',
|
|
21
|
+
* Params: [{
|
|
22
|
+
* Name: 'URL',
|
|
23
|
+
* Value: 'https://example.com'
|
|
24
|
+
* }]
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Validate multiple URLs
|
|
28
|
+
* await runAction({
|
|
29
|
+
* ActionName: 'URL Link Validator',
|
|
30
|
+
* Params: [{
|
|
31
|
+
* Name: 'URLs',
|
|
32
|
+
* Value: ['https://example.com', 'https://google.com', 'https://invalid-url-test.com']
|
|
33
|
+
* }]
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Custom timeout and options
|
|
37
|
+
* await runAction({
|
|
38
|
+
* ActionName: 'URL Link Validator',
|
|
39
|
+
* Params: [{
|
|
40
|
+
* Name: 'URL',
|
|
41
|
+
* Value: 'https://slow-site.com'
|
|
42
|
+
* }, {
|
|
43
|
+
* Name: 'TimeoutMs',
|
|
44
|
+
* Value: 10000
|
|
45
|
+
* }, {
|
|
46
|
+
* Name: 'FollowRedirects',
|
|
47
|
+
* Value: false
|
|
48
|
+
* }]
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
let URLLinkValidatorAction = class URLLinkValidatorAction extends actions_1.BaseAction {
|
|
53
|
+
DEFAULT_TIMEOUT = 5000; // 5 seconds
|
|
54
|
+
MAX_TIMEOUT = 30000; // 30 seconds
|
|
55
|
+
MAX_URLS = 50; // Maximum URLs to validate in one request
|
|
56
|
+
/**
|
|
57
|
+
* Executes URL validation for one or more URLs
|
|
58
|
+
*
|
|
59
|
+
* @param params - The action parameters containing:
|
|
60
|
+
* - URL: Single URL to validate (use this OR URLs)
|
|
61
|
+
* - URLs: Array of URLs to validate (use this OR URL)
|
|
62
|
+
* - TimeoutMs: Request timeout in milliseconds (default: 5000, max: 30000)
|
|
63
|
+
* - FollowRedirects: Whether to follow redirects (default: true)
|
|
64
|
+
* - CheckSSL: Whether to check SSL certificate validity (default: true)
|
|
65
|
+
* - UserAgent: Custom User-Agent string (optional)
|
|
66
|
+
*
|
|
67
|
+
* @returns URL validation results with status, response time, and details
|
|
68
|
+
*/
|
|
69
|
+
async InternalRunAction(params) {
|
|
70
|
+
try {
|
|
71
|
+
const urlParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'url');
|
|
72
|
+
const urlsParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'urls');
|
|
73
|
+
const timeoutParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'timeoutms');
|
|
74
|
+
const followRedirectsParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'followredirects');
|
|
75
|
+
const checkSSLParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'checkssl');
|
|
76
|
+
const userAgentParam = params.Params.find(p => p.Name.trim().toLowerCase() === 'useragent');
|
|
77
|
+
// Determine URLs to validate
|
|
78
|
+
let urlsToValidate = [];
|
|
79
|
+
if (urlParam && urlParam.Value) {
|
|
80
|
+
urlsToValidate.push(urlParam.Value.toString());
|
|
81
|
+
}
|
|
82
|
+
if (urlsParam && urlsParam.Value) {
|
|
83
|
+
const urlsValue = urlsParam.Value;
|
|
84
|
+
if (Array.isArray(urlsValue)) {
|
|
85
|
+
urlsToValidate.push(...urlsValue.map(u => u.toString()));
|
|
86
|
+
}
|
|
87
|
+
else if (typeof urlsValue === 'string') {
|
|
88
|
+
// Handle comma-separated string
|
|
89
|
+
urlsToValidate.push(...urlsValue.split(',').map(u => u.trim()));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (urlsToValidate.length === 0) {
|
|
93
|
+
return {
|
|
94
|
+
Success: false,
|
|
95
|
+
Message: "Either URL or URLs parameter is required",
|
|
96
|
+
ResultCode: "MISSING_PARAMETERS"
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (urlsToValidate.length > this.MAX_URLS) {
|
|
100
|
+
return {
|
|
101
|
+
Success: false,
|
|
102
|
+
Message: `Too many URLs to validate. Maximum is ${this.MAX_URLS}, received ${urlsToValidate.length}`,
|
|
103
|
+
ResultCode: "TOO_MANY_URLS"
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Parse options
|
|
107
|
+
const timeout = Math.min(parseInt(timeoutParam?.Value?.toString() || this.DEFAULT_TIMEOUT.toString()), this.MAX_TIMEOUT);
|
|
108
|
+
const followRedirects = followRedirectsParam?.Value !== false && followRedirectsParam?.Value !== 'false';
|
|
109
|
+
const checkSSL = checkSSLParam?.Value !== false && checkSSLParam?.Value !== 'false';
|
|
110
|
+
const userAgent = userAgentParam?.Value?.toString() || 'Mozilla/5.0 (compatible; MemberJunction URL Validator/1.0; +https://memberjunction.org)';
|
|
111
|
+
// Validate URLs
|
|
112
|
+
const results = await Promise.all(urlsToValidate.map(url => this.validateURL(url, timeout, followRedirects, checkSSL, userAgent)));
|
|
113
|
+
// Calculate summary statistics
|
|
114
|
+
const summary = {
|
|
115
|
+
totalURLs: results.length,
|
|
116
|
+
validURLs: results.filter(r => r.isValid).length,
|
|
117
|
+
invalidURLs: results.filter(r => !r.isValid).length,
|
|
118
|
+
averageResponseTime: results.reduce((sum, r) => sum + (r.responseTime || 0), 0) / results.length,
|
|
119
|
+
successRate: (results.filter(r => r.isValid).length / results.length) * 100
|
|
120
|
+
};
|
|
121
|
+
const resultData = {
|
|
122
|
+
summary,
|
|
123
|
+
options: {
|
|
124
|
+
timeout,
|
|
125
|
+
followRedirects,
|
|
126
|
+
checkSSL,
|
|
127
|
+
userAgent
|
|
128
|
+
},
|
|
129
|
+
results,
|
|
130
|
+
validatedAt: new Date().toISOString()
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
Success: true,
|
|
134
|
+
ResultCode: "SUCCESS",
|
|
135
|
+
Message: JSON.stringify(resultData, null, 2)
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return {
|
|
140
|
+
Success: false,
|
|
141
|
+
Message: `Failed to validate URLs: ${error instanceof Error ? error.message : String(error)}`,
|
|
142
|
+
ResultCode: "FAILED"
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Validates a single URL
|
|
148
|
+
*/
|
|
149
|
+
async validateURL(url, timeout, followRedirects, checkSSL, userAgent) {
|
|
150
|
+
const startTime = Date.now();
|
|
151
|
+
const result = {
|
|
152
|
+
url: url.trim(),
|
|
153
|
+
isValid: false,
|
|
154
|
+
responseTime: null,
|
|
155
|
+
statusCode: null,
|
|
156
|
+
statusText: null,
|
|
157
|
+
error: null,
|
|
158
|
+
redirects: [],
|
|
159
|
+
headers: {},
|
|
160
|
+
ssl: null,
|
|
161
|
+
finalUrl: null
|
|
162
|
+
};
|
|
163
|
+
try {
|
|
164
|
+
// Basic URL validation
|
|
165
|
+
let parsedUrl;
|
|
166
|
+
try {
|
|
167
|
+
parsedUrl = new URL(result.url);
|
|
168
|
+
if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
|
|
169
|
+
throw new Error('Only HTTP and HTTPS URLs are supported');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
result.error = `Invalid URL format: ${error instanceof Error ? error.message : String(error)}`;
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
// Create AbortController for timeout
|
|
177
|
+
const controller = new AbortController();
|
|
178
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
179
|
+
try {
|
|
180
|
+
const response = await fetch(result.url, {
|
|
181
|
+
method: 'HEAD', // Use HEAD to minimize data transfer
|
|
182
|
+
headers: {
|
|
183
|
+
'User-Agent': userAgent
|
|
184
|
+
},
|
|
185
|
+
redirect: followRedirects ? 'follow' : 'manual',
|
|
186
|
+
signal: controller.signal
|
|
187
|
+
});
|
|
188
|
+
clearTimeout(timeoutId);
|
|
189
|
+
result.responseTime = Date.now() - startTime;
|
|
190
|
+
result.statusCode = response.status;
|
|
191
|
+
result.statusText = response.statusText;
|
|
192
|
+
result.finalUrl = response.url;
|
|
193
|
+
// Extract response headers
|
|
194
|
+
response.headers.forEach((value, name) => {
|
|
195
|
+
result.headers[name] = value;
|
|
196
|
+
});
|
|
197
|
+
// Check if URL is valid (2xx or 3xx status codes)
|
|
198
|
+
result.isValid = response.status >= 200 && response.status < 400;
|
|
199
|
+
// Handle redirects
|
|
200
|
+
if (response.redirected) {
|
|
201
|
+
result.redirects.push({
|
|
202
|
+
from: result.url,
|
|
203
|
+
to: result.finalUrl,
|
|
204
|
+
statusCode: result.statusCode
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// SSL information for HTTPS URLs
|
|
208
|
+
if (parsedUrl.protocol === 'https:' && checkSSL) {
|
|
209
|
+
result.ssl = await this.checkSSL(parsedUrl.hostname);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (fetchError) {
|
|
213
|
+
clearTimeout(timeoutId);
|
|
214
|
+
result.responseTime = Date.now() - startTime;
|
|
215
|
+
if (fetchError instanceof Error) {
|
|
216
|
+
if (fetchError.name === 'AbortError') {
|
|
217
|
+
result.error = `Request timed out after ${timeout}ms`;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
result.error = fetchError.message;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
result.error = String(fetchError);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
result.error = error instanceof Error ? error.message : String(error);
|
|
230
|
+
result.responseTime = Date.now() - startTime;
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Performs basic SSL certificate check
|
|
236
|
+
*/
|
|
237
|
+
async checkSSL(hostname) {
|
|
238
|
+
try {
|
|
239
|
+
// Simple SSL check by making a request and checking for SSL errors
|
|
240
|
+
const controller = new AbortController();
|
|
241
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
242
|
+
try {
|
|
243
|
+
const response = await fetch(`https://${hostname}`, {
|
|
244
|
+
method: 'HEAD',
|
|
245
|
+
signal: controller.signal
|
|
246
|
+
});
|
|
247
|
+
clearTimeout(timeoutId);
|
|
248
|
+
return {
|
|
249
|
+
isValid: true,
|
|
250
|
+
hostname,
|
|
251
|
+
protocol: 'TLS',
|
|
252
|
+
error: null
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
clearTimeout(timeoutId);
|
|
257
|
+
return {
|
|
258
|
+
isValid: false,
|
|
259
|
+
hostname,
|
|
260
|
+
protocol: 'TLS',
|
|
261
|
+
error: error instanceof Error ? error.message : String(error)
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
return {
|
|
267
|
+
isValid: false,
|
|
268
|
+
hostname,
|
|
269
|
+
protocol: 'TLS',
|
|
270
|
+
error: error instanceof Error ? error.message : String(error)
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
exports.URLLinkValidatorAction = URLLinkValidatorAction;
|
|
276
|
+
exports.URLLinkValidatorAction = URLLinkValidatorAction = __decorate([
|
|
277
|
+
(0, global_1.RegisterClass)(actions_1.BaseAction, "__URLLinkValidator")
|
|
278
|
+
], URLLinkValidatorAction);
|
|
279
|
+
/**
|
|
280
|
+
* Loader function to ensure the URLLinkValidatorAction class is included in the bundle.
|
|
281
|
+
*/
|
|
282
|
+
function LoadURLLinkValidatorAction() {
|
|
283
|
+
// this function is a stub that is used to force the bundler to include the above class in the final bundle and not tree shake them out
|
|
284
|
+
}
|
|
285
|
+
exports.LoadURLLinkValidatorAction = LoadURLLinkValidatorAction;
|
|
286
|
+
//# sourceMappingURL=url-link-validator.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-link-validator.action.js","sourceRoot":"","sources":["../../../src/custom/web/url-link-validator.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Action that extracts comprehensive metadata from web pages including OpenGraph, Twitter Cards,
|
|
5
|
+
* Schema.org structured data, and standard HTML meta tags
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Extract all metadata from a webpage
|
|
10
|
+
* await runAction({
|
|
11
|
+
* ActionName: 'URL Metadata Extractor',
|
|
12
|
+
* Params: [{
|
|
13
|
+
* Name: 'URL',
|
|
14
|
+
* Value: 'https://example.com/article'
|
|
15
|
+
* }]
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Extract specific metadata types
|
|
19
|
+
* await runAction({
|
|
20
|
+
* ActionName: 'URL Metadata Extractor',
|
|
21
|
+
* Params: [{
|
|
22
|
+
* Name: 'URL',
|
|
23
|
+
* Value: 'https://news.site.com/story'
|
|
24
|
+
* }, {
|
|
25
|
+
* Name: 'IncludeOpenGraph',
|
|
26
|
+
* Value: true
|
|
27
|
+
* }, {
|
|
28
|
+
* Name: 'IncludeSchemaOrg',
|
|
29
|
+
* Value: false
|
|
30
|
+
* }]
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class URLMetadataExtractorAction extends BaseAction {
|
|
35
|
+
private readonly TIMEOUT;
|
|
36
|
+
private readonly MAX_CONTENT_SIZE;
|
|
37
|
+
/**
|
|
38
|
+
* Executes metadata extraction from the specified URL
|
|
39
|
+
*
|
|
40
|
+
* @param params - The action parameters containing:
|
|
41
|
+
* - URL: Web page URL to extract metadata from (required)
|
|
42
|
+
* - IncludeOpenGraph: Extract OpenGraph metadata (default: true)
|
|
43
|
+
* - IncludeTwitterCards: Extract Twitter Card metadata (default: true)
|
|
44
|
+
* - IncludeSchemaOrg: Extract Schema.org JSON-LD data (default: true)
|
|
45
|
+
* - IncludeBasicMeta: Extract standard HTML meta tags (default: true)
|
|
46
|
+
* - IncludeFavicon: Extract favicon information (default: true)
|
|
47
|
+
*
|
|
48
|
+
* @returns Comprehensive metadata extracted from the webpage
|
|
49
|
+
*/
|
|
50
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
51
|
+
/**
|
|
52
|
+
* Extracts all types of metadata from HTML content
|
|
53
|
+
*/
|
|
54
|
+
private extractAllMetadata;
|
|
55
|
+
/**
|
|
56
|
+
* Extracts basic HTML metadata
|
|
57
|
+
*/
|
|
58
|
+
private extractBasicMetadata;
|
|
59
|
+
/**
|
|
60
|
+
* Extracts OpenGraph metadata
|
|
61
|
+
*/
|
|
62
|
+
private extractOpenGraphMetadata;
|
|
63
|
+
/**
|
|
64
|
+
* Extracts Twitter Card metadata
|
|
65
|
+
*/
|
|
66
|
+
private extractTwitterCardMetadata;
|
|
67
|
+
/**
|
|
68
|
+
* Extracts Schema.org JSON-LD structured data
|
|
69
|
+
*/
|
|
70
|
+
private extractSchemaOrgMetadata;
|
|
71
|
+
/**
|
|
72
|
+
* Extracts favicon information
|
|
73
|
+
*/
|
|
74
|
+
private extractFaviconMetadata;
|
|
75
|
+
/**
|
|
76
|
+
* Extracts all links from the page
|
|
77
|
+
*/
|
|
78
|
+
private extractLinks;
|
|
79
|
+
/**
|
|
80
|
+
* Extracts image information
|
|
81
|
+
*/
|
|
82
|
+
private extractImages;
|
|
83
|
+
/**
|
|
84
|
+
* Extracts language information
|
|
85
|
+
*/
|
|
86
|
+
private extractLanguage;
|
|
87
|
+
/**
|
|
88
|
+
* Extracts viewport information
|
|
89
|
+
*/
|
|
90
|
+
private extractViewport;
|
|
91
|
+
/**
|
|
92
|
+
* Resolves relative URLs to absolute URLs
|
|
93
|
+
*/
|
|
94
|
+
private resolveUrl;
|
|
95
|
+
/**
|
|
96
|
+
* Cleans and normalizes text content
|
|
97
|
+
*/
|
|
98
|
+
private cleanText;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Loader function to ensure the URLMetadataExtractorAction class is included in the bundle.
|
|
102
|
+
*/
|
|
103
|
+
export declare function LoadURLMetadataExtractorAction(): void;
|
|
104
|
+
//# sourceMappingURL=url-metadata-extractor.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-metadata-extractor.action.d.ts","sourceRoot":"","sources":["../../../src/custom/web/url-metadata-extractor.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBACa,0BAA2B,SAAQ,UAAU;IAEtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD;;;;;;;;;;;;OAYG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAqIvF;;OAEG;YACW,kBAAkB;IAwChC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA0BhC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAclC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAiBhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwC9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,OAAO,CAAC,SAAS;CAYpB;AAED;;GAEG;AACH,wBAAgB,8BAA8B,SAE7C"}
|