@spinajs/fs 2.0.481 → 2.0.484

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.
Files changed (211) hide show
  1. package/lib/cjs/cli/cat.d.ts +11 -0
  2. package/lib/cjs/cli/cat.d.ts.map +1 -0
  3. package/lib/cjs/cli/cat.js +40 -0
  4. package/lib/cjs/cli/cat.js.map +1 -0
  5. package/lib/cjs/cli/cp.d.ts +11 -0
  6. package/lib/cjs/cli/cp.d.ts.map +1 -0
  7. package/lib/cjs/cli/cp.js +41 -0
  8. package/lib/cjs/cli/cp.js.map +1 -0
  9. package/lib/cjs/cli/download.d.ts +7 -0
  10. package/lib/cjs/cli/download.d.ts.map +1 -0
  11. package/lib/cjs/cli/download.js +39 -0
  12. package/lib/cjs/cli/download.js.map +1 -0
  13. package/lib/cjs/cli/exists.d.ts +7 -0
  14. package/lib/cjs/cli/exists.d.ts.map +1 -0
  15. package/lib/cjs/cli/exists.js +39 -0
  16. package/lib/cjs/cli/exists.js.map +1 -0
  17. package/lib/cjs/cli/fs.d.ts +11 -0
  18. package/lib/cjs/cli/fs.d.ts.map +1 -1
  19. package/lib/cjs/cli/fs.js +47 -21
  20. package/lib/cjs/cli/fs.js.map +1 -1
  21. package/lib/cjs/cli/hash.d.ts +11 -0
  22. package/lib/cjs/cli/hash.d.ts.map +1 -0
  23. package/lib/cjs/cli/hash.js +40 -0
  24. package/lib/cjs/cli/hash.js.map +1 -0
  25. package/lib/cjs/cli/info.d.ts +7 -0
  26. package/lib/cjs/cli/info.d.ts.map +1 -0
  27. package/lib/cjs/cli/info.js +45 -0
  28. package/lib/cjs/cli/info.js.map +1 -0
  29. package/lib/cjs/cli/ls.d.ts +7 -0
  30. package/lib/cjs/cli/ls.d.ts.map +1 -0
  31. package/lib/cjs/cli/ls.js +40 -0
  32. package/lib/cjs/cli/ls.js.map +1 -0
  33. package/lib/cjs/cli/mkdir.d.ts +7 -0
  34. package/lib/cjs/cli/mkdir.d.ts.map +1 -0
  35. package/lib/cjs/cli/mkdir.js +39 -0
  36. package/lib/cjs/cli/mkdir.js.map +1 -0
  37. package/lib/cjs/cli/mv.d.ts +11 -0
  38. package/lib/cjs/cli/mv.d.ts.map +1 -0
  39. package/lib/cjs/cli/mv.js +41 -0
  40. package/lib/cjs/cli/mv.js.map +1 -0
  41. package/lib/cjs/cli/rm.d.ts +1 -6
  42. package/lib/cjs/cli/rm.d.ts.map +1 -1
  43. package/lib/cjs/cli/rm.js +14 -4
  44. package/lib/cjs/cli/rm.js.map +1 -1
  45. package/lib/cjs/cli/stat.d.ts +1 -5
  46. package/lib/cjs/cli/stat.d.ts.map +1 -1
  47. package/lib/cjs/cli/stat.js +20 -3
  48. package/lib/cjs/cli/stat.js.map +1 -1
  49. package/lib/cjs/cli/unzip.d.ts +11 -0
  50. package/lib/cjs/cli/unzip.d.ts.map +1 -0
  51. package/lib/cjs/cli/unzip.js +47 -0
  52. package/lib/cjs/cli/unzip.js.map +1 -0
  53. package/lib/cjs/cli/upload.d.ts +7 -0
  54. package/lib/cjs/cli/upload.d.ts.map +1 -0
  55. package/lib/cjs/cli/upload.js +40 -0
  56. package/lib/cjs/cli/upload.js.map +1 -0
  57. package/lib/cjs/cli/write.d.ts +13 -0
  58. package/lib/cjs/cli/write.d.ts.map +1 -0
  59. package/lib/cjs/cli/write.js +54 -0
  60. package/lib/cjs/cli/write.js.map +1 -0
  61. package/lib/cjs/cli/zip.d.ts +12 -0
  62. package/lib/cjs/cli/zip.d.ts.map +1 -0
  63. package/lib/cjs/cli/zip.js +51 -0
  64. package/lib/cjs/cli/zip.js.map +1 -0
  65. package/lib/cjs/config/fs.d.ts +9 -0
  66. package/lib/cjs/config/fs.d.ts.map +1 -0
  67. package/lib/cjs/config/fs.js +22 -0
  68. package/lib/cjs/config/fs.js.map +1 -0
  69. package/lib/cjs/file-hasher.d.ts +85 -5
  70. package/lib/cjs/file-hasher.d.ts.map +1 -1
  71. package/lib/cjs/file-hasher.js +106 -14
  72. package/lib/cjs/file-hasher.js.map +1 -1
  73. package/lib/cjs/file-info.d.ts +94 -5
  74. package/lib/cjs/file-info.d.ts.map +1 -1
  75. package/lib/cjs/file-info.js +267 -73
  76. package/lib/cjs/file-info.js.map +1 -1
  77. package/lib/cjs/fp.d.ts +80 -2
  78. package/lib/cjs/fp.d.ts.map +1 -1
  79. package/lib/cjs/fp.js +149 -3
  80. package/lib/cjs/fp.js.map +1 -1
  81. package/lib/cjs/index.d.ts +2 -1
  82. package/lib/cjs/index.d.ts.map +1 -1
  83. package/lib/cjs/index.js +7 -2
  84. package/lib/cjs/index.js.map +1 -1
  85. package/lib/cjs/interfaces.d.ts +89 -12
  86. package/lib/cjs/interfaces.d.ts.map +1 -1
  87. package/lib/cjs/interfaces.js +13 -13
  88. package/lib/cjs/interfaces.js.map +1 -1
  89. package/lib/cjs/local-provider.d.ts +51 -6
  90. package/lib/cjs/local-provider.d.ts.map +1 -1
  91. package/lib/cjs/local-provider.js +254 -76
  92. package/lib/cjs/local-provider.js.map +1 -1
  93. package/lib/cjs/temp-cleanup-strategy.d.ts +70 -0
  94. package/lib/cjs/temp-cleanup-strategy.d.ts.map +1 -0
  95. package/lib/cjs/temp-cleanup-strategy.js +157 -0
  96. package/lib/cjs/temp-cleanup-strategy.js.map +1 -0
  97. package/lib/cjs/temp-provider.d.ts +59 -0
  98. package/lib/cjs/temp-provider.d.ts.map +1 -0
  99. package/lib/cjs/temp-provider.js +150 -0
  100. package/lib/cjs/temp-provider.js.map +1 -0
  101. package/lib/mjs/cli/cat.d.ts +11 -0
  102. package/lib/mjs/cli/cat.d.ts.map +1 -0
  103. package/lib/mjs/cli/cat.js +37 -0
  104. package/lib/mjs/cli/cat.js.map +1 -0
  105. package/lib/mjs/cli/cp.d.ts +11 -0
  106. package/lib/mjs/cli/cp.d.ts.map +1 -0
  107. package/lib/mjs/cli/cp.js +38 -0
  108. package/lib/mjs/cli/cp.js.map +1 -0
  109. package/lib/mjs/cli/download.d.ts +7 -0
  110. package/lib/mjs/cli/download.d.ts.map +1 -0
  111. package/lib/mjs/cli/download.js +36 -0
  112. package/lib/mjs/cli/download.js.map +1 -0
  113. package/lib/mjs/cli/exists.d.ts +7 -0
  114. package/lib/mjs/cli/exists.d.ts.map +1 -0
  115. package/lib/mjs/cli/exists.js +36 -0
  116. package/lib/mjs/cli/exists.js.map +1 -0
  117. package/lib/mjs/cli/fs.d.ts +11 -1
  118. package/lib/mjs/cli/fs.d.ts.map +1 -1
  119. package/lib/mjs/cli/fs.js +43 -22
  120. package/lib/mjs/cli/fs.js.map +1 -1
  121. package/lib/mjs/cli/hash.d.ts +11 -0
  122. package/lib/mjs/cli/hash.d.ts.map +1 -0
  123. package/lib/mjs/cli/hash.js +37 -0
  124. package/lib/mjs/cli/hash.js.map +1 -0
  125. package/lib/mjs/cli/info.d.ts +7 -0
  126. package/lib/mjs/cli/info.d.ts.map +1 -0
  127. package/lib/mjs/cli/info.js +42 -0
  128. package/lib/mjs/cli/info.js.map +1 -0
  129. package/lib/mjs/cli/ls.d.ts +7 -0
  130. package/lib/mjs/cli/ls.d.ts.map +1 -0
  131. package/lib/mjs/cli/ls.js +37 -0
  132. package/lib/mjs/cli/ls.js.map +1 -0
  133. package/lib/mjs/cli/mkdir.d.ts +7 -0
  134. package/lib/mjs/cli/mkdir.d.ts.map +1 -0
  135. package/lib/mjs/cli/mkdir.js +36 -0
  136. package/lib/mjs/cli/mkdir.js.map +1 -0
  137. package/lib/mjs/cli/mv.d.ts +11 -0
  138. package/lib/mjs/cli/mv.d.ts.map +1 -0
  139. package/lib/mjs/cli/mv.js +38 -0
  140. package/lib/mjs/cli/mv.js.map +1 -0
  141. package/lib/mjs/cli/rm.d.ts +1 -6
  142. package/lib/mjs/cli/rm.d.ts.map +1 -1
  143. package/lib/mjs/cli/rm.js +15 -5
  144. package/lib/mjs/cli/rm.js.map +1 -1
  145. package/lib/mjs/cli/stat.d.ts +1 -5
  146. package/lib/mjs/cli/stat.d.ts.map +1 -1
  147. package/lib/mjs/cli/stat.js +21 -4
  148. package/lib/mjs/cli/stat.js.map +1 -1
  149. package/lib/mjs/cli/unzip.d.ts +11 -0
  150. package/lib/mjs/cli/unzip.d.ts.map +1 -0
  151. package/lib/mjs/cli/unzip.js +44 -0
  152. package/lib/mjs/cli/unzip.js.map +1 -0
  153. package/lib/mjs/cli/upload.d.ts +7 -0
  154. package/lib/mjs/cli/upload.d.ts.map +1 -0
  155. package/lib/mjs/cli/upload.js +37 -0
  156. package/lib/mjs/cli/upload.js.map +1 -0
  157. package/lib/mjs/cli/write.d.ts +13 -0
  158. package/lib/mjs/cli/write.d.ts.map +1 -0
  159. package/lib/mjs/cli/write.js +51 -0
  160. package/lib/mjs/cli/write.js.map +1 -0
  161. package/lib/mjs/cli/zip.d.ts +12 -0
  162. package/lib/mjs/cli/zip.d.ts.map +1 -0
  163. package/lib/mjs/cli/zip.js +48 -0
  164. package/lib/mjs/cli/zip.js.map +1 -0
  165. package/lib/mjs/config/fs.d.ts +9 -0
  166. package/lib/mjs/config/fs.d.ts.map +1 -0
  167. package/lib/mjs/config/fs.js +20 -0
  168. package/lib/mjs/config/fs.js.map +1 -0
  169. package/lib/mjs/file-hasher.d.ts +85 -5
  170. package/lib/mjs/file-hasher.d.ts.map +1 -1
  171. package/lib/mjs/file-hasher.js +106 -14
  172. package/lib/mjs/file-hasher.js.map +1 -1
  173. package/lib/mjs/file-info.d.ts +94 -5
  174. package/lib/mjs/file-info.d.ts.map +1 -1
  175. package/lib/mjs/file-info.js +233 -73
  176. package/lib/mjs/file-info.js.map +1 -1
  177. package/lib/mjs/fp.d.ts +80 -2
  178. package/lib/mjs/fp.d.ts.map +1 -1
  179. package/lib/mjs/fp.js +135 -4
  180. package/lib/mjs/fp.js.map +1 -1
  181. package/lib/mjs/index.d.ts +2 -1
  182. package/lib/mjs/index.d.ts.map +1 -1
  183. package/lib/mjs/index.js +8 -3
  184. package/lib/mjs/index.js.map +1 -1
  185. package/lib/mjs/interfaces.d.ts +89 -12
  186. package/lib/mjs/interfaces.d.ts.map +1 -1
  187. package/lib/mjs/interfaces.js +13 -13
  188. package/lib/mjs/interfaces.js.map +1 -1
  189. package/lib/mjs/local-provider.d.ts +51 -6
  190. package/lib/mjs/local-provider.d.ts.map +1 -1
  191. package/lib/mjs/local-provider.js +257 -79
  192. package/lib/mjs/local-provider.js.map +1 -1
  193. package/lib/mjs/temp-cleanup-strategy.d.ts +70 -0
  194. package/lib/mjs/temp-cleanup-strategy.d.ts.map +1 -0
  195. package/lib/mjs/temp-cleanup-strategy.js +153 -0
  196. package/lib/mjs/temp-cleanup-strategy.js.map +1 -0
  197. package/lib/mjs/temp-provider.d.ts +59 -0
  198. package/lib/mjs/temp-provider.d.ts.map +1 -0
  199. package/lib/mjs/temp-provider.js +147 -0
  200. package/lib/mjs/temp-provider.js.map +1 -0
  201. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  202. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  203. package/package.json +12 -6
  204. package/lib/cjs/local-temp-provider.d.ts +0 -18
  205. package/lib/cjs/local-temp-provider.d.ts.map +0 -1
  206. package/lib/cjs/local-temp-provider.js +0 -63
  207. package/lib/cjs/local-temp-provider.js.map +0 -1
  208. package/lib/mjs/local-temp-provider.d.ts +0 -18
  209. package/lib/mjs/local-temp-provider.d.ts.map +0 -1
  210. package/lib/mjs/local-temp-provider.js +0 -60
  211. package/lib/mjs/local-temp-provider.js.map +0 -1
@@ -1,11 +1,100 @@
1
- import { Log } from '@spinajs/log';
1
+ import { ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ import { Log } from '@spinajs/log-common';
2
3
  import { FileInfoService, IFileInfo } from './interfaces.js';
4
+ import { DateTime } from 'luxon';
5
+ /**
6
+ * A single extracted metadata value.
7
+ */
8
+ type ExifValue = string | number | DateTime;
9
+ /**
10
+ * Resolves the path to the exiftool binary.
11
+ *
12
+ * Prefers the vendored binary shipped with the `exiftool-vendored` platform
13
+ * packages ( no system installation required ), and falls back to `exiftool`
14
+ * available on PATH.
15
+ */
16
+ export declare function resolveExifToolPath(): Promise<string>;
17
+ /**
18
+ * Default {@link FileInfoService} implementation backed by the `exiftool`
19
+ * command line tool.
20
+ *
21
+ * The binary is auto-resolved ( vendored, then PATH ) unless overridden with
22
+ * the `fs.fileInfo.exifToolPath` configuration key. The invocation is bounded
23
+ * by the `fs.fileInfo.timeout` configuration ( default {@link DEFAULT_TIMEOUT} ).
24
+ */
3
25
  export declare class DefaultFileInfo extends FileInfoService {
4
26
  protected Log: Log;
27
+ /**
28
+ * Optional exiftool binary path override from configuration. When unset, the
29
+ * binary is auto-resolved via {@link resolveExifToolPath}.
30
+ */
31
+ protected ConfiguredPath?: string;
32
+ /**
33
+ * Timeout ( ms ) for the exiftool process, from configuration.
34
+ */
35
+ protected Timeout: number;
36
+ /**
37
+ * exiftool arguments controlling extraction breadth, from configuration
38
+ * ( default {@link DEFAULT_ARGS} ). The file spec ( path or `-` ) is appended
39
+ * automatically. NOTE: some flags ( eg. `-G` ) change the output tag names.
40
+ */
41
+ protected ExifArgs: string[];
42
+ /**
43
+ * Auto-resolved exiftool binary path, cached after first use.
44
+ */
45
+ protected ExifToolPath: string;
46
+ /**
47
+ * Extracts file information from a file on disk.
48
+ *
49
+ * @param pathToFile absolute path to the file
50
+ * @throws {IOFail} when the file does not exist or exiftool fails
51
+ */
5
52
  getInfo(pathToFile: string): Promise<IFileInfo>;
6
- protected spawnExifProcess(file: string): Promise<string>;
7
- protected getMetadata(file: string): Promise<{
8
- [key: string]: string | number;
9
- }>;
53
+ /**
54
+ * Extracts file information from a readable stream by piping its content to
55
+ * exiftool via stdin ( `exiftool -n -` ).
56
+ *
57
+ * @param stream readable stream with the file content
58
+ * @throws {IOFail} when exiftool fails or the stream errors
59
+ */
60
+ getInfoFromStream(stream: NodeJS.ReadableStream): Promise<IFileInfo>;
61
+ /**
62
+ * Resolves the exiftool binary path, preferring the configured override.
63
+ */
64
+ protected binaryPath(): Promise<string>;
65
+ /**
66
+ * Spawns the exiftool process. Extracted so it can be overridden ( eg. in tests ).
67
+ */
68
+ protected spawnExif(binary: string, args: string[]): ChildProcessWithoutNullStreams;
69
+ /**
70
+ * Runs exiftool against a file spec ( a path, or `-` for stdin ) and returns
71
+ * its stdout.
72
+ *
73
+ * Success/failure is determined by the process exit code ( not by the mere
74
+ * presence of stderr, which exiftool uses for non-fatal warnings ). The call
75
+ * is bounded by {@link Timeout} and any failure is surfaced as {@link IOFail}.
76
+ *
77
+ * @param fileArg file path or `-` to read from stdin
78
+ * @param input optional readable stream piped to the process stdin
79
+ */
80
+ protected runExifTool(fileArg: string, input?: NodeJS.ReadableStream): Promise<string>;
81
+ /**
82
+ * Parses raw exiftool text output into a `{ normalisedTag: value }` map with
83
+ * EVERY emitted tag ( nothing is filtered ).
84
+ *
85
+ * Each line is split on the FIRST `': '` only, so values that themselves
86
+ * contain `': '` are preserved. Values are coerced by {@link coerceValue}
87
+ * ( numbers and date-shaped strings ).
88
+ */
89
+ protected parseMetadata(raw: string): Record<string, ExifValue>;
90
+ /**
91
+ * Projects a parsed metadata map onto {@link IFileInfo}.
92
+ *
93
+ * Every extracted tag is promoted: known tags via their {@link TAG_ALIASES}
94
+ * friendly field name, all others under their PascalCased tag name. The full
95
+ * unmodified map is always available under `Raw`.
96
+ */
97
+ protected toFileInfo(metadata: Record<string, ExifValue>): IFileInfo;
10
98
  }
99
+ export {};
11
100
  //# sourceMappingURL=file-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-info.d.ts","sourceRoot":"","sources":["../../src/file-info.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA4C7D,qBACa,eAAgB,SAAQ,eAAe;IAElD,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAEP,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;cAsB5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAa/C,WAAW,CAAC,IAAI,EAAE,MAAM;;;CAsCzC"}
1
+ {"version":3,"file":"file-info.d.ts","sourceRoot":"","sources":["../../src/file-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAI3E,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAcjC;;GAEG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAmF5C;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAa3D;AAED;;;;;;;GAOG;AACH,qBACa,eAAgB,SAAQ,eAAe;IAElD,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAEpB;;;OAGG;IAEH,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAElC;;OAEG;IAEH,SAAS,CAAC,OAAO,EAAG,MAAM,CAAC;IAE3B;;;;OAIG;IAEH,SAAS,CAAC,QAAQ,EAAG,MAAM,EAAE,CAAC;IAE9B;;OAEG;IACH,SAAS,CAAC,YAAY,EAAG,MAAM,CAAC;IAEhC;;;;;OAKG;IACU,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAS5D;;;;;;OAMG;IACU,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IAKjF;;OAEG;cACa,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAa7C;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,8BAA8B;IAInF;;;;;;;;;;OAUG;cACa,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA8C5F;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAqB/D;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS;CAarE"}
@@ -7,114 +7,274 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { spawn } from "node:child_process";
10
+ /// <reference path="./typings/exiftool.d.ts" />
11
+ import { spawn } from 'node:child_process';
11
12
  import { Injectable } from '@spinajs/di';
12
- import { Log, Logger } from '@spinajs/log';
13
+ import { Config } from '@spinajs/configuration';
14
+ import { Log, Logger } from '@spinajs/log-common';
13
15
  import { IOFail } from '@spinajs/exceptions';
14
16
  import { existsSync } from 'fs';
15
17
  import { FileInfoService } from './interfaces.js';
16
- import { DateTime } from "luxon";
17
- const EXIFTOOL_MAPPINGS = {
18
- audioChannels: "AudioChannels",
19
- imageHeight: 'Height',
18
+ import { DateTime } from 'luxon';
19
+ /**
20
+ * Default process timeout ( ms ) for the exiftool invocation.
21
+ */
22
+ const DEFAULT_TIMEOUT = 30_000;
23
+ /**
24
+ * Default exiftool arguments. `-n` disables print-conversion ( numeric values ).
25
+ * Extend via the `fs.fileInfo.args` configuration ( eg. add `-a`, `-G`, `-ee`,
26
+ * `-All` ) to widen what is extracted.
27
+ */
28
+ const DEFAULT_ARGS = ['-n'];
29
+ /**
30
+ * Friendly aliases: normalised exiftool tag -> {@link IFileInfo} field name.
31
+ *
32
+ * This is NOT an allow-list - every tag emitted by exiftool is extracted and
33
+ * promoted ( see {@link DefaultFileInfo.toFileInfo} ). Aliases only give the
34
+ * most common tags stable, typed names and keep existing consumers working.
35
+ * Several source tags may collapse onto one field ( eg. duration / playDuration ).
36
+ */
37
+ const TAG_ALIASES = {
20
38
  imageWidth: 'Width',
39
+ imageHeight: 'Height',
21
40
  duration: 'Duration',
22
41
  playDuration: 'Duration',
23
42
  frameCount: 'FrameCount',
24
43
  frameRate: 'FrameRate',
25
44
  videoFrameRate: 'FrameRate',
45
+ audioChannels: 'AudioChannels',
26
46
  maxBitrate: 'Bitrate',
27
47
  maxDataRate: 'Bitrate',
28
48
  avgBitrate: 'Bitrate',
29
49
  compressorID: 'Codec',
30
- fileSize: ["FileSize", (val) => (parseInt(val))],
31
- 'fileAccessDate/Time': ["AccessDate", (val) => { return DateTime.fromFormat(val, "yyyy:MM:dd HH:mm:ssZZ"); }],
32
- 'fileCreationDate/Time': ["CreationDate", (val) => { return DateTime.fromFormat(val, "yyyy:MM:dd HH:mm:ssZZ"); }],
33
- 'fileModificationDate/Time': ["ModificationDate", (val) => { return DateTime.fromFormat(val, "yyyy:MM:dd HH:mm:ssZZ"); }],
34
- mimeType: "MimeType",
35
- mimeEncoding: "Encoding",
36
- wordCount: "WordCount",
37
- lineCount: "LineCount"
50
+ fileSize: 'FileSize',
51
+ mimeType: 'MimeType',
52
+ mimeEncoding: 'Encoding',
53
+ wordCount: 'WordCount',
54
+ lineCount: 'LineCount',
55
+ fileAccessDateTime: 'AccessDate',
56
+ fileCreationDateTime: 'CreationDate',
57
+ fileModificationDateTime: 'ModificationDate',
38
58
  };
39
- function _fInfoInit() {
40
- return {
41
- FileSize: 0,
42
- Height: undefined,
43
- Width: undefined,
44
- Duration: undefined,
45
- FrameCount: undefined,
46
- FrameRate: undefined,
47
- Bitrate: undefined,
48
- Codec: undefined,
49
- Raw: undefined
50
- };
59
+ /**
60
+ * Matches the leading part of an exiftool date value, eg. `2024:01:15 10:30:45`.
61
+ */
62
+ const EXIFTOOL_DATE = /^\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}/;
63
+ /**
64
+ * Date formats exiftool may emit ( with/without sub-seconds and timezone ).
65
+ */
66
+ const EXIFTOOL_DATE_FORMATS = [
67
+ 'yyyy:MM:dd HH:mm:ssZZ',
68
+ 'yyyy:MM:dd HH:mm:ss.SSSZZ',
69
+ 'yyyy:MM:dd HH:mm:ss.SSS',
70
+ 'yyyy:MM:dd HH:mm:ss',
71
+ ];
72
+ /**
73
+ * Normalises a raw exiftool tag name ( eg. "Image Width", "File
74
+ * Modification Date/Time" ) into a stable camelCase key ( "imageWidth",
75
+ * "fileModificationDateTime" ) by splitting on any non-alphanumeric run.
76
+ */
77
+ function normalizeTag(rawTag) {
78
+ return rawTag
79
+ .split(/[^a-zA-Z0-9]+/)
80
+ .filter((token) => token.length > 0)
81
+ .map((token, index) => (index === 0 ? token.toLowerCase() : token[0].toUpperCase() + token.slice(1)))
82
+ .join('');
51
83
  }
84
+ /**
85
+ * Coerces a raw exiftool string value into a typed value: date-shaped strings
86
+ * become {@link DateTime} ( detected by value shape, not by a hardcoded field
87
+ * list ), purely numeric strings become numbers, everything else stays a string.
88
+ */
89
+ function coerceValue(value) {
90
+ if (EXIFTOOL_DATE.test(value)) {
91
+ for (const format of EXIFTOOL_DATE_FORMATS) {
92
+ const parsed = DateTime.fromFormat(value, format);
93
+ if (parsed.isValid) {
94
+ return parsed;
95
+ }
96
+ }
97
+ }
98
+ if (value !== '' && +value === +value) {
99
+ return parseFloat(value);
100
+ }
101
+ return value;
102
+ }
103
+ /**
104
+ * Resolves the path to the exiftool binary.
105
+ *
106
+ * Prefers the vendored binary shipped with the `exiftool-vendored` platform
107
+ * packages ( no system installation required ), and falls back to `exiftool`
108
+ * available on PATH.
109
+ */
110
+ export async function resolveExifToolPath() {
111
+ try {
112
+ const mod = process.platform === 'win32' ? await import('exiftool-vendored.exe') : await import('exiftool-vendored.pl');
113
+ const binaryPath = (mod.default ?? mod);
114
+ if (typeof binaryPath === 'string' && existsSync(binaryPath)) {
115
+ return binaryPath;
116
+ }
117
+ }
118
+ catch {
119
+ /* vendored package not installed for this platform - fall back to PATH */
120
+ }
121
+ return 'exiftool';
122
+ }
123
+ /**
124
+ * Default {@link FileInfoService} implementation backed by the `exiftool`
125
+ * command line tool.
126
+ *
127
+ * The binary is auto-resolved ( vendored, then PATH ) unless overridden with
128
+ * the `fs.fileInfo.exifToolPath` configuration key. The invocation is bounded
129
+ * by the `fs.fileInfo.timeout` configuration ( default {@link DEFAULT_TIMEOUT} ).
130
+ */
52
131
  let DefaultFileInfo = class DefaultFileInfo extends FileInfoService {
132
+ /**
133
+ * Extracts file information from a file on disk.
134
+ *
135
+ * @param pathToFile absolute path to the file
136
+ * @throws {IOFail} when the file does not exist or exiftool fails
137
+ */
53
138
  async getInfo(pathToFile) {
54
139
  if (!existsSync(pathToFile)) {
55
140
  throw new IOFail(`Path ${pathToFile} not exists`);
56
141
  }
57
- const fInfo = _fInfoInit();
58
- const metadata = await this.getMetadata(pathToFile);
59
- fInfo.Raw = metadata;
60
- for (const key in EXIFTOOL_MAPPINGS) {
61
- if (metadata[key]) {
62
- const mKey = EXIFTOOL_MAPPINGS[key];
63
- if (Array.isArray(mKey)) {
64
- fInfo[mKey[0]] = mKey[1](metadata[key]);
65
- }
66
- else {
67
- fInfo[EXIFTOOL_MAPPINGS[key]] = metadata[key];
68
- }
69
- }
142
+ const raw = await this.runExifTool(pathToFile);
143
+ return this.toFileInfo(this.parseMetadata(raw));
144
+ }
145
+ /**
146
+ * Extracts file information from a readable stream by piping its content to
147
+ * exiftool via stdin ( `exiftool -n -` ).
148
+ *
149
+ * @param stream readable stream with the file content
150
+ * @throws {IOFail} when exiftool fails or the stream errors
151
+ */
152
+ async getInfoFromStream(stream) {
153
+ const raw = await this.runExifTool('-', stream);
154
+ return this.toFileInfo(this.parseMetadata(raw));
155
+ }
156
+ /**
157
+ * Resolves the exiftool binary path, preferring the configured override.
158
+ */
159
+ async binaryPath() {
160
+ if (this.ConfiguredPath) {
161
+ return this.ConfiguredPath;
70
162
  }
71
- return fInfo;
163
+ if (!this.ExifToolPath) {
164
+ this.ExifToolPath = await resolveExifToolPath();
165
+ this.Log.trace(`Using exiftool binary: ${this.ExifToolPath}`);
166
+ }
167
+ return this.ExifToolPath;
168
+ }
169
+ /**
170
+ * Spawns the exiftool process. Extracted so it can be overridden ( eg. in tests ).
171
+ */
172
+ spawnExif(binary, args) {
173
+ return spawn(binary, args);
72
174
  }
73
- async spawnExifProcess(file) {
175
+ /**
176
+ * Runs exiftool against a file spec ( a path, or `-` for stdin ) and returns
177
+ * its stdout.
178
+ *
179
+ * Success/failure is determined by the process exit code ( not by the mere
180
+ * presence of stderr, which exiftool uses for non-fatal warnings ). The call
181
+ * is bounded by {@link Timeout} and any failure is surfaced as {@link IOFail}.
182
+ *
183
+ * @param fileArg file path or `-` to read from stdin
184
+ * @param input optional readable stream piped to the process stdin
185
+ */
186
+ async runExifTool(fileArg, input) {
187
+ const binary = await this.binaryPath();
188
+ const child = this.spawnExif(binary, [...this.ExifArgs, fileArg]);
74
189
  return new Promise((resolve, reject) => {
75
- const process = spawn("exiftool", [file, "-n"]);
76
- let stdOutBuffer = "";
77
- let stdErrBuffer = "";
78
- process.on("error", (err) => (reject(err)));
79
- process.on("close", () => (stdErrBuffer ? reject(stdErrBuffer) : resolve(stdOutBuffer)));
80
- process.stdout.on("data", (data) => (stdOutBuffer += data.toString("utf-8")));
81
- process.stderr.on("data", (data) => (stdErrBuffer += data.toString("utf-8")));
190
+ let stdout = '';
191
+ let stderr = '';
192
+ let settled = false;
193
+ const finish = (fn) => {
194
+ if (settled) {
195
+ return;
196
+ }
197
+ settled = true;
198
+ clearTimeout(timer);
199
+ fn();
200
+ };
201
+ const timer = setTimeout(() => {
202
+ child.kill('SIGKILL');
203
+ finish(() => reject(new IOFail(`exiftool timed out after ${this.Timeout}ms`)));
204
+ }, this.Timeout);
205
+ child.on('error', (err) => finish(() => reject(new IOFail(`Cannot run exiftool ( ${binary} )`, err))));
206
+ child.on('close', (code) => finish(() => code === 0
207
+ ? resolve(stdout)
208
+ : reject(new IOFail(`exiftool exited with code ${code}${stderr ? `: ${stderr.trim()}` : ''}`))));
209
+ child.stdout.on('data', (data) => (stdout += data.toString('utf-8')));
210
+ child.stderr.on('data', (data) => (stderr += data.toString('utf-8')));
211
+ if (input) {
212
+ input.on('error', (err) => finish(() => {
213
+ child.kill('SIGKILL');
214
+ reject(new IOFail('Error reading input stream for exiftool', err));
215
+ }));
216
+ input.pipe(child.stdin);
217
+ }
82
218
  });
83
219
  }
84
- async getMetadata(file) {
85
- const raw = await this.spawnExifProcess(file);
86
- // Split the response into lines.
87
- const response = raw.split("\n");
88
- //For each line of the response extract the meta data into a nice associative array
220
+ /**
221
+ * Parses raw exiftool text output into a `{ normalisedTag: value }` map with
222
+ * EVERY emitted tag ( nothing is filtered ).
223
+ *
224
+ * Each line is split on the FIRST `': '` only, so values that themselves
225
+ * contain `': '` are preserved. Values are coerced by {@link coerceValue}
226
+ * ( numbers and date-shaped strings ).
227
+ */
228
+ parseMetadata(raw) {
89
229
  const metaData = {};
90
- response.forEach(function (responseLine) {
91
- var pieces = responseLine.split(": ");
92
- //Is this a line with a meta data pair on it?
93
- if (pieces.length == 2) {
94
- //Turn the plain text data key into a camel case key.
95
- var key = pieces[0].trim().split(' ').map(function (tokenInKey, tokenNumber) {
96
- if (tokenNumber === 0)
97
- return tokenInKey.toLowerCase();
98
- else
99
- return tokenInKey[0].toUpperCase() + tokenInKey.slice(1);
100
- }).join('');
101
- //Trim the value associated with the key to make it nice.
102
- var value = pieces[1].trim();
103
- if (+value === +value) {
104
- metaData[key] = parseFloat(value);
105
- }
106
- else {
107
- metaData[key] = value;
108
- }
230
+ for (const line of raw.split('\n')) {
231
+ const sep = line.indexOf(': ');
232
+ if (sep === -1) {
233
+ continue;
109
234
  }
110
- });
235
+ const rawKey = line.slice(0, sep).trim();
236
+ const value = line.slice(sep + 2).trim();
237
+ if (!rawKey) {
238
+ continue;
239
+ }
240
+ metaData[normalizeTag(rawKey)] = coerceValue(value);
241
+ }
111
242
  return metaData;
112
243
  }
244
+ /**
245
+ * Projects a parsed metadata map onto {@link IFileInfo}.
246
+ *
247
+ * Every extracted tag is promoted: known tags via their {@link TAG_ALIASES}
248
+ * friendly field name, all others under their PascalCased tag name. The full
249
+ * unmodified map is always available under `Raw`.
250
+ */
251
+ toFileInfo(metadata) {
252
+ const fInfo = { FileSize: 0 };
253
+ for (const tag in metadata) {
254
+ const field = TAG_ALIASES[tag] ?? tag[0].toUpperCase() + tag.slice(1);
255
+ fInfo[field] = metadata[tag];
256
+ }
257
+ // set Raw last so a stray `Raw` tag can never clobber the full map
258
+ fInfo.Raw = metadata;
259
+ return fInfo;
260
+ }
113
261
  };
114
262
  __decorate([
115
263
  Logger('fs'),
116
264
  __metadata("design:type", Log)
117
265
  ], DefaultFileInfo.prototype, "Log", void 0);
266
+ __decorate([
267
+ Config('fs.fileInfo.exifToolPath'),
268
+ __metadata("design:type", String)
269
+ ], DefaultFileInfo.prototype, "ConfiguredPath", void 0);
270
+ __decorate([
271
+ Config('fs.fileInfo.timeout', { defaultValue: DEFAULT_TIMEOUT }),
272
+ __metadata("design:type", Number)
273
+ ], DefaultFileInfo.prototype, "Timeout", void 0);
274
+ __decorate([
275
+ Config('fs.fileInfo.args', { defaultValue: DEFAULT_ARGS }),
276
+ __metadata("design:type", Array)
277
+ ], DefaultFileInfo.prototype, "ExifArgs", void 0);
118
278
  DefaultFileInfo = __decorate([
119
279
  Injectable(FileInfoService)
120
280
  ], DefaultFileInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"file-info.js","sourceRoot":"","sources":["../../src/file-info.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,eAAe,EAAa,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIjC,MAAM,iBAAiB,GAAG;IACxB,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,OAAO;IACnB,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,WAAW;IAC3B,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAExD,qBAAqB,EAAE,CAAC,YAAY,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA,CAAC,CAAC,CAAC;IACpH,uBAAuB,EAAE,CAAC,cAAc,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA,CAAC,CAAC,CAAC;IACxH,2BAA2B,EAAE,CAAC,kBAAkB,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA,CAAC,CAAC,CAAC;IAEhI,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,UAAU;IACxB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,SAAS,UAAU;IACjB,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;KACf,CAAA;AACH,CAAC;AAGM,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,eAAe;IAI3C,KAAK,CAAC,OAAO,CAAC,UAAkB;QACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,MAAM,CAAC,QAAQ,UAAU,aAAa,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAQ,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzD,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;QAErB,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACpC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAI,iBAAyB,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,KAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACL,KAAa,CAAE,iBAAyB,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAES,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAChD,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,YAAY,GAAG,EAAE,CAAC;YAEtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,IAAY;QAEtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE9C,iCAAiC;QACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEjC,mFAAmF;QACnF,MAAM,QAAQ,GAEV,EAAE,CAAC;QAEP,QAAQ,CAAC,OAAO,CAAC,UAAU,YAAY;YACrC,IAAI,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,6CAA6C;YAC7C,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACvB,qDAAqD;gBACrD,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CACvC,UAAU,UAAU,EAAE,WAAW;oBAC/B,IAAI,WAAW,KAAK,CAAC;wBACnB,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;;wBAEhC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC7D,CAAC,CACF,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACX,yDAAyD;gBACzD,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAE7B,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;oBACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAA;AA3EW;IADT,MAAM,CAAC,IAAI,CAAC;8BACG,GAAG;4CAAC;AAFT,eAAe;IAD3B,UAAU,CAAC,eAAe,CAAC;GACf,eAAe,CA6E3B"}
1
+ {"version":3,"file":"file-info.js","sourceRoot":"","sources":["../../src/file-info.ts"],"names":[],"mappings":"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"}
package/lib/mjs/fp.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { fs, IFileInfo } from './interfaces.js';
1
+ import { fs, IFileInfo, IStat } from './interfaces.js';
2
2
  import { Abortable } from 'events';
3
3
  /**
4
4
  * Gets filesystem by its name
@@ -31,7 +31,85 @@ export declare function _fileInfo(path: string): Promise<IFileInfo>;
31
31
  * @returns
32
32
  */
33
33
  export declare function _file_hash(path: string): Promise<string>;
34
- export declare function _exists(path: string): () => Promise<boolean>;
34
+ /**
35
+ * Checks if a path exists.
36
+ *
37
+ * Without a filesystem, checks an absolute local path directly. With a filesystem
38
+ * ( name or instance ), delegates to that provider ( path relative to its base ).
39
+ *
40
+ * @param path path to check
41
+ * @param fileSystem optional provider name / instance
42
+ */
43
+ export declare function _exists(path: string, fileSystem?: string | fs): () => Promise<boolean>;
44
+ /**
45
+ * Reads whole file content through a filesystem provider.
46
+ *
47
+ * @param path path relative to provider base
48
+ * @param encoding optional encoding ( raw Buffer when omitted )
49
+ * @param fileSystem provider name / instance, or default provider
50
+ */
51
+ export declare function _read(path: string, encoding?: BufferEncoding, fileSystem?: string | fs): Promise<string | Buffer>;
52
+ /**
53
+ * Writes data to a file through a filesystem provider.
54
+ */
55
+ export declare function _write(path: string, data: string | Uint8Array, encoding?: BufferEncoding, fileSystem?: string | fs): Promise<void>;
56
+ /**
57
+ * Appends data to a file through a filesystem provider.
58
+ */
59
+ export declare function _append(path: string, data: string | Uint8Array, encoding?: BufferEncoding, fileSystem?: string | fs): Promise<void>;
60
+ /**
61
+ * Copies a file / dir, optionally into another filesystem.
62
+ *
63
+ * @param src source path ( relative to srcFs )
64
+ * @param dst destination path
65
+ * @param srcFs source provider name / instance ( default provider when omitted )
66
+ * @param dstFs optional destination provider - copy within srcFs when omitted
67
+ */
68
+ export declare function _copy(src: string, dst: string, srcFs?: string | fs, dstFs?: string | fs): Promise<void>;
69
+ /**
70
+ * Moves a file / dir, optionally into another filesystem.
71
+ */
72
+ export declare function _move(src: string, dst: string, srcFs?: string | fs, dstFs?: string | fs): Promise<void>;
73
+ /**
74
+ * Renames a file within a single filesystem.
75
+ */
76
+ export declare function _rename(oldPath: string, newPath: string, fileSystem?: string | fs): Promise<void>;
77
+ /**
78
+ * Removes a file or a directory ( recursively ).
79
+ */
80
+ export declare function _rm(path: string, fileSystem?: string | fs): Promise<void>;
81
+ /**
82
+ * Creates a directory ( recursively ).
83
+ */
84
+ export declare function _mkdir(path: string, fileSystem?: string | fs): Promise<void>;
85
+ /**
86
+ * Lists directory content.
87
+ */
88
+ export declare function _list(path: string, fileSystem?: string | fs): Promise<string[]>;
89
+ /**
90
+ * Returns file / dir statistics.
91
+ */
92
+ export declare function _stat(path: string, fileSystem?: string | fs): Promise<IStat>;
93
+ /**
94
+ * Checks if a path is an existing directory.
95
+ */
96
+ export declare function _dir_exists(path: string, fileSystem?: string | fs): Promise<boolean>;
97
+ /**
98
+ * Checks if a path is a directory.
99
+ */
100
+ export declare function _is_dir(path: string, fileSystem?: string | fs): Promise<boolean>;
101
+ /**
102
+ * Downloads a file to local storage and returns the local path.
103
+ */
104
+ export declare function _download(path: string, fileSystem?: string | fs): Promise<string>;
105
+ /**
106
+ * Uploads a local file into a filesystem provider.
107
+ */
108
+ export declare function _upload(srcPath: string, dstPath?: string, fileSystem?: string | fs): Promise<void>;
109
+ /**
110
+ * Hashes a file through a filesystem provider.
111
+ */
112
+ export declare function _hash(path: string, algo?: string, fileSystem?: string | fs): Promise<string>;
35
113
  export declare function _is_of_type(path: string, extension: string): () => Promise<void>;
36
114
  export declare function _is_of_mimetype(path: string, mimetype: string): () => Promise<void>;
37
115
  export declare function _read_file(path: string, options?: ({
@@ -1 +1 @@
1
- {"version":3,"file":"fp.d.ts","sourceRoot":"","sources":["../../src/fp.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,EAAE,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGnC;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,CAUjE;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,oBAI3E;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,oBAI3E;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIxD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,0BAQnC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAQ1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,uBAQ7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAC7C,CAAC;IACD,QAAQ,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GAAG,SAAS,CAAC,GACZ,SAAS,GACT,IAAI,GAAI,MAAM,OAAO,CAAC,MAAM,CAAC,CAahC"}
1
+ {"version":3,"file":"fp.d.ts","sourceRoot":"","sources":["../../src/fp.ts"],"names":[],"mappings":"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"}