Compare commits
7 Commits
master
...
isomorphic
| Author | SHA1 | Date | |
|---|---|---|---|
| 6e6edd4a55 | |||
| 9a67df1e7c | |||
| b996e33699 | |||
| 7039baf15d | |||
| b22e6731fc | |||
| b775b2e0ac | |||
| 576e3e08a4 |
@@ -63,6 +63,7 @@
|
||||
},
|
||||
"homepage": "https://github.com/yumauri/gotenberg-js-client#readme",
|
||||
"dependencies": {
|
||||
"detect-node": "^2.0.4",
|
||||
"form-data": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -70,6 +71,7 @@
|
||||
"@pika/plugin-build-node": "^0.9.2",
|
||||
"@pika/plugin-ts-standard-pkg": "^0.9.2",
|
||||
"@size-limit/preset-small-lib": "^4.5.0",
|
||||
"@types/detect-node": "^2.0.0",
|
||||
"@types/jest": "^25.2.2",
|
||||
"@types/node": "^13.13.4",
|
||||
"flowgen": "^1.10.0",
|
||||
|
||||
+2
-2
@@ -154,7 +154,7 @@ export type ConversionOptions =
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export type FileURI = string // TODO: https://github.com/microsoft/TypeScript/issues/6579
|
||||
export type PlainSource = string | Buffer | FileURI | NodeJS.ReadableStream
|
||||
export type PlainSource = string | Buffer | FileURI | NodeJS.ReadableStream | Blob | File
|
||||
export type TupleSource = [string, PlainSource]
|
||||
export type ObjectSource = { [name: string]: PlainSource }
|
||||
export type Source =
|
||||
@@ -164,7 +164,7 @@ export type Source =
|
||||
| ObjectSource
|
||||
| Array<PlainSource | TupleSource | ObjectSource>
|
||||
| Iterable<PlainSource | TupleSource | ObjectSource>
|
||||
export type TupleStreamsSource = [string, NodeJS.ReadableStream]
|
||||
export type TupleFormSource = [string, NodeJS.ReadableStream | Blob | File]
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// request headers ////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import isNode from 'detect-node'
|
||||
import { Readable } from 'stream'
|
||||
import { FileURI, ObjectSource, PlainSource, Source, TupleSource } from '../_types'
|
||||
|
||||
@@ -10,13 +11,25 @@ export const isString = (x: Source | undefined | null): x is string => typeof x
|
||||
* Check if argument is Buffer
|
||||
*/
|
||||
export const isBuffer = (x: Source | undefined | null): x is Buffer =>
|
||||
x != null && x instanceof Buffer
|
||||
x != null && isNode && typeof Buffer !== 'undefined' && x instanceof Buffer // tslint:disable-line strict-type-predicates
|
||||
|
||||
/**
|
||||
* Check if argument is Blob
|
||||
*/
|
||||
export const isBlob = (x: Source | undefined | null): x is Blob =>
|
||||
x != null && !isNode && typeof Blob !== 'undefined' && x instanceof Blob // tslint:disable-line strict-type-predicates
|
||||
|
||||
/**
|
||||
* Check if argument is File
|
||||
*/
|
||||
export const isFile = (x: Source | undefined | null): x is File =>
|
||||
x != null && !isNode && typeof File !== 'undefined' && x instanceof File // tslint:disable-line strict-type-predicates
|
||||
|
||||
/**
|
||||
* Check if argument is Stream
|
||||
*/
|
||||
export const isStream = (x: Source | undefined | null): x is NodeJS.ReadableStream =>
|
||||
x != null && x instanceof Readable
|
||||
x != null && isNode && x instanceof Readable
|
||||
|
||||
/**
|
||||
* Check if argument is URL
|
||||
@@ -34,7 +47,7 @@ export const isFileUri = (x: Source | undefined | null): x is FileURI =>
|
||||
* Check if argument is PlainSource - either String, Stream or Buffer
|
||||
*/
|
||||
export const isPlain = (x: Source | undefined | null): x is PlainSource =>
|
||||
isString(x) || isStream(x) || isBuffer(x) // || isFileUri(x) <- redundant check
|
||||
isString(x) || isStream(x) || isBuffer(x) || isBlob(x) // || isFileUri(x) || isFile(x) <- redundant checks
|
||||
|
||||
/**
|
||||
* Check if argument is TupleSource - two-values array, like [key, PlainSource]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { basename, extname } from 'path'
|
||||
import { createReadStream, ReadStream } from 'fs'
|
||||
import { Readable } from 'stream'
|
||||
import { FileURI, PlainSource, Source, TupleSource, TupleStreamsSource } from '../_types'
|
||||
import { FileURI, PlainSource, Source, TupleFormSource, TupleSource } from '../_types'
|
||||
import {
|
||||
isBuffer,
|
||||
isFileName,
|
||||
@@ -113,12 +113,12 @@ export const toStream = (source: PlainSource): NodeJS.ReadableStream =>
|
||||
})
|
||||
|
||||
/**
|
||||
* Convert any possible source to tuples array with streams only
|
||||
* Convert any possible source to tuples array with streams (or blobs) only
|
||||
*/
|
||||
export const toStreams = (source?: Source): TupleStreamsSource[] => {
|
||||
export const toFormSources = (source?: Source): TupleFormSource[] => {
|
||||
if (!source) return []
|
||||
const tuples = toTuples(source)
|
||||
const ret: TupleStreamsSource[] = []
|
||||
const ret: TupleFormSource[] = []
|
||||
for (let i = 0; i < tuples.length; i++) {
|
||||
ret.push([tuples[i][0], toStream(tuples[i][1])])
|
||||
}
|
||||
|
||||
+5
-8
@@ -1,12 +1,12 @@
|
||||
import FormData from 'form-data'
|
||||
import { PingRequest, RequestFields, RequestType, TupleStreamsSource, TypedRequest } from './_types'
|
||||
import { DEFAULT_FILENAME, toStreams } from './internal/source-converters'
|
||||
import { PingRequest, RequestFields, RequestType, TupleFormSource, TypedRequest } from './_types'
|
||||
import { DEFAULT_FILENAME, toFormSources } from './internal/source-converters'
|
||||
|
||||
/**
|
||||
* Helper function to convert fields and files to form data
|
||||
* https://github.com/form-data/form-data
|
||||
*/
|
||||
const formdata = (fields: RequestFields, files: TupleStreamsSource[]) => {
|
||||
const formdata = (fields: RequestFields, files: TupleFormSource[]) => {
|
||||
const data = new FormData()
|
||||
|
||||
// append all form values
|
||||
@@ -31,10 +31,7 @@ const formdata = (fields: RequestFields, files: TupleStreamsSource[]) => {
|
||||
/**
|
||||
* Validate sources' file names
|
||||
*/
|
||||
const validateSources = (
|
||||
type: RequestType,
|
||||
sources: TupleStreamsSource[]
|
||||
): TupleStreamsSource[] => {
|
||||
const validateSources = (type: RequestType, sources: TupleFormSource[]): TupleFormSource[] => {
|
||||
const filenames = sources.map((source) => source[0])
|
||||
|
||||
// check for duplicates
|
||||
@@ -91,7 +88,7 @@ export const please: {
|
||||
}
|
||||
|
||||
// any other conversion request
|
||||
const sources = validateSources(request.type, toStreams(request.source))
|
||||
const sources = validateSources(request.type, toFormSources(request.source))
|
||||
const form = formdata(request.fields, sources)
|
||||
return request.client.post(request.url, form, request.headers)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import { Readable } from 'stream'
|
||||
import {
|
||||
isBlob,
|
||||
isBuffer,
|
||||
isFile,
|
||||
isFileName,
|
||||
isFileUri,
|
||||
isIterable,
|
||||
@@ -25,6 +27,21 @@ const buffer = Buffer.from('test')
|
||||
const generator = function* gen() {} // tslint:disable-line no-empty
|
||||
const iterator = { [Symbol.iterator]: generator }
|
||||
|
||||
test('Test `isBlob` function', function () {
|
||||
expect(isBlob(undefined)).toBe(false)
|
||||
expect(isBlob(null)).toBe(false)
|
||||
expect(isBlob(string)).toBe(false)
|
||||
expect(isBlob(url)).toBe(false)
|
||||
expect(isBlob(array)).toBe(false)
|
||||
expect(isBlob(map)).toBe(false)
|
||||
expect(isBlob(set)).toBe(false)
|
||||
expect(isBlob(arguments)).toBe(false)
|
||||
expect(isBlob(object)).toBe(false)
|
||||
expect(isBlob(buffer)).toBe(false)
|
||||
expect(isBlob(generator())).toBe(false)
|
||||
expect(isBlob(iterator)).toBe(false)
|
||||
})
|
||||
|
||||
test('Test `isBuffer` function', function () {
|
||||
expect(isBuffer(undefined)).toBe(false)
|
||||
expect(isBuffer(null)).toBe(false)
|
||||
@@ -40,6 +57,21 @@ test('Test `isBuffer` function', function () {
|
||||
expect(isBuffer(iterator)).toBe(false)
|
||||
})
|
||||
|
||||
test('Test `isFile` function', function () {
|
||||
expect(isFile(undefined)).toBe(false)
|
||||
expect(isFile(null)).toBe(false)
|
||||
expect(isFile(string)).toBe(false)
|
||||
expect(isFile(url)).toBe(false)
|
||||
expect(isFile(array)).toBe(false)
|
||||
expect(isFile(map)).toBe(false)
|
||||
expect(isFile(set)).toBe(false)
|
||||
expect(isFile(arguments)).toBe(false)
|
||||
expect(isFile(object)).toBe(false)
|
||||
expect(isFile(buffer)).toBe(false)
|
||||
expect(isFile(generator())).toBe(false)
|
||||
expect(isFile(iterator)).toBe(false)
|
||||
})
|
||||
|
||||
test('Test `isFileName` function', function () {
|
||||
expect(isFileName(undefined)).toBe(false)
|
||||
expect(isFileName(null)).toBe(false)
|
||||
|
||||
@@ -4,8 +4,8 @@ import { createReadStream, ReadStream } from 'fs'
|
||||
import {
|
||||
DEFAULT_FILENAME,
|
||||
fromFile,
|
||||
toFormSources,
|
||||
toStream,
|
||||
toStreams,
|
||||
toTuples,
|
||||
} from '../../src/internal/source-converters'
|
||||
|
||||
@@ -73,10 +73,10 @@ test('Test `toStream` function', async () => {
|
||||
expect(result).toEqual('test')
|
||||
})
|
||||
|
||||
test('Test `toStreams` function', () => {
|
||||
expect(toStreams()).toEqual([])
|
||||
test('Test `toFormSources` function', () => {
|
||||
expect(toFormSources()).toEqual([])
|
||||
|
||||
const result1 = toStreams(Buffer.from('test'))
|
||||
const result1 = toFormSources(Buffer.from('test'))
|
||||
expect(result1 instanceof Array).toBe(true)
|
||||
expect(result1[0] instanceof Array).toBe(true)
|
||||
expect(result1[0][0]).toEqual(DEFAULT_FILENAME)
|
||||
|
||||
@@ -1209,6 +1209,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
|
||||
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
|
||||
|
||||
"@types/detect-node@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/detect-node/-/detect-node-2.0.0.tgz#696e024ddd105c72bbc6a2e3f97902a2886f2c3f"
|
||||
integrity sha512-+BozjlbPTACYITf1PWf62HLtDV79HbmZosUN1mv1gGrnjDCRwBXkDKka1sf6YQJvspmfPXVcy+X6tFW62KteeQ==
|
||||
|
||||
"@types/estree@*":
|
||||
version "0.0.44"
|
||||
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21"
|
||||
@@ -3066,6 +3071,11 @@ detect-newline@^3.0.0:
|
||||
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
|
||||
integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
|
||||
|
||||
detect-node@^2.0.4:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
|
||||
integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
|
||||
|
||||
diff-sequences@^25.2.6:
|
||||
version "25.2.6"
|
||||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd"
|
||||
|
||||
Reference in New Issue
Block a user