@nf2t/nifitools-js 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.cjs ADDED
@@ -0,0 +1,341 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/main.ts
31
+ var main_exports = {};
32
+ __export(main_exports, {
33
+ ManifestSchema: () => ManifestSchema,
34
+ NarAttributeSchema: () => NarAttributeSchema,
35
+ NarAttributeTypeSchema: () => NarAttributeTypeSchema,
36
+ NarAttributesSchema: () => NarAttributesSchema,
37
+ NarExportSchema: () => NarExportSchema,
38
+ NarExtensionProperty: () => NarExtensionProperty,
39
+ NarExtensionRelationship: () => NarExtensionRelationship,
40
+ NarExtensionSchema: () => NarExtensionSchema,
41
+ NarExtensionsSchema: () => NarExtensionsSchema,
42
+ NarSchema: () => NarSchema,
43
+ NarsSchema: () => NarsSchema,
44
+ WriteNarsSchema: () => WriteNarsSchema,
45
+ readNars: () => readNars
46
+ });
47
+ module.exports = __toCommonJS(main_exports);
48
+
49
+ // src/readNars.ts
50
+ var import_jszip = __toESM(require("jszip"), 1);
51
+ var import_zod = require("zod");
52
+ var NarAttributeTypeSchema = import_zod.z.enum(["writes", "reads"]);
53
+ var NarAttributeSchema = import_zod.z.object({
54
+ narId: import_zod.z.string(),
55
+ extensionId: import_zod.z.string(),
56
+ type: NarAttributeTypeSchema,
57
+ id: import_zod.z.string(),
58
+ name: import_zod.z.string(),
59
+ description: import_zod.z.string()
60
+ });
61
+ var NarAttributesSchema = import_zod.z.array(NarAttributeSchema);
62
+ var NarExtensionRelationship = import_zod.z.object({
63
+ name: import_zod.z.string(),
64
+ description: import_zod.z.string().optional(),
65
+ autoTerminated: import_zod.z.boolean()
66
+ });
67
+ var NarExtensionProperty = import_zod.z.object({
68
+ name: import_zod.z.string(),
69
+ displayName: import_zod.z.string(),
70
+ description: import_zod.z.string().optional(),
71
+ required: import_zod.z.boolean().optional(),
72
+ sensitive: import_zod.z.boolean().optional(),
73
+ expressionLanguageSupported: import_zod.z.boolean().optional(),
74
+ expressionLanguageScope: import_zod.z.string().optional(),
75
+ dynamicallyModifiesClasspath: import_zod.z.boolean().optional(),
76
+ dynamic: import_zod.z.boolean().optional()
77
+ });
78
+ var NarExtensionSchema = import_zod.z.object({
79
+ narId: import_zod.z.string(),
80
+ name: import_zod.z.string(),
81
+ type: import_zod.z.string(),
82
+ description: import_zod.z.string().optional(),
83
+ tags: import_zod.z.array(import_zod.z.string()),
84
+ relationships: import_zod.z.array(NarExtensionRelationship),
85
+ properties: import_zod.z.array(NarExtensionProperty),
86
+ // These might be properties of the Property
87
+ required: import_zod.z.boolean().optional(),
88
+ sensitive: import_zod.z.boolean().optional(),
89
+ expressionLanguageSupported: import_zod.z.boolean().optional(),
90
+ expressionLanguageScope: import_zod.z.string().optional(),
91
+ dynamicallyModifiesClasspath: import_zod.z.boolean().optional(),
92
+ dynamic: import_zod.z.boolean().optional()
93
+ });
94
+ var NarExtensionsSchema = import_zod.z.array(NarExtensionSchema);
95
+ var ManifestSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.string());
96
+ var NarSchema = import_zod.z.object({
97
+ manifest: ManifestSchema,
98
+ name: import_zod.z.string(),
99
+ lastModified: import_zod.z.number(),
100
+ size: import_zod.z.number(),
101
+ systemApiVersion: import_zod.z.string().optional(),
102
+ groupId: import_zod.z.string().optional(),
103
+ artifactId: import_zod.z.string().optional(),
104
+ version: import_zod.z.string().optional(),
105
+ buildTag: import_zod.z.string().optional(),
106
+ buildTimestamp: import_zod.z.string().optional()
107
+ });
108
+ var NarsSchema = import_zod.z.array(NarSchema);
109
+ var NarExportSchema = import_zod.z.object({
110
+ nars: NarsSchema,
111
+ extensions: NarExtensionsSchema,
112
+ attributes: NarAttributesSchema
113
+ });
114
+ var attributesLut = [
115
+ {
116
+ type: "reads",
117
+ selectors: "readsAttributes > readsAttribute"
118
+ },
119
+ {
120
+ type: "writes",
121
+ selectors: "writesAttributes > writesAttribute"
122
+ }
123
+ ];
124
+ function querySelectorString(element, selectors) {
125
+ return element.querySelector(selectors)?.textContent || void 0;
126
+ }
127
+ function querySelectorBoolean(element, selectors) {
128
+ const value = querySelectorString(element, selectors);
129
+ if (value === "true") {
130
+ return true;
131
+ } else if (value === "false") {
132
+ return true;
133
+ }
134
+ return void 0;
135
+ }
136
+ async function readExtensionManifest({ file, manifest, extensionManifest, parseNar, parseExtension, parseAttribute }) {
137
+ const rawNarInfo = {
138
+ manifest,
139
+ name: file.name,
140
+ lastModified: file.lastModified,
141
+ size: file.size,
142
+ systemApiVersion: querySelectorString(extensionManifest, "systemApiVersion"),
143
+ groupId: querySelectorString(extensionManifest, "groupId"),
144
+ artifactId: querySelectorString(extensionManifest, "artifactId"),
145
+ version: querySelectorString(extensionManifest, "version"),
146
+ buildTag: querySelectorString(extensionManifest, "buildInfo > tag"),
147
+ buildTimestamp: querySelectorString(extensionManifest, "buildInfo > timestamp")
148
+ };
149
+ const narResult = await NarSchema.safeParseAsync(rawNarInfo);
150
+ if (!narResult.success) {
151
+ console.error({
152
+ file: file.name,
153
+ type: "Unable to parse NarSchema",
154
+ error: narResult.error
155
+ });
156
+ return;
157
+ }
158
+ parseNar(narResult.data);
159
+ for (const extensionElement of extensionManifest.querySelectorAll("extensionManifest > extensions > extension")) {
160
+ const extensionResult = await NarExtensionSchema.safeParseAsync({
161
+ narId: narResult.data.name,
162
+ name: querySelectorString(extensionElement, "name"),
163
+ type: querySelectorString(extensionElement, "type"),
164
+ description: querySelectorString(extensionElement, "description"),
165
+ writesAttributes: [],
166
+ readsAttributes: [],
167
+ tags: [],
168
+ properties: [],
169
+ relationships: [],
170
+ required: querySelectorBoolean(extensionElement, "required"),
171
+ sensitive: querySelectorBoolean(extensionElement, "sensitive"),
172
+ expressionLanguageSupported: querySelectorBoolean(extensionElement, "expressionLanguageSupported"),
173
+ expressionLanguageScope: querySelectorString(extensionElement, "expressionLanguageScope"),
174
+ dynamicallyModifiesClasspath: querySelectorBoolean(extensionElement, "dynamicallyModifiesClasspath"),
175
+ dynamic: querySelectorBoolean(extensionElement, "dynamic")
176
+ });
177
+ if (!extensionResult.success) {
178
+ console.error({
179
+ file: file.name,
180
+ type: "Unable to parse NarExtensionSchema",
181
+ error: extensionResult.error
182
+ });
183
+ continue;
184
+ }
185
+ for (const tagElement of extensionElement.querySelectorAll("tags > tag")) {
186
+ if (tagElement.textContent) {
187
+ extensionResult.data.tags.push(tagElement.textContent);
188
+ }
189
+ }
190
+ for (const propertyElement of extensionElement.querySelectorAll("properties > property")) {
191
+ if (propertyElement.textContent) {
192
+ const raw = await NarExtensionProperty.parseAsync({
193
+ name: querySelectorString(propertyElement, "name"),
194
+ description: querySelectorString(propertyElement, "description"),
195
+ displayName: querySelectorString(propertyElement, "displayName")
196
+ });
197
+ extensionResult.data.properties.push(raw);
198
+ }
199
+ }
200
+ for (const relationshipElement of extensionElement.querySelectorAll("relationships > relationship")) {
201
+ if (relationshipElement.textContent) {
202
+ const raw = await NarExtensionRelationship.parseAsync({
203
+ name: querySelectorString(relationshipElement, "name"),
204
+ description: querySelectorString(relationshipElement, "description"),
205
+ autoTerminated: querySelectorBoolean(relationshipElement, "autoTerminated")
206
+ });
207
+ extensionResult.data.relationships.push(raw);
208
+ }
209
+ }
210
+ parseExtension(extensionResult.data);
211
+ for (const { type, selectors } of attributesLut) {
212
+ const queryResult = extensionElement.querySelectorAll(selectors);
213
+ for (const attributeElement of queryResult) {
214
+ const name = attributeElement.querySelector("name")?.textContent || void 0;
215
+ const rawAttribute = {
216
+ narId: narResult.data.name,
217
+ extensionId: extensionResult.data.name,
218
+ id: `${extensionResult.data.name}|${name}`,
219
+ type,
220
+ name,
221
+ description: attributeElement.querySelector("description")?.textContent || void 0
222
+ };
223
+ const attributeResult = await NarAttributeSchema.safeParseAsync(rawAttribute);
224
+ if (!attributeResult.success) {
225
+ console.error({
226
+ file: file.name,
227
+ type: "Unable to parse NarAttributeSchema",
228
+ error: attributeResult.error
229
+ });
230
+ continue;
231
+ }
232
+ parseAttribute(attributeResult.data);
233
+ }
234
+ }
235
+ }
236
+ return narResult;
237
+ }
238
+ async function readNars({ files, options, setCurrentProgress, parseNar, parseExtension, parseAttribute, DOMParser }) {
239
+ const result = {
240
+ filesLength: files.length,
241
+ filesCount: 0,
242
+ narCount: 0,
243
+ narSuccessCount: 0,
244
+ narErrorCount: 0
245
+ };
246
+ setCurrentProgress(0, result.filesLength);
247
+ for (let index = 0; index < result.filesLength; index++) {
248
+ result.filesCount += 1;
249
+ setCurrentProgress(index, result.filesLength);
250
+ const file = files[index];
251
+ if (file == null || file == void 0) {
252
+ console.error({
253
+ type: "Non-File object",
254
+ file
255
+ });
256
+ continue;
257
+ }
258
+ if (!(file instanceof File)) {
259
+ result.narErrorCount += 1;
260
+ console.error({
261
+ type: "Non-File object",
262
+ file
263
+ });
264
+ continue;
265
+ }
266
+ if (!file.name.endsWith(".nar")) {
267
+ continue;
268
+ }
269
+ result.narCount += 1;
270
+ await import_jszip.default.loadAsync(await file.arrayBuffer(), options).then(async (zipFile) => {
271
+ const manifestFile = zipFile.files["META-INF/MANIFEST.MF"];
272
+ const manifestResult = await manifestFile.async("text").then((manifest) => {
273
+ return manifest.split("\n").map((line) => {
274
+ const index2 = line.indexOf(":");
275
+ return [line.substring(0, index2).trim(), line.substring(index2 + 1).trim()];
276
+ }).filter((x) => x[0].length > 0 || x[1].length > 0);
277
+ }).then(Object.fromEntries).then(ManifestSchema.safeParseAsync);
278
+ if (!manifestResult.success) {
279
+ result.narErrorCount += 1;
280
+ console.error({
281
+ file: file.name,
282
+ type: "Unable to parse ManifestSchema",
283
+ error: manifestResult.error
284
+ });
285
+ return null;
286
+ }
287
+ const extensionManifestFile = zipFile.files["META-INF/docs/extension-manifest.xml"];
288
+ if (extensionManifestFile == void 0) {
289
+ result.narErrorCount += 1;
290
+ console.error({
291
+ file: file.name,
292
+ type: "Manifest file does not exist"
293
+ });
294
+ return null;
295
+ }
296
+ return await extensionManifestFile.async("text").then(async (xml) => {
297
+ const extensionManifestFile2 = DOMParser.parseFromString(xml, "text/xml");
298
+ return await readExtensionManifest({
299
+ file,
300
+ parseNar,
301
+ parseExtension,
302
+ parseAttribute,
303
+ manifest: manifestResult.data,
304
+ extensionManifest: extensionManifestFile2
305
+ });
306
+ });
307
+ }).catch((e) => {
308
+ result.narErrorCount += 1;
309
+ console.error({
310
+ fileName: file.name,
311
+ file,
312
+ type: "Uncaught Error",
313
+ error: e
314
+ });
315
+ });
316
+ }
317
+ setCurrentProgress(files.length, files.length);
318
+ return result;
319
+ }
320
+ var WriteNarsSchema = import_zod.z.object({
321
+ nars: NarsSchema,
322
+ extensions: NarExtensionsSchema,
323
+ attributes: NarAttributesSchema
324
+ });
325
+ // Annotate the CommonJS export names for ESM import in node:
326
+ 0 && (module.exports = {
327
+ ManifestSchema,
328
+ NarAttributeSchema,
329
+ NarAttributeTypeSchema,
330
+ NarAttributesSchema,
331
+ NarExportSchema,
332
+ NarExtensionProperty,
333
+ NarExtensionRelationship,
334
+ NarExtensionSchema,
335
+ NarExtensionsSchema,
336
+ NarSchema,
337
+ NarsSchema,
338
+ WriteNarsSchema,
339
+ readNars
340
+ });
341
+ //# sourceMappingURL=main.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts","../src/readNars.ts"],"sourcesContent":["\nexport {\n NarAttributeTypeSchema,\n NarAttributeSchema,\n NarAttributesSchema, \n NarExtensionRelationship ,\n NarExtensionProperty ,\n NarExtensionSchema,\n NarExtensionsSchema ,\n ManifestSchema ,\n NarSchema,\n NarsSchema ,\n NarExportSchema,\n WriteNarsSchema,\n readNars,\n} from \"./readNars\";\n\nexport type {\n NarAttributeType,\n NarAttribute,\n NarAttributes,\n NarExtension,\n NarExtensions,\n Manifest,\n Nar,\n Nars,\n IncomingFiles,\n ReadNarsParameters,\n ReadNarsResult,\n WriteNars,\n} from \"./readNars\";","import JSZip from \"jszip\";\nimport { z } from \"zod\";\n\nexport const NarAttributeTypeSchema = z.enum([\"writes\", \"reads\"]);\n\nexport type NarAttributeType = z.infer<typeof NarAttributeTypeSchema>;\n\nexport const NarAttributeSchema = z.object({\n narId: z.string(),\n extensionId: z.string(),\n type: NarAttributeTypeSchema,\n id: z.string(),\n name: z.string(),\n description: z.string(),\n})\n\nexport type NarAttribute = z.infer<typeof NarAttributeSchema>;\nexport const NarAttributesSchema = z.array(NarAttributeSchema);\nexport type NarAttributes = z.infer<typeof NarAttributesSchema>;\n\nexport const NarExtensionRelationship = z.object({\n name: z.string(),\n description: z.string().optional(),\n autoTerminated: z.boolean(),\n});\n\nexport const NarExtensionProperty = z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n sensitive: z.boolean().optional(),\n expressionLanguageSupported: z.boolean().optional(),\n expressionLanguageScope: z.string().optional(),\n dynamicallyModifiesClasspath: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n});\n\nexport const NarExtensionSchema = z.object({\n narId: z.string(),\n name: z.string(),\n type: z.string(),\n description: z.string().optional(),\n tags: z.array(z.string()),\n relationships: z.array(NarExtensionRelationship),\n properties: z.array(NarExtensionProperty),\n // These might be properties of the Property\n required: z.boolean().optional(),\n sensitive: z.boolean().optional(),\n expressionLanguageSupported: z.boolean().optional(),\n expressionLanguageScope: z.string().optional(),\n dynamicallyModifiesClasspath: z.boolean().optional(),\n dynamic: z.boolean().optional(),\n});\n\nexport type NarExtension = z.infer<typeof NarExtensionSchema>;\nexport const NarExtensionsSchema = z.array(NarExtensionSchema);\nexport type NarExtensions = z.infer<typeof NarExtensionsSchema>;\n\nexport const ManifestSchema = z.record(z.string(), z.string());\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\nexport const NarSchema = z.object({\n manifest: ManifestSchema,\n name: z.string(),\n lastModified: z.number(),\n size: z.number(),\n systemApiVersion: z.string().optional(),\n groupId: z.string().optional(),\n artifactId: z.string().optional(),\n version: z.string().optional(),\n buildTag: z.string().optional(),\n buildTimestamp: z.string().optional(),\n});\n\nexport type Nar = z.infer<typeof NarSchema>;\nexport const NarsSchema = z.array(NarSchema);\nexport type Nars = z.infer<typeof NarsSchema>;\n\nexport const NarExportSchema = z.object({\n nars: NarsSchema,\n extensions: NarExtensionsSchema,\n attributes: NarAttributesSchema,\n})\n\nexport type IncomingFiles = File[];\n\nexport type ReadNarsParameters = {\n //TODO: Update implementation of processNars to consume File[] rather than a FileList\n files: IncomingFiles, \n options?: JSZip.JSZipLoadOptions\n\n DOMParser: DOMParser,\n setCurrentProgress: (current: number, total: number) => void,\n parseNar: (nar: Nar) => Promise<void>,\n parseExtension: (extension: NarExtension) => Promise<void>,\n parseAttribute: (extension: NarAttribute) => Promise<void>,\n}\n\ntype ReadExtensionManifestParameters = {\n file: File, \n extensionManifest: Document,\n manifest: Manifest,\n parseNar: (nar: Nar) => Promise<void>,\n parseExtension: (extension: NarExtension) => Promise<void>,\n parseAttribute: (extension: NarAttribute) => Promise<void>,\n}\n\ntype AttributesLuv = {\n type: NarAttributeType,\n selectors: string,\n}\n\nconst attributesLut: AttributesLuv[] = [\n {\n type: \"reads\",\n selectors: \"readsAttributes > readsAttribute\",\n },\n {\n type: \"writes\",\n selectors: \"writesAttributes > writesAttribute\",\n },\n]\n\nfunction querySelectorString(element: Document | Element, selectors: string) {\n return element.querySelector(selectors)?.textContent || undefined;\n}\n\nfunction querySelectorBoolean(element: Document | Element, selectors: string) {\n const value = querySelectorString(element, selectors);\n if(value === \"true\") {\n return true;\n }\n else if(value === \"false\") {\n return true;\n }\n return undefined;\n}\n\nasync function readExtensionManifest({file, manifest, extensionManifest, parseNar, parseExtension, parseAttribute }: ReadExtensionManifestParameters) {\n const rawNarInfo: Partial<Nar> = {\n manifest: manifest,\n name: file.name,\n lastModified: file.lastModified,\n size: file.size,\n systemApiVersion: querySelectorString(extensionManifest, \"systemApiVersion\"),\n groupId: querySelectorString(extensionManifest, \"groupId\"),\n artifactId: querySelectorString(extensionManifest, \"artifactId\"),\n version: querySelectorString(extensionManifest, \"version\"),\n buildTag: querySelectorString(extensionManifest, \"buildInfo > tag\"),\n buildTimestamp: querySelectorString(extensionManifest, \"buildInfo > timestamp\"),\n }\n\n const narResult = await NarSchema.safeParseAsync(rawNarInfo);\n\n if(!narResult.success) {\n console.error({\n file: file.name,\n type: \"Unable to parse NarSchema\",\n error: narResult.error,\n });\n return;\n }\n\n parseNar(narResult.data);\n\n for (const extensionElement of extensionManifest.querySelectorAll(\"extensionManifest > extensions > extension\")) {\n const extensionResult = await NarExtensionSchema.safeParseAsync({\n narId: narResult.data.name,\n name: querySelectorString(extensionElement, \"name\"),\n type: querySelectorString(extensionElement, \"type\"),\n description: querySelectorString(extensionElement, \"description\"),\n writesAttributes: [],\n readsAttributes: [],\n tags: [],\n properties: [],\n relationships: [],\n required: querySelectorBoolean(extensionElement, \"required\"),\n sensitive: querySelectorBoolean(extensionElement, \"sensitive\"),\n expressionLanguageSupported: querySelectorBoolean(extensionElement, \"expressionLanguageSupported\"),\n expressionLanguageScope: querySelectorString(extensionElement, \"expressionLanguageScope\"),\n dynamicallyModifiesClasspath: querySelectorBoolean(extensionElement, \"dynamicallyModifiesClasspath\"),\n dynamic: querySelectorBoolean(extensionElement, \"dynamic\"),\n }); \n\n if (!extensionResult.success) {\n console.error({\n file: file.name,\n type: \"Unable to parse NarExtensionSchema\",\n error: extensionResult.error,\n });\n continue;\n }\n\n for(const tagElement of extensionElement.querySelectorAll(\"tags > tag\")) {\n if(tagElement.textContent) {\n extensionResult.data.tags.push(tagElement.textContent);\n }\n }\n\n for(const propertyElement of extensionElement.querySelectorAll(\"properties > property\")) {\n if(propertyElement.textContent) {\n const raw = await NarExtensionProperty.parseAsync({\n name: querySelectorString(propertyElement, \"name\"),\n description: querySelectorString(propertyElement, \"description\"),\n displayName: querySelectorString(propertyElement, \"displayName\"),\n })\n\n extensionResult.data.properties.push(raw);\n }\n }\n\n for(const relationshipElement of extensionElement.querySelectorAll(\"relationships > relationship\")) {\n if(relationshipElement.textContent) {\n const raw = await NarExtensionRelationship.parseAsync({\n name: querySelectorString(relationshipElement, \"name\"),\n description: querySelectorString(relationshipElement, \"description\"),\n autoTerminated: querySelectorBoolean(relationshipElement, \"autoTerminated\"),\n })\n\n extensionResult.data.relationships.push(raw);\n }\n }\n\n parseExtension(extensionResult.data);\n\n for (const {type, selectors} of attributesLut) {\n const queryResult = extensionElement.querySelectorAll(selectors);\n\n for (const attributeElement of queryResult) {\n const name = attributeElement.querySelector(\"name\")?.textContent || undefined;\n\n const rawAttribute: Partial<NarAttribute> = {\n narId: narResult.data.name,\n extensionId: extensionResult.data.name,\n id: `${extensionResult.data.name}|${name}`,\n type: type,\n name: name,\n description: attributeElement.querySelector(\"description\")?.textContent || undefined,\n }\n\n const attributeResult = await NarAttributeSchema.safeParseAsync(rawAttribute)\n \n if(!attributeResult.success) {\n console.error({\n file: file.name,\n type: \"Unable to parse NarAttributeSchema\",\n error: attributeResult.error,\n });\n continue;\n }\n\n parseAttribute(attributeResult.data);\n }\n }\n }\n\n return narResult;\n}\n\nexport type ReadNarsResult = {\n readonly filesLength: number\n filesCount: number\n narCount: number\n narSuccessCount: number\n narErrorCount: number\n}\n\nexport async function readNars({files, options, setCurrentProgress, parseNar, parseExtension, parseAttribute, DOMParser}: ReadNarsParameters): Promise<ReadNarsResult> {\n const result: ReadNarsResult = {\n filesLength: files.length,\n filesCount: 0,\n narCount: 0,\n narSuccessCount: 0,\n narErrorCount: 0,\n }\n setCurrentProgress(0, result.filesLength);\n for (let index = 0; index < result.filesLength; index++) {\n result.filesCount += 1;\n setCurrentProgress(index, result.filesLength);\n\n const file = files[index];\n if (file == null || file == undefined) {\n console.error({\n type: \"Non-File object\",\n file: file,\n });\n continue;\n } \n if(! (file instanceof File)) {\n result.narErrorCount += 1;\n console.error({\n type: \"Non-File object\",\n file: file,\n });\n continue;\n }\n if (!file.name.endsWith(\".nar\")) {\n continue;\n }\n result.narCount += 1;\n\n await JSZip.loadAsync(await file.arrayBuffer(), options).then(async (zipFile) => {\n //TODO: Actually use manifestFile\n const manifestFile = zipFile.files[\"META-INF/MANIFEST.MF\"];\n const manifestResult = await manifestFile.async(\"text\").then(manifest => {\n return manifest.split(\"\\n\").map(line => {\n const index = line.indexOf(\":\");\n return [line.substring(0, index).trim(), line.substring(index + 1).trim()]\n }).filter(x => x[0].length > 0 || x[1].length > 0);\n }).then(Object.fromEntries).then(ManifestSchema.safeParseAsync);\n\n if(!manifestResult.success) {\n result.narErrorCount +=1;\n console.error({\n file: file.name,\n type: \"Unable to parse ManifestSchema\",\n error: manifestResult.error,\n });\n return null;\n }\n\n const extensionManifestFile = zipFile.files[\"META-INF/docs/extension-manifest.xml\"];\n if (extensionManifestFile == undefined) {\n result.narErrorCount +=1;\n console.error({\n file: file.name,\n type: \"Manifest file does not exist\",\n });\n return null;\n }\n\n return await extensionManifestFile.async(\"text\").then(async (xml) => {\n const extensionManifestFile = DOMParser.parseFromString(xml, \"text/xml\");\n return await readExtensionManifest({\n file, \n parseNar, \n parseExtension, \n parseAttribute,\n manifest: manifestResult.data,\n extensionManifest: extensionManifestFile,\n });\n })\n }).catch((e) => {\n result.narErrorCount +=1;\n console.error({\n fileName: file.name,\n file: file,\n type: \"Uncaught Error\",\n error: e,\n })\n });\n }\n\n setCurrentProgress(files.length, files.length);\n\n return result;\n}\n\nexport const WriteNarsSchema = z.object({\n nars: NarsSchema,\n extensions: NarExtensionsSchema,\n attributes: NarAttributesSchema,\n})\n\nexport type WriteNars = z.infer<typeof WriteNarsSchema>;"],"mappings":"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","names":["JSZip","index","extensionManifestFile"]}