@lumeweb/pinner 0.0.1 → 0.1.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.
Files changed (186) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +690 -28
  3. package/dist/cjs/_virtual/rolldown_runtime.cjs +29 -0
  4. package/dist/cjs/adapters/pinata/adapter.cjs +88 -0
  5. package/dist/cjs/adapters/pinata/adapter.cjs.map +1 -0
  6. package/dist/cjs/adapters/pinata/adapter.d.cts +35 -0
  7. package/dist/cjs/adapters/pinata/builder.cjs +194 -0
  8. package/dist/cjs/adapters/pinata/builder.cjs.map +1 -0
  9. package/dist/cjs/adapters/pinata/index.cjs +3 -0
  10. package/dist/cjs/adapters/pinata/list-builder.cjs +52 -0
  11. package/dist/cjs/adapters/pinata/list-builder.cjs.map +1 -0
  12. package/dist/cjs/blockstore/index.cjs +2 -0
  13. package/dist/cjs/blockstore/unstorage-base.cjs +240 -0
  14. package/dist/cjs/blockstore/unstorage-base.cjs.map +1 -0
  15. package/dist/cjs/blockstore/unstorage-base.d.cts +23 -0
  16. package/dist/cjs/blockstore/unstorage.cjs +39 -0
  17. package/dist/cjs/blockstore/unstorage.cjs.map +1 -0
  18. package/dist/cjs/blockstore/unstorage.d.cts +36 -0
  19. package/dist/cjs/config.d.cts +51 -0
  20. package/dist/cjs/encoder/base64.cjs +38 -0
  21. package/dist/cjs/encoder/base64.cjs.map +1 -0
  22. package/dist/cjs/encoder/csv/csv-formatter.cjs +81 -0
  23. package/dist/cjs/encoder/csv/csv-formatter.cjs.map +1 -0
  24. package/dist/cjs/encoder/csv/field-formatter.cjs +76 -0
  25. package/dist/cjs/encoder/csv/field-formatter.cjs.map +1 -0
  26. package/dist/cjs/encoder/csv/row-formatter.cjs +159 -0
  27. package/dist/cjs/encoder/csv/row-formatter.cjs.map +1 -0
  28. package/dist/cjs/encoder/csv.cjs +44 -0
  29. package/dist/cjs/encoder/csv.cjs.map +1 -0
  30. package/dist/cjs/encoder/error.cjs +19 -0
  31. package/dist/cjs/encoder/error.cjs.map +1 -0
  32. package/dist/cjs/encoder/index.cjs +6 -0
  33. package/dist/cjs/encoder/json.cjs +36 -0
  34. package/dist/cjs/encoder/json.cjs.map +1 -0
  35. package/dist/cjs/encoder/text.cjs +35 -0
  36. package/dist/cjs/encoder/text.cjs.map +1 -0
  37. package/dist/cjs/encoder/url.cjs +39 -0
  38. package/dist/cjs/encoder/url.cjs.map +1 -0
  39. package/dist/cjs/errors/index.cjs +104 -0
  40. package/dist/cjs/errors/index.cjs.map +1 -0
  41. package/dist/cjs/errors/index.d.cts +47 -0
  42. package/dist/cjs/index.cjs +42 -0
  43. package/dist/cjs/index.d.cts +14 -0
  44. package/dist/cjs/pin/client.cjs +96 -0
  45. package/dist/cjs/pin/client.cjs.map +1 -0
  46. package/dist/cjs/pin/index.cjs +1 -0
  47. package/dist/cjs/pinner.cjs +126 -0
  48. package/dist/cjs/pinner.cjs.map +1 -0
  49. package/dist/cjs/pinner.d.cts +77 -0
  50. package/dist/cjs/types/constants.cjs +34 -0
  51. package/dist/cjs/types/constants.cjs.map +1 -0
  52. package/dist/cjs/types/mime-types.cjs +11 -0
  53. package/dist/cjs/types/mime-types.cjs.map +1 -0
  54. package/dist/cjs/types/mime-types.d.cts +7 -0
  55. package/dist/cjs/types/pin.d.cts +74 -0
  56. package/dist/cjs/types/pinata.d.cts +99 -0
  57. package/dist/cjs/types/type-guards.cjs +20 -0
  58. package/dist/cjs/types/type-guards.cjs.map +1 -0
  59. package/dist/cjs/types/type-guards.d.cts +15 -0
  60. package/dist/cjs/types/upload.cjs +18 -0
  61. package/dist/cjs/types/upload.cjs.map +1 -0
  62. package/dist/cjs/types/upload.d.cts +189 -0
  63. package/dist/cjs/upload/base-upload.cjs +135 -0
  64. package/dist/cjs/upload/base-upload.cjs.map +1 -0
  65. package/dist/cjs/upload/builder.cjs +174 -0
  66. package/dist/cjs/upload/builder.cjs.map +1 -0
  67. package/dist/cjs/upload/builder.d.cts +60 -0
  68. package/dist/cjs/upload/car.cjs +129 -0
  69. package/dist/cjs/upload/car.cjs.map +1 -0
  70. package/dist/cjs/upload/car.d.cts +19 -0
  71. package/dist/cjs/upload/constants.cjs +9 -0
  72. package/dist/cjs/upload/constants.cjs.map +1 -0
  73. package/dist/cjs/upload/index.cjs +8 -0
  74. package/dist/cjs/upload/manager.cjs +249 -0
  75. package/dist/cjs/upload/manager.cjs.map +1 -0
  76. package/dist/cjs/upload/manager.d.cts +35 -0
  77. package/dist/cjs/upload/normalize.cjs +28 -0
  78. package/dist/cjs/upload/normalize.cjs.map +1 -0
  79. package/dist/cjs/upload/tus-upload.cjs +74 -0
  80. package/dist/cjs/upload/tus-upload.cjs.map +1 -0
  81. package/dist/cjs/upload/xhr-upload.cjs +41 -0
  82. package/dist/cjs/upload/xhr-upload.cjs.map +1 -0
  83. package/dist/cjs/utils/env.cjs +12 -0
  84. package/dist/cjs/utils/env.cjs.map +1 -0
  85. package/dist/cjs/utils/stream.cjs +141 -0
  86. package/dist/cjs/utils/stream.cjs.map +1 -0
  87. package/dist/cjs/utils/stream.d.cts +23 -0
  88. package/dist/cjs/utils/tus-patch.cjs +50 -0
  89. package/dist/cjs/utils/tus-patch.cjs.map +1 -0
  90. package/dist/cjs/utils/validation.cjs +62 -0
  91. package/dist/cjs/utils/validation.cjs.map +1 -0
  92. package/dist/esm/_virtual/rolldown_runtime.js +8 -0
  93. package/dist/esm/adapters/pinata/adapter.d.ts +35 -0
  94. package/dist/esm/adapters/pinata/adapter.js +87 -0
  95. package/dist/esm/adapters/pinata/adapter.js.map +1 -0
  96. package/dist/esm/adapters/pinata/builder.d.ts +1 -0
  97. package/dist/esm/adapters/pinata/builder.js +187 -0
  98. package/dist/esm/adapters/pinata/builder.js.map +1 -0
  99. package/dist/esm/adapters/pinata/index.d.ts +4 -0
  100. package/dist/esm/adapters/pinata/index.js +3 -0
  101. package/dist/esm/adapters/pinata/list-builder.d.ts +1 -0
  102. package/dist/esm/adapters/pinata/list-builder.js +51 -0
  103. package/dist/esm/adapters/pinata/list-builder.js.map +1 -0
  104. package/dist/esm/blockstore/index.d.ts +2 -0
  105. package/dist/esm/blockstore/index.js +2 -0
  106. package/dist/esm/blockstore/unstorage-base.d.ts +23 -0
  107. package/dist/esm/blockstore/unstorage-base.js +231 -0
  108. package/dist/esm/blockstore/unstorage-base.js.map +1 -0
  109. package/dist/esm/blockstore/unstorage.d.ts +36 -0
  110. package/dist/esm/blockstore/unstorage.js +38 -0
  111. package/dist/esm/blockstore/unstorage.js.map +1 -0
  112. package/dist/esm/config.d.ts +51 -0
  113. package/dist/esm/encoder/base64.js +37 -0
  114. package/dist/esm/encoder/base64.js.map +1 -0
  115. package/dist/esm/encoder/csv/csv-formatter.js +81 -0
  116. package/dist/esm/encoder/csv/csv-formatter.js.map +1 -0
  117. package/dist/esm/encoder/csv/field-formatter.js +75 -0
  118. package/dist/esm/encoder/csv/field-formatter.js.map +1 -0
  119. package/dist/esm/encoder/csv/row-formatter.js +159 -0
  120. package/dist/esm/encoder/csv/row-formatter.js.map +1 -0
  121. package/dist/esm/encoder/csv.js +43 -0
  122. package/dist/esm/encoder/csv.js.map +1 -0
  123. package/dist/esm/encoder/error.js +18 -0
  124. package/dist/esm/encoder/error.js.map +1 -0
  125. package/dist/esm/encoder/index.js +6 -0
  126. package/dist/esm/encoder/json.js +35 -0
  127. package/dist/esm/encoder/json.js.map +1 -0
  128. package/dist/esm/encoder/text.js +34 -0
  129. package/dist/esm/encoder/text.js.map +1 -0
  130. package/dist/esm/encoder/url.js +36 -0
  131. package/dist/esm/encoder/url.js.map +1 -0
  132. package/dist/esm/errors/index.d.ts +47 -0
  133. package/dist/esm/errors/index.js +93 -0
  134. package/dist/esm/errors/index.js.map +1 -0
  135. package/dist/esm/index.d.ts +16 -0
  136. package/dist/esm/index.js +14 -0
  137. package/dist/esm/pin/client.js +95 -0
  138. package/dist/esm/pin/client.js.map +1 -0
  139. package/dist/esm/pin/index.js +1 -0
  140. package/dist/esm/pinner.d.ts +77 -0
  141. package/dist/esm/pinner.js +125 -0
  142. package/dist/esm/pinner.js.map +1 -0
  143. package/dist/esm/types/constants.js +29 -0
  144. package/dist/esm/types/constants.js.map +1 -0
  145. package/dist/esm/types/mime-types.d.ts +7 -0
  146. package/dist/esm/types/mime-types.js +8 -0
  147. package/dist/esm/types/mime-types.js.map +1 -0
  148. package/dist/esm/types/pin.d.ts +74 -0
  149. package/dist/esm/types/pinata.d.ts +99 -0
  150. package/dist/esm/types/type-guards.d.ts +15 -0
  151. package/dist/esm/types/type-guards.js +19 -0
  152. package/dist/esm/types/type-guards.js.map +1 -0
  153. package/dist/esm/types/upload.d.ts +189 -0
  154. package/dist/esm/types/upload.js +16 -0
  155. package/dist/esm/types/upload.js.map +1 -0
  156. package/dist/esm/upload/base-upload.js +132 -0
  157. package/dist/esm/upload/base-upload.js.map +1 -0
  158. package/dist/esm/upload/builder.d.ts +60 -0
  159. package/dist/esm/upload/builder.js +173 -0
  160. package/dist/esm/upload/builder.js.map +1 -0
  161. package/dist/esm/upload/car.d.ts +19 -0
  162. package/dist/esm/upload/car.js +125 -0
  163. package/dist/esm/upload/car.js.map +1 -0
  164. package/dist/esm/upload/constants.js +7 -0
  165. package/dist/esm/upload/constants.js.map +1 -0
  166. package/dist/esm/upload/index.js +8 -0
  167. package/dist/esm/upload/manager.d.ts +35 -0
  168. package/dist/esm/upload/manager.js +248 -0
  169. package/dist/esm/upload/manager.js.map +1 -0
  170. package/dist/esm/upload/normalize.js +28 -0
  171. package/dist/esm/upload/normalize.js.map +1 -0
  172. package/dist/esm/upload/tus-upload.js +72 -0
  173. package/dist/esm/upload/tus-upload.js.map +1 -0
  174. package/dist/esm/upload/xhr-upload.js +39 -0
  175. package/dist/esm/upload/xhr-upload.js.map +1 -0
  176. package/dist/esm/utils/env.js +11 -0
  177. package/dist/esm/utils/env.js.map +1 -0
  178. package/dist/esm/utils/stream.d.ts +23 -0
  179. package/dist/esm/utils/stream.js +134 -0
  180. package/dist/esm/utils/stream.js.map +1 -0
  181. package/dist/esm/utils/tus-patch.js +51 -0
  182. package/dist/esm/utils/tus-patch.js.map +1 -0
  183. package/dist/esm/utils/validation.js +60 -0
  184. package/dist/esm/utils/validation.js.map +1 -0
  185. package/package.json +95 -8
  186. package/public/mockServiceWorker.js +349 -0
@@ -0,0 +1,159 @@
1
+ const require_field_formatter = require('./field-formatter.cjs');
2
+
3
+ //#region src/encoder/csv/row-formatter.ts
4
+ /**
5
+ * Handles formatting of CSV rows including headers and column extraction.
6
+ *
7
+ * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)
8
+ * Copyright (c) 2011 C2FO Labs, LLC
9
+ * Licensed under the MIT License
10
+ */
11
+ var RowFormatter = class {
12
+ options;
13
+ fieldFormatter;
14
+ shouldWriteHeaders;
15
+ rowTransform = null;
16
+ headers = null;
17
+ hasWrittenHeaders = false;
18
+ rowCount = 0;
19
+ constructor(options) {
20
+ this.options = options;
21
+ this.fieldFormatter = new require_field_formatter.FieldFormatter(options);
22
+ this.headers = Array.isArray(options.headers) ? options.headers : null;
23
+ this.shouldWriteHeaders = options.writeHeaders ?? (Array.isArray(options.headers) || options.headers === true);
24
+ if (this.headers !== null) this.fieldFormatter.headers = this.headers;
25
+ if (options.transform) this.rowTransform = this.createTransform(options.transform);
26
+ }
27
+ /**
28
+ * Create a transform function that handles both sync and async transforms.
29
+ */
30
+ createTransform(transformFn) {
31
+ if (transformFn.length === 1) return (row, cb) => {
32
+ try {
33
+ cb(null, transformFn(row));
34
+ } catch (e) {
35
+ cb(e instanceof Error ? e : new Error(String(e)));
36
+ }
37
+ };
38
+ return transformFn;
39
+ }
40
+ /**
41
+ * Check if the transform is synchronous (arity 1).
42
+ */
43
+ isSyncTransform() {
44
+ if (!this.options.transform) return true;
45
+ return this.options.transform.length === 1;
46
+ }
47
+ /**
48
+ * Format a single row.
49
+ */
50
+ format(row) {
51
+ let transformedRow;
52
+ if (this.rowTransform) transformedRow = this.applyTransformSync(row);
53
+ else transformedRow = row;
54
+ if (!transformedRow) return [];
55
+ const rows = [];
56
+ const { shouldFormatColumns, headers } = this.checkHeaders(transformedRow);
57
+ if (this.shouldWriteHeaders && headers && !this.hasWrittenHeaders) {
58
+ rows.push(this.formatColumns(headers, true));
59
+ this.hasWrittenHeaders = true;
60
+ }
61
+ if (shouldFormatColumns) {
62
+ const columns = this.gatherColumns(transformedRow);
63
+ rows.push(this.formatColumns(columns, false));
64
+ }
65
+ return rows;
66
+ }
67
+ /**
68
+ * Apply transform synchronously.
69
+ * Note: This only supports sync transforms. Async transforms are not supported
70
+ * in the synchronous format() method.
71
+ */
72
+ applyTransformSync(row) {
73
+ if (!this.options.transform) return row;
74
+ if (this.isSyncTransform()) try {
75
+ return this.options.transform(row);
76
+ } catch (e) {
77
+ throw e instanceof Error ? e : new Error(String(e));
78
+ }
79
+ throw new Error("Async transforms are not supported in synchronous CSV formatting");
80
+ }
81
+ /**
82
+ * Finish formatting and return any trailing content.
83
+ */
84
+ finish() {
85
+ const rows = [];
86
+ if (this.options.alwaysWriteHeaders && this.rowCount === 0) {
87
+ if (!this.headers) throw new Error("`alwaysWriteHeaders` option is set to true but `headers` option not provided.");
88
+ rows.push(this.formatColumns(this.headers, true));
89
+ }
90
+ if (this.options.includeEndRowDelimiter) rows.push(this.options.rowDelimiter || "\n");
91
+ return rows;
92
+ }
93
+ /**
94
+ * Check if headers need to be written.
95
+ */
96
+ checkHeaders(row) {
97
+ if (this.headers) return {
98
+ shouldFormatColumns: true,
99
+ headers: this.headers
100
+ };
101
+ const headers = this.gatherHeaders(row);
102
+ this.headers = headers;
103
+ this.fieldFormatter.headers = headers;
104
+ if (!this.shouldWriteHeaders) return {
105
+ shouldFormatColumns: true,
106
+ headers: null
107
+ };
108
+ if (Array.isArray(row) && headers.every((header, i) => header === row[i])) return {
109
+ shouldFormatColumns: false,
110
+ headers
111
+ };
112
+ return {
113
+ shouldFormatColumns: true,
114
+ headers
115
+ };
116
+ }
117
+ /**
118
+ * Extract headers from a row.
119
+ */
120
+ gatherHeaders(row) {
121
+ if (this.isRowHashArray(row)) return row.map((it) => String(it[0]));
122
+ if (Array.isArray(row)) return row.map(String);
123
+ return Object.keys(row);
124
+ }
125
+ /**
126
+ * Check if row is a hash array (multi-dimensional array with [key, value] pairs).
127
+ */
128
+ isRowHashArray(row) {
129
+ if (!Array.isArray(row)) return false;
130
+ return Array.isArray(row[0]) && row[0].length === 2;
131
+ }
132
+ /**
133
+ * Extract column values from a row.
134
+ */
135
+ gatherColumns(row) {
136
+ if (this.headers === null) throw new Error("Headers is currently null");
137
+ if (!Array.isArray(row)) return this.headers.map((header) => row[header]);
138
+ if (this.isRowHashArray(row)) return this.headers.map((header, i) => {
139
+ const col = row[i];
140
+ return col ? col[1] : "";
141
+ });
142
+ if (!this.shouldWriteHeaders) return row;
143
+ return this.headers.map((_, i) => row[i]);
144
+ }
145
+ /**
146
+ * Format columns into a CSV row string.
147
+ */
148
+ formatColumns(columns, isHeadersRow) {
149
+ const formattedCols = columns.map((field, i) => this.fieldFormatter.format(field, i, isHeadersRow)).join(this.options.delimiter || ",");
150
+ const { rowCount } = this;
151
+ this.rowCount += 1;
152
+ if (rowCount > 0) return [this.options.rowDelimiter || "\n", formattedCols].join("");
153
+ return formattedCols;
154
+ }
155
+ };
156
+
157
+ //#endregion
158
+ exports.RowFormatter = RowFormatter;
159
+ //# sourceMappingURL=row-formatter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-formatter.cjs","names":["FieldFormatter"],"sources":["../../../../src/encoder/csv/row-formatter.ts"],"sourcesContent":["import type {\n CsvFormatterOptions,\n RowTransform,\n RowTransformCallback,\n} from \"./csv-options\";\nimport { FieldFormatter } from \"./field-formatter\";\n\n/**\n * Handles formatting of CSV rows including headers and column extraction.\n *\n * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)\n * Copyright (c) 2011 C2FO Labs, LLC\n * Licensed under the MIT License\n */\nexport class RowFormatter {\n private options: CsvFormatterOptions;\n private fieldFormatter: FieldFormatter;\n private shouldWriteHeaders: boolean;\n private rowTransform: RowTransformCallback | null = null;\n private headers: string[] | null = null;\n private hasWrittenHeaders = false;\n private rowCount = 0;\n\n constructor(options: CsvFormatterOptions) {\n this.options = options;\n this.fieldFormatter = new FieldFormatter(options);\n this.headers = Array.isArray(options.headers) ? options.headers : null;\n this.shouldWriteHeaders =\n options.writeHeaders ??\n (Array.isArray(options.headers) || options.headers === true);\n\n if (this.headers !== null) {\n this.fieldFormatter.headers = this.headers;\n }\n\n if (options.transform) {\n this.rowTransform = this.createTransform(options.transform);\n }\n }\n\n /**\n * Create a transform function that handles both sync and async transforms.\n */\n private createTransform(transformFn: RowTransform): RowTransformCallback {\n // Check if it's a sync transform (arity 1)\n if (transformFn.length === 1) {\n return (row: unknown, cb: RowTransformCallback) => {\n try {\n const transformedRow = (transformFn as (row: unknown) => unknown)(\n row,\n );\n cb(null, transformedRow);\n } catch (e) {\n cb(e instanceof Error ? e : new Error(String(e)));\n }\n };\n }\n\n return transformFn as RowTransformCallback;\n }\n\n /**\n * Check if the transform is synchronous (arity 1).\n */\n private isSyncTransform(): boolean {\n if (!this.options.transform) {\n return true;\n }\n return this.options.transform.length === 1;\n }\n\n /**\n * Format a single row.\n */\n format(row: unknown): string[] {\n let transformedRow: unknown;\n\n // Apply transform if present\n if (this.rowTransform) {\n transformedRow = this.applyTransformSync(row);\n } else {\n transformedRow = row;\n }\n\n if (!transformedRow) {\n return [];\n }\n\n const rows: string[] = [];\n\n // Check headers\n const { shouldFormatColumns, headers } = this.checkHeaders(transformedRow);\n\n // Write headers if needed\n if (this.shouldWriteHeaders && headers && !this.hasWrittenHeaders) {\n rows.push(this.formatColumns(headers, true));\n this.hasWrittenHeaders = true;\n }\n\n // Format data row\n if (shouldFormatColumns) {\n const columns = this.gatherColumns(transformedRow);\n rows.push(this.formatColumns(columns, false));\n }\n\n return rows;\n }\n\n /**\n * Apply transform synchronously.\n * Note: This only supports sync transforms. Async transforms are not supported\n * in the synchronous format() method.\n */\n private applyTransformSync(row: unknown): unknown {\n if (!this.options.transform) {\n return row;\n }\n\n // Only sync transforms (arity 1) are supported\n if (this.isSyncTransform()) {\n try {\n return (this.options.transform as (row: unknown) => unknown)(row);\n } catch (e) {\n throw e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(\n \"Async transforms are not supported in synchronous CSV formatting\",\n );\n }\n\n /**\n * Finish formatting and return any trailing content.\n */\n finish(): string[] {\n const rows: string[] = [];\n\n // Write headers if alwaysWriteHeaders is true and no rows were written\n if (this.options.alwaysWriteHeaders && this.rowCount === 0) {\n if (!this.headers) {\n throw new Error(\n \"`alwaysWriteHeaders` option is set to true but `headers` option not provided.\",\n );\n }\n rows.push(this.formatColumns(this.headers, true));\n }\n\n // Add end row delimiter if configured\n if (this.options.includeEndRowDelimiter) {\n rows.push(this.options.rowDelimiter || \"\\n\");\n }\n\n return rows;\n }\n\n /**\n * Check if headers need to be written.\n */\n private checkHeaders(row: unknown): {\n shouldFormatColumns: boolean;\n headers: string[] | null;\n } {\n if (this.headers) {\n return { shouldFormatColumns: true, headers: this.headers };\n }\n\n const headers = this.gatherHeaders(row);\n this.headers = headers;\n this.fieldFormatter.headers = headers;\n\n if (!this.shouldWriteHeaders) {\n return { shouldFormatColumns: true, headers: null };\n }\n\n // If the row is equal to headers, don't format (it's the header row itself)\n if (Array.isArray(row) && headers.every((header, i) => header === row[i])) {\n return { shouldFormatColumns: false, headers };\n }\n\n return { shouldFormatColumns: true, headers };\n }\n\n /**\n * Extract headers from a row.\n */\n private gatherHeaders(row: unknown): string[] {\n if (this.isRowHashArray(row)) {\n // Multi-dimensional array with item 0 being the header\n return (row as unknown[][]).map((it) => String(it[0]));\n }\n\n if (Array.isArray(row)) {\n return row.map(String);\n }\n\n return Object.keys(row as object);\n }\n\n /**\n * Check if row is a hash array (multi-dimensional array with [key, value] pairs).\n */\n private isRowHashArray(row: unknown): boolean {\n if (!Array.isArray(row)) {\n return false;\n }\n return Array.isArray(row[0]) && row[0].length === 2;\n }\n\n /**\n * Extract column values from a row.\n */\n private gatherColumns(row: unknown): unknown[] {\n if (this.headers === null) {\n throw new Error(\"Headers is currently null\");\n }\n\n if (!Array.isArray(row)) {\n // Object: use headers to get values\n return this.headers.map(\n (header) => (row as Record<string, unknown>)[header],\n );\n }\n\n if (this.isRowHashArray(row)) {\n // Hash array: extract values\n return this.headers.map((header, i) => {\n const col = (row as unknown[][])[i];\n return col ? col[1] : \"\";\n });\n }\n\n // Regular array\n if (!this.shouldWriteHeaders) {\n // If headers weren't written, return the row as-is\n return row;\n }\n\n // Map by header index\n return this.headers.map((_, i) => row[i]);\n }\n\n /**\n * Format columns into a CSV row string.\n */\n private formatColumns(columns: unknown[], isHeadersRow: boolean): string {\n const formattedCols = columns\n .map((field, i) => this.fieldFormatter.format(field, i, isHeadersRow))\n .join(this.options.delimiter || \",\");\n\n const { rowCount } = this;\n this.rowCount += 1;\n\n // Add row delimiter before all rows except the first\n if (rowCount > 0) {\n return [this.options.rowDelimiter || \"\\n\", formattedCols].join(\"\");\n }\n\n return formattedCols;\n }\n}\n"],"mappings":";;;;;;;;;;AAcA,IAAa,eAAb,MAA0B;CACxB,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ,eAA4C;CACpD,AAAQ,UAA2B;CACnC,AAAQ,oBAAoB;CAC5B,AAAQ,WAAW;CAEnB,YAAY,SAA8B;AACxC,OAAK,UAAU;AACf,OAAK,iBAAiB,IAAIA,uCAAe,QAAQ;AACjD,OAAK,UAAU,MAAM,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,UAAU;AAClE,OAAK,qBACH,QAAQ,iBACP,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,YAAY;AAEzD,MAAI,KAAK,YAAY,KACnB,MAAK,eAAe,UAAU,KAAK;AAGrC,MAAI,QAAQ,UACV,MAAK,eAAe,KAAK,gBAAgB,QAAQ,UAAU;;;;;CAO/D,AAAQ,gBAAgB,aAAiD;AAEvE,MAAI,YAAY,WAAW,EACzB,SAAQ,KAAc,OAA6B;AACjD,OAAI;AAIF,OAAG,MAHqB,YACtB,IACD,CACuB;YACjB,GAAG;AACV,OAAG,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;;;AAKvD,SAAO;;;;;CAMT,AAAQ,kBAA2B;AACjC,MAAI,CAAC,KAAK,QAAQ,UAChB,QAAO;AAET,SAAO,KAAK,QAAQ,UAAU,WAAW;;;;;CAM3C,OAAO,KAAwB;EAC7B,IAAI;AAGJ,MAAI,KAAK,aACP,kBAAiB,KAAK,mBAAmB,IAAI;MAE7C,kBAAiB;AAGnB,MAAI,CAAC,eACH,QAAO,EAAE;EAGX,MAAM,OAAiB,EAAE;EAGzB,MAAM,EAAE,qBAAqB,YAAY,KAAK,aAAa,eAAe;AAG1E,MAAI,KAAK,sBAAsB,WAAW,CAAC,KAAK,mBAAmB;AACjE,QAAK,KAAK,KAAK,cAAc,SAAS,KAAK,CAAC;AAC5C,QAAK,oBAAoB;;AAI3B,MAAI,qBAAqB;GACvB,MAAM,UAAU,KAAK,cAAc,eAAe;AAClD,QAAK,KAAK,KAAK,cAAc,SAAS,MAAM,CAAC;;AAG/C,SAAO;;;;;;;CAQT,AAAQ,mBAAmB,KAAuB;AAChD,MAAI,CAAC,KAAK,QAAQ,UAChB,QAAO;AAIT,MAAI,KAAK,iBAAiB,CACxB,KAAI;AACF,UAAQ,KAAK,QAAQ,UAAwC,IAAI;WAC1D,GAAG;AACV,SAAM,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC;;AAIvD,QAAM,IAAI,MACR,mEACD;;;;;CAMH,SAAmB;EACjB,MAAM,OAAiB,EAAE;AAGzB,MAAI,KAAK,QAAQ,sBAAsB,KAAK,aAAa,GAAG;AAC1D,OAAI,CAAC,KAAK,QACR,OAAM,IAAI,MACR,gFACD;AAEH,QAAK,KAAK,KAAK,cAAc,KAAK,SAAS,KAAK,CAAC;;AAInD,MAAI,KAAK,QAAQ,uBACf,MAAK,KAAK,KAAK,QAAQ,gBAAgB,KAAK;AAG9C,SAAO;;;;;CAMT,AAAQ,aAAa,KAGnB;AACA,MAAI,KAAK,QACP,QAAO;GAAE,qBAAqB;GAAM,SAAS,KAAK;GAAS;EAG7D,MAAM,UAAU,KAAK,cAAc,IAAI;AACvC,OAAK,UAAU;AACf,OAAK,eAAe,UAAU;AAE9B,MAAI,CAAC,KAAK,mBACR,QAAO;GAAE,qBAAqB;GAAM,SAAS;GAAM;AAIrD,MAAI,MAAM,QAAQ,IAAI,IAAI,QAAQ,OAAO,QAAQ,MAAM,WAAW,IAAI,GAAG,CACvE,QAAO;GAAE,qBAAqB;GAAO;GAAS;AAGhD,SAAO;GAAE,qBAAqB;GAAM;GAAS;;;;;CAM/C,AAAQ,cAAc,KAAwB;AAC5C,MAAI,KAAK,eAAe,IAAI,CAE1B,QAAQ,IAAoB,KAAK,OAAO,OAAO,GAAG,GAAG,CAAC;AAGxD,MAAI,MAAM,QAAQ,IAAI,CACpB,QAAO,IAAI,IAAI,OAAO;AAGxB,SAAO,OAAO,KAAK,IAAc;;;;;CAMnC,AAAQ,eAAe,KAAuB;AAC5C,MAAI,CAAC,MAAM,QAAQ,IAAI,CACrB,QAAO;AAET,SAAO,MAAM,QAAQ,IAAI,GAAG,IAAI,IAAI,GAAG,WAAW;;;;;CAMpD,AAAQ,cAAc,KAAyB;AAC7C,MAAI,KAAK,YAAY,KACnB,OAAM,IAAI,MAAM,4BAA4B;AAG9C,MAAI,CAAC,MAAM,QAAQ,IAAI,CAErB,QAAO,KAAK,QAAQ,KACjB,WAAY,IAAgC,QAC9C;AAGH,MAAI,KAAK,eAAe,IAAI,CAE1B,QAAO,KAAK,QAAQ,KAAK,QAAQ,MAAM;GACrC,MAAM,MAAO,IAAoB;AACjC,UAAO,MAAM,IAAI,KAAK;IACtB;AAIJ,MAAI,CAAC,KAAK,mBAER,QAAO;AAIT,SAAO,KAAK,QAAQ,KAAK,GAAG,MAAM,IAAI,GAAG;;;;;CAM3C,AAAQ,cAAc,SAAoB,cAA+B;EACvE,MAAM,gBAAgB,QACnB,KAAK,OAAO,MAAM,KAAK,eAAe,OAAO,OAAO,GAAG,aAAa,CAAC,CACrE,KAAK,KAAK,QAAQ,aAAa,IAAI;EAEtC,MAAM,EAAE,aAAa;AACrB,OAAK,YAAY;AAGjB,MAAI,WAAW,EACb,QAAO,CAAC,KAAK,QAAQ,gBAAgB,MAAM,cAAc,CAAC,KAAK,GAAG;AAGpE,SAAO"}
@@ -0,0 +1,44 @@
1
+ const require_error = require('./error.cjs');
2
+ const require_csv_formatter = require('./csv/csv-formatter.cjs');
3
+
4
+ //#region src/encoder/csv.ts
5
+ /**
6
+ * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.
7
+ * Uses a simplified CSV formatter without streaming support.
8
+ */
9
+ var CsvEncoder = class {
10
+ async encode(input, options) {
11
+ try {
12
+ let csvContent;
13
+ if (typeof input === "string") csvContent = input;
14
+ else if (Array.isArray(input)) csvContent = this.#arrayToCsv(input, options?.csv);
15
+ else throw new require_error.EncoderError("Invalid CSV input: must be string or array", "INVALID_CSV");
16
+ const blob = new Blob([csvContent], { type: "text/csv" });
17
+ return {
18
+ file: new File([blob], options?.name || "data.csv", { type: "text/csv" }),
19
+ options: options || {}
20
+ };
21
+ } catch (error) {
22
+ if (error instanceof require_error.EncoderError) throw error;
23
+ if (error instanceof Error) throw new require_error.EncoderError(`CSV encoding failed: ${error.message}`, "INVALID_CSV", error);
24
+ throw new require_error.EncoderError("CSV encoding failed: unknown error", "INVALID_CSV");
25
+ }
26
+ }
27
+ #arrayToCsv(data, csvOptions) {
28
+ return require_csv_formatter.createCsvFormatter({
29
+ headers: true,
30
+ ...csvOptions
31
+ }).format(data);
32
+ }
33
+ };
34
+ /**
35
+ * Encode CSV data to a File object.
36
+ */
37
+ async function csvToFile(data, options) {
38
+ return new CsvEncoder().encode(data, options);
39
+ }
40
+
41
+ //#endregion
42
+ exports.CsvEncoder = CsvEncoder;
43
+ exports.csvToFile = csvToFile;
44
+ //# sourceMappingURL=csv.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.cjs","names":["#arrayToCsv","EncoderError","createCsvFormatter"],"sources":["../../../src/encoder/csv.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\nimport {\n createCsvFormatter,\n type CsvFormatterOptions,\n} from \"./csv/csv-formatter\";\n\n/**\n * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.\n * Uses a simplified CSV formatter without streaming support.\n *\n * This implementation is derived from @fast-csv/format (https://github.com/C2FO/fast-csv)\n * Copyright (c) 2011 C2FO Labs, LLC\n * Licensed under the MIT License\n */\n\n/**\n * Extended upload options for CSV encoder.\n * Extends base UploadOptions with CSV formatting options.\n */\nexport interface CsvUploadOptions extends UploadOptions {\n /**\n * CSV formatting options.\n */\n csv?: CsvFormatterOptions;\n}\n\n/**\n * CSV encoder - converts CSV strings, arrays of objects, or arrays of arrays to File objects.\n * Uses a simplified CSV formatter without streaming support.\n */\nexport class CsvEncoder implements Encoder<string | object[] | any[][]> {\n async encode(\n input: string | object[] | any[][],\n options?: CsvUploadOptions,\n ): Promise<EncoderResult> {\n try {\n let csvContent: string;\n\n if (typeof input === \"string\") {\n // Raw CSV string - use as-is\n csvContent = input;\n } else if (Array.isArray(input)) {\n // Convert array to CSV using our formatter\n csvContent = this.#arrayToCsv(input, options?.csv);\n } else {\n throw new EncoderError(\n \"Invalid CSV input: must be string or array\",\n \"INVALID_CSV\",\n );\n }\n\n const blob = new Blob([csvContent], { type: \"text/csv\" });\n const file = new File([blob], options?.name || \"data.csv\", {\n type: \"text/csv\",\n });\n\n return {\n file,\n options: options || {},\n };\n } catch (error) {\n if (error instanceof EncoderError) {\n throw error;\n }\n if (error instanceof Error) {\n throw new EncoderError(\n `CSV encoding failed: ${error.message}`,\n \"INVALID_CSV\",\n error,\n );\n }\n throw new EncoderError(\n \"CSV encoding failed: unknown error\",\n \"INVALID_CSV\",\n );\n }\n }\n\n #arrayToCsv(\n data: any[] | object[][],\n csvOptions?: CsvFormatterOptions,\n ): string {\n const formatter = createCsvFormatter({\n headers: true,\n ...csvOptions,\n });\n\n return formatter.format(data);\n }\n}\n\n/**\n * Encode CSV data to a File object.\n */\nexport async function csvToFile(\n data: string | object[] | any[][],\n options?: CsvUploadOptions,\n): Promise<EncoderResult> {\n const encoder = new CsvEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;;;AA+BA,IAAa,aAAb,MAAwE;CACtE,MAAM,OACJ,OACA,SACwB;AACxB,MAAI;GACF,IAAI;AAEJ,OAAI,OAAO,UAAU,SAEnB,cAAa;YACJ,MAAM,QAAQ,MAAM,CAE7B,cAAa,MAAKA,WAAY,OAAO,SAAS,IAAI;OAElD,OAAM,IAAIC,2BACR,8CACA,cACD;GAGH,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,YAAY,CAAC;AAKzD,UAAO;IACL,MALW,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,QAAQ,YAAY,EACzD,MAAM,YACP,CAAC;IAIA,SAAS,WAAW,EAAE;IACvB;WACM,OAAO;AACd,OAAI,iBAAiBA,2BACnB,OAAM;AAER,OAAI,iBAAiB,MACnB,OAAM,IAAIA,2BACR,wBAAwB,MAAM,WAC9B,eACA,MACD;AAEH,SAAM,IAAIA,2BACR,sCACA,cACD;;;CAIL,YACE,MACA,YACQ;AAMR,SALkBC,yCAAmB;GACnC,SAAS;GACT,GAAG;GACJ,CAAC,CAEe,OAAO,KAAK;;;;;;AAOjC,eAAsB,UACpB,MACA,SACwB;AAExB,QADgB,IAAI,YAAY,CACjB,OAAO,MAAM,QAAQ"}
@@ -0,0 +1,19 @@
1
+
2
+ //#region src/encoder/error.ts
3
+ /**
4
+ * Error wrapper for encoder operations.
5
+ */
6
+ var EncoderError = class extends Error {
7
+ code;
8
+ cause;
9
+ constructor(message, code, cause) {
10
+ super(message);
11
+ this.name = "EncoderError";
12
+ this.code = code;
13
+ this.cause = cause;
14
+ }
15
+ };
16
+
17
+ //#endregion
18
+ exports.EncoderError = EncoderError;
19
+ //# sourceMappingURL=error.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.cjs","names":[],"sources":["../../../src/encoder/error.ts"],"sourcesContent":["/**\n * Error wrapper for encoder operations.\n */\nexport class EncoderError extends Error {\n code: \"INVALID_JSON\" | \"INVALID_BASE64\" | \"INVALID_URL\" | \"INVALID_CSV\" | \"INVALID_TEXT\" | \"NETWORK_ERROR\" | \"UNKNOWN\";\n cause?: Error;\n\n constructor(\n message: string,\n code: EncoderError[\"code\"],\n cause?: Error,\n ) {\n super(message);\n this.name = \"EncoderError\";\n this.code = code;\n this.cause = cause;\n }\n}\n"],"mappings":";;;;;AAGA,IAAa,eAAb,cAAkC,MAAM;CACtC;CACA;CAEA,YACE,SACA,MACA,OACA;AACA,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,QAAQ"}
@@ -0,0 +1,6 @@
1
+ const require_error = require('./error.cjs');
2
+ const require_json = require('./json.cjs');
3
+ const require_base64 = require('./base64.cjs');
4
+ const require_url = require('./url.cjs');
5
+ const require_csv = require('./csv.cjs');
6
+ const require_text = require('./text.cjs');
@@ -0,0 +1,36 @@
1
+ const require_error = require('./error.cjs');
2
+
3
+ //#region src/encoder/json.ts
4
+ /**
5
+ * JSON encoder - converts JSON objects to File objects.
6
+ */
7
+ var JsonEncoder = class {
8
+ async encode(data, options) {
9
+ try {
10
+ const json = JSON.stringify(data, null, 2);
11
+ const blob = new Blob([json], { type: "application/json" });
12
+ const filename = options?.name || "data.json";
13
+ return {
14
+ file: new File([blob], filename, { type: "application/json" }),
15
+ options: {
16
+ name: options?.name,
17
+ keyvalues: options?.keyvalues
18
+ }
19
+ };
20
+ } catch (error) {
21
+ if (error instanceof Error) throw new require_error.EncoderError(`JSON encoding failed: ${error.message}`, "INVALID_JSON", error);
22
+ throw new require_error.EncoderError("JSON encoding failed: unknown error", "INVALID_JSON");
23
+ }
24
+ }
25
+ };
26
+ /**
27
+ * Encode a JSON object to a File object.
28
+ */
29
+ async function jsonToFile(data, options) {
30
+ return new JsonEncoder().encode(data, options);
31
+ }
32
+
33
+ //#endregion
34
+ exports.JsonEncoder = JsonEncoder;
35
+ exports.jsonToFile = jsonToFile;
36
+ //# sourceMappingURL=json.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.cjs","names":["EncoderError"],"sources":["../../../src/encoder/json.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * JSON encoder - converts JSON objects to File objects.\n */\nexport class JsonEncoder implements Encoder<object> {\n async encode(data: object, options?: UploadOptions): Promise<EncoderResult> {\n try {\n const json = JSON.stringify(data, null, 2);\n const blob = new Blob([json], { type: \"application/json\" });\n const filename = options?.name || \"data.json\";\n const file = new File([blob], filename, { type: \"application/json\" });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `JSON encoding failed: ${error.message}`,\n \"INVALID_JSON\",\n error,\n );\n }\n throw new EncoderError(\n \"JSON encoding failed: unknown error\",\n \"INVALID_JSON\",\n );\n }\n }\n}\n\n/**\n * Encode a JSON object to a File object.\n */\nexport async function jsonToFile(\n data: object,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new JsonEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,cAAb,MAAoD;CAClD,MAAM,OAAO,MAAc,SAAiD;AAC1E,MAAI;GACF,MAAM,OAAO,KAAK,UAAU,MAAM,MAAM,EAAE;GAC1C,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,oBAAoB,CAAC;GAC3D,MAAM,WAAW,SAAS,QAAQ;AAGlC,UAAO;IACL,MAHW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;IAInE,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAIA,2BACR,yBAAyB,MAAM,WAC/B,gBACA,MACD;AAEH,SAAM,IAAIA,2BACR,uCACA,eACD;;;;;;;AAQP,eAAsB,WACpB,MACA,SACwB;AAExB,QADgB,IAAI,aAAa,CAClB,OAAO,MAAM,QAAQ"}
@@ -0,0 +1,35 @@
1
+ const require_error = require('./error.cjs');
2
+
3
+ //#region src/encoder/text.ts
4
+ /**
5
+ * Text encoder - converts text strings to File objects.
6
+ */
7
+ var TextEncoder = class {
8
+ async encode(data, options) {
9
+ try {
10
+ const blob = new Blob([data], { type: "text/plain" });
11
+ const filename = options?.name || "data.txt";
12
+ return {
13
+ file: new File([blob], filename, { type: "text/plain" }),
14
+ options: {
15
+ name: options?.name,
16
+ keyvalues: options?.keyvalues
17
+ }
18
+ };
19
+ } catch (error) {
20
+ if (error instanceof Error) throw new require_error.EncoderError(`Text encoding failed: ${error.message}`, "INVALID_TEXT", error);
21
+ throw new require_error.EncoderError("Text encoding failed: unknown error", "INVALID_TEXT");
22
+ }
23
+ }
24
+ };
25
+ /**
26
+ * Encode a text string to a File object.
27
+ */
28
+ async function textToFile(data, options) {
29
+ return new TextEncoder().encode(data, options);
30
+ }
31
+
32
+ //#endregion
33
+ exports.TextEncoder = TextEncoder;
34
+ exports.textToFile = textToFile;
35
+ //# sourceMappingURL=text.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.cjs","names":["EncoderError"],"sources":["../../../src/encoder/text.ts"],"sourcesContent":["import type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * Text encoder - converts text strings to File objects.\n */\nexport class TextEncoder implements Encoder<string> {\n async encode(data: string, options?: UploadOptions): Promise<EncoderResult> {\n try {\n const blob = new Blob([data], { type: \"text/plain\" });\n const filename = options?.name || \"data.txt\";\n const file = new File([blob], filename, { type: \"text/plain\" });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new EncoderError(\n `Text encoding failed: ${error.message}`,\n \"INVALID_TEXT\",\n error,\n );\n }\n throw new EncoderError(\n \"Text encoding failed: unknown error\",\n \"INVALID_TEXT\",\n );\n }\n }\n}\n\n/**\n * Encode a text string to a File object.\n */\nexport async function textToFile(\n data: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new TextEncoder();\n return encoder.encode(data, options);\n}\n"],"mappings":";;;;;;AAMA,IAAa,cAAb,MAAoD;CAClD,MAAM,OAAO,MAAc,SAAiD;AAC1E,MAAI;GACF,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;GACrD,MAAM,WAAW,SAAS,QAAQ;AAGlC,UAAO;IACL,MAHW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;IAI7D,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,MACnB,OAAM,IAAIA,2BACR,yBAAyB,MAAM,WAC/B,gBACA,MACD;AAEH,SAAM,IAAIA,2BACR,uCACA,eACD;;;;;;;AAQP,eAAsB,WACpB,MACA,SACwB;AAExB,QADgB,IAAI,aAAa,CAClB,OAAO,MAAM,QAAQ"}
@@ -0,0 +1,39 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_error = require('./error.cjs');
3
+ let ky = require("ky");
4
+ ky = require_rolldown_runtime.__toESM(ky);
5
+
6
+ //#region src/encoder/url.ts
7
+ /**
8
+ * URL encoder - fetches content from URLs and converts to File objects.
9
+ */
10
+ var UrlEncoder = class {
11
+ async encode(urlString, options) {
12
+ try {
13
+ const blob = await (0, ky.default)(urlString, { fetch: options?.fetch }).blob();
14
+ const filename = options?.name || new URL(urlString).pathname.split("/").pop() || "file";
15
+ return {
16
+ file: new File([blob], filename, { type: blob.type }),
17
+ options: {
18
+ name: options?.name,
19
+ keyvalues: options?.keyvalues
20
+ }
21
+ };
22
+ } catch (error) {
23
+ if ((0, ky.isHTTPError)(error) || (0, ky.isTimeoutError)(error)) throw new require_error.EncoderError(`URL encoding failed: ${error.message}`, "NETWORK_ERROR", error);
24
+ if (error instanceof Error) throw new require_error.EncoderError(`URL encoding failed: ${error.message}`, "NETWORK_ERROR", error);
25
+ throw new require_error.EncoderError("URL encoding failed: unknown error", "UNKNOWN");
26
+ }
27
+ }
28
+ };
29
+ /**
30
+ * Encode a URL to a File object by fetching the content.
31
+ */
32
+ async function urlToFile(urlString, options) {
33
+ return new UrlEncoder().encode(urlString, options);
34
+ }
35
+
36
+ //#endregion
37
+ exports.UrlEncoder = UrlEncoder;
38
+ exports.urlToFile = urlToFile;
39
+ //# sourceMappingURL=url.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.cjs","names":["EncoderError"],"sources":["../../../src/encoder/url.ts"],"sourcesContent":["import ky, { isHTTPError, isTimeoutError } from \"ky\";\nimport type { Encoder, EncoderResult, UploadOptions } from \"./types\";\nimport { EncoderError } from \"./error\";\n\n/**\n * URL encoder - fetches content from URLs and converts to File objects.\n */\nexport class UrlEncoder implements Encoder<string> {\n async encode(\n urlString: string,\n options?: UploadOptions,\n ): Promise<EncoderResult> {\n try {\n const blob = await ky(urlString, { fetch: options?.fetch }).blob();\n const filename =\n options?.name || new URL(urlString).pathname.split(\"/\").pop() || \"file\";\n const file = new File([blob], filename, { type: blob.type });\n\n return {\n file,\n options: {\n name: options?.name,\n keyvalues: options?.keyvalues,\n },\n };\n } catch (error) {\n if (isHTTPError(error) || isTimeoutError(error)) {\n throw new EncoderError(\n `URL encoding failed: ${error.message}`,\n \"NETWORK_ERROR\",\n error,\n );\n }\n\n if (error instanceof Error) {\n throw new EncoderError(\n `URL encoding failed: ${error.message}`,\n \"NETWORK_ERROR\",\n error,\n );\n }\n\n throw new EncoderError(\"URL encoding failed: unknown error\", \"UNKNOWN\");\n }\n }\n}\n\n/**\n * Encode a URL to a File object by fetching the content.\n */\nexport async function urlToFile(\n urlString: string,\n options?: UploadOptions,\n): Promise<EncoderResult> {\n const encoder = new UrlEncoder();\n return encoder.encode(urlString, options);\n}\n"],"mappings":";;;;;;;;;AAOA,IAAa,aAAb,MAAmD;CACjD,MAAM,OACJ,WACA,SACwB;AACxB,MAAI;GACF,MAAM,OAAO,sBAAS,WAAW,EAAE,OAAO,SAAS,OAAO,CAAC,CAAC,MAAM;GAClE,MAAM,WACJ,SAAS,QAAQ,IAAI,IAAI,UAAU,CAAC,SAAS,MAAM,IAAI,CAAC,KAAK,IAAI;AAGnE,UAAO;IACL,MAHW,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAI1D,SAAS;KACP,MAAM,SAAS;KACf,WAAW,SAAS;KACrB;IACF;WACM,OAAO;AACd,2BAAgB,MAAM,2BAAmB,MAAM,CAC7C,OAAM,IAAIA,2BACR,wBAAwB,MAAM,WAC9B,iBACA,MACD;AAGH,OAAI,iBAAiB,MACnB,OAAM,IAAIA,2BACR,wBAAwB,MAAM,WAC9B,iBACA,MACD;AAGH,SAAM,IAAIA,2BAAa,sCAAsC,UAAU;;;;;;;AAQ7E,eAAsB,UACpB,WACA,SACwB;AAExB,QADgB,IAAI,YAAY,CACjB,OAAO,WAAW,QAAQ"}
@@ -0,0 +1,104 @@
1
+
2
+ //#region src/errors/index.ts
3
+ var PinnerError = class extends Error {
4
+ constructor(code, message, retryable, cause) {
5
+ super(message);
6
+ this.code = code;
7
+ this.retryable = retryable;
8
+ this.cause = cause;
9
+ this.name = "PinnerError";
10
+ }
11
+ };
12
+ var ConfigurationError = class extends PinnerError {
13
+ constructor(message, cause) {
14
+ super("CONFIGURATION_ERROR", message, false, cause);
15
+ this.name = "ConfigurationError";
16
+ }
17
+ };
18
+ var AuthenticationError = class extends PinnerError {
19
+ constructor(message = "Authentication failed", cause) {
20
+ super("AUTHENTICATION_ERROR", message, false, cause);
21
+ this.name = "AuthenticationError";
22
+ }
23
+ };
24
+ var UploadError = class extends PinnerError {
25
+ code = "UPLOAD_ERROR";
26
+ constructor(message, retryable = false, cause) {
27
+ super("UPLOAD_ERROR", message, retryable, cause);
28
+ this.retryable = retryable;
29
+ this.name = "UploadError";
30
+ }
31
+ };
32
+ var NetworkError = class extends UploadError {
33
+ constructor(message = "Network request failed", cause) {
34
+ super(message, true, cause);
35
+ this.name = "NetworkError";
36
+ this.code = "NETWORK_ERROR";
37
+ this.retryable = true;
38
+ }
39
+ };
40
+ var ValidationError = class extends UploadError {
41
+ constructor(message, field, cause) {
42
+ super(message, false, cause);
43
+ this.field = field;
44
+ this.name = "ValidationError";
45
+ this.code = "VALIDATION_ERROR";
46
+ this.retryable = false;
47
+ }
48
+ };
49
+ var EmptyFileError = class extends ValidationError {
50
+ constructor(message = "Cannot upload empty file", cause) {
51
+ super(message, "file", cause);
52
+ this.name = "EmptyFileError";
53
+ this.code = "EMPTY_FILE_ERROR";
54
+ }
55
+ };
56
+ var TimeoutError = class extends UploadError {
57
+ constructor(message = "Request timed out", cause) {
58
+ super(message, true, cause);
59
+ this.name = "TimeoutError";
60
+ this.code = "TIMEOUT_ERROR";
61
+ this.retryable = true;
62
+ }
63
+ };
64
+ var PinError = class extends PinnerError {
65
+ constructor(message = "Pin operation failed", retryable = false, cause) {
66
+ super("PIN_ERROR", message, retryable, cause);
67
+ this.name = "PinError";
68
+ }
69
+ };
70
+ var NotFoundError = class extends PinError {
71
+ constructor(message = "Resource not found", cause) {
72
+ super(message, false, cause);
73
+ this.name = "NotFoundError";
74
+ this.code = "NOT_FOUND";
75
+ this.retryable = false;
76
+ }
77
+ };
78
+ var RateLimitError = class extends PinError {
79
+ /**
80
+ * Seconds to wait before retry.
81
+ */
82
+ retryAfter;
83
+ constructor(message = "Rate limit exceeded", retryAfter, cause) {
84
+ super(message, true, cause);
85
+ this.name = "RateLimitError";
86
+ this.code = "RATE_LIMIT_EXCEEDED";
87
+ this.retryable = true;
88
+ this.retryAfter = retryAfter;
89
+ }
90
+ };
91
+
92
+ //#endregion
93
+ exports.AuthenticationError = AuthenticationError;
94
+ exports.ConfigurationError = ConfigurationError;
95
+ exports.EmptyFileError = EmptyFileError;
96
+ exports.NetworkError = NetworkError;
97
+ exports.NotFoundError = NotFoundError;
98
+ exports.PinError = PinError;
99
+ exports.PinnerError = PinnerError;
100
+ exports.RateLimitError = RateLimitError;
101
+ exports.TimeoutError = TimeoutError;
102
+ exports.UploadError = UploadError;
103
+ exports.ValidationError = ValidationError;
104
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/errors/index.ts"],"sourcesContent":["export class PinnerError extends Error {\n constructor(\n public code: string,\n message: string,\n public retryable: boolean,\n public cause?: Error\n ) {\n super(message);\n this.name = \"PinnerError\";\n }\n}\n\nexport class ConfigurationError extends PinnerError {\n constructor(message: string, cause?: Error) {\n super(\"CONFIGURATION_ERROR\", message, false, cause);\n this.name = \"ConfigurationError\";\n }\n}\n\nexport class AuthenticationError extends PinnerError {\n constructor(message: string = \"Authentication failed\", cause?: Error) {\n super(\"AUTHENTICATION_ERROR\", message, false, cause);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class UploadError extends PinnerError {\n code = \"UPLOAD_ERROR\";\n\n constructor(\n message: string,\n public override retryable: boolean = false,\n cause?: Error\n ) {\n super(\"UPLOAD_ERROR\", message, retryable, cause);\n this.name = \"UploadError\";\n }\n}\n\nexport class NetworkError extends UploadError {\n constructor(message: string = \"Network request failed\", cause?: Error) {\n super(message, true, cause);\n this.name = \"NetworkError\";\n this.code = \"NETWORK_ERROR\";\n this.retryable = true;\n }\n}\n\nexport class ValidationError extends UploadError {\n constructor(message: string, public field?: string, cause?: Error) {\n super(message, false, cause);\n this.name = \"ValidationError\";\n this.code = \"VALIDATION_ERROR\";\n this.retryable = false;\n }\n}\n\nexport class EmptyFileError extends ValidationError {\n constructor(message: string = \"Cannot upload empty file\", cause?: Error) {\n super(message, \"file\", cause);\n this.name = \"EmptyFileError\";\n this.code = \"EMPTY_FILE_ERROR\";\n }\n}\n\nexport class TimeoutError extends UploadError {\n constructor(message: string = \"Request timed out\", cause?: Error) {\n super(message, true, cause);\n this.name = \"TimeoutError\";\n this.code = \"TIMEOUT_ERROR\";\n this.retryable = true;\n }\n}\n\nexport class PinError extends PinnerError {\n constructor(message: string = \"Pin operation failed\", retryable: boolean = false, cause?: Error) {\n super(\"PIN_ERROR\", message, retryable, cause);\n this.name = \"PinError\";\n }\n}\n\nexport class NotFoundError extends PinError {\n constructor(message: string = \"Resource not found\", cause?: Error) {\n super(message, false, cause);\n this.name = \"NotFoundError\";\n this.code = \"NOT_FOUND\";\n this.retryable = false;\n }\n}\n\nexport class RateLimitError extends PinError {\n /**\n * Seconds to wait before retry.\n */\n retryAfter?: number;\n\n constructor(message: string = \"Rate limit exceeded\", retryAfter?: number, cause?: Error) {\n super(message, true, cause);\n this.name = \"RateLimitError\";\n this.code = \"RATE_LIMIT_EXCEEDED\";\n this.retryable = true;\n this.retryAfter = retryAfter;\n }\n}\n\nexport class EnvironmentError extends PinnerError {\n constructor(message: string = \"Unsupported environment\", cause?: Error) {\n super(\"ENVIRONMENT_ERROR\", message, false, cause);\n this.name = \"EnvironmentError\";\n }\n}"],"mappings":";;AAAA,IAAa,cAAb,cAAiC,MAAM;CACrC,YACE,AAAO,MACP,SACA,AAAO,WACP,AAAO,OACP;AACA,QAAM,QAAQ;EALP;EAEA;EACA;AAGP,OAAK,OAAO;;;AAIhB,IAAa,qBAAb,cAAwC,YAAY;CAClD,YAAY,SAAiB,OAAe;AAC1C,QAAM,uBAAuB,SAAS,OAAO,MAAM;AACnD,OAAK,OAAO;;;AAIhB,IAAa,sBAAb,cAAyC,YAAY;CACnD,YAAY,UAAkB,yBAAyB,OAAe;AACpE,QAAM,wBAAwB,SAAS,OAAO,MAAM;AACpD,OAAK,OAAO;;;AAIhB,IAAa,cAAb,cAAiC,YAAY;CAC3C,OAAO;CAEP,YACE,SACA,AAAgB,YAAqB,OACrC,OACA;AACA,QAAM,gBAAgB,SAAS,WAAW,MAAM;EAHhC;AAIhB,OAAK,OAAO;;;AAIhB,IAAa,eAAb,cAAkC,YAAY;CAC5C,YAAY,UAAkB,0BAA0B,OAAe;AACrE,QAAM,SAAS,MAAM,MAAM;AAC3B,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,YAAY;;;AAIrB,IAAa,kBAAb,cAAqC,YAAY;CAC/C,YAAY,SAAiB,AAAO,OAAgB,OAAe;AACjE,QAAM,SAAS,OAAO,MAAM;EADM;AAElC,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,YAAY;;;AAIrB,IAAa,iBAAb,cAAoC,gBAAgB;CAClD,YAAY,UAAkB,4BAA4B,OAAe;AACvE,QAAM,SAAS,QAAQ,MAAM;AAC7B,OAAK,OAAO;AACZ,OAAK,OAAO;;;AAIhB,IAAa,eAAb,cAAkC,YAAY;CAC5C,YAAY,UAAkB,qBAAqB,OAAe;AAChE,QAAM,SAAS,MAAM,MAAM;AAC3B,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,YAAY;;;AAIrB,IAAa,WAAb,cAA8B,YAAY;CACxC,YAAY,UAAkB,wBAAwB,YAAqB,OAAO,OAAe;AAC/F,QAAM,aAAa,SAAS,WAAW,MAAM;AAC7C,OAAK,OAAO;;;AAIhB,IAAa,gBAAb,cAAmC,SAAS;CAC1C,YAAY,UAAkB,sBAAsB,OAAe;AACjE,QAAM,SAAS,OAAO,MAAM;AAC5B,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,YAAY;;;AAIrB,IAAa,iBAAb,cAAoC,SAAS;;;;CAI3C;CAEA,YAAY,UAAkB,uBAAuB,YAAqB,OAAe;AACvF,QAAM,SAAS,MAAM,MAAM;AAC3B,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,aAAa"}
@@ -0,0 +1,47 @@
1
+ //#region src/errors/index.d.ts
2
+ declare class PinnerError extends Error {
3
+ code: string;
4
+ retryable: boolean;
5
+ cause?: Error | undefined;
6
+ constructor(code: string, message: string, retryable: boolean, cause?: Error | undefined);
7
+ }
8
+ declare class ConfigurationError extends PinnerError {
9
+ constructor(message: string, cause?: Error);
10
+ }
11
+ declare class AuthenticationError extends PinnerError {
12
+ constructor(message?: string, cause?: Error);
13
+ }
14
+ declare class UploadError extends PinnerError {
15
+ retryable: boolean;
16
+ code: string;
17
+ constructor(message: string, retryable?: boolean, cause?: Error);
18
+ }
19
+ declare class NetworkError extends UploadError {
20
+ constructor(message?: string, cause?: Error);
21
+ }
22
+ declare class ValidationError extends UploadError {
23
+ field?: string | undefined;
24
+ constructor(message: string, field?: string | undefined, cause?: Error);
25
+ }
26
+ declare class EmptyFileError extends ValidationError {
27
+ constructor(message?: string, cause?: Error);
28
+ }
29
+ declare class TimeoutError extends UploadError {
30
+ constructor(message?: string, cause?: Error);
31
+ }
32
+ declare class PinError extends PinnerError {
33
+ constructor(message?: string, retryable?: boolean, cause?: Error);
34
+ }
35
+ declare class NotFoundError extends PinError {
36
+ constructor(message?: string, cause?: Error);
37
+ }
38
+ declare class RateLimitError extends PinError {
39
+ /**
40
+ * Seconds to wait before retry.
41
+ */
42
+ retryAfter?: number;
43
+ constructor(message?: string, retryAfter?: number, cause?: Error);
44
+ }
45
+ //#endregion
46
+ export { AuthenticationError, ConfigurationError, EmptyFileError, NetworkError, NotFoundError, PinError, PinnerError, RateLimitError, TimeoutError, UploadError, ValidationError };
47
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,42 @@
1
+ const require_mime_types = require('./types/mime-types.cjs');
2
+ const require_stream = require('./utils/stream.cjs');
3
+ const require_unstorage_base = require('./blockstore/unstorage-base.cjs');
4
+ const require_unstorage = require('./blockstore/unstorage.cjs');
5
+ require('./blockstore/index.cjs');
6
+ const require_car = require('./upload/car.cjs');
7
+ const require_index$1 = require('./errors/index.cjs');
8
+ const require_manager = require('./upload/manager.cjs');
9
+ const require_pinner = require('./pinner.cjs');
10
+ const require_type_guards = require('./types/type-guards.cjs');
11
+ const require_adapter = require('./adapters/pinata/adapter.cjs');
12
+ require('./adapters/pinata/index.cjs');
13
+
14
+ exports.AuthenticationError = require_index$1.AuthenticationError;
15
+ exports.ConfigurationError = require_index$1.ConfigurationError;
16
+ exports.EmptyFileError = require_index$1.EmptyFileError;
17
+ exports.FILE_EXTENSION_CAR = require_mime_types.FILE_EXTENSION_CAR;
18
+ exports.MIME_TYPE_CAR = require_mime_types.MIME_TYPE_CAR;
19
+ exports.MIME_TYPE_OCTET_STREAM = require_mime_types.MIME_TYPE_OCTET_STREAM;
20
+ exports.NetworkError = require_index$1.NetworkError;
21
+ exports.NotFoundError = require_index$1.NotFoundError;
22
+ exports.PinError = require_index$1.PinError;
23
+ exports.Pinner = require_pinner.Pinner;
24
+ exports.PinnerError = require_index$1.PinnerError;
25
+ exports.RateLimitError = require_index$1.RateLimitError;
26
+ exports.TimeoutError = require_index$1.TimeoutError;
27
+ exports.UploadError = require_index$1.UploadError;
28
+ exports.UploadManager = require_manager.UploadManager;
29
+ exports.ValidationError = require_index$1.ValidationError;
30
+ exports.asyncGeneratorToReadableStream = require_stream.asyncGeneratorToReadableStream;
31
+ exports.calculateStreamSize = require_stream.calculateStreamSize;
32
+ exports.createBlockstore = require_unstorage.createBlockstore;
33
+ exports.createDatastore = require_unstorage.createDatastore;
34
+ exports.destroyCarPreprocessor = require_car.destroyCarPreprocessor;
35
+ exports.isAuthenticationError = require_type_guards.isAuthenticationError;
36
+ exports.isCarFile = require_car.isCarFile;
37
+ exports.isRetryable = require_type_guards.isRetryable;
38
+ exports.pinataAdapter = require_adapter.pinataAdapter;
39
+ exports.preprocessToCar = require_car.preprocessToCar;
40
+ exports.readableStreamToAsyncIterable = require_stream.readableStreamToAsyncIterable;
41
+ exports.setDriverFactory = require_unstorage_base.setDriverFactory;
42
+ exports.streamToBlob = require_stream.streamToBlob;
@@ -0,0 +1,14 @@
1
+ import { PinnerConfig } from "./config.cjs";
2
+ import { UploadInput, UploadOperation, UploadOptions, UploadProgress, UploadResult } from "./types/upload.cjs";
3
+ import { RemoteAddOptions, RemoteLsOptions, RemotePin, RemotePins } from "./types/pin.cjs";
4
+ import { Pinner } from "./pinner.cjs";
5
+ import { UploadManager } from "./upload/manager.cjs";
6
+ import { CarPreprocessOptions, CarPreprocessResult, destroyCarPreprocessor, isCarFile, preprocessToCar } from "./upload/car.cjs";
7
+ import { AuthenticationError, ConfigurationError, EmptyFileError, NetworkError, NotFoundError, PinError, PinnerError, RateLimitError, TimeoutError, UploadError, ValidationError } from "./errors/index.cjs";
8
+ import { isAuthenticationError, isRetryable } from "./types/type-guards.cjs";
9
+ import { FILE_EXTENSION_CAR, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM } from "./types/mime-types.cjs";
10
+ import { UnstorageBlockstoreOptions, setDriverFactory } from "./blockstore/unstorage-base.cjs";
11
+ import { createBlockstore, createDatastore } from "./blockstore/unstorage.cjs";
12
+ import { asyncGeneratorToReadableStream, calculateStreamSize, readableStreamToAsyncIterable, streamToBlob } from "./utils/stream.cjs";
13
+ import { pinataAdapter } from "./adapters/pinata/adapter.cjs";
14
+ export { AuthenticationError, type CarPreprocessOptions, type CarPreprocessResult, ConfigurationError, EmptyFileError, FILE_EXTENSION_CAR, MIME_TYPE_CAR, MIME_TYPE_OCTET_STREAM, NetworkError, NotFoundError, PinError, Pinner, type PinnerConfig, PinnerError, RateLimitError, type RemoteAddOptions, type RemoteLsOptions, type RemotePin, type RemotePins, TimeoutError, type UnstorageBlockstoreOptions, UploadError, type UploadInput, UploadManager, type UploadOperation, type UploadOptions, type UploadProgress, type UploadResult, ValidationError, asyncGeneratorToReadableStream, calculateStreamSize, createBlockstore, createDatastore, destroyCarPreprocessor, isAuthenticationError, isCarFile, isRetryable, pinataAdapter, preprocessToCar, readableStreamToAsyncIterable, setDriverFactory, streamToBlob };