generated from nhcarrigan/template
feat: test that all projects have a documentation page
This commit is contained in:
@@ -78,6 +78,7 @@
|
|||||||
"KADOKAWA",
|
"KADOKAWA",
|
||||||
"LGBTQ",
|
"LGBTQ",
|
||||||
"Lietuvių",
|
"Lietuvių",
|
||||||
|
"Liora",
|
||||||
"Lyria",
|
"Lyria",
|
||||||
"Maribelle",
|
"Maribelle",
|
||||||
"Meliora",
|
"Meliora",
|
||||||
|
|||||||
+4
-3
@@ -9,8 +9,7 @@
|
|||||||
"build": "astro build",
|
"build": "astro build",
|
||||||
"preview": "astro preview",
|
"preview": "astro preview",
|
||||||
"astro": "astro",
|
"astro": "astro",
|
||||||
"scan": "SONAR_TOKEN='op://Environment Variables - Development/SonarCloud/docs' op run -- sonar-scanner -Dsonar.organization=nhcarrigan -Dsonar.projectKey=nhcarrigan_docs -Dsonar.sources=. -Dsonar.host.url=https://sonarcloud.io",
|
"test": "vitest --run"
|
||||||
"test": "echo 'No tests yet!' && exit 0"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/check": "^0.9.4",
|
"@astrojs/check": "^0.9.4",
|
||||||
@@ -21,6 +20,8 @@
|
|||||||
"typescript": "^5.7.3"
|
"typescript": "^5.7.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cspell": "8.17.3"
|
"cspell": "8.17.3",
|
||||||
|
"gray-matter": "4.0.3",
|
||||||
|
"vitest": "4.0.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+309
@@ -30,6 +30,12 @@ importers:
|
|||||||
cspell:
|
cspell:
|
||||||
specifier: 8.17.3
|
specifier: 8.17.3
|
||||||
version: 8.17.3
|
version: 8.17.3
|
||||||
|
gray-matter:
|
||||||
|
specifier: 4.0.3
|
||||||
|
version: 4.0.3
|
||||||
|
vitest:
|
||||||
|
specifier: 4.0.5
|
||||||
|
version: 4.0.5(@types/debug@4.1.12)(yaml@2.7.0)
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -653,6 +659,9 @@ packages:
|
|||||||
'@jridgewell/sourcemap-codec@1.5.0':
|
'@jridgewell/sourcemap-codec@1.5.0':
|
||||||
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
|
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
|
||||||
|
|
||||||
|
'@jridgewell/sourcemap-codec@1.5.5':
|
||||||
|
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
|
||||||
|
|
||||||
'@mdx-js/mdx@3.1.0':
|
'@mdx-js/mdx@3.1.0':
|
||||||
resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
|
resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
|
||||||
|
|
||||||
@@ -827,9 +836,15 @@ packages:
|
|||||||
'@shikijs/vscode-textmate@10.0.2':
|
'@shikijs/vscode-textmate@10.0.2':
|
||||||
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
|
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
|
||||||
|
|
||||||
|
'@standard-schema/spec@1.0.0':
|
||||||
|
resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==}
|
||||||
|
|
||||||
'@types/acorn@4.0.6':
|
'@types/acorn@4.0.6':
|
||||||
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
|
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
|
||||||
|
|
||||||
|
'@types/chai@5.2.3':
|
||||||
|
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
|
||||||
|
|
||||||
'@types/cookie@0.6.0':
|
'@types/cookie@0.6.0':
|
||||||
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
|
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
|
||||||
|
|
||||||
@@ -929,6 +944,9 @@ packages:
|
|||||||
'@types/debug@4.1.12':
|
'@types/debug@4.1.12':
|
||||||
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
|
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
|
||||||
|
|
||||||
|
'@types/deep-eql@4.0.2':
|
||||||
|
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
|
||||||
|
|
||||||
'@types/estree-jsx@1.0.5':
|
'@types/estree-jsx@1.0.5':
|
||||||
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
|
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
|
||||||
|
|
||||||
@@ -977,6 +995,35 @@ packages:
|
|||||||
'@ungap/structured-clone@1.2.0':
|
'@ungap/structured-clone@1.2.0':
|
||||||
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
|
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
|
||||||
|
|
||||||
|
'@vitest/expect@4.0.5':
|
||||||
|
resolution: {integrity: sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==}
|
||||||
|
|
||||||
|
'@vitest/mocker@4.0.5':
|
||||||
|
resolution: {integrity: sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==}
|
||||||
|
peerDependencies:
|
||||||
|
msw: ^2.4.9
|
||||||
|
vite: ^6.0.0 || ^7.0.0-0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
msw:
|
||||||
|
optional: true
|
||||||
|
vite:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@vitest/pretty-format@4.0.5':
|
||||||
|
resolution: {integrity: sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==}
|
||||||
|
|
||||||
|
'@vitest/runner@4.0.5':
|
||||||
|
resolution: {integrity: sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==}
|
||||||
|
|
||||||
|
'@vitest/snapshot@4.0.5':
|
||||||
|
resolution: {integrity: sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==}
|
||||||
|
|
||||||
|
'@vitest/spy@4.0.5':
|
||||||
|
resolution: {integrity: sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==}
|
||||||
|
|
||||||
|
'@vitest/utils@4.0.5':
|
||||||
|
resolution: {integrity: sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==}
|
||||||
|
|
||||||
'@volar/kit@2.4.11':
|
'@volar/kit@2.4.11':
|
||||||
resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==}
|
resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -1063,6 +1110,10 @@ packages:
|
|||||||
array-timsort@1.0.3:
|
array-timsort@1.0.3:
|
||||||
resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
|
resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
|
||||||
|
|
||||||
|
assertion-error@2.0.1:
|
||||||
|
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
astring@1.8.6:
|
astring@1.8.6:
|
||||||
resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
|
resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
@@ -1125,6 +1176,10 @@ packages:
|
|||||||
ccount@2.0.1:
|
ccount@2.0.1:
|
||||||
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
|
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
|
||||||
|
|
||||||
|
chai@6.2.0:
|
||||||
|
resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
chalk-template@1.1.0:
|
chalk-template@1.1.0:
|
||||||
resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==}
|
resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==}
|
||||||
engines: {node: '>=14.16'}
|
engines: {node: '>=14.16'}
|
||||||
@@ -1553,6 +1608,9 @@ packages:
|
|||||||
es-module-lexer@1.6.0:
|
es-module-lexer@1.6.0:
|
||||||
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
|
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
|
||||||
|
|
||||||
|
es-module-lexer@1.7.0:
|
||||||
|
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
|
||||||
|
|
||||||
esast-util-from-estree@2.0.0:
|
esast-util-from-estree@2.0.0:
|
||||||
resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
|
resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
|
||||||
|
|
||||||
@@ -1604,12 +1662,20 @@ packages:
|
|||||||
eventemitter3@5.0.1:
|
eventemitter3@5.0.1:
|
||||||
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
|
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
|
||||||
|
|
||||||
|
expect-type@1.2.2:
|
||||||
|
resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
|
||||||
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
expressive-code@0.40.2:
|
expressive-code@0.40.2:
|
||||||
resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==}
|
resolution: {integrity: sha512-1zIda2rB0qiDZACawzw2rbdBQiWHBT56uBctS+ezFe5XMAaFaHLnnSYND/Kd+dVzO9HfCXRDpzH3d+3fvOWRcw==}
|
||||||
|
|
||||||
exsolve@1.0.7:
|
exsolve@1.0.7:
|
||||||
resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
|
resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
|
||||||
|
|
||||||
|
extend-shallow@2.0.1:
|
||||||
|
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
extend@3.0.2:
|
extend@3.0.2:
|
||||||
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
|
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
|
||||||
|
|
||||||
@@ -1645,6 +1711,15 @@ packages:
|
|||||||
picomatch:
|
picomatch:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
fdir@6.5.0:
|
||||||
|
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
|
||||||
|
engines: {node: '>=12.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
picomatch: ^3 || ^4
|
||||||
|
peerDependenciesMeta:
|
||||||
|
picomatch:
|
||||||
|
optional: true
|
||||||
|
|
||||||
file-entry-cache@9.1.0:
|
file-entry-cache@9.1.0:
|
||||||
resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==}
|
resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -1714,6 +1789,10 @@ packages:
|
|||||||
graceful-fs@4.2.11:
|
graceful-fs@4.2.11:
|
||||||
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
||||||
|
|
||||||
|
gray-matter@4.0.3:
|
||||||
|
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
|
||||||
|
engines: {node: '>=6.0'}
|
||||||
|
|
||||||
h3@1.15.0:
|
h3@1.15.0:
|
||||||
resolution: {integrity: sha512-OsjX4JW8J4XGgCgEcad20pepFQWnuKH+OwkCJjogF3C+9AZ1iYdtB4hX6vAb5DskBiu5ljEXqApINjR8CqoCMQ==}
|
resolution: {integrity: sha512-OsjX4JW8J4XGgCgEcad20pepFQWnuKH+OwkCJjogF3C+9AZ1iYdtB4hX6vAb5DskBiu5ljEXqApINjR8CqoCMQ==}
|
||||||
|
|
||||||
@@ -1854,6 +1933,10 @@ packages:
|
|||||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
is-extendable@0.1.1:
|
||||||
|
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
is-extglob@2.1.1:
|
is-extglob@2.1.1:
|
||||||
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
|
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
@@ -1916,6 +1999,10 @@ packages:
|
|||||||
khroma@2.1.0:
|
khroma@2.1.0:
|
||||||
resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
|
resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
|
||||||
|
|
||||||
|
kind-of@6.0.3:
|
||||||
|
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
kleur@3.0.3:
|
kleur@3.0.3:
|
||||||
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
|
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -1968,6 +2055,9 @@ packages:
|
|||||||
magic-string@0.30.17:
|
magic-string@0.30.17:
|
||||||
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
||||||
|
|
||||||
|
magic-string@0.30.21:
|
||||||
|
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
|
||||||
|
|
||||||
magicast@0.3.5:
|
magicast@0.3.5:
|
||||||
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
|
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
|
||||||
|
|
||||||
@@ -2289,6 +2379,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
|
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
picomatch@4.0.3:
|
||||||
|
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
pify@4.0.1:
|
pify@4.0.1:
|
||||||
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
|
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -2508,6 +2602,10 @@ packages:
|
|||||||
sax@1.4.1:
|
sax@1.4.1:
|
||||||
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
|
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
|
||||||
|
|
||||||
|
section-matter@1.0.0:
|
||||||
|
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
semver@7.6.3:
|
semver@7.6.3:
|
||||||
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
|
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@@ -2525,6 +2623,9 @@ packages:
|
|||||||
shiki@1.29.2:
|
shiki@1.29.2:
|
||||||
resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==}
|
resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==}
|
||||||
|
|
||||||
|
siginfo@2.0.0:
|
||||||
|
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
|
||||||
|
|
||||||
simple-swizzle@0.2.2:
|
simple-swizzle@0.2.2:
|
||||||
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
|
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
|
||||||
|
|
||||||
@@ -2558,6 +2659,12 @@ packages:
|
|||||||
sprintf-js@1.0.3:
|
sprintf-js@1.0.3:
|
||||||
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
|
||||||
|
|
||||||
|
stackback@0.0.2:
|
||||||
|
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
|
||||||
|
|
||||||
|
std-env@3.10.0:
|
||||||
|
resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
|
||||||
|
|
||||||
stream-replace-string@2.0.0:
|
stream-replace-string@2.0.0:
|
||||||
resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
|
resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
|
||||||
|
|
||||||
@@ -2580,6 +2687,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
|
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
strip-bom-string@1.0.0:
|
||||||
|
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
strip-bom@3.0.0:
|
strip-bom@3.0.0:
|
||||||
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
|
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@@ -2593,6 +2704,9 @@ packages:
|
|||||||
stylis@4.3.6:
|
stylis@4.3.6:
|
||||||
resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
|
resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
|
||||||
|
|
||||||
|
tinybench@2.9.0:
|
||||||
|
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
|
||||||
|
|
||||||
tinyexec@0.3.2:
|
tinyexec@0.3.2:
|
||||||
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
|
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
|
||||||
|
|
||||||
@@ -2603,6 +2717,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
|
resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
|
||||||
engines: {node: '>=12.0.0'}
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
|
tinyglobby@0.2.15:
|
||||||
|
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
|
||||||
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
|
tinyrainbow@3.0.3:
|
||||||
|
resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==}
|
||||||
|
engines: {node: '>=14.0.0'}
|
||||||
|
|
||||||
to-fast-properties@2.0.0:
|
to-fast-properties@2.0.0:
|
||||||
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
|
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@@ -2820,6 +2942,40 @@ packages:
|
|||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
vitest@4.0.5:
|
||||||
|
resolution: {integrity: sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==}
|
||||||
|
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
|
||||||
|
hasBin: true
|
||||||
|
peerDependencies:
|
||||||
|
'@edge-runtime/vm': '*'
|
||||||
|
'@types/debug': ^4.1.12
|
||||||
|
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
|
||||||
|
'@vitest/browser-playwright': 4.0.5
|
||||||
|
'@vitest/browser-preview': 4.0.5
|
||||||
|
'@vitest/browser-webdriverio': 4.0.5
|
||||||
|
'@vitest/ui': 4.0.5
|
||||||
|
happy-dom: '*'
|
||||||
|
jsdom: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@edge-runtime/vm':
|
||||||
|
optional: true
|
||||||
|
'@types/debug':
|
||||||
|
optional: true
|
||||||
|
'@types/node':
|
||||||
|
optional: true
|
||||||
|
'@vitest/browser-playwright':
|
||||||
|
optional: true
|
||||||
|
'@vitest/browser-preview':
|
||||||
|
optional: true
|
||||||
|
'@vitest/browser-webdriverio':
|
||||||
|
optional: true
|
||||||
|
'@vitest/ui':
|
||||||
|
optional: true
|
||||||
|
happy-dom:
|
||||||
|
optional: true
|
||||||
|
jsdom:
|
||||||
|
optional: true
|
||||||
|
|
||||||
volar-service-css@0.0.62:
|
volar-service-css@0.0.62:
|
||||||
resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==}
|
resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2940,6 +3096,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==}
|
resolution: {integrity: sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==}
|
||||||
engines: {node: '>=18.12'}
|
engines: {node: '>=18.12'}
|
||||||
|
|
||||||
|
why-is-node-running@2.3.0:
|
||||||
|
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
widest-line@5.0.0:
|
widest-line@5.0.0:
|
||||||
resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
|
resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -3639,6 +3800,8 @@ snapshots:
|
|||||||
|
|
||||||
'@jridgewell/sourcemap-codec@1.5.0': {}
|
'@jridgewell/sourcemap-codec@1.5.0': {}
|
||||||
|
|
||||||
|
'@jridgewell/sourcemap-codec@1.5.5': {}
|
||||||
|
|
||||||
'@mdx-js/mdx@3.1.0(acorn@8.14.0)':
|
'@mdx-js/mdx@3.1.0(acorn@8.14.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree': 1.0.5
|
'@types/estree': 1.0.5
|
||||||
@@ -3804,10 +3967,17 @@ snapshots:
|
|||||||
|
|
||||||
'@shikijs/vscode-textmate@10.0.2': {}
|
'@shikijs/vscode-textmate@10.0.2': {}
|
||||||
|
|
||||||
|
'@standard-schema/spec@1.0.0': {}
|
||||||
|
|
||||||
'@types/acorn@4.0.6':
|
'@types/acorn@4.0.6':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree': 1.0.5
|
'@types/estree': 1.0.5
|
||||||
|
|
||||||
|
'@types/chai@5.2.3':
|
||||||
|
dependencies:
|
||||||
|
'@types/deep-eql': 4.0.2
|
||||||
|
assertion-error: 2.0.1
|
||||||
|
|
||||||
'@types/cookie@0.6.0': {}
|
'@types/cookie@0.6.0': {}
|
||||||
|
|
||||||
'@types/d3-array@3.2.2': {}
|
'@types/d3-array@3.2.2': {}
|
||||||
@@ -3931,6 +4101,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/ms': 0.7.34
|
'@types/ms': 0.7.34
|
||||||
|
|
||||||
|
'@types/deep-eql@4.0.2': {}
|
||||||
|
|
||||||
'@types/estree-jsx@1.0.5':
|
'@types/estree-jsx@1.0.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree': 1.0.5
|
'@types/estree': 1.0.5
|
||||||
@@ -3974,6 +4146,45 @@ snapshots:
|
|||||||
|
|
||||||
'@ungap/structured-clone@1.2.0': {}
|
'@ungap/structured-clone@1.2.0': {}
|
||||||
|
|
||||||
|
'@vitest/expect@4.0.5':
|
||||||
|
dependencies:
|
||||||
|
'@standard-schema/spec': 1.0.0
|
||||||
|
'@types/chai': 5.2.3
|
||||||
|
'@vitest/spy': 4.0.5
|
||||||
|
'@vitest/utils': 4.0.5
|
||||||
|
chai: 6.2.0
|
||||||
|
tinyrainbow: 3.0.3
|
||||||
|
|
||||||
|
'@vitest/mocker@4.0.5(vite@6.1.0(yaml@2.7.0))':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/spy': 4.0.5
|
||||||
|
estree-walker: 3.0.3
|
||||||
|
magic-string: 0.30.21
|
||||||
|
optionalDependencies:
|
||||||
|
vite: 6.1.0(yaml@2.7.0)
|
||||||
|
|
||||||
|
'@vitest/pretty-format@4.0.5':
|
||||||
|
dependencies:
|
||||||
|
tinyrainbow: 3.0.3
|
||||||
|
|
||||||
|
'@vitest/runner@4.0.5':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/utils': 4.0.5
|
||||||
|
pathe: 2.0.3
|
||||||
|
|
||||||
|
'@vitest/snapshot@4.0.5':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/pretty-format': 4.0.5
|
||||||
|
magic-string: 0.30.21
|
||||||
|
pathe: 2.0.3
|
||||||
|
|
||||||
|
'@vitest/spy@4.0.5': {}
|
||||||
|
|
||||||
|
'@vitest/utils@4.0.5':
|
||||||
|
dependencies:
|
||||||
|
'@vitest/pretty-format': 4.0.5
|
||||||
|
tinyrainbow: 3.0.3
|
||||||
|
|
||||||
'@volar/kit@2.4.11(typescript@5.7.3)':
|
'@volar/kit@2.4.11(typescript@5.7.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/language-service': 2.4.11
|
'@volar/language-service': 2.4.11
|
||||||
@@ -4072,6 +4283,8 @@ snapshots:
|
|||||||
|
|
||||||
array-timsort@1.0.3: {}
|
array-timsort@1.0.3: {}
|
||||||
|
|
||||||
|
assertion-error@2.0.1: {}
|
||||||
|
|
||||||
astring@1.8.6: {}
|
astring@1.8.6: {}
|
||||||
|
|
||||||
astro-expressive-code@0.40.2(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)):
|
astro-expressive-code@0.40.2(astro@5.3.0(rollup@4.34.7)(typescript@5.7.3)(yaml@2.7.0)):
|
||||||
@@ -4222,6 +4435,8 @@ snapshots:
|
|||||||
|
|
||||||
ccount@2.0.1: {}
|
ccount@2.0.1: {}
|
||||||
|
|
||||||
|
chai@6.2.0: {}
|
||||||
|
|
||||||
chalk-template@1.1.0:
|
chalk-template@1.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
chalk: 5.4.1
|
chalk: 5.4.1
|
||||||
@@ -4692,6 +4907,8 @@ snapshots:
|
|||||||
|
|
||||||
es-module-lexer@1.6.0: {}
|
es-module-lexer@1.6.0: {}
|
||||||
|
|
||||||
|
es-module-lexer@1.7.0: {}
|
||||||
|
|
||||||
esast-util-from-estree@2.0.0:
|
esast-util-from-estree@2.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/estree-jsx': 1.0.5
|
'@types/estree-jsx': 1.0.5
|
||||||
@@ -4777,6 +4994,8 @@ snapshots:
|
|||||||
|
|
||||||
eventemitter3@5.0.1: {}
|
eventemitter3@5.0.1: {}
|
||||||
|
|
||||||
|
expect-type@1.2.2: {}
|
||||||
|
|
||||||
expressive-code@0.40.2:
|
expressive-code@0.40.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@expressive-code/core': 0.40.2
|
'@expressive-code/core': 0.40.2
|
||||||
@@ -4786,6 +5005,10 @@ snapshots:
|
|||||||
|
|
||||||
exsolve@1.0.7: {}
|
exsolve@1.0.7: {}
|
||||||
|
|
||||||
|
extend-shallow@2.0.1:
|
||||||
|
dependencies:
|
||||||
|
is-extendable: 0.1.1
|
||||||
|
|
||||||
extend@3.0.2: {}
|
extend@3.0.2: {}
|
||||||
|
|
||||||
fast-deep-equal@3.1.3: {}
|
fast-deep-equal@3.1.3: {}
|
||||||
@@ -4820,6 +5043,10 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
picomatch: 4.0.2
|
picomatch: 4.0.2
|
||||||
|
|
||||||
|
fdir@6.5.0(picomatch@4.0.3):
|
||||||
|
optionalDependencies:
|
||||||
|
picomatch: 4.0.3
|
||||||
|
|
||||||
file-entry-cache@9.1.0:
|
file-entry-cache@9.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
flat-cache: 5.0.0
|
flat-cache: 5.0.0
|
||||||
@@ -4874,6 +5101,13 @@ snapshots:
|
|||||||
|
|
||||||
graceful-fs@4.2.11: {}
|
graceful-fs@4.2.11: {}
|
||||||
|
|
||||||
|
gray-matter@4.0.3:
|
||||||
|
dependencies:
|
||||||
|
js-yaml: 3.14.1
|
||||||
|
kind-of: 6.0.3
|
||||||
|
section-matter: 1.0.0
|
||||||
|
strip-bom-string: 1.0.0
|
||||||
|
|
||||||
h3@1.15.0:
|
h3@1.15.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
cookie-es: 1.2.2
|
cookie-es: 1.2.2
|
||||||
@@ -5148,6 +5382,8 @@ snapshots:
|
|||||||
|
|
||||||
is-docker@3.0.0: {}
|
is-docker@3.0.0: {}
|
||||||
|
|
||||||
|
is-extendable@0.1.1: {}
|
||||||
|
|
||||||
is-extglob@2.1.1: {}
|
is-extglob@2.1.1: {}
|
||||||
|
|
||||||
is-fullwidth-code-point@3.0.0: {}
|
is-fullwidth-code-point@3.0.0: {}
|
||||||
@@ -5197,6 +5433,8 @@ snapshots:
|
|||||||
|
|
||||||
khroma@2.1.0: {}
|
khroma@2.1.0: {}
|
||||||
|
|
||||||
|
kind-of@6.0.3: {}
|
||||||
|
|
||||||
kleur@3.0.3: {}
|
kleur@3.0.3: {}
|
||||||
|
|
||||||
kleur@4.1.5: {}
|
kleur@4.1.5: {}
|
||||||
@@ -5246,6 +5484,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/sourcemap-codec': 1.5.0
|
'@jridgewell/sourcemap-codec': 1.5.0
|
||||||
|
|
||||||
|
magic-string@0.30.21:
|
||||||
|
dependencies:
|
||||||
|
'@jridgewell/sourcemap-codec': 1.5.5
|
||||||
|
|
||||||
magicast@0.3.5:
|
magicast@0.3.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.25.4
|
'@babel/parser': 7.25.4
|
||||||
@@ -5876,6 +6118,8 @@ snapshots:
|
|||||||
|
|
||||||
picomatch@4.0.2: {}
|
picomatch@4.0.2: {}
|
||||||
|
|
||||||
|
picomatch@4.0.3: {}
|
||||||
|
|
||||||
pify@4.0.1: {}
|
pify@4.0.1: {}
|
||||||
|
|
||||||
pkg-dir@4.2.0:
|
pkg-dir@4.2.0:
|
||||||
@@ -6215,6 +6459,11 @@ snapshots:
|
|||||||
|
|
||||||
sax@1.4.1: {}
|
sax@1.4.1: {}
|
||||||
|
|
||||||
|
section-matter@1.0.0:
|
||||||
|
dependencies:
|
||||||
|
extend-shallow: 2.0.1
|
||||||
|
kind-of: 6.0.3
|
||||||
|
|
||||||
semver@7.6.3: {}
|
semver@7.6.3: {}
|
||||||
|
|
||||||
semver@7.7.1: {}
|
semver@7.7.1: {}
|
||||||
@@ -6257,6 +6506,8 @@ snapshots:
|
|||||||
'@shikijs/vscode-textmate': 10.0.2
|
'@shikijs/vscode-textmate': 10.0.2
|
||||||
'@types/hast': 3.0.4
|
'@types/hast': 3.0.4
|
||||||
|
|
||||||
|
siginfo@2.0.0: {}
|
||||||
|
|
||||||
simple-swizzle@0.2.2:
|
simple-swizzle@0.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish: 0.3.2
|
is-arrayish: 0.3.2
|
||||||
@@ -6283,6 +6534,10 @@ snapshots:
|
|||||||
|
|
||||||
sprintf-js@1.0.3: {}
|
sprintf-js@1.0.3: {}
|
||||||
|
|
||||||
|
stackback@0.0.2: {}
|
||||||
|
|
||||||
|
std-env@3.10.0: {}
|
||||||
|
|
||||||
stream-replace-string@2.0.0: {}
|
stream-replace-string@2.0.0: {}
|
||||||
|
|
||||||
string-width@4.2.3:
|
string-width@4.2.3:
|
||||||
@@ -6310,6 +6565,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ansi-regex: 6.0.1
|
ansi-regex: 6.0.1
|
||||||
|
|
||||||
|
strip-bom-string@1.0.0: {}
|
||||||
|
|
||||||
strip-bom@3.0.0: {}
|
strip-bom@3.0.0: {}
|
||||||
|
|
||||||
style-to-object@0.4.4:
|
style-to-object@0.4.4:
|
||||||
@@ -6322,6 +6579,8 @@ snapshots:
|
|||||||
|
|
||||||
stylis@4.3.6: {}
|
stylis@4.3.6: {}
|
||||||
|
|
||||||
|
tinybench@2.9.0: {}
|
||||||
|
|
||||||
tinyexec@0.3.2: {}
|
tinyexec@0.3.2: {}
|
||||||
|
|
||||||
tinyexec@1.0.1: {}
|
tinyexec@1.0.1: {}
|
||||||
@@ -6331,6 +6590,13 @@ snapshots:
|
|||||||
fdir: 6.4.2(picomatch@4.0.2)
|
fdir: 6.4.2(picomatch@4.0.2)
|
||||||
picomatch: 4.0.2
|
picomatch: 4.0.2
|
||||||
|
|
||||||
|
tinyglobby@0.2.15:
|
||||||
|
dependencies:
|
||||||
|
fdir: 6.5.0(picomatch@4.0.3)
|
||||||
|
picomatch: 4.0.3
|
||||||
|
|
||||||
|
tinyrainbow@3.0.3: {}
|
||||||
|
|
||||||
to-fast-properties@2.0.0: {}
|
to-fast-properties@2.0.0: {}
|
||||||
|
|
||||||
to-regex-range@5.0.1:
|
to-regex-range@5.0.1:
|
||||||
@@ -6473,6 +6739,44 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
vite: 6.1.0(yaml@2.7.0)
|
vite: 6.1.0(yaml@2.7.0)
|
||||||
|
|
||||||
|
vitest@4.0.5(@types/debug@4.1.12)(yaml@2.7.0):
|
||||||
|
dependencies:
|
||||||
|
'@vitest/expect': 4.0.5
|
||||||
|
'@vitest/mocker': 4.0.5(vite@6.1.0(yaml@2.7.0))
|
||||||
|
'@vitest/pretty-format': 4.0.5
|
||||||
|
'@vitest/runner': 4.0.5
|
||||||
|
'@vitest/snapshot': 4.0.5
|
||||||
|
'@vitest/spy': 4.0.5
|
||||||
|
'@vitest/utils': 4.0.5
|
||||||
|
debug: 4.4.3
|
||||||
|
es-module-lexer: 1.7.0
|
||||||
|
expect-type: 1.2.2
|
||||||
|
magic-string: 0.30.21
|
||||||
|
pathe: 2.0.3
|
||||||
|
picomatch: 4.0.3
|
||||||
|
std-env: 3.10.0
|
||||||
|
tinybench: 2.9.0
|
||||||
|
tinyexec: 0.3.2
|
||||||
|
tinyglobby: 0.2.15
|
||||||
|
tinyrainbow: 3.0.3
|
||||||
|
vite: 6.1.0(yaml@2.7.0)
|
||||||
|
why-is-node-running: 2.3.0
|
||||||
|
optionalDependencies:
|
||||||
|
'@types/debug': 4.1.12
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- jiti
|
||||||
|
- less
|
||||||
|
- lightningcss
|
||||||
|
- msw
|
||||||
|
- sass
|
||||||
|
- sass-embedded
|
||||||
|
- stylus
|
||||||
|
- sugarss
|
||||||
|
- supports-color
|
||||||
|
- terser
|
||||||
|
- tsx
|
||||||
|
- yaml
|
||||||
|
|
||||||
volar-service-css@0.0.62(@volar/language-service@2.4.11):
|
volar-service-css@0.0.62(@volar/language-service@2.4.11):
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-css-languageservice: 6.3.0
|
vscode-css-languageservice: 6.3.0
|
||||||
@@ -6592,6 +6896,11 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
load-yaml-file: 0.2.0
|
load-yaml-file: 0.2.0
|
||||||
|
|
||||||
|
why-is-node-running@2.3.0:
|
||||||
|
dependencies:
|
||||||
|
siginfo: 2.0.0
|
||||||
|
stackback: 0.0.2
|
||||||
|
|
||||||
widest-line@5.0.0:
|
widest-line@5.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
string-width: 7.2.0
|
string-width: 7.2.0
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Art for Palestine Bot
|
title: Artists4Palestine Bot
|
||||||
---
|
---
|
||||||
|
|
||||||
Art for Palestine Bot (hereinafter the "Application") is a Discord bot designed to facilitate the Art for Palestine charity event. The Application serves as an automated bridge between Airtable, Trello, and Discord to manage art commission requests, artist assignments, delivery tracking, and support tickets for the charity event.
|
Artists4Palestine Bot (hereinafter the "Application") is a Discord bot designed to facilitate the Art for Palestine charity event. The Application serves as an automated bridge between Airtable, Trello, and Discord to manage art commission requests, artist assignments, delivery tracking, and support tickets for the charity event.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: Beccalia: Origins
|
title: "Beccalia: Origins"
|
||||||
---
|
---
|
||||||
|
|
||||||
Beccalia: Origins (hereinafter the "Game") is originally planned as the story of Becca and Rosalia growing up, this game was only released as a demo.
|
Beccalia: Origins (hereinafter the "Game") is originally planned as the story of Becca and Rosalia growing up, this game was only released as a demo.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: Beccalia: Prologue
|
title: "Beccalia: Prologue"
|
||||||
---
|
---
|
||||||
|
|
||||||
Beccalia: Prologue (hereinafter the "Game") is an introductory story that sets the stage for the Beccalia universe, featuring Becca and Rosalia.
|
Beccalia: Prologue (hereinafter the "Game") is an introductory story that sets the stage for the Beccalia universe, featuring Becca and Rosalia.
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Discord Boost Monitor
|
title: Boost Monitor
|
||||||
---
|
---
|
||||||
|
|
||||||
Discord Boost Monitor (hereinafter the "Application") is a Discord bot that automatically manages special roles for server boosters. The Application monitors server members and removes booster-exclusive roles (such as custom color roles) when a member stops boosting the server.
|
Boost Monitor (hereinafter the "Application") is a Discord bot that automatically manages special roles for server boosters. The Application monitors server members and removes booster-exclusive roles (such as custom color roles) when a member stops boosting the server.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: NHCarrigan Documentation Site
|
title: NHCarrigan Documentation
|
||||||
---
|
---
|
||||||
|
|
||||||
NHCarrigan Documentation Site (hereinafter the "Application") is a comprehensive documentation website built with Astro and Starlight that serves as the central hub for all documentation related to NHCarrigan's projects, policies, and services. The site provides organized access to technical documentation, legal policies, community guidelines, and project-specific information across multiple categories including Discord bots, web applications, libraries, and development tools. The Application features a custom-themed interface with accessibility considerations, analytics integration, and environmental sustainability features.
|
NHCarrigan Documentation (hereinafter the "Application") is a comprehensive documentation website built with Astro and Starlight that serves as the central hub for all documentation related to NHCarrigan's projects, policies, and services. The site provides organized access to technical documentation, legal policies, community guidelines, and project-specific information across multiple categories including Discord bots, web applications, libraries, and development tools. The Application features a custom-themed interface with accessibility considerations, analytics integration, and environmental sustainability features.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,624 @@
|
|||||||
|
---
|
||||||
|
title: Liora
|
||||||
|
---
|
||||||
|
|
||||||
|
Liora (hereinafter the "Application") is a Discord bot that provides a "highlight words" notification system for Discord servers. The Application monitors messages in Discord servers and sends direct messages (DMs) to users when specific words or phrases they've configured are mentioned, bringing IRC-style highlight/ping functionality to Discord.
|
||||||
|
|
||||||
|
## 1. User Documentation
|
||||||
|
|
||||||
|
This section is for those interacting with a live instance of the Application.
|
||||||
|
|
||||||
|
### 1.1 Getting Started
|
||||||
|
|
||||||
|
To use Liora in your Discord server, you'll need to:
|
||||||
|
|
||||||
|
1. **Add the bot to your server**: Visit the [invite link](https://discord.com/oauth2/authorize?client_id=1391492296222179459)
|
||||||
|
2. **Subscribe to premium**: A server administrator must purchase a server subscription from the Discord store, unless your server is whitelisted
|
||||||
|
3. **Enable DMs**: Ensure you have direct messages enabled from server members to receive notifications
|
||||||
|
|
||||||
|
### 1.2 Available Commands
|
||||||
|
|
||||||
|
The Application provides the following slash commands:
|
||||||
|
|
||||||
|
#### `/about`
|
||||||
|
Displays information about Liora, including what it does and how to get help.
|
||||||
|
|
||||||
|
#### `/add <word>`
|
||||||
|
Adds a word or phrase to your highlight list for the current server.
|
||||||
|
- **Parameters**:
|
||||||
|
- `word` (required): The word or phrase to monitor
|
||||||
|
- **Limitations**: Maximum of 10 highlights per user per server
|
||||||
|
- **Behaviour**: Case-insensitive matching
|
||||||
|
|
||||||
|
**Example**: `/add typescript` will notify you whenever someone mentions "TypeScript", "typescript", or "TYPESCRIPT"
|
||||||
|
|
||||||
|
#### `/remove <word>`
|
||||||
|
Removes a word or phrase from your highlight list for the current server.
|
||||||
|
- **Parameters**:
|
||||||
|
- `word` (required): The word or phrase to remove from monitoring
|
||||||
|
|
||||||
|
**Example**: `/remove typescript`
|
||||||
|
|
||||||
|
#### `/list`
|
||||||
|
Displays all your configured highlight words for the current server.
|
||||||
|
|
||||||
|
#### `/dm`
|
||||||
|
Tests whether the bot can send you direct messages. Use this command if you're not receiving notifications to verify your DM settings are correct.
|
||||||
|
|
||||||
|
### 1.3 Notification Format
|
||||||
|
|
||||||
|
When a message contains one of your highlight words, you'll receive a DM containing:
|
||||||
|
|
||||||
|
- Which word(s) were matched
|
||||||
|
- The server name where the message was sent
|
||||||
|
- The display name of the user who sent the message
|
||||||
|
- A direct link to the original message
|
||||||
|
- Action buttons:
|
||||||
|
- **Jump to Message**: Opens the message in Discord
|
||||||
|
- **Discord Server**: Links to the support server
|
||||||
|
- **Forum**: Links to the support forum
|
||||||
|
|
||||||
|
### 1.4 Important Notes
|
||||||
|
|
||||||
|
- You will **not** receive notifications for messages you send yourself
|
||||||
|
- Highlight matching is **case-insensitive** (e.g., "discord" matches "Discord", "DISCORD", etc.)
|
||||||
|
- Highlights are **server-specific** - each server has its own separate list
|
||||||
|
- The bot requires the ability to send you DMs - check your privacy settings if notifications aren't working
|
||||||
|
|
||||||
|
### 1.5 Support and Feedback
|
||||||
|
|
||||||
|
If you need assistance or want to report a bug:
|
||||||
|
|
||||||
|
- **Discord Server**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
|
||||||
|
- **Forum**: [forum.nhcarrigan.com](https://forum.nhcarrigan.com)
|
||||||
|
- **Email**: contact@nhcarrigan.com
|
||||||
|
- **GitHub Issues**: Open an issue on the repository
|
||||||
|
|
||||||
|
### 1.6 Subscription Information
|
||||||
|
|
||||||
|
The Application uses Discord's premium subscription system. Server administrators can purchase a subscription to enable the bot for all members. Two servers are currently whitelisted for free access (Naomi's server and FreeCodeCamp).
|
||||||
|
|
||||||
|
**Premium SKU ID**: 1396962587471515769
|
||||||
|
|
||||||
|
## 2. Technical Documentation
|
||||||
|
|
||||||
|
This section is for those interested in running their own instance of the Application.
|
||||||
|
|
||||||
|
### 2.1 System Requirements
|
||||||
|
|
||||||
|
- **Node.js**: v22 or higher
|
||||||
|
- **Package Manager**: pnpm 10.13.1 or higher
|
||||||
|
- **Database**: MongoDB instance
|
||||||
|
- **Discord**: Bot token from Discord Developer Portal
|
||||||
|
- **1Password CLI** (optional): For secure environment variable management
|
||||||
|
|
||||||
|
### 2.2 Technology Stack
|
||||||
|
|
||||||
|
#### Core Technologies
|
||||||
|
- **Runtime**: Node.js v22
|
||||||
|
- **Language**: TypeScript 5.8.3
|
||||||
|
- **Package Manager**: pnpm 10.13.1
|
||||||
|
|
||||||
|
#### Main Dependencies
|
||||||
|
- **discord.js** (v14.21.0): Discord API interaction and bot framework
|
||||||
|
- **@prisma/client** (v6.12.0): Database ORM for MongoDB
|
||||||
|
- **fastify** (v5.4.0): Lightweight HTTP server for health monitoring
|
||||||
|
- **@nhcarrigan/discord-analytics** (v0.0.6): Analytics tracking
|
||||||
|
- **@nhcarrigan/logger** (v1.1.1): Logging utility
|
||||||
|
|
||||||
|
#### Development Tools
|
||||||
|
- **ESLint** (v9.31.0): Code linting with @nhcarrigan/eslint-config
|
||||||
|
- **Prisma** (v6.12.0): Database schema management
|
||||||
|
- **TypeScript**: Type safety and compilation
|
||||||
|
|
||||||
|
### 2.3 Architecture Overview
|
||||||
|
|
||||||
|
The Application follows an event-driven architecture:
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── index.ts # Application entry point
|
||||||
|
├── commands/ # Slash command handlers
|
||||||
|
│ ├── about.ts
|
||||||
|
│ ├── add.ts
|
||||||
|
│ ├── remove.ts
|
||||||
|
│ ├── list.ts
|
||||||
|
│ └── dm.ts
|
||||||
|
├── events/ # Discord event handlers
|
||||||
|
│ ├── interactionCreate.ts # Command routing
|
||||||
|
│ └── messageCreate.ts # Message monitoring (core logic)
|
||||||
|
├── interfaces/ # TypeScript type definitions
|
||||||
|
│ ├── liora.ts # Main bot interface
|
||||||
|
│ └── command.ts # Command type definition
|
||||||
|
├── utils/ # Utility functions
|
||||||
|
│ ├── checkEntitlement.ts # Subscription validation
|
||||||
|
│ ├── errorHandler.ts # Error logging with UUIDs
|
||||||
|
│ └── logger.ts # Logger configuration
|
||||||
|
├── modules/ # Business logic
|
||||||
|
│ └── sendUnentitledResponse.ts
|
||||||
|
├── config/ # Configuration
|
||||||
|
│ └── entitlements.ts # Whitelisted guild IDs
|
||||||
|
└── server/ # HTTP server
|
||||||
|
└── serve.ts # Health monitoring endpoint
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Key Components
|
||||||
|
|
||||||
|
**Entry Point** (`src/index.ts`):
|
||||||
|
- Initializes Prisma database client
|
||||||
|
- Creates Discord bot with required intents (Guilds, GuildMessages, MessageContent)
|
||||||
|
- Sets up event listeners
|
||||||
|
- Starts analytics cron job
|
||||||
|
- Launches Fastify web server on port 5022
|
||||||
|
|
||||||
|
**Message Processing** (`src/events/messageCreate.ts`):
|
||||||
|
- Validates guild entitlement/subscription
|
||||||
|
- Queries database for all highlights in the server
|
||||||
|
- Performs case-insensitive matching against message content
|
||||||
|
- Sends DM notifications with formatted components
|
||||||
|
- Logs metrics for analytics
|
||||||
|
|
||||||
|
**Command Handlers**:
|
||||||
|
All commands use Discord's Components V2 API with ContainerBuilder and TextDisplayBuilder for rich formatting.
|
||||||
|
|
||||||
|
### 2.4 Database Schema
|
||||||
|
|
||||||
|
The Application uses MongoDB with Prisma ORM:
|
||||||
|
|
||||||
|
```prisma
|
||||||
|
model Highlights {
|
||||||
|
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||||
|
serverId String # Discord guild ID
|
||||||
|
userId String # Discord user ID
|
||||||
|
words String[] # Array of highlight words
|
||||||
|
|
||||||
|
@@unique([serverId, userId])
|
||||||
|
@@index([serverId])
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Each user can have one document per server
|
||||||
|
- The unique constraint ensures no duplicate user-server combinations
|
||||||
|
- The server ID is indexed for efficient queries when processing messages
|
||||||
|
|
||||||
|
### 2.5 Installation and Setup
|
||||||
|
|
||||||
|
#### Step 1: Clone the Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://git.nhcarrigan.com/nhcarrigan/liora.git
|
||||||
|
cd liora
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Install Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Configure Environment Variables
|
||||||
|
|
||||||
|
Create a `prod.env` file with the following variables:
|
||||||
|
|
||||||
|
```env
|
||||||
|
DISCORD_TOKEN=your_discord_bot_token
|
||||||
|
MONGO_URI=your_mongodb_connection_string
|
||||||
|
LOG_TOKEN=your_logging_service_token
|
||||||
|
```
|
||||||
|
|
||||||
|
**Discord Bot Setup**:
|
||||||
|
1. Visit [Discord Developer Portal](https://discord.com/developers/applications)
|
||||||
|
2. Create a new application
|
||||||
|
3. Navigate to the "Bot" section and create a bot
|
||||||
|
4. Enable these Privileged Gateway Intents:
|
||||||
|
- Server Members Intent (GUILDS)
|
||||||
|
- Message Content Intent (MESSAGE_CONTENT)
|
||||||
|
5. Copy the bot token to your environment file
|
||||||
|
|
||||||
|
**MongoDB Setup**:
|
||||||
|
- Provide a MongoDB connection URI in the format: `mongodb://user:password@host:port/database`
|
||||||
|
- Alternatively, use MongoDB Atlas for a cloud-hosted solution
|
||||||
|
|
||||||
|
#### Step 4: Generate Prisma Client
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
This command runs `prisma generate && tsc`, which:
|
||||||
|
- Generates the Prisma client from the schema
|
||||||
|
- Compiles TypeScript to the `./prod` directory
|
||||||
|
|
||||||
|
#### Step 5: Register Discord Commands
|
||||||
|
|
||||||
|
Use the `commandJson.js` file to register slash commands with Discord:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node commandJson.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use the output to register commands via Discord's API or developer portal.
|
||||||
|
|
||||||
|
#### Step 6: Start the Application
|
||||||
|
|
||||||
|
**With 1Password CLI**:
|
||||||
|
```bash
|
||||||
|
pnpm run start
|
||||||
|
```
|
||||||
|
|
||||||
|
**Without 1Password CLI**:
|
||||||
|
```bash
|
||||||
|
node ./prod/index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
The Application will:
|
||||||
|
- Connect to MongoDB
|
||||||
|
- Log in to Discord
|
||||||
|
- Start the web server on port 5022
|
||||||
|
- Begin monitoring messages
|
||||||
|
|
||||||
|
### 2.6 Development Workflow
|
||||||
|
|
||||||
|
#### Linting
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run lint
|
||||||
|
```
|
||||||
|
|
||||||
|
Uses ESLint with @nhcarrigan/eslint-config.
|
||||||
|
|
||||||
|
#### Building
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Generates Prisma client and compiles TypeScript.
|
||||||
|
|
||||||
|
#### Running Tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
Currently returns a placeholder. Test implementation is pending.
|
||||||
|
|
||||||
|
### 2.7 Continuous Integration
|
||||||
|
|
||||||
|
The repository includes a Gitea Actions workflow (`.gitea/workflows/ci.yml`) that:
|
||||||
|
- Runs on push and pull requests to the main branch
|
||||||
|
- Executes linting with ESLint
|
||||||
|
- Verifies TypeScript compilation
|
||||||
|
- Runs tests
|
||||||
|
|
||||||
|
### 2.8 Configuration
|
||||||
|
|
||||||
|
#### Whitelisted Guilds
|
||||||
|
|
||||||
|
Two Discord servers have free access without subscriptions, configured in `src/config/entitlements.ts`. To modify:
|
||||||
|
|
||||||
|
1. Edit `src/config/entitlements.ts`
|
||||||
|
2. Add guild IDs to the whitelist array
|
||||||
|
3. Rebuild the application
|
||||||
|
|
||||||
|
#### Subscription SKU
|
||||||
|
|
||||||
|
The premium subscription SKU is defined in `src/utils/checkEntitlement.ts`. To use your own subscription:
|
||||||
|
|
||||||
|
1. Create a subscription in Discord's Developer Portal
|
||||||
|
2. Update the SKU ID in the entitlement check logic
|
||||||
|
3. Rebuild the application
|
||||||
|
|
||||||
|
### 2.9 Deployment
|
||||||
|
|
||||||
|
#### Web Server
|
||||||
|
|
||||||
|
The Application includes a Fastify web server that:
|
||||||
|
- Listens on port 5022
|
||||||
|
- Serves a landing page at `/`
|
||||||
|
- Provides information about the bot
|
||||||
|
- Includes an "Add to Discord" button
|
||||||
|
- Useful for health checks and monitoring
|
||||||
|
|
||||||
|
#### Production Deployment Checklist
|
||||||
|
|
||||||
|
1. Ensure all environment variables are configured
|
||||||
|
2. Build the application with `pnpm run build`
|
||||||
|
3. Set up process management (PM2, systemd, Docker, etc.)
|
||||||
|
4. Configure reverse proxy if exposing the web server
|
||||||
|
5. Set up MongoDB backups
|
||||||
|
6. Monitor logs via the configured logging service
|
||||||
|
7. Register Discord commands before starting the bot
|
||||||
|
|
||||||
|
#### Health Monitoring
|
||||||
|
|
||||||
|
The web server on port 5022 can be used for health checks. A simple GET request to `/` will return the landing page HTML if the service is running.
|
||||||
|
|
||||||
|
### 2.10 Analytics
|
||||||
|
|
||||||
|
The Application integrates with a custom analytics service (@nhcarrigan/discord-analytics):
|
||||||
|
|
||||||
|
- **Tracked Metrics**:
|
||||||
|
- `highlight_triggered`: Logged when a highlight word is matched
|
||||||
|
- Gateway events (connection, ready, etc.)
|
||||||
|
- **Metadata**: Includes server ID, user ID, and matched words
|
||||||
|
- **Authentication**: Requires LOG_TOKEN environment variable
|
||||||
|
|
||||||
|
### 2.11 API Endpoints
|
||||||
|
|
||||||
|
The Fastify web server exposes:
|
||||||
|
|
||||||
|
- `GET /`: Landing page with bot information and "Add to Discord" link
|
||||||
|
|
||||||
|
### 2.12 Security Considerations
|
||||||
|
|
||||||
|
- **Message Content Intent**: The bot requires access to read all message content in subscribed guilds. This is a privileged intent and should be handled responsibly.
|
||||||
|
- **Environment Variables**: Use secure methods to manage secrets (1Password CLI, environment variable management services, etc.)
|
||||||
|
- **DM Privacy**: The bot only sends DMs when highlights are triggered; it does not store message content
|
||||||
|
- **Entitlement Validation**: All commands and message processing verify subscription status to prevent unauthorized usage
|
||||||
|
|
||||||
|
### 2.13 Troubleshooting
|
||||||
|
|
||||||
|
#### Bot Not Responding to Commands
|
||||||
|
- Verify the bot has appropriate permissions in the server
|
||||||
|
- Check that commands are registered with Discord's API
|
||||||
|
- Ensure the bot is online and connected
|
||||||
|
|
||||||
|
#### DMs Not Being Sent
|
||||||
|
- Verify users have DMs enabled from server members
|
||||||
|
- Check that the bot has permission to send DMs
|
||||||
|
- Use the `/dm` command to test DM functionality
|
||||||
|
|
||||||
|
#### Database Connection Issues
|
||||||
|
- Verify MongoDB connection string format
|
||||||
|
- Ensure MongoDB instance is accessible from the application
|
||||||
|
- Check Prisma client is generated (`pnpm run build`)
|
||||||
|
|
||||||
|
#### Analytics Not Working
|
||||||
|
- Verify LOG_TOKEN is correctly configured
|
||||||
|
- Check analytics service is reachable
|
||||||
|
- Review application logs for errors
|
||||||
|
|
||||||
|
## 3. Legal Documentation
|
||||||
|
|
||||||
|
This section is for expansions to our legal policies specific to the Application.
|
||||||
|
|
||||||
|
### 3.1 License
|
||||||
|
|
||||||
|
This software is licensed under [Naomi's Public License](https://docs.nhcarrigan.com/#/license).
|
||||||
|
|
||||||
|
Copyright held by Naomi Carrigan.
|
||||||
|
|
||||||
|
### 3.2 Data Collection and Privacy
|
||||||
|
|
||||||
|
The Application collects and stores the following data:
|
||||||
|
|
||||||
|
- **Discord User IDs**: To identify which users should receive notifications
|
||||||
|
- **Discord Server IDs**: To associate highlights with specific servers
|
||||||
|
- **Highlight Words**: The words/phrases users choose to monitor
|
||||||
|
- **Analytics Metrics**: Anonymous usage statistics (highlight triggers, command usage)
|
||||||
|
|
||||||
|
**Data Usage**:
|
||||||
|
- User data is used solely to provide the highlight notification functionality
|
||||||
|
- Analytics data is used to improve the Application
|
||||||
|
- No message content is stored permanently
|
||||||
|
- Data is stored in a MongoDB database
|
||||||
|
|
||||||
|
**Data Retention**:
|
||||||
|
- Highlight data is retained until manually removed by users via the `/remove` command
|
||||||
|
- Users can view all their stored data via the `/list` command
|
||||||
|
|
||||||
|
**Third-Party Services**:
|
||||||
|
- Discord API: Required for bot functionality
|
||||||
|
- MongoDB: Database hosting
|
||||||
|
- Custom Analytics Service: Usage metrics tracking
|
||||||
|
|
||||||
|
### 3.3 Terms of Service
|
||||||
|
|
||||||
|
By using the Application, you agree to:
|
||||||
|
|
||||||
|
- Use the Application in accordance with Discord's Terms of Service
|
||||||
|
- Not abuse the highlight system to spam or harass other users
|
||||||
|
- Accept that the service is provided "as is" without warranties
|
||||||
|
- Understand that subscription fees are non-refundable per Discord's policies
|
||||||
|
|
||||||
|
### 3.4 Acceptable Use
|
||||||
|
|
||||||
|
Users must not:
|
||||||
|
|
||||||
|
- Use the Application to harass or spam other users
|
||||||
|
- Attempt to circumvent subscription requirements
|
||||||
|
- Exploit bugs or vulnerabilities in the Application
|
||||||
|
- Use the Application for any illegal purposes
|
||||||
|
|
||||||
|
### 3.5 Subscription Terms
|
||||||
|
|
||||||
|
- Subscriptions are managed through Discord's subscription system
|
||||||
|
- Pricing and billing are handled by Discord
|
||||||
|
- Subscriptions are server-specific (per-guild)
|
||||||
|
- Two servers are currently whitelisted for free access
|
||||||
|
- Subscription status is validated before processing commands and notifications
|
||||||
|
|
||||||
|
### 3.6 Liability
|
||||||
|
|
||||||
|
The Application maintainers are not liable for:
|
||||||
|
|
||||||
|
- Missed notifications due to Discord API issues or user configuration
|
||||||
|
- Data loss due to database failures or user error
|
||||||
|
- Service interruptions or downtime
|
||||||
|
- Actions taken by users based on notifications received
|
||||||
|
|
||||||
|
### 3.7 Contact for Legal Inquiries
|
||||||
|
|
||||||
|
For legal questions or concerns:
|
||||||
|
|
||||||
|
- **Email**: contact@nhcarrigan.com
|
||||||
|
- **Discord**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
|
||||||
|
|
||||||
|
## 4. Contributing Documentation
|
||||||
|
|
||||||
|
This section is for documentation related to contributing to the Application's codebase.
|
||||||
|
|
||||||
|
### 4.1 Contributing Guidelines
|
||||||
|
|
||||||
|
Our comprehensive contributing guidelines can be found at: [https://docs.nhcarrigan.com/#/contributing](https://docs.nhcarrigan.com/#/contributing)
|
||||||
|
|
||||||
|
### 4.2 Code of Conduct
|
||||||
|
|
||||||
|
Before interacting with our community, please review our Code of Conduct: [https://docs.nhcarrigan.com/#/coc](https://docs.nhcarrigan.com/#/coc)
|
||||||
|
|
||||||
|
### 4.3 How to Contribute
|
||||||
|
|
||||||
|
#### Reporting Bugs
|
||||||
|
|
||||||
|
If you encounter a bug:
|
||||||
|
|
||||||
|
1. Check existing GitHub issues to avoid duplicates
|
||||||
|
2. Create a new issue with:
|
||||||
|
- Clear description of the bug
|
||||||
|
- Steps to reproduce
|
||||||
|
- Expected vs. actual behavior
|
||||||
|
- Environment details (Node.js version, OS, etc.)
|
||||||
|
- Error logs or screenshots if applicable
|
||||||
|
|
||||||
|
#### Suggesting Features
|
||||||
|
|
||||||
|
For feature requests:
|
||||||
|
|
||||||
|
1. Open a GitHub issue with the "feature request" label
|
||||||
|
2. Describe the feature and its use case
|
||||||
|
3. Explain why it would benefit users
|
||||||
|
4. Be open to discussion and feedback
|
||||||
|
|
||||||
|
#### Submitting Pull Requests
|
||||||
|
|
||||||
|
To contribute code:
|
||||||
|
|
||||||
|
1. **Fork the repository** on Gitea or GitHub
|
||||||
|
2. **Create a feature branch**: `git checkout -b feature/your-feature-name`
|
||||||
|
3. **Make your changes**:
|
||||||
|
- Follow the existing code style
|
||||||
|
- Add comments for complex logic
|
||||||
|
- Update documentation if needed
|
||||||
|
4. **Test your changes**:
|
||||||
|
- Ensure the application builds: `pnpm run build`
|
||||||
|
- Run linting: `pnpm run lint`
|
||||||
|
- Test functionality locally
|
||||||
|
5. **Commit your changes**:
|
||||||
|
- Use clear, descriptive commit messages
|
||||||
|
- Reference related issues if applicable
|
||||||
|
6. **Push to your fork**: `git push origin feature/your-feature-name`
|
||||||
|
7. **Open a Pull Request**:
|
||||||
|
- Describe what changes were made and why
|
||||||
|
- Link to related issues
|
||||||
|
- Wait for review and address feedback
|
||||||
|
|
||||||
|
### 4.4 Development Setup
|
||||||
|
|
||||||
|
Follow the steps in Section 2.5 (Installation and Setup) to set up your development environment.
|
||||||
|
|
||||||
|
**Additional Development Tips**:
|
||||||
|
|
||||||
|
- Use TypeScript strict mode for type safety
|
||||||
|
- Follow the ESLint configuration for consistent code style
|
||||||
|
- Test commands in a development Discord server before submitting
|
||||||
|
- Use meaningful variable and function names
|
||||||
|
- Add JSDoc comments for public functions and interfaces
|
||||||
|
|
||||||
|
### 4.5 Code Style Guidelines
|
||||||
|
|
||||||
|
The Application uses:
|
||||||
|
|
||||||
|
- **@nhcarrigan/eslint-config**: ESLint configuration for consistent style
|
||||||
|
- **@nhcarrigan/typescript-config**: TypeScript configuration
|
||||||
|
- **Prettier-compatible formatting**: Enforced via ESLint
|
||||||
|
|
||||||
|
Key conventions:
|
||||||
|
|
||||||
|
- **File naming**: camelCase for TypeScript files
|
||||||
|
- **Function naming**: camelCase for functions, PascalCase for classes/interfaces
|
||||||
|
- **Indentation**: 2 spaces
|
||||||
|
- **Quotes**: Double quotes for strings
|
||||||
|
- **Semicolons**: Required
|
||||||
|
- **Max line length**: Enforced by ESLint (exceptions allowed for long strings)
|
||||||
|
|
||||||
|
### 4.6 Project Structure Guidelines
|
||||||
|
|
||||||
|
When adding new features:
|
||||||
|
|
||||||
|
- **Commands**: Add to `src/commands/` directory
|
||||||
|
- **Events**: Add to `src/events/` directory
|
||||||
|
- **Utilities**: Add to `src/utils/` directory
|
||||||
|
- **Business Logic**: Add to `src/modules/` directory
|
||||||
|
- **Type Definitions**: Add to `src/interfaces/` directory
|
||||||
|
|
||||||
|
### 4.7 Testing Guidelines
|
||||||
|
|
||||||
|
Currently, the Application does not have automated tests. Contributions to add testing infrastructure are welcome!
|
||||||
|
|
||||||
|
**Manual Testing Checklist**:
|
||||||
|
|
||||||
|
- Test all commands in a Discord server
|
||||||
|
- Verify highlight matching works correctly
|
||||||
|
- Test edge cases (max highlights, special characters, etc.)
|
||||||
|
- Verify DM notifications are sent properly
|
||||||
|
- Test subscription validation
|
||||||
|
- Check error handling
|
||||||
|
|
||||||
|
### 4.8 Documentation Contributions
|
||||||
|
|
||||||
|
Documentation improvements are highly valued! You can contribute by:
|
||||||
|
|
||||||
|
- Fixing typos or unclear explanations
|
||||||
|
- Adding examples or use cases
|
||||||
|
- Improving setup instructions
|
||||||
|
- Translating documentation (if applicable)
|
||||||
|
- Adding diagrams or visual aids
|
||||||
|
|
||||||
|
### 4.9 Community Involvement
|
||||||
|
|
||||||
|
Join our community:
|
||||||
|
|
||||||
|
- **Discord Server**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com) - Ask questions, discuss features
|
||||||
|
- **Forum**: [forum.nhcarrigan.com](https://forum.nhcarrigan.com) - Long-form discussions and support
|
||||||
|
- **GitHub Issues**: Track bugs and feature requests
|
||||||
|
|
||||||
|
### 4.10 Recognition
|
||||||
|
|
||||||
|
Contributors will be recognized in:
|
||||||
|
|
||||||
|
- Git commit history
|
||||||
|
- Release notes for significant contributions
|
||||||
|
- The community Discord server
|
||||||
|
|
||||||
|
### 4.11 Getting Help
|
||||||
|
|
||||||
|
If you need help while contributing:
|
||||||
|
|
||||||
|
- Ask in the Discord server (#development or #support channels)
|
||||||
|
- Post on the forum for detailed questions
|
||||||
|
- Comment on the relevant GitHub issue or pull request
|
||||||
|
- Email: contact@nhcarrigan.com
|
||||||
|
|
||||||
|
### 4.12 Release Process
|
||||||
|
|
||||||
|
The Application follows semantic versioning (SemVer):
|
||||||
|
|
||||||
|
- **Major versions** (X.0.0): Breaking changes
|
||||||
|
- **Minor versions** (0.X.0): New features, backward compatible
|
||||||
|
- **Patch versions** (0.0.X): Bug fixes, backward compatible
|
||||||
|
|
||||||
|
**Current Version**: v1.0.0 (as of latest commit: ba5987e)
|
||||||
|
|
||||||
|
Releases are managed by the maintainers. Contributors should focus on feature branches and pull requests rather than version bumping.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Additional Resources**:
|
||||||
|
|
||||||
|
- **Live Bot**: [Add to Discord](https://discord.com/oauth2/authorize?client_id=1391492296222179459)
|
||||||
|
- **Source Code**: [Gitea Repository](https://git.nhcarrigan.com/nhcarrigan/liora)
|
||||||
|
- **Documentation Hub**: [docs.nhcarrigan.com](https://docs.nhcarrigan.com)
|
||||||
|
- **Support Server**: [chat.nhcarrigan.com](https://chat.nhcarrigan.com)
|
||||||
|
- **Support Forum**: [forum.nhcarrigan.com](https://forum.nhcarrigan.com)
|
||||||
|
- **Contact Email**: contact@nhcarrigan.com
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: "@nhcarrigan/logger"
|
title: "Logger"
|
||||||
---
|
---
|
||||||
|
|
||||||
@nhcarrigan/logger (hereinafter the "Application") is a custom logging utility that provides a wrapper around a custom alert monitoring server, enabling applications to pipe errors and log messages to a centralized alerting system.
|
Logger (hereinafter the "Application") is a custom logging utility that provides a wrapper around a custom alert monitoring server, enabling applications to pipe errors and log messages to a centralized alerting system.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: Naomi's Adventure I: An Isekai Story
|
title: "Naomi's Adventure I: An Isekai Story"
|
||||||
---
|
---
|
||||||
|
|
||||||
Naomi's Adventure I: An Isekai Story (hereinafter the "Application") is an Isekai story, and our first paid game.
|
Naomi's Adventure I: An Isekai Story (hereinafter the "Application") is an Isekai story, and our first paid game.
|
||||||
|
|||||||
@@ -1,15 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: NHCarrigan Portfolio
|
title: Portfolio
|
||||||
---
|
---
|
||||||
|
Portfolio (hereinafter the "Application") is a static HTML landing page that serves as the primary web presence for NHCarrigan, a software engineering and community management consulting firm. The Application provides information about the organization's services, contact methods, past clients, and founder, while serving as a gateway to the broader NHCarrigan ecosystem of tools and communities.
|
||||||
NHCarrigan Portfolio (hereinafter the "Application") is a static HTML landing page that serves as the primary web presence for NHCarrigan, a software engineering and community management consulting firm. The Application provides information about the organization's services, contact methods, past clients, and founder, while serving as a gateway to the broader NHCarrigan ecosystem of tools and communities.
|
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
:::note
|
|
||||||
This section is coming soon!
|
|
||||||
:::
|
|
||||||
|
|
||||||
This section is for those interacting with a live instance of the Application.
|
This section is for those interacting with a live instance of the Application.
|
||||||
|
|
||||||
### Current Live Instance
|
### Current Live Instance
|
||||||
@@ -32,10 +27,6 @@ The Application is currently deployed and accessible at [nhcarrigan.com](https:/
|
|||||||
|
|
||||||
## 2. Technical Documentation
|
## 2. Technical Documentation
|
||||||
|
|
||||||
:::note
|
|
||||||
This section is coming soon!
|
|
||||||
:::
|
|
||||||
|
|
||||||
This section is for those interested in running their own instance of the Application.
|
This section is for those interested in running their own instance of the Application.
|
||||||
|
|
||||||
### Architecture
|
### Architecture
|
||||||
@@ -58,10 +49,6 @@ The Application is built as a simple static HTML website consisting of:
|
|||||||
|
|
||||||
## 3. Legal Documentation
|
## 3. Legal Documentation
|
||||||
|
|
||||||
:::note
|
|
||||||
This section is coming soon!
|
|
||||||
:::
|
|
||||||
|
|
||||||
This section is for expansions to our legal policies specific to the Application.
|
This section is for expansions to our legal policies specific to the Application.
|
||||||
|
|
||||||
### Current Legal Framework
|
### Current Legal Framework
|
||||||
@@ -75,10 +62,6 @@ The Application operates under NHCarrigan's standard legal documentation:
|
|||||||
|
|
||||||
## 4. Contributing Documentation
|
## 4. Contributing Documentation
|
||||||
|
|
||||||
:::note
|
|
||||||
This section is coming soon!
|
|
||||||
:::
|
|
||||||
|
|
||||||
This section is for documentation related to contributing to the Application's codebase.
|
This section is for documentation related to contributing to the Application's codebase.
|
||||||
|
|
||||||
### Current Contributing Guidelines
|
### Current Contributing Guidelines
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Naomi's Resume
|
title: Resume
|
||||||
---
|
---
|
||||||
|
|
||||||
Naomi's Resume (hereinafter the "Application") is a static site generator that transforms a YAML or JSON resume source into a styled HTML resume website, along with downloadable formats. It is designed for easy customization and deployment, using TypeScript for parsing and rendering, and outputs a ready-to-host static site.
|
Resume (hereinafter the "Application") is a static site generator that transforms a YAML or JSON resume source into a styled HTML resume website, along with downloadable formats. It is designed for easy customization and deployment, using TypeScript for parsing and rendering, and outputs a ready-to-host static site.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: TypeScript Configuration Package
|
title: TypeScript Config
|
||||||
---
|
---
|
||||||
|
|
||||||
TypeScript Configuration Package (hereinafter the "Application") is a shareable TypeScript compiler configuration package designed to enforce strict type checking and consistent coding standards across multiple TypeScript projects. The Application provides a pre-configured `tsconfig.json` that can be extended by other projects to maintain code quality and catch potential errors during development.
|
TypeScript Config (hereinafter the "Application") is a shareable TypeScript compiler configuration package designed to enforce strict type checking and consistent coding standards across multiple TypeScript projects. The Application provides a pre-configured `tsconfig.json` that can be extended by other projects to maintain code quality and catch potential errors during development.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Naomi's Themes
|
title: Naomi's VSCode Themes
|
||||||
---
|
---
|
||||||
|
|
||||||
Naomi's Themes (hereinafter the "Application") is a Visual Studio Code extension that provides a curated collection of custom color themes designed to enhance the coding experience with aesthetically pleasing color schemes. The Application currently offers four distinct themes: Ocean Breeze, Sakura Dreams, Sakura Dreams (Dark), and Trans Pride.
|
Naomi's VSCode Themes (hereinafter the "Application") is a Visual Studio Code extension that provides a curated collection of custom color themes designed to enhance the coding experience with aesthetically pleasing color schemes. The Application currently offers four distinct themes: Ocean Breeze, Sakura Dreams, Sakura Dreams (Dark), and Trans Pride.
|
||||||
|
|
||||||
## 1. User Documentation
|
## 1. User Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/naming-convention -- We are dealing with repository names, which are in kebab-case */
|
||||||
|
/**
|
||||||
|
* @copyright NHCarrigan
|
||||||
|
* @license Naomi's Public License
|
||||||
|
* @author Naomi Carrigan
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { readFile } from "node:fs/promises";
|
||||||
|
import { readdir } from "node:fs/promises";
|
||||||
|
import { join } from "node:path";
|
||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import matter from "gray-matter";
|
||||||
|
|
||||||
|
interface Project {
|
||||||
|
avatar?: string;
|
||||||
|
category: string;
|
||||||
|
description: string;
|
||||||
|
name: string;
|
||||||
|
premium: boolean;
|
||||||
|
url?: string;
|
||||||
|
wip: boolean;
|
||||||
|
}
|
||||||
|
const getProjects = async(): Promise<Array<Project>> => {
|
||||||
|
const request = await fetch("https://data.nhcarrigan.com/projects.json");
|
||||||
|
const data = await request.json();
|
||||||
|
return data as Array<Project>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const projectNameMap: Record<string, string> = {
|
||||||
|
"Naomi's Blog": "blog",
|
||||||
|
"NHCarrigan Documentation": "docs",
|
||||||
|
"Naomi's VSCode Themes": "vscode-themes",
|
||||||
|
"Artists4Palestine Bot": "a4p-bot",
|
||||||
|
"ESLint Config": "eslint-config",
|
||||||
|
"Naomi's Adventure I: An Isekai Story": "naomis-adventure-i",
|
||||||
|
};
|
||||||
|
|
||||||
|
const excludedProjects = new Set<string>([
|
||||||
|
"Translation Service",
|
||||||
|
"Gitea"
|
||||||
|
]);
|
||||||
|
|
||||||
|
const convertTitleCaseToKebabCase = (string_: string): string => {
|
||||||
|
return string_.toLowerCase().replace(/\s+/g, "-").replaceAll(/[:']/g, "");
|
||||||
|
};
|
||||||
|
|
||||||
|
describe("projects documentation", () => {
|
||||||
|
it("should include all public projects", async() => {
|
||||||
|
expect.hasAssertions();
|
||||||
|
const projects = await getProjects();
|
||||||
|
const docs = await readdir(join(__dirname, "..", "src", "content", "docs", "projects"));
|
||||||
|
for (const project of projects) {
|
||||||
|
if (excludedProjects.has(project.name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const page = docs.find((d) => {
|
||||||
|
return project.name in projectNameMap
|
||||||
|
? d.split(".")[0] === projectNameMap[project.name]
|
||||||
|
: d.split(".")[0] === convertTitleCaseToKebabCase(project.name);
|
||||||
|
});
|
||||||
|
expect(page, `Page not found for project ${project.name}`).toBeDefined();
|
||||||
|
const content = await readFile(join(__dirname, "..", "src", "content", "docs", "projects", page!), "utf-8");
|
||||||
|
const { data } = matter(content);
|
||||||
|
expect(data.title, `Title not found for project ${project.name}`).toBeDefined();
|
||||||
|
expect(data.title, `Title for project ${project.name} is not correct`).toBe(project.name);
|
||||||
|
if (project.wip) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
expect(content).not.toMatch(/:::note\nThis section is coming soon!\n:::/);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user