4 Commits

Author SHA1 Message Date
ae69bcd48e The official image does not support arm and building it yourself is garbage, so some random image from docker hub is used. Great Work
All checks were successful
CI / build (push) Successful in 52s
2023-11-28 16:47:09 +01:00
675a73e551 Add CI
All checks were successful
CI / build (push) Successful in 51s
2023-11-28 16:14:45 +01:00
310c8e12fa Merge branch 'master' of https://git.stamm.me/Deno/DenReg 2023-11-28 16:12:49 +01:00
a14a5b9462 Make it modern 2023-11-28 16:10:33 +01:00
36 changed files with 691 additions and 199 deletions

36
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,36 @@
# .github/workflows/ci.yml
name: CI
on:
push:
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
env:
MY_DOCKER_USERNAME: ${{ secrets.MY_DOCKER_USERNAME }}
MY_DOCKER_PASSWORD: ${{ secrets.MY_DOCKER_PASSWORD }}
FORCE_COLOR: 1
steps:
- uses: https://github.com/earthly/actions-setup@v1
with:
version: v0.7.0
- uses: actions/checkout@v2
- name: Put back the git branch into git (Earthly uses it for tagging)
run: |
branch=""
if [ -n "$GITHUB_HEAD_REF" ]; then
branch="$GITHUB_HEAD_REF"
else
branch="${GITHUB_REF##*/}"
fi
git checkout -b "$branch" || true
- name: Docker Login
run: docker login git.hibas.dev --username "$MY_DOCKER_USERNAME" --password "$MY_DOCKER_PASSWORD"
- name: Earthly version
run: earthly --version
- name: Run build
run: cd registry && earthly --push +docker-multi

View File

@ -4,5 +4,9 @@
"debug.javascript.usePreview": false, "debug.javascript.usePreview": false,
"deno.import_intellisense_origins": { "deno.import_intellisense_origins": {
"https://deno.land": true "https://deno.land": true
},
"deno.suggest.imports.hosts": {
"https://deno.land": true,
"https://deno.hibas123.de": false
} }
} }

View File

@ -1,11 +1,11 @@
import { Colors, Cliffy } from "../deps.ts"; import { Colors, CliffyPrompt } from "../deps.ts";
import { getMeta, setMeta, log } from "../global.ts"; import { getMeta, setMeta, log } from "../global.ts";
export default async function deprecate(options: any) { export default async function deprecate(options: any) {
const meta = await getMeta(); const meta = await getMeta();
const res = await Cliffy.Confirm.prompt( const res = await CliffyPrompt.Confirm.prompt(
"Are you sure you want to deprecat this package?" "Are you sure you want to deprecat this package?"
); );

View File

@ -1,4 +1,4 @@
import { Cliffy, Path, FS } from "../deps.ts"; import { CliffyPrompt, Path, FS } from "../deps.ts";
import { import {
getMeta, getMeta,
setMeta, setMeta,
@ -11,7 +11,7 @@ export default async function init() {
let existing = {}; let existing = {};
try { try {
existing = await getMeta(); existing = await getMeta();
} catch (err) {} } catch (err) { }
let meta: IMeta = { let meta: IMeta = {
name: Path.basename(Deno.cwd()).toLowerCase().replace(/\s+/g, "-"), name: Path.basename(Deno.cwd()).toLowerCase().replace(/\s+/g, "-"),
version: "0.0.1", version: "0.0.1",
@ -23,21 +23,21 @@ export default async function init() {
}; };
if (isInteractive()) { if (isInteractive()) {
meta.name = await Cliffy.Input.prompt({ meta.name = await CliffyPrompt.Input.prompt({
message: "What's the name of your package?", message: "What's the name of your package?",
default: meta.name, default: meta.name,
}); });
meta.description = await Cliffy.Input.prompt({ meta.description = await CliffyPrompt.Input.prompt({
message: "What's the description of your package?", message: "What's the description of your package?",
default: meta.description, default: meta.description,
}); });
meta.author = await Cliffy.Input.prompt({ meta.author = await CliffyPrompt.Input.prompt({
message: "Who's the author of your package?", message: "Who's the author of your package?",
default: meta.author, default: meta.author,
}); });
if (!(await FS.exists("README.md"))) { if (!(await FS.exists("README.md"))) {
const res = await Cliffy.Confirm.prompt({ const res = await CliffyPrompt.Confirm.prompt({
message: "Autogenerate README?", message: "Autogenerate README?",
default: true, default: true,
}); });

View File

@ -1,23 +1,23 @@
import { Cliffy } from "../deps.ts"; import { CliffyPrompt } from "../deps.ts";
import { getConfig, setConfig } from "../global.ts"; import { getConfig, setConfig } from "../global.ts";
export default async function setup() { export default async function setup() {
const registry = await Cliffy.Input.prompt({ const registry = await CliffyPrompt.Input.prompt({
message: "What's your registry?", message: "What's your registry?",
default: getConfig("registry"), default: getConfig("registry"),
}); });
const username = await Cliffy.Input.prompt({ const username = await CliffyPrompt.Input.prompt({
message: "What's your username?", message: "What's your username?",
default: getConfig("username"), default: getConfig("username"),
}); });
const password = await Cliffy.Secret.prompt({ const password = await CliffyPrompt.Secret.prompt({
message: "What's your password?", message: "What's your password?",
hidden: true, hidden: true,
default: getConfig("password"), default: getConfig("password"),
}); });
const author = await Cliffy.Input.prompt({ const author = await CliffyPrompt.Input.prompt({
message: "Who are you? (optional) Name <email@example.com>", message: "Who are you? (optional) Name <email@example.com>",
default: getConfig("author"), default: getConfig("author"),
}); });

View File

@ -1,4 +1,4 @@
import { Cliffy, Colors } from "../deps.ts"; import { CliffyPrompt, Colors } from "../deps.ts";
import { version } from "../version.ts"; import { version } from "../version.ts";
import { requestPermOrExit } from "../helper/permission.ts"; import { requestPermOrExit } from "../helper/permission.ts";
@ -12,14 +12,14 @@ export default async function upgrade() {
).then((e) => e.json()); ).then((e) => e.json());
if (meta.version === version) { if (meta.version === version) {
const res = await Cliffy.Confirm.prompt({ const res = await CliffyPrompt.Confirm.prompt({
message: Colors.yellow("No update available!") + " Continue?", message: Colors.yellow("No update available!") + " Continue?",
default: false, default: false,
}); });
if (!res) return; if (!res) return;
} }
const res = await Cliffy.Confirm.prompt({ const res = await CliffyPrompt.Confirm.prompt({
message: "Are you sure you want to upgrade?", message: "Are you sure you want to upgrade?",
default: true, default: true,
}); });

View File

@ -1,4 +1,4 @@
import { Cliffy, Path, Colors } from "./deps.ts"; import { CliffyCommand, Path, Colors } from "./deps.ts";
import { checkPermOrExit } from "./helper/permission.ts"; import { checkPermOrExit } from "./helper/permission.ts";
@ -32,7 +32,7 @@ const commandWrapper = (cmd: CommandHandler) => {
opts = params; opts = params;
}; };
}; };
const flags = await new Cliffy.Command() const flags = await new CliffyCommand.Command()
.name("denreg") .name("denreg")
.version(version) .version(version)
.description("CLI for the Open Source DenReg package registry") .description("CLI for the Open Source DenReg package registry")
@ -50,13 +50,13 @@ const flags = await new Cliffy.Command()
}) })
.command( .command(
"setup", "setup",
new Cliffy.Command() new CliffyCommand.Command()
.description("Configure cli") .description("Configure cli")
.action(commandWrapper(setupCMD)) .action(commandWrapper(setupCMD))
) )
.command( .command(
"publish", "publish",
new Cliffy.Command() new CliffyCommand.Command()
.description("Upload package") .description("Upload package")
.action(commandWrapper(publishCMD)) .action(commandWrapper(publishCMD))
.option("-d, --dry [dry:boolean]", "Dry run", { .option("-d, --dry [dry:boolean]", "Dry run", {
@ -65,13 +65,13 @@ const flags = await new Cliffy.Command()
) )
.command( .command(
"init", "init",
new Cliffy.Command() new CliffyCommand.Command()
.description("Create meta.json") .description("Create meta.json")
.action(commandWrapper(initCMD)) .action(commandWrapper(initCMD))
) )
.command( .command(
"bump", "bump",
new Cliffy.Command() new CliffyCommand.Command()
.complete("major|minor|patch", () => ["major", "minor", "patch"]) .complete("major|minor|patch", () => ["major", "minor", "patch"])
.arguments("<major|minor|patch>") .arguments("<major|minor|patch>")
.description("Change package version") .description("Change package version")
@ -79,26 +79,26 @@ const flags = await new Cliffy.Command()
) )
.command( .command(
"deprecate", "deprecate",
new Cliffy.Command() new CliffyCommand.Command()
.description("Deprecate package") .description("Deprecate package")
.action(commandWrapper(deprecateCMD)) .action(commandWrapper(deprecateCMD))
) )
.command( .command(
"upgrade", "upgrade",
new Cliffy.Command() new CliffyCommand.Command()
.description("Upgrade to latest version of denreg cli") .description("Upgrade to latest version of denreg cli")
.action(commandWrapper(upgradeCMD)) .action(commandWrapper(upgradeCMD))
) )
.command( .command(
"run", "run",
new Cliffy.Command() new CliffyCommand.Command()
.arguments("<name>") .arguments("<name>")
// .complete("name", ()=>) //TODO: add autocomplete? // .complete("name", ()=>) //TODO: add autocomplete?
.description("Run script from meta.json") .description("Run script from meta.json")
.action(commandWrapper(runCMD)) .action(commandWrapper(runCMD))
) )
.command("completions", new Cliffy.CompletionsCommand()) .command("completions", new CliffyCommand.CompletionsCommand())
.command("help", new Cliffy.HelpCommand().global()) .command("help", new CliffyCommand.HelpCommand().global())
.parse(Deno.args); .parse(Deno.args);
await init(flags.options); await init(flags.options);

View File

@ -1,5 +1,9 @@
export * as Compress from "https://deno.hibas123.de/raw/@denreg-tar/mod.ts"; export * as Compress from "https://deno.hibas123.de/raw/@denreg-tar/mod.ts";
export * as Ini from "https://deno.land/x/ini@v2.1.0/mod.ts"; export * as Ini from "https://deno.land/x/ini@v2.1.0/mod.ts";
export * as CliffyPrompt from "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/mod.ts";
export * as CliffyCommand from "https://deno.land/x/cliffy@v1.0.0-rc.3/command/mod.ts";
export * as Cliffy from "https://deno.land/x/cliffy@v0.18.2/mod.ts"; export * as Cliffy from "https://deno.land/x/cliffy@v0.18.2/mod.ts";
export * as Base64 from "https://deno.land/std@0.95.0/encoding/base64.ts"; export * as Base64 from "https://deno.land/std@0.95.0/encoding/base64.ts";
export * as FS from "https://deno.land/std@0.95.0/fs/mod.ts"; export * as FS from "https://deno.land/std@0.95.0/fs/mod.ts";

View File

@ -1,6 +1,6 @@
{ {
"name": "@denreg-cli", "name": "@denreg-cli",
"version": "0.3.3", "version": "1.0.0",
"description": "CLI for the DenReg package registry", "description": "CLI for the DenReg package registry",
"author": "Fabian Stamm <dev@fabianstamm.de>", "author": "Fabian Stamm <dev@fabianstamm.de>",
"contributors": [], "contributors": [],

View File

@ -1 +1 @@
export const version = "0.3.3" export const version = "1.0.0"

View File

@ -1,6 +1,6 @@
{ {
"name": "@denreg-jsx", "name": "@denreg-jsx",
"version": "0.1.2", "version": "0.1.4",
"description": "Denreg JSX renderer", "description": "Denreg JSX renderer",
"author": "Fabian Stamm <dev@fabianstamm.de>", "author": "Fabian Stamm <dev@fabianstamm.de>",
"contributors": [], "contributors": [],

View File

@ -1,6 +1,6 @@
{ {
"name": "markdown", "name": "markdown",
"version": "0.0.1", "version": "0.1.0",
"description": "", "description": "",
"author": "Fabian Stamm <dev@fabianstamm.de>", "author": "Fabian Stamm <dev@fabianstamm.de>",
"contributors": [], "contributors": [],

View File

@ -22,7 +22,9 @@ import {
Obj Obj
} from "./interfaces.ts"; } from "./interfaces.ts";
import { Marked } from "./marked.ts"; import { Marked } from "./marked.ts";
import { load } from "https://deno.land/std/encoding/_yaml/loader/loader.ts"; import { parse } from "https://deno.land/std@0.208.0/yaml/mod.ts";
export class BlockLexer<T extends typeof BlockLexer> { export class BlockLexer<T extends typeof BlockLexer> {
static simpleRules: RegExp[] = []; static simpleRules: RegExp[] = [];
@ -300,7 +302,7 @@ export class BlockLexer<T extends typeof BlockLexer> {
// Grabs front-matter data and parse it into Javascript object. // Grabs front-matter data and parse it into Javascript object.
if (fmArr = /^(?:\-\-\-)(.*?)(?:\-\-\-|\.\.\.)/s.exec(nextPart)) { if (fmArr = /^(?:\-\-\-)(.*?)(?:\-\-\-|\.\.\.)/s.exec(nextPart)) {
nextPart = nextPart.substring(fmArr[0].length); nextPart = nextPart.substring(fmArr[0].length);
this.frontmatter = <Obj> load(fmArr[1]); this.frontmatter = <Obj>parse(fmArr[1]);
} }
continue; continue;
@ -510,7 +512,7 @@ export class BlockLexer<T extends typeof BlockLexer> {
if (nextPart) { if (nextPart) {
throw new Error( throw new Error(
"Infinite loop on byte: " + nextPart.charCodeAt(0) + "Infinite loop on byte: " + nextPart.charCodeAt(0) +
`, near text '${nextPart.slice(0, 30)}...'`, `, near text '${nextPart.slice(0, 30)}...'`,
); );
} }
} }

View File

@ -1,11 +1,11 @@
FROM docker.hibas123.de/deno FROM docker.io/denoland/deno:alpine-1.38.3
WORKDIR /app WORKDIR /app
ADD src /app/src ADD src /app/src
ADD public /app/public ADD public /app/public
ADD tsconfig.json /app/ ADD deno.json /app/
RUN /usr/bin/deno cache --unstable --config /app/tsconfig.json src/registry.ts RUN deno cache --unstable src/registry.ts
VOLUME [ "/app/data" ] VOLUME [ "/app/data" ]
ENTRYPOINT [ "/usr/bin/deno", "run", "-A", "--unstable", "--config", "/app/tsconfig.json", "/app/src/registry.ts" ] CMD [ "run", "-A", "--unstable", "/app/src/registry.ts" ]

19
registry/Earthfile Normal file
View File

@ -0,0 +1,19 @@
VERSION 0.7
FROM docker.io/runcitadel/deno:v1.29.3
WORKDIR /app
docker-multi:
BUILD --platform linux/amd64 --platform linux/arm64 +docker
docker:
COPY src /app/src
COPY public /app/public
COPY deno.json /app/
RUN deno cache --unstable src/registry.ts
CMD [ "run", "-A", "--unstable", "/app/src/registry.ts" ]
ARG EARTHLY_TARGET_TAG
ARG TAG=$EARTHLY_TARGET_TAG
SAVE IMAGE --push git.hibas.dev/deno/denreg:$TAG

19
registry/deno.json Normal file
View File

@ -0,0 +1,19 @@
{
"tasks": {
"start": "deno run --allow-net --allow-read index.tsx"
},
"imports": {
"nano-jsx": "https://deno.land/x/nano_jsx@v0.0.34/mod.ts",
"oak": "https://deno.land/x/oak@v10.6.0/mod.ts"
},
"compilerOptions": {
"lib": [
"dom",
"dom.iterable",
"dom.asynciterable",
"deno.ns"
],
"jsxFactory": "h",
"jsxFragmentFactory": "Fragment"
}
}

388
registry/deno.lock generated Normal file
View File

@ -0,0 +1,388 @@
{
"version": "3",
"redirects": {
"https://deno.land/std/fs/mod.ts": "https://deno.land/std@0.208.0/fs/mod.ts",
"https://deno.land/std/path/mod.ts": "https://deno.land/std@0.208.0/path/mod.ts",
"https://deno.land/std/uuid/mod.ts": "https://deno.land/std@0.208.0/uuid/mod.ts",
"https://deno.land/x/base64/base64url.ts": "https://deno.land/x/base64@v0.2.1/base64url.ts",
"https://deno.land/x/nano_jsx/mod.ts": "https://deno.land/x/nano_jsx@v0.1.0/mod.ts",
"https://git.stamm.me/Deno/DenReg/raw/branch/master/tar/mod.ts": "https://git.hibas.dev/Deno/DenReg/raw/branch/master/tar/mod.ts"
},
"remote": {
"https://cdn.skypack.dev/-/@jsreport/mingo@v2.4.1-ZVYVnAnRedyuAPBNb9NZ/dist=es2019,mode=imports/optimized/@jsreport/mingo.js": "75213f47970810db2eaed8a551167ba85d301eeec879b21b8fce9faf61a68b33",
"https://cdn.skypack.dev/-/prismjs@v1.29.0-tsFxawAKDjgdZ80OeL0T/dist=es2019,mode=imports/optimized/prismjs.js": "4aa116c4194f957b8500bd5fbcec3b2cf9c9132dad3d1fcebebe634b9ef8603e",
"https://cdn.skypack.dev/@jsreport/mingo": "a2acca816e6078b3080e80b717fa09a9e0c7a805017d514536b0655b7dad79a7",
"https://cdn.skypack.dev/prismjs": "2f31eecf3dea3232b302fbc57b7d0383d8f27d4ce1b14c72b77989d33de16bd5",
"https://deno.hibas123.de/raw/ini@0.0.3/ini.ts": "436fba4744160024f02844ea255778c5009e65ececdccee65ff846e0edf5f829",
"https://deno.hibas123.de/raw/ini@0.0.3/mod.ts": "c04a10c3a9e7849149caaf7a9101dce60919345149797ac463f5a6778f3e062f",
"https://deno.hibas123.de/raw/markdown@0.1.0/mod.ts": "495ee5abb28bff8e6e4027819ece57f61342ef7715419675c1b1be24c47fc624",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/block-lexer.ts": "8bb407abb7dc0cdf99eef9610c67812057749a36f7ffddc87aa6ce30ece3df71",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/extend-regexp.ts": "187bbc8527a00add37f05790af39e0a242dd2064270ab52a536f104d76634ab7",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/helpers.ts": "5cfea4e14aed4dc1964c006bab11f83444f51db5cfdeeb9d94e0463f5fa3f369",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/inline-lexer.ts": "8e665c6540dd2dac5a71e4b0e67546b32315e7e2593ed076d4b5aecc03715df0",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/interfaces.ts": "fe985b08281f5e00e658aed72b16d1c890f465683f27e357b4aa34b26ff4e748",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/marked.ts": "36cacb1b13527429bf48935d0fed1f715e71238375ba5163054d57cb6ebbe732",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/parser.ts": "3b200dc5ca451f7309d794da517c8b80cfe333c3636e5beb168b29b952f10f9a",
"https://deno.hibas123.de/raw/markdown@0.1.0/src/renderer.ts": "5437d447a90e6bdff628dde6c5e56d2210bc979661c47850576dc9ed9372334b",
"https://deno.land/std@0.208.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee",
"https://deno.land/std@0.208.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56",
"https://deno.land/std@0.208.0/bytes/concat.ts": "d3d420badeb4f26a0f2f3ce343725f937326aff1b4634b25341b12b27353aac4",
"https://deno.land/std@0.208.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219",
"https://deno.land/std@0.208.0/crypto/_fnv/fnv32.ts": "e4649dfdefc5c987ed53c3c25db62db771a06d9d1b9c36d2b5cf0853b8e82153",
"https://deno.land/std@0.208.0/crypto/_fnv/fnv64.ts": "bfa0e4702061fdb490a14e6bf5f9168a22fb022b307c5723499469bfefca555e",
"https://deno.land/std@0.208.0/crypto/_fnv/mod.ts": "f956a95f58910f223e420340b7404702ecd429603acd4491fa77af84f746040c",
"https://deno.land/std@0.208.0/crypto/_fnv/util.ts": "accba12bfd80a352e32a872f87df2a195e75561f1b1304a4cb4f5a4648d288f9",
"https://deno.land/std@0.208.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "c41c4676a3ea2a92e8fdff55434533474131e4dfac2262a6a6c81631069808d8",
"https://deno.land/std@0.208.0/crypto/_wasm/mod.ts": "d7b7dc54bbd6b02c16cd08e8e3d30fa9aa9692efb112a7ab5d8595827b9a0234",
"https://deno.land/std@0.208.0/crypto/crypto.ts": "91c67764abb640b3e2a0b46867704d02077c0b1f978f5c711e4408e5d856717d",
"https://deno.land/std@0.208.0/encoding/_util.ts": "f368920189c4fe6592ab2e93bd7ded8f3065b84f95cd3e036a4a10a75649dcba",
"https://deno.land/std@0.208.0/encoding/base64.ts": "81c0ecff5ccb402def58ca03d8bd245bd01da15a077d3362b568e991aa10f4d9",
"https://deno.land/std@0.208.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978",
"https://deno.land/std@0.208.0/fs/copy.ts": "ca19e4837965914471df38fbd61e16f9e8adfe89f9cffb0c83615c83ea3fc2bf",
"https://deno.land/std@0.208.0/fs/empty_dir.ts": "7fba29ef2d03f3503cd512616efc0535984cf1bbe7ca9d098e8b4d0d88910120",
"https://deno.land/std@0.208.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40",
"https://deno.land/std@0.208.0/fs/ensure_file.ts": "39ac83cc283a20ec2735e956adf5de3e8a3334e0b6820547b5772f71c49ae083",
"https://deno.land/std@0.208.0/fs/ensure_link.ts": "c15e69c48556d78aae31b83e0c0ece04b7b8bc0951412f5b759aceb6fde7f0ac",
"https://deno.land/std@0.208.0/fs/ensure_symlink.ts": "b389c8568f0656d145ac7ece472afe710815cccbb2ebfd19da7978379ae143fe",
"https://deno.land/std@0.208.0/fs/eol.ts": "8565e1e076c5baced170236617150a7833668658e000205d896fc54084309ce1",
"https://deno.land/std@0.208.0/fs/exists.ts": "cb59a853d84871d87acab0e7936a4dac11282957f8e195102c5a7acb42546bb8",
"https://deno.land/std@0.208.0/fs/expand_glob.ts": "4f98c508fc9e40d6311d2f7fd88aaad05235cc506388c22dda315e095305811d",
"https://deno.land/std@0.208.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898",
"https://deno.land/std@0.208.0/fs/move.ts": "b4f8f46730b40c32ea3c0bc8eb0fd0e8139249a698883c7b3756424cf19785c9",
"https://deno.land/std@0.208.0/fs/walk.ts": "c1e6b43f72a46e89b630140308bd51a4795d416a416b4cfb7cd4bd1e25946723",
"https://deno.land/std@0.208.0/io/buffer.ts": "11acaeae3dc0e491a335d82915e09e9f8afd53ecb82562515e5951e78f69b076",
"https://deno.land/std@0.208.0/path/_common/assert_path.ts": "061e4d093d4ba5aebceb2c4da3318bfe3289e868570e9d3a8e327d91c2958946",
"https://deno.land/std@0.208.0/path/_common/basename.ts": "0d978ff818f339cd3b1d09dc914881f4d15617432ae519c1b8fdc09ff8d3789a",
"https://deno.land/std@0.208.0/path/_common/common.ts": "9e4233b2eeb50f8b2ae10ecc2108f58583aea6fd3e8907827020282dc2b76143",
"https://deno.land/std@0.208.0/path/_common/constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
"https://deno.land/std@0.208.0/path/_common/dirname.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397",
"https://deno.land/std@0.208.0/path/_common/format.ts": "11aa62e316dfbf22c126917f5e03ea5fe2ee707386555a8f513d27ad5756cf96",
"https://deno.land/std@0.208.0/path/_common/from_file_url.ts": "ef1bf3197d2efbf0297a2bdbf3a61d804b18f2bcce45548ae112313ec5be3c22",
"https://deno.land/std@0.208.0/path/_common/glob_to_reg_exp.ts": "5c3c2b79fc2294ec803d102bd9855c451c150021f452046312819fbb6d4dc156",
"https://deno.land/std@0.208.0/path/_common/normalize.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397",
"https://deno.land/std@0.208.0/path/_common/normalize_string.ts": "88c472f28ae49525f9fe82de8c8816d93442d46a30d6bb5063b07ff8a89ff589",
"https://deno.land/std@0.208.0/path/_common/relative.ts": "1af19d787a2a84b8c534cc487424fe101f614982ae4851382c978ab2216186b4",
"https://deno.land/std@0.208.0/path/_common/strip_trailing_separators.ts": "7ffc7c287e97bdeeee31b155828686967f222cd73f9e5780bfe7dfb1b58c6c65",
"https://deno.land/std@0.208.0/path/_common/to_file_url.ts": "a8cdd1633bc9175b7eebd3613266d7c0b6ae0fb0cff24120b6092ac31662f9ae",
"https://deno.land/std@0.208.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
"https://deno.land/std@0.208.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2",
"https://deno.land/std@0.208.0/path/basename.ts": "04bb5ef3e86bba8a35603b8f3b69537112cdd19ce64b77f2522006da2977a5f3",
"https://deno.land/std@0.208.0/path/common.ts": "f4d061c7d0b95a65c2a1a52439edec393e906b40f1caf4604c389fae7caa80f5",
"https://deno.land/std@0.208.0/path/dirname.ts": "88a0a71c21debafc4da7a4cd44fd32e899462df458fbca152390887d41c40361",
"https://deno.land/std@0.208.0/path/extname.ts": "2da4e2490f3b48b7121d19fb4c91681a5e11bd6bd99df4f6f47d7a71bb6ecdf2",
"https://deno.land/std@0.208.0/path/format.ts": "3457530cc85d1b4bab175f9ae73998b34fd456c830d01883169af0681b8894fb",
"https://deno.land/std@0.208.0/path/from_file_url.ts": "e7fa233ea1dff9641e8d566153a24d95010110185a6f418dd2e32320926043f8",
"https://deno.land/std@0.208.0/path/glob.ts": "a00a81a55c02bbe074ab21a50b6495c6f7795f54cd718c824adaa92c6c9b7419",
"https://deno.land/std@0.208.0/path/glob_to_regexp.ts": "74d7448c471e293d03f05ccb968df4365fed6aaa508506b6325a8efdc01d8271",
"https://deno.land/std@0.208.0/path/is_absolute.ts": "67232b41b860571c5b7537f4954c88d86ae2ba45e883ee37d3dec27b74909d13",
"https://deno.land/std@0.208.0/path/is_glob.ts": "567dce5c6656bdedfc6b3ee6c0833e1e4db2b8dff6e62148e94a917f289c06ad",
"https://deno.land/std@0.208.0/path/join.ts": "98d3d76c819af4a11a81d5ba2dbb319f1ce9d63fc2b615597d4bcfddd4a89a09",
"https://deno.land/std@0.208.0/path/join_globs.ts": "9b84d5103b63d3dbed4b2cf8b12477b2ad415c7d343f1488505162dc0e5f4db8",
"https://deno.land/std@0.208.0/path/mod.ts": "3defabebc98279e62b392fee7a6937adc932a8f4dcd2471441e36c15b97b00e0",
"https://deno.land/std@0.208.0/path/normalize.ts": "aa95be9a92c7bd4f9dc0ba51e942a1973e2b93d266cd74f5ca751c136d520b66",
"https://deno.land/std@0.208.0/path/normalize_glob.ts": "674baa82e1c00b6cb153bbca36e06f8e0337cb8062db6d905ab5de16076ca46b",
"https://deno.land/std@0.208.0/path/parse.ts": "d87ff0deef3fb495bc0d862278ff96da5a06acf0625ca27769fc52ac0d3d6ece",
"https://deno.land/std@0.208.0/path/posix/_util.ts": "ecf49560fedd7dd376c6156cc5565cad97c1abe9824f4417adebc7acc36c93e5",
"https://deno.land/std@0.208.0/path/posix/basename.ts": "a630aeb8fd8e27356b1823b9dedd505e30085015407caa3396332752f6b8406a",
"https://deno.land/std@0.208.0/path/posix/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b",
"https://deno.land/std@0.208.0/path/posix/dirname.ts": "f48c9c42cc670803b505478b7ef162c7cfa9d8e751b59d278b2ec59470531472",
"https://deno.land/std@0.208.0/path/posix/extname.ts": "ee7f6571a9c0a37f9218fbf510c440d1685a7c13082c348d701396cc795e0be0",
"https://deno.land/std@0.208.0/path/posix/format.ts": "b94876f77e61bfe1f147d5ccb46a920636cd3cef8be43df330f0052b03875968",
"https://deno.land/std@0.208.0/path/posix/from_file_url.ts": "b97287a83e6407ac27bdf3ab621db3fccbf1c27df0a1b1f20e1e1b5acf38a379",
"https://deno.land/std@0.208.0/path/posix/glob_to_regexp.ts": "6ed00c71fbfe0ccc35977c35444f94e82200b721905a60bd1278b1b768d68b1a",
"https://deno.land/std@0.208.0/path/posix/is_absolute.ts": "159900a3422d11069d48395568217eb7fc105ceda2683d03d9b7c0f0769e01b8",
"https://deno.land/std@0.208.0/path/posix/is_glob.ts": "ec4fbc604b9db8487f7b56ab0e759b24a971ab6a45f7b0b698bc39b8b9f9680f",
"https://deno.land/std@0.208.0/path/posix/join.ts": "0c0d84bdc344876930126640011ec1b888e6facf74153ffad9ef26813aa2a076",
"https://deno.land/std@0.208.0/path/posix/join_globs.ts": "f4838d54b1f60a34a40625a3293f6e583135348be1b2974341ac04743cb26121",
"https://deno.land/std@0.208.0/path/posix/mod.ts": "f1b08a7f64294b7de87fc37190d63b6ce5b02889af9290c9703afe01951360ae",
"https://deno.land/std@0.208.0/path/posix/normalize.ts": "11de90a94ab7148cc46e5a288f7d732aade1d616bc8c862f5560fa18ff987b4b",
"https://deno.land/std@0.208.0/path/posix/normalize_glob.ts": "10a1840c628ebbab679254d5fa1c20e59106102354fb648a1765aed72eb9f3f9",
"https://deno.land/std@0.208.0/path/posix/parse.ts": "199208f373dd93a792e9c585352bfc73a6293411bed6da6d3bc4f4ef90b04c8e",
"https://deno.land/std@0.208.0/path/posix/relative.ts": "e2f230608b0f083e6deaa06e063943e5accb3320c28aef8d87528fbb7fe6504c",
"https://deno.land/std@0.208.0/path/posix/resolve.ts": "51579d83159d5c719518c9ae50812a63959bbcb7561d79acbdb2c3682236e285",
"https://deno.land/std@0.208.0/path/posix/separator.ts": "0b6573b5f3269a3164d8edc9cefc33a02dd51003731c561008c8bb60220ebac1",
"https://deno.land/std@0.208.0/path/posix/to_file_url.ts": "08d43ea839ee75e9b8b1538376cfe95911070a655cd312bc9a00f88ef14967b6",
"https://deno.land/std@0.208.0/path/posix/to_namespaced_path.ts": "c9228a0e74fd37e76622cd7b142b8416663a9b87db643302fa0926b5a5c83bdc",
"https://deno.land/std@0.208.0/path/relative.ts": "23d45ede8b7ac464a8299663a43488aad6b561414e7cbbe4790775590db6349c",
"https://deno.land/std@0.208.0/path/resolve.ts": "5b184efc87155a0af9fa305ff68a109e28de9aee81fc3e77cd01380f19daf867",
"https://deno.land/std@0.208.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f",
"https://deno.land/std@0.208.0/path/to_file_url.ts": "edaafa089e0bce386e1b2d47afe7c72e379ff93b28a5829a5885e4b6c626d864",
"https://deno.land/std@0.208.0/path/to_namespaced_path.ts": "cf8734848aac3c7527d1689d2adf82132b1618eff3cc523a775068847416b22a",
"https://deno.land/std@0.208.0/path/windows/_util.ts": "f32b9444554c8863b9b4814025c700492a2b57ff2369d015360970a1b1099d54",
"https://deno.land/std@0.208.0/path/windows/basename.ts": "8a9dbf7353d50afbc5b221af36c02a72c2d1b2b5b9f7c65bf6a5a2a0baf88ad3",
"https://deno.land/std@0.208.0/path/windows/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b",
"https://deno.land/std@0.208.0/path/windows/dirname.ts": "5c2aa541384bf0bd9aca821275d2a8690e8238fa846198ef5c7515ce31a01a94",
"https://deno.land/std@0.208.0/path/windows/extname.ts": "07f4fa1b40d06a827446b3e3bcc8d619c5546b079b8ed0c77040bbef716c7614",
"https://deno.land/std@0.208.0/path/windows/format.ts": "343019130d78f172a5c49fdc7e64686a7faf41553268961e7b6c92a6d6548edf",
"https://deno.land/std@0.208.0/path/windows/from_file_url.ts": "d53335c12b0725893d768be3ac6bf0112cc5b639d2deb0171b35988493b46199",
"https://deno.land/std@0.208.0/path/windows/glob_to_regexp.ts": "290755e18ec6c1a4f4d711c3390537358e8e3179581e66261a0cf348b1a13395",
"https://deno.land/std@0.208.0/path/windows/is_absolute.ts": "245b56b5f355ede8664bd7f080c910a97e2169972d23075554ae14d73722c53c",
"https://deno.land/std@0.208.0/path/windows/is_glob.ts": "ec4fbc604b9db8487f7b56ab0e759b24a971ab6a45f7b0b698bc39b8b9f9680f",
"https://deno.land/std@0.208.0/path/windows/join.ts": "e6600bf88edeeef4e2276e155b8de1d5dec0435fd526ba2dc4d37986b2882f16",
"https://deno.land/std@0.208.0/path/windows/join_globs.ts": "f4838d54b1f60a34a40625a3293f6e583135348be1b2974341ac04743cb26121",
"https://deno.land/std@0.208.0/path/windows/mod.ts": "d7040f461465c2c21c1c68fc988ef0bdddd499912138cde3abf6ad60c7fb3814",
"https://deno.land/std@0.208.0/path/windows/normalize.ts": "9deebbf40c81ef540b7b945d4ccd7a6a2c5a5992f791e6d3377043031e164e69",
"https://deno.land/std@0.208.0/path/windows/normalize_glob.ts": "344ff5ed45430495b9a3d695567291e50e00b1b3b04ea56712a2acf07ab5c128",
"https://deno.land/std@0.208.0/path/windows/parse.ts": "120faf778fe1f22056f33ded069b68e12447668fcfa19540c0129561428d3ae5",
"https://deno.land/std@0.208.0/path/windows/relative.ts": "026855cd2c36c8f28f1df3c6fbd8f2449a2aa21f48797a74700c5d872b86d649",
"https://deno.land/std@0.208.0/path/windows/resolve.ts": "5ff441ab18a2346abadf778121128ee71bda4d0898513d4639a6ca04edca366b",
"https://deno.land/std@0.208.0/path/windows/separator.ts": "ae21f27015f10510ed1ac4a0ba9c4c9c967cbdd9d9e776a3e4967553c397bd5d",
"https://deno.land/std@0.208.0/path/windows/to_file_url.ts": "8e9ea9e1ff364aa06fa72999204229952d0a279dbb876b7b838b2b2fea55cce3",
"https://deno.land/std@0.208.0/path/windows/to_namespaced_path.ts": "e0f4d4a5e77f28a5708c1a33ff24360f35637ba6d8f103d19661255ef7bfd50d",
"https://deno.land/std@0.208.0/streams/_common.ts": "3b2c1f0287ce2ad51fff4091a7d0f48375c85b0ec341468e76d5ac13bb0014dd",
"https://deno.land/std@0.208.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb",
"https://deno.land/std@0.208.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a",
"https://deno.land/std@0.208.0/streams/copy.ts": "faa201291ce9116fb1fae9d16b4f033e259fdea437b77404ff5cf742507844e6",
"https://deno.land/std@0.208.0/streams/delimiter_stream.ts": "af7aab15d830636265c998ca330576edb6a50959fec1949d2fa57ef8dda299d2",
"https://deno.land/std@0.208.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1",
"https://deno.land/std@0.208.0/streams/iterate_reader.ts": "d6b2770f8ee27fb1c1e2c5a3c66451647f6fb5371534c78bef2ce614d60568d8",
"https://deno.land/std@0.208.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048",
"https://deno.land/std@0.208.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38",
"https://deno.land/std@0.208.0/streams/merge_readable_streams.ts": "22963b9bbec8d000d9613db859002768e013fd731cafd55942dc0120d03e7b5d",
"https://deno.land/std@0.208.0/streams/mod.ts": "e133c271474f1e9dc19f5c4959406f5c2101540c56a3e7d7abc6bdb7bcef807e",
"https://deno.land/std@0.208.0/streams/read_all.ts": "64bfb842f4047f81d977dead27b6e5a9faaba17c8f1c30066284553dcfc13171",
"https://deno.land/std@0.208.0/streams/readable_stream_from_reader.ts": "c28abb70a35c683f522b6bd43d39c272db33d86d874c59e728e26f270956b773",
"https://deno.land/std@0.208.0/streams/reader_from_iterable.ts": "4fd184770b3756987b97c7718df3f5c4a2828b50e1cdc33111827d640dca6366",
"https://deno.land/std@0.208.0/streams/reader_from_stream_reader.ts": "6fb8852fdd9775ce940a4facf6e265f1f233cc3b90f6d064b1556f6b0ef3d18b",
"https://deno.land/std@0.208.0/streams/text_delimiter_stream.ts": "f0dc8ff953a8a77f0d1fa8db1fee62de817f36e20d79b00b1362847e30fbdd90",
"https://deno.land/std@0.208.0/streams/text_line_stream.ts": "4958525688593d20c1c439a006dabd64881736bff642744ca060b2c34b40c240",
"https://deno.land/std@0.208.0/streams/to_array_buffer.ts": "31b0729f6527054760a3758e84d6d646eac0f7f586204a81824c3eb7728ce836",
"https://deno.land/std@0.208.0/streams/to_blob.ts": "4cf929b3ffe5d4dbe445d572246159ee2eebf69e998a0ba867b9048fb6e92797",
"https://deno.land/std@0.208.0/streams/to_json.ts": "10635fac9826392bb8e70bc8354d3beb1058fa1676aa9b6f98257a0d5575f520",
"https://deno.land/std@0.208.0/streams/to_text.ts": "4018b5f7a0e7ab28d6957c239e401f8b534ef326b7ebd282ca76b3cd55380aab",
"https://deno.land/std@0.208.0/streams/to_transform_stream.ts": "50af06140c414090df8c3879f46bed4043a5d73caa60352c0c9682a88ec7a8c9",
"https://deno.land/std@0.208.0/streams/writable_stream_from_writer.ts": "057bdfc6c08e34a8a86e2d61efe7354a8a0976260cd1437de8b7e64bcefaa9b9",
"https://deno.land/std@0.208.0/streams/write_all.ts": "8fc9525c16eb60eb851274d4693ecd35c2177620239fbdfa8f5aacb32702f2cb",
"https://deno.land/std@0.208.0/streams/writer_from_stream_writer.ts": "71d7a26f2a2b955794a7318856ad64d9eade36467d930b40698d3d5bfb0ce3b4",
"https://deno.land/std@0.208.0/streams/zip_readable_streams.ts": "721c5bce8862c8225e60995b2d61c7b1b1d5b5178b60d303a01f453d5c26bb62",
"https://deno.land/std@0.208.0/uuid/_common.ts": "cb1441f4df460571fc0919e1c5c217f3e7006189b703caf946604b3f791ae34d",
"https://deno.land/std@0.208.0/uuid/constants.ts": "0d0e95561343da44adb4a4edbc1f04cef48b0d75288c4d1704f58743f4a50d88",
"https://deno.land/std@0.208.0/uuid/mod.ts": "5c7ca252dddba1ddf0bca2dc1124328245272650c98251d71996bb9cd8f5a386",
"https://deno.land/std@0.208.0/uuid/v1.ts": "fe36009afce7ced96e1b5928565e12c5a8eb0df1a2b5063c0a72bda6b75c0de5",
"https://deno.land/std@0.208.0/uuid/v3.ts": "397ad58daec8b5ef6ba7e94fe86c9bc56b194adcbe2f70ec40a1fb005203c870",
"https://deno.land/std@0.208.0/uuid/v4.ts": "0f081880c156fd59b9e44e2f84ea0f94a3627e89c224eaf6cc982b53d849f37e",
"https://deno.land/std@0.208.0/uuid/v5.ts": "9daaf769e487b512d25adf8e137e05ff2e3392d27f66d5b273ee28030ff7cd58",
"https://deno.land/std@0.208.0/yaml/_dumper/dumper.ts": "717403d0e700de783f2ef5c906b3d7245383e1509fc050e7ff5d4a53a03dbf40",
"https://deno.land/std@0.208.0/yaml/_dumper/dumper_state.ts": "f0d0673ceea288334061ca34b63954c2bb5feb5bf6de5e4cfe9a942cdf6e5efe",
"https://deno.land/std@0.208.0/yaml/_error.ts": "b59e2c76ce5a47b1b9fa0ff9f96c1dd92ea1e1b17ce4347ece5944a95c3c1a84",
"https://deno.land/std@0.208.0/yaml/_loader/loader.ts": "63ec7f0a265dbbabc54b25a4beefff7650e205160a2d75c7d8f8363b5f84851a",
"https://deno.land/std@0.208.0/yaml/_loader/loader_state.ts": "0841870b467169269d7c2dfa75cd288c319bc06f65edd9e42c29e5fced91c7a4",
"https://deno.land/std@0.208.0/yaml/_mark.ts": "dcd8585dee585e024475e9f3fe27d29740670fb64ebb970388094cad0fc11d5d",
"https://deno.land/std@0.208.0/yaml/_state.ts": "ef03d55ec235d48dcfbecc0ab3ade90bfae69a61094846e08003421c2cf5cfc6",
"https://deno.land/std@0.208.0/yaml/_type/binary.ts": "24d49614463a7339a8a16d894919c2ec18a10588ae360ec352093b60e2cc8b0d",
"https://deno.land/std@0.208.0/yaml/_type/bool.ts": "5bfa75da84343d45347b521ba4e5aeace9fe6f53447405290d53315a3fc20e66",
"https://deno.land/std@0.208.0/yaml/_type/float.ts": "056bd3cb9c5586238b20517511014fb24b0e36f98f9f6073e12da308b6b9808a",
"https://deno.land/std@0.208.0/yaml/_type/function.ts": "ff574fe84a750695302864e1c31b93f12d14ada4bde79a5f93197fc33ad17471",
"https://deno.land/std@0.208.0/yaml/_type/int.ts": "563ad074f0fa7aecf6b6c3d84135bcc95a8269dcc15de878de20ce868fd773fa",
"https://deno.land/std@0.208.0/yaml/_type/map.ts": "7b105e4ab03a361c61e7e335a0baf4d40f06460b13920e5af3fb2783a1464000",
"https://deno.land/std@0.208.0/yaml/_type/merge.ts": "8192bf3e4d637f32567917f48bb276043da9cf729cf594e5ec191f7cd229337e",
"https://deno.land/std@0.208.0/yaml/_type/mod.ts": "060e2b3d38725094b77ea3a3f05fc7e671fced8e67ca18e525be98c4aa8f4bbb",
"https://deno.land/std@0.208.0/yaml/_type/nil.ts": "606e8f0c44d73117c81abec822f89ef81e40f712258c74f186baa1af659b8887",
"https://deno.land/std@0.208.0/yaml/_type/omap.ts": "cfe59a294726f5cea705c39a61fd2b08199cf48f4ccd6b040cb550ec0f38d0a1",
"https://deno.land/std@0.208.0/yaml/_type/pairs.ts": "0032fdfe57558d21696a4f8cf5b5cfd1f698743177080affc18629685c905666",
"https://deno.land/std@0.208.0/yaml/_type/regexp.ts": "1ce118de15b2da43b4bd8e4395f42d448b731acf3bdaf7c888f40789f9a95f8b",
"https://deno.land/std@0.208.0/yaml/_type/seq.ts": "95333abeec8a7e4d967b8c8328b269e342a4bbdd2585395549b9c4f58c8533a2",
"https://deno.land/std@0.208.0/yaml/_type/set.ts": "f28ba44e632ef2a6eb580486fd47a460445eeddbdf1dbc739c3e62486f566092",
"https://deno.land/std@0.208.0/yaml/_type/str.ts": "a67a3c6e429d95041399e964015511779b1130ea5889fa257c48457bd3446e31",
"https://deno.land/std@0.208.0/yaml/_type/timestamp.ts": "706ea80a76a73e48efaeb400ace087da1f927647b53ad6f754f4e06d51af087f",
"https://deno.land/std@0.208.0/yaml/_type/undefined.ts": "94a316ca450597ccbc6750cbd79097ad0d5f3a019797eed3c841a040c29540ba",
"https://deno.land/std@0.208.0/yaml/_utils.ts": "26b311f0d42a7ce025060bd6320a68b50e52fd24a839581eb31734cd48e20393",
"https://deno.land/std@0.208.0/yaml/mod.ts": "28ecda6652f3e7a7735ee29c247bfbd32a2e2fc5724068e9fd173ec4e59f66f7",
"https://deno.land/std@0.208.0/yaml/parse.ts": "1fbbda572bf3fff578b6482c0d8b85097a38de3176bf3ab2ca70c25fb0c960ef",
"https://deno.land/std@0.208.0/yaml/schema.ts": "96908b78dc50c340074b93fc1598d5e7e2fe59103f89ff81e5a49b2dedf77a67",
"https://deno.land/std@0.208.0/yaml/schema/core.ts": "fa406f18ceedc87a50e28bb90ec7a4c09eebb337f94ef17468349794fa828639",
"https://deno.land/std@0.208.0/yaml/schema/default.ts": "0047e80ae8a4a93293bc4c557ae8a546aabd46bb7165b9d9b940d57b4d88bde9",
"https://deno.land/std@0.208.0/yaml/schema/extended.ts": "0784416bf062d20a1626b53c03380e265b3e39b9409afb9f4cb7d659fd71e60d",
"https://deno.land/std@0.208.0/yaml/schema/failsafe.ts": "d219ab5febc43f770917d8ec37735a4b1ad671149846cbdcade767832b42b92b",
"https://deno.land/std@0.208.0/yaml/schema/json.ts": "5f41dd7c2f1ad545ef6238633ce9ee3d444dfc5a18101e1768bd5504bf90e5e5",
"https://deno.land/std@0.208.0/yaml/schema/mod.ts": "4472e827bab5025e92bc2eb2eeefa70ecbefc64b2799b765c69af84822efef32",
"https://deno.land/std@0.208.0/yaml/stringify.ts": "fffc09c65c68d3d63f8159e8cbaa3f489bc20a8e55b4fbb61a8c2e9f914d1d02",
"https://deno.land/std@0.208.0/yaml/type.ts": "65553da3da3c029b6589c6e4903f0afbea6768be8fca61580711457151f2b30f",
"https://deno.land/std@0.63.0/_util/assert.ts": "e1f76e77c5ccb5a8e0dbbbe6cce3a56d2556c8cb5a9a8802fc9565af72462149",
"https://deno.land/std@0.63.0/archive/tar.ts": "5a0a7465d57fec2684239b07da0f5ec884c6c71a768297f73c348f22e04acd92",
"https://deno.land/std@0.63.0/bytes/mod.ts": "b1a149ac741728db00bda9ce1a2d044f248edd5ac95e708a6cc501bfd3adb4a7",
"https://deno.land/std@0.63.0/encoding/utf8.ts": "8654fa820aa69a37ec5eb11908e20b39d056c9bf1c23ab294303ff467f3d50a1",
"https://deno.land/std@0.63.0/fs/_util.ts": "68508c05d5a02678179a02beabf2b3eac5b16c5a9cbd1c272686d8101bb2679d",
"https://deno.land/std@0.63.0/fs/copy.ts": "b562e8f482cb8459bb011cbd769769bbdb4f6bc966effd277c06edbdbe41b72e",
"https://deno.land/std@0.63.0/fs/empty_dir.ts": "4d706eb01e5d08d862c673200d1978526e485368559fc7fb0f297add68f9cc43",
"https://deno.land/std@0.63.0/fs/ensure_dir.ts": "54cf0cfb16160857116d1bdff98214ad0189275fe2f089607fdc06c52ac79cc4",
"https://deno.land/std@0.63.0/fs/ensure_file.ts": "b70eccaee6f41ae226d399ad9c8ebc29beb5dd86fe179d30ab7e681976352baf",
"https://deno.land/std@0.63.0/fs/ensure_link.ts": "f647cea5c3b65f4a6618444546e9ca891d38f54f7fd4c718fb1fd575b4232213",
"https://deno.land/std@0.63.0/fs/ensure_symlink.ts": "d472af1507fb920db214f6816522ddc89eefd5800735243873053b2523882ec1",
"https://deno.land/std@0.63.0/fs/eol.ts": "4a0b2a612e0639b76d9c5fab0392e7bf1a158a7dab191ff7b7564870a1173812",
"https://deno.land/std@0.63.0/fs/exists.ts": "5429dce6587bfcdde06a7a2a1fd5ad932c17d74ca082e67934fa646cff1d2e57",
"https://deno.land/std@0.63.0/fs/expand_glob.ts": "415a109faaf50f8bf3e116bac534928a72373d0a981784e6130d91d11ce543a6",
"https://deno.land/std@0.63.0/fs/mod.ts": "88bb982130bb86df1cb350619fed4118c4cc439eeced6484330b7255e3a16568",
"https://deno.land/std@0.63.0/fs/move.ts": "020f56063c66288facbebc7d3c8dd3f309b0949fcaea49e463ccd5217fc82e2c",
"https://deno.land/std@0.63.0/fs/read_json.ts": "6922a9adc50cd2a7233298fd7b7ad9062d8602a55d4abb2b72d23ef0268b1306",
"https://deno.land/std@0.63.0/fs/walk.ts": "1715028b1646648b1239b9f93ff42beaf38f8e77424f8f9c2ffab9ee1594a54f",
"https://deno.land/std@0.63.0/fs/write_json.ts": "89a6231f51a6759dfff8f1f5534d030c2239c22fc9f3c0b3305d424f4f1d5604",
"https://deno.land/std@0.63.0/io/bufio.ts": "e76c5b7bf978a638aae6f62b87efde3ab7203b85902ce9b84ac8388c8c2bb104",
"https://deno.land/std@0.63.0/io/readers.ts": "4c2e98abf2a2a1d5e2adaf460479a1c69f742951c1bc141b26654d2f5248b663",
"https://deno.land/std@0.63.0/path/_constants.ts": "e11f32a36644e04dce243f3c1f30c02cc5d149827f48a755628176f0707cfc70",
"https://deno.land/std@0.63.0/path/_globrex.ts": "cfd1af99fb5ed2eff9b49aef994cdf7a14a5d26cd32b14c60b27bfff49839c82",
"https://deno.land/std@0.63.0/path/_interface.ts": "5876f91d35fd42624893a4aaddaee352144e1f46e719f1dde6511bab7c3c1029",
"https://deno.land/std@0.63.0/path/_util.ts": "f0fa012d40ae9b6acbef03908e534eb11e694de6470fb4d78ea4f38829e735ab",
"https://deno.land/std@0.63.0/path/common.ts": "e4ec66a7416d56f60331b66e27a8a4f08c7b1cf48e350271cb69754a01cf5c04",
"https://deno.land/std@0.63.0/path/glob.ts": "dbcda011329b5ba0f955823e578af19a8bf8d01586a07925b42affe885544e62",
"https://deno.land/std@0.63.0/path/mod.ts": "6de8885c2534757097818e302becd1cefcbc4c28ac022cc279e612ee04e8cfd1",
"https://deno.land/std@0.63.0/path/posix.ts": "1a6e53e1c90dde43750f38134ace0f6300f7330f5456b60d4979a4564fcf5f7a",
"https://deno.land/std@0.63.0/path/separator.ts": "9dd15d46ff84a16e13554f56af7fee1f85f8d0f379efbbe60ac066a60561f036",
"https://deno.land/std@0.63.0/path/win32.ts": "b530878b0f3f281c7f06fa73dc8e89a15106ab06e88ca1dea27394d09a1b0514",
"https://deno.land/std@0.79.0/async/pool.ts": "a499691231d8c249f044f69d204b479ad3af7f115e0b37342829eff076bc2450",
"https://deno.land/std@0.79.0/encoding/base64.ts": "b1d8f99b778981548457ec74bc6273ad785ffd6f61b2233bd5b30925345b565d",
"https://deno.land/std@0.79.0/encoding/hex.ts": "07a03ba41c96060a4ed4ba272e50b9e23f3c5b3839f4b069cdebc24d57434386",
"https://deno.land/std@0.79.0/hash/_wasm/hash.ts": "005f64c4d9343ecbc91e0da9ae5e800f146c20930ad829bbb872c5c06bd89c5f",
"https://deno.land/std@0.79.0/hash/_wasm/wasm.js": "fa27095b91e6268682100997577f1d3478beab5b045777e27ff7b2b5d19c8fdc",
"https://deno.land/std@0.79.0/hash/mod.ts": "e764a6a9ab2f5519a97f928e17cc13d984e3dd5c7f742ff9c1c8fb3114790f0c",
"https://deno.land/std@0.80.0/fs/eol.ts": "e133163510b683fc26a8285c4fa81e259a398ca592ab49edc3fdc9b2cc71e99a",
"https://deno.land/std@0.81.0/_util/assert.ts": "e1f76e77c5ccb5a8e0dbbbe6cce3a56d2556c8cb5a9a8802fc9565af72462149",
"https://deno.land/std@0.81.0/_util/has_own_property.ts": "91a2ef2fae5d941643a6472b97cac7ed8060a96deb66f4fafb4a2750c8af18e5",
"https://deno.land/std@0.81.0/_util/os.ts": "e2be3e25f96e4b5a233a08fd03aba80819bcaee66ac53c11c9b5aaa64799b475",
"https://deno.land/std@0.81.0/async/deferred.ts": "ecdb71319e164ec4ace5a44e3ee991b52c21bfc19e498acdf8eccdc0b1184f70",
"https://deno.land/std@0.81.0/async/delay.ts": "35957d585a6e3dd87706858fb1d6b551cb278271b03f52c5a2cb70e65e00c26a",
"https://deno.land/std@0.81.0/async/mod.ts": "39f2602a005805dd1e6b9da4ee5391b14d15e8fec4fa5494a6165c599911d746",
"https://deno.land/std@0.81.0/async/mux_async_iterator.ts": "2532c6f448fda34db7ab9504746db671c32425dd4ffa96eeb9df744c3038c106",
"https://deno.land/std@0.81.0/async/pool.ts": "a499691231d8c249f044f69d204b479ad3af7f115e0b37342829eff076bc2450",
"https://deno.land/std@0.81.0/bytes/mod.ts": "e4f91c6473fe13e3cf1a23649137f87f49135c10bc08fc0f83382a0fb0b03744",
"https://deno.land/std@0.81.0/datetime/formatter.ts": "0db8ca0d476bd80151b3557eb8f1bb2b6d5ba0713c8fc98f3526c2ce8c01649e",
"https://deno.land/std@0.81.0/datetime/mod.ts": "38ecaf7da9f81da63a18c7e6d4602ba70f563e99ab786c179393c7984fbf6006",
"https://deno.land/std@0.81.0/datetime/tokenizer.ts": "ae21a459f2f017ac81b1b49caa81174b6b8ab8a4d8d82195dcf25bb67b565c71",
"https://deno.land/std@0.81.0/encoding/utf8.ts": "1b7e77db9a12363c67872f8a208886ca1329f160c1ca9133b13d2ed399688b99",
"https://deno.land/std@0.81.0/fmt/colors.ts": "c5665c66f1a67228f21c5989bbb04b36d369b98dd7ceac06f5e26856c81c2531",
"https://deno.land/std@0.81.0/http/_io.ts": "8e1ed7effe99446535a98ac0cdcfd544265c78c46e4cef5a8c5f8e31037711d9",
"https://deno.land/std@0.81.0/http/cookie.ts": "8b54d578e1b72df92b30ec65c0e0d89142fec8700bff18a8cfe3ce87e60edeb6",
"https://deno.land/std@0.81.0/http/http_status.ts": "0ecc0799a208f49452023b1b927106ba5a2c13cc6cf6666345db028239d554ab",
"https://deno.land/std@0.81.0/http/server.ts": "282bb3b13da077a760083b465843fc2b8bf8936c3e22c514f6ae695db0721866",
"https://deno.land/std@0.81.0/io/bufio.ts": "3cbbe1f761c1c636d1e7128ed4e7fdca6bf21d9199aa3cae71e69972a6ae8f93",
"https://deno.land/std@0.81.0/io/ioutil.ts": "b781afd113a7d29c88c3d88efec391a0446c3e6537b74f795dd8579339ae8a5f",
"https://deno.land/std@0.81.0/io/readers.ts": "4c2e98abf2a2a1d5e2adaf460479a1c69f742951c1bc141b26654d2f5248b663",
"https://deno.land/std@0.81.0/mime/multipart.ts": "fa3c5ea5374ecae99e02543506a6ef4dc43ed5f3e26f406e8f4fea20f184cca6",
"https://deno.land/std@0.81.0/path/_constants.ts": "3a19d04e5d6de4620df22ab40c2e8c9d87002b56702d2b4669c14dfa2765e368",
"https://deno.land/std@0.81.0/path/_interface.ts": "67b276380d297a7cedc3c17f7a0bf122edcfc96a3e1f69de06f379d85ba0e2c0",
"https://deno.land/std@0.81.0/path/_util.ts": "7820a788b35c26dfc27ff329df12507fc0553ae92727009597046f6cf856b4fa",
"https://deno.land/std@0.81.0/path/common.ts": "e4ec66a7416d56f60331b66e27a8a4f08c7b1cf48e350271cb69754a01cf5c04",
"https://deno.land/std@0.81.0/path/glob.ts": "c36be777b82346a3fac02ef0ffef7d6c9bfe4da50f4599c798d7ded072f88d22",
"https://deno.land/std@0.81.0/path/mod.ts": "ef6a91aed4bc417eb56f8d5947f117f35ed3ca76c24d19dc482d3d6514218d5f",
"https://deno.land/std@0.81.0/path/posix.ts": "0f635537634111caa17a944b7405cf0a50ed6d6dd1a847c65323bebeccec5718",
"https://deno.land/std@0.81.0/path/separator.ts": "696812939d47fbe095002e92d595e3a1cdf03157222029a39c68dce9995f38c4",
"https://deno.land/std@0.81.0/path/win32.ts": "c5efe2a88d2351adddb53c22439ef32dc1081bc0d4205ae54a2ce388bcc600fb",
"https://deno.land/std@0.81.0/textproto/mod.ts": "4c378eda3cb6216608bb4c3a34201761c65f6980c4669455ca224c330cd5b790",
"https://deno.land/std@0.83.0/_util/assert.ts": "e1f76e77c5ccb5a8e0dbbbe6cce3a56d2556c8cb5a9a8802fc9565af72462149",
"https://deno.land/std@0.83.0/_util/os.ts": "e2be3e25f96e4b5a233a08fd03aba80819bcaee66ac53c11c9b5aaa64799b475",
"https://deno.land/std@0.83.0/encoding/base64.ts": "b1d8f99b778981548457ec74bc6273ad785ffd6f61b2233bd5b30925345b565d",
"https://deno.land/std@0.83.0/encoding/hex.ts": "fa01b16414c8e04caa0055f2d8c4610a3ec714a04315d0afe6956e07d501e11d",
"https://deno.land/std@0.83.0/fmt/colors.ts": "c5665c66f1a67228f21c5989bbb04b36d369b98dd7ceac06f5e26856c81c2531",
"https://deno.land/std@0.83.0/fs/_util.ts": "9318f5253cb09177280bdce64b6af97012707cdb458c02864811c2bae1dd1dbd",
"https://deno.land/std@0.83.0/fs/copy.ts": "94a9035388fb197e5d61db360bbf77497dbddd66bce56a42b7b6e0c39d5f7a2e",
"https://deno.land/std@0.83.0/fs/empty_dir.ts": "4d706eb01e5d08d862c673200d1978526e485368559fc7fb0f297add68f9cc43",
"https://deno.land/std@0.83.0/fs/ensure_dir.ts": "54cf0cfb16160857116d1bdff98214ad0189275fe2f089607fdc06c52ac79cc4",
"https://deno.land/std@0.83.0/fs/ensure_file.ts": "b70eccaee6f41ae226d399ad9c8ebc29beb5dd86fe179d30ab7e681976352baf",
"https://deno.land/std@0.83.0/fs/ensure_link.ts": "f647cea5c3b65f4a6618444546e9ca891d38f54f7fd4c718fb1fd575b4232213",
"https://deno.land/std@0.83.0/fs/ensure_symlink.ts": "88e14896b2cf069ac6342cf929c1ca57a681eb90f48e5af658c05fbb100c6097",
"https://deno.land/std@0.83.0/fs/eol.ts": "e133163510b683fc26a8285c4fa81e259a398ca592ab49edc3fdc9b2cc71e99a",
"https://deno.land/std@0.83.0/fs/exists.ts": "5429dce6587bfcdde06a7a2a1fd5ad932c17d74ca082e67934fa646cff1d2e57",
"https://deno.land/std@0.83.0/fs/expand_glob.ts": "1b43b860bd0834f2d79db4b88bb3ae97b4aed6c91e377bb843cc9d2f024bb117",
"https://deno.land/std@0.83.0/fs/mod.ts": "54ba0d1dac6de21ac32e3b60b83930e7febb4a2148ed735013b8d911c889d172",
"https://deno.land/std@0.83.0/fs/move.ts": "63803372793b85edfb8da586145fa5d33f4836caf4cea919f5b172b06bcab08a",
"https://deno.land/std@0.83.0/fs/walk.ts": "8d37f2164a7397668842a7cb5d53b9e7bcd216462623b1b96abe519f76d7f8b9",
"https://deno.land/std@0.83.0/hash/_wasm/hash.ts": "005f64c4d9343ecbc91e0da9ae5e800f146c20930ad829bbb872c5c06bd89c5f",
"https://deno.land/std@0.83.0/hash/_wasm/wasm.js": "fa27095b91e6268682100997577f1d3478beab5b045777e27ff7b2b5d19c8fdc",
"https://deno.land/std@0.83.0/hash/mod.ts": "e764a6a9ab2f5519a97f928e17cc13d984e3dd5c7f742ff9c1c8fb3114790f0c",
"https://deno.land/std@0.83.0/path/_constants.ts": "3a19d04e5d6de4620df22ab40c2e8c9d87002b56702d2b4669c14dfa2765e368",
"https://deno.land/std@0.83.0/path/_interface.ts": "67b276380d297a7cedc3c17f7a0bf122edcfc96a3e1f69de06f379d85ba0e2c0",
"https://deno.land/std@0.83.0/path/_util.ts": "7820a788b35c26dfc27ff329df12507fc0553ae92727009597046f6cf856b4fa",
"https://deno.land/std@0.83.0/path/common.ts": "e4ec66a7416d56f60331b66e27a8a4f08c7b1cf48e350271cb69754a01cf5c04",
"https://deno.land/std@0.83.0/path/glob.ts": "c36be777b82346a3fac02ef0ffef7d6c9bfe4da50f4599c798d7ded072f88d22",
"https://deno.land/std@0.83.0/path/mod.ts": "ef6a91aed4bc417eb56f8d5947f117f35ed3ca76c24d19dc482d3d6514218d5f",
"https://deno.land/std@0.83.0/path/posix.ts": "0f635537634111caa17a944b7405cf0a50ed6d6dd1a847c65323bebeccec5718",
"https://deno.land/std@0.83.0/path/separator.ts": "696812939d47fbe095002e92d595e3a1cdf03157222029a39c68dce9995f38c4",
"https://deno.land/std@0.83.0/path/win32.ts": "c5efe2a88d2351adddb53c22439ef32dc1081bc0d4205ae54a2ce388bcc600fb",
"https://deno.land/x/abc@v1.2.4/_header.ts": "111617a83e956c74f2bb2c3ccbb0cc39801b13365c11c050e74d0b74d31546ac",
"https://deno.land/x/abc@v1.2.4/_http_method.ts": "407c04d24eaee5ce9a1b00a9f1ef0d5b0b0cacfec080a98ece15ed8471ee9ef8",
"https://deno.land/x/abc@v1.2.4/_mime.ts": "32d91f49a4477ec4901830b12c22ce77c5ade18bc22f83ce6e3f803c47cbfdd3",
"https://deno.land/x/abc@v1.2.4/app.ts": "88c0ff086e82cabf7a72276a263cc4d51de6db2e9d8f947dff3f8370a9488b7c",
"https://deno.land/x/abc@v1.2.4/constants.ts": "1c04ea5873f9540a1c227c70ebbf97f3f3c2751a88b98f035f7eccf6b3ae4201",
"https://deno.land/x/abc@v1.2.4/context.ts": "e919516d5b9b21bbb70cd59409174b98a72f05f8fbb1f41ed30ca7a75170b806",
"https://deno.land/x/abc@v1.2.4/group.ts": "cadbb1476b06b828494bf1fc049c1184cd5fc8bf519c1eb9e59e5b4409c8eba6",
"https://deno.land/x/abc@v1.2.4/http_exception.ts": "45cd2e85f3f63f011af35064459d5180257766ebc4af981aef6c3a7fc9955ca3",
"https://deno.land/x/abc@v1.2.4/middleware/cors.ts": "c274cfb67d71a97e3648a299aad5a7eed428a20ee02914bb3428c044d66edd3c",
"https://deno.land/x/abc@v1.2.4/middleware/logger.ts": "18aaf687a365050c8cffa133019bf2af13c4fdf755ea75ab6f8c194059f40a5c",
"https://deno.land/x/abc@v1.2.4/middleware/skipper.ts": "a8f299c116b6f68e6c3f387cb871b2e7d6f4418ecee927f0fc0ca1794be53662",
"https://deno.land/x/abc@v1.2.4/mod.ts": "861cbdf90446f40afc7ddcaacbcb69e432e0970e6c6ea830ea80fd988de3a2e8",
"https://deno.land/x/abc@v1.2.4/router.ts": "45be01701031eda4c95f9a68c6248014a4e939c2e9e0679d920867fe327a7da0",
"https://deno.land/x/abc@v1.2.4/types.ts": "2e8a6ebbacf3c814b3b1f40d9b38a8833d8e41b55b67a23e5bbedf4edb51212a",
"https://deno.land/x/abc@v1.2.4/util.ts": "8eb6a894461a1875132b4d380cf6e52396a5fbcc7e1cde4aa7d523183cadf51b",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/encoding/utf8.ts": "7e1736536d5c8c9c5a541eff0515ab1fbb068c7d3ee2064264c87adcb540c7b7",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/fmt/colors.ts": "4ccb3297215fff946df10a6e8f844cf582534562f1c36d8a66addc3681be907f",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/http/cookie.ts": "8a62a5a7a9f7231e4045f176e45ace7a54b39f90019771a6308c383591ca04d2",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/http/http_status.ts": "f517061c2ff552bf04414a00b77b57aff6c1f8493fb9ecc06c966e082e7c0e45",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/http/server.ts": "7c1511c064a883e2f34aaa19a6f4a7403364447c6f95f7cdb238f7aa50e9e49c",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/mime/multipart.ts": "f5e978a047df388190a59d9ddb5905ae75048e129b14c9b8ca567f1322699672",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/std/path/mod.ts": "a095ff43f5219bbe6ebee2e4038106b0cb6509499cee5d650e63749c802ffb6a",
"https://deno.land/x/abc@v1.2.4/vendor/https/deno.land/x/router/mod.ts": "a12a329c0b5d04e409fc7ad9f202fd3f78ed494e0236c04eba98a02e69731707",
"https://deno.land/x/aws_sign_v4@0.1.5/deps.ts": "83822a3274e4e2fa51d62f099fde58500a842c1ebd220d407cc2c9428296b7f3",
"https://deno.land/x/aws_sign_v4@0.1.5/mod.ts": "133d10a9073f1550795bdea025a398a5b2e64bb0276af6c4e76d963fec0eac84",
"https://deno.land/x/aws_sign_v4@0.1.5/src/date.ts": "96d156206dceadbede0e8cd709dd2b0f8c8aef858359dbe187b78c50bdc73353",
"https://deno.land/x/aws_sign_v4@0.1.5/src/signing.ts": "20188270e96390320b776d6b00596a02140106fabb5cb61e0a3263252fd0c8ba",
"https://deno.land/x/base64@v0.2.1/base.ts": "47dc8d68f07dc91524bdd6db36eccbe59cf4d935b5fc09f27357a3944bb3ff7b",
"https://deno.land/x/base64@v0.2.1/base64url.ts": "18bbf879b31f1f32cca8adaa2b6885ae325c2cec6a66c5817b684ca12c46ad5e",
"https://deno.land/x/html_entities@v1.0/lib/xml-entities.js": "cbbc40f7b6fd1f925508ff7d43a52d2383a57a64d0aaa3a7a1eca9d4155e4bde",
"https://deno.land/x/nano_jsx@v0.1.0/component.ts": "6bd3dab67754e91308df863e11e2b7945bbe0bf575b4bc529e8a9e02087eb732",
"https://deno.land/x/nano_jsx@v0.1.0/components/helmet.ts": "59e598dc79c7b18620de175c61eb26f4aeb6905a6654cd63359208a26471541e",
"https://deno.land/x/nano_jsx@v0.1.0/components/img.ts": "82a9f830394a7d6cd9b789b48fe1e70bc64eb151c4b410a3da74347c06acdae0",
"https://deno.land/x/nano_jsx@v0.1.0/components/index.ts": "8855ee8302a9a19f38202d4a7ff5b17e22942600da02356bdfbc80c99c5c55f5",
"https://deno.land/x/nano_jsx@v0.1.0/components/link.ts": "0f0b1c57dc8c466203105062335e0d9ded89a34e75d08b1bbeece198d42021cb",
"https://deno.land/x/nano_jsx@v0.1.0/components/router.ts": "186e77064a96c31cb66ff1935c93d91904347647fcb13b56b5875ea64905397d",
"https://deno.land/x/nano_jsx@v0.1.0/components/suspense.ts": "0711b7cdcd42b0b085972eca796d3ba7c436a736e1d2ce17db7e0cd1d3b928f5",
"https://deno.land/x/nano_jsx@v0.1.0/components/visible.ts": "f19487f7faff0bad38a5549f1efac1df351e83ee4a77ca5886412b439f4b6b53",
"https://deno.land/x/nano_jsx@v0.1.0/context.ts": "a65018beedf3e1863b96f9d99cf2d471c231a6ae0c77877a77754a398105f9fc",
"https://deno.land/x/nano_jsx@v0.1.0/core.ts": "9346346ba7ddc52057131953a333c3ffa12e2a93aaceb25dabbab4bf8f1a171c",
"https://deno.land/x/nano_jsx@v0.1.0/customElementsMode.ts": "61b9688ae89bfcc6109b72eaab4d82a69a8482d89770f3e2c1359b79bf57bb91",
"https://deno.land/x/nano_jsx@v0.1.0/fragment.ts": "9cfb0dcdcb02d5cc53f027b4b55609e4f9d6d9322b665292e572856f4b688569",
"https://deno.land/x/nano_jsx@v0.1.0/helpers.ts": "d904aa646534f1c0cf7c05a6c8e02231f906d962acb725c964aedbcf50216d85",
"https://deno.land/x/nano_jsx@v0.1.0/htm.ts": "d8d9cd4fb4ad4645bff3698c7eb96e7798022c5519d04e709ebde236edde156b",
"https://deno.land/x/nano_jsx@v0.1.0/htm/build.ts": "9d6b6eb407c0db2d1213a3f9c82efc66a2bec34c89976132ff13e3e095dcaaaf",
"https://deno.land/x/nano_jsx@v0.1.0/htm/constants.ts": "3f296f87f03bd0ba8d7673884a1f6c4c927a2774648eaa4fd3ca9e3c46c3f7b8",
"https://deno.land/x/nano_jsx@v0.1.0/htm/index.ts": "29912b9f7a760884fce79caca82649b9772cfa3c3272e0426a4ce377b67d70d5",
"https://deno.land/x/nano_jsx@v0.1.0/index.ts": "0f39c911a39c61cb39f9bd8a2481500126dcb1b2a826d5b4523dd47a08b6938d",
"https://deno.land/x/nano_jsx@v0.1.0/jsx.ts": "7d5b4d4a249fba1a42f2016f54f71ca049d96ff490e098db4a19b2a9b197b952",
"https://deno.land/x/nano_jsx@v0.1.0/lazy.ts": "f8b8a2b915daff1fb70704ffad5171c805f1e28778b5cd0f8c827780762776c4",
"https://deno.land/x/nano_jsx@v0.1.0/mod.ts": "3dda2bc0dbee9abd01c03acf43ab55a7854952afe0450245fc2ad12eb9bd9598",
"https://deno.land/x/nano_jsx@v0.1.0/regexDom.ts": "de82fd3110c5a367e3d4ba9b774cfef3baf995deff455edc7363551d79089c90",
"https://deno.land/x/nano_jsx@v0.1.0/ssr.ts": "1ab6c17f41f612fe409d29d81ce1f17692ff02e5abea6ef4080cabecafc246dd",
"https://deno.land/x/nano_jsx@v0.1.0/state.ts": "cfc6ca6eb5e65f4cd60717a0a96ce604053bacf6e0b8835afbe22327e9979a1b",
"https://deno.land/x/nano_jsx@v0.1.0/store.ts": "bf075833a656fc87b2a24c486bb3f77e13f19d6d9efcc42e31ffb6f24ec8eb93",
"https://deno.land/x/nano_jsx@v0.1.0/types.ts": "fb338d7fa4422a92c442d14e073a2deb01d42b017fcd36013a1f6554e17c5449",
"https://deno.land/x/nano_jsx@v0.1.0/version.ts": "d7f3813a3b1c490f16e77047483b0dc52cc0cec6cb1b73d6926cf9ad96129a59",
"https://deno.land/x/nano_jsx@v0.1.0/withStyles.ts": "8aae4c8e79319fe991d49dd8ccc927c221786dfe58de640dba9d9885ce0dd4b7",
"https://deno.land/x/router@v2.0.0/mod.ts": "8792d3c390e0446d89eb94ee8030dd20de18f2aba649e263d2832f3f150ea2ce",
"https://deno.land/x/s3@0.3.0/deps.ts": "590be3be45b218c91979d4d70db22cc25d16aa2f0ea6d4c414508f87bb3525e7",
"https://deno.land/x/s3@0.3.0/mod.ts": "2f2bee45abe1c1197bba5d251ea49b3a342ed474c829119f315202011195f649",
"https://deno.land/x/s3@0.3.0/src/bucket.ts": "85fd6d3a4f633ef70509d60397aa4dbf4cc7b6cfb155dedc70a22794a49984ff",
"https://deno.land/x/s3@0.3.0/src/error.ts": "a7857ca64eedbaf5c4daad5e83fdef5c4acd61534bffdab784b4e17e008e6aae",
"https://denopkg.com/chiefbiiko/hmac@v1.0.2/deps.ts": "fb061e6fa0fd96f455ef647c57e9e6309a86fb0bf484447fc6cb38e57262192f",
"https://denopkg.com/chiefbiiko/hmac@v1.0.2/mod.ts": "83590b95de468d0cf5398b7631b4fb62a64226786247fe265482045d799e8f97",
"https://denopkg.com/chiefbiiko/sha1@v1.0.3/deps.ts": "2e1af51a48c8507017fdb057b950366601b177fb7e73d5de54c1b3e0e115d72e",
"https://denopkg.com/chiefbiiko/sha1@v1.0.3/mod.ts": "146a101c9776cc9c807053c93f23e4b321ade5251f65745df418f4a75d5fd27b",
"https://denopkg.com/chiefbiiko/sha256@v1.0.2/deps.ts": "2e1af51a48c8507017fdb057b950366601b177fb7e73d5de54c1b3e0e115d72e",
"https://denopkg.com/chiefbiiko/sha256@v1.0.2/mod.ts": "f109aa5eeb201a0cbfaf44950b70a429838b187e8a84c5b810c1ac84953427cc",
"https://denopkg.com/chiefbiiko/sha512@v1.0.3/deps.ts": "2e1af51a48c8507017fdb057b950366601b177fb7e73d5de54c1b3e0e115d72e",
"https://denopkg.com/chiefbiiko/sha512@v1.0.3/mod.ts": "33190babd4c0e748bb2568fd003444487c8798c8c3a618f6593098c12805fe15",
"https://denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.ts": "4a927e5cd1d9b080d72881eb285b3b94edb6dadc1828aeb194117645f4481ac0",
"https://git.hibas.dev/Deno/DenReg/raw/branch/master/tar/mod.ts": "472497c6ef7ed0f45e11c6ad9a3d7ff9caf3ea9da377e53b73a9466d089f1beb",
"https://git.hibas.dev/Deno/DenReg/raw/branch/master/tar/src/deps.ts": "d8066e3bcd0a1885ce6b352f71845ec639e9392f7b84f517d1ff6d70e39498ec",
"https://git.hibas.dev/Deno/DenReg/raw/branch/master/tar/src/mod.ts": "438a487ea4a8ef4f2767cd2399a569fd0ef59524b4863b68568775a2bca76416",
"https://raw.githubusercontent.com/hibas123/dndb/master/deps.ts": "02b61f3ce1d74cf2f0c723b4e43240a6c6da39166391b1adec5b139c06e8e010",
"https://raw.githubusercontent.com/hibas123/dndb/master/mod.ts": "3890f580d22e97bacf44050661b74a2c4a3dcbf75e4d8e0f56fd2cbce9305f2a",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/methods/find.js": "59b664c58cc986a2639b3a5ca0a158ddbc6cf812345f65c0b2bd3533c058dc41",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/methods/findOne.js": "3230785e45781324b421c47b7e9ef1f5bd058691d75d2eae9ab2242815159792",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/methods/insert.js": "8df8a869bf97c16eb5ee696157b59cf8d2b0238b427b08a92b6e4e63ce2ffadd",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/methods/mod.js": "fe009c4a55bad2ad84a0d3ad7ee0ab0d3166f91f2f706fe0550df92a90171b7e",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/methods/remove.js": "5f623dea009ec34831ba8362175a090b1055f28fe9576e9f929ce7df888a6467",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/methods/update.js": "9e8c9ec9cfebe3c46cfe68ef6fd98e452c24cb93c858f58e03d1d81b87c62da6",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/mod.ts": "476b9d0069b60443b3e9684fa086374bffbc45f02a083b7608c28dfd5733f702",
"https://raw.githubusercontent.com/hibas123/dndb/master/src/storage.js": "fa06befe5609fda4dfc6fc2ddc0cfdc4765ddf0b9cccf106fc14435f83ef975c",
"https://raw.githubusercontent.com/nekobato/deno-xml-parser/0bc4c2bd2f5fad36d274279978ca57eec57c680c/index.ts": "05d093028c005706e37b46bfe2bb7e2488f42fdc74d2196ac818902336927c01"
}
}

View File

@ -1,8 +1,4 @@
// @deno-types="./types/hotfix.d.ts" // @deno-types="./types/hotfix.d.ts"
export * as S3 from "https://deno.land/x/s3@0.3.0/mod.ts";
export { S3Error } from "https://deno.land/x/s3@0.3.0/src/error.ts";
export * as Ini from "https://deno.hibas123.de/raw/ini@0.0.3/mod.ts"; export * as Ini from "https://deno.hibas123.de/raw/ini@0.0.3/mod.ts";
export * as ABC from "https://deno.land/x/abc@v1.2.4/mod.ts"; export * as ABC from "https://deno.land/x/abc@v1.2.4/mod.ts";
@ -11,20 +7,20 @@ export * as LoggerMW from "https://deno.land/x/abc@v1.2.4/middleware/logger.ts";
export * as Path from "https://deno.land/std@0.83.0/path/mod.ts"; export * as Path from "https://deno.land/std@0.83.0/path/mod.ts";
export * as FS from "https://deno.land/std@0.83.0/fs/mod.ts"; export * as FS from "https://deno.land/std@0.83.0/fs/mod.ts";
export * as Base64 from "https://deno.land/std@0.83.0/encoding/base64.ts"; export * as Base64 from "https://deno.land/std@0.208.0/encoding/base64.ts";
export * as Hash from "https://deno.land/std@0.83.0/hash/mod.ts"; export * as Hash from "https://deno.land/std@0.83.0/hash/mod.ts";
export * as Colors from "https://deno.land/std@0.83.0/fmt/colors.ts"; export * as Colors from "https://deno.land/std@0.83.0/fmt/colors.ts";
export * as Streams from "https://deno.land/std@0.208.0/streams/mod.ts";
export * as Compress from "https://git.stamm.me/Deno/DenReg/raw/branch/master/tar/mod.ts";
export * as Compress from "https://git.hibas.dev/Deno/DenReg/raw/branch/master/tar/mod.ts";
export { default as Prism } from "https://cdn.skypack.dev/prismjs"; export { default as Prism } from "https://cdn.skypack.dev/prismjs";
export { Marked } from "https://deno.hibas123.de/raw/markdown/mod.ts"; export { Marked } from "https://deno.hibas123.de/raw/markdown@0.1.0/mod.ts";
import DS from "https://raw.githubusercontent.com/hibas123/dndb/master/mod.ts"; import DS from "https://raw.githubusercontent.com/hibas123/dndb/master/mod.ts";
import * as Pico from "https://deno.hibas123.de/raw/@denreg-jsx@0.1.2/mod.ts"; export * as Nano from "https://deno.land/x/nano_jsx@v0.1.0/mod.ts";
export { Pico };
export const Datastore = DS; export const Datastore = DS;

View File

@ -1,17 +1,16 @@
import { ABC, Path, Compress, FS, Colors, S3Error } from "../deps.ts"; import { ABC, Path, Compress, FS, Colors } from "../deps.ts";
import bucket from "../s3.ts";
import { import {
isValidPackageName, isValidPackageName,
basicauth, basicauth,
isValidFullVersion, isValidFullVersion,
getAbsolutePackageVersion, getAbsolutePackageVersion,
getBucketFilePath, getFilePath,
} from "../utils.ts"; } from "../utils.ts";
import db, { IPackage } from "../db.ts"; import * as Storage from "../storage.ts";
import { v4 } from "https://deno.land/std/uuid/mod.ts"; import db from "../db.ts";
export default function api(g: ABC.Group) { export default function api(g: ABC.Group) {
const cacheControl = (next: ABC.HandlerFunc) => (ctx: ABC.Context) => { const cacheControl = (next: ABC.HandlerFunc) => (ctx: ABC.Context) => {
@ -21,14 +20,15 @@ export default function api(g: ABC.Group) {
g.get( g.get(
"/", "/",
(ctx) => { (_ctx) => {
return { version: "1" }; return { version: "1" };
}, },
cacheControl cacheControl
); );
g.get("/module", async (ctx) => { g.get("/module", async (_ctx) => {
return db.package.find({}).then((res) => res.map((e) => e.name)); const res = await db.package.find({});
return res.map((e) => e.name);
}); });
g.get("/module/:module", async (ctx) => { g.get("/module/:module", async (ctx) => {
@ -47,7 +47,7 @@ export default function api(g: ABC.Group) {
ctx.response.status = 404; ctx.response.status = 404;
return "// Not found"; return "// Not found";
} else { } else {
let version = getAbsolutePackageVersion( const version = getAbsolutePackageVersion(
module, module,
ctx.params.version ctx.params.version
) as string; ) as string;
@ -57,19 +57,17 @@ export default function api(g: ABC.Group) {
return "// Not found"; return "// Not found";
} }
const bucketPath = await getBucketFilePath(module.name, version, "/"); const bucketPath = await getFilePath(module.name, version, "/");
const filesItr = Storage.walkFiles(module.name + "/" + version + "/");
const filesItr = bucket.listAllObjects({
batchSize: 100,
prefix: bucketPath,
});
const allowedExts = new Set( const allowedExts = new Set(
(ctx.queryParams.ext || "js|ts").split("|").map((e) => "." + e) (ctx.queryParams.ext || "js|ts").split("|").map((e) => "." + e)
); );
let files: string[] = []; const files: string[] = [];
for await (let file of filesItr) { for await (const file of filesItr) {
const relPath = Path.posix.relative(bucketPath, file.key || ""); const relPath = Path.posix.relative(bucketPath, file.path || "");
const ext = Path.extname(relPath); const ext = Path.extname(relPath);
if (allowedExts.has(ext)) files.push(relPath); if (allowedExts.has(ext)) files.push(relPath);
} }
@ -100,7 +98,7 @@ export default function api(g: ABC.Group) {
// } // }
async function uploadPackage(ctx: ABC.Context) { async function uploadPackage(ctx: ABC.Context) {
const reqId = v4.generate(); const reqId = crypto.randomUUID();
const filename = "./tmp/" + reqId + ".tar"; const filename = "./tmp/" + reqId + ".tar";
const folder = "./tmp/" + reqId; const folder = "./tmp/" + reqId;
@ -119,6 +117,7 @@ async function uploadPackage(ctx: ABC.Context) {
write: true, write: true,
create: true, create: true,
}); });
// ctx.request.body.pipeTo(file); //TODO: Do this, once web framework is updated
await Deno.copy(ctx.request.body, file); await Deno.copy(ctx.request.body, file);
file.close(); file.close();
@ -156,7 +155,6 @@ async function uploadPackage(ctx: ABC.Context) {
success: false, success: false,
message: "Invalid version. Version must be in format: 0.0.0", message: "Invalid version. Version must be in format: 0.0.0",
}; };
return;
} }
console.log("Checking for previous uploads"); console.log("Checking for previous uploads");
@ -187,7 +185,7 @@ async function uploadPackage(ctx: ABC.Context) {
}; };
} }
const bucketBase = "packages/" + packageName + "/" + packageVersion + "/"; const storageBase = packageName + "/" + packageVersion + "/";
console.log("Uploading files to S3"); console.log("Uploading files to S3");
@ -201,11 +199,12 @@ async function uploadPackage(ctx: ABC.Context) {
console.log("Normalised path:", relative.replace("\\", "/")); console.log("Normalised path:", relative.replace("\\", "/"));
const bucketPath = (bucketBase + relative).replace(/@/g, "§"); const bucketPath = (storageBase + relative).replace(/@/g, "§");
const body = await Deno.readAll(await Deno.open(file.path)); const body = await Deno.readAll(await Deno.open(file.path));
console.log("Put Object", bucketPath, body.byteLength); console.log("Put Object", bucketPath, body.byteLength);
await bucket.putObject(bucketPath, body, {});
await Storage.writeFile(bucketPath, body);
} }
console.log("Setting new live version"); console.log("Setting new live version");
@ -230,7 +229,6 @@ async function uploadPackage(ctx: ABC.Context) {
Colors.red("Error while processing newly uploaded package") Colors.red("Error while processing newly uploaded package")
); );
console.error(err); console.error(err);
if (err instanceof S3Error) console.log(err.response);
return { return {
success: false, success: false,
message: err.message, message: err.message,

View File

@ -3,7 +3,7 @@ import { ABC } from "../deps.ts";
import config from "../config.ts"; import config from "../config.ts";
export default function raw(g: ABC.Group) { export default function raw(g: ABC.Group) {
g.get("/deno-import-intellisense.json", (ctx) => { g.get("/deno-import-intellisense.json", (_ctx) => {
return { return {
version: 1, version: 1,
registries: [ registries: [

View File

@ -30,7 +30,7 @@ export default function raw(g: ABC.Group) {
const result = await getFile(packageName, packageVersion, filepath); const result = await getFile(packageName, packageVersion, filepath);
if (filepath.endsWith(".js")) { if (filepath.endsWith(".js")) {
const tsFile = filepath.substr(0, filepath.length - 3) + ".d.ts"; const tsFile = filepath.slice(0, filepath.length - 3) + ".d.ts";
const tsResult = await getFile(packageName, packageVersion, tsFile); const tsResult = await getFile(packageName, packageVersion, tsFile);
if (tsResult) { if (tsResult) {
ctx.response.headers.set( ctx.response.headers.set(

View File

@ -1,16 +1,16 @@
import type { ABC } from "../deps.ts"; import type { ABC } from "../deps.ts";
import { import {
basicauth,
extractPackagePath, extractPackagePath,
getBucketFilePath, getFilePath,
getFile, getFile,
getOneOf,
getAbsolutePackageVersion, getAbsolutePackageVersion,
sortVersions, sortVersions,
} from "../utils.ts"; } from "../utils.ts";
import { Hash, Path } from "../deps.ts"; import { Hash, Path } from "../deps.ts";
import db, { IPackage } from "../db.ts"; import db, { IPackage } from "../db.ts";
import bucket from "../s3.ts"; import * as Storage from "../storage.ts";
const MAX_CACHE_AGE = 60 * 30; // 30 Minutes const MAX_CACHE_AGE = 60 * 30; // 30 Minutes
@ -31,6 +31,7 @@ export default function views(g: ABC.Application) {
packages = await db.package.find({}); packages = await db.package.find({});
} }
await ctx.render("index", { await ctx.render("index", {
packages: packages.reverse(), packages: packages.reverse(),
search, search,
@ -54,19 +55,36 @@ export default function views(g: ABC.Application) {
}); });
g.get("/package/:package", async (ctx) => { g.get("/package/:package", async (ctx) => {
let [packageName, packageVersion] = extractPackagePath( const [packageName, packageVersion] = extractPackagePath(
ctx.params.package ctx.params.package
); );
const pkg = await db.package.findOne({ name: packageName }); const pkg = await db.package.findOne({ name: packageName });
if (!pkg) {
ctx.response.status = 404;
ctx.response.body = "// Package not found!";
return;
}
const readmeContentRaw = (await getOneOf(
pkg.name,
packageVersion || pkg.versions.sort(sortVersions).reverse()[0],
[pkg.readme, "README.md", "readme.md", "Readme.md"]
))?.data;
const readmeContent = readmeContentRaw
? new TextDecoder().decode(readmeContentRaw)
: "";
const etag = const etag =
"W/" + "W/" +
Hash.createHash("sha3-256") Hash.createHash("sha3-256")
.update(`${packageName}:${packageVersion}`) .update(`${packageName}:${packageVersion}`)
.toString("base64"); .toString("base64");
await ctx.render("package", { pkg, version: packageVersion }); await ctx.render("package", { pkg, version: packageVersion, readmeContent });
ctx.response.headers.set("cache-control", CACHE_CONTROL); ctx.response.headers.set("cache-control", CACHE_CONTROL);
ctx.response.headers.set("E-Tag", etag); ctx.response.headers.set("E-Tag", etag);
}); });
@ -98,32 +116,29 @@ export default function views(g: ABC.Application) {
path: `${packageName}@${packageVersion}/${path}`, path: `${packageName}@${packageVersion}/${path}`,
}); });
} else { } else {
const bucketPath = await getBucketFilePath( const filesPath = getFilePath(
packageName, packageName,
packageVersion, packageVersion,
path path
); );
if (!bucketPath) return E404(); if (!filesPath) return E404();
console.log(bucketPath); console.log(filesPath);
const filesItr = bucket.listAllObjects({ const filesItr = Storage.walkFiles(filesPath);
batchSize: 100,
prefix: bucketPath,
// delimiter: "/",
});
let files: { name: string; size: number }[] = []; const files: { name: string; size: number }[] = [];
let directories: Set<string> = new Set(); const directories: Set<string> = new Set();
let readme: string | null = null; let readme: string | null = null;
for await (let file of filesItr) { for await (const file of filesItr) {
const relPath = Path.posix.relative(bucketPath, file.key || ""); const relPath = Path.posix.relative(filesPath, file.path || "");
console.log({ file, relPath, filesPath });
if (relPath.indexOf("/") >= 0) { if (relPath.indexOf("/") >= 0) {
directories.add(relPath.split("/")[0]); directories.add(relPath.split("/")[0]);
} else { } else {
files.push({ name: relPath, size: file.size || -1 }); files.push({ name: relPath, size: -1 }); //TODO: Size is not implemented yet
if (relPath.toLowerCase() === "readme.md") { if (relPath.toLowerCase() === "readme.md") {
let readmeCont = await getFile( const readmeCont = await getFile(
packageName, packageName,
packageVersion, packageVersion,
Path.posix.join(path, relPath) Path.posix.join(path, relPath)

0
registry/src/react.ts Normal file
View File

View File

@ -1,11 +1,9 @@
// / <reference path="./types/jsx.d.ts" /> import { Nano } from "./deps.ts";
import { Pico } from "./deps.ts"; const { h, renderSSR } = Nano;
import config from "./config.ts"; import config from "./config.ts";
const React = {
createElement: Pico.h.bind(Pico),
};
class StringReader implements Deno.Reader { class StringReader implements Deno.Reader {
private data: Uint8Array; private data: Uint8Array;
@ -70,8 +68,9 @@ export default async function render(
): Promise<Deno.Reader> { ): Promise<Deno.Reader> {
const Component = await loadComponent(name); const Component = await loadComponent(name);
//@ts-ignore // // @ts-ignore
const res = await Pico.renderSSR(<Component {...data} />); // const res = await Pico.renderSSR(<Component {...data} />);
const res = await renderSSR(<Component {...data} />);
return new StringReader("<!DOCTYPE html>\n" + res); return new StringReader("<!DOCTYPE html>\n" + res);
} }

View File

@ -1,30 +0,0 @@
import { S3 } from "./deps.ts";
import config from "./config.ts";
if (!config.s3) {
throw new Error("Config is missing [s3] section!");
}
if (!config.s3.endpoint) {
throw new Error("Config is missing s3.endpoint!");
}
if (!config.s3.accessKey) {
throw new Error("Config is missing s3.accessKey!");
}
if (!config.s3.secretKey) {
throw new Error("Config is missing s3.secretKey!");
}
const s3config: S3.S3BucketConfig = {
bucket: config.s3.bucket || "deno-registry",
endpointURL: config.s3.endpoint,
accessKeyID: config.s3.accessKey,
secretKey: config.s3.secretKey,
region: config?.s3?.region || "us-east-1",
};
const bucket = new S3.S3Bucket(s3config);
export default bucket;

40
registry/src/storage.ts Normal file
View File

@ -0,0 +1,40 @@
import { FS, Path } from "./deps.ts";
const STORAGE_ROOT = Path.resolve("./data/files");
export function walkFiles(path: string) {
const norm = Path.normalize(path);
const p = Path.join(STORAGE_ROOT, norm);
const walker = FS.walk(p, { includeFiles: true, includeDirs: false })
// Make path of entry relative to the root and return an async iterator
return (async function* () {
for await (const entry of walker) {
const rel = Path.relative(STORAGE_ROOT, entry.path);
yield { ...entry, path: rel };
}
})();
}
export async function writeFile(path: string, content: Uint8Array) {
const norm = Path.normalize(path);
const p = Path.join(STORAGE_ROOT, norm);
await FS.ensureFile(p);
await Deno.writeFile(p, content);
}
export async function readFile(path: string) {
const norm = Path.normalize(path);
const p = Path.join(STORAGE_ROOT, norm);
if (!await FS.exists(p)) return undefined;
const s = await Deno.stat(p);
if (!s.isFile) return undefined;
return await Deno.readFile(p);
}

View File

@ -1,15 +1,13 @@
import { ABC, Base64, Path } from "./deps.ts"; import { ABC, Base64, Path } from "./deps.ts";
import config from "./config.ts"; import config from "./config.ts";
import * as Storage from "./storage.ts";
const packageNameRegex = /^[@]?[a-zA-Z][\d\w\-\_]*$/g.compile();
const packageVersionRegex = /^\d(\.\d)?(\.\d)?$/g.compile();
const packageFullVersionRegex = /^\d(\.\d)(\.\d)$/g.compile();
export const isValidPackageName = (name: string) => packageNameRegex.test(name); export const isValidPackageName = (name: string) => /^[@]?[a-zA-Z][\d\w\-\_]*$/g.test(name);
export const isValidVersion = (version: string) => export const isValidVersion = (version: string) =>
packageVersionRegex.test(version); /^\d+(\.\d+)?(\.\d+)?$/g.test(version);
export const isValidFullVersion = (version: string) => export const isValidFullVersion = (version: string) =>
packageFullVersionRegex.test(version); /^\d+(\.\d+)(\.\d+)$/g.test(version);
const ALg = 1; const ALg = 1;
const ASm = -ALg; const ASm = -ALg;
@ -70,16 +68,18 @@ export function extractPackagePath(path: string): [string, string | undefined] {
path = path.slice(1); path = path.slice(1);
} }
let parts = path.split("@");
const parts = path.split("@");
if (parts.length > 2) throw new Error("Invalid package name!"); if (parts.length > 2) throw new Error("Invalid package name!");
packageName += parts[0]; packageName += parts[0];
let packageVersion: string | undefined = parts[1]; const packageVersion: string | undefined = parts[1];
console.log({ path, parts, packageName, packageVersion });
if (!isValidPackageName(packageName)) if (!isValidPackageName(packageName))
throw new Error("Invalid package name!"); throw new Error("Invalid package name!");
if (packageVersion !== "") { if (packageVersion && packageVersion !== "") {
if (!isValidVersion(packageVersion)) if (!isValidVersion(packageVersion))
throw new Error("Invalid package version!"); throw new Error("Invalid package version!");
} }
@ -89,8 +89,6 @@ export function extractPackagePath(path: string): [string, string | undefined] {
import type { IPackage } from "./db.ts"; import type { IPackage } from "./db.ts";
import bucket from "./s3.ts";
export function getAbsolutePackageVersion( export function getAbsolutePackageVersion(
pkg?: IPackage | null, pkg?: IPackage | null,
version?: string version?: string
@ -110,7 +108,7 @@ export function getAbsolutePackageVersion(
return version; return version;
} }
export async function getBucketFilePath( export function getFilePath(
pkgName: string, pkgName: string,
version: string, version: string,
file: string file: string
@ -120,7 +118,6 @@ export async function getBucketFilePath(
} }
const bucketPath = ( const bucketPath = (
"packages/" +
pkgName + pkgName +
"/" + "/" +
version + version +
@ -131,24 +128,33 @@ export async function getBucketFilePath(
return bucketPath; return bucketPath;
} }
export async function getOneOf(pkgName: string, version: string, files: (string | undefined)[]) {
for (const file of files) {
if (!file) continue;
const res = await getFile(pkgName, version, file);
if (res) return res;
}
return undefined;
}
export async function getFile( export async function getFile(
pkgName: string, pkgName: string,
version: string | undefined, version: string | undefined,
file: string file: string
): Promise<{ etag: string; data: Uint8Array } | null | undefined> { ): Promise<{ etag: string; data: Uint8Array } | null | undefined> {
if (!version) return undefined; if (!version) return undefined;
const bucketPath = await getBucketFilePath(pkgName, version, file); const bucketPath = await getFilePath(pkgName, version, file);
if (!bucketPath) return null; if (!bucketPath) return null;
console.log("Getting file from:", bucketPath); console.log("Getting file from:", bucketPath);
try { try {
const res = await bucket.getObject(bucketPath); const res = await Storage.readFile(bucketPath);
if (!res || res.body.byteLength === 0) return undefined; if (!res) return undefined;
return { return {
etag: res.etag, etag: Base64.encodeBase64(await crypto.subtle.digest("sha-1", res)),
data: res.body, data: res,
}; };
} catch (err) { } catch (err) {
const msg = err.message as string; const msg = err.message as string;

View File

@ -1,4 +1,6 @@
import { Pico } from "../deps.ts"; import { Nano } from "../deps.ts";
const { h } = Nano;
import config from "../config.ts"; import config from "../config.ts";
const styles = new TextDecoder().decode( const styles = new TextDecoder().decode(
@ -6,12 +8,13 @@ const styles = new TextDecoder().decode(
); );
// href="https://unpkg.com/papercss@1.6.1/dist/paper.min.css" // href="https://unpkg.com/papercss@1.6.1/dist/paper.min.css"
export default function Base(p: any, children: any[]) { export default function Base(p: any) {
const title = p.title || "DenReg"; const title = p.title || "DenReg";
return ( return (
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"></meta> <meta charset="UTF-8"></meta>
<style dangerouslySetInnerHTML={{ __html: ".clean {all:revert;}" }} />
{/* <link {/* <link
rel="stylesheet" rel="stylesheet"
href="https://deno.hibas123.de/raw/@hibas123-theme@2.0.2/out/base.css" href="https://deno.hibas123.de/raw/@hibas123-theme@2.0.2/out/base.css"
@ -94,7 +97,7 @@ export default function Base(p: any, children: any[]) {
/> />
<meta name="theme-color" content="#ffffff"></meta> <meta name="theme-color" content="#ffffff"></meta>
<link href="/public/prism.css" rel="stylesheet" /> <link href="/public/prism.css" rel="stylesheet" />
<style innerHTML={styles}></style> <style dangerouslySetInnerHTML={{ __html: styles }}></style>
<title>{title}</title> <title>{title}</title>
<meta <meta
name="Description" name="Description"
@ -107,9 +110,9 @@ export default function Base(p: any, children: any[]) {
</head> </head>
<body class="site"> <body class="site">
{config.web.tracking && ( {config.web.tracking && (
<tracking innerHTML={config.web.tracking}></tracking> <tracking dangerouslySetInnerHTML={{ __html: config.web.tracking }}></tracking>
)} )}
{children} {p.children}
</body> </body>
</html> </html>
); );

View File

@ -1,4 +1,6 @@
import { Pico, Marked } from "../deps.ts"; import { Marked } from "../deps.ts";
import { Nano } from "../deps.ts";
const { h, Fragment } = Nano;
import type { IPackage } from "../db.ts"; import type { IPackage } from "../db.ts";
import { sortVersions } from "../utils.ts"; import { sortVersions } from "../utils.ts";
@ -67,7 +69,7 @@ export function RenderFile({ content, ext }: IRenderFileInterface) {
<div <div
class="card browse-code-block" class="card browse-code-block"
style="margin-top: 1rem; padding: 1rem;" style="margin-top: 1rem; padding: 1rem;"
innerHTML={content} dangerouslySetInnerHTML={{ __html: content }}
/> />
); );
} else { } else {
@ -77,7 +79,7 @@ export function RenderFile({ content, ext }: IRenderFileInterface) {
content = Prism.highlight(content, Prism.languages[lang], lang); content = Prism.highlight(content, Prism.languages[lang], lang);
} }
return <pre innerHTML={content} />; return <pre><code dangerouslySetInnerHTML={{ __html: content }}> </code></pre>;
} }
} }

View File

@ -1,14 +1,15 @@
import { Pico } from "../deps.ts"; import { Nano } from "../deps.ts";
const { h } = Nano;
export function Main(a: any, children: any) { export function Main(a: any) {
return ( return (
<div style="grid-area: main"> <div style="grid-area: main">
<div class="paper">{children}</div> <div class="paper">{a.children}</div>
</div> </div>
); );
} }
export function Menu({}: any, children: any) { export function Menu(a: any) {
return ( return (
<div style="grid-area: menu"> <div style="grid-area: menu">
<div class="paper"> <div class="paper">
@ -22,7 +23,7 @@ export function Menu({}: any, children: any) {
</a> </a>
</h3> </h3>
{children} {a.children}
</div> </div>
</div> </div>
); );

View File

@ -1,8 +1,10 @@
// /// <reference path="../types/jsx.d.ts" /> // /// <reference path="../types/jsx.d.ts" />
import { Pico, Marked } from "../deps.ts"; import { Nano } from "../deps.ts";
const { h, Fragment } = Nano;
import type { IPackage } from "../db.ts"; import type { IPackage } from "../db.ts";
export default async function index({ export default function index({
pkg, pkg,
version, version,
}: { }: {

View File

@ -1,11 +1,12 @@
import { Pico } from "../deps.ts"; import { Nano } from "../deps.ts";
const { h } = Nano;
import Base from "./_base.tsx"; import Base from "./_base.tsx";
import type { IPackage } from "../db.ts"; import type { IPackage } from "../db.ts";
import { Main, Menu } from "./_default.tsx"; import { Main, Menu } from "./_default.tsx";
import { RenderFile, EntryList, BrowseHeader } from "./_browse.tsx"; import { RenderFile, EntryList, BrowseHeader } from "./_browse.tsx";
export default async function index({ export default function index({
pkg, pkg,
version, version,
content, content,

View File

@ -1,11 +1,12 @@
import { Pico } from "../deps.ts"; import { Nano } from "../deps.ts";
const { h } = Nano;
import Base from "./_base.tsx"; import Base from "./_base.tsx";
import type { IPackage } from "../db.ts"; import type { IPackage } from "../db.ts";
import { Main, Menu } from "./_default.tsx"; import { Main, Menu } from "./_default.tsx";
import { RenderFile, EntryList, BrowseHeader } from "./_browse.tsx"; import { RenderFile, EntryList, BrowseHeader } from "./_browse.tsx";
export default async function index({ export default function index({
pkg, pkg,
version, version,
files, files,

View File

@ -1,4 +1,5 @@
import { Pico } from "../deps.ts"; import { Nano } from "../deps.ts";
const { h } = Nano;
import Base from "./_base.tsx"; import Base from "./_base.tsx";
import type { IPackage } from "../db.ts"; import type { IPackage } from "../db.ts";
import { sortVersions } from "../utils.ts"; import { sortVersions } from "../utils.ts";
@ -9,9 +10,11 @@ function Package({ pkg }: { pkg: IPackage }) {
const sorted = versions.sort(sortVersions).reverse(); const sorted = versions.sort(sortVersions).reverse();
return ( return (
<div <a
class="card package-list-margin" style="text-decoration:none; color: black"
onClick={"window.location.href = '/package/" + name + "'"} class="clean card package-list-margin"
href={"/package/" + name}
// onClick={"window.location.href = '/package/" + name + "'"}
> >
<div class="card-body"> <div class="card-body">
<h4 class="card-title"> <h4 class="card-title">
@ -26,13 +29,13 @@ function Package({ pkg }: { pkg: IPackage }) {
{description} {description}
</div> </div>
</div> </div>
</div> </a>
); );
} }
import { Main, Menu } from "./_default.tsx"; import { Main, Menu } from "./_default.tsx";
export default async function index({ export default function index({
packages, packages,
search, search,
}: { }: {

View File

@ -1,4 +1,5 @@
import { Pico, Marked } from "../deps.ts"; import { Nano, Marked } from "../deps.ts";
const { h, Suspense } = Nano;
import Base from "./_base.tsx"; import Base from "./_base.tsx";
import type { IPackage } from "../db.ts"; import type { IPackage } from "../db.ts";
import { sortVersions, getFile, getAbsolutePackageVersion } from "../utils.ts"; import { sortVersions, getFile, getAbsolutePackageVersion } from "../utils.ts";
@ -29,12 +30,14 @@ import PkgHeader from "./_pkgheader.tsx";
import { Main, Menu } from "./_default.tsx"; import { Main, Menu } from "./_default.tsx";
export default async function index({ export default function index({
pkg, pkg,
version, version,
readmeContent
}: { }: {
pkg: IPackage; pkg: IPackage;
version?: string; version?: string;
readmeContent: string | undefined;
}) { }) {
if (!pkg) if (!pkg)
return ( return (
@ -44,16 +47,6 @@ export default async function index({
); );
version = getAbsolutePackageVersion(pkg, version); version = getAbsolutePackageVersion(pkg, version);
const readmeContent = await getFile(
pkg.name,
version,
pkg.readme || "README.md"
).then((res) => {
if (res)
return Marked.parse(new TextDecoder().decode(res.data))
.content as string;
else return undefined;
});
return ( return (
<Base title={"DenReg - " + pkg.name}> <Base title={"DenReg - " + pkg.name}>
@ -69,7 +62,7 @@ export default async function index({
{readmeContent !== undefined ? ( {readmeContent !== undefined ? (
<div <div
style="overflow-x: hidden" style="overflow-x: hidden"
innerHTML={readmeContent} dangerouslySetInnerHTML={{ __html: Marked.parse(readmeContent).content }}
/> />
) : ( ) : (
<div class="alert alert-warning">No README.md found!</div> <div class="alert alert-warning">No README.md found!</div>

View File

@ -1,10 +0,0 @@
{
"compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext", "deno.ns", "deno.unstable"],
"jsx": "react",
"jsxFactory": "Pico.h",
"jsxFragmentFactory": "Pico.Fragment",
"noImplicitAny": true,
"strictPropertyInitialization": false
}
}