├── .prettierrc ├── mod.ts ├── netlify.toml ├── public └── favicon.ico ├── examples ├── hono │ ├── deno.json │ ├── server.tsx │ └── deno.lock └── oak │ ├── deno.json │ ├── server.tsx │ └── deno.lock ├── .vscode └── settings.json ├── netlify └── edge-functions │ └── php.tsx ├── lib ├── bootstrap.ts └── usephp.tsx ├── README.md └── .gitignore /.prettierrc: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /mod.ts: -------------------------------------------------------------------------------- 1 | export * from "./lib/usephp.tsx"; 2 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "public" 3 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ascorbic/use-php/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /examples/hono/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "serve": "deno run server.tsx" 4 | }, 5 | "compilerOptions": { 6 | "jsx": "react", 7 | "jsxFactory": "h", 8 | "noImplicitAny": false 9 | } 10 | } -------------------------------------------------------------------------------- /examples/oak/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "serve": "deno run server.tsx" 4 | }, 5 | "compilerOptions": { 6 | "jsx": "react", 7 | "jsxFactory": "h", 8 | "noImplicitAny": false 9 | } 10 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.unstable": true, 4 | "deno.importMap": ".netlify/edge-functions-import-map.json", 5 | "[typescript]": { 6 | "editor.defaultFormatter": "denoland.vscode-deno" 7 | }, 8 | "deno.lint": true 9 | } 10 | -------------------------------------------------------------------------------- /examples/hono/server.tsx: -------------------------------------------------------------------------------- 1 | /** @jsx h */ 2 | import { Context, Hono } from "https://deno.land/x/hono/mod.ts"; 3 | import { usePHP } from "https://deno.land/x/use_php/mod.ts"; 4 | import { h, renderToString } from "https://deno.land/x/jsx/mod.ts"; 5 | 6 | const app: Hono = new Hono(); 7 | 8 | app.get("/", async (c: Context) => { 9 | const request: Request = c.req.raw; 10 | 11 | const php = await usePHP(request, h); 12 | return c.html( 13 | await renderToString( 14 | 15 | 16 | Use PHP 17 | 18 | 19 | {await php` 20 | 21 | `} 22 | 23 | 24 | ) 25 | ); 26 | }); 27 | 28 | Deno.serve(app.fetch); 29 | -------------------------------------------------------------------------------- /examples/oak/server.tsx: -------------------------------------------------------------------------------- 1 | /** @jsx h */ 2 | import { Application, Router } from "https://deno.land/x/oak/mod.ts"; 3 | import { usePHP } from "https://deno.land/x/use_php/mod.ts"; 4 | import { h, renderToString } from "https://deno.land/x/jsx/mod.ts"; 5 | 6 | const app = new Application(); 7 | const router = new Router(); 8 | 9 | router.get("/", async (ctx) => { 10 | const request = ctx.request as unknown as Request; 11 | 12 | const php = await usePHP(request, h); 13 | 14 | const body = await renderToString( 15 | 16 | 17 | Use PHP 18 | 19 | 20 | {await php` 21 | 22 | `} 23 | 24 | 25 | ); 26 | 27 | ctx.response.body = body; 28 | ctx.response.type = "text/html"; 29 | }); 30 | 31 | app.use(router.routes()); 32 | app.use(router.allowedMethods()); 33 | 34 | await app.listen({ port: 8000 }); 35 | -------------------------------------------------------------------------------- /netlify/edge-functions/php.tsx: -------------------------------------------------------------------------------- 1 | /** @jsx h */ 2 | /** @jsxFrag Fragment */ 3 | import { h, renderToString } from "https://deno.land/x/jsx/mod.ts"; 4 | import { usePHP } from "../../lib/usephp.tsx"; 5 | 6 | export default async function handler(request: Request) { 7 | const php = await usePHP(request, h); 8 | return new Response( 9 | await renderToString( 10 | 11 | 12 | Use PHP 13 | 14 | 15 | {await php` 16 | Hello 17 | hello"); 20 | ?> 21 |
22 | 23 |
24 | `} 25 | 26 | 27 | ), 28 | { 29 | headers: { 30 | "content-type": "text/html; charset=UTF-8", 31 | }, 32 | } 33 | ); 34 | } 35 | 36 | export const config = { 37 | path: "/*", 38 | excluded_paths: "/public/*", 39 | }; 40 | -------------------------------------------------------------------------------- /lib/bootstrap.ts: -------------------------------------------------------------------------------- 1 | export const bootstrapCode = ( 2 | path = "/", 3 | method = "GET", 4 | _GET = {}, 5 | _POST = {}, 6 | ) => 7 | /* php */ ` $_SESSION]) . "\n"); 12 | 13 | header_register_callback(function() use($stdErr){ 14 | fwrite($stdErr, json_encode(['headers'=>headers_list()]) . "\n"); 15 | }); 16 | register_shutdown_function(function() use($stdErr){ 17 | fwrite($stdErr, json_encode(['session_id' => session_id()]) . "\n"); 18 | fwrite($stdErr, json_encode(['headers'=>headers_list()]) . "\n"); 19 | fwrite($stdErr, json_encode(['errors' => error_get_last()]) . "\n"); 20 | fwrite($stdErr, json_encode(['session' => $_SESSION]) . "\n"); 21 | }); 22 | set_error_handler(function(...$args) use($stdErr, &$errors){ 23 | fwrite($stdErr, json_encode($args, JSON_PRETTY_PRINT) . "\n" ); 24 | }); 25 | $request = (object) json_decode( 26 | '${JSON.stringify({ path, method, _GET, _POST })}' 27 | , JSON_OBJECT_AS_ARRAY 28 | ); 29 | parse_str(substr($request->_GET, 1), $_GET); 30 | $_POST = $request->_POST; 31 | $origin = 'http://localhost:3333'; 32 | $docroot = '/'; 33 | $script = 'index.php'; 34 | $path = $request->path; 35 | $path = preg_replace('/^\\/php-wasm/', '', $path); 36 | $_SERVER['SERVER_SOFTWARE'] = 'Netlify Edge Functions'; 37 | $_SERVER['REQUEST_URI'] = $path; 38 | $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; 39 | $_SERVER['SERVER_NAME'] = $origin; 40 | $_SERVER['SERVER_PORT'] = 3333; 41 | $_SERVER['REQUEST_METHOD'] = $request->method; 42 | $_SERVER['SCRIPT_FILENAME'] = $docroot . '/' . $script; 43 | $_SERVER['SCRIPT_NAME'] = $docroot . '/' . $script; 44 | $_SERVER['PHP_SELF'] = $docroot . '/' . $script; 45 | $_SERVER['DOCUMENT_ROOT'] = '/'; 46 | $_SERVER['HTTPS'] = ''; 47 | chdir($docroot); 48 | `; 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![a blue Lambourghini with the licence "USEPHP"](https://github.com/ascorbic/use-php/assets/213306/3f019612-2a81-447a-9f52-f9125f4c4a1b) 2 | 3 | # 🏎️ usePHP 💨 4 | 5 | A React hook for running PHP? Why not? 6 | 7 | It runs in a Netlify Edge Function and uses [php-wasm](https://github.com/seanmorris/php-wasm) to execute the PHP. It runs asynchronously, so you need a renderer that supports async components. 8 | 9 | **[View the demo](https://php-edge.netlify.app/)** 10 | 11 | [![deploy to netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/ascorbic/use-php) 12 | 13 | ### Usage 14 | 15 | ```tsx filename=netlify/edge-functions/php.tsx 16 | /** @jsx h */ 17 | import { h, renderToString } from "https://deno.land/x/jsx/mod.ts"; 18 | import { usePHP } from "https://deno.land/x/use_php/mod.ts"; 19 | 20 | export default async function handler(request: Request) { 21 | const php = await usePHP(request, h); 22 | return new Response( 23 | await renderToString( 24 | 25 | 26 | Use PHP 27 | 28 | 29 | {await php` 30 | 31 | `} 32 | 33 | 34 | ), 35 | { 36 | headers: { 37 | "content-type": "text/html; charset=UTF-8", 38 | }, 39 | } 40 | ); 41 | } 42 | 43 | export const config = { 44 | path: "/*", 45 | excluded_paths: "/public/*", 46 | }; 47 | ``` 48 | 49 | ## API 50 | 51 | ### `usePHP(request: Request, renderer?: JSXRenderer)` 52 | 53 | Pass in the request object and an optional JSX renderer and it will return tagged template that you can use to execute PHP. If you pass a JSX render function to the hook (e.g. `h` or `React.createElement`), then the template will return a JSX element. If you omit the renderer it will return an HTML string instead. 54 | 55 | Try it yourself: 56 | 57 | [![deploy to netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/ascorbic/use-php) 58 | 59 | ## FAQ 60 | 61 | - **Why?** 62 | - Why not? That Lambo won't buy itself. 63 | - **How can I deploy this to production?** 64 | - 🤦🏻‍♂️ 65 | 66 | ### LICENCE 67 | 68 | MIT Licence. © 2023 [Matt Kane](https://github.com/ascorbic) 69 | -------------------------------------------------------------------------------- /lib/usephp.tsx: -------------------------------------------------------------------------------- 1 | import { PhpWorker } from "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/PhpWorker.mjs"; 2 | import { bootstrapCode } from "./bootstrap.ts"; 3 | 4 | type JSXRenderer = (tag: string, props: Record) => JSX.Element; 5 | 6 | /** 7 | * Creates a "php" tag that can be used to run php code in a template literal. 8 | * @param request The incoming request 9 | * @returns {string} 10 | */ 11 | export async function usePHP( 12 | request: Request 13 | ): Promise<(code: TemplateStringsArray) => Promise>; 14 | /** 15 | * Creates a "php" tag that can be used to run php code in a template literal. 16 | * @param request The incoming request 17 | * @param jsxRenderer A jsx renderer to use to render the output 18 | * @returns {JSX.Element} 19 | */ 20 | export async function usePHP( 21 | request: Request, 22 | jsxRenderer: JSXRenderer 23 | ): Promise<(code: TemplateStringsArray) => Promise>; 24 | export async function usePHP( 25 | request: Request, 26 | jsxRenderer?: JSXRenderer 27 | ): Promise<(code: TemplateStringsArray) => Promise> { 28 | // emscripten expects workers to have window.location available 29 | globalThis.location ||= { href: request.url } as Location; 30 | 31 | const url = new URL(request.url); 32 | 33 | const buff: string[] = []; 34 | 35 | const php = await new PhpWorker(); 36 | 37 | php.addEventListener("output", (e) => { 38 | buff.push((e as CustomEvent).detail); 39 | }); 40 | 41 | php.addEventListener("error", (event) => { 42 | (event as CustomEvent).detail.forEach((error) => { 43 | error = error.trim(); 44 | if (error) { 45 | console.error(error); 46 | } 47 | }); 48 | }); 49 | 50 | await new Promise((resolve) => { 51 | php.addEventListener("ready", () => resolve()); 52 | }); 53 | 54 | await php.run( 55 | bootstrapCode( 56 | url.pathname, 57 | request.method, 58 | JSON.stringify(url.searchParams) 59 | ) 60 | ); 61 | 62 | return async (source: TemplateStringsArray) => { 63 | const code = source.raw.join(""); 64 | await php.run(code); 65 | const res = buff.join("\n"); 66 | buff.length = 0; 67 | return jsxRenderer 68 | ? jsxRenderer("div", { dangerouslySetInnerHTML: { __html: res } }) 69 | : res; 70 | }; 71 | } 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Local Netlify folder 2 | .netlify 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | *.lcov 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # Snowpack dependency directory (https://snowpack.dev/) 48 | web_modules/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional stylelint cache 60 | .stylelintcache 61 | 62 | # Microbundle cache 63 | .rpt2_cache/ 64 | .rts2_cache_cjs/ 65 | .rts2_cache_es/ 66 | .rts2_cache_umd/ 67 | 68 | # Optional REPL history 69 | .node_repl_history 70 | 71 | # Output of 'npm pack' 72 | *.tgz 73 | 74 | # Yarn Integrity file 75 | .yarn-integrity 76 | 77 | # dotenv environment variable files 78 | .env 79 | .env.development.local 80 | .env.test.local 81 | .env.production.local 82 | .env.local 83 | 84 | # parcel-bundler cache (https://parceljs.org/) 85 | .cache 86 | .parcel-cache 87 | 88 | # Next.js build output 89 | .next 90 | out 91 | 92 | # Nuxt.js build / generate output 93 | .nuxt 94 | dist 95 | 96 | # Gatsby files 97 | .cache/ 98 | # Comment in the public line in if your project uses Gatsby and not Next.js 99 | # https://nextjs.org/blog/next-9-1#public-directory-support 100 | # public 101 | 102 | # vuepress build output 103 | .vuepress/dist 104 | 105 | # vuepress v2.x temp and cache directory 106 | .temp 107 | .cache 108 | 109 | # Docusaurus cache and generated files 110 | .docusaurus 111 | 112 | # Serverless directories 113 | .serverless/ 114 | 115 | # FuseBox cache 116 | .fusebox/ 117 | 118 | # DynamoDB Local files 119 | .dynamodb/ 120 | 121 | # TernJS port file 122 | .tern-port 123 | 124 | # Stores VSCode versions used for testing VSCode extensions 125 | .vscode-test 126 | 127 | # yarn v2 128 | .yarn/cache 129 | .yarn/unplugged 130 | .yarn/build-state.yml 131 | .yarn/install-state.gz 132 | .pnp.* 133 | .DS_Store 134 | -------------------------------------------------------------------------------- /examples/hono/deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3", 3 | "redirects": { 4 | "https://deno.land/x/hono/mod.ts": "https://deno.land/x/hono@v3.10.0-rc.1/mod.ts", 5 | "https://deno.land/x/jsx/mod.ts": "https://deno.land/x/jsx@v0.1.5/mod.ts", 6 | "https://deno.land/x/use_php/mod.ts": "https://deno.land/x/use_php@v1/mod.ts" 7 | }, 8 | "remote": { 9 | "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/PhpBase.mjs": "9301981d3dea95f718d6028c10f8f49caffdc1a5081f4970b386ded55080243c", 10 | "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/PhpWorker.mjs": "fc531908df43bf3580c79c8ddb50e14f1746402938beb17f63dd70097f2a982f", 11 | "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/php-worker.mjs": "a3dfdd0091dc884e3788a52375f147cc2a3d0759102ccce07c889154d71ce593", 12 | "https://deno.land/x/hono@v3.10.0-rc.1/client/client.ts": "ff340f58041203879972dd368b011ed130c66914f789826610869a90603406bf", 13 | "https://deno.land/x/hono@v3.10.0-rc.1/client/index.ts": "3ff4cf246f3543f827a85a2c84d66a025ac350ee927613629bda47e854bfb7ba", 14 | "https://deno.land/x/hono@v3.10.0-rc.1/client/utils.ts": "053273c002963b549d38268a1b423ac8ca211a8028bdab1ed0b781a62aa5e661", 15 | "https://deno.land/x/hono@v3.10.0-rc.1/compose.ts": "501c8ada9d9b0fb375e3c9954ce7c4922cf562bfec8e80744bac47020754034d", 16 | "https://deno.land/x/hono@v3.10.0-rc.1/context.ts": "cc79c2c40433a8ca6ae3c963d4e2de7f139982952057957839341ed93f260b8b", 17 | "https://deno.land/x/hono@v3.10.0-rc.1/helper/cookie/index.ts": "55ccd20bbd8d9a8bb2ecd998e90845c1d306c19027f54b3d1b89a5be35968b80", 18 | "https://deno.land/x/hono@v3.10.0-rc.1/hono-base.ts": "998ec910cbe0353407e95b93b7722fa1e39c23a06aa35552ab03441380fd4579", 19 | "https://deno.land/x/hono@v3.10.0-rc.1/hono.ts": "2cc4c292e541463a4d6f83edbcea58048d203e9564ae62ec430a3d466b49a865", 20 | "https://deno.land/x/hono@v3.10.0-rc.1/http-exception.ts": "6071df078b5f76d279684d52fe82a590f447a64ffe1b75eb5064d0c8a8d2d676", 21 | "https://deno.land/x/hono@v3.10.0-rc.1/mod.ts": "90114a97be9111b348129ad0143e764a64921f60dd03b8f3da529db98a0d3a82", 22 | "https://deno.land/x/hono@v3.10.0-rc.1/request.ts": "52330303dd7a3bf4f580fde0463ba608bc4c88a8b7b5edd7c1327064c7cf65ce", 23 | "https://deno.land/x/hono@v3.10.0-rc.1/router.ts": "39d573f48baee429810cd583c931dd44274273c30804d538c86967d310ea4ab5", 24 | "https://deno.land/x/hono@v3.10.0-rc.1/router/linear-router/index.ts": "8a2a7144c50b1f4a92d9ee99c2c396716af144c868e10608255f969695efccd0", 25 | "https://deno.land/x/hono@v3.10.0-rc.1/router/linear-router/router.ts": "bc63e8b5bc1dabc815306d50bebd1bb5877ffa3936ba2ad7550d093c95ee6bd1", 26 | "https://deno.land/x/hono@v3.10.0-rc.1/router/pattern-router/index.ts": "304a66c50e243872037ed41c7dd79ed0c89d815e17e172e7ad7cdc4bc07d3383", 27 | "https://deno.land/x/hono@v3.10.0-rc.1/router/pattern-router/router.ts": "a9a5a2a182cce8c3ae82139892cc0502be7dd8f579f31e76d0302b19b338e548", 28 | "https://deno.land/x/hono@v3.10.0-rc.1/router/reg-exp-router/index.ts": "52755829213941756159b7a963097bafde5cc4fc22b13b1c7c9184dc0512d1db", 29 | "https://deno.land/x/hono@v3.10.0-rc.1/router/reg-exp-router/node.ts": "5b3fb80411db04c65df066e69fedb2c8c0844753c2633d703336de84d569252c", 30 | "https://deno.land/x/hono@v3.10.0-rc.1/router/reg-exp-router/router.ts": "fbe8917aa24fe25d0208bfa82ce7f49ba0507f9ae158d4d0c177f6a061b0a561", 31 | "https://deno.land/x/hono@v3.10.0-rc.1/router/reg-exp-router/trie.ts": "852ce7207e6701e47fa30889a0d2b8bfcd56d8862c97e7bc9831e0a64bd8835f", 32 | "https://deno.land/x/hono@v3.10.0-rc.1/router/smart-router/index.ts": "74f9b4fe15ea535900f2b9b048581915f12fe94e531dd2b0032f5610e61c3bef", 33 | "https://deno.land/x/hono@v3.10.0-rc.1/router/smart-router/router.ts": "71979c06b32b093960a6e8efc4c185e558f280bff18846b8b1cdc757ade6ff99", 34 | "https://deno.land/x/hono@v3.10.0-rc.1/router/trie-router/index.ts": "3eb75e7f71ba81801631b30de6b1f5cefb2c7239c03797e2b2cbab5085911b41", 35 | "https://deno.land/x/hono@v3.10.0-rc.1/router/trie-router/node.ts": "3af15fa9c9994a8664a2b7a7c11233504b5bb9d4fcf7bb34cf30d7199052c39f", 36 | "https://deno.land/x/hono@v3.10.0-rc.1/router/trie-router/router.ts": "54ced78d35676302c8fcdda4204f7bdf5a7cc907fbf9967c75674b1e394f830d", 37 | "https://deno.land/x/hono@v3.10.0-rc.1/utils/body.ts": "7a16a6656331a96bcae57642f8d5e3912bd361cbbcc2c0d2157ecc3f218f7a92", 38 | "https://deno.land/x/hono@v3.10.0-rc.1/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e", 39 | "https://deno.land/x/hono@v3.10.0-rc.1/utils/cookie.ts": "19920ba6756944aae1ad8585c3ddeaa9df479733f59d05359db096f7361e5e4b", 40 | "https://deno.land/x/hono@v3.10.0-rc.1/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc", 41 | "https://deno.land/x/hono@v3.10.0-rc.1/utils/stream.ts": "1789dcc73c5b0ede28f83d7d34e47ae432c20e680907cb3275a9c9187f293983", 42 | "https://deno.land/x/hono@v3.10.0-rc.1/utils/url.ts": "5fc3307ef3cb2e6f34ec2a03e3d7f2126c6a9f5f0eab677222df3f0e40bd7567", 43 | "https://deno.land/x/hono@v3.10.0-rc.1/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c", 44 | "https://deno.land/x/hono@v3.10.0-rc.1/validator/validator.ts": "afa5e52495e0996fbba61996736fab5c486590d72d376f809e9f9ff4e0c463e9", 45 | "https://deno.land/x/jsx@v0.1.5/mod.ts": "24bb89837fda59c53c12a3c0e464378ca6de9b261dec1df57ba640b1cfed9611", 46 | "https://deno.land/x/use_php@v1/lib/bootstrap.ts": "1eabfd11cb2ca462d2a8540ad3a634bc2b66260c30f32ad906141107ecab5f49", 47 | "https://deno.land/x/use_php@v1/lib/usephp.tsx": "f38cd6da586f870a85a2a02a3f2a906b7735124b72bfd028eef638158bb207c3", 48 | "https://deno.land/x/use_php@v1/mod.ts": "b8e9949aa50476345bf036c99f7870cc451dafd50d922d65bc6d839c6a9e55ab" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /examples/oak/deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3", 3 | "redirects": { 4 | "https://deno.land/x/jsx/mod.ts": "https://deno.land/x/jsx@v0.1.5/mod.ts", 5 | "https://deno.land/x/oak/mod.ts": "https://deno.land/x/oak@v12.6.1/mod.ts", 6 | "https://deno.land/x/use_php/mod.ts": "https://deno.land/x/use_php@v1/mod.ts" 7 | }, 8 | "remote": { 9 | "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/PhpBase.mjs": "9301981d3dea95f718d6028c10f8f49caffdc1a5081f4970b386ded55080243c", 10 | "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/PhpWorker.mjs": "fc531908df43bf3580c79c8ddb50e14f1746402938beb17f63dd70097f2a982f", 11 | "https://cdn.jsdelivr.net/npm/php-wasm@0.0.0-esm-preview-45/php-worker.mjs": "a3dfdd0091dc884e3788a52375f147cc2a3d0759102ccce07c889154d71ce593", 12 | "https://deno.land/std@0.200.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", 13 | "https://deno.land/std@0.200.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", 14 | "https://deno.land/std@0.200.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", 15 | "https://deno.land/std@0.200.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", 16 | "https://deno.land/std@0.200.0/bytes/bytes_list.ts": "31d664f4d42fa922066405d0e421c56da89d751886ee77bbe25a88bf0310c9d0", 17 | "https://deno.land/std@0.200.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2", 18 | "https://deno.land/std@0.200.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219", 19 | "https://deno.land/std@0.200.0/bytes/ends_with.ts": "4228811ebc71615d27f065c54b5e815ec1972538772b0f413c0efe05245b472e", 20 | "https://deno.land/std@0.200.0/bytes/equals.ts": "fc190cce412b2136979181b163ec7e05f7e7a947e39102eee4b8c0d62519ddf9", 21 | "https://deno.land/std@0.200.0/bytes/includes_needle.ts": "76a8163126fb2f8bf86fd7f22192c3bb04bf6a20b987a095127c2ca08adf3ba6", 22 | "https://deno.land/std@0.200.0/bytes/index_of_needle.ts": "9c06610e9611b5647ac25952e71a22e09227c9f1b8cbeeb33399bf8bf8a7f649", 23 | "https://deno.land/std@0.200.0/bytes/last_index_of_needle.ts": "f1602f221c3b678bc4f1e1c88a70a15ab7da32c21751dbbc6c957c956951d784", 24 | "https://deno.land/std@0.200.0/bytes/mod.ts": "e869bba1e7a2e3a9cc6c2d55471888429a544e70a840c087672e656e7ba21815", 25 | "https://deno.land/std@0.200.0/bytes/repeat.ts": "6f5e490d8d72bcbf8d84a6bb04690b9b3eb5822c5a11687bca73a2318a842294", 26 | "https://deno.land/std@0.200.0/bytes/starts_with.ts": "3e607a70c9c09f5140b7a7f17a695221abcc7244d20af3eb47ccbb63f5885135", 27 | "https://deno.land/std@0.200.0/crypto/keystack.ts": "877ab0f19eb7d37ad6495190d3c3e39f58e9c52e0b6a966f82fd6df67ca55f90", 28 | "https://deno.land/std@0.200.0/crypto/timing_safe_equal.ts": "7b0a4d2ef1c17590e0ad6c0cb1776369d2ba80cd99e945005e117851690507fe", 29 | "https://deno.land/std@0.200.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", 30 | "https://deno.land/std@0.200.0/encoding/base64url.ts": "2ed4ba122b20fedf226c5d337cf22ee2024fa73a8f85d915d442af7e9ce1fae1", 31 | "https://deno.land/std@0.200.0/http/_negotiation/common.ts": "14d1a52427ab258a4b7161cd80e1d8a207b7cc64b46e911780f57ead5f4323c6", 32 | "https://deno.land/std@0.200.0/http/_negotiation/encoding.ts": "ff747d107277c88cb7a6a62a08eeb8d56dad91564cbcccb30694d5dc126dcc53", 33 | "https://deno.land/std@0.200.0/http/_negotiation/language.ts": "7bcddd8db3330bdb7ce4fc00a213c5547c1968139864201efd67ef2d0d51887d", 34 | "https://deno.land/std@0.200.0/http/_negotiation/media_type.ts": "58847517cd549384ad677c0fe89e0a4815be36fe7a303ea63cee5f6a1d7e1692", 35 | "https://deno.land/std@0.200.0/http/cookie_map.ts": "64601025a7d24c3ebd80a169ccc99145bdbfc60606935348e1d4366d0bf9010d", 36 | "https://deno.land/std@0.200.0/http/etag.ts": "807382795850cde5c437c74bcc09392bc0fc56de348fc1271f383f4b28935b9f", 37 | "https://deno.land/std@0.200.0/http/http_errors.ts": "bbda34819060af86537cecc9dc8e045f877130808b7e7acde4197c5328e852d0", 38 | "https://deno.land/std@0.200.0/http/http_status.ts": "8a7bcfe3ac025199ad804075385e57f63d055b2aed539d943ccc277616d6f932", 39 | "https://deno.land/std@0.200.0/http/method.ts": "e66c2a015cb46c21ab0bb3589aa4fca43143a506cb324ffdfd42d2edef7bc0c4", 40 | "https://deno.land/std@0.200.0/http/negotiation.ts": "46e74a6bad4b857333a58dc5b50fe8e5a4d5267e97292293ea65f980bd918086", 41 | "https://deno.land/std@0.200.0/http/server_sent_event.ts": "29f707c1afa5278ac0315ac115ee679d6b93596d5af3fad5ef33f04254ca76c1", 42 | "https://deno.land/std@0.200.0/http/user_agent.ts": "35d3c70d0926b0e121b8c1bbc324b3522479158acaa4f0c43928362b7bf4e6f4", 43 | "https://deno.land/std@0.200.0/io/buf_reader.ts": "2bccff0878537ef201c5051fc0db0ce8196388c5ea69d2be6be1900fe48c5f4b", 44 | "https://deno.land/std@0.200.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd", 45 | "https://deno.land/std@0.200.0/io/buffer.ts": "4d6883daeb2e698579c4064170515683d69f40f3de019bfe46c5cf31e74ae793", 46 | "https://deno.land/std@0.200.0/io/copy_n.ts": "c055296297b9d4897d90d1ac056b072dc02614e60c67f438e23fbce052ea4c69", 47 | "https://deno.land/std@0.200.0/io/limited_reader.ts": "6c9a216f8eef39c1ee2a6b37a29372c8fc63455b2eeb91f06d9646f8f759fc8b", 48 | "https://deno.land/std@0.200.0/io/mod.ts": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b", 49 | "https://deno.land/std@0.200.0/io/multi_reader.ts": "9c2a0a31686c44b277e16da1d97b4686a986edcee48409b84be25eedbc39b271", 50 | "https://deno.land/std@0.200.0/io/read_delim.ts": "c02b93cc546ae8caad8682ae270863e7ace6daec24c1eddd6faabc95a9d876a3", 51 | "https://deno.land/std@0.200.0/io/read_int.ts": "7cb8bcdfaf1107586c3bacc583d11c64c060196cb070bb13ae8c2061404f911f", 52 | "https://deno.land/std@0.200.0/io/read_lines.ts": "c526c12a20a9386dc910d500f9cdea43cba974e853397790bd146817a7eef8cc", 53 | "https://deno.land/std@0.200.0/io/read_long.ts": "f0aaa420e3da1261c5d33c5e729f09922f3d9fa49f046258d4ff7a00d800c71e", 54 | "https://deno.land/std@0.200.0/io/read_range.ts": "46a2263d0f8369b6d9abb0b25d99ceb65ff08d621fc57bcc53832e6979295043", 55 | "https://deno.land/std@0.200.0/io/read_short.ts": "805cb329574b850b84bf14a92c052c59b5977a492cd780c41df8ad40826c1a20", 56 | "https://deno.land/std@0.200.0/io/read_string_delim.ts": "5dc9f53bdf78e7d4ee1e56b9b60352238ab236a71c3e3b2a713c3d78472a53ce", 57 | "https://deno.land/std@0.200.0/io/slice_long_to_bytes.ts": "48d9bace92684e880e46aa4a2520fc3867f9d7ce212055f76ecc11b22f9644b7", 58 | "https://deno.land/std@0.200.0/io/string_reader.ts": "da0f68251b3d5b5112485dfd4d1b1936135c9b4d921182a7edaf47f74c25cc8f", 59 | "https://deno.land/std@0.200.0/io/string_writer.ts": "8a03c5858c24965a54c6538bed15f32a7c72f5704a12bda56f83a40e28e5433e", 60 | "https://deno.land/std@0.200.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570", 61 | "https://deno.land/std@0.200.0/media_types/_util.ts": "916efbd30b6148a716f110e67a4db29d6949bf4048997b754415dd7e42c52378", 62 | "https://deno.land/std@0.200.0/media_types/content_type.ts": "ad98a5aa2d95f5965b2796072284258710a25e520952376ed432b0937ce743bc", 63 | "https://deno.land/std@0.200.0/media_types/extension.ts": "a7cd28c9417143387cdfed27d4e8607ebcf5b1ec27eb8473d5b000144689fe65", 64 | "https://deno.land/std@0.200.0/media_types/extensions_by_type.ts": "43806d6a52a0d6d965ada9d20e60a982feb40bc7a82268178d94edb764694fed", 65 | "https://deno.land/std@0.200.0/media_types/format_media_type.ts": "f5e1073c05526a6f5a516ac5c5587a1abd043bf1039c71cde1166aa4328c8baf", 66 | "https://deno.land/std@0.200.0/media_types/get_charset.ts": "18b88274796fda5d353806bf409eb1d2ddb3f004eb4bd311662c4cdd8ac173db", 67 | "https://deno.land/std@0.200.0/media_types/mod.ts": "d3f0b99f85053bc0b98ecc24eaa3546dfa09b856dc0bbaf60d8956d2cdd710c8", 68 | "https://deno.land/std@0.200.0/media_types/parse_media_type.ts": "8cb0144385c555c9ce81881b7cee3fbb746f23b4af988fecdb7bd01ef8cc35b1", 69 | "https://deno.land/std@0.200.0/media_types/type_by_extension.ts": "daa801eb0f11cdf199445d0f1b656cf116d47dcf9e5b85cc1e6b4469f5ee0432", 70 | "https://deno.land/std@0.200.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586", 71 | "https://deno.land/std@0.200.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", 72 | "https://deno.land/std@0.200.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", 73 | "https://deno.land/std@0.200.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", 74 | "https://deno.land/std@0.200.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", 75 | "https://deno.land/std@0.200.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", 76 | "https://deno.land/std@0.200.0/path/_from_file_url.ts": "7e4e5626089785adddb061f1b9f4932d6b21c7df778e7449531a11e32048245c", 77 | "https://deno.land/std@0.200.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", 78 | "https://deno.land/std@0.200.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", 79 | "https://deno.land/std@0.200.0/path/_join.ts": "fd78555bc34d5f188918fc7018dfe8fe2df5bbad94a3b30a433666c03934d77f", 80 | "https://deno.land/std@0.200.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", 81 | "https://deno.land/std@0.200.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", 82 | "https://deno.land/std@0.200.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", 83 | "https://deno.land/std@0.200.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", 84 | "https://deno.land/std@0.200.0/path/_to_file_url.ts": "739bfda583598790b2e77ce227f2bb618f6ebdb939788cea47555b43970ec58c", 85 | "https://deno.land/std@0.200.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", 86 | "https://deno.land/std@0.200.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", 87 | "https://deno.land/std@0.200.0/path/basename.ts": "6f08fbb90dbfcf320765b3abb01f995b1723f75e2534acfd5380e202c802a3aa", 88 | "https://deno.land/std@0.200.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", 89 | "https://deno.land/std@0.200.0/path/dirname.ts": "098996822a31b4c46e1eb52a19540d3c6f9f54b772fc8a197939eeabc29fca2f", 90 | "https://deno.land/std@0.200.0/path/extname.ts": "9b83c62fd16505739541f7a3ab447d8972da39dbf668d47af2f93206c2480893", 91 | "https://deno.land/std@0.200.0/path/format.ts": "cb22f95cc7853d590b87708cc9441785e760d711188facff3d225305a8213aca", 92 | "https://deno.land/std@0.200.0/path/from_file_url.ts": "a6221cfc928928ec4d9786d767dfac98fa2ab746af0786446c9834a07b98817e", 93 | "https://deno.land/std@0.200.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", 94 | "https://deno.land/std@0.200.0/path/is_absolute.ts": "6b3d36352eb7fa29edb53f9e7b09b1aeb022a3c5465764f6cc5b8c41f9736197", 95 | "https://deno.land/std@0.200.0/path/join.ts": "4a2867ff2f3c81ffc9eb3d56dade16db6f8bd3854f269306d23dad4115089c84", 96 | "https://deno.land/std@0.200.0/path/mod.ts": "7765507696cb321994cdacfc19ee3ba61e8e3ebf4bd98fa75a276cf5dc18ce2a", 97 | "https://deno.land/std@0.200.0/path/normalize.ts": "7d992cd262b2deefa842d93a8ba2ed51f3949ba595b1d07f627ac2cddbc74808", 98 | "https://deno.land/std@0.200.0/path/parse.ts": "031fe488b3497fb8312fc1dc3c3d6c2d80707edd9c661e18ee9fd20f95edf322", 99 | "https://deno.land/std@0.200.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", 100 | "https://deno.land/std@0.200.0/path/relative.ts": "7db80c5035016174267da16321a742d76e875215c317859a383b12f413c6f5d6", 101 | "https://deno.land/std@0.200.0/path/resolve.ts": "103b62207726a27f28177f397008545804ecb20aaf00623af1f622b18cd80b9f", 102 | "https://deno.land/std@0.200.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", 103 | "https://deno.land/std@0.200.0/path/to_file_url.ts": "dd32f7a01bbf3b15b5df46796659984b372973d9b2d7d59bcf0eb990763a0cb5", 104 | "https://deno.land/std@0.200.0/path/to_namespaced_path.ts": "4e643ab729bf49ccdc166ad48d2de262ff462938fcf2a44a4425588f4a0bd690", 105 | "https://deno.land/std@0.200.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", 106 | "https://deno.land/std@0.200.0/streams/_common.ts": "f45cba84f0d813de3326466095539602364a9ba521f804cc758f7a475cda692d", 107 | "https://deno.land/std@0.200.0/streams/buffer.ts": "6cd773d22cf21bb988a98cc551b5abfc4c3b03516f93eaa3fb6f2f6e16032deb", 108 | "https://deno.land/std@0.200.0/streams/byte_slice_stream.ts": "c46d7c74836fc8c1a9acd9fe211cbe1bbaaee1b36087c834fb03af4991135c3a", 109 | "https://deno.land/std@0.200.0/streams/copy.ts": "75cbc795ff89291df22ddca5252de88b2e16d40c85d02840593386a8a1454f71", 110 | "https://deno.land/std@0.200.0/streams/delimiter_stream.ts": "f69e849b3d1f59f02424497273f411105a6f76a9f13da92aeeb9a2d554236814", 111 | "https://deno.land/std@0.200.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1", 112 | "https://deno.land/std@0.200.0/streams/iterate_reader.ts": "bbec1d45c2df2c0c5920bad0549351446fdc8e0886d99e95959b259dbcdb6072", 113 | "https://deno.land/std@0.200.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048", 114 | "https://deno.land/std@0.200.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38", 115 | "https://deno.land/std@0.200.0/streams/merge_readable_streams.ts": "dc2db0cbf1b14d999aa2aa2a2a1ba24ce58953878f29845ed9319321d0a01fab", 116 | "https://deno.land/std@0.200.0/streams/mod.ts": "c07ec010e700b9ea887dc36ca08729828bc7912f711e4054e24d33fd46282252", 117 | "https://deno.land/std@0.200.0/streams/read_all.ts": "ee319772fb0fd28302f97343cc48dfcf948f154fd0d755d8efe65814b70533be", 118 | "https://deno.land/std@0.200.0/streams/readable_stream_from_iterable.ts": "a355e97ba8671a4611ae9671c1f33c4a7e6a1b42fbdc9a399338ac3d6f875364", 119 | "https://deno.land/std@0.200.0/streams/readable_stream_from_reader.ts": "bfc416c4576a30aac6b9af22c9dc292c20c6742141ee7c55b5e85460beb0c54e", 120 | "https://deno.land/std@0.200.0/streams/reader_from_iterable.ts": "55f68110dce3f8f2c87b834d95f153bc904257fc65175f9f2abe78455cb8047c", 121 | "https://deno.land/std@0.200.0/streams/reader_from_stream_reader.ts": "fa4971e5615a010e49492c5d1688ca1a4d17472a41e98b498ab89a64ebd7ac73", 122 | "https://deno.land/std@0.200.0/streams/text_delimiter_stream.ts": "20e680ab8b751390e359288ce764f9c47d164af11a263870746eeca4bc7d976b", 123 | "https://deno.land/std@0.200.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa", 124 | "https://deno.land/std@0.200.0/streams/to_transform_stream.ts": "89fd367cafb3b6d80d61e2f4f1fcf66cc75723ecee8d474b495f022264ec6c3b", 125 | "https://deno.land/std@0.200.0/streams/writable_stream_from_writer.ts": "56fff5c82fb736fdd669b567cc0b2bbbe0351002cd13254eae26c366e2bed89a", 126 | "https://deno.land/std@0.200.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", 127 | "https://deno.land/std@0.200.0/streams/writer_from_stream_writer.ts": "07c7ee025151a190f37fc42cbb01ff93afc949119ebddc6e0d0df14df1bf6950", 128 | "https://deno.land/std@0.200.0/streams/zip_readable_streams.ts": "a9d81aa451240f79230add674809dbee038d93aabe286e2d9671e66591fc86ca", 129 | "https://deno.land/x/jsx@v0.1.5/mod.ts": "24bb89837fda59c53c12a3c0e464378ca6de9b261dec1df57ba640b1cfed9611", 130 | "https://deno.land/x/oak@v12.6.1/application.ts": "3028d3f6fa5ee743de013881550d054372c11d83c45099c2d794033786d27008", 131 | "https://deno.land/x/oak@v12.6.1/body.ts": "1899761b97fc9d776f3710b2637fb047ba29b968609afc6c0e5219b1108e703c", 132 | "https://deno.land/x/oak@v12.6.1/buf_reader.ts": "26640736541598dbd9f2b84a9d0595756afff03c9ca55b66eef1911f7798b56d", 133 | "https://deno.land/x/oak@v12.6.1/content_disposition.ts": "8b8c3cb2fba7138cd5b7f82fc3b5ea39b33db924a824b28261659db7e164621e", 134 | "https://deno.land/x/oak@v12.6.1/context.ts": "895a2d40186b89c28ba3947bf08a9335f1a11fc33133f760082536b74c53d1ca", 135 | "https://deno.land/x/oak@v12.6.1/deps.ts": "267ef76c25592101fe1f6c6d7730664015a9179c974da4f7441297d9367a9514", 136 | "https://deno.land/x/oak@v12.6.1/etag.ts": "32e47726b41698aefdd71faac5aaf2907c9bdd41ef18a7693863be4f8fee115d", 137 | "https://deno.land/x/oak@v12.6.1/forwarded.ts": "e656f96a85574e2a6ee54dc35efc9f72d543c9ae0923760ef426ee7369eef01c", 138 | "https://deno.land/x/oak@v12.6.1/headers.ts": "769fd042d34fbcd5667cbd745b5c65d335cc8430e822dbf1f87d65313cab4b47", 139 | "https://deno.land/x/oak@v12.6.1/helpers.ts": "6b03c6a2be06ec775d54449e442a2bac234aa952948ca758356eab6dc87af618", 140 | "https://deno.land/x/oak@v12.6.1/http_server_native.ts": "98e12c50a959553cfc144bc00999c969fa69ca781cbd96bec563f55691ab82db", 141 | "https://deno.land/x/oak@v12.6.1/http_server_native_request.ts": "552b174b5e13e92de8897d5b6f716b1e5a53543115481d65a651a41e4ca29ec9", 142 | "https://deno.land/x/oak@v12.6.1/isMediaType.ts": "62d638abcf837ece3a8f07a4b7ca59794135cb0d4b73194c7d5837efd4161005", 143 | "https://deno.land/x/oak@v12.6.1/mediaTyper.ts": "042b853fc8e9c3f6c628dd389e03ef481552bf07242efc3f8a1af042102a6105", 144 | "https://deno.land/x/oak@v12.6.1/middleware.ts": "c7f7a0424a6dd99a00e4b8d7d6e131efc0facc8dea781845d713b63df8ef1862", 145 | "https://deno.land/x/oak@v12.6.1/middleware/proxy.ts": "6f2799cf60d926e7a8d13ff757a59d7f0f930407db7ee9b81e7c064138eb89ff", 146 | "https://deno.land/x/oak@v12.6.1/mod.ts": "f6aa47ad1b6099470c9a884cccad9d3ac0fd242ba940896291ab76cd26cf554b", 147 | "https://deno.land/x/oak@v12.6.1/multipart.ts": "1484e01b98f5135f2aa09f7d0ce1e7be39109bf9f045ac660e941619d04e3d29", 148 | "https://deno.land/x/oak@v12.6.1/range.ts": "1ca15fc1ac21c650c34e6997a75af2af9d9d8eb6fe2d5d1dadeac3dfd4a9c152", 149 | "https://deno.land/x/oak@v12.6.1/request.ts": "32409827e285ee65889b22bbaaea5d6b280258124c2e9a4f724baa8e6d6375b7", 150 | "https://deno.land/x/oak@v12.6.1/response.ts": "094d950a5158f5b3446ca8a7b6e975dd23afb42b38c38517cc2f41dc75b16b4c", 151 | "https://deno.land/x/oak@v12.6.1/router.ts": "0f53d6249f9e8f89f2522b2b810b9302d0f22593c184b16b24b03bf2b7d42ea1", 152 | "https://deno.land/x/oak@v12.6.1/send.ts": "5ec49f106294593f468317a0c885da4f3274bf6d0fe9e16a7304391730b4f4fb", 153 | "https://deno.land/x/oak@v12.6.1/structured_clone.ts": "c3888b14d1eec558345bfbf13d0993d59bd45aaa8588444e35dd558c3a921cd8", 154 | "https://deno.land/x/oak@v12.6.1/testing.ts": "37d684d57bb8e5150fb5eb2677e66b04dcb422709cf2c5a74c1df94d52aa02e2", 155 | "https://deno.land/x/oak@v12.6.1/util.ts": "0a3fdffb114859c2de84e1783efa3a544af4d2af8c6f08e0d25655de9d3e69bb", 156 | "https://deno.land/x/path_to_regexp@v6.2.1/index.ts": "894060567837bae8fc9c5cbd4d0a05e9024672083d5883b525c031eea940e556", 157 | "https://deno.land/x/use_php@v1/lib/bootstrap.ts": "1eabfd11cb2ca462d2a8540ad3a634bc2b66260c30f32ad906141107ecab5f49", 158 | "https://deno.land/x/use_php@v1/lib/usephp.tsx": "f38cd6da586f870a85a2a02a3f2a906b7735124b72bfd028eef638158bb207c3", 159 | "https://deno.land/x/use_php@v1/mod.ts": "b8e9949aa50476345bf036c99f7870cc451dafd50d922d65bc6d839c6a9e55ab" 160 | } 161 | } 162 | --------------------------------------------------------------------------------