@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,124 +1,318 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
2
18
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
20
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
21
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
22
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
23
  };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
8
41
  var __metadata = (this && this.__metadata) || function (k, v) {
9
42
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
43
  };
11
44
  Object.defineProperty(exports, "__esModule", { value: true });
12
45
  exports.DefaultFileInfo = void 0;
46
+ exports.resolveExifToolPath = resolveExifToolPath;
47
+ /// <reference path="./typings/exiftool.d.ts" />
13
48
  const node_child_process_1 = require("node:child_process");
14
49
  const di_1 = require("@spinajs/di");
15
- const log_1 = require("@spinajs/log");
50
+ const configuration_1 = require("@spinajs/configuration");
51
+ const log_common_1 = require("@spinajs/log-common");
16
52
  const exceptions_1 = require("@spinajs/exceptions");
17
53
  const fs_1 = require("fs");
18
54
  const interfaces_js_1 = require("./interfaces.js");
19
55
  const luxon_1 = require("luxon");
20
- const EXIFTOOL_MAPPINGS = {
21
- audioChannels: "AudioChannels",
22
- imageHeight: 'Height',
56
+ /**
57
+ * Default process timeout ( ms ) for the exiftool invocation.
58
+ */
59
+ const DEFAULT_TIMEOUT = 30_000;
60
+ /**
61
+ * Default exiftool arguments. `-n` disables print-conversion ( numeric values ).
62
+ * Extend via the `fs.fileInfo.args` configuration ( eg. add `-a`, `-G`, `-ee`,
63
+ * `-All` ) to widen what is extracted.
64
+ */
65
+ const DEFAULT_ARGS = ['-n'];
66
+ /**
67
+ * Friendly aliases: normalised exiftool tag -> {@link IFileInfo} field name.
68
+ *
69
+ * This is NOT an allow-list - every tag emitted by exiftool is extracted and
70
+ * promoted ( see {@link DefaultFileInfo.toFileInfo} ). Aliases only give the
71
+ * most common tags stable, typed names and keep existing consumers working.
72
+ * Several source tags may collapse onto one field ( eg. duration / playDuration ).
73
+ */
74
+ const TAG_ALIASES = {
23
75
  imageWidth: 'Width',
76
+ imageHeight: 'Height',
24
77
  duration: 'Duration',
25
78
  playDuration: 'Duration',
26
79
  frameCount: 'FrameCount',
27
80
  frameRate: 'FrameRate',
28
81
  videoFrameRate: 'FrameRate',
82
+ audioChannels: 'AudioChannels',
29
83
  maxBitrate: 'Bitrate',
30
84
  maxDataRate: 'Bitrate',
31
85
  avgBitrate: 'Bitrate',
32
86
  compressorID: 'Codec',
33
- fileSize: ["FileSize", (val) => (parseInt(val))],
34
- 'fileAccessDate/Time': ["AccessDate", (val) => { return luxon_1.DateTime.fromFormat(val, "yyyy:MM:dd HH:mm:ssZZ"); }],
35
- 'fileCreationDate/Time': ["CreationDate", (val) => { return luxon_1.DateTime.fromFormat(val, "yyyy:MM:dd HH:mm:ssZZ"); }],
36
- 'fileModificationDate/Time': ["ModificationDate", (val) => { return luxon_1.DateTime.fromFormat(val, "yyyy:MM:dd HH:mm:ssZZ"); }],
37
- mimeType: "MimeType",
38
- mimeEncoding: "Encoding",
39
- wordCount: "WordCount",
40
- lineCount: "LineCount"
87
+ fileSize: 'FileSize',
88
+ mimeType: 'MimeType',
89
+ mimeEncoding: 'Encoding',
90
+ wordCount: 'WordCount',
91
+ lineCount: 'LineCount',
92
+ fileAccessDateTime: 'AccessDate',
93
+ fileCreationDateTime: 'CreationDate',
94
+ fileModificationDateTime: 'ModificationDate',
41
95
  };
42
- function _fInfoInit() {
43
- return {
44
- FileSize: 0,
45
- Height: undefined,
46
- Width: undefined,
47
- Duration: undefined,
48
- FrameCount: undefined,
49
- FrameRate: undefined,
50
- Bitrate: undefined,
51
- Codec: undefined,
52
- Raw: undefined
53
- };
96
+ /**
97
+ * Matches the leading part of an exiftool date value, eg. `2024:01:15 10:30:45`.
98
+ */
99
+ const EXIFTOOL_DATE = /^\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}/;
100
+ /**
101
+ * Date formats exiftool may emit ( with/without sub-seconds and timezone ).
102
+ */
103
+ const EXIFTOOL_DATE_FORMATS = [
104
+ 'yyyy:MM:dd HH:mm:ssZZ',
105
+ 'yyyy:MM:dd HH:mm:ss.SSSZZ',
106
+ 'yyyy:MM:dd HH:mm:ss.SSS',
107
+ 'yyyy:MM:dd HH:mm:ss',
108
+ ];
109
+ /**
110
+ * Normalises a raw exiftool tag name ( eg. "Image Width", "File
111
+ * Modification Date/Time" ) into a stable camelCase key ( "imageWidth",
112
+ * "fileModificationDateTime" ) by splitting on any non-alphanumeric run.
113
+ */
114
+ function normalizeTag(rawTag) {
115
+ return rawTag
116
+ .split(/[^a-zA-Z0-9]+/)
117
+ .filter((token) => token.length > 0)
118
+ .map((token, index) => (index === 0 ? token.toLowerCase() : token[0].toUpperCase() + token.slice(1)))
119
+ .join('');
54
120
  }
121
+ /**
122
+ * Coerces a raw exiftool string value into a typed value: date-shaped strings
123
+ * become {@link DateTime} ( detected by value shape, not by a hardcoded field
124
+ * list ), purely numeric strings become numbers, everything else stays a string.
125
+ */
126
+ function coerceValue(value) {
127
+ if (EXIFTOOL_DATE.test(value)) {
128
+ for (const format of EXIFTOOL_DATE_FORMATS) {
129
+ const parsed = luxon_1.DateTime.fromFormat(value, format);
130
+ if (parsed.isValid) {
131
+ return parsed;
132
+ }
133
+ }
134
+ }
135
+ if (value !== '' && +value === +value) {
136
+ return parseFloat(value);
137
+ }
138
+ return value;
139
+ }
140
+ /**
141
+ * Resolves the path to the exiftool binary.
142
+ *
143
+ * Prefers the vendored binary shipped with the `exiftool-vendored` platform
144
+ * packages ( no system installation required ), and falls back to `exiftool`
145
+ * available on PATH.
146
+ */
147
+ async function resolveExifToolPath() {
148
+ try {
149
+ const mod = process.platform === 'win32' ? await Promise.resolve().then(() => __importStar(require('exiftool-vendored.exe'))) : await Promise.resolve().then(() => __importStar(require('exiftool-vendored.pl')));
150
+ const binaryPath = (mod.default ?? mod);
151
+ if (typeof binaryPath === 'string' && (0, fs_1.existsSync)(binaryPath)) {
152
+ return binaryPath;
153
+ }
154
+ }
155
+ catch {
156
+ /* vendored package not installed for this platform - fall back to PATH */
157
+ }
158
+ return 'exiftool';
159
+ }
160
+ /**
161
+ * Default {@link FileInfoService} implementation backed by the `exiftool`
162
+ * command line tool.
163
+ *
164
+ * The binary is auto-resolved ( vendored, then PATH ) unless overridden with
165
+ * the `fs.fileInfo.exifToolPath` configuration key. The invocation is bounded
166
+ * by the `fs.fileInfo.timeout` configuration ( default {@link DEFAULT_TIMEOUT} ).
167
+ */
55
168
  let DefaultFileInfo = class DefaultFileInfo extends interfaces_js_1.FileInfoService {
169
+ /**
170
+ * Extracts file information from a file on disk.
171
+ *
172
+ * @param pathToFile absolute path to the file
173
+ * @throws {IOFail} when the file does not exist or exiftool fails
174
+ */
56
175
  async getInfo(pathToFile) {
57
176
  if (!(0, fs_1.existsSync)(pathToFile)) {
58
177
  throw new exceptions_1.IOFail(`Path ${pathToFile} not exists`);
59
178
  }
60
- const fInfo = _fInfoInit();
61
- const metadata = await this.getMetadata(pathToFile);
62
- fInfo.Raw = metadata;
63
- for (const key in EXIFTOOL_MAPPINGS) {
64
- if (metadata[key]) {
65
- const mKey = EXIFTOOL_MAPPINGS[key];
66
- if (Array.isArray(mKey)) {
67
- fInfo[mKey[0]] = mKey[1](metadata[key]);
68
- }
69
- else {
70
- fInfo[EXIFTOOL_MAPPINGS[key]] = metadata[key];
71
- }
72
- }
179
+ const raw = await this.runExifTool(pathToFile);
180
+ return this.toFileInfo(this.parseMetadata(raw));
181
+ }
182
+ /**
183
+ * Extracts file information from a readable stream by piping its content to
184
+ * exiftool via stdin ( `exiftool -n -` ).
185
+ *
186
+ * @param stream readable stream with the file content
187
+ * @throws {IOFail} when exiftool fails or the stream errors
188
+ */
189
+ async getInfoFromStream(stream) {
190
+ const raw = await this.runExifTool('-', stream);
191
+ return this.toFileInfo(this.parseMetadata(raw));
192
+ }
193
+ /**
194
+ * Resolves the exiftool binary path, preferring the configured override.
195
+ */
196
+ async binaryPath() {
197
+ if (this.ConfiguredPath) {
198
+ return this.ConfiguredPath;
73
199
  }
74
- return fInfo;
200
+ if (!this.ExifToolPath) {
201
+ this.ExifToolPath = await resolveExifToolPath();
202
+ this.Log.trace(`Using exiftool binary: ${this.ExifToolPath}`);
203
+ }
204
+ return this.ExifToolPath;
205
+ }
206
+ /**
207
+ * Spawns the exiftool process. Extracted so it can be overridden ( eg. in tests ).
208
+ */
209
+ spawnExif(binary, args) {
210
+ return (0, node_child_process_1.spawn)(binary, args);
75
211
  }
76
- async spawnExifProcess(file) {
212
+ /**
213
+ * Runs exiftool against a file spec ( a path, or `-` for stdin ) and returns
214
+ * its stdout.
215
+ *
216
+ * Success/failure is determined by the process exit code ( not by the mere
217
+ * presence of stderr, which exiftool uses for non-fatal warnings ). The call
218
+ * is bounded by {@link Timeout} and any failure is surfaced as {@link IOFail}.
219
+ *
220
+ * @param fileArg file path or `-` to read from stdin
221
+ * @param input optional readable stream piped to the process stdin
222
+ */
223
+ async runExifTool(fileArg, input) {
224
+ const binary = await this.binaryPath();
225
+ const child = this.spawnExif(binary, [...this.ExifArgs, fileArg]);
77
226
  return new Promise((resolve, reject) => {
78
- const process = (0, node_child_process_1.spawn)("exiftool", [file, "-n"]);
79
- let stdOutBuffer = "";
80
- let stdErrBuffer = "";
81
- process.on("error", (err) => (reject(err)));
82
- process.on("close", () => (stdErrBuffer ? reject(stdErrBuffer) : resolve(stdOutBuffer)));
83
- process.stdout.on("data", (data) => (stdOutBuffer += data.toString("utf-8")));
84
- process.stderr.on("data", (data) => (stdErrBuffer += data.toString("utf-8")));
227
+ let stdout = '';
228
+ let stderr = '';
229
+ let settled = false;
230
+ const finish = (fn) => {
231
+ if (settled) {
232
+ return;
233
+ }
234
+ settled = true;
235
+ clearTimeout(timer);
236
+ fn();
237
+ };
238
+ const timer = setTimeout(() => {
239
+ child.kill('SIGKILL');
240
+ finish(() => reject(new exceptions_1.IOFail(`exiftool timed out after ${this.Timeout}ms`)));
241
+ }, this.Timeout);
242
+ child.on('error', (err) => finish(() => reject(new exceptions_1.IOFail(`Cannot run exiftool ( ${binary} )`, err))));
243
+ child.on('close', (code) => finish(() => code === 0
244
+ ? resolve(stdout)
245
+ : reject(new exceptions_1.IOFail(`exiftool exited with code ${code}${stderr ? `: ${stderr.trim()}` : ''}`))));
246
+ child.stdout.on('data', (data) => (stdout += data.toString('utf-8')));
247
+ child.stderr.on('data', (data) => (stderr += data.toString('utf-8')));
248
+ if (input) {
249
+ input.on('error', (err) => finish(() => {
250
+ child.kill('SIGKILL');
251
+ reject(new exceptions_1.IOFail('Error reading input stream for exiftool', err));
252
+ }));
253
+ input.pipe(child.stdin);
254
+ }
85
255
  });
86
256
  }
87
- async getMetadata(file) {
88
- const raw = await this.spawnExifProcess(file);
89
- // Split the response into lines.
90
- const response = raw.split("\n");
91
- //For each line of the response extract the meta data into a nice associative array
257
+ /**
258
+ * Parses raw exiftool text output into a `{ normalisedTag: value }` map with
259
+ * EVERY emitted tag ( nothing is filtered ).
260
+ *
261
+ * Each line is split on the FIRST `': '` only, so values that themselves
262
+ * contain `': '` are preserved. Values are coerced by {@link coerceValue}
263
+ * ( numbers and date-shaped strings ).
264
+ */
265
+ parseMetadata(raw) {
92
266
  const metaData = {};
93
- response.forEach(function (responseLine) {
94
- var pieces = responseLine.split(": ");
95
- //Is this a line with a meta data pair on it?
96
- if (pieces.length == 2) {
97
- //Turn the plain text data key into a camel case key.
98
- var key = pieces[0].trim().split(' ').map(function (tokenInKey, tokenNumber) {
99
- if (tokenNumber === 0)
100
- return tokenInKey.toLowerCase();
101
- else
102
- return tokenInKey[0].toUpperCase() + tokenInKey.slice(1);
103
- }).join('');
104
- //Trim the value associated with the key to make it nice.
105
- var value = pieces[1].trim();
106
- if (+value === +value) {
107
- metaData[key] = parseFloat(value);
108
- }
109
- else {
110
- metaData[key] = value;
111
- }
267
+ for (const line of raw.split('\n')) {
268
+ const sep = line.indexOf(': ');
269
+ if (sep === -1) {
270
+ continue;
112
271
  }
113
- });
272
+ const rawKey = line.slice(0, sep).trim();
273
+ const value = line.slice(sep + 2).trim();
274
+ if (!rawKey) {
275
+ continue;
276
+ }
277
+ metaData[normalizeTag(rawKey)] = coerceValue(value);
278
+ }
114
279
  return metaData;
115
280
  }
281
+ /**
282
+ * Projects a parsed metadata map onto {@link IFileInfo}.
283
+ *
284
+ * Every extracted tag is promoted: known tags via their {@link TAG_ALIASES}
285
+ * friendly field name, all others under their PascalCased tag name. The full
286
+ * unmodified map is always available under `Raw`.
287
+ */
288
+ toFileInfo(metadata) {
289
+ const fInfo = { FileSize: 0 };
290
+ for (const tag in metadata) {
291
+ const field = TAG_ALIASES[tag] ?? tag[0].toUpperCase() + tag.slice(1);
292
+ fInfo[field] = metadata[tag];
293
+ }
294
+ // set Raw last so a stray `Raw` tag can never clobber the full map
295
+ fInfo.Raw = metadata;
296
+ return fInfo;
297
+ }
116
298
  };
117
299
  exports.DefaultFileInfo = DefaultFileInfo;
118
300
  __decorate([
119
- (0, log_1.Logger)('fs'),
120
- __metadata("design:type", log_1.Log)
301
+ (0, log_common_1.Logger)('fs'),
302
+ __metadata("design:type", log_common_1.Log)
121
303
  ], DefaultFileInfo.prototype, "Log", void 0);
304
+ __decorate([
305
+ (0, configuration_1.Config)('fs.fileInfo.exifToolPath'),
306
+ __metadata("design:type", String)
307
+ ], DefaultFileInfo.prototype, "ConfiguredPath", void 0);
308
+ __decorate([
309
+ (0, configuration_1.Config)('fs.fileInfo.timeout', { defaultValue: DEFAULT_TIMEOUT }),
310
+ __metadata("design:type", Number)
311
+ ], DefaultFileInfo.prototype, "Timeout", void 0);
312
+ __decorate([
313
+ (0, configuration_1.Config)('fs.fileInfo.args', { defaultValue: DEFAULT_ARGS }),
314
+ __metadata("design:type", Array)
315
+ ], DefaultFileInfo.prototype, "ExifArgs", void 0);
122
316
  exports.DefaultFileInfo = DefaultFileInfo = __decorate([
123
317
  (0, di_1.Injectable)(interfaces_js_1.FileInfoService)
124
318
  ], DefaultFileInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"file-info.js","sourceRoot":"","sources":["../../src/file-info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-info.js","sourceRoot":"","sources":["../../src/file-info.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoHA,kDAaC;AAjID,gDAAgD;AAChD,2DAA2E;AAE3E,oCAAyC;AACzC,0DAAgD;AAChD,oDAAkD;AAClD,oDAA6C;AAC7C,2BAAgC;AAChC,mDAA6D;AAC7D,iCAAiC;AAEjC;;GAEG;AACH,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC;AAO5B;;;;;;;GAOG;AACH,MAAM,WAAW,GAA2B;IAC1C,UAAU,EAAE,OAAO;IACnB,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,UAAU;IACxB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,kBAAkB,EAAE,YAAY;IAChC,oBAAoB,EAAE,cAAc;IACpC,wBAAwB,EAAE,kBAAkB;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa,GAAG,sCAAsC,CAAC;AAE7D;;GAEG;AACH,MAAM,qBAAqB,GAAG;IAC5B,uBAAuB;IACvB,2BAA2B;IAC3B,yBAAyB;IACzB,qBAAqB;CACtB,CAAC;AAEF;;;;GAIG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,MAAM;SACV,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACpG,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,gBAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,wDAAa,uBAAuB,GAAC,CAAC,CAAC,CAAC,wDAAa,sBAAsB,GAAC,CAAC;QACxH,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAsB,CAAC;QAE7D,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,+BAAe;IA8BlD;;;;;OAKG;IACI,KAAK,CAAC,OAAO,CAAC,UAAkB;QACrC,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,mBAAM,CAAC,QAAQ,UAAU,aAAa,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,iBAAiB,CAAC,MAA6B;QAC1D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,UAAU;QACxB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,SAAS,CAAC,MAAc,EAAE,IAAc;QAChD,OAAO,IAAA,0BAAK,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;OAUG;IACO,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,KAA6B;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAElE,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,OAAO,GAAG,KAAK,CAAC;YAEpB,MAAM,MAAM,GAAG,CAAC,EAAc,EAAE,EAAE;gBAChC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,EAAE,EAAE,CAAC;YACP,CAAC,CAAC;YAEF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,mBAAM,CAAC,4BAA4B,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YACjF,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,mBAAM,CAAC,yBAAyB,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,EAAE,CACV,IAAI,KAAK,CAAC;gBACR,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;gBACjB,CAAC,CAAC,MAAM,CAAC,IAAI,mBAAM,CAAC,6BAA6B,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CACjG,CACF,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9E,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE9E,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACxB,MAAM,CAAC,GAAG,EAAE;oBACV,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,MAAM,CAAC,IAAI,mBAAM,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrE,CAAC,CAAC,CACH,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACO,aAAa,CAAC,GAAW;QACjC,MAAM,QAAQ,GAA8B,EAAE,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YAED,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACO,UAAU,CAAC,QAAmC;QACtD,MAAM,KAAK,GAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAEzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtE,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,mEAAmE;QACnE,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;QAErB,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AA1LY,0CAAe;AAEhB;IADT,IAAA,mBAAM,EAAC,IAAI,CAAC;8BACG,gBAAG;4CAAC;AAOV;IADT,IAAA,sBAAM,EAAC,0BAA0B,CAAC;;uDACD;AAMxB;IADT,IAAA,sBAAM,EAAC,qBAAqB,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;;gDACtC;AAQjB;IADT,IAAA,sBAAM,EAAC,kBAAkB,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;iDAC7B;0BAvBnB,eAAe;IAD3B,IAAA,eAAU,EAAC,+BAAe,CAAC;GACf,eAAe,CA0L3B"}
package/lib/cjs/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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"}