From 6f41b9d5bee39e8a519a8e3e840ca79898b59a35 Mon Sep 17 00:00:00 2001 From: Eric Woodward Date: Tue, 15 Oct 2024 16:37:26 -0400 Subject: [PATCH] Library updates --- app.js | 122 +-- bin/www | 10 +- lib/cards.json | 256 ++--- package-lock.json | 1637 ++++++++++++++++++++++++++++++++ package.json | 20 +- public/styles/styles.css | 56 +- routes/index.js | 104 +- routes/search.js | 261 ++--- views/all.ejs | 10 +- views/error.ejs | 2 +- views/index.ejs | 19 +- views/partials/cards.ejs | 2 +- views/partials/footer.ejs | 6 +- views/partials/search_form.ejs | 31 +- views/search.ejs | 12 +- views/single.ejs | 10 +- 16 files changed, 2100 insertions(+), 458 deletions(-) create mode 100644 package-lock.json diff --git a/app.js b/app.js index c17e07d..c4772ee 100644 --- a/app.js +++ b/app.js @@ -1,83 +1,91 @@ -var - express = require('express'), - path = require('path'), - logger = require('morgan'), - cookieParser = require('cookie-parser'), - bodyParser = require('body-parser'), - compression = require('compression'), +var express = require("express"), + path = require("path"), + logger = require("morgan"), + cookieParser = require("cookie-parser"), + compression = require("compression"), + routes = require("./routes/index"), + search = require("./routes/search"), + pkg = require("./package"), + app = express(); - routes = require('./routes/index'), - search = require('./routes/search'), - - pkg = require('./package'), - app = express(); - -Object.assign( - app.locals, { - mw_site_uri: 'https://mythicwarsgame.com', - site: { - title: 'The Codex Mythica', - description: "The Codex Mythica is a database of all of the cards released for the Mythic Wars card game. Browse through all of the cards in the game, or search to find the card(s) you're looking for.", - keywords: 'codex, card game, mythic cards, mythic wars cards, mythic wars, clash of the gods, cthulhu rises, nemesis, excalibre, collectible card game, ccg, mythic sets, game, multiplayer, hobby, zeus, thor', - base_uri: (process.env.NODE_ENV || '').toLowerCase().indexOf('dev') > -1 ? 'http://localhost:8320' : 'https://codex.mythicwarsgame.com' - }, - author: { - name: pkg.author.name, - contact: pkg.author.email - } - }); +Object.assign(app.locals, { + mw_site_uri: "https://mythicwarsgame.com", + site: { + title: "The Codex Mythica", + description: + "The Codex Mythica is a database of all of the cards released for the Mythic Wars card game. Browse through all of the cards in the game, or search to find the card(s) you're looking for.", + keywords: + "codex, card game, mythic cards, mythic wars cards, mythic wars, clash of the gods, cthulhu rises, nemesis, excalibre, collectible card game, ccg, mythic sets, game, multiplayer, hobby, zeus, thor", + base_uri: + (process.env.NODE_ENV || "").toLowerCase().indexOf("dev") > -1 + ? "http://localhost:8320" + : "https://codex.mythicwarsgame.com", + }, + author: { + name: pkg.author.name, + contact: pkg.author.email, + }, +}); // view engine setup -app.set('views', path.join(__dirname, 'views')); +app.set("views", path.join(__dirname, "views")); // app.set('view engine', 'jade'); -app.set('view engine', 'ejs'); +app.set("view engine", "ejs"); -app.use(logger(':req[x-forwarded-for] - [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]')); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded()); +app.use( + logger( + ':req[x-forwarded-for] - [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]' + ) +); +app.use(express.json()); +app.use( + express.urlencoded({ + extended: true, + }) +); app.use(cookieParser()); app.use((req, res, next) => { - if (req && req.originalUrl && res) { - res.locals.originalUrl = req.originalUrl; - } - next(); + if (req && req.originalUrl && res) { + res.locals.originalUrl = req.originalUrl; + } + next(); }); app.use(compression()); -app.use('/', routes); -app.use('/search/', search); +app.use("/", routes); +app.use("/search/", search); -app.use(express.static(path.join(__dirname, 'public'))); +app.use(express.static(path.join(__dirname, "public"))); /// catch 404 and forwarding to error handler -app.use(function(req, res, next) { - res.status(404).sendFile(path.join(__dirname + '/public/errors', '404.html')); +app.use(function (req, res, next) { + res.status(404).sendFile( + path.join(__dirname + "/public/errors", "404.html") + ); }); /// error handlers // development error handler // will print stacktrace -if ((process.env.NODE_ENV || '').toLowerCase().indexOf('dev') > -1 ) { - app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: err - }); - }); +if ((process.env.NODE_ENV || "").toLowerCase().indexOf("dev") > -1) { + app.use(function (err, req, res, next) { + res.status(err.status || 500); + res.render("error", { + message: err.message, + error: err, + }); + }); } // production error handler // no stacktraces leaked to user -app.use(function(err, req, res, next) { - res.status(err.status || 500); - res.render('error', { - message: err.message, - error: {} - }); +app.use(function (err, req, res, next) { + res.status(err.status || 500); + res.render("error", { + message: err.message, + error: {}, + }); }); - - module.exports = app; diff --git a/bin/www b/bin/www index e5f12f4..f20f405 100755 --- a/bin/www +++ b/bin/www @@ -1,9 +1,9 @@ #!/usr/bin/node -var debug = require('debug')('my-application'); -var app = require('../app'); +var debug = require("debug")("my-application"); +var app = require("../app"); -app.set('port', process.env.PORT || 8320); +app.set("port", process.env.PORT || 8320); -var server = app.listen(app.get('port'), function() { - console.log('Express server listening on port ' + server.address().port); +const server = app.listen(app.get("port"), () => { + console.log("Express server listening on port " + server.address().port); }); diff --git a/lib/cards.json b/lib/cards.json index 2b399ae..7e225da 100755 --- a/lib/cards.json +++ b/lib/cards.json @@ -23,7 +23,7 @@ "tags": "demo", "ability_name": "Purifying Flood", "ability_text": "When this goddess is invoked, she may choose an opposing entity to make a defense roll. If that roll is less than 11, that entity is defeated.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -52,7 +52,7 @@ "tags": "", "ability_name": "Goddess of Nourishment", "ability_text": "When this goddess is invoked, she may give any or all of her energy points to her supporting entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -81,7 +81,7 @@ "tags": "", "ability_name": "Cihuātēotl", "ability_text": "When this goddess is invoked, she may summon a Cihuātēotl creature. This goddess cannot be attacked while she is supported by a Cihuacoatl.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -110,7 +110,7 @@ "tags": "", "ability_name": "Skirt of Serpents", "ability_text": "When this goddess is invoked, and before the start of each round, she may roll 1 die. If the roll is even, she may choose an opposing faction, and give -1 Power to all of the entities in that faction until the end of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -139,7 +139,7 @@ "tags": "", "ability_name": "Toxiuhmolpilia", "ability_text": "When this god is invoked, and at the start of each round, this god may clash with an opposing entity. When this god wins a clash, he may give -1 Attack to the losing entity until the end of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -168,7 +168,7 @@ "tags": "", "ability_name": "Divine Hurler", "ability_text": "Once per round when a supporting entity makes an attack, this god may make an attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -197,7 +197,7 @@ "tags": "demo", "ability_name": "Lady of the Dead", "ability_text": "Empower: This goddess may choose an opposing entity, and force that entity to make a defense roll. If that roll is less than 11, this goddess may remove up to 2 energy points from that entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -226,7 +226,7 @@ "tags": "demo", "ability_name": "Lord of Mictlan", "ability_text": "When this god is invoked, and at the start of each round, he may clash with an opposing entity. When this god wins a clash, he may remove an energy point from the losing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -255,7 +255,7 @@ "tags": "", "ability_name": "Ehecaicozcatl", "ability_text": "Once per round after a supporting entity makes an attack and hits, if the attack roll was even, that entity may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -284,7 +284,7 @@ "tags": "", "ability_name": "Ilhuicahua Tlalticpaque", "ability_text": "When this god is invoked, he may replace this ability with any supporting entity's ability.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -313,7 +313,7 @@ "tags": "", "ability_name": "Tlamacazqui", "ability_text": "This god gets +1 Defense for each supporting entity with {WATER}.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -342,7 +342,7 @@ "tags": "", "ability_name": "Xiuhuitzolli", "ability_text": "When this god makes an attack, the attack roll gets +1 for each counter on the defending entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -371,7 +371,7 @@ "tags": "", "ability_name": "The Hidden One", "ability_text": "When this god is invoked, he may choose an opposing faction. When he does, one of the entities in the chosen faction must make a defense roll. If that roll is less than 11, this god may remove up to 2 energy points from each entity within that faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -400,7 +400,7 @@ "tags": "", "ability_name": "Protector of the Dead", "ability_text": "Whenever a supporting entity is removed from the battle, this god may clash with the removing entity. If this god wins that clash, he may remove up to 2 energy points from the removing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -429,7 +429,7 @@ "tags": "", "ability_name": "Mehturt", "ability_text": "This god may give +1 Defense to all supporting entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -458,7 +458,7 @@ "tags": "demo", "ability_name": "Har-Wer", "ability_text": "After this god makes an attack and hits, he may clash with an opposing entity. Once per round when this god wins a clash, he may immediately make an attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -487,7 +487,7 @@ "tags": "", "ability_name": "Weret-Hekau", "ability_text": "When this goddess is invoked, and at the start of each round, this goddess may choose an opposing entity and clash with it. When this goddess wins a clash, she may give an energy point to any supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -516,7 +516,7 @@ "tags": "", "ability_name": "The Mummified God", "ability_text": "This god cannot lose energy points or be removed from the battle without making a defense roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -545,7 +545,7 @@ "tags": "", "ability_name": "Sphinx", "ability_text": "When this god is invoked, he may summon a Sphinx creature. This god cannot be attacked while he is supported by a Sphinx.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -574,7 +574,7 @@ "tags": "", "ability_name": "Lord of the Hallowed Land", "ability_text": "When this god is invoked, he may return any defeated entity to the battle, and then this god is automatically defeated. When an entity is returned this way, that entity becomes part of this god's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -603,7 +603,7 @@ "tags": "demo", "ability_name": "Lady of Slaughter", "ability_text": "Each round, this goddess may give +2 to the first attack roll made by a supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -632,7 +632,7 @@ "tags": "", "ability_name": "Lord of the Desert", "ability_text": "Empower: This god may clash with an opposing entity. If this god wins that clash, roll a die, and remove that many energy points from the losing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -661,7 +661,7 @@ "tags": "", "ability_name": "Mistress of Pure Water", "ability_text": "When this goddess is invoked, and before the start of each round, she may roll 1 die. If the roll is even, she may give +1 to the defense rolls made by all of the entities in her faction until the end of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -690,7 +690,7 @@ "tags": "", "ability_name": "Lady of Flame", "ability_text": "Whenever a supporting entity makes an attack, if the attacking entity shares an element with the defending entity, this goddess may give +2 to the attack roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -719,7 +719,7 @@ "tags": "", "ability_name": "Aphrodite Apaturus", "ability_text": "Empower: This goddess may force any entity to attack any other entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -748,7 +748,7 @@ "tags": "demo", "ability_name": "Apollo Argyrotoxus", "ability_text": "When a supporting entity makes an attack roll, that entity may roll an additional die and take the highest number among dice rolled.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -777,7 +777,7 @@ "tags": "", "ability_name": "Ares Enualios", "ability_text": "When this god makes an attack and hits, he removes an energy point from a supporting entity, if possible.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -806,7 +806,7 @@ "tags": "", "ability_name": "Artemis Agrotera", "ability_text": "Whenever an opposing entity clashes with a supporting entity, this goddess may give -1 to the opposing entity's clash roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -835,7 +835,7 @@ "tags": "", "ability_name": "Athena Promachos", "ability_text": "When this goddess is invoked or returns to the battle, she may choose an element. She gives +1 Attack and -1 Defense to all of the entities in the battle that have the chosen element.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -864,7 +864,7 @@ "tags": "", "ability_name": "Demeter Carpophorus", "ability_text": "At the end of each round, this goddess may clash with an opposing entity. When this goddess wins a clash, she may give a Feast counter to a supporting entity. At the start of each round, this goddess may give one energy point to each supporting entity for each feast counter it has.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -893,7 +893,7 @@ "tags": "demo", "ability_name": "Hephaestus Clytotechnes", "ability_text": "When either this god or a supporting entity is attacked, this god may give -1 to the attack roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -922,7 +922,7 @@ "tags": "", "ability_name": "Hydra Lernaia", "ability_text": "When this goddess is invoked, she may summon a Hydra creature. This goddess cannot be attacked while she is supported by a Hydra.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -951,7 +951,7 @@ "tags": "demo", "ability_name": "Hermes Promachus", "ability_text": "Once per round when this god makes an attack, he may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -980,7 +980,7 @@ "tags": "", "ability_name": "Hestia Boulaia", "ability_text": "When this goddess is invoked, and at the start of each round, this goddess may clash with an opposing entity. When this goddess wins a clash, all supporting entities get +1 Attack for the rest of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1009,7 +1009,7 @@ "tags": "", "ability_name": "Poseidon Taureos", "ability_text": "When a supporting entity makes an attack, the defending entity gets -1 Defense until the end of the round, to a maximum of -2.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1038,7 +1038,7 @@ "tags": "", "ability_name": "Zeus Brontios", "ability_text": "When this god is invoked, he may choose an opposing faction. When he does, one of the entities in the chosen faction must clash with this god. If this god wins that clash, he may remove up to 2 energy points from each entity within that faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1067,7 +1067,7 @@ "tags": "", "ability_name": "Yasakani no Magatama", "ability_text": "When either this goddess or a supporting entity makes an attack, this goddess may give +1 to the attack roll for each counter on the defending entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1096,7 +1096,7 @@ "tags": "", "ability_name": "Nyoi Hōju", "ability_text": "Once per round when a supporting entity makes a die roll, this goddess may roll a die. When she does, this goddess may then replace the entity's die roll with that roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1125,7 +1125,7 @@ "tags": "demo", "ability_name": "Tamonten", "ability_text": "When this god is attacked and the attack hits, the attacking entity removes 1 less energy point from him, to a minimum of 1.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1154,7 +1154,7 @@ "tags": "", "ability_name": "Bag of Winds", "ability_text": "When this god makes an attack or defense roll, he may roll an additional die and take the highest number among dice rolled.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1183,7 +1183,7 @@ "tags": "", "ability_name": "Amenonuhoko", "ability_text": "When this god attacks an entity with {LAW} or {CHAOS}, his attack roll gets +2. When this god is attacked by an entity with {LAW} or {CHAOS}, his defense roll gets +1.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1212,7 +1212,7 @@ "tags": "demo", "ability_name": "Yomotsu ōkami", "ability_text": "When this goddess is invoked, she may clash with an opposing entity. If this goddess wins that clash, the opposing entity is defeated.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1241,7 +1241,7 @@ "tags": "", "ability_name": "Scroll of Life", "ability_text": "This god may give +1 Power to all supporting entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1270,7 +1270,7 @@ "tags": "", "ability_name": "Goukaku", "ability_text": "Once per round after a supporting entity makes an attack and hits, this god may clash with an opposing entity. If this god wins that clash, the supporting entity may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1299,7 +1299,7 @@ "tags": "", "ability_name": "Raiju", "ability_text": "When this god is invoked, he may summon a Raiju creature. This god cannot be attacked while he is supported by a Raiju.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1328,7 +1328,7 @@ "tags": "", "ability_name": "Ryūgū-jō", "ability_text": "When this god is invoked, and at the start of each round, he may clash with an opposing entity. When this god wins a clash, the losing entity gets -1 Defense for the rest of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1357,7 +1357,7 @@ "tags": "", "ability_name": "Demon Queller", "ability_text": "While there is an opposing creature in play, this god may give +1 Attack to all supporting entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1386,7 +1386,7 @@ "tags": "demo", "ability_name": "Amenohabakiri", "ability_text": "Each round, this god may give +2 to the first defense roll made by a supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1415,7 +1415,7 @@ "tags": "", "ability_name": "Vitrastr Àsa", "ability_text": "Whenever either this god or a supporting entity is attacked, if the attacking entity shares an element with the defending entity, this god may give the defense roll a +2.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1444,7 +1444,7 @@ "tags": "", "ability_name": "Brisingamen", "ability_text": "When this goddess is attacked and the attack misses, she may give an energy point to any supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1473,7 +1473,7 @@ "tags": "", "ability_name": "Friggerock", "ability_text": "Once per round when an opposing entity makes a die roll, this goddess may force that entity to replace that die roll with another.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1502,7 +1502,7 @@ "tags": "", "ability_name": "Skíðblaðnir", "ability_text": "Once per round before a supporting entity would be attacked, this god may change the target of that attack to be another supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1531,7 +1531,7 @@ "tags": "", "ability_name": "Himinbjörg", "ability_text": "When this god is invoked, and at the start of each round, this god may choose a supporting entity. The first time that the chosen entity makes an attack during that round, that entity may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1560,7 +1560,7 @@ "tags": "", "ability_name": "Sultr", "ability_text": "Empower: This goddess may give a Famine counter to an opposing entity, and roll one die. If the roll is even, she may give an additional famine counter to a different opposing entity. At the start of each round, this goddess may remove one energy point from each opposing entity for each famine counter it has.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1589,7 +1589,7 @@ "tags": "", "ability_name": "Iðunnar Epla", "ability_text": "This goddess may give +1 Power to all supporting entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1618,7 +1618,7 @@ "tags": "", "ability_name": "Bölvasmiðr", "ability_text": "When this god is invoked, and before the start of each round, he may roll one die. If the die roll is even, all opposing entities get -1 Defense until the end of the round. If the roll is odd, all supporting entities get +1 Attack until the end of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1647,7 +1647,7 @@ "tags": "", "ability_name": "Óðins Meyjar", "ability_text": "When this god is invoked, he may summon a Valkyrie creature. This god cannot be attacked while he is supported by a Valkyrie.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1676,7 +1676,7 @@ "tags": "demo", "ability_name": "Öndurdís", "ability_text": "Once per round when an entity makes a roll, this goddess may give -1 to that roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1705,7 +1705,7 @@ "tags": "demo", "ability_name": "Álfröðull", "ability_text": "When this goddess makes an attack roll, she may use her current energy point total as her Attack score. This goddess may never have more than 9 energy points.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1734,7 +1734,7 @@ "tags": "demo", "ability_name": "Mjölnir", "ability_text": "Once per round after this god makes an attack, if the attack roll was even, he may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1763,7 +1763,7 @@ "tags": "demo", "ability_name": "The Beautiful Woman", "ability_text": "When this goddess makes an attack and the attack hits, she may give an energy point to any supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1792,7 +1792,7 @@ "tags": "demo", "ability_name": "Lord of the Abzu", "ability_text": "When this god makes a defense roll, he may use his current energy point total as his Defense score. This god may never have more than 9 energy points.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1821,7 +1821,7 @@ "tags": "", "ability_name": "Anzû", "ability_text": "When this god is invoked, he may summon an Anzû creature. This god cannot be attacked while he is supported by Anzû.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1850,7 +1850,7 @@ "tags": "", "ability_name": "Lady of the Great Place", "ability_text": "When this goddess is attacked and the attack misses, she may remove a number of energy points from the attacking entity equal to the difference between the defense and attack rolls.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1879,7 +1879,7 @@ "tags": "", "ability_name": "Lady of Heaven", "ability_text": "When either this goddess or a supporting entity makes an attack and the defending entity has at least one counter on it, this goddess may give +1 to the attack roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1908,7 +1908,7 @@ "tags": "", "ability_name": "Destroy the Rebellious Land", "ability_text": "When this god is invoked or returns to the battle, he may choose an element. Once per round when a supporting entity with chosen element makes an attack, that entity may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1937,7 +1937,7 @@ "tags": "", "ability_name": "As Bright As the Stars", "ability_text": "Empower: This goddess may choose an opposing entity, and force that entity to make a defense roll. If that roll is less than 11, this goddess may roll a die and remove up to that many energy points from the chosen entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1966,7 +1966,7 @@ "tags": "", "ability_name": "Victorious", "ability_text": "When an opposing entity is defeated, this goddess gets +1 Attack for the rest of the battle.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -1995,7 +1995,7 @@ "tags": "", "ability_name": "Great Queen", "ability_text": "When this goddess is invoked, she may give up to 4 total energy points to her supporting entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2024,7 +2024,7 @@ "tags": "", "ability_name": "Wild Cow of the Enclosure", "ability_text": "When an opposing entity's ability would modify a supporting entity's Defense score, this goddess may prevent that ability from modifying that score.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2053,7 +2053,7 @@ "tags": "", "ability_name": "Sharur", "ability_text": "When this god makes an attack and hits, he may give -1 Defense to the defending entity for the rest of the round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2082,7 +2082,7 @@ "tags": "", "ability_name": "Lord of Truth", "ability_text": "When this god attacks an entity with {CHAOS}, the attack roll gets +2. When this god is attacked by an entity with {CHAOS}, the defense roll gets +1.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2111,7 +2111,7 @@ "tags": "", "ability_name": "Celestial Princess", "ability_text": "Once per round, when this creature removes at least one energy point from an opposing entity, she may give an energy point to a supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2140,7 +2140,7 @@ "tags": "", "ability_name": "Divine Guardian", "ability_text": "When an opposing entity's ability would modify the defense roll of an entity in this faction, this creature may prevent that modification from occurring.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2169,7 +2169,7 @@ "tags": "", "ability_name": "Sprouting Heads", "ability_text": "When this entity makes an attack, the defending entity's defense roll gets -1 for each energy point this creature has lost, to a maximum of -4.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2198,7 +2198,7 @@ "tags": "", "ability_name": "Thunder Beast", "ability_text": "Empower: This creature may choose up to 2 opposing entities, and force them to each make a defense roll. If either entity's roll is less than 11, this creature may remove 1 energy point from each one.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2227,7 +2227,7 @@ "tags": "", "ability_name": "Gunnr", "ability_text": "This creature gets +1 Attack for each supporting entity with {FIRE}.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2256,7 +2256,7 @@ "tags": "", "ability_name": "Guard of Enlil", "ability_text": "Once per round when this creature makes an attack, if there is at least one other entity with {AIR} in the battle, this creature may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2285,7 +2285,7 @@ "tags": "demo", "ability_name": "Purifying Flood", "ability_text": "When this goddess is invoked, she may choose an opposing entity to make a defense roll. If that roll is less than 11, that entity is defeated.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2314,7 +2314,7 @@ "tags": "demo", "ability_name": "Lady of the Dead", "ability_text": "Empower: This goddess may choose an opposing entity, and force that entity to make a defense roll. If that roll is less than 11, this goddess may remove up to 2 energy points from that entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2343,7 +2343,7 @@ "tags": "demo", "ability_name": "Lord of Mictlan", "ability_text": "When this god is invoked, and at the start of each round, he may clash with an opposing entity. When this god wins a clash, he may remove an energy point from the losing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2372,7 +2372,7 @@ "tags": "demo", "ability_name": "Har-Wer", "ability_text": "After this god makes an attack and hits, he may clash with an opposing entity. Once per round when this god wins a clash, he may immediately make an attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2401,7 +2401,7 @@ "tags": "demo", "ability_name": "Lady of Slaughter", "ability_text": "Each round, this goddess may give +2 to the first attack roll made by a supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2430,7 +2430,7 @@ "tags": "demo", "ability_name": "Apollo Argyrotoxus", "ability_text": "When a supporting entity makes an attack roll, that entity may roll an additional die and take the highest number among dice rolled.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2459,7 +2459,7 @@ "tags": "demo", "ability_name": "Hephaestus Clytotechnes", "ability_text": "When either this god or a supporting entity is attacked, this god may give -1 to the attack roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2488,7 +2488,7 @@ "tags": "demo", "ability_name": "Hermes Promachus", "ability_text": "Once per round when this god makes an attack, he may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2517,7 +2517,7 @@ "tags": "demo", "ability_name": "Tamonten", "ability_text": "When this god is attacked and the attack hits, the attacking entity removes 1 less energy point from him, to a minimum of 1.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2546,7 +2546,7 @@ "tags": "demo", "ability_name": "Yomotsu ōkami", "ability_text": "When this goddess is invoked, she may clash with an opposing entity. If this goddess wins that clash, the opposing entity is defeated.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2575,7 +2575,7 @@ "tags": "demo", "ability_name": "Amenohabakiri", "ability_text": "Each round, this god may give +2 to the first defense roll made by a supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2604,7 +2604,7 @@ "tags": "demo", "ability_name": "Öndurdís", "ability_text": "Once per round when an entity makes a roll, this goddess may give -1 to that roll.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2633,7 +2633,7 @@ "tags": "demo", "ability_name": "Álfröðull", "ability_text": "When this goddess makes an attack roll, she may use her current energy point total as her Attack score. This goddess may never have more than 9 energy points.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2662,7 +2662,7 @@ "tags": "demo", "ability_name": "Mjölnir", "ability_text": "Once per round after this god makes an attack, if the attack roll was even, he may make an additional attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2691,7 +2691,7 @@ "tags": "demo", "ability_name": "The Beautiful Woman", "ability_text": "When this goddess makes an attack and the attack hits, she may give an energy point to any supporting entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2720,7 +2720,7 @@ "tags": "demo", "ability_name": "Lord of the Abzu", "ability_text": "When this god makes a defense roll, he may use his current energy point total as his Defense score. This god may never have more than 9 energy points.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2749,7 +2749,7 @@ "tags": "", "ability_name": "The Daemon Sultan", "ability_text": "When this god removes one or more energy points from an entity in a coalition faction, he may remove an energy point from all other entities in all coalition factions. This god may only battle when Cthulhu Rises.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2778,7 +2778,7 @@ "tags": "", "ability_name": "High Priest of the Outer Gods", "ability_text": "When a deity in the outer faction is hit by an attack from an opposing entity, this god clashes with that entity. If this god wins that clash, he removes up to 2 energy points from that entity. This god may only battle when Cthulhu Rises.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2807,7 +2807,7 @@ "tags": "", "ability_name": "Deep One", "ability_text": "When this god first enters the battle, he may summon a Deep One creature. This god cannot be attacked while he is supported by a Deep One. When this god makes an attack, if all of the entities in this god's faction have {OLD_ONES}, the defending entity gets -1 Defense for each Deep One in this god's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2836,7 +2836,7 @@ "tags": "", "ability_name": "The Unspeakable", "ability_text": "While all of the entities in this god's faction have {OLD_ONES}, this god may give them +1 Attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2865,7 +2865,7 @@ "tags": "", "ability_name": "Lord of Sleep", "ability_text": "While all of the entities in this god's faction have {OLD_ONES}, their Defense scores cannot be modified by the abilities of opposing entities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2894,7 +2894,7 @@ "tags": "", "ability_name": "Tentacled Fury", "ability_text": "When an opposing entity attacks a supporting creature and that attack hits, this goddess may immediately attack that opposing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2923,7 +2923,7 @@ "tags": "", "ability_name": "Crawling Chaos", "ability_text": "When a supporting entity in the outer faction removes one or more energy points from an opposing entity, this god may remove an energy point from that opposing entity. This god may only battle when Cthulhu Rises.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2952,7 +2952,7 @@ "tags": "", "ability_name": "The Gate", "ability_text": "This god may give +2 to all rolls made by the entities in this god's faction. This god may only battle when Cthulhu Rises.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -2981,7 +2981,7 @@ "tags": "", "ability_name": "Esoteric Order of Dagon", "ability_text": "When this creature makes an attack, if all of the entities in this creature's faction have {OLD_ONES}, the defending entity gets -1 Defense for each Deep One in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3010,7 +3010,7 @@ "tags": "", "ability_name": "Esoteric Order of Dagon", "ability_text": "When this creature makes an attack, if all of the entities in this creature's faction have {OLD_ONES}, the defending entity gets -1 Defense for each Deep One in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3039,7 +3039,7 @@ "tags": "", "ability_name": "Esoteric Order of Dagon", "ability_text": "When this creature makes an attack, if all of the entities in this creature's faction have {OLD_ONES}, the defending entity gets -1 Defense for each Deep One in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3068,7 +3068,7 @@ "tags": "", "ability_name": "Esoteric Order of Dagon", "ability_text": "When this creature makes an attack, if all of the entities in this creature's faction have {OLD_ONES}, the defending entity gets -1 Defense for each Deep One in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3097,7 +3097,7 @@ "tags": "", "ability_name": "Tekeli-li", "ability_text": "When this creature removes one or more energy points from an opposing entity, if all of the entities in this creature's faction have {OLD_ONES}, it may remove an additional energy point for each Shoggoth in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3126,7 +3126,7 @@ "tags": "", "ability_name": "Tekeli-li", "ability_text": "When this creature removes one or more energy points from an opposing entity, if all of the entities in this creature's faction have {OLD_ONES}, it may remove an additional energy point for each Shoggoth in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3155,7 +3155,7 @@ "tags": "", "ability_name": "Tekeli-li", "ability_text": "When this creature removes one or more energy points from an opposing entity, if all of the entities in this creature's faction have {OLD_ONES}, it may remove an additional energy point for each Shoggoth in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3184,7 +3184,7 @@ "tags": "", "ability_name": "Tekeli-li", "ability_text": "When this creature removes one or more energy points from an opposing entity, if all of the entities in this creature's faction have {OLD_ONES}, it may remove an additional energy point for each Shoggoth in this creature's faction.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3213,7 +3213,7 @@ "tags": "landscape", "ability_name": "", "ability_text": "", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3242,7 +3242,7 @@ "tags": "landscape", "ability_name": "", "ability_text": "Deities get Attack +2 and have \"EMPOWER: Destroy Bifröst and remove 2 energy points from each entity in the battle.\"", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3271,7 +3271,7 @@ "tags": "landscape", "ability_name": "", "ability_text": "When an entity would be defeated, that entity may make a die roll. If that roll is even, that entity remains in the battle with 1 energy point. Each entity may only use this ability once per round.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3300,7 +3300,7 @@ "tags": "landscape", "ability_name": "", "ability_text": "When an entity loses a clash, remove two energy points from that entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3329,7 +3329,7 @@ "tags": "landscape", "ability_name": "", "ability_text": "Entities with {CHAOS} or {OLD_ONES} cannot be defeated by any entity's ability.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3358,7 +3358,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an attack hits. Remove up to 2 energy points from an opposing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3387,7 +3387,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an opposing entity makes a defense or clash roll. That roll gets -2.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3416,7 +3416,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an opposing faction uses an intervention. That intervention is discarded, and its effects are nullified.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3445,7 +3445,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an entity in this faction is attacked and the attack hits. No energy may be removed as a result of that attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3474,7 +3474,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an attack hits. An entity in this faction may immediately make an attack.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3503,7 +3503,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after a defense roll is made. That roll gets either +2 or -2.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3532,7 +3532,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an entity in this faction makes an attack and the attack misses. Remove up to 2 energy points from an opposing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3561,7 +3561,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an attack roll is made. That roll gets either +2 or -2.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3590,7 +3590,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an entity in this faction makes an attack or clash roll. That roll gets +2.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3619,7 +3619,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an entity in this faction is defeated. Remove up to 3 energy points from an opposing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3648,7 +3648,7 @@ "tags": "", "ability_name": "", "ability_text": "This intervention may only be used immediately after an entity in this faction is attacked and the attack hits. Remove up to 2 energy points from the attacking entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3677,7 +3677,7 @@ "tags": "", "ability_name": "Stealer of Fire", "ability_text": "Deities with {FIRE} have no abilities.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" @@ -3706,7 +3706,7 @@ "tags": "", "ability_name": "The Sleeper of R'lyeh", "ability_text": "When this god is invoked, and at the start of each round, this god may clash with an opposing entity. When this god wins a clash, he may remove an energy point from an opposing entity.", - "copyright_year": "2016-2017", + "copyright_year": "2016-2024", "copyright_owner": "Eric Woodward", "copyright_license": "All Rights Reserved", "copyright_licensee": "Excalibre Games" diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..05e5c35 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1637 @@ +{ + "name": "@itsericwoodward/codex-mythica", + "version": "0.5.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@itsericwoodward/codex-mythica", + "version": "0.5.0", + "dependencies": { + "body-parser": "~1.20.3", + "compression": "^1.7.4", + "cookie-parser": "~1.4.7", + "debug": "~4.3.7", + "ejs": "^3.1.10", + "express": "~4.21.1", + "morgan": "~1.10.0" + }, + "devDependencies": { + "ejs-lint": "^2.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ejs-include-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ejs-include-regex/-/ejs-include-regex-1.0.0.tgz", + "integrity": "sha512-OTkvS8Dm8XhaE/+EKIjYjInRkNahQwkUUacAZXvA8Gqr5KEZrOsgFk8AkKYSnoTcdvKV0wnoG7YHWb4gkZFu8Q==", + "dev": true + }, + "node_modules/ejs-lint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ejs-lint/-/ejs-lint-2.0.0.tgz", + "integrity": "sha512-zt3E6MWLBYpWuUEOFRRqzB74gxCOZJAzoKmJR810U2mIrLnP1v6Xyk8tc6tl4pbT63cFoEqELPx9K8URjmpyZg==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "ejs": "3.1.8", + "ejs-include-regex": "^1.0.0", + "globby": "^13.0.0", + "read-input": "^0.3.1", + "slash": "^5.0.0", + "syntax-error": "^1.1.6", + "yargs": "^17.0.0" + }, + "bin": { + "ejslint": "cli.js" + } + }, + "node_modules/ejs-lint/node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-input": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/read-input/-/read-input-0.3.1.tgz", + "integrity": "sha512-J1ZkWCnB4altU7RTe+62PSfa21FrEtfKyO9fuqR3yP8kZku3nIwaw2Krj383JC7egAIl5Zyz2w+EOu9uXH5HZw==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json index 63a7f25..4af5ade 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,18 @@ { - "name": "@mysticbits/codex-mythica", - "version": "0.4.0", + "name": "@itsericwoodward/codex-mythica", + "version": "0.6.0", "private": true, "scripts": { "start": "nodejs ./bin/www" }, "dependencies": { - "body-parser": "~1.0.0", - "compression": "^1.7.1", - "cookie-parser": "~1.0.1", - "debug": "~0.7.4", - "ejs": "^2.5.7", - "express": "~4.16.0", - "morgan": "~1.0.0" + "body-parser": "~1.20.3", + "compression": "^1.7.4", + "cookie-parser": "~1.4.7", + "debug": "~4.3.7", + "ejs": "^3.1.10", + "express": "~4.21.1", + "morgan": "~1.10.0" }, "author": { "name": "Eric Woodward", @@ -20,6 +20,6 @@ "url": "https://itsericwoodward.com/" }, "devDependencies": { - "ejs-lint": "^0.3.0" + "ejs-lint": "^2.0.0" } } diff --git a/public/styles/styles.css b/public/styles/styles.css index a90d0ef..7e71ff2 100644 --- a/public/styles/styles.css +++ b/public/styles/styles.css @@ -101,7 +101,7 @@ body { background: url('/images/tile-bg.jpg'); color: #FFFDD7; font-family: 'liberation_serif', serif; - font-size: 12pt; + font-size: 14pt; line-height: 1.35em; } @@ -206,9 +206,6 @@ p { line-height: 1.35em; } -.card-info > img { -} - .card-pantheon { max-width: 1.1em; vertical-align: middle; @@ -346,10 +343,6 @@ p { border-radius: 0.6em; } -.navMenu { - -} - .navMenu ul { list-style-type: none; margin: 0; @@ -684,39 +677,15 @@ p { max-height: 10em; /* just in case */ } - .js.js-hasFontsLoaded body { - font-size: 14pt; + font-size: 16pt; } - -/* - * Didn't use this, saving it unless I decie to use it later. - -.js .js-ulToggle { - cursor: pointer; -} - -.js .js-ulToggle::after { - content: ' \25BC'; - font-size: .5em; - vertical-align: text-top; -} - -.js .js-ulToggle-hidden ul { - display: none; -} - -.js .js-ulToggle-hidden .js-ulToggle::after { - content: ' \25B2'; -} - -*/ - /**************************************************************************** * Responsive Media Queries ****************************************************************************/ -@media screen and (min-width: 30em) { + +@media screen and (min-width: 32em) { .dataBox { display: grid; @@ -738,15 +707,9 @@ p { } } -@media screen and (min-width: 33em) { - .dataBox { - grid-template-columns: repeat(auto-fill, minmax(6em, 1fr)) ; - } -} - @media screen and (min-width: 37em) { .dataBox { - grid-template-columns: repeat(auto-fill, minmax(7em, 1fr)) ; + grid-template-columns: repeat(auto-fill, minmax(6em, 1fr)) ; } } @@ -767,6 +730,12 @@ p { } } +@media screen and (min-width: 42em) { + .dataBox { + grid-template-columns: repeat(auto-fill, minmax(7em, 1fr)) ; + } +} + @media screen and (min-width: 58em) { .card-data { grid-column: auto / span 2; @@ -775,12 +744,11 @@ p { } .card-image { display: block; - width: auto; } .card-info { align-items: center; display: grid; - grid-template-columns: repeat(auto-fill, minmax(12em, 1fr)) ; + grid-template-columns: repeat(auto-fill, minmax(13em, 1fr)) ; } .dataBox { grid-template-columns: repeat(auto-fill, minmax(8em, 1fr)) ; diff --git a/routes/index.js b/routes/index.js index e8462a8..6c254e3 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,57 +1,71 @@ -'use strict'; +"use strict"; -const - express = require('express'), - sortByName = function(list) { - let - coll_opts = { - sensitivity: 'accent', - numeric: true, - caseFirst: "upper" - }, - field = 'name', - coll = new Intl.Collator({}, coll_opts); - list.sort((a,b) => { - if (a[field] && b[field]) { - return coll.compare(a[field], b[field]); - } - return 1; - }); - return list; - }; +const express = require("express"), + sortByName = function (list) { + let coll_opts = { + sensitivity: "accent", + numeric: true, + caseFirst: "upper", + }, + field = "name", + coll = new Intl.Collator({}, coll_opts); + list.sort((a, b) => { + if (a[field] && b[field]) { + return coll.compare(a[field], b[field]); + } + return 1; + }); + return list; + }; let router = express.Router(); /* GET home page. */ -router.get('/', function(req, res) { - let - cards = require('../lib/cards.json'), - rand_card_num = Math.floor(Math.random() * Math.floor(cards.length-1)); +router.get("/", function (req, res) { + let cards = require("../lib/cards.json"), + rand_card_num = Math.floor( + Math.random() * Math.floor(cards.length - 1) + ); - res.render('index', { title: 'Welcome', query: (req.query || {}), card: cards[rand_card_num], random_num: rand_card_num }); + res.render("index", { + title: "Welcome", + query: req.query || {}, + card: cards[rand_card_num], + random_num: rand_card_num, + }); }); -router.get('/cards/:card_num', (req, res) => { - req.params.card_num = (req.params.card_num || 'all'); - let - cards = require('../lib/cards.json'), - links = require('../lib/links.json'), - filtered = cards.filter(card => - card.num.toLowerCase().indexOf(req.params.card_num.toLowerCase()) > -1 || req.params.card_num.toLowerCase() === 'all' - ); - if (filtered.length === 1) { - let card = filtered[0]; - if (links && card.hasOwnProperty('name') && links.hasOwnProperty(card.name)) { - Object.assign(card, links[card.name]); - } - res.render('single', { title: card.name + ' (' + card.num + ')', card: card }); - } else { - filtered = sortByName(filtered); - res.render('all', { title: 'All Cards', cards: filtered }); - } +router.get("/cards/:card_num", (req, res) => { + req.params.card_num = req.params.card_num || "all"; + let cards = require("../lib/cards.json"), + links = require("../lib/links.json"), + filtered = cards.filter( + (card) => + card.num + .toLowerCase() + .indexOf(req.params.card_num.toLowerCase()) > -1 || + req.params.card_num.toLowerCase() === "all" + ); + if (filtered.length === 1) { + let card = filtered[0]; + if ( + links && + card.hasOwnProperty("name") && + links.hasOwnProperty(card.name) + ) { + Object.assign(card, links[card.name]); + } + res.render("single", { + title: card.name + " (" + card.num + ")", + card: card, + }); + } else { + filtered = sortByName(filtered); + res.render("all", { title: "All Cards", cards: filtered }); + } }); -router.get('/cards', function(req, res) { - res.redirect('/cards/all'); +router.get("/cards", function (req, res) { + res.redirect("/cards/all"); }); module.exports = router; diff --git a/routes/search.js b/routes/search.js index 0a3d88d..6bc197d 100644 --- a/routes/search.js +++ b/routes/search.js @@ -1,143 +1,152 @@ -'use strict'; +"use strict"; - -const - express = require('express'), - sortByField = function(field, order, list) { - field = (field || 'num'); - order = (order || 'asc'); - let - coll_opts = { - sensitivity: 'accent', - numeric: true, - caseFirst: "upper" - }, - coll = new Intl.Collator({}, coll_opts); - list.sort((a,b) => { - if (a[field] && b[field]) { - let res = coll.compare(a[field], b[field]) * (order !== 'asc' ? -1 : 1); - if (res === 0 && field !== 'name') { - return coll.compare(a['name'], b['name']) * (order !== 'asc' ? -1 : 1); - } - return res; - } - return 1; - }); - return list; - }; +const express = require("express"), + sortByField = function (field, order, list) { + field = field || "num"; + order = order || "asc"; + let coll_opts = { + sensitivity: "accent", + numeric: true, + caseFirst: "upper", + }, + coll = new Intl.Collator({}, coll_opts); + list.sort((a, b) => { + if (a[field] && b[field]) { + let res = + coll.compare(a[field], b[field]) * + (order !== "asc" ? -1 : 1); + if (res === 0 && field !== "name") { + return ( + coll.compare(a["name"], b["name"]) * + (order !== "asc" ? -1 : 1) + ); + } + return res; + } + return 1; + }); + return list; + }; let router = express.Router(); /* GET search results page. */ -router.get('/', function(req, res) { - req.query = req.query || {}; - let filtered = []; - if (Object.keys(req.query).length > 0) { - let - q = req.query, - cards = require('../lib/cards.json'); - q.search_in = (q.search_in || []); - q.search_for = (q.search_for || '').trim().toLowerCase(); - q.pantheons = (q.pantheons || []); - q.pantheons = Array.isArray(q.pantheons) ? q.pantheons : [q.pantheons]; - q.elements = (q.elements || []); - q.elements = Array.isArray(q.elements) ? q.elements : [q.elements]; - q.types = (q.types || []); - q.types = Array.isArray(q.types) ? q.types : [q.types]; - q.races = (q.races || []); - q.races = Array.isArray(q.races) ? q.races : [q.races]; - q.releases = (q.releases || []); - q.releases = Array.isArray(q.releases) ? q.releases : [q.releases]; - q.sort_by = (q.sort_by || 'num').trim().toLowerCase(); - q.sort_order = (q.sort_order || 'asc').trim().toLowerCase(); +router.get("/", function (req, res) { + req.query = req.query || {}; + let filtered = []; + if (Object.keys(req.query).length > 0) { + let q = req.query, + cards = require("../lib/cards.json"); - console.log(`sort_by: ${q.sort_by}`); + q.search_in = q.search_in || []; + q.search_for = (q.search_for || "").trim().toLowerCase(); + q.pantheons = q.pantheons || []; + q.pantheons = Array.isArray(q.pantheons) ? q.pantheons : [q.pantheons]; + q.elements = q.elements || []; + q.elements = Array.isArray(q.elements) ? q.elements : [q.elements]; + q.types = q.types || []; + q.types = Array.isArray(q.types) ? q.types : [q.types]; + q.races = q.races || []; + q.races = Array.isArray(q.races) ? q.races : [q.races]; + q.releases = q.releases || []; + q.releases = Array.isArray(q.releases) ? q.releases : [q.releases]; + q.sort_by = (q.sort_by || "num").trim().toLowerCase(); + q.sort_order = (q.sort_order || "asc").trim().toLowerCase(); - filtered = cards.filter(card => { + filtered = cards.filter((card) => { + if (q.search_in.length > 0 && q.search_for.trim() !== "") { + if ( + !( + (q.search_in.indexOf("name") > -1 && + (card.name.toLowerCase().indexOf(q.search_for) > + -1 || + card.name_ang.indexOf(q.search_for) > -1)) || + (q.search_in.indexOf("ability") > -1 && + (card.ability_name + .toLowerCase() + .indexOf(q.search_for) > -1 || + card.ability_text + .toLowerCase() + .indexOf(q.search_for) > -1)) + ) + ) { + return false; + } + } - if (q.search_in.length > 0 && q.search_for.trim() !== '') { - if (!( - (q.search_in.indexOf('name') > -1 && (card.name.toLowerCase().indexOf(q.search_for) > -1 || card.name_ang.indexOf(q.search_for) > -1)) || - (q.search_in.indexOf('ability') > -1 && (card.ability_name.toLowerCase().indexOf(q.search_for) > -1 || card.ability_text.toLowerCase().indexOf(q.search_for) > -1)))) { - return false; - } + if (q.pantheons.length > 0 && card.pantheon) { + let has_pantheon = false; + for (let i = 0; i < q.pantheons.length; i++) { + if (card.pantheon_idx.indexOf(q.pantheons[i]) > -1) { + has_pantheon = true; + } + } + if (!has_pantheon) { + return false; + } + } - } + if (q.elements.length > 0) { + let has_element = false; + for (let i = 0; i < q.elements.length; i++) { + if (card.element_idx.indexOf(q.elements[i]) > -1) { + has_element = true; + } + } + if (!has_element) { + return false; + } + } - if (q.pantheons.length > 0 && card.pantheon) { - let - has_pantheon = false; - for (let i=0; i < q.pantheons.length; i++) { - if (card.pantheon_idx.indexOf(q.pantheons[i]) > -1) { - has_pantheon = true; - } - } - if (!has_pantheon) { - return false; - } - } + if (q.races.length > 0 && card.race) { + let has_race = false; + for (let i = 0; i < q.races.length; i++) { + if (card.race_idx.indexOf(q.races[i]) > -1) { + has_race = true; + } + } + if (!has_race) { + return false; + } + } - if (q.elements.length > 0) { - let - has_element = false; - for (let i=0; i < q.elements.length; i++) { - if (card.element_idx.indexOf(q.elements[i]) > -1) { - has_element = true; - } - } - if (!has_element) { - return false; - } - } + if (q.types.length > 0) { + let has_type = false; + for (let i = 0; i < q.types.length; i++) { + if (card.type_idx.indexOf(q.types[i]) > -1) { + has_type = true; + } + } + if (!has_type) { + return false; + } + } - if (q.races.length > 0 && card.race) { - let - has_race = false; - for (let i=0; i < q.races.length; i++) { - if (card.race_idx.indexOf(q.races[i]) > -1) { - has_race = true; - } - } - if (!has_race) { - return false; - } - } + if (q.releases.length > 0) { + let has_release = false; + for (let i = 0; i < q.releases.length; i++) { + if (card.num.toLowerCase().indexOf(q.releases[i]) > -1) { + has_release = true; + } + } + if (!has_release) { + return false; + } + } - if (q.types.length > 0) { - let - has_type = false; - for (let i=0; i < q.types.length; i++) { - if (card.type_idx.indexOf(q.types[i]) > -1) { - has_type = true; - } - } - if (!has_type) { - return false; - } - } + return true; + }); + if (q.sort_by !== "name") { + filtered = sortByField("name", q.sort_order, filtered); + } + filtered = sortByField(q.sort_by, q.sort_order, filtered); + } - if (q.releases.length > 0) { - let - has_release = false; - for (let i=0; i < q.releases.length; i++) { - if (card.num.toLowerCase().indexOf(q.releases[i]) > -1) { - has_release = true; - } - } - if (!has_release) { - return false; - } - } - - return true; - }); - if (q.sort_by !== 'name') { - filtered = sortByField('name', q.sort_order, filtered); - } - filtered = sortByField(q.sort_by, q.sort_order, filtered); - } - - res.render('search', { title:`Search Results (${filtered.length})`, query: req.query, cards: filtered }); + res.render("search", { + title: `Search Results (${filtered.length})`, + query: req.query, + cards: filtered, + }); }); module.exports = router; diff --git a/views/all.ejs b/views/all.ejs index c93bfee..d1f4ce1 100644 --- a/views/all.ejs +++ b/views/all.ejs @@ -1,19 +1,19 @@ -<% include ./partials/top %> +<%- include('./partials/top') %> -<% include ./partials/header %> +<%- include('./partials/header') %>
- <% include ./partials/cards %> + <%- include('./partials/cards') %>
-<% include ./partials/footer %> +<%- include('./partials/footer') %> -<% include ./partials/scripts %> +<%- include('./partials/scripts') %> diff --git a/views/error.ejs b/views/error.ejs index 0ffaebc..81a27d3 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -24,7 +24,7 @@ diff --git a/views/index.ejs b/views/index.ejs index d70d79c..4c9ed75 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,25 +1,30 @@ -<% include ./partials/top %> +<%- include('./partials/top') %> -<% include ./partials/header %> +<%- include('./partials/header') %>
-

The Codex Mythica is a database of all of the cards released for the Mythic Wars card game. Browse through all of the cards in the game, or search to find the card(s) you're looking for. +

+ The Codex Mythica is a database of all of the cards released + for the Mythic Wars card game. Browse through + all of the cards in the game, or search to find the + card(s) you're looking for. +

- <% include ./partials/random_card %> + <%- include('./partials/random_card') %> - <% include ./partials/search_form %> + <%- include('./partials/search_form') %>
-<% include ./partials/footer %> +<%- include('./partials/footer') %> -<% include ./partials/scripts %> +<%- include('./partials/scripts') %> diff --git a/views/partials/cards.ejs b/views/partials/cards.ejs index 2691d9e..26ce296 100644 --- a/views/partials/cards.ejs +++ b/views/partials/cards.ejs @@ -4,7 +4,7 @@ <% cards.forEach(card => { %> - <% include ./preview %> + <%- include('./preview', { card }) %> <% }) %> diff --git a/views/partials/footer.ejs b/views/partials/footer.ejs index 55cb018..d05760e 100644 --- a/views/partials/footer.ejs +++ b/views/partials/footer.ejs @@ -2,12 +2,12 @@