Compare commits

...

7 Commits

Author SHA1 Message Date
yumauri 6e6edd4a55 Fix merge issues 2020-05-30 19:32:47 +03:00
yumauri 9a67df1e7c Merge branch 'master' into isomorphic
# Conflicts:
#	package.json
#	src/please.ts
#	yarn.lock
2020-05-30 18:49:57 +03:00
yumauri b996e33699 Fix merge issues 2020-04-24 12:18:41 +03:00
yumauri 7039baf15d Merge branch 'master' into isomorphic
# Conflicts:
#	package.json
#	test/internal/source-checkers.spec.ts
#	yarn.lock
2020-04-24 12:10:05 +03:00
yumauri b22e6731fc Merge branch 'master' into isomorphic 2020-02-12 19:27:02 +03:00
yumauri b775b2e0ac Merge branch 'master' into isomorphic
# Conflicts:
#	src/internal/source-converters.ts
#	src/please.ts
2020-02-12 13:15:09 +03:00
yumauri 576e3e08a4 Initial preparations for isomorphic package 2020-02-12 00:38:04 +03:00
8 changed files with 75 additions and 21 deletions
+2
View File
@@ -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
View File
@@ -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 ////////////////////////////////////////////////////////////
+16 -3
View File
@@ -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]
+4 -4
View File
@@ -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
View File
@@ -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)
}
+32
View File
@@ -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 -4
View File
@@ -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)
+10
View File
@@ -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"