@servicetitan/form 32.4.0 → 32.5.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.
@@ -1,6 +1,6 @@
1
1
  import { Component } from 'react';
2
- import { FileDescriptor, FilePickerProps } from '@servicetitan/design-system';
3
- import { FileUploaderConfig } from './config';
2
+ import type { FileDescriptor, FilePickerProps } from '@servicetitan/design-system';
3
+ import type { FileUploaderConfig } from './config';
4
4
  import { Uploader } from './uploader';
5
5
  interface UploadError {
6
6
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/file-uploader/file-uploader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,OAAO,CAAC;AAOhD,OAAO,EAAc,cAAc,EAAU,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGlG,OAAO,EAAE,kBAAkB,EAAqC,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,KAAK,uBAAuB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;AAEhG,UAAU,iBAAkB,SAAQ,IAAI,CAAC,eAAe,EAAE,uBAAuB,CAAC;IAC9E,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;CAC5C;AAED,qBACa,YAAa,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC1D,MAAM,CAAC,YAAY;;MAEjB;IAIM,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAExB,MAAM,EAAE,WAAW,EAAE,CAAM;IAEvC,QAAQ,EAAG,QAAQ,CAAC;gBAER,KAAK,EAAE,iBAAiB;IAMpC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;IASrC,WAAW;IAKX,oBAAoB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAgBlD;IAGF,mBAAmB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAiBjD;IAGF,iBAAiB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAU/C;IAEF,iBAAiB;IAejB,oBAAoB;IAIpB,cAAc,GAAI,MAAM,cAAc,UAWpC;IAEF,cAAc,GAAI,OAAO,QAAQ,UAa/B;IAEF,aAAa,GAAI,6BAA6B;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,UAgBnF;IAEF,YAAY,GAAI,UAAU,cAAc,UAQtC;IAEF,iBAAiB,aAEf;IAEF,MAAM;CAwDT"}
1
+ {"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/file-uploader/file-uploader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,OAAO,CAAC;AAOhD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,KAAK,uBAAuB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;AAEhG,UAAU,iBAAkB,SAAQ,IAAI,CAAC,eAAe,EAAE,uBAAuB,CAAC;IAC9E,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;CAC5C;AAED,qBACa,YAAa,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC1D,MAAM,CAAC,YAAY;;MAEjB;IAIM,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAExB,MAAM,EAAE,WAAW,EAAE,CAAM;IAEvC,QAAQ,EAAG,QAAQ,CAAC;gBAER,KAAK,EAAE,iBAAiB;IAMpC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;IASrC,WAAW;IAKX,oBAAoB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAgBlD;IAGF,mBAAmB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAiBjD;IAGF,iBAAiB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAU/C;IAEF,iBAAiB;IAejB,oBAAoB;IAIpB,cAAc,GAAI,MAAM,cAAc,UAWpC;IAEF,cAAc,GAAI,OAAO,QAAQ,UAa/B;IAEF,aAAa,GAAI,6BAA6B;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,UAgBnF;IAEF,YAAY,GAAI,UAAU,cAAc,UAQtC;IAEF,iBAAiB,aAEf;IAEF,MAAM;CAwDT"}
@@ -27,7 +27,7 @@ import { observer } from 'mobx-react';
27
27
  import { observable, action, makeObservable } from 'mobx';
28
28
  import { FilePicker, Banner } from '@servicetitan/design-system';
29
29
  import { Confirm } from '@servicetitan/confirm';
30
- import { FileUploaderConfig, FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';
30
+ import { FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';
31
31
  import { Uploader } from './uploader';
32
32
  import { v4 as uuid } from 'uuid';
33
33
  function immutableSplice(arr, start, deleteCount, ...items) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/file-uploader/file-uploader.tsx"],"sourcesContent":["import { Component, Fragment, FC } from 'react';\n\nimport { injectDependency, optional } from '@servicetitan/react-ioc';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport { FilePicker, FileDescriptor, Banner, FilePickerProps } from '@servicetitan/design-system';\nimport { Confirm } from '@servicetitan/confirm';\n\nimport { FileUploaderConfig, FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';\nimport { Uploader } from './uploader';\n\nimport { v4 as uuid } from 'uuid';\n\nfunction immutableSplice<T>(arr: T[], start: number, deleteCount: number, ...items: T[]) {\n return [...arr.slice(0, start), ...items, ...arr.slice(start + deleteCount)];\n}\n\ninterface UploadError {\n id: string;\n file: File;\n message?: string;\n}\n\ninterface UploadErrorsProps {\n errors: UploadError[];\n multiple?: boolean;\n className?: string;\n onClose(): void;\n}\n\nconst UploadErrors: FC<UploadErrorsProps> = ({ errors, className, onClose, multiple }) => {\n const title = multiple\n ? 'One or more files could not be uploaded:'\n : 'Your file could not be uploaded';\n\n return (\n <Banner icon status=\"critical\" title={title} className={className} onClose={onClose}>\n <ul className=\"p-x-0-i\">\n {errors.map(({ id, file, message }) => (\n <li key={id} style={!multiple ? { listStyle: 'none' } : {}}>\n {multiple && file.name}\n {message && (multiple ? ` (${message})` : message)}\n </li>\n ))}\n </ul>\n </Banner>\n );\n};\n\ntype ExcludedFilePickerProps = 'onDelete' | 'onDownload' | 'onReplace' | 'onSelected' | 'value';\n\ninterface FileUploaderProps extends Omit<FilePickerProps, ExcludedFilePickerProps> {\n config?: FileUploaderConfig;\n value: FileDescriptor[];\n folderName?: string;\n hideReplace?: boolean;\n hideDownload?: boolean;\n onChange?(value: FileDescriptor[]): void;\n}\n\n@observer\nexport class FileUploader extends Component<FileUploaderProps> {\n static defaultProps = {\n folderName: 'temp',\n };\n\n @injectDependency(FILE_UPLOADER_CONFIGURATION_TOKEN)\n @optional()\n declare config?: FileUploaderConfig;\n\n @observable errors: UploadError[] = [];\n\n uploader!: Uploader;\n\n constructor(props: FileUploaderProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n addError(file: File, message?: string) {\n this.errors.push({\n file,\n message,\n id: uuid(),\n });\n }\n\n @action\n clearErrors() {\n this.errors = [];\n }\n\n @action\n handleUploadProgress = (file: File, progress: number) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n uploadProgress: progress,\n })\n );\n } else {\n this.uploader.cancel(file);\n }\n };\n\n @action\n handleUploadSuccess = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n ...(message\n ? { file: message, displayName: file.name, downloadLink: message }\n : { file: file.name }),\n uploadProgress: undefined,\n })\n );\n }\n };\n\n @action\n handleUploadError = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.addError(file, message);\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n componentDidMount() {\n this.uploader = new Uploader(\n {\n ...this.config,\n ...this.props.config,\n },\n {\n progress: this.handleUploadProgress,\n success: this.handleUploadSuccess,\n error: this.handleUploadError,\n },\n this.props.folderName\n );\n }\n\n componentWillUnmount() {\n this.uploader.cancel();\n }\n\n handleDownload = (file: FileDescriptor) => {\n if (!file.downloadLink) {\n return;\n }\n\n const path =\n this.props.config?.downloadPath ??\n this.config?.downloadPath ??\n `/app/api/fileuploader/folders/${this.props.folderName}/files/`;\n\n window.open(path + file.downloadLink);\n };\n\n handleSelected = (files: FileList) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange([\n ...this.props.value,\n ...Array.from(files).map(file => ({\n file,\n uploadProgress: 0,\n })),\n ]);\n this.uploader.upload(files);\n };\n\n handleReplace = ({ file: { file }, newFile }: { file: FileDescriptor; newFile: File }) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.uploader.upload(newFile);\n\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n file: newFile,\n uploadProgress: 0,\n })\n );\n }\n };\n\n handleDelete = ({ file }: FileDescriptor) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n handleErrorsClose = () => {\n this.clearErrors();\n };\n\n render() {\n const {\n value,\n onChange,\n hideReplace,\n hideDownload,\n limitReached,\n multiple,\n config,\n folderName,\n ...rest\n } = this.props;\n\n if (!onChange && !value.length) {\n return null;\n }\n\n const readonlyProps = onChange\n ? {}\n : {\n onReplace: undefined,\n onDelete: undefined,\n limitReached: true,\n };\n\n return (\n <Fragment>\n {!!this.errors.length && (\n <UploadErrors\n errors={this.errors}\n onClose={this.handleErrorsClose}\n className=\"m-b-2\"\n multiple={multiple}\n />\n )}\n <Confirm\n onConfirm={this.handleDelete}\n title=\"Are you sure you want to delete this file?\"\n >\n {onDelete => (\n <FilePicker\n value={value.length ? value : undefined}\n onReplace={!hideReplace ? this.handleReplace : undefined}\n onSelected={this.handleSelected}\n onDelete={onDelete}\n onDownload={!hideDownload ? this.handleDownload : undefined}\n limitReached={limitReached}\n multiple={multiple}\n {...rest}\n {...readonlyProps}\n />\n )}\n </Confirm>\n </Fragment>\n );\n }\n}\n"],"names":["Component","Fragment","injectDependency","optional","observer","observable","action","makeObservable","FilePicker","Banner","Confirm","FileUploaderConfig","FILE_UPLOADER_CONFIGURATION_TOKEN","Uploader","v4","uuid","immutableSplice","arr","start","deleteCount","items","slice","UploadErrors","errors","className","onClose","multiple","title","icon","status","ul","map","id","file","message","li","style","listStyle","name","FileUploader","addError","push","clearErrors","componentDidMount","uploader","config","props","progress","handleUploadProgress","success","handleUploadSuccess","error","handleUploadError","folderName","componentWillUnmount","cancel","render","value","onChange","hideReplace","hideDownload","limitReached","rest","length","readonlyProps","onReplace","undefined","onDelete","handleErrorsClose","onConfirm","handleDelete","handleReplace","onSelected","handleSelected","onDownload","handleDownload","index","findIndex","fileDescriptor","uploadProgress","displayName","downloadLink","filter","path","downloadPath","window","open","files","Array","from","upload","newFile","defaultProps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/file-uploader/file-uploader.tsx"],"sourcesContent":["import { Component, Fragment, FC } from 'react';\n\nimport { injectDependency, optional } from '@servicetitan/react-ioc';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport type { FileDescriptor, FilePickerProps } from '@servicetitan/design-system';\nimport { FilePicker, Banner } from '@servicetitan/design-system';\nimport { Confirm } from '@servicetitan/confirm';\n\nimport type { FileUploaderConfig } from './config';\nimport { FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';\nimport { Uploader } from './uploader';\n\nimport { v4 as uuid } from 'uuid';\n\nfunction immutableSplice<T>(arr: T[], start: number, deleteCount: number, ...items: T[]) {\n return [...arr.slice(0, start), ...items, ...arr.slice(start + deleteCount)];\n}\n\ninterface UploadError {\n id: string;\n file: File;\n message?: string;\n}\n\ninterface UploadErrorsProps {\n errors: UploadError[];\n multiple?: boolean;\n className?: string;\n onClose(): void;\n}\n\nconst UploadErrors: FC<UploadErrorsProps> = ({ errors, className, onClose, multiple }) => {\n const title = multiple\n ? 'One or more files could not be uploaded:'\n : 'Your file could not be uploaded';\n\n return (\n <Banner icon status=\"critical\" title={title} className={className} onClose={onClose}>\n <ul className=\"p-x-0-i\">\n {errors.map(({ id, file, message }) => (\n <li key={id} style={!multiple ? { listStyle: 'none' } : {}}>\n {multiple && file.name}\n {message && (multiple ? ` (${message})` : message)}\n </li>\n ))}\n </ul>\n </Banner>\n );\n};\n\ntype ExcludedFilePickerProps = 'onDelete' | 'onDownload' | 'onReplace' | 'onSelected' | 'value';\n\ninterface FileUploaderProps extends Omit<FilePickerProps, ExcludedFilePickerProps> {\n config?: FileUploaderConfig;\n value: FileDescriptor[];\n folderName?: string;\n hideReplace?: boolean;\n hideDownload?: boolean;\n onChange?(value: FileDescriptor[]): void;\n}\n\n@observer\nexport class FileUploader extends Component<FileUploaderProps> {\n static defaultProps = {\n folderName: 'temp',\n };\n\n @injectDependency(FILE_UPLOADER_CONFIGURATION_TOKEN)\n @optional()\n declare config?: FileUploaderConfig;\n\n @observable errors: UploadError[] = [];\n\n uploader!: Uploader;\n\n constructor(props: FileUploaderProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n addError(file: File, message?: string) {\n this.errors.push({\n file,\n message,\n id: uuid(),\n });\n }\n\n @action\n clearErrors() {\n this.errors = [];\n }\n\n @action\n handleUploadProgress = (file: File, progress: number) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n uploadProgress: progress,\n })\n );\n } else {\n this.uploader.cancel(file);\n }\n };\n\n @action\n handleUploadSuccess = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n ...(message\n ? { file: message, displayName: file.name, downloadLink: message }\n : { file: file.name }),\n uploadProgress: undefined,\n })\n );\n }\n };\n\n @action\n handleUploadError = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.addError(file, message);\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n componentDidMount() {\n this.uploader = new Uploader(\n {\n ...this.config,\n ...this.props.config,\n },\n {\n progress: this.handleUploadProgress,\n success: this.handleUploadSuccess,\n error: this.handleUploadError,\n },\n this.props.folderName\n );\n }\n\n componentWillUnmount() {\n this.uploader.cancel();\n }\n\n handleDownload = (file: FileDescriptor) => {\n if (!file.downloadLink) {\n return;\n }\n\n const path =\n this.props.config?.downloadPath ??\n this.config?.downloadPath ??\n `/app/api/fileuploader/folders/${this.props.folderName}/files/`;\n\n window.open(path + file.downloadLink);\n };\n\n handleSelected = (files: FileList) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange([\n ...this.props.value,\n ...Array.from(files).map(file => ({\n file,\n uploadProgress: 0,\n })),\n ]);\n this.uploader.upload(files);\n };\n\n handleReplace = ({ file: { file }, newFile }: { file: FileDescriptor; newFile: File }) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.uploader.upload(newFile);\n\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n file: newFile,\n uploadProgress: 0,\n })\n );\n }\n };\n\n handleDelete = ({ file }: FileDescriptor) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n handleErrorsClose = () => {\n this.clearErrors();\n };\n\n render() {\n const {\n value,\n onChange,\n hideReplace,\n hideDownload,\n limitReached,\n multiple,\n config,\n folderName,\n ...rest\n } = this.props;\n\n if (!onChange && !value.length) {\n return null;\n }\n\n const readonlyProps = onChange\n ? {}\n : {\n onReplace: undefined,\n onDelete: undefined,\n limitReached: true,\n };\n\n return (\n <Fragment>\n {!!this.errors.length && (\n <UploadErrors\n errors={this.errors}\n onClose={this.handleErrorsClose}\n className=\"m-b-2\"\n multiple={multiple}\n />\n )}\n <Confirm\n onConfirm={this.handleDelete}\n title=\"Are you sure you want to delete this file?\"\n >\n {onDelete => (\n <FilePicker\n value={value.length ? value : undefined}\n onReplace={!hideReplace ? this.handleReplace : undefined}\n onSelected={this.handleSelected}\n onDelete={onDelete}\n onDownload={!hideDownload ? this.handleDownload : undefined}\n limitReached={limitReached}\n multiple={multiple}\n {...rest}\n {...readonlyProps}\n />\n )}\n </Confirm>\n </Fragment>\n );\n }\n}\n"],"names":["Component","Fragment","injectDependency","optional","observer","observable","action","makeObservable","FilePicker","Banner","Confirm","FILE_UPLOADER_CONFIGURATION_TOKEN","Uploader","v4","uuid","immutableSplice","arr","start","deleteCount","items","slice","UploadErrors","errors","className","onClose","multiple","title","icon","status","ul","map","id","file","message","li","style","listStyle","name","FileUploader","addError","push","clearErrors","componentDidMount","uploader","config","props","progress","handleUploadProgress","success","handleUploadSuccess","error","handleUploadError","folderName","componentWillUnmount","cancel","render","value","onChange","hideReplace","hideDownload","limitReached","rest","length","readonlyProps","onReplace","undefined","onDelete","handleErrorsClose","onConfirm","handleDelete","handleReplace","onSelected","handleSelected","onDownload","handleDownload","index","findIndex","fileDescriptor","uploadProgress","displayName","downloadLink","filter","path","downloadPath","window","open","files","Array","from","upload","newFile","defaultProps"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export { FileUploader } from './file-uploader';
2
- export { FileUploaderConfig, FileUploaderConfigurationProvider } from './config';
3
- export { FileDescriptor } from '@servicetitan/design-system';
2
+ export type { FileUploaderConfig } from './config';
3
+ export { FileUploaderConfigurationProvider } from './config';
4
+ export type { FileDescriptor } from '@servicetitan/design-system';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file-uploader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file-uploader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,5 +1,4 @@
1
1
  export { FileUploader } from './file-uploader';
2
- export { FileUploaderConfig, FileUploaderConfigurationProvider } from './config';
3
- export { FileDescriptor } from '@servicetitan/design-system';
2
+ export { FileUploaderConfigurationProvider } from './config';
4
3
 
5
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/file-uploader/index.ts"],"sourcesContent":["export { FileUploader } from './file-uploader';\nexport { FileUploaderConfig, FileUploaderConfigurationProvider } from './config';\nexport { FileDescriptor } from '@servicetitan/design-system';\n"],"names":["FileUploader","FileUploaderConfig","FileUploaderConfigurationProvider","FileDescriptor"],"mappings":"AAAA,SAASA,YAAY,QAAQ,kBAAkB;AAC/C,SAASC,kBAAkB,EAAEC,iCAAiC,QAAQ,WAAW;AACjF,SAASC,cAAc,QAAQ,8BAA8B"}
1
+ {"version":3,"sources":["../../src/file-uploader/index.ts"],"sourcesContent":["export { FileUploader } from './file-uploader';\nexport type { FileUploaderConfig } from './config';\nexport { FileUploaderConfigurationProvider } from './config';\nexport type { FileDescriptor } from '@servicetitan/design-system';\n"],"names":["FileUploader","FileUploaderConfigurationProvider"],"mappings":"AAAA,SAASA,YAAY,QAAQ,kBAAkB;AAE/C,SAASC,iCAAiC,QAAQ,WAAW"}
@@ -1,4 +1,4 @@
1
- import { FileUploaderConfig } from './config';
1
+ import type { FileUploaderConfig } from './config';
2
2
  export declare class Uploader {
3
3
  private readonly resumable;
4
4
  constructor(config?: FileUploaderConfig, handlers?: {
@@ -1 +1 @@
1
- {"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../../src/file-uploader/uploader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAsB9C,qBAAa,QAAQ;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAGlC,MAAM,GAAE,kBAAuB,EAC/B,QAAQ,GAAE;QACN,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7C,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACzC,EACN,UAAU,SAAY;IA4D1B,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ;IAU9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI;CAYrB"}
1
+ {"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../../src/file-uploader/uploader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAsBnD,qBAAa,QAAQ;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAGlC,MAAM,GAAE,kBAAuB,EAC/B,QAAQ,GAAE;QACN,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7C,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACzC,EACN,UAAU,SAAY;IA4D1B,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ;IAU9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI;CAYrB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/file-uploader/uploader.ts"],"sourcesContent":["import { v4 as uuid } from 'uuid';\n\nimport { FileUploaderConfig } from './config';\n\nconst Resumable = require('resumablejs');\n\ninterface Resumable {\n files: ResumableFile[];\n on(event: 'fileAdded', callback: (file: ResumableFile, event: Event) => void): void;\n on(event: 'fileProgress', callback: (file: ResumableFile, message?: string) => void): void;\n on(event: 'fileSuccess', callback: (file: ResumableFile, message?: string) => void): void;\n on(event: 'fileError', callback: (file: ResumableFile, message?: string) => void): void;\n addFile(file: File): void;\n upload(): void;\n cancel(): void;\n}\n\ninterface ResumableFile {\n file: File;\n progress(relative?: boolean): number;\n isComplete(): boolean;\n cancel(): void;\n}\n\nexport class Uploader {\n private readonly resumable: Resumable;\n\n constructor(\n config: FileUploaderConfig = {},\n handlers: {\n progress?(file: File, progress: number): void;\n success?(file: File, message?: string): void;\n error?(file: File, message?: string): void;\n } = {},\n folderName = 'default'\n ) {\n const { errorParser, ...configuration } = config;\n\n const resumable: Resumable = new Resumable({\n target: `/app/api/fileuploader/folders/${folderName}/files`,\n testChunks: false,\n simultaneousUploads: 1,\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n permanentErrors: [302, 400, 404, 415, 500, 501],\n generateUniqueIdentifier: () => uuid(),\n fileTypeErrorCallback: (file: File) => {\n handlers.error?.(\n file,\n `File type not allowed. Please provide file of type ${configuration.fileType\n ?.map(ext => `.${ext}`)\n ?.join(', ')}.`\n );\n },\n ...configuration,\n });\n\n resumable.on('fileAdded', () => {\n resumable.upload();\n });\n\n resumable.on('fileProgress', resumableFile => {\n if (resumableFile.isComplete()) {\n return;\n }\n\n let progress = Math.floor(resumableFile.progress(false) * 100);\n if (progress > 99) {\n progress = 99;\n }\n\n if (handlers.progress) {\n handlers.progress(resumableFile.file, progress);\n }\n });\n\n resumable.on('fileSuccess', (resumableFile, message) => {\n if (handlers.success) {\n handlers.success(resumableFile.file, message);\n }\n\n resumableFile.cancel();\n });\n\n resumable.on('fileError', (resumableFile, message) => {\n if (handlers.error) {\n handlers.error(resumableFile.file, errorParser ? errorParser(message) : message);\n }\n\n resumableFile.cancel();\n });\n\n this.resumable = resumable;\n }\n\n upload(source: File | FileList) {\n if (source instanceof File) {\n this.resumable.addFile(source);\n } else {\n for (const file of Array.from(source)) {\n this.resumable.addFile(file);\n }\n }\n }\n\n cancel(file?: File) {\n if (file) {\n for (const resumableFile of this.resumable.files) {\n if (resumableFile.file === file) {\n resumableFile.cancel();\n break;\n }\n }\n } else {\n this.resumable.cancel();\n }\n }\n}\n"],"names":["v4","uuid","Resumable","require","Uploader","upload","source","File","resumable","addFile","file","Array","from","cancel","resumableFile","files","config","handlers","folderName","errorParser","configuration","target","testChunks","simultaneousUploads","headers","permanentErrors","generateUniqueIdentifier","fileTypeErrorCallback","error","fileType","map","ext","join","on","isComplete","progress","Math","floor","message","success"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,MAAMC,IAAI,QAAQ,OAAO;AAIlC,MAAMC,YAAYC,QAAQ;AAoB1B,OAAO,MAAMC;IAsETC,OAAOC,MAAuB,EAAE;QAC5B,IAAIA,kBAAkBC,MAAM;YACxB,IAAI,CAACC,SAAS,CAACC,OAAO,CAACH;QAC3B,OAAO;YACH,KAAK,MAAMI,QAAQC,MAAMC,IAAI,CAACN,QAAS;gBACnC,IAAI,CAACE,SAAS,CAACC,OAAO,CAACC;YAC3B;QACJ;IACJ;IAEAG,OAAOH,IAAW,EAAE;QAChB,IAAIA,MAAM;YACN,KAAK,MAAMI,iBAAiB,IAAI,CAACN,SAAS,CAACO,KAAK,CAAE;gBAC9C,IAAID,cAAcJ,IAAI,KAAKA,MAAM;oBAC7BI,cAAcD,MAAM;oBACpB;gBACJ;YACJ;QACJ,OAAO;YACH,IAAI,CAACL,SAAS,CAACK,MAAM;QACzB;IACJ;IAxFA,YACIG,SAA6B,CAAC,CAAC,EAC/BC,WAII,CAAC,CAAC,EACNC,aAAa,SAAS,CACxB;QAVF,uBAAiBV,aAAjB,KAAA;QAWI,MAAM,EAAEW,WAAW,EAAE,GAAGC,eAAe,GAAGJ;QAE1C,MAAMR,YAAuB,IAAIN,UAAU;YACvCmB,QAAQ,CAAC,8BAA8B,EAAEH,WAAW,MAAM,CAAC;YAC3DI,YAAY;YACZC,qBAAqB;YACrBC,SAAS;gBAAE,oBAAoB;YAAiB;YAChDC,iBAAiB;gBAAC;gBAAK;gBAAK;gBAAK;gBAAK;gBAAK;aAAI;YAC/CC,0BAA0B,IAAMzB;YAChC0B,uBAAuB,CAACjB;oBAGsCU,6BAAAA,yBAF1DH;iBAAAA,kBAAAA,SAASW,KAAK,cAAdX,sCAAAA,qBAAAA,UACIP,MACA,CAAC,mDAAmD,GAAEU,0BAAAA,cAAcS,QAAQ,cAAtBT,+CAAAA,8BAAAA,wBAChDU,GAAG,CAACC,CAAAA,MAAO,CAAC,CAAC,EAAEA,KAAK,eAD4BX,kDAAAA,4BAEhDY,IAAI,CAAC,MAAM,CAAC,CAAC;YAE3B;YACA,GAAGZ,aAAa;QACpB;QAEAZ,UAAUyB,EAAE,CAAC,aAAa;YACtBzB,UAAUH,MAAM;QACpB;QAEAG,UAAUyB,EAAE,CAAC,gBAAgBnB,CAAAA;YACzB,IAAIA,cAAcoB,UAAU,IAAI;gBAC5B;YACJ;YAEA,IAAIC,WAAWC,KAAKC,KAAK,CAACvB,cAAcqB,QAAQ,CAAC,SAAS;YAC1D,IAAIA,WAAW,IAAI;gBACfA,WAAW;YACf;YAEA,IAAIlB,SAASkB,QAAQ,EAAE;gBACnBlB,SAASkB,QAAQ,CAACrB,cAAcJ,IAAI,EAAEyB;YAC1C;QACJ;QAEA3B,UAAUyB,EAAE,CAAC,eAAe,CAACnB,eAAewB;YACxC,IAAIrB,SAASsB,OAAO,EAAE;gBAClBtB,SAASsB,OAAO,CAACzB,cAAcJ,IAAI,EAAE4B;YACzC;YAEAxB,cAAcD,MAAM;QACxB;QAEAL,UAAUyB,EAAE,CAAC,aAAa,CAACnB,eAAewB;YACtC,IAAIrB,SAASW,KAAK,EAAE;gBAChBX,SAASW,KAAK,CAACd,cAAcJ,IAAI,EAAES,cAAcA,YAAYmB,WAAWA;YAC5E;YAEAxB,cAAcD,MAAM;QACxB;QAEA,IAAI,CAACL,SAAS,GAAGA;IACrB;AAwBJ"}
1
+ {"version":3,"sources":["../../src/file-uploader/uploader.ts"],"sourcesContent":["import { v4 as uuid } from 'uuid';\n\nimport type { FileUploaderConfig } from './config';\n\nconst Resumable = require('resumablejs');\n\ninterface Resumable {\n files: ResumableFile[];\n on(event: 'fileAdded', callback: (file: ResumableFile, event: Event) => void): void;\n on(event: 'fileProgress', callback: (file: ResumableFile, message?: string) => void): void;\n on(event: 'fileSuccess', callback: (file: ResumableFile, message?: string) => void): void;\n on(event: 'fileError', callback: (file: ResumableFile, message?: string) => void): void;\n addFile(file: File): void;\n upload(): void;\n cancel(): void;\n}\n\ninterface ResumableFile {\n file: File;\n progress(relative?: boolean): number;\n isComplete(): boolean;\n cancel(): void;\n}\n\nexport class Uploader {\n private readonly resumable: Resumable;\n\n constructor(\n config: FileUploaderConfig = {},\n handlers: {\n progress?(file: File, progress: number): void;\n success?(file: File, message?: string): void;\n error?(file: File, message?: string): void;\n } = {},\n folderName = 'default'\n ) {\n const { errorParser, ...configuration } = config;\n\n const resumable: Resumable = new Resumable({\n target: `/app/api/fileuploader/folders/${folderName}/files`,\n testChunks: false,\n simultaneousUploads: 1,\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n permanentErrors: [302, 400, 404, 415, 500, 501],\n generateUniqueIdentifier: () => uuid(),\n fileTypeErrorCallback: (file: File) => {\n handlers.error?.(\n file,\n `File type not allowed. Please provide file of type ${configuration.fileType\n ?.map(ext => `.${ext}`)\n ?.join(', ')}.`\n );\n },\n ...configuration,\n });\n\n resumable.on('fileAdded', () => {\n resumable.upload();\n });\n\n resumable.on('fileProgress', resumableFile => {\n if (resumableFile.isComplete()) {\n return;\n }\n\n let progress = Math.floor(resumableFile.progress(false) * 100);\n if (progress > 99) {\n progress = 99;\n }\n\n if (handlers.progress) {\n handlers.progress(resumableFile.file, progress);\n }\n });\n\n resumable.on('fileSuccess', (resumableFile, message) => {\n if (handlers.success) {\n handlers.success(resumableFile.file, message);\n }\n\n resumableFile.cancel();\n });\n\n resumable.on('fileError', (resumableFile, message) => {\n if (handlers.error) {\n handlers.error(resumableFile.file, errorParser ? errorParser(message) : message);\n }\n\n resumableFile.cancel();\n });\n\n this.resumable = resumable;\n }\n\n upload(source: File | FileList) {\n if (source instanceof File) {\n this.resumable.addFile(source);\n } else {\n for (const file of Array.from(source)) {\n this.resumable.addFile(file);\n }\n }\n }\n\n cancel(file?: File) {\n if (file) {\n for (const resumableFile of this.resumable.files) {\n if (resumableFile.file === file) {\n resumableFile.cancel();\n break;\n }\n }\n } else {\n this.resumable.cancel();\n }\n }\n}\n"],"names":["v4","uuid","Resumable","require","Uploader","upload","source","File","resumable","addFile","file","Array","from","cancel","resumableFile","files","config","handlers","folderName","errorParser","configuration","target","testChunks","simultaneousUploads","headers","permanentErrors","generateUniqueIdentifier","fileTypeErrorCallback","error","fileType","map","ext","join","on","isComplete","progress","Math","floor","message","success"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,MAAMC,IAAI,QAAQ,OAAO;AAIlC,MAAMC,YAAYC,QAAQ;AAoB1B,OAAO,MAAMC;IAsETC,OAAOC,MAAuB,EAAE;QAC5B,IAAIA,kBAAkBC,MAAM;YACxB,IAAI,CAACC,SAAS,CAACC,OAAO,CAACH;QAC3B,OAAO;YACH,KAAK,MAAMI,QAAQC,MAAMC,IAAI,CAACN,QAAS;gBACnC,IAAI,CAACE,SAAS,CAACC,OAAO,CAACC;YAC3B;QACJ;IACJ;IAEAG,OAAOH,IAAW,EAAE;QAChB,IAAIA,MAAM;YACN,KAAK,MAAMI,iBAAiB,IAAI,CAACN,SAAS,CAACO,KAAK,CAAE;gBAC9C,IAAID,cAAcJ,IAAI,KAAKA,MAAM;oBAC7BI,cAAcD,MAAM;oBACpB;gBACJ;YACJ;QACJ,OAAO;YACH,IAAI,CAACL,SAAS,CAACK,MAAM;QACzB;IACJ;IAxFA,YACIG,SAA6B,CAAC,CAAC,EAC/BC,WAII,CAAC,CAAC,EACNC,aAAa,SAAS,CACxB;QAVF,uBAAiBV,aAAjB,KAAA;QAWI,MAAM,EAAEW,WAAW,EAAE,GAAGC,eAAe,GAAGJ;QAE1C,MAAMR,YAAuB,IAAIN,UAAU;YACvCmB,QAAQ,CAAC,8BAA8B,EAAEH,WAAW,MAAM,CAAC;YAC3DI,YAAY;YACZC,qBAAqB;YACrBC,SAAS;gBAAE,oBAAoB;YAAiB;YAChDC,iBAAiB;gBAAC;gBAAK;gBAAK;gBAAK;gBAAK;gBAAK;aAAI;YAC/CC,0BAA0B,IAAMzB;YAChC0B,uBAAuB,CAACjB;oBAGsCU,6BAAAA,yBAF1DH;iBAAAA,kBAAAA,SAASW,KAAK,cAAdX,sCAAAA,qBAAAA,UACIP,MACA,CAAC,mDAAmD,GAAEU,0BAAAA,cAAcS,QAAQ,cAAtBT,+CAAAA,8BAAAA,wBAChDU,GAAG,CAACC,CAAAA,MAAO,CAAC,CAAC,EAAEA,KAAK,eAD4BX,kDAAAA,4BAEhDY,IAAI,CAAC,MAAM,CAAC,CAAC;YAE3B;YACA,GAAGZ,aAAa;QACpB;QAEAZ,UAAUyB,EAAE,CAAC,aAAa;YACtBzB,UAAUH,MAAM;QACpB;QAEAG,UAAUyB,EAAE,CAAC,gBAAgBnB,CAAAA;YACzB,IAAIA,cAAcoB,UAAU,IAAI;gBAC5B;YACJ;YAEA,IAAIC,WAAWC,KAAKC,KAAK,CAACvB,cAAcqB,QAAQ,CAAC,SAAS;YAC1D,IAAIA,WAAW,IAAI;gBACfA,WAAW;YACf;YAEA,IAAIlB,SAASkB,QAAQ,EAAE;gBACnBlB,SAASkB,QAAQ,CAACrB,cAAcJ,IAAI,EAAEyB;YAC1C;QACJ;QAEA3B,UAAUyB,EAAE,CAAC,eAAe,CAACnB,eAAewB;YACxC,IAAIrB,SAASsB,OAAO,EAAE;gBAClBtB,SAASsB,OAAO,CAACzB,cAAcJ,IAAI,EAAE4B;YACzC;YAEAxB,cAAcD,MAAM;QACxB;QAEAL,UAAUyB,EAAE,CAAC,aAAa,CAACnB,eAAewB;YACtC,IAAIrB,SAASW,KAAK,EAAE;gBAChBX,SAASW,KAAK,CAACd,cAAcJ,IAAI,EAAES,cAAcA,YAAYmB,WAAWA;YAC5E;YAEAxB,cAAcD,MAAM;QACxB;QAEA,IAAI,CAACL,SAAS,GAAGA;IACrB;AAwBJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/form",
3
- "version": "32.4.0",
3
+ "version": "32.5.0",
4
4
  "description": "",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/form",
6
6
  "repository": {
@@ -17,10 +17,10 @@
17
17
  ],
18
18
  "devDependencies": {
19
19
  "@progress/kendo-react-dateinputs": "~5.5.0",
20
- "@servicetitan/confirm": "^32.4.0",
21
- "@servicetitan/culture": "^32.4.0",
20
+ "@servicetitan/confirm": "^32.5.0",
21
+ "@servicetitan/culture": "^32.5.0",
22
22
  "@servicetitan/design-system": "~14.5.1",
23
- "@servicetitan/form-state": "^32.4.0",
23
+ "@servicetitan/form-state": "^32.5.0",
24
24
  "@servicetitan/hash-browser-router": "^31.6.0",
25
25
  "@servicetitan/react-ioc": "^31.6.0",
26
26
  "@servicetitan/tokens": ">=12.2.1",
@@ -38,10 +38,10 @@
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@progress/kendo-react-dateinputs": "~5.5.0",
41
- "@servicetitan/confirm": "^32.4.0",
42
- "@servicetitan/culture": "^32.4.0",
41
+ "@servicetitan/confirm": "^32.5.0",
42
+ "@servicetitan/culture": "^32.5.0",
43
43
  "@servicetitan/design-system": ">=13.2.1",
44
- "@servicetitan/form-state": "^32.4.0",
44
+ "@servicetitan/form-state": "^32.5.0",
45
45
  "@servicetitan/react-ioc": ">21.0.0",
46
46
  "@servicetitan/tokens": ">=12.2.1",
47
47
  "accounting": "~0.4.1",
@@ -65,5 +65,5 @@
65
65
  "less": true,
66
66
  "webpack": false
67
67
  },
68
- "gitHead": "3dab3310534a39aaacb0069e1d377579fe0a7fab"
68
+ "gitHead": "25988db91418cf6ff9018760bd03ef6c3d7ef8ec"
69
69
  }
@@ -5,10 +5,12 @@ import { injectDependency, optional } from '@servicetitan/react-ioc';
5
5
  import { observer } from 'mobx-react';
6
6
  import { observable, action, makeObservable } from 'mobx';
7
7
 
8
- import { FilePicker, FileDescriptor, Banner, FilePickerProps } from '@servicetitan/design-system';
8
+ import type { FileDescriptor, FilePickerProps } from '@servicetitan/design-system';
9
+ import { FilePicker, Banner } from '@servicetitan/design-system';
9
10
  import { Confirm } from '@servicetitan/confirm';
10
11
 
11
- import { FileUploaderConfig, FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';
12
+ import type { FileUploaderConfig } from './config';
13
+ import { FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';
12
14
  import { Uploader } from './uploader';
13
15
 
14
16
  import { v4 as uuid } from 'uuid';
@@ -1,3 +1,4 @@
1
1
  export { FileUploader } from './file-uploader';
2
- export { FileUploaderConfig, FileUploaderConfigurationProvider } from './config';
3
- export { FileDescriptor } from '@servicetitan/design-system';
2
+ export type { FileUploaderConfig } from './config';
3
+ export { FileUploaderConfigurationProvider } from './config';
4
+ export type { FileDescriptor } from '@servicetitan/design-system';
@@ -1,6 +1,6 @@
1
1
  import { v4 as uuid } from 'uuid';
2
2
 
3
- import { FileUploaderConfig } from './config';
3
+ import type { FileUploaderConfig } from './config';
4
4
 
5
5
  const Resumable = require('resumablejs');
6
6