@lighthouse/common 6.9.4 → 6.9.6

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 @@
1
+ [17:05:07.504] [ERROR] Error: Unknown codemod storiesof-to-csf. Run --list for options.
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FetchImageError = void 0;
7
+ /**
8
+ * Custom error class for image fetching operations
9
+ * Includes context information for better debugging
10
+ */
11
+ class FetchImageError extends Error {
12
+ constructor(message, context = {}) {
13
+ super(message);
14
+ this.name = 'FetchImageError';
15
+ this.context = context;
16
+ this.url = context.url;
17
+ }
18
+ }
19
+ exports.FetchImageError = FetchImageError;
@@ -4,7 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.buildFetchUrl = buildFetchUrl;
7
+ var _index = require("../validate-url/index.js");
7
8
  function buildFetchUrl(url, options) {
9
+ // Validate url parameter
10
+ if (!url || typeof url !== 'string') {
11
+ throw new Error(`buildFetchUrl: Invalid url parameter. url=${JSON.stringify(url)}`);
12
+ }
8
13
  const {
9
14
  awsS3BaseUrl,
10
15
  cloudfrontBaseUrl = '',
@@ -19,6 +24,10 @@ function buildFetchUrl(url, options) {
19
24
  Signature
20
25
  } = options;
21
26
  if (shouldUseCloudfront) {
27
+ // Validate cloudfrontBaseUrl when using CloudFront
28
+ if (!cloudfrontBaseUrl) {
29
+ throw new Error(`buildFetchUrl: cloudfrontBaseUrl is required when shouldUseCloudfront=true. cloudfrontBaseUrl=${JSON.stringify(cloudfrontBaseUrl)}`);
30
+ }
22
31
  const isWebContext = shouldUseCloudfront && typeof window === 'object';
23
32
  const paramMap = {
24
33
  width,
@@ -33,7 +42,18 @@ function buildFetchUrl(url, options) {
33
42
  }
34
43
  const params = Object.entries(paramMap).filter(([, value]) => value != null).map(([key, value]) => `${key}=${String(value)}`);
35
44
  const paramsString = params.join('&');
36
- return `${cloudfrontBaseUrl}/${url}?${paramsString}`;
45
+ const result = `${cloudfrontBaseUrl}/${url}?${paramsString}`;
46
+
47
+ // Validate output is absolute URL
48
+ if (!(0, _index.isAbsoluteUrl)(result)) {
49
+ throw new Error(`buildFetchUrl: Constructed URL is not absolute. cloudfrontBaseUrl=${JSON.stringify(cloudfrontBaseUrl)}, url=${JSON.stringify(url)}, result=${JSON.stringify(result)}`);
50
+ }
51
+ return result;
52
+ }
53
+
54
+ // Validate required base URLs for Cloudinary path
55
+ if (!cloudinaryBaseUrl || !awsS3BaseUrl) {
56
+ throw new Error(`buildFetchUrl: cloudinaryBaseUrl and awsS3BaseUrl are required. cloudinaryBaseUrl=${JSON.stringify(cloudinaryBaseUrl)}, awsS3BaseUrl=${JSON.stringify(awsS3BaseUrl)}`);
37
57
  }
38
58
  const transformations = [];
39
59
  let transformationsString = '';
@@ -43,5 +63,10 @@ function buildFetchUrl(url, options) {
43
63
  if (fit) transformations.push('c_fit');
44
64
  transformationsString = `${transformations.join(',')}/`;
45
65
  const fetchUrl = `${cloudinaryBaseUrl}/${transformationsString}${awsS3BaseUrl}/${url}`;
66
+
67
+ // Validate output is absolute URL
68
+ if (!(0, _index.isAbsoluteUrl)(fetchUrl)) {
69
+ throw new Error(`buildFetchUrl: Constructed URL is not absolute. cloudinaryBaseUrl=${JSON.stringify(cloudinaryBaseUrl)}, awsS3BaseUrl=${JSON.stringify(awsS3BaseUrl)}, url=${JSON.stringify(url)}, result=${JSON.stringify(fetchUrl)}`);
70
+ }
46
71
  return fetchUrl;
47
72
  }
@@ -15,6 +15,7 @@ var _constants = require("../../constants");
15
15
  var _images = require("../../images");
16
16
  var _fetchImageForPdfGeneratorService = require("../fetch-image-for-pdf-generator-service");
17
17
  var _fetchImageForWeb = require("../fetch-image-for-web");
18
+ var _index = require("../validate-url/index.js");
18
19
  // NOTE use the native fetch if it's available in the browser, because the
19
20
  // ponyfill (which actually uses the github polyfill) does not support all the
20
21
  // same options as native fetch
@@ -37,8 +38,29 @@ const defaultOptions = {
37
38
  };
38
39
  function fetchImage(url, options = {}) {
39
40
  const {
40
- shouldUseCloudfront
41
+ shouldUseCloudfront,
42
+ isHeader = false,
43
+ context = {}
41
44
  } = options;
45
+
46
+ // Validate url parameter
47
+ if (!url || typeof url !== 'string') {
48
+ const error = new Error(`fetchImage: Invalid url parameter. url=${JSON.stringify(url)}`);
49
+ if (isHeader) {
50
+ console.error('FetchImageHeaderError', {
51
+ message: error.message,
52
+ url,
53
+ context
54
+ });
55
+ return fetchImage(_constants.LIGHTHOUSE_LOGO_URL, defaultOptions);
56
+ }
57
+ console.error('FetchImageError', {
58
+ message: error.message,
59
+ url,
60
+ context
61
+ });
62
+ return _bluebird.default.resolve(_images.imageNotFound);
63
+ }
42
64
  if (shouldUseCloudfront) {
43
65
  const isWebContext = typeof window === 'object';
44
66
  return isWebContext ?
@@ -50,9 +72,6 @@ function fetchImage(url, options = {}) {
50
72
  ...defaultOptions,
51
73
  ...options
52
74
  };
53
- const {
54
- isHeader = false
55
- } = options;
56
75
  return fetch(encodedUrl, fetchOptions).then(response => {
57
76
  const contentHeader = response.headers.get('content-length');
58
77
  const contentType = response.headers.get('content-type');
@@ -60,10 +79,10 @@ function fetchImage(url, options = {}) {
60
79
  // NOTE: the response will be ok but we won't be able to render any
61
80
  // image meaning pdfmake will error. Raise error here and return early.
62
81
  if (contentHeader === '0') {
63
- return _bluebird.default.reject(new Error(`Failed to fetch image as no content length: ${encodedUrl}`));
82
+ return _bluebird.default.reject(new Error(`Failed to fetch image as no content length: ${url}`));
64
83
  }
65
84
  if (!response.ok) {
66
- return _bluebird.default.reject(new Error(`Failed to fetch image: ${encodedUrl}`));
85
+ return _bluebird.default.reject(new Error(`Failed to fetch image: ${url}`));
67
86
  }
68
87
  const imageType = contentTypes[contentType];
69
88
  return response.arrayBuffer().then(buffer => ({
@@ -85,10 +104,20 @@ function fetchImage(url, options = {}) {
85
104
  }).catch(error => {
86
105
  if (isHeader) {
87
106
  // NOTE: Replace failed headers with LH logo
88
- console.error('FetchImageHeaderError', error);
107
+ console.error('FetchImageHeaderError', {
108
+ url,
109
+ message: error.message,
110
+ context,
111
+ stack: error.stack
112
+ });
89
113
  return fetchImage(_constants.LIGHTHOUSE_LOGO_URL, defaultOptions);
90
114
  }
91
- console.error(error);
115
+ console.error('FetchImageError', {
116
+ url,
117
+ message: error.message,
118
+ context,
119
+ stack: error.stack
120
+ });
92
121
  return _images.imageNotFound;
93
122
  });
94
123
  }
@@ -6,13 +6,34 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.fetchImageForWeb = void 0;
7
7
  var _images = require("../../images");
8
8
  var _fetchLighthouseLogo = require("../fetch-lighthouse-logo");
9
+ var _index = require("../validate-url/index.js");
9
10
  const fetchImageForWeb = async function (url, options) {
10
11
  const {
11
12
  isHeader = false,
12
13
  Signature,
13
14
  Policy,
14
- KeyPairId
15
+ KeyPairId,
16
+ context = {}
15
17
  } = options;
18
+
19
+ // Validate url parameter
20
+ if (!url || typeof url !== 'string') {
21
+ const error = new Error(`fetchImageForWeb: Invalid url parameter. url=${JSON.stringify(url)}`);
22
+ if (isHeader) {
23
+ console.error('FetchImageHeaderError', {
24
+ message: error.message,
25
+ url,
26
+ context
27
+ });
28
+ return (0, _fetchLighthouseLogo.fetchLighthouseLogo)();
29
+ }
30
+ console.error('FetchImageError', {
31
+ message: error.message,
32
+ url,
33
+ context
34
+ });
35
+ return _images.imageNotFound;
36
+ }
16
37
  try {
17
38
  const firstParamConnector = url.indexOf('?') > -1 ? '&' : '?';
18
39
  const hasSignatureParams = url.includes('Signature=') && url.includes('Policy=') && url.includes('Key-Pair-Id=');
@@ -21,19 +42,29 @@ const fetchImageForWeb = async function (url, options) {
21
42
  const imageResponse = await fetch(constructedUrl);
22
43
  const contentLengthHeader = imageResponse.headers.get('content-length');
23
44
  if (contentLengthHeader === '0') {
24
- return Promise.reject(new Error(`Failed to fetch image as no content length: ${encodedUrl}`));
45
+ return Promise.reject(new Error(`Failed to fetch image as no content length: ${url}`));
25
46
  }
26
47
  if (!imageResponse.ok) {
27
- return Promise.reject(new Error(`Failed to fetch image: ${encodedUrl}`));
48
+ return Promise.reject(new Error(`Failed to fetch image: ${url}`));
28
49
  }
29
50
  return await imageResponse.arrayBuffer();
30
51
  } catch (error) {
31
52
  if (isHeader) {
32
53
  // NOTE: Replace failed headers with LH logo
33
- console.error('FetchImageHeaderError', error);
54
+ console.error('FetchImageHeaderError', {
55
+ url,
56
+ message: error.message,
57
+ context,
58
+ stack: error.stack
59
+ });
34
60
  return (0, _fetchLighthouseLogo.fetchLighthouseLogo)();
35
61
  }
36
- console.error(error);
62
+ console.error('FetchImageError', {
63
+ url,
64
+ message: error.message,
65
+ context,
66
+ stack: error.stack
67
+ });
37
68
  return _images.imageNotFound;
38
69
  }
39
70
  };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isAbsoluteUrl = isAbsoluteUrl;
7
+ /**
8
+ * Checks if a URL is absolute (starts with http:// or https://)
9
+ * @param {string} url - The URL to validate
10
+ * @returns {boolean} - True if URL is absolute, false otherwise
11
+ */
12
+ function isAbsoluteUrl(url) {
13
+ if (!url || typeof url !== 'string') return false;
14
+ return url.startsWith('http://') || url.startsWith('https://');
15
+ }
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.defaultHeader = defaultHeader;
7
7
  var _helpers = require("../../../helpers");
8
+ var _constants = require("../../../constants");
9
+ var _index = require("../../../helpers/validate-url/index.js");
8
10
  function defaultHeader({
9
11
  Signature,
10
12
  Policy,
@@ -19,7 +21,15 @@ function defaultHeader({
19
21
  timestamp,
20
22
  timezone
21
23
  });
22
- return (0, _helpers.fetchImage)(logoUrl, {
24
+
25
+ // Validate logoUrl and use fallback if invalid
26
+ const effectiveLogoUrl = (0, _index.isAbsoluteUrl)(logoUrl) ? logoUrl : _constants.LIGHTHOUSE_LOGO_URL;
27
+ if (!(0, _index.isAbsoluteUrl)(logoUrl)) {
28
+ console.warn('defaultHeader: Invalid logoUrl, using Lighthouse logo', {
29
+ providedLogoUrl: logoUrl
30
+ });
31
+ }
32
+ return (0, _helpers.fetchImage)(effectiveLogoUrl, {
23
33
  Signature,
24
34
  Policy,
25
35
  KeyPairId,
@@ -41,7 +41,9 @@ function buildImage(options) {
41
41
  height = 210,
42
42
  settings = {},
43
43
  signedAsset,
44
- width = 210
44
+ width = 210,
45
+ fieldLabel,
46
+ fieldType = 'image'
45
47
  } = options;
46
48
  const {
47
49
  awsS3BaseUrl,
@@ -71,7 +73,15 @@ function buildImage(options) {
71
73
  });
72
74
 
73
75
  // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context
74
- return (0, _helpers.fetchImage)(url, settings).then(base64String => ({
76
+ return (0, _helpers.fetchImage)(url, {
77
+ ...settings,
78
+ context: {
79
+ stage: 'field',
80
+ fieldLabel,
81
+ fieldType,
82
+ filepath
83
+ }
84
+ }).then(base64String => ({
75
85
  alignment,
76
86
  fit: [width, height],
77
87
  image: base64String,
@@ -121,7 +131,14 @@ function buildSummaryField({
121
131
  };
122
132
  }
123
133
  // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context
124
- return (0, _helpers.fetchImage)(value, settings).then(base64String => {
134
+ return (0, _helpers.fetchImage)(value, {
135
+ ...settings,
136
+ context: {
137
+ stage: 'field',
138
+ fieldLabel: field.label,
139
+ fieldType: 'signature'
140
+ }
141
+ }).then(base64String => {
125
142
  return {
126
143
  alignment: 'left',
127
144
  image: base64String,
@@ -145,7 +162,9 @@ function buildSummaryField({
145
162
  height: 140,
146
163
  width: 140,
147
164
  settings,
148
- signedAsset: signedAssets && (0, _lodash.isArray)(signedAssets) ? signedAssets[0] : null
165
+ signedAsset: signedAssets && (0, _lodash.isArray)(signedAssets) ? signedAssets[0] : null,
166
+ fieldLabel: field.label,
167
+ fieldType: 'media'
149
168
  });
150
169
  return image;
151
170
  }
@@ -244,7 +263,14 @@ function buildTemplateFieldRow({
244
263
  if (isSignatureField) {
245
264
  if (!value) return [labelText, ''];
246
265
  // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context
247
- return (0, _helpers.fetchImage)(value, settings).then(base64String => {
266
+ return (0, _helpers.fetchImage)(value, {
267
+ ...settings,
268
+ context: {
269
+ stage: 'field',
270
+ fieldLabel: label,
271
+ fieldType: 'signature'
272
+ }
273
+ }).then(base64String => {
248
274
  const values = {
249
275
  alignment: 'left',
250
276
  image: base64String,
@@ -254,22 +280,39 @@ function buildTemplateFieldRow({
254
280
  });
255
281
  }
256
282
  if (isDisplayImageField) {
257
- return _bluebird.default.map([value], (filepath, index) => {
258
- const signedAssetValue = (0, _lodash.isArray)(signedAssets) ? signedAssets?.[index] : signedAssets;
283
+ // Guard against nullish values
284
+ if (!value) {
285
+ return [[], {}];
286
+ }
287
+
288
+ // Ensure value is always treated as an array of filepaths
289
+ const filepaths = (0, _lodash.isArray)(value) ? value : [value];
290
+ return _bluebird.default.map(filepaths, (filepath, index) => {
291
+ const signedAssetValue = (0, _lodash.isArray)(signedAssets) ? signedAssets[index] : signedAssets;
259
292
  return buildImage({
260
293
  filepath,
261
294
  settings,
262
- signedAsset: signedAssetValue
295
+ signedAsset: signedAssetValue,
296
+ fieldLabel: label,
297
+ fieldType: 'image-display'
263
298
  });
264
299
  }).then(fieldImages => [fieldImages, {}]);
265
300
  }
266
301
  if (isPhotoField) {
302
+ // Guard against nullish values
303
+ if (!value || (0, _lodash.isArray)(value) && value.length === 0) {
304
+ return [labelText, {
305
+ text: ''
306
+ }];
307
+ }
267
308
  return _bluebird.default.map(value, (filepath, index) => {
268
309
  const signedAssetValue = (0, _lodash.isArray)(signedAssets) ? signedAssets[index] : signedAssets;
269
310
  return buildImage({
270
311
  filepath,
271
312
  settings,
272
- signedAsset: signedAssetValue
313
+ signedAsset: signedAssetValue,
314
+ fieldLabel: label,
315
+ fieldType: 'media'
273
316
  });
274
317
  }).then(fieldImages => {
275
318
  const tables = !(0, _lodash.isEmpty)(fieldImages) ? (0, _.imageTables)(fieldImages) : [];
@@ -52,8 +52,16 @@ function generateDefinition(options) {
52
52
  pageOrientation,
53
53
  pageSize,
54
54
  styles: pdfStyles
55
- })).catch(err => {
56
- throw new Error(`GenerateDefinitionError: ${err.message}`);
55
+ })).catch(error => {
56
+ // Preserve structured error information for better debugging
57
+ console.error('GenerateDefinitionError', {
58
+ message: error.message,
59
+ context: error.context,
60
+ url: error.url,
61
+ type: options.type,
62
+ stack: error.stack
63
+ });
64
+ throw error; // Preserve original error instead of wrapping
57
65
  });
58
66
  }
59
67
  function pdfHeader(header) {
@@ -0,0 +1,27 @@
1
+ import _createClass from "@babel/runtime/helpers/createClass";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
4
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
5
+ import _inherits from "@babel/runtime/helpers/inherits";
6
+ import _wrapNativeSuper from "@babel/runtime/helpers/wrapNativeSuper";
7
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
8
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
9
+ /**
10
+ * Custom error class for image fetching operations
11
+ * Includes context information for better debugging
12
+ */
13
+ export var FetchImageError = /*#__PURE__*/function (_Error) {
14
+ function FetchImageError(message) {
15
+ var _this;
16
+ var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
17
+ _classCallCheck(this, FetchImageError);
18
+ _this = _callSuper(this, FetchImageError, [message]);
19
+ _this.name = 'FetchImageError';
20
+ _this.context = context;
21
+ _this.url = context.url;
22
+ return _this;
23
+ }
24
+ _inherits(FetchImageError, _Error);
25
+ return _createClass(FetchImageError);
26
+ }(/*#__PURE__*/_wrapNativeSuper(Error));
27
+ //# sourceMappingURL=FetchImageError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchImageError.js","names":["FetchImageError","_Error","message","_this","context","arguments","length","undefined","_classCallCheck","_callSuper","name","url","_inherits","_createClass","_wrapNativeSuper","Error"],"sources":["../../src/errors/FetchImageError.js"],"sourcesContent":["/**\n * Custom error class for image fetching operations\n * Includes context information for better debugging\n */\nexport class FetchImageError extends Error {\n constructor(message, context = {}) {\n super(message)\n this.name = 'FetchImageError'\n this.context = context\n this.url = context.url\n }\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA,WAAaA,eAAe,0BAAAC,MAAA;EAC1B,SAAAD,gBAAYE,OAAO,EAAgB;IAAA,IAAAC,KAAA;IAAA,IAAdC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;IAAAG,eAAA,OAAAR,eAAA;IAC/BG,KAAA,GAAAM,UAAA,OAAAT,eAAA,GAAME,OAAO;IACbC,KAAA,CAAKO,IAAI,GAAG,iBAAiB;IAC7BP,KAAA,CAAKC,OAAO,GAAGA,OAAO;IACtBD,KAAA,CAAKQ,GAAG,GAAGP,OAAO,CAACO,GAAG;IAAA,OAAAR,KAAA;EACxB;EAACS,SAAA,CAAAZ,eAAA,EAAAC,MAAA;EAAA,OAAAY,YAAA,CAAAb,eAAA;AAAA,eAAAc,gBAAA,CANkCC,KAAK","ignoreList":[]}
@@ -1,6 +1,11 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import _typeof from "@babel/runtime/helpers/typeof";
3
+ import { isAbsoluteUrl } from '../validate-url/index.js';
3
4
  export function buildFetchUrl(url, options) {
5
+ // Validate url parameter
6
+ if (!url || typeof url !== 'string') {
7
+ throw new Error("buildFetchUrl: Invalid url parameter. url=".concat(JSON.stringify(url)));
8
+ }
4
9
  var awsS3BaseUrl = options.awsS3BaseUrl,
5
10
  _options$cloudfrontBa = options.cloudfrontBaseUrl,
6
11
  cloudfrontBaseUrl = _options$cloudfrontBa === void 0 ? '' : _options$cloudfrontBa,
@@ -14,6 +19,10 @@ export function buildFetchUrl(url, options) {
14
19
  KeyPairId = options.KeyPairId,
15
20
  Signature = options.Signature;
16
21
  if (shouldUseCloudfront) {
22
+ // Validate cloudfrontBaseUrl when using CloudFront
23
+ if (!cloudfrontBaseUrl) {
24
+ throw new Error("buildFetchUrl: cloudfrontBaseUrl is required when shouldUseCloudfront=true. cloudfrontBaseUrl=".concat(JSON.stringify(cloudfrontBaseUrl)));
25
+ }
17
26
  var isWebContext = shouldUseCloudfront && (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object';
18
27
  var paramMap = {
19
28
  width: width,
@@ -37,7 +46,18 @@ export function buildFetchUrl(url, options) {
37
46
  return "".concat(key, "=").concat(String(value));
38
47
  });
39
48
  var paramsString = params.join('&');
40
- return "".concat(cloudfrontBaseUrl, "/").concat(url, "?").concat(paramsString);
49
+ var result = "".concat(cloudfrontBaseUrl, "/").concat(url, "?").concat(paramsString);
50
+
51
+ // Validate output is absolute URL
52
+ if (!isAbsoluteUrl(result)) {
53
+ throw new Error("buildFetchUrl: Constructed URL is not absolute. cloudfrontBaseUrl=".concat(JSON.stringify(cloudfrontBaseUrl), ", url=").concat(JSON.stringify(url), ", result=").concat(JSON.stringify(result)));
54
+ }
55
+ return result;
56
+ }
57
+
58
+ // Validate required base URLs for Cloudinary path
59
+ if (!cloudinaryBaseUrl || !awsS3BaseUrl) {
60
+ throw new Error("buildFetchUrl: cloudinaryBaseUrl and awsS3BaseUrl are required. cloudinaryBaseUrl=".concat(JSON.stringify(cloudinaryBaseUrl), ", awsS3BaseUrl=").concat(JSON.stringify(awsS3BaseUrl)));
41
61
  }
42
62
  var transformations = [];
43
63
  var transformationsString = '';
@@ -47,6 +67,11 @@ export function buildFetchUrl(url, options) {
47
67
  if (fit) transformations.push('c_fit');
48
68
  transformationsString = "".concat(transformations.join(','), "/");
49
69
  var fetchUrl = "".concat(cloudinaryBaseUrl, "/").concat(transformationsString).concat(awsS3BaseUrl, "/").concat(url);
70
+
71
+ // Validate output is absolute URL
72
+ if (!isAbsoluteUrl(fetchUrl)) {
73
+ throw new Error("buildFetchUrl: Constructed URL is not absolute. cloudinaryBaseUrl=".concat(JSON.stringify(cloudinaryBaseUrl), ", awsS3BaseUrl=").concat(JSON.stringify(awsS3BaseUrl), ", url=").concat(JSON.stringify(url), ", result=").concat(JSON.stringify(fetchUrl)));
74
+ }
50
75
  return fetchUrl;
51
76
  }
52
77
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["buildFetchUrl","url","options","awsS3BaseUrl","_options$cloudfrontBa","cloudfrontBaseUrl","cloudinaryBaseUrl","fit","height","width","quality","shouldUseCloudfront","Policy","KeyPairId","Signature","isWebContext","window","_typeof","paramMap","params","Object","entries","filter","_ref","_ref2","_slicedToArray","value","map","_ref3","_ref4","key","concat","String","paramsString","join","transformations","transformationsString","push","toString","fetchUrl"],"sources":["../../../src/helpers/build-fetch-url/index.js"],"sourcesContent":["export function buildFetchUrl(url, options) {\n const {\n awsS3BaseUrl,\n cloudfrontBaseUrl = '',\n cloudinaryBaseUrl,\n fit,\n height,\n width,\n quality,\n shouldUseCloudfront,\n Policy,\n KeyPairId,\n Signature,\n } = options\n\n if (shouldUseCloudfront) {\n const isWebContext = shouldUseCloudfront && typeof window === 'object'\n\n const paramMap = {\n width,\n height,\n quality,\n fit: 'contain',\n }\n\n if (isWebContext) {\n paramMap.Policy = Policy\n paramMap['Key-Pair-Id'] = KeyPairId\n paramMap.Signature = Signature\n }\n const params = Object.entries(paramMap)\n .filter(([, value]) => value != null)\n .map(([key, value]) => `${key}=${String(value)}`)\n\n const paramsString = params.join('&')\n return `${cloudfrontBaseUrl}/${url}?${paramsString}`\n }\n\n const transformations = []\n let transformationsString = ''\n\n if (width) transformations.push(`w_${width.toString()}`)\n if (height) transformations.push(`h_${height.toString()}`)\n if (quality) transformations.push(`q_${quality.toString()}`)\n if (fit) transformations.push('c_fit')\n\n transformationsString = `${transformations.join(',')}/`\n\n const fetchUrl = `${cloudinaryBaseUrl}/${transformationsString}${awsS3BaseUrl}/${url}`\n\n return fetchUrl\n}\n"],"mappings":";;AAAA,OAAO,SAASA,aAAaA,CAACC,GAAG,EAAEC,OAAO,EAAE;EAC1C,IACEC,YAAY,GAWVD,OAAO,CAXTC,YAAY;IAAAC,qBAAA,GAWVF,OAAO,CAVTG,iBAAiB;IAAjBA,iBAAiB,GAAAD,qBAAA,cAAG,EAAE,GAAAA,qBAAA;IACtBE,iBAAiB,GASfJ,OAAO,CATTI,iBAAiB;IACjBC,GAAG,GAQDL,OAAO,CARTK,GAAG;IACHC,MAAM,GAOJN,OAAO,CAPTM,MAAM;IACNC,KAAK,GAMHP,OAAO,CANTO,KAAK;IACLC,OAAO,GAKLR,OAAO,CALTQ,OAAO;IACPC,mBAAmB,GAIjBT,OAAO,CAJTS,mBAAmB;IACnBC,MAAM,GAGJV,OAAO,CAHTU,MAAM;IACNC,SAAS,GAEPX,OAAO,CAFTW,SAAS;IACTC,SAAS,GACPZ,OAAO,CADTY,SAAS;EAGX,IAAIH,mBAAmB,EAAE;IACvB,IAAMI,YAAY,GAAGJ,mBAAmB,IAAI,QAAOK,MAAM,iCAAAC,OAAA,CAAND,MAAM,OAAK,QAAQ;IAEtE,IAAME,QAAQ,GAAG;MACfT,KAAK,EAALA,KAAK;MACLD,MAAM,EAANA,MAAM;MACNE,OAAO,EAAPA,OAAO;MACPH,GAAG,EAAE;IACP,CAAC;IAED,IAAIQ,YAAY,EAAE;MAChBG,QAAQ,CAACN,MAAM,GAAGA,MAAM;MACxBM,QAAQ,CAAC,aAAa,CAAC,GAAGL,SAAS;MACnCK,QAAQ,CAACJ,SAAS,GAAGA,SAAS;IAChC;IACA,IAAMK,MAAM,GAAGC,MAAM,CAACC,OAAO,CAACH,QAAQ,CAAC,CACpCI,MAAM,CAAC,UAAAC,IAAA;MAAA,IAAAC,KAAA,GAAAC,cAAA,CAAAF,IAAA;QAAIG,KAAK,GAAAF,KAAA;MAAA,OAAME,KAAK,IAAI,IAAI;IAAA,EAAC,CACpCC,GAAG,CAAC,UAAAC,KAAA;MAAA,IAAAC,KAAA,GAAAJ,cAAA,CAAAG,KAAA;QAAEE,GAAG,GAAAD,KAAA;QAAEH,KAAK,GAAAG,KAAA;MAAA,UAAAE,MAAA,CAASD,GAAG,OAAAC,MAAA,CAAIC,MAAM,CAACN,KAAK,CAAC;IAAA,CAAE,CAAC;IAEnD,IAAMO,YAAY,GAAGd,MAAM,CAACe,IAAI,CAAC,GAAG,CAAC;IACrC,UAAAH,MAAA,CAAU1B,iBAAiB,OAAA0B,MAAA,CAAI9B,GAAG,OAAA8B,MAAA,CAAIE,YAAY;EACpD;EAEA,IAAME,eAAe,GAAG,EAAE;EAC1B,IAAIC,qBAAqB,GAAG,EAAE;EAE9B,IAAI3B,KAAK,EAAE0B,eAAe,CAACE,IAAI,MAAAN,MAAA,CAAMtB,KAAK,CAAC6B,QAAQ,CAAC,CAAC,CAAE,CAAC;EACxD,IAAI9B,MAAM,EAAE2B,eAAe,CAACE,IAAI,MAAAN,MAAA,CAAMvB,MAAM,CAAC8B,QAAQ,CAAC,CAAC,CAAE,CAAC;EAC1D,IAAI5B,OAAO,EAAEyB,eAAe,CAACE,IAAI,MAAAN,MAAA,CAAMrB,OAAO,CAAC4B,QAAQ,CAAC,CAAC,CAAE,CAAC;EAC5D,IAAI/B,GAAG,EAAE4B,eAAe,CAACE,IAAI,CAAC,OAAO,CAAC;EAEtCD,qBAAqB,MAAAL,MAAA,CAAMI,eAAe,CAACD,IAAI,CAAC,GAAG,CAAC,MAAG;EAEvD,IAAMK,QAAQ,MAAAR,MAAA,CAAMzB,iBAAiB,OAAAyB,MAAA,CAAIK,qBAAqB,EAAAL,MAAA,CAAG5B,YAAY,OAAA4B,MAAA,CAAI9B,GAAG,CAAE;EAEtF,OAAOsC,QAAQ;AACjB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["isAbsoluteUrl","buildFetchUrl","url","options","Error","concat","JSON","stringify","awsS3BaseUrl","_options$cloudfrontBa","cloudfrontBaseUrl","cloudinaryBaseUrl","fit","height","width","quality","shouldUseCloudfront","Policy","KeyPairId","Signature","isWebContext","window","_typeof","paramMap","params","Object","entries","filter","_ref","_ref2","_slicedToArray","value","map","_ref3","_ref4","key","String","paramsString","join","result","transformations","transformationsString","push","toString","fetchUrl"],"sources":["../../../src/helpers/build-fetch-url/index.js"],"sourcesContent":["import { isAbsoluteUrl } from '../validate-url/index.js'\n\nexport function buildFetchUrl(url, options) {\n // Validate url parameter\n if (!url || typeof url !== 'string') {\n throw new Error(\n `buildFetchUrl: Invalid url parameter. url=${JSON.stringify(url)}`\n )\n }\n\n const {\n awsS3BaseUrl,\n cloudfrontBaseUrl = '',\n cloudinaryBaseUrl,\n fit,\n height,\n width,\n quality,\n shouldUseCloudfront,\n Policy,\n KeyPairId,\n Signature,\n } = options\n\n if (shouldUseCloudfront) {\n // Validate cloudfrontBaseUrl when using CloudFront\n if (!cloudfrontBaseUrl) {\n throw new Error(\n `buildFetchUrl: cloudfrontBaseUrl is required when shouldUseCloudfront=true. cloudfrontBaseUrl=${JSON.stringify(cloudfrontBaseUrl)}`\n )\n }\n const isWebContext = shouldUseCloudfront && typeof window === 'object'\n\n const paramMap = {\n width,\n height,\n quality,\n fit: 'contain',\n }\n\n if (isWebContext) {\n paramMap.Policy = Policy\n paramMap['Key-Pair-Id'] = KeyPairId\n paramMap.Signature = Signature\n }\n const params = Object.entries(paramMap)\n .filter(([, value]) => value != null)\n .map(([key, value]) => `${key}=${String(value)}`)\n\n const paramsString = params.join('&')\n const result = `${cloudfrontBaseUrl}/${url}?${paramsString}`\n\n // Validate output is absolute URL\n if (!isAbsoluteUrl(result)) {\n throw new Error(\n `buildFetchUrl: Constructed URL is not absolute. cloudfrontBaseUrl=${JSON.stringify(cloudfrontBaseUrl)}, url=${JSON.stringify(url)}, result=${JSON.stringify(result)}`\n )\n }\n\n return result\n }\n\n // Validate required base URLs for Cloudinary path\n if (!cloudinaryBaseUrl || !awsS3BaseUrl) {\n throw new Error(\n `buildFetchUrl: cloudinaryBaseUrl and awsS3BaseUrl are required. cloudinaryBaseUrl=${JSON.stringify(cloudinaryBaseUrl)}, awsS3BaseUrl=${JSON.stringify(awsS3BaseUrl)}`\n )\n }\n\n const transformations = []\n let transformationsString = ''\n\n if (width) transformations.push(`w_${width.toString()}`)\n if (height) transformations.push(`h_${height.toString()}`)\n if (quality) transformations.push(`q_${quality.toString()}`)\n if (fit) transformations.push('c_fit')\n\n transformationsString = `${transformations.join(',')}/`\n\n const fetchUrl = `${cloudinaryBaseUrl}/${transformationsString}${awsS3BaseUrl}/${url}`\n\n // Validate output is absolute URL\n if (!isAbsoluteUrl(fetchUrl)) {\n throw new Error(\n `buildFetchUrl: Constructed URL is not absolute. cloudinaryBaseUrl=${JSON.stringify(cloudinaryBaseUrl)}, awsS3BaseUrl=${JSON.stringify(awsS3BaseUrl)}, url=${JSON.stringify(url)}, result=${JSON.stringify(fetchUrl)}`\n )\n }\n\n return fetchUrl\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,6 +8,7 @@ import { LIGHTHOUSE_LOGO_URL } from '../../constants';
8
8
  import { imageNotFound } from '../../images';
9
9
  import { fetchImageForPdfGeneratorService } from '../fetch-image-for-pdf-generator-service';
10
10
  import { fetchImageForWeb } from '../fetch-image-for-web';
11
+ import { isAbsoluteUrl } from '../validate-url/index.js';
11
12
 
12
13
  // NOTE use the native fetch if it's available in the browser, because the
13
14
  // ponyfill (which actually uses the github polyfill) does not support all the
@@ -31,7 +32,30 @@ var defaultOptions = {
31
32
  };
32
33
  export function fetchImage(url) {
33
34
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
34
- var shouldUseCloudfront = options.shouldUseCloudfront;
35
+ var shouldUseCloudfront = options.shouldUseCloudfront,
36
+ _options$isHeader = options.isHeader,
37
+ isHeader = _options$isHeader === void 0 ? false : _options$isHeader,
38
+ _options$context = options.context,
39
+ context = _options$context === void 0 ? {} : _options$context;
40
+
41
+ // Validate url parameter
42
+ if (!url || typeof url !== 'string') {
43
+ var error = new Error("fetchImage: Invalid url parameter. url=".concat(JSON.stringify(url)));
44
+ if (isHeader) {
45
+ console.error('FetchImageHeaderError', {
46
+ message: error.message,
47
+ url: url,
48
+ context: context
49
+ });
50
+ return fetchImage(LIGHTHOUSE_LOGO_URL, defaultOptions);
51
+ }
52
+ console.error('FetchImageError', {
53
+ message: error.message,
54
+ url: url,
55
+ context: context
56
+ });
57
+ return Promise.resolve(imageNotFound);
58
+ }
35
59
  if (shouldUseCloudfront) {
36
60
  var isWebContext = (typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object';
37
61
  return isWebContext ?
@@ -40,8 +64,6 @@ export function fetchImage(url) {
40
64
  }
41
65
  var encodedUrl = encodeURI(url);
42
66
  var fetchOptions = _objectSpread(_objectSpread({}, defaultOptions), options);
43
- var _options$isHeader = options.isHeader,
44
- isHeader = _options$isHeader === void 0 ? false : _options$isHeader;
45
67
  return fetch(encodedUrl, fetchOptions).then(function (response) {
46
68
  var contentHeader = response.headers.get('content-length');
47
69
  var contentType = response.headers.get('content-type');
@@ -49,10 +71,10 @@ export function fetchImage(url) {
49
71
  // NOTE: the response will be ok but we won't be able to render any
50
72
  // image meaning pdfmake will error. Raise error here and return early.
51
73
  if (contentHeader === '0') {
52
- return Promise.reject(new Error("Failed to fetch image as no content length: ".concat(encodedUrl)));
74
+ return Promise.reject(new Error("Failed to fetch image as no content length: ".concat(url)));
53
75
  }
54
76
  if (!response.ok) {
55
- return Promise.reject(new Error("Failed to fetch image: ".concat(encodedUrl)));
77
+ return Promise.reject(new Error("Failed to fetch image: ".concat(url)));
56
78
  }
57
79
  var imageType = contentTypes[contentType];
58
80
  return response.arrayBuffer().then(function (buffer) {
@@ -75,10 +97,20 @@ export function fetchImage(url) {
75
97
  }).catch(function (error) {
76
98
  if (isHeader) {
77
99
  // NOTE: Replace failed headers with LH logo
78
- console.error('FetchImageHeaderError', error);
100
+ console.error('FetchImageHeaderError', {
101
+ url: url,
102
+ message: error.message,
103
+ context: context,
104
+ stack: error.stack
105
+ });
79
106
  return fetchImage(LIGHTHOUSE_LOGO_URL, defaultOptions);
80
107
  }
81
- console.error(error);
108
+ console.error('FetchImageError', {
109
+ url: url,
110
+ message: error.message,
111
+ context: context,
112
+ stack: error.stack
113
+ });
82
114
  return imageNotFound;
83
115
  });
84
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["fetchPonyfill","Promise","LIGHTHOUSE_LOGO_URL","imageNotFound","fetchImageForPdfGeneratorService","fetchImageForWeb","fetch","self","_typeof","contentTypes","defaultOptions","cache","fetchImage","url","options","arguments","length","undefined","shouldUseCloudfront","isWebContext","window","encodedUrl","encodeURI","fetchOptions","_objectSpread","_options$isHeader","isHeader","then","response","contentHeader","headers","get","contentType","reject","Error","concat","ok","imageType","arrayBuffer","buffer","_ref","base64Flag","imageStr","arrayBufferToBase64","base64","isValid","validateBase64Image","catch","error","console","binary","bytes","slice","call","Uint8Array","forEach","b","String","fromCharCode","btoa","base64String","isJpeg","startsWith","validateJpegImage","isPng","validatePngImage","base64string","src","imageData","from","atob","replace","c","charCodeAt","imageCorrupted","sequence","i"],"sources":["../../../src/helpers/fetch-image/index.js"],"sourcesContent":["import fetchPonyfill from 'fetch-ponyfill'\nimport Promise from 'bluebird'\nimport { LIGHTHOUSE_LOGO_URL } from '../../constants'\nimport { imageNotFound } from '../../images'\nimport { fetchImageForPdfGeneratorService } from '../fetch-image-for-pdf-generator-service'\nimport { fetchImageForWeb } from '../fetch-image-for-web'\n\n// NOTE use the native fetch if it's available in the browser, because the\n// ponyfill (which actually uses the github polyfill) does not support all the\n// same options as native fetch\nconst fetch =\n (typeof self === 'object' && self.fetch) || fetchPonyfill({ Promise }).fetch\n\nconst contentTypes = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n}\n\nconst defaultOptions = {\n // NOTE The cache: no-cache option is important to avoid an issue with CORS\n // and caching on Chrome. Here's a good explanation of the issue:\n // https://stackoverflow.com/a/37455118\n // In our case, when loading the web version of a form, the signature image is\n // cached without the correct CORS headers. If the pdf is then generated,\n // there's a mismatch between the cached image headers and the CORS headers\n // sent from the fetch request, causing an error\n cache: 'no-cache',\n}\n\nexport function fetchImage(url, options = {}) {\n const { shouldUseCloudfront } = options\n\n if (shouldUseCloudfront) {\n const isWebContext = typeof window === 'object'\n\n return isWebContext\n ? // Values used from options: isHeader, Signature, Policy, KeyPairId\n fetchImageForWeb(url, options)\n : fetchImageForPdfGeneratorService(url)\n }\n\n const encodedUrl = encodeURI(url)\n\n const fetchOptions = {\n ...defaultOptions,\n ...options,\n }\n const { isHeader = false } = options\n\n return fetch(encodedUrl, fetchOptions)\n .then((response) => {\n const contentHeader = response.headers.get('content-length')\n const contentType = response.headers.get('content-type')\n\n // NOTE: the response will be ok but we won't be able to render any\n // image meaning pdfmake will error. Raise error here and return early.\n if (contentHeader === '0') {\n return Promise.reject(\n new Error(`Failed to fetch image as no content length: ${encodedUrl}`)\n )\n }\n\n if (!response.ok) {\n return Promise.reject(new Error(`Failed to fetch image: ${encodedUrl}`))\n }\n\n const imageType = contentTypes[contentType]\n\n return response.arrayBuffer().then((buffer) => ({\n buffer,\n imageType,\n }))\n })\n .then(({ buffer, imageType }) => {\n const base64Flag = `data:image/${imageType};base64,`\n const imageStr = arrayBufferToBase64(buffer)\n\n const base64 = `${base64Flag}${imageStr}`\n const isValid = validateBase64Image(base64)\n\n if (!isValid) {\n return Promise.reject(new Error('InvalidImageError'))\n }\n\n return base64\n })\n .catch((error) => {\n if (isHeader) {\n // NOTE: Replace failed headers with LH logo\n console.error('FetchImageHeaderError', error)\n return fetchImage(LIGHTHOUSE_LOGO_URL, defaultOptions)\n }\n\n console.error(error)\n return imageNotFound\n })\n}\n\nexport function arrayBufferToBase64(buffer) {\n let binary = ''\n const bytes = [].slice.call(new Uint8Array(buffer))\n\n bytes.forEach((b) => (binary += String.fromCharCode(b)))\n\n return btoa(binary)\n}\n\nexport function validateBase64Image(base64String) {\n const isJpeg = base64String.startsWith('data:image/jpeg;base64,')\n\n if (isJpeg) return validateJpegImage(base64String)\n\n const isPng = base64String.startsWith('data:image/png;base64,')\n\n if (isPng) return validatePngImage(base64String)\n\n return false\n}\n\n// See SO for more info: https://stackoverflow.com/a/41635312\n// Fiddle: https://jsfiddle.net/Lnyxuchw/\nexport function validateJpegImage(base64string) {\n const src = base64string\n const imageData = Uint8Array.from(\n atob(src.replace('data:image/jpeg;base64,', '')),\n (c) => c.charCodeAt(0)\n )\n const imageCorrupted =\n imageData[imageData.length - 1] === 217 &&\n imageData[imageData.length - 2] === 255\n\n return imageCorrupted\n}\n\n// See SO for more info: https://stackoverflow.com/a/41635312\n// Fiddle: https://jsfiddle.net/Lnyxuchw/\nexport function validatePngImage(base64string) {\n const src = base64string\n const imageData = Uint8Array.from(\n atob(src.replace('data:image/png;base64,', '')),\n (c) => c.charCodeAt(0)\n )\n const sequence = [0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]\n\n //check last 12 elements of array so they contains needed values\n for (let i = 12; i > 0; i--) {\n if (imageData[imageData.length - i] !== sequence[12 - i]) {\n return false\n }\n }\n\n return true\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["fetchPonyfill","Promise","LIGHTHOUSE_LOGO_URL","imageNotFound","fetchImageForPdfGeneratorService","fetchImageForWeb","isAbsoluteUrl","fetch","self","_typeof","contentTypes","defaultOptions","cache","fetchImage","url","options","arguments","length","undefined","shouldUseCloudfront","_options$isHeader","isHeader","_options$context","context","error","Error","concat","JSON","stringify","console","message","resolve","isWebContext","window","encodedUrl","encodeURI","fetchOptions","_objectSpread","then","response","contentHeader","headers","get","contentType","reject","ok","imageType","arrayBuffer","buffer","_ref","base64Flag","imageStr","arrayBufferToBase64","base64","isValid","validateBase64Image","catch","stack","binary","bytes","slice","call","Uint8Array","forEach","b","String","fromCharCode","btoa","base64String","isJpeg","startsWith","validateJpegImage","isPng","validatePngImage","base64string","src","imageData","from","atob","replace","c","charCodeAt","imageCorrupted","sequence","i"],"sources":["../../../src/helpers/fetch-image/index.js"],"sourcesContent":["import fetchPonyfill from 'fetch-ponyfill'\nimport Promise from 'bluebird'\nimport { LIGHTHOUSE_LOGO_URL } from '../../constants'\nimport { imageNotFound } from '../../images'\nimport { fetchImageForPdfGeneratorService } from '../fetch-image-for-pdf-generator-service'\nimport { fetchImageForWeb } from '../fetch-image-for-web'\nimport { isAbsoluteUrl } from '../validate-url/index.js'\n\n// NOTE use the native fetch if it's available in the browser, because the\n// ponyfill (which actually uses the github polyfill) does not support all the\n// same options as native fetch\nconst fetch =\n (typeof self === 'object' && self.fetch) || fetchPonyfill({ Promise }).fetch\n\nconst contentTypes = {\n 'image/png': 'png',\n 'image/jpeg': 'jpeg',\n}\n\nconst defaultOptions = {\n // NOTE The cache: no-cache option is important to avoid an issue with CORS\n // and caching on Chrome. Here's a good explanation of the issue:\n // https://stackoverflow.com/a/37455118\n // In our case, when loading the web version of a form, the signature image is\n // cached without the correct CORS headers. If the pdf is then generated,\n // there's a mismatch between the cached image headers and the CORS headers\n // sent from the fetch request, causing an error\n cache: 'no-cache',\n}\n\nexport function fetchImage(url, options = {}) {\n const { shouldUseCloudfront, isHeader = false, context = {} } = options\n\n // Validate url parameter\n if (!url || typeof url !== 'string') {\n const error = new Error(\n `fetchImage: Invalid url parameter. url=${JSON.stringify(url)}`\n )\n if (isHeader) {\n console.error('FetchImageHeaderError', {\n message: error.message,\n url,\n context,\n })\n return fetchImage(LIGHTHOUSE_LOGO_URL, defaultOptions)\n }\n console.error('FetchImageError', {\n message: error.message,\n url,\n context,\n })\n return Promise.resolve(imageNotFound)\n }\n\n if (shouldUseCloudfront) {\n const isWebContext = typeof window === 'object'\n\n return isWebContext\n ? // Values used from options: isHeader, Signature, Policy, KeyPairId\n fetchImageForWeb(url, options)\n : fetchImageForPdfGeneratorService(url)\n }\n\n const encodedUrl = encodeURI(url)\n\n const fetchOptions = {\n ...defaultOptions,\n ...options,\n }\n\n return fetch(encodedUrl, fetchOptions)\n .then((response) => {\n const contentHeader = response.headers.get('content-length')\n const contentType = response.headers.get('content-type')\n\n // NOTE: the response will be ok but we won't be able to render any\n // image meaning pdfmake will error. Raise error here and return early.\n if (contentHeader === '0') {\n return Promise.reject(\n new Error(`Failed to fetch image as no content length: ${url}`)\n )\n }\n\n if (!response.ok) {\n return Promise.reject(new Error(`Failed to fetch image: ${url}`))\n }\n\n const imageType = contentTypes[contentType]\n\n return response.arrayBuffer().then((buffer) => ({\n buffer,\n imageType,\n }))\n })\n .then(({ buffer, imageType }) => {\n const base64Flag = `data:image/${imageType};base64,`\n const imageStr = arrayBufferToBase64(buffer)\n\n const base64 = `${base64Flag}${imageStr}`\n const isValid = validateBase64Image(base64)\n\n if (!isValid) {\n return Promise.reject(new Error('InvalidImageError'))\n }\n\n return base64\n })\n .catch((error) => {\n if (isHeader) {\n // NOTE: Replace failed headers with LH logo\n console.error('FetchImageHeaderError', {\n url,\n message: error.message,\n context,\n stack: error.stack,\n })\n return fetchImage(LIGHTHOUSE_LOGO_URL, defaultOptions)\n }\n\n console.error('FetchImageError', {\n url,\n message: error.message,\n context,\n stack: error.stack,\n })\n return imageNotFound\n })\n}\n\nexport function arrayBufferToBase64(buffer) {\n let binary = ''\n const bytes = [].slice.call(new Uint8Array(buffer))\n\n bytes.forEach((b) => (binary += String.fromCharCode(b)))\n\n return btoa(binary)\n}\n\nexport function validateBase64Image(base64String) {\n const isJpeg = base64String.startsWith('data:image/jpeg;base64,')\n\n if (isJpeg) return validateJpegImage(base64String)\n\n const isPng = base64String.startsWith('data:image/png;base64,')\n\n if (isPng) return validatePngImage(base64String)\n\n return false\n}\n\n// See SO for more info: https://stackoverflow.com/a/41635312\n// Fiddle: https://jsfiddle.net/Lnyxuchw/\nexport function validateJpegImage(base64string) {\n const src = base64string\n const imageData = Uint8Array.from(\n atob(src.replace('data:image/jpeg;base64,', '')),\n (c) => c.charCodeAt(0)\n )\n const imageCorrupted =\n imageData[imageData.length - 1] === 217 &&\n imageData[imageData.length - 2] === 255\n\n return imageCorrupted\n}\n\n// See SO for more info: https://stackoverflow.com/a/41635312\n// Fiddle: https://jsfiddle.net/Lnyxuchw/\nexport function validatePngImage(base64string) {\n const src = base64string\n const imageData = Uint8Array.from(\n atob(src.replace('data:image/png;base64,', '')),\n (c) => c.charCodeAt(0)\n )\n const sequence = [0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]\n\n //check last 12 elements of array so they contains needed values\n for (let i = 12; i > 0; i--) {\n if (imageData[imageData.length - i] !== sequence[12 - i]) {\n return false\n }\n }\n\n return true\n}\n"],"mappings":";;;;AAAA,OAAOA,aAAa,MAAM,gBAAgB;AAC1C,OAAOC,OAAO,MAAM,UAAU;AAC9B,SAASC,mBAAmB,QAAQ,iBAAiB;AACrD,SAASC,aAAa,QAAQ,cAAc;AAC5C,SAASC,gCAAgC,QAAQ,0CAA0C;AAC3F,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SAASC,aAAa,QAAQ,0BAA0B;;AAExD;AACA;AACA;AACA,IAAMC,KAAK,GACR,QAAOC,IAAI,iCAAAC,OAAA,CAAJD,IAAI,OAAK,QAAQ,IAAIA,IAAI,CAACD,KAAK,IAAKP,aAAa,CAAC;EAAEC,OAAO,EAAPA;AAAQ,CAAC,CAAC,CAACM,KAAK;AAE9E,IAAMG,YAAY,GAAG;EACnB,WAAW,EAAE,KAAK;EAClB,YAAY,EAAE;AAChB,CAAC;AAED,IAAMC,cAAc,GAAG;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACAC,KAAK,EAAE;AACT,CAAC;AAED,OAAO,SAASC,UAAUA,CAACC,GAAG,EAAgB;EAAA,IAAdC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAC1C,IAAQG,mBAAmB,GAAqCJ,OAAO,CAA/DI,mBAAmB;IAAAC,iBAAA,GAAqCL,OAAO,CAA1CM,QAAQ;IAARA,QAAQ,GAAAD,iBAAA,cAAG,KAAK,GAAAA,iBAAA;IAAAE,gBAAA,GAAmBP,OAAO,CAAxBQ,OAAO;IAAPA,OAAO,GAAAD,gBAAA,cAAG,CAAC,CAAC,GAAAA,gBAAA;;EAE3D;EACA,IAAI,CAACR,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAE;IACnC,IAAMU,KAAK,GAAG,IAAIC,KAAK,2CAAAC,MAAA,CACqBC,IAAI,CAACC,SAAS,CAACd,GAAG,CAAC,CAC/D,CAAC;IACD,IAAIO,QAAQ,EAAE;MACZQ,OAAO,CAACL,KAAK,CAAC,uBAAuB,EAAE;QACrCM,OAAO,EAAEN,KAAK,CAACM,OAAO;QACtBhB,GAAG,EAAHA,GAAG;QACHS,OAAO,EAAPA;MACF,CAAC,CAAC;MACF,OAAOV,UAAU,CAACX,mBAAmB,EAAES,cAAc,CAAC;IACxD;IACAkB,OAAO,CAACL,KAAK,CAAC,iBAAiB,EAAE;MAC/BM,OAAO,EAAEN,KAAK,CAACM,OAAO;MACtBhB,GAAG,EAAHA,GAAG;MACHS,OAAO,EAAPA;IACF,CAAC,CAAC;IACF,OAAOtB,OAAO,CAAC8B,OAAO,CAAC5B,aAAa,CAAC;EACvC;EAEA,IAAIgB,mBAAmB,EAAE;IACvB,IAAMa,YAAY,GAAG,QAAOC,MAAM,iCAAAxB,OAAA,CAANwB,MAAM,OAAK,QAAQ;IAE/C,OAAOD,YAAY;IACf;IACA3B,gBAAgB,CAACS,GAAG,EAAEC,OAAO,CAAC,GAC9BX,gCAAgC,CAACU,GAAG,CAAC;EAC3C;EAEA,IAAMoB,UAAU,GAAGC,SAAS,CAACrB,GAAG,CAAC;EAEjC,IAAMsB,YAAY,GAAAC,aAAA,CAAAA,aAAA,KACb1B,cAAc,GACdI,OAAO,CACX;EAED,OAAOR,KAAK,CAAC2B,UAAU,EAAEE,YAAY,CAAC,CACnCE,IAAI,CAAC,UAACC,QAAQ,EAAK;IAClB,IAAMC,aAAa,GAAGD,QAAQ,CAACE,OAAO,CAACC,GAAG,CAAC,gBAAgB,CAAC;IAC5D,IAAMC,WAAW,GAAGJ,QAAQ,CAACE,OAAO,CAACC,GAAG,CAAC,cAAc,CAAC;;IAExD;IACA;IACA,IAAIF,aAAa,KAAK,GAAG,EAAE;MACzB,OAAOvC,OAAO,CAAC2C,MAAM,CACnB,IAAInB,KAAK,gDAAAC,MAAA,CAAgDZ,GAAG,CAAE,CAChE,CAAC;IACH;IAEA,IAAI,CAACyB,QAAQ,CAACM,EAAE,EAAE;MAChB,OAAO5C,OAAO,CAAC2C,MAAM,CAAC,IAAInB,KAAK,2BAAAC,MAAA,CAA2BZ,GAAG,CAAE,CAAC,CAAC;IACnE;IAEA,IAAMgC,SAAS,GAAGpC,YAAY,CAACiC,WAAW,CAAC;IAE3C,OAAOJ,QAAQ,CAACQ,WAAW,CAAC,CAAC,CAACT,IAAI,CAAC,UAACU,MAAM;MAAA,OAAM;QAC9CA,MAAM,EAANA,MAAM;QACNF,SAAS,EAATA;MACF,CAAC;IAAA,CAAC,CAAC;EACL,CAAC,CAAC,CACDR,IAAI,CAAC,UAAAW,IAAA,EAA2B;IAAA,IAAxBD,MAAM,GAAAC,IAAA,CAAND,MAAM;MAAEF,SAAS,GAAAG,IAAA,CAATH,SAAS;IACxB,IAAMI,UAAU,iBAAAxB,MAAA,CAAiBoB,SAAS,aAAU;IACpD,IAAMK,QAAQ,GAAGC,mBAAmB,CAACJ,MAAM,CAAC;IAE5C,IAAMK,MAAM,MAAA3B,MAAA,CAAMwB,UAAU,EAAAxB,MAAA,CAAGyB,QAAQ,CAAE;IACzC,IAAMG,OAAO,GAAGC,mBAAmB,CAACF,MAAM,CAAC;IAE3C,IAAI,CAACC,OAAO,EAAE;MACZ,OAAOrD,OAAO,CAAC2C,MAAM,CAAC,IAAInB,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvD;IAEA,OAAO4B,MAAM;EACf,CAAC,CAAC,CACDG,KAAK,CAAC,UAAChC,KAAK,EAAK;IAChB,IAAIH,QAAQ,EAAE;MACZ;MACAQ,OAAO,CAACL,KAAK,CAAC,uBAAuB,EAAE;QACrCV,GAAG,EAAHA,GAAG;QACHgB,OAAO,EAAEN,KAAK,CAACM,OAAO;QACtBP,OAAO,EAAPA,OAAO;QACPkC,KAAK,EAAEjC,KAAK,CAACiC;MACf,CAAC,CAAC;MACF,OAAO5C,UAAU,CAACX,mBAAmB,EAAES,cAAc,CAAC;IACxD;IAEAkB,OAAO,CAACL,KAAK,CAAC,iBAAiB,EAAE;MAC/BV,GAAG,EAAHA,GAAG;MACHgB,OAAO,EAAEN,KAAK,CAACM,OAAO;MACtBP,OAAO,EAAPA,OAAO;MACPkC,KAAK,EAAEjC,KAAK,CAACiC;IACf,CAAC,CAAC;IACF,OAAOtD,aAAa;EACtB,CAAC,CAAC;AACN;AAEA,OAAO,SAASiD,mBAAmBA,CAACJ,MAAM,EAAE;EAC1C,IAAIU,MAAM,GAAG,EAAE;EACf,IAAMC,KAAK,GAAG,EAAE,CAACC,KAAK,CAACC,IAAI,CAAC,IAAIC,UAAU,CAACd,MAAM,CAAC,CAAC;EAEnDW,KAAK,CAACI,OAAO,CAAC,UAACC,CAAC;IAAA,OAAMN,MAAM,IAAIO,MAAM,CAACC,YAAY,CAACF,CAAC,CAAC;EAAA,CAAC,CAAC;EAExD,OAAOG,IAAI,CAACT,MAAM,CAAC;AACrB;AAEA,OAAO,SAASH,mBAAmBA,CAACa,YAAY,EAAE;EAChD,IAAMC,MAAM,GAAGD,YAAY,CAACE,UAAU,CAAC,yBAAyB,CAAC;EAEjE,IAAID,MAAM,EAAE,OAAOE,iBAAiB,CAACH,YAAY,CAAC;EAElD,IAAMI,KAAK,GAAGJ,YAAY,CAACE,UAAU,CAAC,wBAAwB,CAAC;EAE/D,IAAIE,KAAK,EAAE,OAAOC,gBAAgB,CAACL,YAAY,CAAC;EAEhD,OAAO,KAAK;AACd;;AAEA;AACA;AACA,OAAO,SAASG,iBAAiBA,CAACG,YAAY,EAAE;EAC9C,IAAMC,GAAG,GAAGD,YAAY;EACxB,IAAME,SAAS,GAAGd,UAAU,CAACe,IAAI,CAC/BC,IAAI,CAACH,GAAG,CAACI,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,EAChD,UAACC,CAAC;IAAA,OAAKA,CAAC,CAACC,UAAU,CAAC,CAAC,CAAC;EAAA,CACxB,CAAC;EACD,IAAMC,cAAc,GAClBN,SAAS,CAACA,SAAS,CAAC3D,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,IACvC2D,SAAS,CAACA,SAAS,CAAC3D,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;EAEzC,OAAOiE,cAAc;AACvB;;AAEA;AACA;AACA,OAAO,SAAST,gBAAgBA,CAACC,YAAY,EAAE;EAC7C,IAAMC,GAAG,GAAGD,YAAY;EACxB,IAAME,SAAS,GAAGd,UAAU,CAACe,IAAI,CAC/BC,IAAI,CAACH,GAAG,CAACI,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,EAC/C,UAACC,CAAC;IAAA,OAAKA,CAAC,CAACC,UAAU,CAAC,CAAC,CAAC;EAAA,CACxB,CAAC;EACD,IAAME,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;;EAE/D;EACA,KAAK,IAAIC,CAAC,GAAG,EAAE,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,EAAE;IAC3B,IAAIR,SAAS,CAACA,SAAS,CAAC3D,MAAM,GAAGmE,CAAC,CAAC,KAAKD,QAAQ,CAAC,EAAE,GAAGC,CAAC,CAAC,EAAE;MACxD,OAAO,KAAK;IACd;EACF;EAEA,OAAO,IAAI;AACb","ignoreList":[]}
@@ -2,57 +2,91 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _regeneratorRuntime from "@babel/runtime/regenerator";
3
3
  import { imageNotFound } from '../../images';
4
4
  import { fetchLighthouseLogo } from '../fetch-lighthouse-logo';
5
+ import { isAbsoluteUrl } from '../validate-url/index.js';
5
6
  export var fetchImageForWeb = /*#__PURE__*/function () {
6
7
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(url, options) {
7
- var _options$isHeader, isHeader, Signature, Policy, KeyPairId, firstParamConnector, hasSignatureParams, constructedUrl, imageResponse, contentLengthHeader, _t;
8
+ var _options$isHeader, isHeader, Signature, Policy, KeyPairId, _options$context, context, error, firstParamConnector, hasSignatureParams, constructedUrl, imageResponse, contentLengthHeader, _t;
8
9
  return _regeneratorRuntime.wrap(function (_context) {
9
10
  while (1) switch (_context.prev = _context.next) {
10
11
  case 0:
11
- _options$isHeader = options.isHeader, isHeader = _options$isHeader === void 0 ? false : _options$isHeader, Signature = options.Signature, Policy = options.Policy, KeyPairId = options.KeyPairId;
12
- _context.prev = 1;
12
+ _options$isHeader = options.isHeader, isHeader = _options$isHeader === void 0 ? false : _options$isHeader, Signature = options.Signature, Policy = options.Policy, KeyPairId = options.KeyPairId, _options$context = options.context, context = _options$context === void 0 ? {} : _options$context; // Validate url parameter
13
+ if (!(!url || typeof url !== 'string')) {
14
+ _context.next = 2;
15
+ break;
16
+ }
17
+ error = new Error("fetchImageForWeb: Invalid url parameter. url=".concat(JSON.stringify(url)));
18
+ if (!isHeader) {
19
+ _context.next = 1;
20
+ break;
21
+ }
22
+ console.error('FetchImageHeaderError', {
23
+ message: error.message,
24
+ url: url,
25
+ context: context
26
+ });
27
+ return _context.abrupt("return", fetchLighthouseLogo());
28
+ case 1:
29
+ console.error('FetchImageError', {
30
+ message: error.message,
31
+ url: url,
32
+ context: context
33
+ });
34
+ return _context.abrupt("return", imageNotFound);
35
+ case 2:
36
+ _context.prev = 2;
13
37
  firstParamConnector = url.indexOf('?') > -1 ? '&' : '?';
14
38
  hasSignatureParams = url.includes('Signature=') && url.includes('Policy=') && url.includes('Key-Pair-Id=');
15
39
  constructedUrl = !hasSignatureParams ? "".concat(url).concat(firstParamConnector, "Signature=").concat(Signature, "&Policy=").concat(Policy, "&Key-Pair-Id=").concat(KeyPairId) : url;
16
40
  console.debug('Fetching image via CloudFront For Web');
17
- _context.next = 2;
41
+ _context.next = 3;
18
42
  return fetch(constructedUrl);
19
- case 2:
43
+ case 3:
20
44
  imageResponse = _context.sent;
21
45
  contentLengthHeader = imageResponse.headers.get('content-length');
22
46
  if (!(contentLengthHeader === '0')) {
23
- _context.next = 3;
47
+ _context.next = 4;
24
48
  break;
25
49
  }
26
- return _context.abrupt("return", Promise.reject(new Error("Failed to fetch image as no content length: ".concat(encodedUrl))));
27
- case 3:
50
+ return _context.abrupt("return", Promise.reject(new Error("Failed to fetch image as no content length: ".concat(url))));
51
+ case 4:
28
52
  if (imageResponse.ok) {
29
- _context.next = 4;
53
+ _context.next = 5;
30
54
  break;
31
55
  }
32
- return _context.abrupt("return", Promise.reject(new Error("Failed to fetch image: ".concat(encodedUrl))));
33
- case 4:
34
- _context.next = 5;
35
- return imageResponse.arrayBuffer();
56
+ return _context.abrupt("return", Promise.reject(new Error("Failed to fetch image: ".concat(url))));
36
57
  case 5:
37
- return _context.abrupt("return", _context.sent);
58
+ _context.next = 6;
59
+ return imageResponse.arrayBuffer();
38
60
  case 6:
39
- _context.prev = 6;
40
- _t = _context["catch"](1);
61
+ return _context.abrupt("return", _context.sent);
62
+ case 7:
63
+ _context.prev = 7;
64
+ _t = _context["catch"](2);
41
65
  if (!isHeader) {
42
- _context.next = 7;
66
+ _context.next = 8;
43
67
  break;
44
68
  }
45
69
  // NOTE: Replace failed headers with LH logo
46
- console.error('FetchImageHeaderError', _t);
70
+ console.error('FetchImageHeaderError', {
71
+ url: url,
72
+ message: _t.message,
73
+ context: context,
74
+ stack: _t.stack
75
+ });
47
76
  return _context.abrupt("return", fetchLighthouseLogo());
48
- case 7:
49
- console.error(_t);
50
- return _context.abrupt("return", imageNotFound);
51
77
  case 8:
78
+ console.error('FetchImageError', {
79
+ url: url,
80
+ message: _t.message,
81
+ context: context,
82
+ stack: _t.stack
83
+ });
84
+ return _context.abrupt("return", imageNotFound);
85
+ case 9:
52
86
  case "end":
53
87
  return _context.stop();
54
88
  }
55
- }, _callee, null, [[1, 6]]);
89
+ }, _callee, null, [[2, 7]]);
56
90
  }));
57
91
  return function fetchImageForWeb(_x, _x2) {
58
92
  return _ref.apply(this, arguments);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["imageNotFound","fetchLighthouseLogo","fetchImageForWeb","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","url","options","_options$isHeader","isHeader","Signature","Policy","KeyPairId","firstParamConnector","hasSignatureParams","constructedUrl","imageResponse","contentLengthHeader","_t","wrap","_context","prev","next","indexOf","includes","concat","console","debug","fetch","sent","headers","get","abrupt","Promise","reject","Error","encodedUrl","ok","arrayBuffer","error","stop","_x","_x2","apply","arguments"],"sources":["../../../src/helpers/fetch-image-for-web/index.js"],"sourcesContent":["import { imageNotFound } from '../../images'\nimport { fetchLighthouseLogo } from '../fetch-lighthouse-logo'\nexport const fetchImageForWeb = async function (url, options) {\n const { isHeader = false, Signature, Policy, KeyPairId } = options\n\n try {\n const firstParamConnector = url.indexOf('?') > -1 ? '&' : '?'\n\n const hasSignatureParams =\n url.includes('Signature=') &&\n url.includes('Policy=') &&\n url.includes('Key-Pair-Id=')\n\n const constructedUrl = !hasSignatureParams\n ? `${url}${firstParamConnector}Signature=${Signature}&Policy=${Policy}&Key-Pair-Id=${KeyPairId}`\n : url\n\n console.debug('Fetching image via CloudFront For Web')\n\n const imageResponse = await fetch(constructedUrl)\n\n const contentLengthHeader = imageResponse.headers.get('content-length')\n\n if (contentLengthHeader === '0') {\n return Promise.reject(\n new Error(`Failed to fetch image as no content length: ${encodedUrl}`)\n )\n }\n\n if (!imageResponse.ok) {\n return Promise.reject(new Error(`Failed to fetch image: ${encodedUrl}`))\n }\n\n return await imageResponse.arrayBuffer()\n } catch (error) {\n if (isHeader) {\n // NOTE: Replace failed headers with LH logo\n console.error('FetchImageHeaderError', error)\n return fetchLighthouseLogo()\n }\n\n console.error(error)\n return imageNotFound\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["imageNotFound","fetchLighthouseLogo","isAbsoluteUrl","fetchImageForWeb","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","url","options","_options$isHeader","isHeader","Signature","Policy","KeyPairId","_options$context","context","error","firstParamConnector","hasSignatureParams","constructedUrl","imageResponse","contentLengthHeader","_t","wrap","_context","prev","next","Error","concat","JSON","stringify","console","message","abrupt","indexOf","includes","debug","fetch","sent","headers","get","Promise","reject","ok","arrayBuffer","stack","stop","_x","_x2","apply","arguments"],"sources":["../../../src/helpers/fetch-image-for-web/index.js"],"sourcesContent":["import { imageNotFound } from '../../images'\nimport { fetchLighthouseLogo } from '../fetch-lighthouse-logo'\nimport { isAbsoluteUrl } from '../validate-url/index.js'\n\nexport const fetchImageForWeb = async function (url, options) {\n const {\n isHeader = false,\n Signature,\n Policy,\n KeyPairId,\n context = {},\n } = options\n\n // Validate url parameter\n if (!url || typeof url !== 'string') {\n const error = new Error(\n `fetchImageForWeb: Invalid url parameter. url=${JSON.stringify(url)}`\n )\n if (isHeader) {\n console.error('FetchImageHeaderError', {\n message: error.message,\n url,\n context,\n })\n return fetchLighthouseLogo()\n }\n console.error('FetchImageError', {\n message: error.message,\n url,\n context,\n })\n return imageNotFound\n }\n\n try {\n const firstParamConnector = url.indexOf('?') > -1 ? '&' : '?'\n\n const hasSignatureParams =\n url.includes('Signature=') &&\n url.includes('Policy=') &&\n url.includes('Key-Pair-Id=')\n\n const constructedUrl = !hasSignatureParams\n ? `${url}${firstParamConnector}Signature=${Signature}&Policy=${Policy}&Key-Pair-Id=${KeyPairId}`\n : url\n\n console.debug('Fetching image via CloudFront For Web')\n\n const imageResponse = await fetch(constructedUrl)\n\n const contentLengthHeader = imageResponse.headers.get('content-length')\n\n if (contentLengthHeader === '0') {\n return Promise.reject(\n new Error(`Failed to fetch image as no content length: ${url}`)\n )\n }\n\n if (!imageResponse.ok) {\n return Promise.reject(new Error(`Failed to fetch image: ${url}`))\n }\n\n return await imageResponse.arrayBuffer()\n } catch (error) {\n if (isHeader) {\n // NOTE: Replace failed headers with LH logo\n console.error('FetchImageHeaderError', {\n url,\n message: error.message,\n context,\n stack: error.stack,\n })\n return fetchLighthouseLogo()\n }\n\n console.error('FetchImageError', {\n url,\n message: error.message,\n context,\n stack: error.stack,\n })\n return imageNotFound\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Checks if a URL is absolute (starts with http:// or https://)
3
+ * @param {string} url - The URL to validate
4
+ * @returns {boolean} - True if URL is absolute, false otherwise
5
+ */
6
+ export function isAbsoluteUrl(url) {
7
+ if (!url || typeof url !== 'string') return false;
8
+ return url.startsWith('http://') || url.startsWith('https://');
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["isAbsoluteUrl","url","startsWith"],"sources":["../../../src/helpers/validate-url/index.js"],"sourcesContent":["/**\n * Checks if a URL is absolute (starts with http:// or https://)\n * @param {string} url - The URL to validate\n * @returns {boolean} - True if URL is absolute, false otherwise\n */\nexport function isAbsoluteUrl(url) {\n if (!url || typeof url !== 'string') return false\n return url.startsWith('http://') || url.startsWith('https://')\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,aAAaA,CAACC,GAAG,EAAE;EACjC,IAAI,CAACA,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAE,OAAO,KAAK;EACjD,OAAOA,GAAG,CAACC,UAAU,CAAC,SAAS,CAAC,IAAID,GAAG,CAACC,UAAU,CAAC,UAAU,CAAC;AAChE","ignoreList":[]}
@@ -1,4 +1,6 @@
1
1
  import { fetchImage, getTimezoneDatetime } from '../../../helpers';
2
+ import { LIGHTHOUSE_LOGO_URL } from '../../../constants';
3
+ import { isAbsoluteUrl } from '../../../helpers/validate-url/index.js';
2
4
  export function defaultHeader(_ref) {
3
5
  var Signature = _ref.Signature,
4
6
  Policy = _ref.Policy,
@@ -12,7 +14,15 @@ export function defaultHeader(_ref) {
12
14
  timestamp: timestamp,
13
15
  timezone: timezone
14
16
  });
15
- return fetchImage(logoUrl, {
17
+
18
+ // Validate logoUrl and use fallback if invalid
19
+ var effectiveLogoUrl = isAbsoluteUrl(logoUrl) ? logoUrl : LIGHTHOUSE_LOGO_URL;
20
+ if (!isAbsoluteUrl(logoUrl)) {
21
+ console.warn('defaultHeader: Invalid logoUrl, using Lighthouse logo', {
22
+ providedLogoUrl: logoUrl
23
+ });
24
+ }
25
+ return fetchImage(effectiveLogoUrl, {
16
26
  Signature: Signature,
17
27
  Policy: Policy,
18
28
  KeyPairId: KeyPairId,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["fetchImage","getTimezoneDatetime","defaultHeader","_ref","Signature","Policy","KeyPairId","logoUrl","timestamp","timezone","datetime","format","showTzAbbr","isHeader","then","image","columns","fit","margin","alignment","color","font","fontSize","text"],"sources":["../../../../src/pdf/helpers/default-header/index.js"],"sourcesContent":["import { fetchImage, getTimezoneDatetime } from '../../../helpers'\n\nexport function defaultHeader({\n Signature,\n Policy,\n KeyPairId,\n logoUrl,\n timestamp,\n timezone,\n}) {\n const datetime = getTimezoneDatetime({\n format: 'ddd, Do MMM YYYY',\n showTzAbbr: false,\n timestamp,\n timezone,\n })\n\n return fetchImage(logoUrl, {\n Signature,\n Policy,\n KeyPairId,\n isHeader: true,\n }).then(image => ({\n columns: [\n {\n fit: [130, 30],\n image,\n margin: [60, 60, 60, 0],\n },\n {\n alignment: 'right',\n color: '#999',\n font: 'Gotham',\n fontSize: 11,\n text: datetime,\n margin: [60, 70, 60, 0],\n },\n ],\n }))\n}\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,mBAAmB,QAAQ,kBAAkB;AAElE,OAAO,SAASC,aAAaA,CAAAC,IAAA,EAO1B;EAAA,IANDC,SAAS,GAAAD,IAAA,CAATC,SAAS;IACTC,MAAM,GAAAF,IAAA,CAANE,MAAM;IACNC,SAAS,GAAAH,IAAA,CAATG,SAAS;IACTC,OAAO,GAAAJ,IAAA,CAAPI,OAAO;IACPC,SAAS,GAAAL,IAAA,CAATK,SAAS;IACTC,QAAQ,GAAAN,IAAA,CAARM,QAAQ;EAER,IAAMC,QAAQ,GAAGT,mBAAmB,CAAC;IACnCU,MAAM,EAAE,kBAAkB;IAC1BC,UAAU,EAAE,KAAK;IACjBJ,SAAS,EAATA,SAAS;IACTC,QAAQ,EAARA;EACF,CAAC,CAAC;EAEF,OAAOT,UAAU,CAACO,OAAO,EAAE;IACzBH,SAAS,EAATA,SAAS;IACTC,MAAM,EAANA,MAAM;IACNC,SAAS,EAATA,SAAS;IACTO,QAAQ,EAAE;EACZ,CAAC,CAAC,CAACC,IAAI,CAAC,UAAAC,KAAK;IAAA,OAAK;MAChBC,OAAO,EAAE,CACP;QACEC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;QACdF,KAAK,EAALA,KAAK;QACLG,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;MACxB,CAAC,EACD;QACEC,SAAS,EAAE,OAAO;QAClBC,KAAK,EAAE,MAAM;QACbC,IAAI,EAAE,QAAQ;QACdC,QAAQ,EAAE,EAAE;QACZC,IAAI,EAAEb,QAAQ;QACdQ,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;MACxB,CAAC;IAEL,CAAC;EAAA,CAAC,CAAC;AACL","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["fetchImage","getTimezoneDatetime","LIGHTHOUSE_LOGO_URL","isAbsoluteUrl","defaultHeader","_ref","Signature","Policy","KeyPairId","logoUrl","timestamp","timezone","datetime","format","showTzAbbr","effectiveLogoUrl","console","warn","providedLogoUrl","isHeader","then","image","columns","fit","margin","alignment","color","font","fontSize","text"],"sources":["../../../../src/pdf/helpers/default-header/index.js"],"sourcesContent":["import { fetchImage, getTimezoneDatetime } from '../../../helpers'\nimport { LIGHTHOUSE_LOGO_URL } from '../../../constants'\nimport { isAbsoluteUrl } from '../../../helpers/validate-url/index.js'\n\nexport function defaultHeader({\n Signature,\n Policy,\n KeyPairId,\n logoUrl,\n timestamp,\n timezone,\n}) {\n const datetime = getTimezoneDatetime({\n format: 'ddd, Do MMM YYYY',\n showTzAbbr: false,\n timestamp,\n timezone,\n })\n\n // Validate logoUrl and use fallback if invalid\n const effectiveLogoUrl = isAbsoluteUrl(logoUrl)\n ? logoUrl\n : LIGHTHOUSE_LOGO_URL\n\n if (!isAbsoluteUrl(logoUrl)) {\n console.warn('defaultHeader: Invalid logoUrl, using Lighthouse logo', {\n providedLogoUrl: logoUrl,\n })\n }\n\n return fetchImage(effectiveLogoUrl, {\n Signature,\n Policy,\n KeyPairId,\n isHeader: true,\n }).then((image) => ({\n columns: [\n {\n fit: [130, 30],\n image,\n margin: [60, 60, 60, 0],\n },\n {\n alignment: 'right',\n color: '#999',\n font: 'Gotham',\n fontSize: 11,\n text: datetime,\n margin: [60, 70, 60, 0],\n },\n ],\n }))\n}\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,mBAAmB,QAAQ,kBAAkB;AAClE,SAASC,mBAAmB,QAAQ,oBAAoB;AACxD,SAASC,aAAa,QAAQ,wCAAwC;AAEtE,OAAO,SAASC,aAAaA,CAAAC,IAAA,EAO1B;EAAA,IANDC,SAAS,GAAAD,IAAA,CAATC,SAAS;IACTC,MAAM,GAAAF,IAAA,CAANE,MAAM;IACNC,SAAS,GAAAH,IAAA,CAATG,SAAS;IACTC,OAAO,GAAAJ,IAAA,CAAPI,OAAO;IACPC,SAAS,GAAAL,IAAA,CAATK,SAAS;IACTC,QAAQ,GAAAN,IAAA,CAARM,QAAQ;EAER,IAAMC,QAAQ,GAAGX,mBAAmB,CAAC;IACnCY,MAAM,EAAE,kBAAkB;IAC1BC,UAAU,EAAE,KAAK;IACjBJ,SAAS,EAATA,SAAS;IACTC,QAAQ,EAARA;EACF,CAAC,CAAC;;EAEF;EACA,IAAMI,gBAAgB,GAAGZ,aAAa,CAACM,OAAO,CAAC,GAC3CA,OAAO,GACPP,mBAAmB;EAEvB,IAAI,CAACC,aAAa,CAACM,OAAO,CAAC,EAAE;IAC3BO,OAAO,CAACC,IAAI,CAAC,uDAAuD,EAAE;MACpEC,eAAe,EAAET;IACnB,CAAC,CAAC;EACJ;EAEA,OAAOT,UAAU,CAACe,gBAAgB,EAAE;IAClCT,SAAS,EAATA,SAAS;IACTC,MAAM,EAANA,MAAM;IACNC,SAAS,EAATA,SAAS;IACTW,QAAQ,EAAE;EACZ,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,KAAK;IAAA,OAAM;MAClBC,OAAO,EAAE,CACP;QACEC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;QACdF,KAAK,EAALA,KAAK;QACLG,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;MACxB,CAAC,EACD;QACEC,SAAS,EAAE,OAAO;QAClBC,KAAK,EAAE,MAAM;QACbC,IAAI,EAAE,QAAQ;QACdC,QAAQ,EAAE,EAAE;QACZC,IAAI,EAAEjB,QAAQ;QACdY,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;MACxB,CAAC;IAEL,CAAC;EAAA,CAAC,CAAC;AACL","ignoreList":[]}
@@ -1,4 +1,7 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2
5
  import { isArray, isEmpty, join, first, map, startsWith } from 'lodash';
3
6
  import Promise from 'bluebird';
4
7
  import moment from 'moment-timezone';
@@ -31,7 +34,10 @@ function buildImage(options) {
31
34
  settings = _options$settings === void 0 ? {} : _options$settings,
32
35
  signedAsset = options.signedAsset,
33
36
  _options$width = options.width,
34
- width = _options$width === void 0 ? 210 : _options$width;
37
+ width = _options$width === void 0 ? 210 : _options$width,
38
+ fieldLabel = options.fieldLabel,
39
+ _options$fieldType = options.fieldType,
40
+ fieldType = _options$fieldType === void 0 ? 'image' : _options$fieldType;
35
41
  var awsS3BaseUrl = settings.awsS3BaseUrl,
36
42
  cloudinaryBaseUrl = settings.cloudinaryBaseUrl,
37
43
  cloudfrontBaseUrl = settings.cloudfrontBaseUrl,
@@ -58,7 +64,14 @@ function buildImage(options) {
58
64
  });
59
65
 
60
66
  // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context
61
- return fetchImage(url, settings).then(function (base64String) {
67
+ return fetchImage(url, _objectSpread(_objectSpread({}, settings), {}, {
68
+ context: {
69
+ stage: 'field',
70
+ fieldLabel: fieldLabel,
71
+ fieldType: fieldType,
72
+ filepath: filepath
73
+ }
74
+ })).then(function (base64String) {
62
75
  return {
63
76
  alignment: alignment,
64
77
  fit: [width, height],
@@ -108,7 +121,13 @@ export function buildSummaryField(_ref2) {
108
121
  };
109
122
  }
110
123
  // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context
111
- return fetchImage(value, settings).then(function (base64String) {
124
+ return fetchImage(value, _objectSpread(_objectSpread({}, settings), {}, {
125
+ context: {
126
+ stage: 'field',
127
+ fieldLabel: field.label,
128
+ fieldType: 'signature'
129
+ }
130
+ })).then(function (base64String) {
112
131
  return {
113
132
  alignment: 'left',
114
133
  image: base64String,
@@ -132,7 +151,9 @@ export function buildSummaryField(_ref2) {
132
151
  height: 140,
133
152
  width: 140,
134
153
  settings: settings,
135
- signedAsset: signedAssets && isArray(signedAssets) ? signedAssets[0] : null
154
+ signedAsset: signedAssets && isArray(signedAssets) ? signedAssets[0] : null,
155
+ fieldLabel: field.label,
156
+ fieldType: 'media'
136
157
  });
137
158
  return image;
138
159
  }
@@ -234,7 +255,13 @@ export function buildTemplateFieldRow(_ref3) {
234
255
  if (isSignatureField) {
235
256
  if (!value) return [labelText, ''];
236
257
  // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context
237
- return fetchImage(value, settings).then(function (base64String) {
258
+ return fetchImage(value, _objectSpread(_objectSpread({}, settings), {}, {
259
+ context: {
260
+ stage: 'field',
261
+ fieldLabel: label,
262
+ fieldType: 'signature'
263
+ }
264
+ })).then(function (base64String) {
238
265
  var values = {
239
266
  alignment: 'left',
240
267
  image: base64String,
@@ -244,24 +271,41 @@ export function buildTemplateFieldRow(_ref3) {
244
271
  });
245
272
  }
246
273
  if (isDisplayImageField) {
247
- return Promise.map([value], function (filepath, index) {
248
- var signedAssetValue = isArray(signedAssets) ? signedAssets === null || signedAssets === void 0 ? void 0 : signedAssets[index] : signedAssets;
274
+ // Guard against nullish values
275
+ if (!value) {
276
+ return [[], {}];
277
+ }
278
+
279
+ // Ensure value is always treated as an array of filepaths
280
+ var filepaths = isArray(value) ? value : [value];
281
+ return Promise.map(filepaths, function (filepath, index) {
282
+ var signedAssetValue = isArray(signedAssets) ? signedAssets[index] : signedAssets;
249
283
  return buildImage({
250
284
  filepath: filepath,
251
285
  settings: settings,
252
- signedAsset: signedAssetValue
286
+ signedAsset: signedAssetValue,
287
+ fieldLabel: label,
288
+ fieldType: 'image-display'
253
289
  });
254
290
  }).then(function (fieldImages) {
255
291
  return [fieldImages, {}];
256
292
  });
257
293
  }
258
294
  if (isPhotoField) {
295
+ // Guard against nullish values
296
+ if (!value || isArray(value) && value.length === 0) {
297
+ return [labelText, {
298
+ text: ''
299
+ }];
300
+ }
259
301
  return Promise.map(value, function (filepath, index) {
260
302
  var signedAssetValue = isArray(signedAssets) ? signedAssets[index] : signedAssets;
261
303
  return buildImage({
262
304
  filepath: filepath,
263
305
  settings: settings,
264
- signedAsset: signedAssetValue
306
+ signedAsset: signedAssetValue,
307
+ fieldLabel: label,
308
+ fieldType: 'media'
265
309
  });
266
310
  }).then(function (fieldImages) {
267
311
  var tables = !isEmpty(fieldImages) ? imageTables(fieldImages) : [];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["isArray","isEmpty","join","first","map","startsWith","Promise","moment","buildFetchUrl","fetchImage","videoIcon","imageTables","parseValue","text","toPdf","buildFile","_ref","file","settings","signedAsset","extension","name","path","awsS3BaseUrl","shouldUseCloudfront","cloudfrontBaseUrl","link","concat","margin","buildImage","options","_options$alignment","alignment","filepath","_options$height","height","_options$settings","_options$width","width","cloudinaryBaseUrl","isVideoType","RegExp","test","fit","image","url","quality","then","base64String","buildSummaryField","_ref2","field","timezone","fieldtype","_field$options","value","signedAssets","isDayFirstDateField","format","isMonthFirstDateField","isFileField","isHtmlField","type","isNumberField","isPhotoField","isReferenceField","isSelectField","isSignatureField","isStarField","isSwitchField","isTextField","is12HourTimeField","is24HourTimeField","isDataImage","fileList","ol","parsedValue","displayValue","fontSize","filter","val","label","tz","buildTemplateFieldRow","_ref3","skipped","_field$options2","_options$showOnRead","showOnRead","isDisplayImageField","length","labelText","parsed","replace","values","index","signedAssetValue","fieldImages","tables","imagesRow","colSpan","layout","hLineWidth","paddingLeft","paddingRight","paddingTop","paddingBottom","vLineWidth","table","body","_toConsumableArray","widths","string"],"sources":["../../../../src/pdf/helpers/fields/index.js"],"sourcesContent":["import { isArray, isEmpty, join, first, map, startsWith } from 'lodash'\nimport Promise from 'bluebird'\nimport moment from 'moment-timezone'\n\nimport { buildFetchUrl, fetchImage } from '../../../helpers'\nimport { videoIcon } from '../../../images'\nimport { imageTables, parseValue, text, toPdf } from '../'\n\nexport function buildFile({ file, settings, signedAsset }) {\n const { extension, name, path } = file\n const { awsS3BaseUrl, shouldUseCloudfront, cloudfrontBaseUrl } = settings\n\n const link = shouldUseCloudfront\n ? `${cloudfrontBaseUrl}/${signedAsset}`\n : `${awsS3BaseUrl}/${path}`\n\n return text(`${name}.${extension}`, { link, margin: [0, 0, 0, 10] })\n}\n\nfunction buildImage(options) {\n const {\n alignment = 'center',\n filepath,\n height = 210,\n settings = {},\n signedAsset,\n width = 210,\n } = options\n const {\n awsS3BaseUrl,\n cloudinaryBaseUrl,\n cloudfrontBaseUrl,\n shouldUseCloudfront,\n } = settings\n\n const isVideoType = new RegExp('.mp4$').test(filepath)\n\n const link = shouldUseCloudfront\n ? `${cloudfrontBaseUrl}/${signedAsset || filepath}`\n : `${awsS3BaseUrl}/${filepath}`\n\n if (isVideoType) {\n return {\n alignment,\n fit: [width, height],\n image: videoIcon,\n link,\n }\n }\n\n const url = buildFetchUrl(filepath, {\n awsS3BaseUrl,\n cloudfrontBaseUrl,\n cloudinaryBaseUrl,\n fit: true,\n height: 400,\n width: 600,\n quality: 50,\n shouldUseCloudfront,\n })\n\n // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context\n return fetchImage(url, settings).then((base64String) => ({\n alignment,\n fit: [width, height],\n image: base64String,\n link,\n }))\n}\n\nexport function buildSummaryField({ field, settings, timezone }) {\n const { fieldtype, options = {}, value, signedAssets } = field\n const isDayFirstDateField =\n fieldtype === 'date' && options.format === 'DD/MM/YY'\n const isMonthFirstDateField =\n fieldtype === 'date' && options.format === 'MM/DD/YY'\n const isFileField = fieldtype === 'file'\n const isHtmlField = fieldtype === 'text' && options.type === 'html'\n const isNumberField = fieldtype === 'number'\n const isPhotoField = fieldtype === 'list' && options.type === 'media'\n const isReferenceField = fieldtype === 'reference'\n const isSelectField = fieldtype === 'select' && options.type !== 'stars'\n const isSignatureField = fieldtype === 'text' && options.type === 'signature'\n const isStarField = fieldtype === 'select' && options.type === 'stars'\n const isSwitchField = fieldtype === 'switch'\n const isTextField = fieldtype === 'text'\n const is12HourTimeField = fieldtype === 'time' && options.format === 'h:mm a'\n const is24HourTimeField = fieldtype === 'time' && options.format === 'HH:mm'\n\n // NOTE: html field is not supported for the summary fields but adding\n // logic to catch this and return empty text for completeness\n if (isHtmlField) {\n return { text: '' }\n }\n\n if (isSignatureField) {\n if (!value) return ''\n\n if (isDataImage(value)) {\n return { alignment: 'left', image: value, width: 140 }\n }\n // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context\n return fetchImage(value, settings).then((base64String) => {\n return {\n alignment: 'left',\n image: base64String,\n width: 140,\n }\n })\n }\n\n if (isPhotoField) {\n const filepath = first(value)\n\n // NOTE: if no filepath return empty text as user has not uploaded an image\n // for this field\n if (!filepath) {\n return { text: '' }\n }\n\n const image = buildImage({\n alignment: 'left',\n filepath,\n height: 140,\n width: 140,\n settings,\n signedAsset:\n signedAssets && isArray(signedAssets) ? signedAssets[0] : null,\n })\n\n return image\n }\n\n if (isFileField) {\n const fileList = map(value, (file) => buildFile({ file, settings }))\n return { ol: fileList }\n }\n\n if (isNumberField || isSelectField || isSwitchField || isTextField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? { text: join(parsedValue, ', '), fontSize: 7 }\n : { text: parsedValue, fontSize: 7 }\n\n return displayValue\n }\n\n if (isReferenceField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? {\n text: parsedValue\n .filter((val) => val && val.label)\n .map((val) => val.label)\n .join(', '),\n fontSize: 7,\n }\n : { text: parsedValue.label, fontSize: 7 }\n\n return displayValue\n }\n\n if (isStarField) {\n if (!value) return ''\n const displayValue = value === '1' ? `${value} star` : `${value} stars`\n return displayValue\n }\n\n if (\n isDayFirstDateField ||\n isMonthFirstDateField ||\n is12HourTimeField ||\n is24HourTimeField\n ) {\n const format = options.format\n const displayValue = moment(value).tz(timezone).format(format)\n\n return displayValue\n }\n\n // NOTE: return empty text fallback value when no match\n return { text: '' }\n}\n\nexport function buildTemplateFieldRow({ field, settings, timezone, skipped }) {\n const { fieldtype, label, options = {}, value, signedAssets } = field\n const { showOnRead = true } = options\n\n const isDayFirstDateField =\n fieldtype === 'date' && options.format === 'DD/MM/YY'\n const isMonthFirstDateField =\n fieldtype === 'date' && options.format === 'MM/DD/YY'\n const isFileField = fieldtype === 'file'\n const isHtmlField = fieldtype === 'text' && options.type === 'html'\n const isNumberField = fieldtype === 'number'\n const isPhotoField = fieldtype === 'list' && options.type === 'media'\n const isSelectField = fieldtype === 'select' && options.type !== 'stars'\n const isSignatureField = fieldtype === 'text' && options.type === 'signature'\n const isStarField = fieldtype === 'select' && options.type === 'stars'\n const isSwitchField = fieldtype === 'switch'\n const isTextField = fieldtype === 'text'\n const is12HourTimeField = fieldtype === 'time' && options.format === 'h:mm a'\n const is24HourTimeField = fieldtype === 'time' && options.format === 'HH:mm'\n const isDisplayImageField =\n fieldtype === 'image-display' &&\n showOnRead &&\n !(isArray(value) && value.length === 0)\n const isReferenceField = fieldtype === 'reference'\n // NOTE: only show field when show on read is true\n if (!showOnRead) return null\n\n const labelText = [{ text: label }]\n\n if (skipped) {\n return [labelText, [{ text: '-' }]]\n }\n\n if (isHtmlField) {\n const parsed = value.replace(/<p><\\/p>/g, '')\n return [labelText, toPdf(parsed)]\n }\n\n if (isSignatureField) {\n if (!value) return [labelText, '']\n // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context\n return fetchImage(value, settings).then((base64String) => {\n const values = {\n alignment: 'left',\n image: base64String,\n width: 140,\n }\n return [labelText, values]\n })\n }\n\n if (isDisplayImageField) {\n return Promise.map([value], (filepath, index) => {\n const signedAssetValue = isArray(signedAssets)\n ? signedAssets?.[index]\n : signedAssets\n return buildImage({ filepath, settings, signedAsset: signedAssetValue })\n }).then((fieldImages) => [fieldImages, {}])\n }\n\n if (isPhotoField) {\n return Promise.map(value, (filepath, index) => {\n const signedAssetValue = isArray(signedAssets)\n ? signedAssets[index]\n : signedAssets\n return buildImage({ filepath, settings, signedAsset: signedAssetValue })\n }).then((fieldImages) => {\n const tables = !isEmpty(fieldImages) ? imageTables(fieldImages) : []\n\n const imagesRow = {\n colSpan: 2,\n layout: {\n hLineWidth: () => 0,\n paddingLeft: () => 0,\n paddingRight: () => 0,\n paddingTop: () => 0,\n paddingBottom: () => 0,\n vLineWidth: () => 0,\n },\n table: {\n body: [labelText, ...tables],\n widths: ['*'],\n },\n }\n\n // NOTE: pass empty value here as otherwise\n // we can accidentally hide content below\n // this row. Please see the following issue:\n // https://github.com/bpampuch/pdfmake/issues/1598\n return [imagesRow, {}]\n })\n }\n\n if (isFileField) {\n const fileList = map(value, (file, index) => {\n const signedAsset = signedAssets?.[index]\n return buildFile({ file, settings, signedAsset })\n })\n return [labelText, { ol: fileList }]\n }\n\n if (isNumberField || isSelectField || isSwitchField || isTextField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? { text: join(parsedValue, ', ') }\n : { text: parsedValue }\n\n return [labelText, displayValue]\n }\n\n if (isReferenceField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? {\n text: parsedValue\n .filter((val) => val && val.label)\n .map((val) => val.label)\n .join(', '),\n fontSize: 7,\n }\n : { text: parsedValue.label, fontSize: 7 }\n\n return [labelText, displayValue]\n }\n\n if (isStarField) {\n if (!value) return [labelText, '']\n const displayValue = value === '1' ? `${value} star` : `${value} stars`\n return [labelText, displayValue]\n }\n\n if (\n isDayFirstDateField ||\n isMonthFirstDateField ||\n is12HourTimeField ||\n is24HourTimeField\n ) {\n const format = options.format\n const displayValue = value ? moment(value).tz(timezone).format(format) : ''\n\n return [labelText, displayValue]\n }\n\n // NOTE: if no match above null values will be stripped within calling fn\n return null\n}\n\nfunction isDataImage(string) {\n return startsWith(string, 'data:image/png;')\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["isArray","isEmpty","join","first","map","startsWith","Promise","moment","buildFetchUrl","fetchImage","videoIcon","imageTables","parseValue","text","toPdf","buildFile","_ref","file","settings","signedAsset","extension","name","path","awsS3BaseUrl","shouldUseCloudfront","cloudfrontBaseUrl","link","concat","margin","buildImage","options","_options$alignment","alignment","filepath","_options$height","height","_options$settings","_options$width","width","fieldLabel","_options$fieldType","fieldType","cloudinaryBaseUrl","isVideoType","RegExp","test","fit","image","url","quality","_objectSpread","context","stage","then","base64String","buildSummaryField","_ref2","field","timezone","fieldtype","_field$options","value","signedAssets","isDayFirstDateField","format","isMonthFirstDateField","isFileField","isHtmlField","type","isNumberField","isPhotoField","isReferenceField","isSelectField","isSignatureField","isStarField","isSwitchField","isTextField","is12HourTimeField","is24HourTimeField","isDataImage","label","fileList","ol","parsedValue","displayValue","fontSize","filter","val","tz","buildTemplateFieldRow","_ref3","skipped","_field$options2","_options$showOnRead","showOnRead","isDisplayImageField","length","labelText","parsed","replace","values","filepaths","index","signedAssetValue","fieldImages","tables","imagesRow","colSpan","layout","hLineWidth","paddingLeft","paddingRight","paddingTop","paddingBottom","vLineWidth","table","body","_toConsumableArray","widths","string"],"sources":["../../../../src/pdf/helpers/fields/index.js"],"sourcesContent":["import { isArray, isEmpty, join, first, map, startsWith } from 'lodash'\nimport Promise from 'bluebird'\nimport moment from 'moment-timezone'\n\nimport { buildFetchUrl, fetchImage } from '../../../helpers'\nimport { videoIcon } from '../../../images'\nimport { imageTables, parseValue, text, toPdf } from '../'\n\nexport function buildFile({ file, settings, signedAsset }) {\n const { extension, name, path } = file\n const { awsS3BaseUrl, shouldUseCloudfront, cloudfrontBaseUrl } = settings\n\n const link = shouldUseCloudfront\n ? `${cloudfrontBaseUrl}/${signedAsset}`\n : `${awsS3BaseUrl}/${path}`\n\n return text(`${name}.${extension}`, { link, margin: [0, 0, 0, 10] })\n}\n\nfunction buildImage(options) {\n const {\n alignment = 'center',\n filepath,\n height = 210,\n settings = {},\n signedAsset,\n width = 210,\n fieldLabel,\n fieldType = 'image',\n } = options\n const {\n awsS3BaseUrl,\n cloudinaryBaseUrl,\n cloudfrontBaseUrl,\n shouldUseCloudfront,\n } = settings\n\n const isVideoType = new RegExp('.mp4$').test(filepath)\n\n const link = shouldUseCloudfront\n ? `${cloudfrontBaseUrl}/${signedAsset || filepath}`\n : `${awsS3BaseUrl}/${filepath}`\n\n if (isVideoType) {\n return {\n alignment,\n fit: [width, height],\n image: videoIcon,\n link,\n }\n }\n\n const url = buildFetchUrl(filepath, {\n awsS3BaseUrl,\n cloudfrontBaseUrl,\n cloudinaryBaseUrl,\n fit: true,\n height: 400,\n width: 600,\n quality: 50,\n shouldUseCloudfront,\n })\n\n // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context\n return fetchImage(url, {\n ...settings,\n context: {\n stage: 'field',\n fieldLabel,\n fieldType,\n filepath,\n },\n }).then((base64String) => ({\n alignment,\n fit: [width, height],\n image: base64String,\n link,\n }))\n}\n\nexport function buildSummaryField({ field, settings, timezone }) {\n const { fieldtype, options = {}, value, signedAssets } = field\n const isDayFirstDateField =\n fieldtype === 'date' && options.format === 'DD/MM/YY'\n const isMonthFirstDateField =\n fieldtype === 'date' && options.format === 'MM/DD/YY'\n const isFileField = fieldtype === 'file'\n const isHtmlField = fieldtype === 'text' && options.type === 'html'\n const isNumberField = fieldtype === 'number'\n const isPhotoField = fieldtype === 'list' && options.type === 'media'\n const isReferenceField = fieldtype === 'reference'\n const isSelectField = fieldtype === 'select' && options.type !== 'stars'\n const isSignatureField = fieldtype === 'text' && options.type === 'signature'\n const isStarField = fieldtype === 'select' && options.type === 'stars'\n const isSwitchField = fieldtype === 'switch'\n const isTextField = fieldtype === 'text'\n const is12HourTimeField = fieldtype === 'time' && options.format === 'h:mm a'\n const is24HourTimeField = fieldtype === 'time' && options.format === 'HH:mm'\n\n // NOTE: html field is not supported for the summary fields but adding\n // logic to catch this and return empty text for completeness\n if (isHtmlField) {\n return { text: '' }\n }\n\n if (isSignatureField) {\n if (!value) return ''\n\n if (isDataImage(value)) {\n return { alignment: 'left', image: value, width: 140 }\n }\n // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context\n return fetchImage(value, {\n ...settings,\n context: {\n stage: 'field',\n fieldLabel: field.label,\n fieldType: 'signature',\n },\n }).then((base64String) => {\n return {\n alignment: 'left',\n image: base64String,\n width: 140,\n }\n })\n }\n\n if (isPhotoField) {\n const filepath = first(value)\n\n // NOTE: if no filepath return empty text as user has not uploaded an image\n // for this field\n if (!filepath) {\n return { text: '' }\n }\n\n const image = buildImage({\n alignment: 'left',\n filepath,\n height: 140,\n width: 140,\n settings,\n signedAsset:\n signedAssets && isArray(signedAssets) ? signedAssets[0] : null,\n fieldLabel: field.label,\n fieldType: 'media',\n })\n\n return image\n }\n\n if (isFileField) {\n const fileList = map(value, (file) => buildFile({ file, settings }))\n return { ol: fileList }\n }\n\n if (isNumberField || isSelectField || isSwitchField || isTextField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? { text: join(parsedValue, ', '), fontSize: 7 }\n : { text: parsedValue, fontSize: 7 }\n\n return displayValue\n }\n\n if (isReferenceField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? {\n text: parsedValue\n .filter((val) => val && val.label)\n .map((val) => val.label)\n .join(', '),\n fontSize: 7,\n }\n : { text: parsedValue.label, fontSize: 7 }\n\n return displayValue\n }\n\n if (isStarField) {\n if (!value) return ''\n const displayValue = value === '1' ? `${value} star` : `${value} stars`\n return displayValue\n }\n\n if (\n isDayFirstDateField ||\n isMonthFirstDateField ||\n is12HourTimeField ||\n is24HourTimeField\n ) {\n const format = options.format\n const displayValue = moment(value).tz(timezone).format(format)\n\n return displayValue\n }\n\n // NOTE: return empty text fallback value when no match\n return { text: '' }\n}\n\nexport function buildTemplateFieldRow({ field, settings, timezone, skipped }) {\n const { fieldtype, label, options = {}, value, signedAssets } = field\n const { showOnRead = true } = options\n\n const isDayFirstDateField =\n fieldtype === 'date' && options.format === 'DD/MM/YY'\n const isMonthFirstDateField =\n fieldtype === 'date' && options.format === 'MM/DD/YY'\n const isFileField = fieldtype === 'file'\n const isHtmlField = fieldtype === 'text' && options.type === 'html'\n const isNumberField = fieldtype === 'number'\n const isPhotoField = fieldtype === 'list' && options.type === 'media'\n const isSelectField = fieldtype === 'select' && options.type !== 'stars'\n const isSignatureField = fieldtype === 'text' && options.type === 'signature'\n const isStarField = fieldtype === 'select' && options.type === 'stars'\n const isSwitchField = fieldtype === 'switch'\n const isTextField = fieldtype === 'text'\n const is12HourTimeField = fieldtype === 'time' && options.format === 'h:mm a'\n const is24HourTimeField = fieldtype === 'time' && options.format === 'HH:mm'\n const isDisplayImageField =\n fieldtype === 'image-display' &&\n showOnRead &&\n !(isArray(value) && value.length === 0)\n const isReferenceField = fieldtype === 'reference'\n // NOTE: only show field when show on read is true\n if (!showOnRead) return null\n\n const labelText = [{ text: label }]\n\n if (skipped) {\n return [labelText, [{ text: '-' }]]\n }\n\n if (isHtmlField) {\n const parsed = value.replace(/<p><\\/p>/g, '')\n return [labelText, toPdf(parsed)]\n }\n\n if (isSignatureField) {\n if (!value) return [labelText, '']\n // NOTE: shouldUseCloudfront, Signature, Policy and KeyPairId from settings are used in this context\n return fetchImage(value, {\n ...settings,\n context: {\n stage: 'field',\n fieldLabel: label,\n fieldType: 'signature',\n },\n }).then((base64String) => {\n const values = {\n alignment: 'left',\n image: base64String,\n width: 140,\n }\n return [labelText, values]\n })\n }\n\n if (isDisplayImageField) {\n // Guard against nullish values\n if (!value) {\n return [[], {}]\n }\n\n // Ensure value is always treated as an array of filepaths\n const filepaths = isArray(value) ? value : [value]\n return Promise.map(filepaths, (filepath, index) => {\n const signedAssetValue = isArray(signedAssets)\n ? signedAssets[index]\n : signedAssets\n return buildImage({\n filepath,\n settings,\n signedAsset: signedAssetValue,\n fieldLabel: label,\n fieldType: 'image-display',\n })\n }).then((fieldImages) => [fieldImages, {}])\n }\n\n if (isPhotoField) {\n // Guard against nullish values\n if (!value || (isArray(value) && value.length === 0)) {\n return [labelText, { text: '' }]\n }\n\n return Promise.map(value, (filepath, index) => {\n const signedAssetValue = isArray(signedAssets)\n ? signedAssets[index]\n : signedAssets\n return buildImage({\n filepath,\n settings,\n signedAsset: signedAssetValue,\n fieldLabel: label,\n fieldType: 'media',\n })\n }).then((fieldImages) => {\n const tables = !isEmpty(fieldImages) ? imageTables(fieldImages) : []\n\n const imagesRow = {\n colSpan: 2,\n layout: {\n hLineWidth: () => 0,\n paddingLeft: () => 0,\n paddingRight: () => 0,\n paddingTop: () => 0,\n paddingBottom: () => 0,\n vLineWidth: () => 0,\n },\n table: {\n body: [labelText, ...tables],\n widths: ['*'],\n },\n }\n\n // NOTE: pass empty value here as otherwise\n // we can accidentally hide content below\n // this row. Please see the following issue:\n // https://github.com/bpampuch/pdfmake/issues/1598\n return [imagesRow, {}]\n })\n }\n\n if (isFileField) {\n const fileList = map(value, (file, index) => {\n const signedAsset = signedAssets?.[index]\n return buildFile({ file, settings, signedAsset })\n })\n return [labelText, { ol: fileList }]\n }\n\n if (isNumberField || isSelectField || isSwitchField || isTextField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? { text: join(parsedValue, ', ') }\n : { text: parsedValue }\n\n return [labelText, displayValue]\n }\n\n if (isReferenceField) {\n const parsedValue = parseValue(value)\n const displayValue = isArray(parsedValue)\n ? {\n text: parsedValue\n .filter((val) => val && val.label)\n .map((val) => val.label)\n .join(', '),\n fontSize: 7,\n }\n : { text: parsedValue.label, fontSize: 7 }\n\n return [labelText, displayValue]\n }\n\n if (isStarField) {\n if (!value) return [labelText, '']\n const displayValue = value === '1' ? `${value} star` : `${value} stars`\n return [labelText, displayValue]\n }\n\n if (\n isDayFirstDateField ||\n isMonthFirstDateField ||\n is12HourTimeField ||\n is24HourTimeField\n ) {\n const format = options.format\n const displayValue = value ? moment(value).tz(timezone).format(format) : ''\n\n return [labelText, displayValue]\n }\n\n // NOTE: if no match above null values will be stripped within calling fn\n return null\n}\n\nfunction isDataImage(string) {\n return startsWith(string, 'data:image/png;')\n}\n"],"mappings":"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","ignoreList":[]}
@@ -57,8 +57,16 @@ export function generateDefinition(options) {
57
57
  pageSize: pageSize,
58
58
  styles: pdfStyles
59
59
  };
60
- }).catch(function (err) {
61
- throw new Error("GenerateDefinitionError: ".concat(err.message));
60
+ }).catch(function (error) {
61
+ // Preserve structured error information for better debugging
62
+ console.error('GenerateDefinitionError', {
63
+ message: error.message,
64
+ context: error.context,
65
+ url: error.url,
66
+ type: options.type,
67
+ stack: error.stack
68
+ });
69
+ throw error; // Preserve original error instead of wrapping
62
70
  });
63
71
  }
64
72
  function pdfHeader(header) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["defaults","isFunction","Promise","LIGHTHOUSE_LOGO_URL","DEFAULT_PAGE_MARGINS","DEFAULT_PAGE_ORIENTATION","DEFAULT_PAGE_SIZE","defaultFooter","defaultHeader","defaultStyles","generateDefinition","options","content","fileTitle","_options$footer","footer","sequenceId","_options$header","header","_options$logoUrl","logoUrl","_options$pageMargins","pageMargins","_options$pageOrientat","pageOrientation","_options$pageSize","pageSize","_options$styles","styles","timestamp","timezone","type","pdfStyles","pdfInfo","title","headerPromise","pdfHeader","contentPromise","pdfContent","footerPromise","pdfFooter","promises","all","then","_ref","_ref2","_slicedToArray","info","catch","err","Error","concat","message","resolve"],"sources":["../../../../src/pdf/helpers/generate-definition/index.js"],"sourcesContent":["import { defaults, isFunction } from 'lodash'\nimport Promise from 'bluebird'\n\nimport {\n LIGHTHOUSE_LOGO_URL,\n DEFAULT_PAGE_MARGINS,\n DEFAULT_PAGE_ORIENTATION,\n DEFAULT_PAGE_SIZE,\n} from '../../../constants'\n\nimport { defaultFooter, defaultHeader, defaultStyles } from '../'\n\nexport function generateDefinition(options) {\n const {\n content,\n fileTitle,\n footer = defaultFooter,\n sequenceId,\n header = defaultHeader,\n logoUrl = LIGHTHOUSE_LOGO_URL,\n pageMargins = DEFAULT_PAGE_MARGINS,\n pageOrientation = DEFAULT_PAGE_ORIENTATION,\n pageSize = DEFAULT_PAGE_SIZE,\n styles = {},\n timestamp,\n timezone,\n type,\n } = options\n\n const pdfStyles = defaults({}, styles, defaultStyles)\n const pdfInfo = { title: fileTitle }\n\n const headerPromise = pdfHeader(\n header({\n logoUrl,\n timestamp,\n timezone,\n })\n )\n\n const contentPromise = pdfContent(content)\n\n const footerPromise = pdfFooter(\n footer({\n sequenceId,\n logoUrl: LIGHTHOUSE_LOGO_URL,\n timestamp,\n timezone,\n type,\n })\n )\n\n const promises = [headerPromise, contentPromise, footerPromise]\n\n return Promise.all(promises)\n .then(([header, content, footer]) => ({\n header,\n content,\n footer,\n info: pdfInfo,\n pageMargins,\n pageOrientation,\n pageSize,\n styles: pdfStyles,\n }))\n .catch(err => {\n throw new Error(`GenerateDefinitionError: ${err.message}`)\n })\n}\n\nfunction pdfHeader(header) {\n if (isFunction(header)) {\n return Promise.resolve(header())\n }\n\n return Promise.resolve(header)\n}\n\nfunction pdfContent(content) {\n if (isFunction(content)) {\n return Promise.resolve(content())\n }\n\n return Promise.resolve(content)\n}\n\nfunction pdfFooter(footer) {\n if (isFunction(footer)) {\n return Promise.resolve(footer())\n }\n\n return Promise.resolve(footer)\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["defaults","isFunction","Promise","LIGHTHOUSE_LOGO_URL","DEFAULT_PAGE_MARGINS","DEFAULT_PAGE_ORIENTATION","DEFAULT_PAGE_SIZE","defaultFooter","defaultHeader","defaultStyles","generateDefinition","options","content","fileTitle","_options$footer","footer","sequenceId","_options$header","header","_options$logoUrl","logoUrl","_options$pageMargins","pageMargins","_options$pageOrientat","pageOrientation","_options$pageSize","pageSize","_options$styles","styles","timestamp","timezone","type","pdfStyles","pdfInfo","title","headerPromise","pdfHeader","contentPromise","pdfContent","footerPromise","pdfFooter","promises","all","then","_ref","_ref2","_slicedToArray","info","catch","error","console","message","context","url","stack","resolve"],"sources":["../../../../src/pdf/helpers/generate-definition/index.js"],"sourcesContent":["import { defaults, isFunction } from 'lodash'\nimport Promise from 'bluebird'\n\nimport {\n LIGHTHOUSE_LOGO_URL,\n DEFAULT_PAGE_MARGINS,\n DEFAULT_PAGE_ORIENTATION,\n DEFAULT_PAGE_SIZE,\n} from '../../../constants'\n\nimport { defaultFooter, defaultHeader, defaultStyles } from '../'\n\nexport function generateDefinition(options) {\n const {\n content,\n fileTitle,\n footer = defaultFooter,\n sequenceId,\n header = defaultHeader,\n logoUrl = LIGHTHOUSE_LOGO_URL,\n pageMargins = DEFAULT_PAGE_MARGINS,\n pageOrientation = DEFAULT_PAGE_ORIENTATION,\n pageSize = DEFAULT_PAGE_SIZE,\n styles = {},\n timestamp,\n timezone,\n type,\n } = options\n\n const pdfStyles = defaults({}, styles, defaultStyles)\n const pdfInfo = { title: fileTitle }\n\n const headerPromise = pdfHeader(\n header({\n logoUrl,\n timestamp,\n timezone,\n })\n )\n\n const contentPromise = pdfContent(content)\n\n const footerPromise = pdfFooter(\n footer({\n sequenceId,\n logoUrl: LIGHTHOUSE_LOGO_URL,\n timestamp,\n timezone,\n type,\n })\n )\n\n const promises = [headerPromise, contentPromise, footerPromise]\n\n return Promise.all(promises)\n .then(([header, content, footer]) => ({\n header,\n content,\n footer,\n info: pdfInfo,\n pageMargins,\n pageOrientation,\n pageSize,\n styles: pdfStyles,\n }))\n .catch((error) => {\n // Preserve structured error information for better debugging\n console.error('GenerateDefinitionError', {\n message: error.message,\n context: error.context,\n url: error.url,\n type: options.type,\n stack: error.stack,\n })\n throw error // Preserve original error instead of wrapping\n })\n}\n\nfunction pdfHeader(header) {\n if (isFunction(header)) {\n return Promise.resolve(header())\n }\n\n return Promise.resolve(header)\n}\n\nfunction pdfContent(content) {\n if (isFunction(content)) {\n return Promise.resolve(content())\n }\n\n return Promise.resolve(content)\n}\n\nfunction pdfFooter(footer) {\n if (isFunction(footer)) {\n return Promise.resolve(footer())\n }\n\n return Promise.resolve(footer)\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lighthouse/common",
3
- "version": "6.9.4",
3
+ "version": "6.9.6",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "lib/index.js",