From ace28029868cd6dec5e86900217d37ddcfd98152 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 19:46:49 -0500 Subject: [PATCH 01/92] fix: Fix everything --- domains/ulric.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/ulric.localplayer.dev.json b/domains/ulric.localplayer.dev.json index 7260e904..6e8e2b68 100644 --- a/domains/ulric.localplayer.dev.json +++ b/domains/ulric.localplayer.dev.json @@ -1,6 +1,6 @@ { "description": "Personal Website", - "domain": "locaplayer.dev", + "domain": "localplayer.dev", "subdomain": "ulric", "owner": { "repo": "https://github.com/ulric-collaco/ulric.github.io", From 1d243a17d048a752972059b9b70ab504c04578ab Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:17:36 -0500 Subject: [PATCH 02/92] Update validation.yml --- .github/workflows/validation.yml | 123 ++++++++----------------------- 1 file changed, 30 insertions(+), 93 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 8032e34e..716a6a3e 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -1,104 +1,41 @@ name: Validation on: - pull_request_target: + pull_request: + + push: + branches: [main] + paths: + - "domains/*" + - "tests/*" + - "utils/*" + - ".github/workflows/validate.yml" + - "dnsconfig.js" + + workflow_dispatch: concurrency: - group: ${{ github.ref }}-validation - cancel-in-progress: true + group: ${{ github.ref }}-validation + cancel-in-progress: true jobs: - dns: - name: DNS - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} + dns: + name: DNS + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - - id: create_token - uses: tibdex/github-app-token@v2 - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.PRIVATE_KEY }} + - name: Check + uses: is-a-dev/dnscontrol-action@main + with: + args: check - - name: Check DNS - id: dns_check - uses: koenrh/dnscontrol-action@v3 - with: - args: check - config_file: "dnsconfig.js" + tests: + name: Tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - - name: Add Validated DNS Label - if: ${{ steps.dns_check.outcome == 'success' }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Validated DNS" - github_token: ${{ steps.create_token.outputs.token }} - - name: Remove Invalid DNS Label - if: ${{ steps.dns_check.outcome == 'success' }} - uses: actions-ecosystem/action-remove-labels@v1 - with: - labels: "Invalid DNS" - github_token: ${{ steps.create_token.outputs.token }} + - run: npm install - - name: Add Invalid DNS Label - if: ${{ failure() }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Invalid DNS" - github_token: ${{ steps.create_token.outputs.token }} - - name: Remove Validated DNS Label - if: ${{ failure() }} - uses: actions-ecosystem/action-remove-labels@v1 - with: - labels: "Validated DNS" - github_token: ${{ steps.create_token.outputs.token }} - - json: - name: JSON - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - id: create_token - uses: tibdex/github-app-token@v2 - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.PRIVATE_KEY }} - - - name: JSON Syntax Check - id: json_check - uses: limitusus/json-syntax-check@v2 - with: - pattern: "\\.json$" - env: - BASE: "domains/" - - - name: Add Validated JSON Label - if: ${{ steps.json_check.outcome == 'success' }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Validated JSON" - github_token: ${{ steps.create_token.outputs.token }} - - name: Remove Invalid JSON Label - if: ${{ steps.json_check.outcome == 'success' }} - uses: actions-ecosystem/action-remove-labels@v1 - with: - labels: "Invalid JSON" - github_token: ${{ steps.create_token.outputs.token }} - - - name: Add Invalid JSON Label - if: ${{ failure() }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Invalid JSON" - github_token: ${{ steps.create_token.outputs.token }} - - name: Remove Validated JSON Label - if: ${{ failure() }} - uses: actions-ecosystem/action-remove-labels@v1 - with: - labels: "Validated JSON" - github_token: ${{ steps.create_token.outputs.token }} + - run: npm test From a45eeedc1bf3dd7749437ae44d6aa5d4d242ac77 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:18:14 -0500 Subject: [PATCH 03/92] Create domains.test.js --- tests/domains.test.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/domains.test.js diff --git a/tests/domains.test.js b/tests/domains.test.js new file mode 100644 index 00000000..eddb7833 --- /dev/null +++ b/tests/domains.test.js @@ -0,0 +1,35 @@ +const t = require("ava"); +const fs = require("fs-extra"); +const path = require("path"); + +const domainsPath = path.resolve("domains"); +const files = fs.readdirSync(domainsPath); + +t("Nested subdomains should not exist without a parent subdomain", (t) => { + files.forEach((file) => { + const subdomain = file.replace(".json", ""); + + if (subdomain.split(".").length > 1) { + const parentSubdomain = subdomain.split(".").pop(); + + t.true(files.includes(`${parentSubdomain}.json`), `${file}: Parent subdomain does not exist`); + } + }); + + t.pass(); +}); + +t("Nested subdomains should not exist if the parent subdomain has NS records", (t) => { + files.forEach((file) => { + const subdomain = file.replace(".json", ""); + + if (subdomain.split(".").length > 1) { + const parentSubdomain = subdomain.split(".").pop(); + const parentDomain = fs.readJsonSync(path.join(domainsPath, `${parentSubdomain}.json`)); + + t.is(parentDomain.record.NS, undefined, `${file}: Parent subdomain has NS records`); + } + }); + + t.pass(); +}); From be5d27edf9a7bb704e16fa025fe9312ab02c4064 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:18:32 -0500 Subject: [PATCH 04/92] Create json.test.js --- tests/json.test.js | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 tests/json.test.js diff --git a/tests/json.test.js b/tests/json.test.js new file mode 100644 index 00000000..165c8326 --- /dev/null +++ b/tests/json.test.js @@ -0,0 +1,99 @@ +const t = require("ava"); +const fs = require("fs-extra"); +const path = require("path"); + +const requiredFields = { + owner: "object", + record: "object" +}; + +const optionalFields = { + proxied: "boolean", + reserved: "boolean" +}; + +const requiredOwnerFields = { + username: "string" +}; + +const optionalOwnerFields = { + email: "string" +}; + +const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; +const hostnameRegex = /^(?=.{1,253}$)(?:(?:[_a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)\.)+[a-zA-Z]{2,63}$/; + +const domainsPath = path.resolve("domains"); +const files = fs.readdirSync(domainsPath); + +function validateRequiredFields(t, obj, requiredFields, file) { + Object.keys(requiredFields).forEach((key) => { + t.true(obj.hasOwnProperty(key), `${file}: Missing required field: ${key}`); + t.is(typeof obj[key], requiredFields[key], `${file}: Field ${key} should be of type ${requiredFields[key]}`); + }); +} + +function validateOptionalFields(t, obj, optionalFields, file) { + Object.keys(optionalFields).forEach((key) => { + if (obj.hasOwnProperty(key)) { + t.is( + typeof obj[key], + optionalFields[key], + `${file}: Field ${key} should be of type ${optionalFields[key]}` + ); + } + }); +} + +t("All files should be valid JSON", (t) => { + files.forEach((file) => { + t.notThrows(() => fs.readJsonSync(path.join(domainsPath, file)), `${file}: Invalid JSON file`); + }); +}); + +t("All files should have valid file names", (t) => { + files.forEach((file) => { + t.true(file.endsWith(".json"), `${file}: File does not have .json extension`); + t.false(file.includes(".is-a-fullstack.dev"), `${file}: File name should not contain .is-a-fullstack.dev`); + t.false(file.includes(".is-a-cool.dev"), `${file}: File name should not contain .is-a-cool.dev`); + t.false(file.includes(".is-local.org"), `${file}: File name should not contain .is-local.org`); + t.false(file.includes(".is-not-a.dev"), `${file}: File name should not contain .is-not-a.dev`); + t.false(file.includes(".localplayer.dev"), `${file}: File name should not contain .localplayer.dev`); + t.true(file === file.toLowerCase(), `${file}: File name should be lowercase`); + + // Ignore root domain + if (file !== "@.json") { + t.regex( + file.replace(/\.json$/, "") + ".is-a-fullstack.dev|.is-a-cool.dev|.is-local.org|.is-not-a.dev|.localplayer.dev", + hostnameRegex, + `${file}: FQDN must be 1-253 characters, use letters, numbers, dots, or hyphens, and not start or end with a hyphen.` + ); + } + }); +}); + +t("All files should have the required fields", (t) => { + files.forEach((file) => { + const data = fs.readJsonSync(path.join(domainsPath, file)); + + validateRequiredFields(t, data, requiredFields, file); + validateRequiredFields(t, data.owner, requiredOwnerFields, file); + + if (!data.reserved) { + t.true(Object.keys(data.record).length > 0, `${file}: No record types found`); + } + }); +}); + +t("All files should have valid optional fields", (t) => { + files.forEach((file) => { + const data = fs.readJsonSync(path.join(domainsPath, file)); + + validateOptionalFields(t, data, optionalFields, file); + validateOptionalFields(t, data.owner, optionalOwnerFields, file); + + if (data.owner.email) { + t.regex(data.owner.email, emailRegex, `${file}: Owner email should be a valid email address`); + } + }); +}); From 5becfedc877c6ccf8b2c80f63fe8662a9a1381e2 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:18:53 -0500 Subject: [PATCH 05/92] Create proxy.test.js --- tests/proxy.test.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/proxy.test.js diff --git a/tests/proxy.test.js b/tests/proxy.test.js new file mode 100644 index 00000000..7e8299c7 --- /dev/null +++ b/tests/proxy.test.js @@ -0,0 +1,25 @@ +const t = require("ava"); +const fs = require("fs-extra"); +const path = require("path"); + +const requiredRecordsToProxy = ["A", "AAAA", "CNAME"]; +// URL records are not listed here because they are proxied by default, so they don't need the proxied flag + +function validateProxiedRecords(t, data, file) { + if (data.proxied) { + const hasProxiedRecord = Object.keys(data.record).some((key) => requiredRecordsToProxy.includes(key)); + + t.true(hasProxiedRecord, `${file}: Proxied is true but there are no records that can be proxied`); + } +} + +const domainsPath = path.resolve("domains"); +const files = fs.readdirSync(domainsPath); + +t("Domains with proxy enabled should have have at least one record that can be proxied", (t) => { + files.forEach((file) => { + const domain = fs.readJsonSync(path.join(domainsPath, file)); + + validateProxiedRecords(t, domain, file); + }); +}); From 4b3a9db786b488ecb579fbd4cf122db50935f03b Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:19:26 -0500 Subject: [PATCH 06/92] Create records.test.js --- tests/records.test.js | 328 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 tests/records.test.js diff --git a/tests/records.test.js b/tests/records.test.js new file mode 100644 index 00000000..d4c6c8bb --- /dev/null +++ b/tests/records.test.js @@ -0,0 +1,328 @@ +const t = require("ava"); +const fs = require("fs-extra"); +const path = require("path"); + +const validRecordTypes = ["A", "AAAA", "CAA", "CNAME", "DS", "MX", "NS", "SRV", "TXT", "URL"]; + +const hostnameRegex = /^(?=.{1,253}$)(?:(?:[_a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)\.)+[a-zA-Z]{2,63}$/; +const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}$/; +const ipv6Regex = + /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){0,6}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$/; + +const domainsPath = path.resolve("domains"); +const files = fs.readdirSync(domainsPath); + +function expandIPv6(ip) { + // Split into segments by ":" + let segments = ip.split(":"); + + // Count the number of segments that are empty due to "::" shorthand + const emptyIndex = segments.indexOf(""); + if (emptyIndex !== -1) { + // Calculate how many "0000" segments are missing + const nonEmptySegments = segments.filter((seg) => seg !== ""); + const missingSegments = 8 - nonEmptySegments.length; + + // Insert the missing "0000" segments into the position of the empty segment + segments = [ + ...nonEmptySegments.slice(0, emptyIndex), + ...Array(missingSegments).fill("0000"), + ...nonEmptySegments.slice(emptyIndex) + ]; + } + + // Expand each segment to 4 characters, padding with leading zeros + const expandedSegments = segments.map((segment) => segment.padStart(4, "0")); + + // Join the segments back together + return expandedSegments.join(":"); +} + +function isPublicIPv4(ip, proxied) { + const parts = ip.split(".").map(Number); + + // Validate IPv4 address format + if (parts.length !== 4 || parts.some((part) => isNaN(part) || part < 0 || part > 255)) { + return false; + } + + // Exception for 192.0.2.1, assuming the domain is proxied + if (ip === "192.0.2.1" && proxied) { + return true; + } + + // Check for private and reserved IPv4 ranges + return !( + // Private ranges + ( + parts[0] === 10 || + (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) || + (parts[0] === 192 && parts[1] === 168) || + // Reserved or special-use ranges + (parts[0] === 100 && parts[1] >= 64 && parts[1] <= 127) || // Carrier-grade NAT + (parts[0] === 169 && parts[1] === 254) || // Link-local + (parts[0] === 192 && parts[1] === 0 && parts[2] === 0) || // IETF Protocol Assignments + (parts[0] === 192 && parts[1] === 0 && parts[2] === 2) || // Documentation (TEST-NET-1) + (parts[0] === 198 && parts[1] === 18) || // Network Interconnect Devices + (parts[0] === 198 && parts[1] === 51 && parts[2] === 100) || // Documentation (TEST-NET-2) + (parts[0] === 203 && parts[1] === 0 && parts[2] === 113) || // Documentation (TEST-NET-3) + parts[0] >= 224 + ) // Multicast and reserved ranges + ); +} + +function isPublicIPv6(ip) { + const normalizedIP = ip.toLowerCase(); + + // Check for private or special-use IPv6 ranges + return !( + ( + normalizedIP.startsWith("fc") || // Unique Local Address (ULA) + normalizedIP.startsWith("fd") || // Unique Local Address (ULA) + normalizedIP.startsWith("fe80") || // Link-local + normalizedIP.startsWith("::1") || // Loopback address (::1) + normalizedIP.startsWith("2001:db8") + ) // Documentation range + ); +} + +t("All files should have valid record types", (t) => { + files.forEach((file) => { + const data = fs.readJsonSync(path.join(domainsPath, file)); + const recordKeys = Object.keys(data.record); + + recordKeys.forEach((key) => { + t.true(validRecordTypes.includes(key), `${file}: Invalid record type: ${key}`); + }); + + // CNAME records cannot be combined with any other record type + if (recordKeys.includes("CNAME")) { + t.is(recordKeys.length, Number(1), `${file}: CNAME records cannot be combined with other records`); + } + + // NS records cannot be combined with any other record type, except for DS records + if (recordKeys.includes("NS")) { + t.true( + recordKeys.length === 1 || (recordKeys.length === 2 && recordKeys.includes("DS")), + `${file}: NS records cannot be combined with other records, except for DS records` + ); + } + + // DS records must be combined with NS records + if (recordKeys.includes("DS")) { + t.true(recordKeys.includes("NS"), `${file}: DS records must be combined with NS records`); + } + }); +}); + +t("All files should not have duplicate record keys", (t) => { + files.forEach((file) => { + const data = fs.readJsonSync(path.join(domainsPath, file)); + + const recordKeys = Object.keys(data.record); + const uniqueRecordKeys = new Set(recordKeys); + + t.is(recordKeys.length, uniqueRecordKeys.size, `${file}: Duplicate record keys found`); + }); +}); + +t("All files should have valid record values", (t) => { + files.forEach((file) => { + const data = fs.readJsonSync(path.join(domainsPath, file)); + + Object.keys(data.record).forEach((key) => { + const value = data.record[key]; + + // *: string[] + if (["A", "AAAA", "MX", "NS"].includes(key)) { + t.true(Array.isArray(value), `${file}: Record value should be an array for ${key}`); + + value.forEach((record) => { + t.true(typeof record === "string", `${file}: Record value should be a string for ${key}`); + }); + + // A: string[] + if (key === "A") { + value.forEach((record) => { + t.regex( + record, + ipv4Regex, + `${file}: Record value should be a valid IPv4 address for ${key} at index ${value.indexOf( + record + )}` + ); + + t.true( + isPublicIPv4(record, data.proxied), + `${file}: Record value should be a public IPv4 address for ${key} at index ${value.indexOf( + record + )}` + ); + }); + } + + // AAAA: string[] + if (key === "AAAA") { + value.forEach((record) => { + t.regex( + expandIPv6(record), + ipv6Regex, + `${file}: Record value should be a valid IPv6 address for ${key} at index ${value.indexOf( + record + )}` + ); + + t.true( + isPublicIPv6(record), + `${file}: Record value should be a public IPv6 address for ${key} at index ${value.indexOf( + record + )}` + ); + }); + } + + // *: string[] + if (["MX", "NS"].includes(key)) { + value.forEach((record) => { + t.regex( + record, + hostnameRegex, + `${file}: Record value should be a valid hostname for ${key} at index ${value.indexOf( + record + )}` + ); + }); + } + } + + // *: string + if (["CNAME", "URL"].includes(key)) { + t.true(typeof value === "string", `${file}: Record value should be a string for ${key}`); + + if (key === "CNAME") { + t.regex(value, hostnameRegex, `${file}: Record value should be a valid hostname for ${key}`); + } + + if (key === "URL") { + t.notThrows(() => new URL(value), `${file}: Record value should be a valid URL for ${key}`); + } + } + + // *: {}[] + if (["CAA", "DS", "SRV"].includes(key)) { + t.true(Array.isArray(value), `${file}: Record value should be an array for ${key}`); + + value.forEach((record) => { + t.true( + typeof record === "object", + `${file}: Record value should be an object for ${key} at index ${value.indexOf(record)}` + ); + }); + + // CAA: { flags: number, tag: string, value: string }[] + if (key === "CAA") { + value.forEach((record) => { + t.true( + typeof record.flags === "number", + `${file}: CAA record value should have a number for flags at index ${value.indexOf(record)}` + ); + + t.true( + typeof record.tag === "string", + `${file}: CAA record value should have a string for tag at index ${value.indexOf(record)}` + ); + + t.true( + typeof record.value === "string", + `${file}: CAA record value should have a string for value at index ${value.indexOf(record)}` + ); + }); + } + + // DS: { key_tag: number, algorithm: number, digest_type: number, digest: string }[] + if (key === "DS") { + value.forEach((record) => { + t.true( + typeof record.key_tag === "number", + `${file}: DS record value should have a number for key_tag at index ${value.indexOf( + record + )}` + ); + + t.true( + typeof record.algorithm === "number", + `${file}: DS record value should have a number for algorithm at index ${value.indexOf( + record + )}` + ); + + t.true( + typeof record.digest_type === "number", + `${file}: DS record value should have a number for digest_type at index ${value.indexOf( + record + )}` + ); + + t.true( + typeof record.digest === "string", + `${file}: DS record value should have a string for digest at index ${value.indexOf(record)}` + ); + }); + } + + // SRV: { priority: number, weight: number, port: number, target: string }[] + if (key === "SRV") { + value.forEach((record) => { + t.true( + typeof record.priority === "number", + `${file}: SRV record value should have a number for priority at index ${value.indexOf( + record + )}` + ); + + t.true( + typeof record.weight === "number", + `${file}: SRV record value should have a number for weight at index ${value.indexOf( + record + )}` + ); + + t.true( + typeof record.port === "number", + `${file}: SRV record value should have a number for port at index ${value.indexOf(record)}` + ); + + t.true( + typeof record.target === "string", + `${file}: SRV record value should have a string for target at index ${value.indexOf( + record + )}` + ); + + t.regex( + value.target, + hostnameRegex, + `${file}: SRV record value should be a valid hostname for target at index ${value.indexOf( + record + )}` + ); + }); + } + } + + // TXT: object | objext[] + if (key === "TXT") { + if (Array.isArray(value)) { + value.forEach((record) => { + t.true( + typeof record === "object", + `${file}: Record value should be a object for ${key} at index ${value.indexOf(record)}` + ); + }); + } else { + t.true(typeof value === "onject", `${file}: Record value should be a object for ${key}`); + } + } + }); + }); +}); From c3ec31645a5f6870764214b4d184201061c4c0a2 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:23:15 -0500 Subject: [PATCH 07/92] Create package.json --- package.json | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 00000000..858f3ddd --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "devDependencies": { + "ava": "^6.2.0", + "fs-extra": "^11.2.0" + }, + "scripts": { + "test": "npx ava tests/*.test.js" + } +} From bd5fc5101e19200b2d38f596951a5b4cbb207ab8 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:23:48 -0500 Subject: [PATCH 08/92] Create package-lock.json --- package-lock.json | 2437 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2437 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..b471fdeb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2437 @@ +{ + "name": "register", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "ava": "^6.2.0", + "fs-extra": "^11.2.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vercel/nft": { + "version": "0.27.6", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.6.tgz", + "integrity": "sha512-mwuyUxskdcV8dd7N7JnxBgvFEz1D9UOePI/WyLLzktv6HSCwgPNQGit/UJ2IykAWGlypKw4pBQjOKWvIbXITSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "@rollup/pluginutils": "^4.0.0", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.8", + "node-gyp-build": "^4.2.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ava": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-6.2.0.tgz", + "integrity": "sha512-+GZk5PbyepjiO/68hzCZCUepQOQauKfNnI7sA4JukBTg97jD7E+tDKEA7OhGOGr6EorNNMM9+jqvgHVOTOzG4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vercel/nft": "^0.27.5", + "acorn": "^8.13.0", + "acorn-walk": "^8.3.4", + "ansi-styles": "^6.2.1", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.2.0", + "cbor": "^9.0.2", + "chalk": "^5.3.0", + "chunkd": "^2.0.1", + "ci-info": "^4.0.0", + "ci-parallel-vars": "^1.0.1", + "cli-truncate": "^4.0.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.7", + "emittery": "^1.0.3", + "figures": "^6.1.0", + "globby": "^14.0.2", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "memoize": "^10.0.0", + "ms": "^2.1.3", + "p-map": "^7.0.2", + "package-config": "^5.0.0", + "picomatch": "^4.0.2", + "plur": "^5.1.0", + "pretty-ms": "^9.1.0", + "resolve-cwd": "^3.0.0", + "stack-utils": "^2.0.6", + "strip-ansi": "^7.1.0", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^6.0.0", + "yargs": "^17.7.2" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": "^18.18 || ^20.8 || ^22 || >=23" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", + "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cbor": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "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, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "license": "MIT" + }, + "node_modules/cliui/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/emittery": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.3.tgz", + "integrity": "sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "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, + "license": "MIT", + "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, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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, + "license": "MIT" + }, + "node_modules/gauge/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "license": "MIT", + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/memoize": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.0.0.tgz", + "integrity": "sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/memoize?sponsor=1" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", + "integrity": "sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-config": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/package-config/-/package-config-5.0.0.tgz", + "integrity": "sha512-GYTTew2slBcYdvRHqjhwaaydVMvn/qrGC323+nKclYioNSLTDUM/lGgtGTgyHVtYcozb+XkE8CNhwcraOmZ9Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0", + "load-json-file": "^7.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=6" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/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, + "license": "MIT" + }, + "node_modules/wide-align/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=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, + "license": "MIT", + "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/wrap-ansi/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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, + "license": "MIT" + }, + "node_modules/wrap-ansi/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "MIT", + "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, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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, + "license": "MIT" + }, + "node_modules/yargs/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} From 937277bef93b6df316e50e4fb0b9028000258283 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Mon, 11 Nov 2024 20:27:58 -0500 Subject: [PATCH 09/92] Whoops spelled domain wrong --- tests/json.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index 165c8326..aae01128 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -55,7 +55,7 @@ t("All files should have valid file names", (t) => { files.forEach((file) => { t.true(file.endsWith(".json"), `${file}: File does not have .json extension`); t.false(file.includes(".is-a-fullstack.dev"), `${file}: File name should not contain .is-a-fullstack.dev`); - t.false(file.includes(".is-a-cool.dev"), `${file}: File name should not contain .is-a-cool.dev`); + t.false(file.includes(".is-cool.dev"), `${file}: File name should not contain .is-cool.dev`); t.false(file.includes(".is-local.org"), `${file}: File name should not contain .is-local.org`); t.false(file.includes(".is-not-a.dev"), `${file}: File name should not contain .is-not-a.dev`); t.false(file.includes(".localplayer.dev"), `${file}: File name should not contain .localplayer.dev`); @@ -64,7 +64,7 @@ t("All files should have valid file names", (t) => { // Ignore root domain if (file !== "@.json") { t.regex( - file.replace(/\.json$/, "") + ".is-a-fullstack.dev|.is-a-cool.dev|.is-local.org|.is-not-a.dev|.localplayer.dev", + file.replace(/\.json$/, "") + ".is-a-fullstack.dev|.is-cool.dev|.is-local.org|.is-not-a.dev|.localplayer.dev", hostnameRegex, `${file}: FQDN must be 1-253 characters, use letters, numbers, dots, or hyphens, and not start or end with a hyphen.` ); From d3c7430875565160e21b03da4043d16b65a046d6 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:17:22 -0500 Subject: [PATCH 10/92] Update json.test.js --- tests/json.test.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index aae01128..370b8746 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -12,10 +12,6 @@ const optionalFields = { reserved: "boolean" }; -const requiredOwnerFields = { - username: "string" -}; - const optionalOwnerFields = { email: "string" }; From 62e69e5d45c046923524829c1e4d8fe595b30614 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:20:57 -0500 Subject: [PATCH 11/92] Rename *imrbk123abc.is-cool.dev.json to *.imrbk123abc.is-cool.dev.json Fix domain as *. Was missing from it. --- ...mrbk123abc.is-cool.dev.json => *.imrbk123abc.is-cool.dev.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename domains/{*imrbk123abc.is-cool.dev.json => *.imrbk123abc.is-cool.dev.json} (100%) diff --git a/domains/*imrbk123abc.is-cool.dev.json b/domains/*.imrbk123abc.is-cool.dev.json similarity index 100% rename from domains/*imrbk123abc.is-cool.dev.json rename to domains/*.imrbk123abc.is-cool.dev.json From c608d1a987527d869c085bc5fc940fd36ab4c7e2 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:30:03 -0500 Subject: [PATCH 12/92] Update records.test.js --- tests/records.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index d4c6c8bb..0b2314fb 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -310,7 +310,7 @@ t("All files should have valid record values", (t) => { } } - // TXT: object | objext[] + // TXT: object | object[] if (key === "TXT") { if (Array.isArray(value)) { value.forEach((record) => { @@ -320,7 +320,7 @@ t("All files should have valid record values", (t) => { ); }); } else { - t.true(typeof value === "onject", `${file}: Record value should be a object for ${key}`); + t.true(typeof value === "object", `${file}: Record value should be a object for ${key}`); } } }); From 749cfcc529473eba0e10c7b0d30224d8bb50f08f Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:16:45 -0500 Subject: [PATCH 13/92] Update tests/json.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index 370b8746..f220c864 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -4,7 +4,7 @@ const path = require("path"); const requiredFields = { owner: "object", - record: "object" + records: "object" }; const optionalFields = { From 5ca1616a207b54bef84ba4d780ecaa1454ce36dc Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:17:20 -0500 Subject: [PATCH 14/92] Update tests/json.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index f220c864..c137cc24 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -76,7 +76,7 @@ t("All files should have the required fields", (t) => { validateRequiredFields(t, data.owner, requiredOwnerFields, file); if (!data.reserved) { - t.true(Object.keys(data.record).length > 0, `${file}: No record types found`); + t.true(Object.keys(data.records).length > 0, `${file}: No record types found`); } }); }); From 0f1ea3b00e925aa97c704ed56069bda85112851b Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:17:59 -0500 Subject: [PATCH 15/92] Update tests/proxy.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/proxy.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/proxy.test.js b/tests/proxy.test.js index 7e8299c7..4c5bfa43 100644 --- a/tests/proxy.test.js +++ b/tests/proxy.test.js @@ -3,7 +3,6 @@ const fs = require("fs-extra"); const path = require("path"); const requiredRecordsToProxy = ["A", "AAAA", "CNAME"]; -// URL records are not listed here because they are proxied by default, so they don't need the proxied flag function validateProxiedRecords(t, data, file) { if (data.proxied) { From e1ab75d00dc56e8ff5c031da0aa3d25f1cd846a0 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:19:03 -0500 Subject: [PATCH 16/92] Update tests/proxy.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/proxy.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/proxy.test.js b/tests/proxy.test.js index 4c5bfa43..28895ad1 100644 --- a/tests/proxy.test.js +++ b/tests/proxy.test.js @@ -6,7 +6,7 @@ const requiredRecordsToProxy = ["A", "AAAA", "CNAME"]; function validateProxiedRecords(t, data, file) { if (data.proxied) { - const hasProxiedRecord = Object.keys(data.record).some((key) => requiredRecordsToProxy.includes(key)); + const hasProxiedRecord = Object.keys(data.records).some((key) => requiredRecordsToProxy.includes(key)); t.true(hasProxiedRecord, `${file}: Proxied is true but there are no records that can be proxied`); } From b25e407a25722b310fd84c6d23949d68e748a3fe Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:19:50 -0500 Subject: [PATCH 17/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index 0b2314fb..1758f9ec 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -2,7 +2,7 @@ const t = require("ava"); const fs = require("fs-extra"); const path = require("path"); -const validRecordTypes = ["A", "AAAA", "CAA", "CNAME", "DS", "MX", "NS", "SRV", "TXT", "URL"]; +const validRecordTypes = ["A", "AAAA", "CAA", "CNAME", "MX", "NS", "PTR", "SRV", "TXT"]; const hostnameRegex = /^(?=.{1,253}$)(?:(?:[_a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)\.)+[a-zA-Z]{2,63}$/; const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}$/; From 5e265033067c773fd33e61e880e04c2cd95e3def Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:20:19 -0500 Subject: [PATCH 18/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 1758f9ec..d895fa0d 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -310,17 +310,17 @@ t("All files should have valid record values", (t) => { } } - // TXT: object | object[] + // TXT: string | string[] if (key === "TXT") { if (Array.isArray(value)) { value.forEach((record) => { t.true( - typeof record === "object", - `${file}: Record value should be a object for ${key} at index ${value.indexOf(record)}` + typeof record === "string", + `${file}: Record value should be a string for ${key} at index ${value.indexOf(record)}` ); }); } else { - t.true(typeof value === "object", `${file}: Record value should be a object for ${key}`); + t.true(typeof value === "string", `${file}: Record value should be a string for ${key}`); } } }); From 548aba4d67d73fe55838bce6bda11d3eae143462 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:20:41 -0500 Subject: [PATCH 19/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index d895fa0d..2267c5fc 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -239,37 +239,6 @@ t("All files should have valid record values", (t) => { }); } - // DS: { key_tag: number, algorithm: number, digest_type: number, digest: string }[] - if (key === "DS") { - value.forEach((record) => { - t.true( - typeof record.key_tag === "number", - `${file}: DS record value should have a number for key_tag at index ${value.indexOf( - record - )}` - ); - - t.true( - typeof record.algorithm === "number", - `${file}: DS record value should have a number for algorithm at index ${value.indexOf( - record - )}` - ); - - t.true( - typeof record.digest_type === "number", - `${file}: DS record value should have a number for digest_type at index ${value.indexOf( - record - )}` - ); - - t.true( - typeof record.digest === "string", - `${file}: DS record value should have a string for digest at index ${value.indexOf(record)}` - ); - }); - } - // SRV: { priority: number, weight: number, port: number, target: string }[] if (key === "SRV") { value.forEach((record) => { From 7b0fdceac5dff3291ee366d9e07b1622d51b868a Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:21:03 -0500 Subject: [PATCH 20/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index 2267c5fc..aa58ecd0 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -209,7 +209,7 @@ t("All files should have valid record values", (t) => { } // *: {}[] - if (["CAA", "DS", "SRV"].includes(key)) { + if (["CAA", "SRV"].includes(key)) { t.true(Array.isArray(value), `${file}: Record value should be an array for ${key}`); value.forEach((record) => { From 693fa51df51b9a50d64faf0863bdbc580ea88d72 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:26:51 -0500 Subject: [PATCH 21/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index aa58ecd0..2883d0e1 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -195,17 +195,10 @@ t("All files should have valid record values", (t) => { } } - // *: string - if (["CNAME", "URL"].includes(key)) { + // CNAME: string + if (key === "CNAME") { t.true(typeof value === "string", `${file}: Record value should be a string for ${key}`); - - if (key === "CNAME") { - t.regex(value, hostnameRegex, `${file}: Record value should be a valid hostname for ${key}`); - } - - if (key === "URL") { - t.notThrows(() => new URL(value), `${file}: Record value should be a valid URL for ${key}`); - } + t.regex(value, hostnameRegex, `${file}: Record value should be a valid hostname for ${key}`); } // *: {}[] From bca39437637438322cebab20603c8bb4e9e64d1e Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:38:12 -0500 Subject: [PATCH 22/92] Fixes --- tests/json.test.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index c137cc24..02092b42 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -7,11 +7,6 @@ const requiredFields = { records: "object" }; -const optionalFields = { - proxied: "boolean", - reserved: "boolean" -}; - const optionalOwnerFields = { email: "string" }; @@ -20,7 +15,11 @@ const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; const hostnameRegex = /^(?=.{1,253}$)(?:(?:[_a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)\.)+[a-zA-Z]{2,63}$/; const domainsPath = path.resolve("domains"); +const reservedDomainsPath = path.resolve("reserved"); +const rootDomainFiles = ["is-a-fullstack.dev.json", "is-cool.dev.json", "is-local.org.json", "is-not-a.dev.json", "localplayer.dev.json"]; const files = fs.readdirSync(domainsPath); +const reservedFiles = fs.existsSync(reservedDomainsPath) ? fs.readdirSync(reservedDomainsPath) : []; + function validateRequiredFields(t, obj, requiredFields, file) { Object.keys(requiredFields).forEach((key) => { @@ -47,20 +46,22 @@ t("All files should be valid JSON", (t) => { }); }); +const Domains = [".is-a-fullstack.dev", ".is-cool.dev", ".is-local.org", ".is-not-a.dev", ".localplayer.dev"] + t("All files should have valid file names", (t) => { files.forEach((file) => { t.true(file.endsWith(".json"), `${file}: File does not have .json extension`); - t.false(file.includes(".is-a-fullstack.dev"), `${file}: File name should not contain .is-a-fullstack.dev`); + t.false(file.includes(`${Domains}`), `${file}: File name should not contain .is-a-fullstack.dev`); t.false(file.includes(".is-cool.dev"), `${file}: File name should not contain .is-cool.dev`); t.false(file.includes(".is-local.org"), `${file}: File name should not contain .is-local.org`); t.false(file.includes(".is-not-a.dev"), `${file}: File name should not contain .is-not-a.dev`); t.false(file.includes(".localplayer.dev"), `${file}: File name should not contain .localplayer.dev`); t.true(file === file.toLowerCase(), `${file}: File name should be lowercase`); - + // Ignore root domain - if (file !== "@.json") { + if (!rootDomainFiles.includes(file)) { t.regex( - file.replace(/\.json$/, "") + ".is-a-fullstack.dev|.is-cool.dev|.is-local.org|.is-not-a.dev|.localplayer.dev", + file.replace(/\.json$/, ""), hostnameRegex, `${file}: FQDN must be 1-253 characters, use letters, numbers, dots, or hyphens, and not start or end with a hyphen.` ); From 7c2ca748b73d67ece7330bc9210bfac4e907bd7e Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:42:03 -0500 Subject: [PATCH 23/92] Update json.test.js --- tests/json.test.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index 02092b42..d9af3742 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -19,7 +19,8 @@ const reservedDomainsPath = path.resolve("reserved"); const rootDomainFiles = ["is-a-fullstack.dev.json", "is-cool.dev.json", "is-local.org.json", "is-not-a.dev.json", "localplayer.dev.json"]; const files = fs.readdirSync(domainsPath); const reservedFiles = fs.existsSync(reservedDomainsPath) ? fs.readdirSync(reservedDomainsPath) : []; - + +const Domains = [".is-a-fullstack.dev", ".is-cool.dev", ".is-local.org", ".is-not-a.dev", ".localplayer.dev"] function validateRequiredFields(t, obj, requiredFields, file) { Object.keys(requiredFields).forEach((key) => { @@ -46,16 +47,13 @@ t("All files should be valid JSON", (t) => { }); }); -const Domains = [".is-a-fullstack.dev", ".is-cool.dev", ".is-local.org", ".is-not-a.dev", ".localplayer.dev"] - t("All files should have valid file names", (t) => { files.forEach((file) => { t.true(file.endsWith(".json"), `${file}: File does not have .json extension`); - t.false(file.includes(`${Domains}`), `${file}: File name should not contain .is-a-fullstack.dev`); - t.false(file.includes(".is-cool.dev"), `${file}: File name should not contain .is-cool.dev`); - t.false(file.includes(".is-local.org"), `${file}: File name should not contain .is-local.org`); - t.false(file.includes(".is-not-a.dev"), `${file}: File name should not contain .is-not-a.dev`); - t.false(file.includes(".localplayer.dev"), `${file}: File name should not contain .localplayer.dev`); + + // Check for any unwanted domain in file names + t.false(Domains.some(domain => file.includes(domain)), `${file}: File name should not contain any restricted domain extensions`); + t.true(file === file.toLowerCase(), `${file}: File name should be lowercase`); // Ignore root domain From 9bc8700beafafbce1d9438c3209f7a433fb986c4 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:42:59 -0500 Subject: [PATCH 24/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 2883d0e1..12f8be3e 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -107,11 +107,6 @@ t("All files should have valid record types", (t) => { `${file}: NS records cannot be combined with other records, except for DS records` ); } - - // DS records must be combined with NS records - if (recordKeys.includes("DS")) { - t.true(recordKeys.includes("NS"), `${file}: DS records must be combined with NS records`); - } }); }); From 7afee5c3302e1c6adc609758207cc167f44eb6ec Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:43:22 -0500 Subject: [PATCH 25/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index 12f8be3e..0ceb75e2 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -89,7 +89,7 @@ function isPublicIPv6(ip) { t("All files should have valid record types", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - const recordKeys = Object.keys(data.record); + const recordKeys = Object.keys(data.records); recordKeys.forEach((key) => { t.true(validRecordTypes.includes(key), `${file}: Invalid record type: ${key}`); From c2be28e32621326161732dc477e36f8ac6349f64 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:43:34 -0500 Subject: [PATCH 26/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index 0ceb75e2..ca41df7c 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -114,7 +114,7 @@ t("All files should not have duplicate record keys", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - const recordKeys = Object.keys(data.record); + const recordKeys = Object.keys(data.records); const uniqueRecordKeys = new Set(recordKeys); t.is(recordKeys.length, uniqueRecordKeys.size, `${file}: Duplicate record keys found`); From a01d614c8163848c3fb2e3e0ca214ca96392e028 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:43:50 -0500 Subject: [PATCH 27/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index ca41df7c..c39af8a4 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -125,7 +125,7 @@ t("All files should have valid record values", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - Object.keys(data.record).forEach((key) => { + Object.keys(data.records).forEach((key) => { const value = data.record[key]; // *: string[] From de38e0bc255f77d3f235d9572c23acf7c1854d4f Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:44:04 -0500 Subject: [PATCH 28/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index c39af8a4..1c3a6387 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -126,7 +126,7 @@ t("All files should have valid record values", (t) => { const data = fs.readJsonSync(path.join(domainsPath, file)); Object.keys(data.records).forEach((key) => { - const value = data.record[key]; + const value = data.records[key]; // *: string[] if (["A", "AAAA", "MX", "NS"].includes(key)) { From ad57b298579d894ca7316c87cf43738c0a120e51 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:09:20 -0500 Subject: [PATCH 29/92] skip ci option (Brought over from the is-a.dev file, to keep everything the same/not break) --- .github/workflows/validation.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 716a6a3e..6d9efe54 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -21,6 +21,7 @@ concurrency: jobs: dns: name: DNS + if: "!contains(github.event.head_commit.message, '[skip-ci]')" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -32,6 +33,7 @@ jobs: tests: name: Tests + if: "!contains(github.event.head_commit.message, '[skip-ci]')" runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 4d90223963fab6b06c8889fd8854a33775effbbd Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:11:26 -0500 Subject: [PATCH 30/92] Update json.test.js --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index d9af3742..b8266afb 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -20,7 +20,7 @@ const rootDomainFiles = ["is-a-fullstack.dev.json", "is-cool.dev.json", "is-loca const files = fs.readdirSync(domainsPath); const reservedFiles = fs.existsSync(reservedDomainsPath) ? fs.readdirSync(reservedDomainsPath) : []; -const Domains = [".is-a-fullstack.dev", ".is-cool.dev", ".is-local.org", ".is-not-a.dev", ".localplayer.dev"] +const Domains = [".is-a-fullstack.dev", ".is-cool.dev", ".is-local.org", ".is-not-a.dev", ".localplayer.dev"]; function validateRequiredFields(t, obj, requiredFields, file) { Object.keys(requiredFields).forEach((key) => { From a57c67fbe1b826b1a7fe3b6833aa25161e1dbafb Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:15:58 -0500 Subject: [PATCH 31/92] Update records.test.js --- tests/records.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 1c3a6387..cb18d9a5 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -267,17 +267,17 @@ t("All files should have valid record values", (t) => { } } - // TXT: string | string[] + // TXT: object | object[] if (key === "TXT") { if (Array.isArray(value)) { value.forEach((record) => { t.true( - typeof record === "string", - `${file}: Record value should be a string for ${key} at index ${value.indexOf(record)}` + typeof record === "object", + `${file}: Record value should be a object for ${key} at index ${value.indexOf(record)}` ); }); } else { - t.true(typeof value === "string", `${file}: Record value should be a string for ${key}`); + t.true(typeof value === "object", `${file}: Record value should be a object for ${key}`); } } }); From ad4f600421f1c002fa878b0da753a8b82e67d25b Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sat, 16 Nov 2024 15:39:19 -0500 Subject: [PATCH 32/92] Update tests/records.test.js Co-authored-by: William Harrison <87287585+wdhdev@users.noreply.github.com> --- tests/records.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index cb18d9a5..1c3a6387 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -267,17 +267,17 @@ t("All files should have valid record values", (t) => { } } - // TXT: object | object[] + // TXT: string | string[] if (key === "TXT") { if (Array.isArray(value)) { value.forEach((record) => { t.true( - typeof record === "object", - `${file}: Record value should be a object for ${key} at index ${value.indexOf(record)}` + typeof record === "string", + `${file}: Record value should be a string for ${key} at index ${value.indexOf(record)}` ); }); } else { - t.true(typeof value === "object", `${file}: Record value should be a object for ${key}`); + t.true(typeof value === "string", `${file}: Record value should be a string for ${key}`); } } }); From 776b8f97f9cb530b5ca96ce68b678b5e14557f8c Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sat, 16 Nov 2024 22:55:05 -0500 Subject: [PATCH 33/92] Rename _vercel.is-cool.dev to _vercel.is-cool.dev.json --- domains/{_vercel.is-cool.dev => _vercel.is-cool.dev.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename domains/{_vercel.is-cool.dev => _vercel.is-cool.dev.json} (100%) diff --git a/domains/_vercel.is-cool.dev b/domains/_vercel.is-cool.dev.json similarity index 100% rename from domains/_vercel.is-cool.dev rename to domains/_vercel.is-cool.dev.json From a6ef68d80e5e1f83b47b5c03844d560c243ba091 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:03:35 -0500 Subject: [PATCH 34/92] Rename _vercel.is-cool.dev.json to _vercel.is-cool.dev --- domains/{_vercel.is-cool.dev.json => _vercel.is-cool.dev} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename domains/{_vercel.is-cool.dev.json => _vercel.is-cool.dev} (100%) diff --git a/domains/_vercel.is-cool.dev.json b/domains/_vercel.is-cool.dev similarity index 100% rename from domains/_vercel.is-cool.dev.json rename to domains/_vercel.is-cool.dev From 027869b5a19bf8b2f76e9211d69e506b757e1957 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 12:46:28 -0500 Subject: [PATCH 35/92] Update json.test.js --- tests/json.test.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index b8266afb..ba5f89e7 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -72,7 +72,7 @@ t("All files should have the required fields", (t) => { const data = fs.readJsonSync(path.join(domainsPath, file)); validateRequiredFields(t, data, requiredFields, file); - validateRequiredFields(t, data.owner, requiredOwnerFields, file); + validateRequiredFields(t, data.owner, requiredFields, file); if (!data.reserved) { t.true(Object.keys(data.records).length > 0, `${file}: No record types found`); @@ -85,7 +85,6 @@ t("All files should have valid optional fields", (t) => { const data = fs.readJsonSync(path.join(domainsPath, file)); validateOptionalFields(t, data, optionalFields, file); - validateOptionalFields(t, data.owner, optionalOwnerFields, file); if (data.owner.email) { t.regex(data.owner.email, emailRegex, `${file}: Owner email should be a valid email address`); From e29dbaf9d774a7db17a2efe1a345b4811433e839 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:01:06 -0500 Subject: [PATCH 36/92] Update records.test.js --- tests/records.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 1c3a6387..12f8be3e 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -89,7 +89,7 @@ function isPublicIPv6(ip) { t("All files should have valid record types", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - const recordKeys = Object.keys(data.records); + const recordKeys = Object.keys(data.record); recordKeys.forEach((key) => { t.true(validRecordTypes.includes(key), `${file}: Invalid record type: ${key}`); @@ -114,7 +114,7 @@ t("All files should not have duplicate record keys", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - const recordKeys = Object.keys(data.records); + const recordKeys = Object.keys(data.record); const uniqueRecordKeys = new Set(recordKeys); t.is(recordKeys.length, uniqueRecordKeys.size, `${file}: Duplicate record keys found`); @@ -125,8 +125,8 @@ t("All files should have valid record values", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - Object.keys(data.records).forEach((key) => { - const value = data.records[key]; + Object.keys(data.record).forEach((key) => { + const value = data.record[key]; // *: string[] if (["A", "AAAA", "MX", "NS"].includes(key)) { From cadeae70274ba60f824ae3c2ab1fa7e9e89dbdb4 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:04:55 -0500 Subject: [PATCH 37/92] Update json.test.js --- tests/json.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index ba5f89e7..da99bb7b 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -4,7 +4,7 @@ const path = require("path"); const requiredFields = { owner: "object", - records: "object" + record: "object" }; const optionalOwnerFields = { @@ -75,7 +75,7 @@ t("All files should have the required fields", (t) => { validateRequiredFields(t, data.owner, requiredFields, file); if (!data.reserved) { - t.true(Object.keys(data.records).length > 0, `${file}: No record types found`); + t.true(Object.keys(data.record).length > 0, `${file}: No record types found`); } }); }); From 306cb4540364af3c52d7dd95fe37115ab563d562 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:05:29 -0500 Subject: [PATCH 38/92] Update proxy.test.js --- tests/proxy.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/proxy.test.js b/tests/proxy.test.js index 28895ad1..4c5bfa43 100644 --- a/tests/proxy.test.js +++ b/tests/proxy.test.js @@ -6,7 +6,7 @@ const requiredRecordsToProxy = ["A", "AAAA", "CNAME"]; function validateProxiedRecords(t, data, file) { if (data.proxied) { - const hasProxiedRecord = Object.keys(data.records).some((key) => requiredRecordsToProxy.includes(key)); + const hasProxiedRecord = Object.keys(data.record).some((key) => requiredRecordsToProxy.includes(key)); t.true(hasProxiedRecord, `${file}: Proxied is true but there are no records that can be proxied`); } From 53d56fac84c658539ad1afcd49b4a174e2ee9a98 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:09:07 -0500 Subject: [PATCH 39/92] Update discog.localplayer.dev.json --- domains/discog.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/discog.localplayer.dev.json b/domains/discog.localplayer.dev.json index 2fb498c5..e1acbf45 100644 --- a/domains/discog.localplayer.dev.json +++ b/domains/discog.localplayer.dev.json @@ -8,7 +8,7 @@ }, "record": { - "URL": "https://discog.opensourceforce.net" + "CNAME": "discog.opensourceforce.net" }, "proxied": false From 7df7c1f41342073c977e9b2a1aea425787a82a65 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:12:35 -0500 Subject: [PATCH 40/92] Update hotcocoa.is-local.org.json --- domains/hotcocoa.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/hotcocoa.is-local.org.json b/domains/hotcocoa.is-local.org.json index 8952c0d5..ea992253 100644 --- a/domains/hotcocoa.is-local.org.json +++ b/domains/hotcocoa.is-local.org.json @@ -10,7 +10,7 @@ }, "record": { - "CNAME": ["site.namedhosting.com"] + "CNAME": "site.namedhosting.com" }, "proxied": false From b01a9d746efd4146772bdc2e0dbdff0188b7db68 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:19:14 -0500 Subject: [PATCH 41/92] Update json.test.js Fix to some errors maybe. --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index da99bb7b..52437f26 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -3,7 +3,7 @@ const fs = require("fs-extra"); const path = require("path"); const requiredFields = { - owner: "object", + //owner: "object", record: "object" }; From 982c7718df648169fb378f3fa585ae7347395cc9 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:27:00 -0500 Subject: [PATCH 42/92] Update json.test.js --- tests/json.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index 52437f26..ff803b2f 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -80,11 +80,11 @@ t("All files should have the required fields", (t) => { }); }); -t("All files should have valid optional fields", (t) => { +t("All files should have valid optional owner fields", (t) => { files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); - validateOptionalFields(t, data, optionalFields, file); + validateOptionalFields(t, data, optionalOwnerFields, file); if (data.owner.email) { t.regex(data.owner.email, emailRegex, `${file}: Owner email should be a valid email address`); From d460c2b981b72da9827fa263018fb642a3133099 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:28:52 -0500 Subject: [PATCH 43/92] Update json.test.js --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index ff803b2f..e21b74d0 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -72,7 +72,7 @@ t("All files should have the required fields", (t) => { const data = fs.readJsonSync(path.join(domainsPath, file)); validateRequiredFields(t, data, requiredFields, file); - validateRequiredFields(t, data.owner, requiredFields, file); + //validateRequiredFields(t, data.owner, requiredFields, file); if (!data.reserved) { t.true(Object.keys(data.record).length > 0, `${file}: No record types found`); From 94429c2e4a1d7b455e8b0b627bd96ebc67b5f914 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:06:24 -0500 Subject: [PATCH 44/92] Update raph-vps.is-local.org.json --- domains/raph-vps.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/raph-vps.is-local.org.json b/domains/raph-vps.is-local.org.json index ab77e326..69022457 100644 --- a/domains/raph-vps.is-local.org.json +++ b/domains/raph-vps.is-local.org.json @@ -11,7 +11,7 @@ "record": { "A": ["213.165.82.45"], "MX": ["raph-vps.is-local.org"], - "SPF": "v=spf1 ip4:213.165.82.45 -all" + "TXT": "v=spf1 ip4:213.165.82.45 -all" }, "proxied": false From 748a384b6840f8940dfbd4f0054a7be74c69c9dc Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:10:16 -0500 Subject: [PATCH 45/92] Revert --- domains/raph-vps.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/raph-vps.is-local.org.json b/domains/raph-vps.is-local.org.json index 69022457..ab77e326 100644 --- a/domains/raph-vps.is-local.org.json +++ b/domains/raph-vps.is-local.org.json @@ -11,7 +11,7 @@ "record": { "A": ["213.165.82.45"], "MX": ["raph-vps.is-local.org"], - "TXT": "v=spf1 ip4:213.165.82.45 -all" + "SPF": "v=spf1 ip4:213.165.82.45 -all" }, "proxied": false From 5299a26dc549424645f029ee854bba5508cf012d Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:12:15 -0500 Subject: [PATCH 46/92] Update records.test.js --- tests/records.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 12f8be3e..515a06f0 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -2,7 +2,7 @@ const t = require("ava"); const fs = require("fs-extra"); const path = require("path"); -const validRecordTypes = ["A", "AAAA", "CAA", "CNAME", "MX", "NS", "PTR", "SRV", "TXT"]; +const validRecordTypes = ["A", "AAAA", "CAA", "CNAME", "MX", "NS", "SPF", "SRV", "TXT"]; const hostnameRegex = /^(?=.{1,253}$)(?:(?:[_a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)\.)+[a-zA-Z]{2,63}$/; const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}$/; @@ -267,8 +267,8 @@ t("All files should have valid record values", (t) => { } } - // TXT: string | string[] - if (key === "TXT") { + // TXT|SPF: string | string[] + if (["SPF", "TXT"].includes(key)) { if (Array.isArray(value)) { value.forEach((record) => { t.true( From a2cc936aeaba17587f852aff56816806f03e5bc2 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:30:10 -0500 Subject: [PATCH 47/92] chore: Adding back labels --- .github/workflows/validation.yml | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 6d9efe54..13aeb2c2 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -26,6 +26,45 @@ jobs: steps: - uses: actions/checkout@v4 + - id: create_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} + + - name: Check DNS + id: dns_check + uses: koenrh/dnscontrol-action@v3 + with: + args: check + config_file: "dnsconfig.js" + + - name: Add Validated DNS Label + if: ${{ steps.dns_check.outcome == 'success' }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Validated DNS" + github_token: ${{ steps.create_token.outputs.token }} + - name: Remove Invalid DNS Label + if: ${{ steps.dns_check.outcome == 'success' }} + uses: actions-ecosystem/action-remove-labels@v1 + with: + labels: "Invalid DNS" + github_token: ${{ steps.create_token.outputs.token }} + + - name: Add Invalid DNS Label + if: ${{ failure() }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Invalid DNS" + github_token: ${{ steps.create_token.outputs.token }} + - name: Remove Validated DNS Label + if: ${{ failure() }} + uses: actions-ecosystem/action-remove-labels@v1 + with: + labels: "Validated DNS" + github_token: ${{ steps.create_token.outputs.token }} + - name: Check uses: is-a-dev/dnscontrol-action@main with: From 0f4ac2d5630431373be6fcf2898eb3df594c29c1 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:51:19 -0500 Subject: [PATCH 48/92] Update validation.yml --- .github/workflows/validation.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 13aeb2c2..e040241a 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -34,7 +34,7 @@ jobs: - name: Check DNS id: dns_check - uses: koenrh/dnscontrol-action@v3 + uses: is-a-dev/dnscontrol-action@main with: args: check config_file: "dnsconfig.js" @@ -65,10 +65,6 @@ jobs: labels: "Validated DNS" github_token: ${{ steps.create_token.outputs.token }} - - name: Check - uses: is-a-dev/dnscontrol-action@main - with: - args: check tests: name: Tests From 596e67c29671a0369d9e25ed1a2872f1abe1c016 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 14:58:54 -0500 Subject: [PATCH 49/92] Update validation.yml --- .github/workflows/validation.yml | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index e040241a..6a642043 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -65,7 +65,54 @@ jobs: labels: "Validated DNS" github_token: ${{ steps.create_token.outputs.token }} + json: + name: JSON + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + - id: create_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} + + - name: JSON Syntax Check + id: json_check + uses: limitusus/json-syntax-check@v2 + with: + pattern: "\\.json$" + env: + BASE: "domains/" + + - name: Add Validated JSON Label + if: ${{ steps.json_check.outcome == 'success' }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Validated JSON" + github_token: ${{ steps.create_token.outputs.token }} + - name: Remove Invalid JSON Label + if: ${{ steps.json_check.outcome == 'success' }} + uses: actions-ecosystem/action-remove-labels@v1 + with: + labels: "Invalid JSON" + github_token: ${{ steps.create_token.outputs.token }} + + - name: Add Invalid JSON Label + if: ${{ failure() }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Invalid JSON" + github_token: ${{ steps.create_token.outputs.token }} + - name: Remove Validated JSON Label + if: ${{ failure() }} + uses: actions-ecosystem/action-remove-labels@v1 + with: + labels: "Validated JSON" + github_token: ${{ steps.create_token.outputs.token }} + tests: name: Tests if: "!contains(github.event.head_commit.message, '[skip-ci]')" From 2dedbc62eeeeaf1962c45323d7530129e36f01d1 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:00:25 -0500 Subject: [PATCH 50/92] Update midnight.localplayer.dev.json --- domains/midnight.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/midnight.localplayer.dev.json b/domains/midnight.localplayer.dev.json index 45c7f1b1..6b8871c8 100644 --- a/domains/midnight.localplayer.dev.json +++ b/domains/midnight.localplayer.dev.json @@ -9,7 +9,7 @@ }, "record": { - "CNAME": ["013c5987-dd17-459e-9cbc-d94ae0540f0e.id.repl.co"] + "CNAME": "013c5987-dd17-459e-9cbc-d94ae0540f0e.id.repl.co" }, "proxied": false From f1777719d15f471688a616d6fd44c142144bb67a Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:34:35 -0500 Subject: [PATCH 51/92] Update json.test.js --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index e21b74d0..1c6e2414 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -52,7 +52,7 @@ t("All files should have valid file names", (t) => { t.true(file.endsWith(".json"), `${file}: File does not have .json extension`); // Check for any unwanted domain in file names - t.false(Domains.some(domain => file.includes(domain)), `${file}: File name should not contain any restricted domain extensions`); + t.false(Domains.some(domain => file.endsWith(domain + ".json")), `${file}: File name should not contain restricted domain extensions`); t.true(file === file.toLowerCase(), `${file}: File name should be lowercase`); From daad98579dc3712eeb2ea02feed228f3f217ddff Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:42:32 -0500 Subject: [PATCH 52/92] Update *.devhat.localplayer.dev.json --- domains/*.devhat.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/*.devhat.localplayer.dev.json b/domains/*.devhat.localplayer.dev.json index fecbe704..4f31b1a6 100644 --- a/domains/*.devhat.localplayer.dev.json +++ b/domains/*.devhat.localplayer.dev.json @@ -10,5 +10,5 @@ "TXT": ["zoho-verification=zb65903823.zmverify.zoho.in"] }, - "proxied": true + "proxied": false } From 378bcb0d5c318bb680e9ff1e2526c46a213c3bec Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:47:23 -0500 Subject: [PATCH 53/92] Update _github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json --- ...hub-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json b/domains/_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json index c7cb31e5..3dc210eb 100644 --- a/domains/_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json +++ b/domains/_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json @@ -12,5 +12,5 @@ "TXT": ["76e43257be0fa58011fb122c38f31a"] }, - "proxied": true + "proxied": false } From 0986e6d5d047cc8f4c84f69c80b5620767394889 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:55:48 -0500 Subject: [PATCH 54/92] Update json.test.js --- tests/json.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/json.test.js b/tests/json.test.js index 1c6e2414..1bb664aa 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -81,6 +81,10 @@ t("All files should have the required fields", (t) => { }); t("All files should have valid optional owner fields", (t) => { + const files = fs.readdirSync(domainsPath).filter(file => { + const filePath = path.join(domainsPath, file); + return fs.lstatSync(filePath).isFile(); // Only include files + }); files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); From 064fc662215ac717ac70151f8a7149124d680d97 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:57:13 -0500 Subject: [PATCH 55/92] Update json.test.js --- tests/json.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/json.test.js b/tests/json.test.js index 1bb664aa..bd59eb35 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -68,6 +68,10 @@ t("All files should have valid file names", (t) => { }); t("All files should have the required fields", (t) => { + const files = fs.readdirSync(domainsPath).filter(file => { + const filePath = path.join(domainsPath, file); + return fs.lstatSync(filePath).isFile(); // Only include files + }); files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); From f3b6d4d1e796f079546d279b0d4873127b8322e0 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:00:24 -0500 Subject: [PATCH 56/92] Update json.test.js --- tests/json.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index bd59eb35..f1bd162c 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -70,7 +70,7 @@ t("All files should have valid file names", (t) => { t("All files should have the required fields", (t) => { const files = fs.readdirSync(domainsPath).filter(file => { const filePath = path.join(domainsPath, file); - return fs.lstatSync(filePath).isFile(); // Only include files + return fs.lstatSync(filePath).isFile(); // Ensure only files are included }); files.forEach((file) => { const data = fs.readJsonSync(path.join(domainsPath, file)); From 0c5b45f901476ae08da4d756a4cb6592aacaf40f Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:05:49 -0500 Subject: [PATCH 57/92] Update json.test.js --- tests/json.test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/json.test.js b/tests/json.test.js index f1bd162c..1617282c 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -42,6 +42,12 @@ function validateOptionalFields(t, obj, optionalFields, file) { } t("All files should be valid JSON", (t) => { + const reservedFiles = fs.existsSync(reservedDomainsPath) + ? fs.readdirSync(reservedDomainsPath).filter(file => { + const filePath = path.join(reservedDomainsPath, file); + return fs.lstatSync(filePath).isFile(); // Only include files + }) + : []; files.forEach((file) => { t.notThrows(() => fs.readJsonSync(path.join(domainsPath, file)), `${file}: Invalid JSON file`); }); From 2a1d126ee98d1fbaa2bf26cad01624db99358767 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:18:28 -0500 Subject: [PATCH 58/92] Update json.test.js --- tests/json.test.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/json.test.js b/tests/json.test.js index 1617282c..ff4284a3 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -45,9 +45,16 @@ t("All files should be valid JSON", (t) => { const reservedFiles = fs.existsSync(reservedDomainsPath) ? fs.readdirSync(reservedDomainsPath).filter(file => { const filePath = path.join(reservedDomainsPath, file); - return fs.lstatSync(filePath).isFile(); // Only include files + try { + // Ensure the file is not a directory or symbolic link + return fs.statSync(filePath).isFile(); + } catch (err) { + console.error(`Error reading reserved file: ${filePath}`, err); + return false; // Skip any errors + } }) : []; + files.forEach((file) => { t.notThrows(() => fs.readJsonSync(path.join(domainsPath, file)), `${file}: Invalid JSON file`); }); From e20cf2d5c1a6036062afec746b9d13ea9a56d154 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:24:26 -0500 Subject: [PATCH 59/92] Update json.test.js --- tests/json.test.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/json.test.js b/tests/json.test.js index ff4284a3..f1bd162c 100644 --- a/tests/json.test.js +++ b/tests/json.test.js @@ -42,19 +42,6 @@ function validateOptionalFields(t, obj, optionalFields, file) { } t("All files should be valid JSON", (t) => { - const reservedFiles = fs.existsSync(reservedDomainsPath) - ? fs.readdirSync(reservedDomainsPath).filter(file => { - const filePath = path.join(reservedDomainsPath, file); - try { - // Ensure the file is not a directory or symbolic link - return fs.statSync(filePath).isFile(); - } catch (err) { - console.error(`Error reading reserved file: ${filePath}`, err); - return false; // Skip any errors - } - }) - : []; - files.forEach((file) => { t.notThrows(() => fs.readJsonSync(path.join(domainsPath, file)), `${file}: Invalid JSON file`); }); From 118390410760a7bc310eea3910f0a4d07cefc2f7 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:29:50 -0500 Subject: [PATCH 60/92] Update records.test.js --- tests/records.test.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 515a06f0..8bc71001 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -86,9 +86,22 @@ function isPublicIPv6(ip) { ); } +const files = fs.readdirSync(domainsPath); + +function isDirectory(filePath) { + return fs.lstatSync(filePath).isDirectory(); +} + t("All files should have valid record types", (t) => { files.forEach((file) => { - const data = fs.readJsonSync(path.join(domainsPath, file)); + const filePath = path.join(domainsPath, file); + + // Skip directories + if (isDirectory(filePath)) { + return; + } + + const data = fs.readJsonSync(filePath); const recordKeys = Object.keys(data.record); recordKeys.forEach((key) => { @@ -97,7 +110,7 @@ t("All files should have valid record types", (t) => { // CNAME records cannot be combined with any other record type if (recordKeys.includes("CNAME")) { - t.is(recordKeys.length, Number(1), `${file}: CNAME records cannot be combined with other records`); + t.is(recordKeys.length, 1, `${file}: CNAME records cannot be combined with other records`); } // NS records cannot be combined with any other record type, except for DS records From 654f8c4cd154bc6de5260b097453637924db4381 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:31:19 -0500 Subject: [PATCH 61/92] Update records.test.js --- tests/records.test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index 8bc71001..2c2ccbff 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -86,8 +86,6 @@ function isPublicIPv6(ip) { ); } -const files = fs.readdirSync(domainsPath); - function isDirectory(filePath) { return fs.lstatSync(filePath).isDirectory(); } From eb9f00c97a77518d76e5973b8c2c10fac6718795 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:33:15 -0500 Subject: [PATCH 62/92] Update records.test.js --- tests/records.test.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/records.test.js b/tests/records.test.js index 2c2ccbff..aeb25e9a 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -121,9 +121,20 @@ t("All files should have valid record types", (t) => { }); }); +function isDirectory(filePath) { + return fs.lstatSync(filePath).isDirectory(); +} + t("All files should not have duplicate record keys", (t) => { files.forEach((file) => { - const data = fs.readJsonSync(path.join(domainsPath, file)); + const filePath = path.join(domainsPath, file); + + // Skip directories + if (isDirectory(filePath)) { + return; + } + + const data = fs.readJsonSync(filePath); const recordKeys = Object.keys(data.record); const uniqueRecordKeys = new Set(recordKeys); From be09e47c82b3f943c123a1b9cd09311d49c112e1 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:36:19 -0500 Subject: [PATCH 63/92] Update records.test.js --- tests/records.test.js | 45 ++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/tests/records.test.js b/tests/records.test.js index aeb25e9a..1a447696 100644 --- a/tests/records.test.js +++ b/tests/records.test.js @@ -145,7 +145,14 @@ t("All files should not have duplicate record keys", (t) => { t("All files should have valid record values", (t) => { files.forEach((file) => { - const data = fs.readJsonSync(path.join(domainsPath, file)); + const filePath = path.join(domainsPath, file); + + // Skip directories + if (isDirectory(filePath)) { + return; + } + + const data = fs.readJsonSync(filePath); Object.keys(data.record).forEach((key) => { const value = data.record[key]; @@ -164,16 +171,12 @@ t("All files should have valid record values", (t) => { t.regex( record, ipv4Regex, - `${file}: Record value should be a valid IPv4 address for ${key} at index ${value.indexOf( - record - )}` + `${file}: Record value should be a valid IPv4 address for ${key} at index ${value.indexOf(record)}` ); t.true( isPublicIPv4(record, data.proxied), - `${file}: Record value should be a public IPv4 address for ${key} at index ${value.indexOf( - record - )}` + `${file}: Record value should be a public IPv4 address for ${key} at index ${value.indexOf(record)}` ); }); } @@ -184,16 +187,12 @@ t("All files should have valid record values", (t) => { t.regex( expandIPv6(record), ipv6Regex, - `${file}: Record value should be a valid IPv6 address for ${key} at index ${value.indexOf( - record - )}` + `${file}: Record value should be a valid IPv6 address for ${key} at index ${value.indexOf(record)}` ); t.true( isPublicIPv6(record), - `${file}: Record value should be a public IPv6 address for ${key} at index ${value.indexOf( - record - )}` + `${file}: Record value should be a public IPv6 address for ${key} at index ${value.indexOf(record)}` ); }); } @@ -204,9 +203,7 @@ t("All files should have valid record values", (t) => { t.regex( record, hostnameRegex, - `${file}: Record value should be a valid hostname for ${key} at index ${value.indexOf( - record - )}` + `${file}: Record value should be a valid hostname for ${key} at index ${value.indexOf(record)}` ); }); } @@ -254,16 +251,12 @@ t("All files should have valid record values", (t) => { value.forEach((record) => { t.true( typeof record.priority === "number", - `${file}: SRV record value should have a number for priority at index ${value.indexOf( - record - )}` + `${file}: SRV record value should have a number for priority at index ${value.indexOf(record)}` ); t.true( typeof record.weight === "number", - `${file}: SRV record value should have a number for weight at index ${value.indexOf( - record - )}` + `${file}: SRV record value should have a number for weight at index ${value.indexOf(record)}` ); t.true( @@ -273,17 +266,13 @@ t("All files should have valid record values", (t) => { t.true( typeof record.target === "string", - `${file}: SRV record value should have a string for target at index ${value.indexOf( - record - )}` + `${file}: SRV record value should have a string for target at index ${value.indexOf(record)}` ); t.regex( value.target, hostnameRegex, - `${file}: SRV record value should be a valid hostname for target at index ${value.indexOf( - record - )}` + `${file}: SRV record value should be a valid hostname for target at index ${value.indexOf(record)}` ); }); } From 6fd20b1c7d688f5ef29fc3b2a71a5e65c77b45d9 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:40:03 -0500 Subject: [PATCH 64/92] Update domains.test.js --- tests/domains.test.js | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/domains.test.js b/tests/domains.test.js index eddb7833..593046c4 100644 --- a/tests/domains.test.js +++ b/tests/domains.test.js @@ -7,12 +7,20 @@ const files = fs.readdirSync(domainsPath); t("Nested subdomains should not exist without a parent subdomain", (t) => { files.forEach((file) => { + // Skip directories and process only .json files + const filePath = path.join(domainsPath, file); + if (fs.lstatSync(filePath).isDirectory()) { + return; // Skip directories + } + const subdomain = file.replace(".json", ""); if (subdomain.split(".").length > 1) { const parentSubdomain = subdomain.split(".").pop(); - - t.true(files.includes(`${parentSubdomain}.json`), `${file}: Parent subdomain does not exist`); + t.true( + files.includes(`${parentSubdomain}.json`), + `${file}: Parent subdomain does not exist` + ); } }); @@ -21,13 +29,25 @@ t("Nested subdomains should not exist without a parent subdomain", (t) => { t("Nested subdomains should not exist if the parent subdomain has NS records", (t) => { files.forEach((file) => { + // Skip directories and process only .json files + const filePath = path.join(domainsPath, file); + if (fs.lstatSync(filePath).isDirectory()) { + return; // Skip directories + } + const subdomain = file.replace(".json", ""); if (subdomain.split(".").length > 1) { const parentSubdomain = subdomain.split(".").pop(); - const parentDomain = fs.readJsonSync(path.join(domainsPath, `${parentSubdomain}.json`)); + const parentFilePath = path.join(domainsPath, `${parentSubdomain}.json`); - t.is(parentDomain.record.NS, undefined, `${file}: Parent subdomain has NS records`); + // Check if the parent file exists before attempting to read it + if (fs.existsSync(parentFilePath)) { + const parentDomain = fs.readJsonSync(parentFilePath); + t.is(parentDomain.record.NS, undefined, `${file}: Parent subdomain has NS records`); + } else { + t.fail(`${parentSubdomain}.json file does not exist`); + } } }); From a9842fb109c22151ac343f3f87861a3431848fa8 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:42:57 -0500 Subject: [PATCH 65/92] Update domains.test.js --- tests/domains.test.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/domains.test.js b/tests/domains.test.js index 593046c4..8cb68033 100644 --- a/tests/domains.test.js +++ b/tests/domains.test.js @@ -16,10 +16,13 @@ t("Nested subdomains should not exist without a parent subdomain", (t) => { const subdomain = file.replace(".json", ""); if (subdomain.split(".").length > 1) { - const parentSubdomain = subdomain.split(".").pop(); + // Get parent domain by removing the last part (subdomain) from the full subdomain + const parentSubdomain = subdomain.split(".").slice(1).join("."); + + // Ensure the parent subdomain exists t.true( files.includes(`${parentSubdomain}.json`), - `${file}: Parent subdomain does not exist` + `${file}: Parent subdomain ${parentSubdomain}.json does not exist` ); } }); @@ -38,7 +41,9 @@ t("Nested subdomains should not exist if the parent subdomain has NS records", ( const subdomain = file.replace(".json", ""); if (subdomain.split(".").length > 1) { - const parentSubdomain = subdomain.split(".").pop(); + // Get parent domain by removing the last part (subdomain) from the full subdomain + const parentSubdomain = subdomain.split(".").slice(1).join("."); + const parentFilePath = path.join(domainsPath, `${parentSubdomain}.json`); // Check if the parent file exists before attempting to read it From 9bd0e6d895e168af733a98fb9fe328152404631a Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 17:33:31 -0500 Subject: [PATCH 66/92] Update zemerik.is-cool.dev.json --- domains/zemerik.is-cool.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/zemerik.is-cool.dev.json b/domains/zemerik.is-cool.dev.json index 0cb8efab..8b9affea 100644 --- a/domains/zemerik.is-cool.dev.json +++ b/domains/zemerik.is-cool.dev.json @@ -9,7 +9,7 @@ }, "record": { - "URL": "https://zemerik.is-a.dev" + "CNAME": "zemerik.is-a.dev" }, "proxied": false From c5451e107fd777e6f5553cb9d00aff2dc6bf8738 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 17:34:38 -0500 Subject: [PATCH 67/92] Update sig1._domainkey.sure.is-cool.dev.json --- domains/sig1._domainkey.sure.is-cool.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/sig1._domainkey.sure.is-cool.dev.json b/domains/sig1._domainkey.sure.is-cool.dev.json index 48095fde..2c54a9fe 100644 --- a/domains/sig1._domainkey.sure.is-cool.dev.json +++ b/domains/sig1._domainkey.sure.is-cool.dev.json @@ -8,7 +8,7 @@ }, "record": { - "CNAME": ["sig1.dkim.sure.is-cool.dev.at.icloudmailadmin.com"] + "CNAME": "sig1.dkim.sure.is-cool.dev.at.icloudmailadmin.com" }, "proxied": false From 8bef93cfbaba02767c4969aff319ec155d908ef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Ckyro3400=E2=80=9D?= <“jon@danbot.host”> Date: Sun, 17 Nov 2024 22:55:16 +0000 Subject: [PATCH 68/92] Renames --- domain-fix.js | 29 +++++++++++++++++++ ...-cool.dev.json => 0xrinx.is-cool.dev.json} | 0 ...ancoconut.arabiancoconut.is-cool.dev.json} | 0 ...lai.aryaejoumalai.is-a-fullstack.dev.json} | 0 ...allenge-arzejames.wacky.is-not-a.dev.json} | 0 ...s-challenge-atlasl1.htc.is-local.org.json} | 0 ...-challenge-atlasl1.imag.is-local.org.json} | 0 ...hallenge-atlasl1.shrimp.is-not-a.dev.json} | 0 ...-challenge-clay990.suraj.is-cool.dev.json} | 0 ...e-crowncoins.crowncoins.is-local.org.json} | 0 ...es-challenge-csajays.vp.is-local.org.json} | 0 ...lenge-davidaprilio.david.is-cool.dev.json} | 0 ...nge-dev-ajay-sahani.ajay.is-cool.dev.json} | 0 ...llenge-dragon-dima.drago.is-cool.dev.json} | 0 ...ge-getsono.alex-gitarre.is-local.org.json} | 0 ...ks-magazin.keks-magazin.is-local.org.json} | 0 ...enge-lighthostingfree.lh.is-cool.dev.json} | 0 ...ghthostingfree.lightarea.is-cool.dev.json} | 0 ...ge-mani-cwaf.mani.is-a-fullstack.dev.json} | 0 ...mukujhansi.gunman.is-a-fullstack.dev.json} | 0 ...enge-nanduwastaken.nandu.is-cool.dev.json} | 0 ...hallenge-narmis-e.narmis.is-cool.dev.json} | 0 ...ionname.climatehealthei.is-local.org.json} | 0 ...nge-oshekharo.alternate.is-local.org.json} | 0 ...llenge-real-yash.vamika.is-local.org.json} | 0 ...allenge-sc136.ironflake.is-local.org.json} | 0 ...shadowhero.skyshadowhero.is-cool.dev.json} | 0 ...lenge-soumikcoder.soumik.is-cool.dev.json} | 0 ...enge-tdevteam.thedevteam.is-cool.dev.json} | 0 ...s-challenge-the-coding-empire.coding.json} | 0 ...-theflashspeedster.flash.is-cool.dev.json} | 0 ...llenge-yesnielx.yesnielx.is-cool.dev.json} | 0 ...ol.dev.json => aleksyeus.is-cool.dev.json} | 0 ...yer.dev.json => rbfl.localplayer.dev.json} | 0 34 files changed, 29 insertions(+) create mode 100644 domain-fix.js rename domains/{0xRinx.is-cool.dev.json => 0xrinx.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-ArabianCoconut.arabiancoconut.is-cool.dev.json => _github-pages-challenge-arabiancoconut.arabiancoconut.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-AryaEjoumalai.aryaejoumalai.is-a-fullstack.dev.json => _github-pages-challenge-aryaejoumalai.aryaejoumalai.is-a-fullstack.dev.json} (100%) rename domains/{_github-pages-challenge-Arzejames.wacky.is-not-a.dev.json => _github-pages-challenge-arzejames.wacky.is-not-a.dev.json} (100%) rename domains/{_github-pages-challenge-AtlasL1.htc.is-local.org.json => _github-pages-challenge-atlasl1.htc.is-local.org.json} (100%) rename domains/{_github-pages-challenge-AtlasL1.imag.is-local.org.json => _github-pages-challenge-atlasl1.imag.is-local.org.json} (100%) rename domains/{_github-pages-challenge-AtlasL1.shrimp.is-not-a.dev.json => _github-pages-challenge-atlasl1.shrimp.is-not-a.dev.json} (100%) rename domains/{_github-pages-challenge-Clay990.suraj.is-cool.dev.json => _github-pages-challenge-clay990.suraj.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-CrownCoins.crowncoins.is-local.org.json => _github-pages-challenge-crowncoins.crowncoins.is-local.org.json} (100%) rename domains/{_github-pages-challenge-CsAjayS.vp.is-local.org.json => _github-pages-challenge-csajays.vp.is-local.org.json} (100%) rename domains/{_github-pages-challenge-Davidaprilio.david.is-cool.dev.json => _github-pages-challenge-davidaprilio.david.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-Dev-Ajay-sahani.ajay.is-cool.dev.json => _github-pages-challenge-dev-ajay-sahani.ajay.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-Dragon-Dima.drago.is-cool.dev.json => _github-pages-challenge-dragon-dima.drago.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-getSono.alex-gitarre.is-local.org.json => _github-pages-challenge-getsono.alex-gitarre.is-local.org.json} (100%) rename domains/{_github-pages-challenge-Keks-Magazin.keks-magazin.is-local.org.json => _github-pages-challenge-keks-magazin.keks-magazin.is-local.org.json} (100%) rename domains/{_github-pages-challenge-LightHostingFree.lh.is-cool.dev.json => _github-pages-challenge-lighthostingfree.lh.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-LightHostingFree.lightarea.is-cool.dev.json => _github-pages-challenge-lighthostingfree.lightarea.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-Mani-cwaf.mani.is-a-fullstack.dev.json => _github-pages-challenge-mani-cwaf.mani.is-a-fullstack.dev.json} (100%) rename domains/{_github-pages-challenge-MukuJhansi.gunman.is-a-fullstack.dev.json => _github-pages-challenge-mukujhansi.gunman.is-a-fullstack.dev.json} (100%) rename domains/{_github-pages-challenge-NanduWasTaken.nandu.is-cool.dev.json => _github-pages-challenge-nanduwastaken.nandu.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-Narmis-E.narmis.is-cool.dev.json => _github-pages-challenge-narmis-e.narmis.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-OpenOrganizationName.climatehealthei.is-local.org.json => _github-pages-challenge-openorganizationname.climatehealthei.is-local.org.json} (100%) rename domains/{_github-pages-challenge-OshekharO.alternate.is-local.org.json => _github-pages-challenge-oshekharo.alternate.is-local.org.json} (100%) rename domains/{_github-pages-challenge-Real-Yash.vamika.is-local.org.json => _github-pages-challenge-real-yash.vamika.is-local.org.json} (100%) rename domains/{_github-pages-challenge-SC136.ironflake.is-local.org.json => _github-pages-challenge-sc136.ironflake.is-local.org.json} (100%) rename domains/{_github-pages-challenge-SkyShadowHero.skyshadowhero.is-cool.dev.json => _github-pages-challenge-skyshadowhero.skyshadowhero.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-Soumikcoder.soumik.is-cool.dev.json => _github-pages-challenge-soumikcoder.soumik.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-TDevTeam.thedevteam.is-cool.dev.json => _github-pages-challenge-tdevteam.thedevteam.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-The-Coding-Empire.coding.json => _github-pages-challenge-the-coding-empire.coding.json} (100%) rename domains/{_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json => _github-pages-challenge-theflashspeedster.flash.is-cool.dev.json} (100%) rename domains/{_github-pages-challenge-YesnielX.yesnielx.is-cool.dev.json => _github-pages-challenge-yesnielx.yesnielx.is-cool.dev.json} (100%) rename domains/{Aleksyeus.is-cool.dev.json => aleksyeus.is-cool.dev.json} (100%) rename domains/{Rbfl.localplayer.dev.json => rbfl.localplayer.dev.json} (100%) diff --git a/domain-fix.js b/domain-fix.js new file mode 100644 index 00000000..4ae88779 --- /dev/null +++ b/domain-fix.js @@ -0,0 +1,29 @@ +const fs = require("fs"); +const path = require("path"); + +const directoryPath = path.join(__dirname, "domains"); + +(async () => { + try { + // Read the files in the 'domains' directory + const files = await fs.promises.readdir(directoryPath); + + let renamedCount = 0; + + for (const file of files) { + const oldPath = path.join(directoryPath, file); + const newPath = path.join(directoryPath, file.toLowerCase()); + + // Only rename if the file name is not already in lowercase + if (oldPath !== newPath) { + await fs.promises.rename(oldPath, newPath); + console.log(`Renamed: ${file} -> ${file.toLowerCase()}`); + renamedCount++; + } + } + + console.log(`Finished! Renamed ${renamedCount} out of ${files.length} files.`); + } catch (err) { + console.error("Error:", err); + } +})(); \ No newline at end of file diff --git a/domains/0xRinx.is-cool.dev.json b/domains/0xrinx.is-cool.dev.json similarity index 100% rename from domains/0xRinx.is-cool.dev.json rename to domains/0xrinx.is-cool.dev.json diff --git a/domains/_github-pages-challenge-ArabianCoconut.arabiancoconut.is-cool.dev.json b/domains/_github-pages-challenge-arabiancoconut.arabiancoconut.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-ArabianCoconut.arabiancoconut.is-cool.dev.json rename to domains/_github-pages-challenge-arabiancoconut.arabiancoconut.is-cool.dev.json diff --git a/domains/_github-pages-challenge-AryaEjoumalai.aryaejoumalai.is-a-fullstack.dev.json b/domains/_github-pages-challenge-aryaejoumalai.aryaejoumalai.is-a-fullstack.dev.json similarity index 100% rename from domains/_github-pages-challenge-AryaEjoumalai.aryaejoumalai.is-a-fullstack.dev.json rename to domains/_github-pages-challenge-aryaejoumalai.aryaejoumalai.is-a-fullstack.dev.json diff --git a/domains/_github-pages-challenge-Arzejames.wacky.is-not-a.dev.json b/domains/_github-pages-challenge-arzejames.wacky.is-not-a.dev.json similarity index 100% rename from domains/_github-pages-challenge-Arzejames.wacky.is-not-a.dev.json rename to domains/_github-pages-challenge-arzejames.wacky.is-not-a.dev.json diff --git a/domains/_github-pages-challenge-AtlasL1.htc.is-local.org.json b/domains/_github-pages-challenge-atlasl1.htc.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-AtlasL1.htc.is-local.org.json rename to domains/_github-pages-challenge-atlasl1.htc.is-local.org.json diff --git a/domains/_github-pages-challenge-AtlasL1.imag.is-local.org.json b/domains/_github-pages-challenge-atlasl1.imag.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-AtlasL1.imag.is-local.org.json rename to domains/_github-pages-challenge-atlasl1.imag.is-local.org.json diff --git a/domains/_github-pages-challenge-AtlasL1.shrimp.is-not-a.dev.json b/domains/_github-pages-challenge-atlasl1.shrimp.is-not-a.dev.json similarity index 100% rename from domains/_github-pages-challenge-AtlasL1.shrimp.is-not-a.dev.json rename to domains/_github-pages-challenge-atlasl1.shrimp.is-not-a.dev.json diff --git a/domains/_github-pages-challenge-Clay990.suraj.is-cool.dev.json b/domains/_github-pages-challenge-clay990.suraj.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-Clay990.suraj.is-cool.dev.json rename to domains/_github-pages-challenge-clay990.suraj.is-cool.dev.json diff --git a/domains/_github-pages-challenge-CrownCoins.crowncoins.is-local.org.json b/domains/_github-pages-challenge-crowncoins.crowncoins.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-CrownCoins.crowncoins.is-local.org.json rename to domains/_github-pages-challenge-crowncoins.crowncoins.is-local.org.json diff --git a/domains/_github-pages-challenge-CsAjayS.vp.is-local.org.json b/domains/_github-pages-challenge-csajays.vp.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-CsAjayS.vp.is-local.org.json rename to domains/_github-pages-challenge-csajays.vp.is-local.org.json diff --git a/domains/_github-pages-challenge-Davidaprilio.david.is-cool.dev.json b/domains/_github-pages-challenge-davidaprilio.david.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-Davidaprilio.david.is-cool.dev.json rename to domains/_github-pages-challenge-davidaprilio.david.is-cool.dev.json diff --git a/domains/_github-pages-challenge-Dev-Ajay-sahani.ajay.is-cool.dev.json b/domains/_github-pages-challenge-dev-ajay-sahani.ajay.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-Dev-Ajay-sahani.ajay.is-cool.dev.json rename to domains/_github-pages-challenge-dev-ajay-sahani.ajay.is-cool.dev.json diff --git a/domains/_github-pages-challenge-Dragon-Dima.drago.is-cool.dev.json b/domains/_github-pages-challenge-dragon-dima.drago.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-Dragon-Dima.drago.is-cool.dev.json rename to domains/_github-pages-challenge-dragon-dima.drago.is-cool.dev.json diff --git a/domains/_github-pages-challenge-getSono.alex-gitarre.is-local.org.json b/domains/_github-pages-challenge-getsono.alex-gitarre.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-getSono.alex-gitarre.is-local.org.json rename to domains/_github-pages-challenge-getsono.alex-gitarre.is-local.org.json diff --git a/domains/_github-pages-challenge-Keks-Magazin.keks-magazin.is-local.org.json b/domains/_github-pages-challenge-keks-magazin.keks-magazin.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-Keks-Magazin.keks-magazin.is-local.org.json rename to domains/_github-pages-challenge-keks-magazin.keks-magazin.is-local.org.json diff --git a/domains/_github-pages-challenge-LightHostingFree.lh.is-cool.dev.json b/domains/_github-pages-challenge-lighthostingfree.lh.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-LightHostingFree.lh.is-cool.dev.json rename to domains/_github-pages-challenge-lighthostingfree.lh.is-cool.dev.json diff --git a/domains/_github-pages-challenge-LightHostingFree.lightarea.is-cool.dev.json b/domains/_github-pages-challenge-lighthostingfree.lightarea.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-LightHostingFree.lightarea.is-cool.dev.json rename to domains/_github-pages-challenge-lighthostingfree.lightarea.is-cool.dev.json diff --git a/domains/_github-pages-challenge-Mani-cwaf.mani.is-a-fullstack.dev.json b/domains/_github-pages-challenge-mani-cwaf.mani.is-a-fullstack.dev.json similarity index 100% rename from domains/_github-pages-challenge-Mani-cwaf.mani.is-a-fullstack.dev.json rename to domains/_github-pages-challenge-mani-cwaf.mani.is-a-fullstack.dev.json diff --git a/domains/_github-pages-challenge-MukuJhansi.gunman.is-a-fullstack.dev.json b/domains/_github-pages-challenge-mukujhansi.gunman.is-a-fullstack.dev.json similarity index 100% rename from domains/_github-pages-challenge-MukuJhansi.gunman.is-a-fullstack.dev.json rename to domains/_github-pages-challenge-mukujhansi.gunman.is-a-fullstack.dev.json diff --git a/domains/_github-pages-challenge-NanduWasTaken.nandu.is-cool.dev.json b/domains/_github-pages-challenge-nanduwastaken.nandu.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-NanduWasTaken.nandu.is-cool.dev.json rename to domains/_github-pages-challenge-nanduwastaken.nandu.is-cool.dev.json diff --git a/domains/_github-pages-challenge-Narmis-E.narmis.is-cool.dev.json b/domains/_github-pages-challenge-narmis-e.narmis.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-Narmis-E.narmis.is-cool.dev.json rename to domains/_github-pages-challenge-narmis-e.narmis.is-cool.dev.json diff --git a/domains/_github-pages-challenge-OpenOrganizationName.climatehealthei.is-local.org.json b/domains/_github-pages-challenge-openorganizationname.climatehealthei.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-OpenOrganizationName.climatehealthei.is-local.org.json rename to domains/_github-pages-challenge-openorganizationname.climatehealthei.is-local.org.json diff --git a/domains/_github-pages-challenge-OshekharO.alternate.is-local.org.json b/domains/_github-pages-challenge-oshekharo.alternate.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-OshekharO.alternate.is-local.org.json rename to domains/_github-pages-challenge-oshekharo.alternate.is-local.org.json diff --git a/domains/_github-pages-challenge-Real-Yash.vamika.is-local.org.json b/domains/_github-pages-challenge-real-yash.vamika.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-Real-Yash.vamika.is-local.org.json rename to domains/_github-pages-challenge-real-yash.vamika.is-local.org.json diff --git a/domains/_github-pages-challenge-SC136.ironflake.is-local.org.json b/domains/_github-pages-challenge-sc136.ironflake.is-local.org.json similarity index 100% rename from domains/_github-pages-challenge-SC136.ironflake.is-local.org.json rename to domains/_github-pages-challenge-sc136.ironflake.is-local.org.json diff --git a/domains/_github-pages-challenge-SkyShadowHero.skyshadowhero.is-cool.dev.json b/domains/_github-pages-challenge-skyshadowhero.skyshadowhero.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-SkyShadowHero.skyshadowhero.is-cool.dev.json rename to domains/_github-pages-challenge-skyshadowhero.skyshadowhero.is-cool.dev.json diff --git a/domains/_github-pages-challenge-Soumikcoder.soumik.is-cool.dev.json b/domains/_github-pages-challenge-soumikcoder.soumik.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-Soumikcoder.soumik.is-cool.dev.json rename to domains/_github-pages-challenge-soumikcoder.soumik.is-cool.dev.json diff --git a/domains/_github-pages-challenge-TDevTeam.thedevteam.is-cool.dev.json b/domains/_github-pages-challenge-tdevteam.thedevteam.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-TDevTeam.thedevteam.is-cool.dev.json rename to domains/_github-pages-challenge-tdevteam.thedevteam.is-cool.dev.json diff --git a/domains/_github-pages-challenge-The-Coding-Empire.coding.json b/domains/_github-pages-challenge-the-coding-empire.coding.json similarity index 100% rename from domains/_github-pages-challenge-The-Coding-Empire.coding.json rename to domains/_github-pages-challenge-the-coding-empire.coding.json diff --git a/domains/_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json b/domains/_github-pages-challenge-theflashspeedster.flash.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-TheFlashSpeedster.flash.is-cool.dev.json rename to domains/_github-pages-challenge-theflashspeedster.flash.is-cool.dev.json diff --git a/domains/_github-pages-challenge-YesnielX.yesnielx.is-cool.dev.json b/domains/_github-pages-challenge-yesnielx.yesnielx.is-cool.dev.json similarity index 100% rename from domains/_github-pages-challenge-YesnielX.yesnielx.is-cool.dev.json rename to domains/_github-pages-challenge-yesnielx.yesnielx.is-cool.dev.json diff --git a/domains/Aleksyeus.is-cool.dev.json b/domains/aleksyeus.is-cool.dev.json similarity index 100% rename from domains/Aleksyeus.is-cool.dev.json rename to domains/aleksyeus.is-cool.dev.json diff --git a/domains/Rbfl.localplayer.dev.json b/domains/rbfl.localplayer.dev.json similarity index 100% rename from domains/Rbfl.localplayer.dev.json rename to domains/rbfl.localplayer.dev.json From 3034cbf61d9fa7b18d32c44b37178bd72532eb00 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:01:50 -0500 Subject: [PATCH 69/92] Delete domain-fix.js --- domain-fix.js | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 domain-fix.js diff --git a/domain-fix.js b/domain-fix.js deleted file mode 100644 index 4ae88779..00000000 --- a/domain-fix.js +++ /dev/null @@ -1,29 +0,0 @@ -const fs = require("fs"); -const path = require("path"); - -const directoryPath = path.join(__dirname, "domains"); - -(async () => { - try { - // Read the files in the 'domains' directory - const files = await fs.promises.readdir(directoryPath); - - let renamedCount = 0; - - for (const file of files) { - const oldPath = path.join(directoryPath, file); - const newPath = path.join(directoryPath, file.toLowerCase()); - - // Only rename if the file name is not already in lowercase - if (oldPath !== newPath) { - await fs.promises.rename(oldPath, newPath); - console.log(`Renamed: ${file} -> ${file.toLowerCase()}`); - renamedCount++; - } - } - - console.log(`Finished! Renamed ${renamedCount} out of ${files.length} files.`); - } catch (err) { - console.error("Error:", err); - } -})(); \ No newline at end of file From bad76f128d70d9b7b987bf6ebe599e0c8c7ac80f Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:13:48 -0500 Subject: [PATCH 70/92] Update avnss.is-cool.dev.json --- domains/avnss.is-cool.dev.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domains/avnss.is-cool.dev.json b/domains/avnss.is-cool.dev.json index 9b30108e..2be9ac63 100644 --- a/domains/avnss.is-cool.dev.json +++ b/domains/avnss.is-cool.dev.json @@ -9,5 +9,5 @@ "record": { "CNAME": "ss.avnmsoft.xyz" }, - "proxied": true -} \ No newline at end of file + "proxied": false +} From fa10e4d36dbdb88331d930f2fb7c0916f614807d Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:14:02 -0500 Subject: [PATCH 71/92] Update amythyst.is-local.org.json --- domains/amythyst.is-local.org.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domains/amythyst.is-local.org.json b/domains/amythyst.is-local.org.json index a78f6294..f82a5e22 100644 --- a/domains/amythyst.is-local.org.json +++ b/domains/amythyst.is-local.org.json @@ -11,5 +11,5 @@ "CNAME": "amythyst.pages.dev" }, - "proxied": true -} \ No newline at end of file + "proxied": false +} From 73ceea7f1164b848a0e397e00105969a6d68a338 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:14:18 -0500 Subject: [PATCH 72/92] Update tameyo.is-local.org.json --- domains/tameyo.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/tameyo.is-local.org.json b/domains/tameyo.is-local.org.json index 84431ffb..d60f9dac 100644 --- a/domains/tameyo.is-local.org.json +++ b/domains/tameyo.is-local.org.json @@ -10,5 +10,5 @@ "CNAME": "website-720.pages.dev" }, - "proxied": true + "proxied": false } From f1c6a747b577b5823d745deb5f7df3466d580df2 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:14:39 -0500 Subject: [PATCH 73/92] Update tameyo.is-local.org.json --- domains/tameyo.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/tameyo.is-local.org.json b/domains/tameyo.is-local.org.json index d60f9dac..84431ffb 100644 --- a/domains/tameyo.is-local.org.json +++ b/domains/tameyo.is-local.org.json @@ -10,5 +10,5 @@ "CNAME": "website-720.pages.dev" }, - "proxied": false + "proxied": true } From 99019548c35fad0432b72a088fd962cee3e52135 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:14:47 -0500 Subject: [PATCH 74/92] Update amythyst.is-local.org.json --- domains/amythyst.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/amythyst.is-local.org.json b/domains/amythyst.is-local.org.json index f82a5e22..05cae134 100644 --- a/domains/amythyst.is-local.org.json +++ b/domains/amythyst.is-local.org.json @@ -11,5 +11,5 @@ "CNAME": "amythyst.pages.dev" }, - "proxied": false + "proxied": true } From 78cdddcdd8508eb72930e76a7a0e4fb6744126cb Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:15:21 -0500 Subject: [PATCH 75/92] Update avnss.is-cool.dev.json --- domains/avnss.is-cool.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/avnss.is-cool.dev.json b/domains/avnss.is-cool.dev.json index 2be9ac63..921af3c2 100644 --- a/domains/avnss.is-cool.dev.json +++ b/domains/avnss.is-cool.dev.json @@ -9,5 +9,5 @@ "record": { "CNAME": "ss.avnmsoft.xyz" }, - "proxied": false + "proxied": true } From fb67110705dc433b32e082476821e44888a74205 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:17:37 -0500 Subject: [PATCH 76/92] Update _github-pages-challenge-sayanta01.sayanta.is-a-fullstack.dev.json --- ...ub-pages-challenge-sayanta01.sayanta.is-a-fullstack.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/_github-pages-challenge-sayanta01.sayanta.is-a-fullstack.dev.json b/domains/_github-pages-challenge-sayanta01.sayanta.is-a-fullstack.dev.json index e9d70684..1b02083b 100644 --- a/domains/_github-pages-challenge-sayanta01.sayanta.is-a-fullstack.dev.json +++ b/domains/_github-pages-challenge-sayanta01.sayanta.is-a-fullstack.dev.json @@ -10,5 +10,5 @@ "TXT": ["c974df92b9224148ebb38b910ec2ad"] }, - "proxied": true + "proxied": false } From 3f906f4695683933fb4791f669028f263bed66ad Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:18:59 -0500 Subject: [PATCH 77/92] Update ayan.is-a-fullstack.dev.json --- domains/ayan.is-a-fullstack.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/ayan.is-a-fullstack.dev.json b/domains/ayan.is-a-fullstack.dev.json index c805a532..630ff40e 100644 --- a/domains/ayan.is-a-fullstack.dev.json +++ b/domains/ayan.is-a-fullstack.dev.json @@ -15,5 +15,5 @@ ] }, - "proxied": true + "proxied": false } From 50f0956be0797deabe832a9e515ff786120a1d06 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:21:21 -0500 Subject: [PATCH 78/92] Update echo.is-local.org.json --- domains/echo.is-local.org.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/echo.is-local.org.json b/domains/echo.is-local.org.json index 25c9105b..1adc9f6c 100644 --- a/domains/echo.is-local.org.json +++ b/domains/echo.is-local.org.json @@ -13,5 +13,5 @@ "NS": ["arushi.ns.cloudflare.com", "duke.ns.cloudflare.com"] }, - "proxied": true + "proxied": false } From f1577e08bf36a0c428d6a2711c21b689094f8a7e Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:24:54 -0500 Subject: [PATCH 79/92] Update flash.is-cool.dev.json --- domains/flash.is-cool.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/flash.is-cool.dev.json b/domains/flash.is-cool.dev.json index 2864c855..1eae799e 100644 --- a/domains/flash.is-cool.dev.json +++ b/domains/flash.is-cool.dev.json @@ -10,5 +10,5 @@ "TXT": ["76e43257be0fa58011fb122c38f31a"] }, - "proxied": true + "proxied": false } From f195d74c929177032413a838da6cbe9100704d0a Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:28:00 -0500 Subject: [PATCH 80/92] Update janbert.localplayer.dev.json --- domains/janbert.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/janbert.localplayer.dev.json b/domains/janbert.localplayer.dev.json index 4f38bcef..abf89020 100644 --- a/domains/janbert.localplayer.dev.json +++ b/domains/janbert.localplayer.dev.json @@ -10,5 +10,5 @@ "TXT": ["google-site-verification=qjismw0ulu2edzv896w55m7cuybjku9_mfscdobkary"] }, - "proxied": true + "proxied": false } From 14129a21cbce4736f40b0b39a4d3748f3ca14152 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:33:29 -0500 Subject: [PATCH 81/92] Update proxy.test.js --- tests/proxy.test.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/proxy.test.js b/tests/proxy.test.js index 4c5bfa43..5f5bccaf 100644 --- a/tests/proxy.test.js +++ b/tests/proxy.test.js @@ -6,18 +6,24 @@ const requiredRecordsToProxy = ["A", "AAAA", "CNAME"]; function validateProxiedRecords(t, data, file) { if (data.proxied) { - const hasProxiedRecord = Object.keys(data.record).some((key) => requiredRecordsToProxy.includes(key)); + const hasProxiedRecord = Object.keys(data.record || {}).some((key) => requiredRecordsToProxy.includes(key)); t.true(hasProxiedRecord, `${file}: Proxied is true but there are no records that can be proxied`); } } const domainsPath = path.resolve("domains"); -const files = fs.readdirSync(domainsPath); -t("Domains with proxy enabled should have have at least one record that can be proxied", (t) => { +// Filter to only include files (exclude directories) +const files = fs.readdirSync(domainsPath).filter((file) => { + const filePath = path.join(domainsPath, file); + return fs.lstatSync(filePath).isFile(); +}); + +t("Domains with proxy enabled should have at least one record that can be proxied", (t) => { files.forEach((file) => { - const domain = fs.readJsonSync(path.join(domainsPath, file)); + const filePath = path.join(domainsPath, file); + const domain = fs.readJsonSync(filePath); validateProxiedRecords(t, domain, file); }); From 625186d8267ecdaca04294e25a82aaca57974730 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:15:14 -0500 Subject: [PATCH 82/92] Update validation.yml --- .github/workflows/validation.yml | 115 ++++++++++++++++--------------- 1 file changed, 59 insertions(+), 56 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 6a642043..852249fc 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -15,60 +15,63 @@ on: workflow_dispatch: concurrency: - group: ${{ github.ref }}-validation - cancel-in-progress: true - + group: ${{ github.ref }}-validation + cancel-in-progress: true + jobs: - dns: - name: DNS - if: "!contains(github.event.head_commit.message, '[skip-ci]')" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 + dns: + name: DNS + if: "!contains(github.event.head_commit.message, '[skip-ci]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} - - id: create_token - uses: tibdex/github-app-token@v2 - with: - app_id: ${{ secrets.APP_ID }} - private_key: ${{ secrets.PRIVATE_KEY }} + - id: create_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID }} + private_key: ${{ secrets.PRIVATE_KEY }} - - name: Check DNS - id: dns_check - uses: is-a-dev/dnscontrol-action@main - with: - args: check - config_file: "dnsconfig.js" + - name: Check DNS + id: dns_check + uses: is-a-dev/dnscontrol-action@main + with: + args: check + config_file: "dnsconfig.js" - - name: Add Validated DNS Label - if: ${{ steps.dns_check.outcome == 'success' }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Validated DNS" - github_token: ${{ steps.create_token.outputs.token }} - - name: Remove Invalid DNS Label - if: ${{ steps.dns_check.outcome == 'success' }} - uses: actions-ecosystem/action-remove-labels@v1 - with: - labels: "Invalid DNS" - github_token: ${{ steps.create_token.outputs.token }} + - name: Add Validated DNS Label + if: ${{ steps.dns_check.outcome == 'success' }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Validated DNS" + github_token: ${{ steps.create_token.outputs.token }} + - name: Remove Invalid DNS Label + if: ${{ steps.dns_check.outcome == 'success' }} + uses: actions-ecosystem/action-remove-labels@v1 + with: + labels: "Invalid DNS" + github_token: ${{ steps.create_token.outputs.token }} - - name: Add Invalid DNS Label - if: ${{ failure() }} - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: "Invalid DNS" - github_token: ${{ steps.create_token.outputs.token }} - - name: Remove Validated DNS Label - if: ${{ failure() }} - uses: actions-ecosystem/action-remove-labels@v1 - with: - labels: "Validated DNS" - github_token: ${{ steps.create_token.outputs.token }} + - name: Add Invalid DNS Label + if: ${{ failure() }} + uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Invalid DNS" + github_token: ${{ steps.create_token.outputs.token }} - json: - name: JSON - runs-on: ubuntu-latest - steps: + - name: Remove Validated DNS Label + if: ${{ failure() }} + uses: actions-ecosystem/action-remove-labels@v1 + with: + labels: "Validated DNS" + github_token: ${{ steps.create_token.outputs.token }} + + json: + name: JSON + runs-on: ubuntu-latest + steps: - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} @@ -113,13 +116,13 @@ jobs: labels: "Validated JSON" github_token: ${{ steps.create_token.outputs.token }} - tests: - name: Tests - if: "!contains(github.event.head_commit.message, '[skip-ci]')" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 + tests: + name: Tests + if: "!contains(github.event.head_commit.message, '[skip-ci]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - - run: npm install + - run: npm install - - run: npm test + - run: npm test From 1cae2f423dd9169be7aca295ffc12c528fbb4956 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:17:58 -0500 Subject: [PATCH 83/92] Update validation.yml Allow for everything to be tested on both branches and not just 1 --- .github/workflows/validation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 852249fc..9995821d 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -4,7 +4,7 @@ on: pull_request: push: - branches: [main] + branches: [main,Kyro3400-patch-1] paths: - "domains/*" - "tests/*" From ee7279686f4bd51f022ba6690bade9d9fa07bad2 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:19:11 -0500 Subject: [PATCH 84/92] Update validation.yml --- .github/workflows/validation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 9995821d..aa6a6a8d 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -4,7 +4,7 @@ on: pull_request: push: - branches: [main,Kyro3400-patch-1] + branches: [main, Kyro3400-patch-1] paths: - "domains/*" - "tests/*" From 9d70dc377dd0858589d4f100d1d3bbdc5f92e659 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:23:46 -0500 Subject: [PATCH 85/92] Update validation.yml --- .github/workflows/validation.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index aa6a6a8d..96a478a0 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -4,7 +4,9 @@ on: pull_request: push: - branches: [main, Kyro3400-patch-1] + branches: + - 'main' + - 'Kyro3400-patch-1' paths: - "domains/*" - "tests/*" From 8e9afa6e2e95f1564ce8f92395e907c3ba95309c Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:25:14 -0500 Subject: [PATCH 86/92] Update validation.yml --- .github/workflows/validation.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 96a478a0..5954e368 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -119,12 +119,12 @@ jobs: github_token: ${{ steps.create_token.outputs.token }} tests: - name: Tests - if: "!contains(github.event.head_commit.message, '[skip-ci]')" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 + name: Tests + if: "!contains(github.event.head_commit.message, '[skip-ci]')" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 - - run: npm install + - run: npm install - - run: npm test + - run: npm test From c9ea393e15e2b7884871dabbccc67b6e9b56ed4c Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:25:54 -0500 Subject: [PATCH 87/92] Update validation.yml --- .github/workflows/validation.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 5954e368..86b77c43 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -4,9 +4,7 @@ on: pull_request: push: - branches: - - 'main' - - 'Kyro3400-patch-1' + branches: [main] paths: - "domains/*" - "tests/*" From 6dbe38da392920813f979e530be89ff1ff7fde90 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 21 Nov 2024 12:52:36 -0500 Subject: [PATCH 88/92] Update retr0.localplayer.dev.json --- domains/retr0.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/retr0.localplayer.dev.json b/domains/retr0.localplayer.dev.json index 5ba2b8dc..5ea82cec 100644 --- a/domains/retr0.localplayer.dev.json +++ b/domains/retr0.localplayer.dev.json @@ -14,5 +14,5 @@ "TXT": ["v=spf1 include:spf.improvmx.com ~all"] }, - "proxied": true + "proxied": false } From 45f659eba21a5bddbed0ddbd0654bd9f1c403dc8 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 21 Nov 2024 12:56:50 -0500 Subject: [PATCH 89/92] Update shadow.localplayer.dev.json --- domains/shadow.localplayer.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/shadow.localplayer.dev.json b/domains/shadow.localplayer.dev.json index 30a5b58b..50535749 100644 --- a/domains/shadow.localplayer.dev.json +++ b/domains/shadow.localplayer.dev.json @@ -14,5 +14,5 @@ "TXT": ["v=spf1 include:spf.improvmx.com ~all"] }, - "proxied": true + "proxied": false } From c9ab04e89afc10749f15b66074c6998765f4d08c Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:12:11 -0500 Subject: [PATCH 90/92] fix: Fix CLA? --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 2c3839b0..a0aa6e94 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -28,7 +28,7 @@ jobs: path-to-document: 'https://github.com/open-domains/register/blob/main/terms.md' # e.g. a CLA or a DCO document # branch should not be protected branch: 'main' - allowlist: od-bot,bot*,kyro3400 + allowlist: od-bot,bot*,“kyro3400” remote-organization-name: 'open-domains' remote-repository-name: 'cla' lock-pullrequest-aftermerge: false From af4152acee187267a78fdefb63aca7efce037cdb Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:13:32 -0500 Subject: [PATCH 91/92] revert --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index a0aa6e94..2c3839b0 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -28,7 +28,7 @@ jobs: path-to-document: 'https://github.com/open-domains/register/blob/main/terms.md' # e.g. a CLA or a DCO document # branch should not be protected branch: 'main' - allowlist: od-bot,bot*,“kyro3400” + allowlist: od-bot,bot*,kyro3400 remote-organization-name: 'open-domains' remote-repository-name: 'cla' lock-pullrequest-aftermerge: false From 863ca0c60090c8d7ba59dd4d4dcc92f4c725b7b3 Mon Sep 17 00:00:00 2001 From: Jon <66625200+Kyro3400@users.noreply.github.com> Date: Fri, 22 Nov 2024 14:55:39 -0500 Subject: [PATCH 92/92] Update short.is-cool.dev.json --- domains/short.is-cool.dev.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domains/short.is-cool.dev.json b/domains/short.is-cool.dev.json index d4611f02..edabca77 100644 --- a/domains/short.is-cool.dev.json +++ b/domains/short.is-cool.dev.json @@ -13,7 +13,7 @@ "NS": ["ns01.000webhost.com", "ns02.000webhost.com"] }, - "proxied": true + "proxied": false }