Merge branch 'cleanup-compendium-packs' into 'master'

Cleanup compendium packs

Closes #94

See merge request dungeonslayers/ds4!171
This commit is contained in:
Johannes Loher 2022-02-13 00:12:30 +00:00
commit d7b8eb0dd2
10 changed files with 471 additions and 460 deletions

File diff suppressed because it is too large Load diff

View file

@ -10003,7 +10003,7 @@
"type": "loot", "type": "loot",
"img": "icons/consumables/potions/potion-bottle-labeled-medicine-capped-red-black.webp", "img": "icons/consumables/potions/potion-bottle-labeled-medicine-capped-red-black.webp",
"data": { "data": {
"description": "<p>Dieses meist schwarze Getr&auml;nk gew&auml;hrt f&uuml;r W20 Stunden dem Trinker die zwergische Volksf&auml;higkeit Dunkelsicht (siehe GRW Seite 83).</p>", "description": "<p>Dieses meist schwarze Getr&auml;nk gew&auml;hrt f&uuml;r W20 Stunden dem Trinker die zwergische Volksf&auml;higkeit Dunkelsicht (<strong>DS4</strong> S. 83).</p>",
"quantity": 1, "quantity": 1,
"price": 15, "price": 15,
"availability": "unset", "availability": "unset",

View file

@ -41,7 +41,7 @@
"type": "racialAbility", "type": "racialAbility",
"img": "icons/svg/aura.svg", "img": "icons/svg/aura.svg",
"data": { "data": {
"description": "<p>Tollpatschige V&ouml;lker sind sehr ungeschickt und grobmotorisch - sie erhalten auf alle Proben mit Agilit&auml;t einen Malus von -4.</p>" "description": "<p>Tollpatschige V&ouml;lker sind sehr ungeschickt und grobmotorisch &ndash; sie erhalten auf alle Proben mit Agilit&auml;t einen Malus von -4.</p>"
}, },
"effects": [ "effects": [
{ {
@ -586,7 +586,7 @@
"type": "racialAbility", "type": "racialAbility",
"img": "icons/svg/aura.svg", "img": "icons/svg/aura.svg",
"data": { "data": {
"description": "<p>Mitglieder dieses Volkes sind von der Magie ber&uuml;hrt - es f&auml;llt ihnen unheimlich leicht, Zauber zu verstehen und zu wirken. Sie erhalten +1 auf Zaubern.</p>" "description": "<p>Mitglieder dieses Volkes sind von der Magie ber&uuml;hrt &ndash; es f&auml;llt ihnen unheimlich leicht, Zauber zu verstehen und zu wirken. Sie erhalten +1 auf Zaubern.</p>"
}, },
"effects": [ "effects": [
{ {

View file

@ -22,7 +22,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/hover.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/hover.png",
"data": { "data": {
"description": "<p>Kann, statt zu laufen, auch schweben. Wird die Aktion &ldquo;Rennen&rdquo; ausgef&uuml;hrt, erh&ouml;ht sich die Geschwindigkeit wie am Boden auf Laufen x 2.</p>", "description": "<p>Kann, statt zu laufen, auch schweben. Wird die Aktion &bdquo;Rennen&ldquo; ausgef&uuml;hrt, erh&ouml;ht sich die Geschwindigkeit wie am Boden auf Laufen x 2.</p>",
"experiencePoints": 10 "experiencePoints": 10
}, },
"effects": [], "effects": [],
@ -39,7 +39,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/swim.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/swim.png",
"data": { "data": {
"description": "<p>Kann, statt zu laufen, schwimmen. Wird die Aktion &ldquo;Rennen&rdquo; schwimmend ausgef&uuml;hrt, erh&ouml;ht sich die Geschwindigkeit ganz normal auf Laufen x 2.</p>", "description": "<p>Kann, statt zu laufen, schwimmen. Wird die Aktion &bdquo;Rennen&ldquo; schwimmend ausgef&uuml;hrt, erh&ouml;ht sich die Geschwindigkeit ganz normal auf Laufen x 2.</p>",
"experiencePoints": 5 "experiencePoints": 5
}, },
"effects": [], "effects": [],
@ -90,7 +90,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"data": { "data": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI+VE+Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -2 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>", "description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -2 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 20 "experiencePoints": 20
}, },
"effects": [], "effects": [],
@ -107,7 +107,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/flinging.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/flinging.png",
"data": { "data": {
"description": "<p>Schlagen-Immersieg schleudert das Ziel (sofern 1+ Gr&ouml;&szlig;enkategorie kleiner) Schaden/3 m fort. Das Ziel erleidet f&uuml;r die Distanz Sturzschaden, gegen den es normal Abwehr w&uuml;rfelt, und liegt am Boden.</p>", "description": "<p>Schlagen-Immersieg schleudert das Ziel (sofern 1+ Gr&ouml;&szlig;enkategorie kleiner) Schaden / 3 m fort. Das Ziel erleidet f&uuml;r die Distanz Sturzschaden, gegen den es normal Abwehr w&uuml;rfelt, und liegt am Boden.</p>",
"experiencePoints": 10 "experiencePoints": 10
}, },
"effects": [], "effects": [],
@ -226,7 +226,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/sonar.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/sonar.png",
"data": { "data": {
"description": "<p>&ldquo;Sieht&rdquo; per Sonar.</p>", "description": "<p>&bdquo;Sieht&ldquo; per Sonar.</p>",
"experiencePoints": 10 "experiencePoints": 10
}, },
"effects": [], "effects": [],
@ -243,7 +243,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"data": { "data": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI+VE+Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -4 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>", "description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -4 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 40 "experiencePoints": 40
}, },
"effects": [], "effects": [],
@ -294,7 +294,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/charm.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/charm.png",
"data": { "data": {
"description": "<p>Kann Gegner mit einem &ldquo;Lockruf&rdquo; bezaubern. Dieser Zauber funktioniert wie der Zauberspruch <em>Gehorche</em>. Abklingzeit des <em>Lockrufs</em>: 10 Kampfrunden</p>", "description": "<p>Kann Gegner mit einem &bdquo;Lockruf&ldquo; bezaubern. Dieser Zauber funktioniert wie der Zauberspruch <em>Gehorche</em>. Abklingzeit des <em>Lockrufs</em>: 10 Kampfrunden</p>",
"experiencePoints": 25 "experiencePoints": 25
}, },
"effects": [], "effects": [],
@ -396,7 +396,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/regeneration.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/regeneration.png",
"data": { "data": {
"description": "<p>Regeneriert jede Kampfrunde aktionsfrei LK in H&ouml;he des Probenergebnisses der Regenerations- Probe (PW: K&Ouml;R). Durch Feuer oder S&auml;ure verlorene LK k&ouml;nnen nicht regeneriert werden.</p>", "description": "<p>Regeneriert jede Kampfrunde aktionsfrei LK in H&ouml;he des Probenergebnisses der Regenerations-Probe (PW: K&Ouml;R). Durch Feuer oder S&auml;ure verlorene LK k&ouml;nnen nicht regeneriert werden.</p>",
"experiencePoints": -1 "experiencePoints": -1
}, },
"effects": [], "effects": [],
@ -481,7 +481,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png",
"data": { "data": {
"description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &ldquo;Gift trotzen&rdquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 1 nicht abwehrbaren Schadenspunkt pro Runde.</p>", "description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &bdquo;Gift trotzen&ldquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 1 nicht abwehrbaren Schadenspunkt pro Runde.</p>",
"experiencePoints": 10 "experiencePoints": 10
}, },
"effects": [], "effects": [],
@ -515,7 +515,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"data": { "data": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI+VE+Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -5 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>", "description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -5 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 50 "experiencePoints": 50
}, },
"effects": [], "effects": [],
@ -642,7 +642,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"data": { "data": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI+VE+Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -3 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>", "description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -3 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 30 "experiencePoints": 30
}, },
"effects": [], "effects": [],
@ -693,7 +693,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/dive-attack.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/dive-attack.png",
"data": { "data": {
"description": "<p>Wird fliegend mindestens eine Distanz in H&ouml;he von Laufen x 2 &ldquo;rennend&rdquo; geflogen, kann in der Runde noch ein Angriff mit Schlagen + K&Ouml;R erfolgen, w&auml;hrend der Bewegung, also nicht nur davor oder danach.</p>", "description": "<p>Wird fliegend mindestens eine Distanz in H&ouml;he von Laufen x 2 &bdquo;rennend&ldquo; geflogen, kann in der Runde noch ein Angriff mit Schlagen + K&Ouml;R erfolgen, w&auml;hrend der Bewegung, also nicht nur davor oder danach.</p>",
"experiencePoints": 10 "experiencePoints": 10
}, },
"effects": [], "effects": [],
@ -727,7 +727,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png",
"data": { "data": {
"description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &ldquo;Gift trotzen&rdquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 4 nicht abwehrbaren Schadenspunkt pro Runde.</p>", "description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &bdquo;Gift trotzen&ldquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 4 nicht abwehrbaren Schadenspunkt pro Runde.</p>",
"experiencePoints": 40 "experiencePoints": 40
}, },
"effects": [], "effects": [],
@ -744,7 +744,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png",
"data": { "data": {
"description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &ldquo;Gift trotzen&rdquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 2 nicht abwehrbaren Schadenspunkt pro Runde.</p>", "description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &bdquo;Gift trotzen&ldquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 2 nicht abwehrbaren Schadenspunkt pro Runde.</p>",
"experiencePoints": 20 "experiencePoints": 20
}, },
"effects": [], "effects": [],
@ -863,7 +863,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png",
"data": { "data": {
"description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &ldquo;Gift trotzen&rdquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 5 nicht abwehrbaren Schadenspunkt pro Runde.</p>", "description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &bdquo;Gift trotzen&ldquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 5 nicht abwehrbaren Schadenspunkt pro Runde.</p>",
"experiencePoints": 50 "experiencePoints": 50
}, },
"effects": [], "effects": [],
@ -914,7 +914,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/swarm.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/swarm.png",
"data": { "data": {
"description": "<p>Gilt als einzelner Gegner. Der Schwarmwert (SCW) entspricht seiner aktuellen Mitgliederanzahl/10 (zu Beginn und max. 200 Mitglieder pro Schwarm = SCW 20). Pro 1 LK Schaden sterben 10 Mitglieder (= SCW -1). Schw&auml;rme k&ouml;nnen Mitglieder an benachbarte Felder abgeben und ihr eigenes sowie jedes angrenzende Feld gleichzeitig angreifen (mit jeweils vollen Schlagen-Wert).</p>\n<p><strong>Schlagen/Abwehr/LK entsprechen dem aktuellen SCW</strong></p>", "description": "<p>Gilt als einzelner Gegner. Der Schwarmwert (SCW) entspricht seiner aktuellen Mitgliederanzahl / 10 (zu Beginn und max. 200 Mitglieder pro Schwarm = SCW 20). Pro 1 LK Schaden sterben 10 Mitglieder (= SCW -1). Schw&auml;rme k&ouml;nnen Mitglieder an benachbarte Felder abgeben und ihr eigenes sowie jedes angrenzende Feld gleichzeitig angreifen (mit jeweils vollen Schlagen-Wert).</p>\n<p><strong>Schlagen/Abwehr/LK entsprechen dem aktuellen SCW</strong></p>",
"experiencePoints": 0 "experiencePoints": 0
}, },
"effects": [], "effects": [],
@ -931,7 +931,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/fear.png",
"data": { "data": {
"description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI+VE+Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -1 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>", "description": "<p>Kann einmal pro Kampf auf Sicht aktionsfrei Angst erzeugen. Wer GEI + VE + Stufe nicht schafft, ist eingesch&uuml;chert und erh&auml;lt bis zum Ende des Kampfes -1 auf alle Proben. Bei einem Patzer ergreift man die Flucht.</p>",
"experiencePoints": 10 "experiencePoints": 10
}, },
"effects": [], "effects": [],
@ -948,7 +948,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/breath-weapon.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/breath-weapon.png",
"data": { "data": {
"description": "<p>Nur alle W20 Runden einsetzbar. Erzeugt nicht abwehrbaren Schaden (Schie&szlig;en-Angriff) - nur f&uuml;r magische Abwehrboni wird gew&uuml;rfelt (PW: Bonush&ouml;he). GE x 5m langer Kegel (am Ende GE x 3m breit).</p>", "description": "<p>Nur alle W20 Runden einsetzbar. Erzeugt nicht abwehrbaren Schaden (Schie&szlig;en-Angriff) &ndash; nur f&uuml;r magische Abwehrboni wird gew&uuml;rfelt (PW: Bonush&ouml;he). GE x 5m langer Kegel (am Ende GE x 3m breit).</p>",
"experiencePoints": -1 "experiencePoints": -1
}, },
"effects": [], "effects": [],
@ -965,7 +965,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/flight.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/flight.png",
"data": { "data": {
"description": "<p>Kann, statt zu laufen, mit doppelten Laufen-Wert fliegen. Wird die Aktion &ldquo;Rennen&rdquo; im Flug ausgef&uuml;hrt, erh&ouml;ht sich die Geschwindigkeit somit auf Laufen x 4.</p>", "description": "<p>Kann, statt zu laufen, mit doppelten Laufen-Wert fliegen. Wird die Aktion &bdquo;Rennen&ldquo; im Flug ausgef&uuml;hrt, erh&ouml;ht sich die Geschwindigkeit somit auf Laufen x 4.</p>",
"experiencePoints": 15 "experiencePoints": 15
}, },
"effects": [], "effects": [],
@ -982,7 +982,7 @@
"type": "specialCreatureAbility", "type": "specialCreatureAbility",
"img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png", "img": "systems/ds4/assets/icons/official/special-creature-abilities/poison.png",
"data": { "data": {
"description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &ldquo;Gift trotzen&rdquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 3 nicht abwehrbaren Schadenspunkt pro Runde.</p>", "description": "<p>Wird Schaden verursacht, w&uuml;rfelt das Ziel eine &bdquo;Gift trotzen&ldquo;-Probe, ansonsten erh&auml;lt es W20 Kampfrunden lang 3 nicht abwehrbaren Schadenspunkt pro Runde.</p>",
"experiencePoints": 30 "experiencePoints": 30
}, },
"effects": [], "effects": [],

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,9 @@
/*
* SPDX-FileCopyrightText: 2021 Johannes Loher
*
* SPDX-License-Identifier: MIT
*/
.ds4-add-button {
padding: 0 calc(1em / 3);
}

View file

@ -11,6 +11,7 @@
@use "global/fonts"; @use "global/fonts";
// shared // shared
@use "components/shared/add_button";
@use "components/shared/control_button_group"; @use "components/shared/control_button_group";
@use "components/shared/editor"; @use "components/shared/editor";
@use "components/shared/embedded_document_list"; @use "components/shared/embedded_document_list";

View file

@ -11,7 +11,7 @@ SPDX-License-Identifier: MIT
!-- @param title: The title to use for the link element (will be localized) !-- @param title: The title to use for the link element (will be localized)
!-- @param type: An optional property to use as data-type attribute !-- @param type: An optional property to use as data-type attribute
}} }}
<div> <div class="ds4-add-button">
<a class="control-{{documentType}}" title="{{localize title}}" data-action="create" {{#if type}}data-type="{{type}}" <a class="control-{{documentType}}" title="{{localize title}}" data-action="create" {{#if type}}data-type="{{type}}"
{{/if}}> {{/if}}>
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>

View file

@ -5,7 +5,7 @@
import promises from "node:fs/promises"; import promises from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import { distDirectory, sourceDirectory } from "./const.js"; import { distDirectory } from "./const.js";
import { convertPackFileToJSONFile } from "./json-pack-tools.js"; import { convertPackFileToJSONFile } from "./json-pack-tools.js";
const packsDistDirectory = path.join(distDirectory, "packs"); const packsDistDirectory = path.join(distDirectory, "packs");

View file

@ -40,11 +40,12 @@ function cleanPackEntry(entry, cleanSourceId = true) {
} }
/** /**
* Converts a JSON string containing an array to a Pack (NeDB) string. * Converts JSON content containing an array to a Pack (NeDB) string.
* @param {string} jsonString The input JSON string * @param {string | ArrayBuffer} contents The input JSON content
* @returns {string} The resulting Pack string * @returns {Promise<string>} The resulting Pack string
*/ */
export function convertJSONToPack(jsonString) { export async function convertJSONToPack(contents) {
const jsonString = contents.toString();
return ( return (
JSON.parse(jsonString) JSON.parse(jsonString)
.map((entry) => cleanPackEntry(entry)) .map((entry) => cleanPackEntry(entry))