@uploadcare/upload-client 6.6.1 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -405,7 +405,7 @@ const getUrl = (base, path, query) => {
405
405
  return url.toString();
406
406
  };
407
407
 
408
- var version = '6.6.1';
408
+ var version = '6.7.0';
409
409
 
410
410
  const LIBRARY_NAME = 'UploadcareUploadClient';
411
411
  const LIBRARY_VERSION = version;
@@ -779,6 +779,9 @@ function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent,
779
779
  });
780
780
  }
781
781
 
782
+ function isGroupFileInfo(fileInfo) {
783
+ return 'defaultEffects' in fileInfo;
784
+ }
782
785
  class UploadcareFile {
783
786
  uuid;
784
787
  name = null;
@@ -794,6 +797,7 @@ class UploadcareFile {
794
797
  contentInfo = null;
795
798
  metadata = null;
796
799
  s3Bucket = null;
800
+ defaultEffects = null;
797
801
  constructor(fileInfo, { baseCDN = defaultSettings.baseCDN, fileName } = {}) {
798
802
  const { uuid, s3Bucket } = fileInfo;
799
803
  const cdnUrl = getUrl(baseCDN, `${uuid}/`);
@@ -814,6 +818,9 @@ class UploadcareFile {
814
818
  this.metadata = fileInfo.metadata || null;
815
819
  this.s3Bucket = s3Bucket || null;
816
820
  this.s3Url = s3Url;
821
+ if (isGroupFileInfo(fileInfo)) {
822
+ this.defaultEffects = fileInfo.defaultEffects;
823
+ }
817
824
  }
818
825
  }
819
826
 
@@ -1511,14 +1518,16 @@ class UploadcareGroup {
1511
1518
  files;
1512
1519
  createdAt;
1513
1520
  storedAt = null;
1514
- constructor(groupInfo, files) {
1521
+ constructor(groupInfo, { baseCDN = defaultSettings.baseCDN } = {}) {
1515
1522
  this.uuid = groupInfo.id;
1516
1523
  this.filesCount = groupInfo.filesCount;
1517
- this.totalSize = Object.values(groupInfo.files).reduce((acc, file) => acc + file.size, 0);
1524
+ const groupFiles = groupInfo.files.filter(Boolean);
1525
+ this.totalSize = Object.values(groupFiles).reduce((acc, file) => acc + file.size, 0);
1518
1526
  this.isStored = !!groupInfo.datetimeStored;
1519
- this.isImage = !!Object.values(groupInfo.files).filter((file) => file.isImage).length;
1527
+ this.isImage = !!Object.values(groupFiles).filter((file) => file.isImage)
1528
+ .length;
1520
1529
  this.cdnUrl = groupInfo.cdnUrl;
1521
- this.files = files;
1530
+ this.files = groupFiles.map((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1522
1531
  this.createdAt = groupInfo.datetimeCreated;
1523
1532
  this.storedAt = groupInfo.datetimeStored;
1524
1533
  }
@@ -1576,27 +1585,34 @@ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.
1576
1585
  onProgress({ isComputable: true, value: normalize(progressValues) });
1577
1586
  };
1578
1587
  };
1579
- return Promise.all(data.map((file, index) => uploadFile(file, {
1580
- publicKey,
1581
- fileName,
1582
- baseURL,
1583
- secureSignature,
1584
- secureExpire,
1585
- store,
1586
- signal,
1587
- onProgress: createProgressHandler(filesCount, index),
1588
- source,
1589
- integration,
1590
- userAgent,
1591
- retryThrottledRequestMaxTimes,
1592
- retryNetworkErrorMaxTimes,
1593
- contentType,
1594
- multipartChunkSize,
1595
- baseCDN,
1596
- checkForUrlDuplicates,
1597
- saveUrlForRecurrentUploads
1598
- }))).then((files) => {
1599
- const uuids = files.map((file) => file.uuid);
1588
+ return Promise.all(data.map((file, index) => {
1589
+ if (isFileData(file) || isUrl(file)) {
1590
+ return uploadFile(file, {
1591
+ publicKey,
1592
+ fileName,
1593
+ baseURL,
1594
+ secureSignature,
1595
+ secureExpire,
1596
+ store,
1597
+ signal,
1598
+ onProgress: createProgressHandler(filesCount, index),
1599
+ source,
1600
+ integration,
1601
+ userAgent,
1602
+ retryThrottledRequestMaxTimes,
1603
+ retryNetworkErrorMaxTimes,
1604
+ contentType,
1605
+ multipartChunkSize,
1606
+ baseCDN,
1607
+ checkForUrlDuplicates,
1608
+ saveUrlForRecurrentUploads
1609
+ }).then((fileInfo) => fileInfo.uuid);
1610
+ }
1611
+ else {
1612
+ // Do not request file info by uuid before creating group because this isn't necessary
1613
+ return file;
1614
+ }
1615
+ })).then((uuids) => {
1600
1616
  return group(uuids, {
1601
1617
  publicKey,
1602
1618
  baseURL,
@@ -1610,7 +1626,7 @@ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.
1610
1626
  retryThrottledRequestMaxTimes,
1611
1627
  retryNetworkErrorMaxTimes
1612
1628
  })
1613
- .then((groupInfo) => new UploadcareGroup(groupInfo, files))
1629
+ .then((groupInfo) => new UploadcareGroup(groupInfo, { baseCDN }))
1614
1630
  .then((group) => {
1615
1631
  onProgress && onProgress({ isComputable: true, value: 1 });
1616
1632
  return group;
@@ -1681,32 +1697,32 @@ class UploadClient {
1681
1697
  }
1682
1698
 
1683
1699
  class Queue {
1684
- #concurrency = 1;
1685
- #pending = [];
1686
- #running = 0;
1687
- #resolvers = new WeakMap();
1688
- #rejectors = new WeakMap();
1700
+ _concurrency = 1;
1701
+ _pending = [];
1702
+ _running = 0;
1703
+ _resolvers = new Map();
1704
+ _rejectors = new Map();
1689
1705
  constructor(concurrency) {
1690
- this.#concurrency = concurrency;
1706
+ this._concurrency = concurrency;
1691
1707
  }
1692
- #run() {
1693
- const tasksLeft = this.#concurrency - this.#running;
1708
+ _run() {
1709
+ const tasksLeft = this._concurrency - this._running;
1694
1710
  for (let i = 0; i < tasksLeft; i++) {
1695
- const task = this.#pending.shift();
1711
+ const task = this._pending.shift();
1696
1712
  if (!task) {
1697
1713
  return;
1698
1714
  }
1699
- const resolver = this.#resolvers.get(task);
1700
- const rejector = this.#rejectors.get(task);
1715
+ const resolver = this._resolvers.get(task);
1716
+ const rejector = this._rejectors.get(task);
1701
1717
  if (!resolver || !rejector)
1702
1718
  throw new Error('Unexpected behavior: resolver or rejector is undefined');
1703
- this.#running += 1;
1719
+ this._running += 1;
1704
1720
  task()
1705
1721
  .finally(() => {
1706
- this.#resolvers.delete(task);
1707
- this.#rejectors.delete(task);
1708
- this.#running -= 1;
1709
- this.#run();
1722
+ this._resolvers.delete(task);
1723
+ this._rejectors.delete(task);
1724
+ this._running -= 1;
1725
+ this._run();
1710
1726
  })
1711
1727
  .then((value) => resolver(value))
1712
1728
  .catch((error) => rejector(error));
@@ -1714,24 +1730,24 @@ class Queue {
1714
1730
  }
1715
1731
  add(task) {
1716
1732
  return new Promise((resolve, reject) => {
1717
- this.#resolvers.set(task, resolve);
1718
- this.#rejectors.set(task, reject);
1719
- this.#pending.push(task);
1720
- this.#run();
1733
+ this._resolvers.set(task, resolve);
1734
+ this._rejectors.set(task, reject);
1735
+ this._pending.push(task);
1736
+ this._run();
1721
1737
  });
1722
1738
  }
1723
1739
  get pending() {
1724
- return this.#pending.length;
1740
+ return this._pending.length;
1725
1741
  }
1726
1742
  get running() {
1727
- return this.#running;
1743
+ return this._running;
1728
1744
  }
1729
1745
  set concurrency(value) {
1730
- this.#concurrency = value;
1731
- this.#run();
1746
+ this._concurrency = value;
1747
+ this._run();
1732
1748
  }
1733
1749
  get concurrency() {
1734
- return this.#concurrency;
1750
+ return this._concurrency;
1735
1751
  }
1736
1752
  }
1737
1753
 
@@ -126,12 +126,15 @@ export type FileInfo = {
126
126
  s3Bucket?: string;
127
127
  metadata?: Metadata;
128
128
  };
129
+ export type GroupFileInfo = FileInfo & {
130
+ defaultEffects: string;
131
+ };
129
132
  export type GroupInfo = {
130
133
  datetimeCreated: string;
131
134
  datetimeStored: string | null;
132
135
  filesCount: string;
133
136
  cdnUrl: string;
134
- files: FileInfo[];
137
+ files: (GroupFileInfo | null)[];
135
138
  url: string;
136
139
  id: GroupId;
137
140
  };
@@ -347,7 +350,8 @@ export declare class UploadcareFile {
347
350
  readonly contentInfo: null | ContentInfo;
348
351
  readonly metadata: null | Metadata;
349
352
  readonly s3Bucket: null | string;
350
- constructor(fileInfo: FileInfo, { baseCDN, fileName }?: {
353
+ readonly defaultEffects: null | string;
354
+ constructor(fileInfo: FileInfo | GroupFileInfo, { baseCDN, fileName }?: {
351
355
  baseCDN?: string;
352
356
  fileName?: string;
353
357
  });
@@ -449,7 +453,9 @@ export declare class UploadcareGroup {
449
453
  readonly files: UploadcareFile[];
450
454
  readonly createdAt: string;
451
455
  readonly storedAt: string | null;
452
- constructor(groupInfo: GroupInfo, files: UploadcareFile[]);
456
+ constructor(groupInfo: GroupInfo, { baseCDN }?: {
457
+ baseCDN?: string;
458
+ });
453
459
  }
454
460
  export type GroupFromOptions = {
455
461
  jsonpCallback?: string;
@@ -474,8 +480,13 @@ export declare class UploadClient {
474
480
  }
475
481
  export type Task<T = unknown> = () => Promise<T>;
476
482
  export declare class Queue {
477
- #private;
483
+ private _concurrency;
484
+ private _pending;
485
+ private _running;
486
+ private _resolvers;
487
+ private _rejectors;
478
488
  constructor(concurrency: number);
489
+ private _run;
479
490
  add<T>(task: Task<T>): Promise<T>;
480
491
  get pending(): number;
481
492
  get running(): number;
@@ -126,12 +126,15 @@ export type FileInfo = {
126
126
  s3Bucket?: string;
127
127
  metadata?: Metadata;
128
128
  };
129
+ export type GroupFileInfo = FileInfo & {
130
+ defaultEffects: string;
131
+ };
129
132
  export type GroupInfo = {
130
133
  datetimeCreated: string;
131
134
  datetimeStored: string | null;
132
135
  filesCount: string;
133
136
  cdnUrl: string;
134
- files: FileInfo[];
137
+ files: (GroupFileInfo | null)[];
135
138
  url: string;
136
139
  id: GroupId;
137
140
  };
@@ -347,7 +350,8 @@ export declare class UploadcareFile {
347
350
  readonly contentInfo: null | ContentInfo;
348
351
  readonly metadata: null | Metadata;
349
352
  readonly s3Bucket: null | string;
350
- constructor(fileInfo: FileInfo, { baseCDN, fileName }?: {
353
+ readonly defaultEffects: null | string;
354
+ constructor(fileInfo: FileInfo | GroupFileInfo, { baseCDN, fileName }?: {
351
355
  baseCDN?: string;
352
356
  fileName?: string;
353
357
  });
@@ -449,7 +453,9 @@ export declare class UploadcareGroup {
449
453
  readonly files: UploadcareFile[];
450
454
  readonly createdAt: string;
451
455
  readonly storedAt: string | null;
452
- constructor(groupInfo: GroupInfo, files: UploadcareFile[]);
456
+ constructor(groupInfo: GroupInfo, { baseCDN }?: {
457
+ baseCDN?: string;
458
+ });
453
459
  }
454
460
  export type GroupFromOptions = {
455
461
  jsonpCallback?: string;
@@ -474,8 +480,13 @@ export declare class UploadClient {
474
480
  }
475
481
  export type Task<T = unknown> = () => Promise<T>;
476
482
  export declare class Queue {
477
- #private;
483
+ private _concurrency;
484
+ private _pending;
485
+ private _running;
486
+ private _resolvers;
487
+ private _rejectors;
478
488
  constructor(concurrency: number);
489
+ private _run;
479
490
  add<T>(task: Task<T>): Promise<T>;
480
491
  get pending(): number;
481
492
  get running(): number;
@@ -395,7 +395,7 @@ const getUrl = (base, path, query) => {
395
395
  return url.toString();
396
396
  };
397
397
 
398
- var version = '6.6.1';
398
+ var version = '6.7.0';
399
399
 
400
400
  const LIBRARY_NAME = 'UploadcareUploadClient';
401
401
  const LIBRARY_VERSION = version;
@@ -769,6 +769,9 @@ function isReadyPoll({ file, publicKey, baseURL, source, integration, userAgent,
769
769
  });
770
770
  }
771
771
 
772
+ function isGroupFileInfo(fileInfo) {
773
+ return 'defaultEffects' in fileInfo;
774
+ }
772
775
  class UploadcareFile {
773
776
  uuid;
774
777
  name = null;
@@ -784,6 +787,7 @@ class UploadcareFile {
784
787
  contentInfo = null;
785
788
  metadata = null;
786
789
  s3Bucket = null;
790
+ defaultEffects = null;
787
791
  constructor(fileInfo, { baseCDN = defaultSettings.baseCDN, fileName } = {}) {
788
792
  const { uuid, s3Bucket } = fileInfo;
789
793
  const cdnUrl = getUrl(baseCDN, `${uuid}/`);
@@ -804,6 +808,9 @@ class UploadcareFile {
804
808
  this.metadata = fileInfo.metadata || null;
805
809
  this.s3Bucket = s3Bucket || null;
806
810
  this.s3Url = s3Url;
811
+ if (isGroupFileInfo(fileInfo)) {
812
+ this.defaultEffects = fileInfo.defaultEffects;
813
+ }
807
814
  }
808
815
  }
809
816
 
@@ -1481,14 +1488,16 @@ class UploadcareGroup {
1481
1488
  files;
1482
1489
  createdAt;
1483
1490
  storedAt = null;
1484
- constructor(groupInfo, files) {
1491
+ constructor(groupInfo, { baseCDN = defaultSettings.baseCDN } = {}) {
1485
1492
  this.uuid = groupInfo.id;
1486
1493
  this.filesCount = groupInfo.filesCount;
1487
- this.totalSize = Object.values(groupInfo.files).reduce((acc, file) => acc + file.size, 0);
1494
+ const groupFiles = groupInfo.files.filter(Boolean);
1495
+ this.totalSize = Object.values(groupFiles).reduce((acc, file) => acc + file.size, 0);
1488
1496
  this.isStored = !!groupInfo.datetimeStored;
1489
- this.isImage = !!Object.values(groupInfo.files).filter((file) => file.isImage).length;
1497
+ this.isImage = !!Object.values(groupFiles).filter((file) => file.isImage)
1498
+ .length;
1490
1499
  this.cdnUrl = groupInfo.cdnUrl;
1491
- this.files = files;
1500
+ this.files = groupFiles.map((fileInfo) => new UploadcareFile(fileInfo, { baseCDN }));
1492
1501
  this.createdAt = groupInfo.datetimeCreated;
1493
1502
  this.storedAt = groupInfo.datetimeStored;
1494
1503
  }
@@ -1546,27 +1555,34 @@ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.
1546
1555
  onProgress({ isComputable: true, value: normalize(progressValues) });
1547
1556
  };
1548
1557
  };
1549
- return Promise.all(data.map((file, index) => uploadFile(file, {
1550
- publicKey,
1551
- fileName,
1552
- baseURL,
1553
- secureSignature,
1554
- secureExpire,
1555
- store,
1556
- signal,
1557
- onProgress: createProgressHandler(filesCount, index),
1558
- source,
1559
- integration,
1560
- userAgent,
1561
- retryThrottledRequestMaxTimes,
1562
- retryNetworkErrorMaxTimes,
1563
- contentType,
1564
- multipartChunkSize,
1565
- baseCDN,
1566
- checkForUrlDuplicates,
1567
- saveUrlForRecurrentUploads
1568
- }))).then((files) => {
1569
- const uuids = files.map((file) => file.uuid);
1558
+ return Promise.all(data.map((file, index) => {
1559
+ if (isFileData(file) || isUrl(file)) {
1560
+ return uploadFile(file, {
1561
+ publicKey,
1562
+ fileName,
1563
+ baseURL,
1564
+ secureSignature,
1565
+ secureExpire,
1566
+ store,
1567
+ signal,
1568
+ onProgress: createProgressHandler(filesCount, index),
1569
+ source,
1570
+ integration,
1571
+ userAgent,
1572
+ retryThrottledRequestMaxTimes,
1573
+ retryNetworkErrorMaxTimes,
1574
+ contentType,
1575
+ multipartChunkSize,
1576
+ baseCDN,
1577
+ checkForUrlDuplicates,
1578
+ saveUrlForRecurrentUploads
1579
+ }).then((fileInfo) => fileInfo.uuid);
1580
+ }
1581
+ else {
1582
+ // Do not request file info by uuid before creating group because this isn't necessary
1583
+ return file;
1584
+ }
1585
+ })).then((uuids) => {
1570
1586
  return group(uuids, {
1571
1587
  publicKey,
1572
1588
  baseURL,
@@ -1580,7 +1596,7 @@ function uploadFileGroup(data, { publicKey, fileName, baseURL = defaultSettings.
1580
1596
  retryThrottledRequestMaxTimes,
1581
1597
  retryNetworkErrorMaxTimes
1582
1598
  })
1583
- .then((groupInfo) => new UploadcareGroup(groupInfo, files))
1599
+ .then((groupInfo) => new UploadcareGroup(groupInfo, { baseCDN }))
1584
1600
  .then((group) => {
1585
1601
  onProgress && onProgress({ isComputable: true, value: 1 });
1586
1602
  return group;
@@ -1651,32 +1667,32 @@ class UploadClient {
1651
1667
  }
1652
1668
 
1653
1669
  class Queue {
1654
- #concurrency = 1;
1655
- #pending = [];
1656
- #running = 0;
1657
- #resolvers = new WeakMap();
1658
- #rejectors = new WeakMap();
1670
+ _concurrency = 1;
1671
+ _pending = [];
1672
+ _running = 0;
1673
+ _resolvers = new Map();
1674
+ _rejectors = new Map();
1659
1675
  constructor(concurrency) {
1660
- this.#concurrency = concurrency;
1676
+ this._concurrency = concurrency;
1661
1677
  }
1662
- #run() {
1663
- const tasksLeft = this.#concurrency - this.#running;
1678
+ _run() {
1679
+ const tasksLeft = this._concurrency - this._running;
1664
1680
  for (let i = 0; i < tasksLeft; i++) {
1665
- const task = this.#pending.shift();
1681
+ const task = this._pending.shift();
1666
1682
  if (!task) {
1667
1683
  return;
1668
1684
  }
1669
- const resolver = this.#resolvers.get(task);
1670
- const rejector = this.#rejectors.get(task);
1685
+ const resolver = this._resolvers.get(task);
1686
+ const rejector = this._rejectors.get(task);
1671
1687
  if (!resolver || !rejector)
1672
1688
  throw new Error('Unexpected behavior: resolver or rejector is undefined');
1673
- this.#running += 1;
1689
+ this._running += 1;
1674
1690
  task()
1675
1691
  .finally(() => {
1676
- this.#resolvers.delete(task);
1677
- this.#rejectors.delete(task);
1678
- this.#running -= 1;
1679
- this.#run();
1692
+ this._resolvers.delete(task);
1693
+ this._rejectors.delete(task);
1694
+ this._running -= 1;
1695
+ this._run();
1680
1696
  })
1681
1697
  .then((value) => resolver(value))
1682
1698
  .catch((error) => rejector(error));
@@ -1684,24 +1700,24 @@ class Queue {
1684
1700
  }
1685
1701
  add(task) {
1686
1702
  return new Promise((resolve, reject) => {
1687
- this.#resolvers.set(task, resolve);
1688
- this.#rejectors.set(task, reject);
1689
- this.#pending.push(task);
1690
- this.#run();
1703
+ this._resolvers.set(task, resolve);
1704
+ this._rejectors.set(task, reject);
1705
+ this._pending.push(task);
1706
+ this._run();
1691
1707
  });
1692
1708
  }
1693
1709
  get pending() {
1694
- return this.#pending.length;
1710
+ return this._pending.length;
1695
1711
  }
1696
1712
  get running() {
1697
- return this.#running;
1713
+ return this._running;
1698
1714
  }
1699
1715
  set concurrency(value) {
1700
- this.#concurrency = value;
1701
- this.#run();
1716
+ this._concurrency = value;
1717
+ this._run();
1702
1718
  }
1703
1719
  get concurrency() {
1704
- return this.#concurrency;
1720
+ return this._concurrency;
1705
1721
  }
1706
1722
  }
1707
1723
 
@@ -126,12 +126,15 @@ export type FileInfo = {
126
126
  s3Bucket?: string;
127
127
  metadata?: Metadata;
128
128
  };
129
+ export type GroupFileInfo = FileInfo & {
130
+ defaultEffects: string;
131
+ };
129
132
  export type GroupInfo = {
130
133
  datetimeCreated: string;
131
134
  datetimeStored: string | null;
132
135
  filesCount: string;
133
136
  cdnUrl: string;
134
- files: FileInfo[];
137
+ files: (GroupFileInfo | null)[];
135
138
  url: string;
136
139
  id: GroupId;
137
140
  };
@@ -347,7 +350,8 @@ export declare class UploadcareFile {
347
350
  readonly contentInfo: null | ContentInfo;
348
351
  readonly metadata: null | Metadata;
349
352
  readonly s3Bucket: null | string;
350
- constructor(fileInfo: FileInfo, { baseCDN, fileName }?: {
353
+ readonly defaultEffects: null | string;
354
+ constructor(fileInfo: FileInfo | GroupFileInfo, { baseCDN, fileName }?: {
351
355
  baseCDN?: string;
352
356
  fileName?: string;
353
357
  });
@@ -449,7 +453,9 @@ export declare class UploadcareGroup {
449
453
  readonly files: UploadcareFile[];
450
454
  readonly createdAt: string;
451
455
  readonly storedAt: string | null;
452
- constructor(groupInfo: GroupInfo, files: UploadcareFile[]);
456
+ constructor(groupInfo: GroupInfo, { baseCDN }?: {
457
+ baseCDN?: string;
458
+ });
453
459
  }
454
460
  export type GroupFromOptions = {
455
461
  jsonpCallback?: string;
@@ -474,8 +480,13 @@ export declare class UploadClient {
474
480
  }
475
481
  export type Task<T = unknown> = () => Promise<T>;
476
482
  export declare class Queue {
477
- #private;
483
+ private _concurrency;
484
+ private _pending;
485
+ private _running;
486
+ private _resolvers;
487
+ private _rejectors;
478
488
  constructor(concurrency: number);
489
+ private _run;
479
490
  add<T>(task: Task<T>): Promise<T>;
480
491
  get pending(): number;
481
492
  get running(): number;