guratan 0.5.2 → 0.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.
package/dist/cli.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" />
2
- import { Writable } from 'stream';
2
+ import { Readable, Writable } from 'stream';
3
3
  declare type Opts = {
4
+ stdin: Readable;
4
5
  stdout: Writable;
5
6
  stderr: Writable;
6
7
  };
@@ -11,6 +12,7 @@ declare type OptsSend = Opts & {
11
12
  srcFileName: string;
12
13
  destMimeType: string;
13
14
  srcMimeType: string;
15
+ pipe: boolean;
14
16
  printId: boolean;
15
17
  };
16
18
  declare type OptsRecv = Opts & {
@@ -19,6 +21,8 @@ declare type OptsRecv = Opts & {
19
21
  srcFileName: string;
20
22
  destFileName: string;
21
23
  destMimeType: string;
24
+ pipe: boolean;
25
+ removeBom: boolean;
22
26
  printId: boolean;
23
27
  };
24
28
  declare type OptsShare = Opts & {
@@ -37,7 +41,7 @@ declare type OptsShare = Opts & {
37
41
  emailMessage: string;
38
42
  printId: boolean;
39
43
  };
40
- export declare const cliSend: ({ fileId, parentId, destFileName, srcFileName, destMimeType, srcMimeType, printId, stdout, stderr }: OptsSend) => Promise<number>;
41
- export declare const cliRecv: ({ fileId, parentId, srcFileName, destFileName, destMimeType, printId, stdout, stderr }: OptsRecv) => Promise<number>;
44
+ export declare const cliSend: ({ fileId, parentId, destFileName, srcFileName, destMimeType, srcMimeType, pipe, printId, stdin, stdout, stderr }: OptsSend) => Promise<number>;
45
+ export declare const cliRecv: ({ fileId, parentId, srcFileName, destFileName, destMimeType, printId, pipe, removeBom, stdout, stderr }: OptsRecv) => Promise<number>;
42
46
  export declare const cliShare: ({ fileId, parentId, destFileName, type, role, emailAddress, domain, allowFileDiscovery, view, moveToNewOwnersRoot, transferOwnership, sendNotificationEmail, emailMessage, printId, stdout, stderr }: OptsShare) => Promise<number>;
43
47
  export {};
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { driveClient } from './tdrive.js';
2
- export const cliSend = async ({ fileId, parentId, destFileName, srcFileName, destMimeType, srcMimeType, printId, stdout, stderr }) => {
2
+ export const cliSend = async ({ fileId, parentId, destFileName, srcFileName, destMimeType, srcMimeType, pipe, printId, stdin, stdout, stderr }) => {
3
3
  try {
4
4
  const { sendFile } = await import('./tsend.js');
5
5
  const id = await sendFile(driveClient(), {
@@ -8,7 +8,8 @@ export const cliSend = async ({ fileId, parentId, destFileName, srcFileName, des
8
8
  destFileName,
9
9
  srcFileName,
10
10
  destMimeType,
11
- srcMimeType
11
+ srcMimeType,
12
+ srcStream: pipe ? stdin : undefined
12
13
  });
13
14
  if (printId) {
14
15
  stdout.write(id);
@@ -21,7 +22,7 @@ export const cliSend = async ({ fileId, parentId, destFileName, srcFileName, des
21
22
  }
22
23
  return 0;
23
24
  };
24
- export const cliRecv = async ({ fileId, parentId, srcFileName, destFileName, destMimeType, printId, stdout, stderr }) => {
25
+ export const cliRecv = async ({ fileId, parentId, srcFileName, destFileName, destMimeType, printId, pipe, removeBom, stdout, stderr }) => {
25
26
  try {
26
27
  const { recvFile } = await import('./trecv.js');
27
28
  const id = await recvFile(driveClient(), {
@@ -29,9 +30,11 @@ export const cliRecv = async ({ fileId, parentId, srcFileName, destFileName, des
29
30
  parentId,
30
31
  srcFileName,
31
32
  destFileName,
32
- destMimeType
33
+ destMimeType,
34
+ removeBom,
35
+ destStream: pipe ? stdout : undefined
33
36
  });
34
- if (printId) {
37
+ if (printId && !pipe) {
35
38
  stdout.write(id);
36
39
  }
37
40
  }
package/dist/main.js CHANGED
@@ -28,7 +28,8 @@ const argv = await yargs(hideBin(process.argv))
28
28
  },
29
29
  'src-file-name': {
30
30
  type: 'string',
31
- required: true,
31
+ default: '',
32
+ required: false,
32
33
  description: 'The name(path) of the file in local filesystem'
33
34
  },
34
35
  'dest-mime-type': {
@@ -43,6 +44,12 @@ const argv = await yargs(hideBin(process.argv))
43
44
  default: '',
44
45
  description: 'Media mime-type'
45
46
  },
47
+ pipe: {
48
+ type: 'boolean',
49
+ required: false,
50
+ default: false,
51
+ description: 'Use stdin instead of the source file'
52
+ },
46
53
  'print-id': {
47
54
  type: 'boolean',
48
55
  required: false,
@@ -82,6 +89,18 @@ const argv = await yargs(hideBin(process.argv))
82
89
  default: '',
83
90
  description: 'Media mime-type'
84
91
  },
92
+ pipe: {
93
+ type: 'boolean',
94
+ required: false,
95
+ default: false,
96
+ description: 'Use stdout instead of the dest file'
97
+ },
98
+ 'remove-bom': {
99
+ type: 'boolean',
100
+ required: false,
101
+ default: false,
102
+ description: 'Remove BOM chars in receiving content'
103
+ },
85
104
  'print-id': {
86
105
  type: 'boolean',
87
106
  required: false,
@@ -186,7 +205,9 @@ switch (`${argv._[0]}`) {
186
205
  srcFileName: argv['src-file-name'] || '',
187
206
  destMimeType: argv['dest-mime-type'] || '',
188
207
  srcMimeType: argv['src-mime-type'] || '',
208
+ pipe: argv['pipe'] || false,
189
209
  printId: argv['print-id'] || false,
210
+ stdin: process.stdin,
190
211
  stdout: process.stdout,
191
212
  stderr: process.stderr
192
213
  }));
@@ -198,7 +219,10 @@ switch (`${argv._[0]}`) {
198
219
  srcFileName: argv['src-file-name'] || '',
199
220
  destFileName: argv['dest-file-name'] || '',
200
221
  destMimeType: argv['dest-mime-type'] || '',
222
+ pipe: argv['pipe'] || false,
223
+ removeBom: argv['remove-bom'] || false,
201
224
  printId: argv['print-id'] || false,
225
+ stdin: process.stdin,
202
226
  stdout: process.stdout,
203
227
  stderr: process.stderr
204
228
  }));
@@ -219,6 +243,7 @@ switch (`${argv._[0]}`) {
219
243
  sendNotificationEmail: argv['send-notification-email'],
220
244
  printId: argv['print-id'] || false,
221
245
  emailMessage: argv['email-message'],
246
+ stdin: process.stdin,
222
247
  stdout: process.stdout,
223
248
  stderr: process.stderr
224
249
  }));
package/dist/tdrive.js CHANGED
@@ -56,7 +56,7 @@ export function validateQueryValue(s) {
56
56
  * @returns instance of drive.
57
57
  */
58
58
  export function driveClient() {
59
- const SCOPES = ['https://www.googleapis.com/auth/drive.file'];
59
+ const SCOPES = ['https://www.googleapis.com/auth/drive'];
60
60
  const auth = new GoogleAuth({
61
61
  scopes: SCOPES
62
62
  });
package/dist/trecv.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /// <reference types="node" />
2
+ import { Writable } from 'stream';
1
3
  import { drive_v3 } from '@googleapis/drive';
2
4
  export declare class DownloadFileError extends Error {
3
5
  constructor(message: string);
@@ -27,6 +29,14 @@ export declare type RecvFileOpts = {
27
29
  * @type Media mime-type.
28
30
  */
29
31
  destMimeType: string;
32
+ /**
33
+ * @type Remove BOM chars in receiving content.
34
+ */
35
+ removeBom?: boolean;
36
+ /**
37
+ * @type The dest content from stream. It passed by pipe option.
38
+ */
39
+ destStream?: Writable;
30
40
  };
31
41
  /**
32
42
  * Download the file from Google Drive to the locale file
@@ -34,7 +44,7 @@ export declare type RecvFileOpts = {
34
44
  * @param opts - options.
35
45
  * @returns
36
46
  */
37
- export declare function downloadFile(drive: drive_v3.Drive, opts: Pick<RecvFileOpts, 'fileId' | 'destFileName' | 'destMimeType'>): Promise<void>;
47
+ export declare function downloadFile(drive: drive_v3.Drive, opts: Pick<RecvFileOpts, 'fileId' | 'destFileName' | 'destMimeType' | 'removeBom' | 'destStream'>): Promise<void>;
38
48
  /**
39
49
  * Receive the file from Google Drive to the locale file
40
50
  * @param drive - drive instance.
package/dist/trecv.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import * as fs from 'fs';
2
+ import { pipeline } from 'stream';
2
3
  import { promisify } from 'util';
4
+ import stripBomStream from 'strip-bom-stream';
3
5
  import { getFileId, GetFileIdError } from './tdrive.js';
6
+ const promisePipeline = promisify(pipeline);
4
7
  export class DownloadFileError extends Error {
5
8
  constructor(message) {
6
9
  //https://stackoverflow.com/questions/41102060/typescript-extending-error-class
@@ -15,10 +18,10 @@ export class DownloadFileError extends Error {
15
18
  * @returns
16
19
  */
17
20
  export async function downloadFile(drive, opts) {
18
- let ret;
21
+ let ret = undefined;
19
22
  try {
20
- const { fileId, destFileName, destMimeType } = opts;
21
- const dest = fs.createWriteStream(destFileName);
23
+ const { fileId, destFileName, destMimeType, destStream, removeBom } = opts;
24
+ let dest = destStream ? destStream : fs.createWriteStream(destFileName);
22
25
  try {
23
26
  if (destMimeType) {
24
27
  const params = {
@@ -26,8 +29,11 @@ export async function downloadFile(drive, opts) {
26
29
  mimeType: destMimeType
27
30
  };
28
31
  const res = await drive.files.export(params, { responseType: 'stream' });
29
- for await (const c of res.data) {
30
- dest.write(c);
32
+ if (removeBom) {
33
+ await promisePipeline(res.data, stripBomStream(), dest);
34
+ }
35
+ else {
36
+ await promisePipeline(res.data, dest);
31
37
  }
32
38
  }
33
39
  else {
@@ -36,9 +42,7 @@ export async function downloadFile(drive, opts) {
36
42
  alt: 'media'
37
43
  };
38
44
  const res = await drive.files.get(params, { responseType: 'stream' });
39
- for await (const c of res.data) {
40
- dest.write(c);
41
- }
45
+ await promisePipeline(res.data, dest);
42
46
  }
43
47
  }
44
48
  catch (err) {
@@ -52,7 +56,9 @@ export async function downloadFile(drive, opts) {
52
56
  }
53
57
  finally {
54
58
  // return promisify(dest.close.bind(dest))() ここで return すると常に undfeind になる
55
- ret = promisify(dest.close.bind(dest))();
59
+ if (dest.close) {
60
+ ret = promisify(dest.close.bind(dest))();
61
+ }
56
62
  }
57
63
  }
58
64
  catch (err) {
@@ -67,13 +73,22 @@ export async function downloadFile(drive, opts) {
67
73
  * @returns id of file in Google Drive
68
74
  */
69
75
  export async function recvFile(drive, opts) {
70
- const { fileId: inFileId, parentId, srcFileName, destFileName, destMimeType } = opts;
76
+ const { fileId: inFileId, parentId, srcFileName, destFileName, destMimeType, removeBom, destStream } = opts;
77
+ if (destFileName === '' && destStream === undefined) {
78
+ throw new Error('The destination is not specified');
79
+ }
71
80
  let fileId = inFileId !== '' ? inFileId : await getFileId(drive, parentId, srcFileName);
72
81
  if (fileId === '') {
73
82
  throw new GetFileIdError(
74
83
  // `The srouce file not found in paretnt id : ${srcFileName}, ${parentId}`
75
84
  `The srouce file not found`);
76
85
  }
77
- await downloadFile(drive, { fileId, destFileName, destMimeType });
86
+ await downloadFile(drive, {
87
+ fileId,
88
+ destFileName,
89
+ destMimeType,
90
+ removeBom,
91
+ destStream
92
+ });
78
93
  return fileId;
79
94
  }
package/dist/tsend.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from 'stream';
1
3
  import { drive_v3 } from '@googleapis/drive';
2
4
  export declare class UploadFileError extends Error {
3
5
  constructor(message: string);
@@ -34,6 +36,10 @@ export declare type SendFileOpts = {
34
36
  * @type Media mime-type.
35
37
  */
36
38
  srcMimeType: string;
39
+ /**
40
+ * @type The srouce content from stream. It passed by pipe option.
41
+ */
42
+ srcStream?: Readable;
37
43
  };
38
44
  /**
39
45
  * Create file using by source file into Google Drive.
@@ -41,7 +47,7 @@ export declare type SendFileOpts = {
41
47
  * @param opts - options.
42
48
  * @returns Print the id of the file that is sended into remote
43
49
  */
44
- export declare function uploadFile(drive: drive_v3.Drive, opts: Pick<SendFileOpts, 'parentId' | 'destFileName' | 'srcFileName' | 'destMimeType' | 'srcMimeType'>): Promise<string>;
50
+ export declare function uploadFile(drive: drive_v3.Drive, opts: Pick<SendFileOpts, 'parentId' | 'destFileName' | 'srcFileName' | 'destMimeType' | 'srcMimeType' | 'srcStream'>): Promise<string>;
45
51
  /**
46
52
  * Update file using by source file into Google Drive.
47
53
  * @param drive - drive instance.
@@ -50,7 +56,7 @@ export declare function uploadFile(drive: drive_v3.Drive, opts: Pick<SendFileOpt
50
56
  */
51
57
  export declare function updateFile(drive: drive_v3.Drive, opts: {
52
58
  fileId: string;
53
- } & Pick<SendFileOpts, 'srcFileName' | 'destMimeType' | 'srcMimeType'>): Promise<string>;
59
+ } & Pick<SendFileOpts, 'srcFileName' | 'destMimeType' | 'srcMimeType' | 'srcStream'>): Promise<string>;
54
60
  /**
55
61
  * Send file using by source file into Google Drive.
56
62
  * @param drive - drive instance.
package/dist/tsend.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
- import { promisify } from 'util';
4
3
  import { getFileId } from './tdrive.js';
5
4
  export class UploadFileError extends Error {
6
5
  constructor(message) {
@@ -23,41 +22,30 @@ export class UpdateFileError extends Error {
23
22
  * @returns Print the id of the file that is sended into remote
24
23
  */
25
24
  export async function uploadFile(drive, opts) {
26
- let ret = '';
27
25
  try {
28
- const { parentId, destFileName, srcFileName, destMimeType, srcMimeType } = opts;
29
- const srcStream = fs.createReadStream(srcFileName);
30
- try {
31
- const params = {
32
- requestBody: {
33
- name: path.basename(destFileName),
34
- parents: [parentId]
35
- },
36
- media: {
37
- body: srcStream
38
- },
39
- fields: 'id'
40
- };
41
- if (destMimeType) {
42
- params.requestBody.mimeType = destMimeType;
43
- }
44
- if (srcMimeType) {
45
- params.media.mimeType = srcMimeType;
46
- }
47
- const res = await drive.files.create(params);
48
- ret = res.data.id || '';
26
+ const { parentId, destFileName, srcFileName, destMimeType, srcMimeType, srcStream } = opts;
27
+ const params = {
28
+ requestBody: {
29
+ name: path.basename(destFileName),
30
+ parents: [parentId]
31
+ },
32
+ media: {
33
+ body: srcStream ? srcStream : fs.createReadStream(srcFileName)
34
+ },
35
+ fields: 'id'
36
+ };
37
+ if (destMimeType) {
38
+ params.requestBody.mimeType = destMimeType;
49
39
  }
50
- catch (err) {
51
- throw new UploadFileError(JSON.stringify(err.errors));
52
- }
53
- finally {
54
- await promisify(srcStream.close.bind(srcStream))();
40
+ if (srcMimeType) {
41
+ params.media.mimeType = srcMimeType;
55
42
  }
43
+ const res = await drive.files.create(params);
44
+ return res.data.id || '';
56
45
  }
57
46
  catch (err) {
58
- throw err;
47
+ throw new UploadFileError(JSON.stringify(err.errors));
59
48
  }
60
- return ret;
61
49
  }
62
50
  /**
63
51
  * Update file using by source file into Google Drive.
@@ -66,39 +54,28 @@ export async function uploadFile(drive, opts) {
66
54
  * @returns id of file in Google Drive
67
55
  */
68
56
  export async function updateFile(drive, opts) {
69
- let ret = '';
70
57
  try {
71
- const { fileId, srcFileName, destMimeType, srcMimeType } = opts;
72
- const srcStream = fs.createReadStream(srcFileName);
73
- try {
74
- const params = {
75
- fileId,
76
- requestBody: {},
77
- media: {
78
- body: srcStream
79
- },
80
- fields: 'id'
81
- };
82
- if (destMimeType) {
83
- params.requestBody.mimeType = destMimeType;
84
- }
85
- if (srcMimeType) {
86
- params.media.mimeType = srcMimeType;
87
- }
88
- const res = await drive.files.update(params);
89
- ret = res.data.id || '';
90
- }
91
- catch (err) {
92
- throw new UpdateFileError(JSON.stringify(err.errors));
58
+ const { fileId, srcFileName, destMimeType, srcMimeType, srcStream } = opts;
59
+ const params = {
60
+ fileId,
61
+ requestBody: {},
62
+ media: {
63
+ body: srcStream ? srcStream : fs.createReadStream(srcFileName)
64
+ },
65
+ fields: 'id'
66
+ };
67
+ if (destMimeType) {
68
+ params.requestBody.mimeType = destMimeType;
93
69
  }
94
- finally {
95
- await promisify(srcStream.close.bind(srcStream))();
70
+ if (srcMimeType) {
71
+ params.media.mimeType = srcMimeType;
96
72
  }
73
+ const res = await drive.files.update(params);
74
+ return res.data.id || '';
97
75
  }
98
76
  catch (err) {
99
- throw err;
77
+ throw new UpdateFileError(JSON.stringify(err.errors));
100
78
  }
101
- return ret;
102
79
  }
103
80
  /**
104
81
  * Send file using by source file into Google Drive.
@@ -107,7 +84,10 @@ export async function updateFile(drive, opts) {
107
84
  * @returns id of file in Google Drive
108
85
  */
109
86
  export async function sendFile(drive, opts) {
110
- const { fileId: inFileId, parentId, destFileName, srcFileName, destMimeType, srcMimeType } = opts;
87
+ const { fileId: inFileId, parentId, destFileName, srcFileName, destMimeType, srcMimeType, srcStream } = opts;
88
+ if (srcFileName === '' && srcStream === undefined) {
89
+ throw new Error('The source content is not specified');
90
+ }
111
91
  let fileId = inFileId !== '' ? inFileId : await getFileId(drive, parentId, destFileName);
112
92
  if (fileId === '') {
113
93
  return uploadFile(drive, {
@@ -115,8 +95,15 @@ export async function sendFile(drive, opts) {
115
95
  destFileName,
116
96
  srcFileName,
117
97
  destMimeType,
118
- srcMimeType
98
+ srcMimeType,
99
+ srcStream
119
100
  });
120
101
  }
121
- return updateFile(drive, { fileId, srcFileName, destMimeType, srcMimeType });
102
+ return updateFile(drive, {
103
+ fileId,
104
+ srcFileName,
105
+ destMimeType,
106
+ srcMimeType,
107
+ srcStream
108
+ });
122
109
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "guratan",
3
- "version": "0.5.2",
3
+ "version": "0.7.0",
4
4
  "description": "Tiny send tool for Google Drive",
5
5
  "author": "hankei6km <hankei6km@gmail.com> (https://github.com/hankei6km)",
6
6
  "license": "MIT",
@@ -35,6 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@googleapis/drive": "^2.3.0",
38
+ "strip-bom-stream": "^5.0.0",
38
39
  "yargs": "^17.3.1"
39
40
  },
40
41
  "devDependencies": {