Highly ambitious ATProtocol AppView service and sdks

update cli to support more templates

+112 -32
+42 -14
packages/cli/scripts/embed-templates.ts
··· 4 4 import { relative, join } from "@std/path"; 5 5 import { encodeBase64 } from "@std/encoding/base64"; 6 6 7 - const TEMPLATE_DIR = join(import.meta.dirname!, "..", "src", "templates", "deno-ssr"); 7 + const TEMPLATES_BASE_DIR = join(import.meta.dirname!, "..", "src", "templates"); 8 8 const OUTPUT_FILE = join(import.meta.dirname!, "..", "src", "templates", "embedded.ts"); 9 + 10 + const TEMPLATE_NAMES = ["deno-ssr"]; 9 11 10 12 interface TemplateFile { 13 + template: string; // Template name (e.g., "deno-ssr", "deno-graphql") 11 14 path: string; 12 15 content: string; 13 16 } 14 17 15 18 async function embedTemplates() { 16 - console.log("Embedding templates from:", TEMPLATE_DIR); 19 + console.log("Embedding templates from:", TEMPLATES_BASE_DIR); 17 20 18 21 const templates: TemplateFile[] = []; 19 22 20 - // Walk through all files in the template directory 21 - for await (const entry of walk(TEMPLATE_DIR, { includeFiles: true, includeDirs: false })) { 22 - const relativePath = relative(TEMPLATE_DIR, entry.path); 23 - const content = await Deno.readFile(entry.path); 24 - const base64Content = encodeBase64(content); 23 + // Walk through each template directory 24 + for (const templateName of TEMPLATE_NAMES) { 25 + const templateDir = join(TEMPLATES_BASE_DIR, templateName); 26 + console.log(`\nProcessing template: ${templateName}`); 25 27 26 - templates.push({ 27 - path: relativePath, 28 - content: base64Content, 29 - }); 28 + // Walk through all files in the template directory 29 + for await (const entry of walk(templateDir, { includeFiles: true, includeDirs: false })) { 30 + const relativePath = relative(templateDir, entry.path); 31 + const content = await Deno.readFile(entry.path); 32 + const base64Content = encodeBase64(content); 30 33 31 - console.log(` Embedded: ${relativePath}`); 34 + templates.push({ 35 + template: templateName, 36 + path: relativePath, 37 + content: base64Content, 38 + }); 39 + 40 + console.log(` Embedded: ${relativePath}`); 41 + } 32 42 } 33 43 34 44 // Generate TypeScript file with embedded templates ··· 36 46 // Generated by scripts/embed-templates.ts 37 47 38 48 export interface EmbeddedTemplate { 49 + template: string; // Template name (e.g., "deno-ssr", "deno-graphql") 39 50 path: string; 40 51 content: string; // Base64 encoded 41 52 } 42 53 43 54 export const EMBEDDED_TEMPLATES: EmbeddedTemplate[] = ${JSON.stringify(templates, null, 2)}; 44 55 45 - export function getTemplateContent(path: string): Uint8Array | undefined { 46 - const template = EMBEDDED_TEMPLATES.find(t => t.path === path); 56 + export const AVAILABLE_TEMPLATES = ${JSON.stringify(TEMPLATE_NAMES)}; 57 + 58 + export function getTemplateContent(templateName: string, path: string): Uint8Array | undefined { 59 + const template = EMBEDDED_TEMPLATES.find(t => t.template === templateName && t.path === path); 47 60 if (!template) return undefined; 48 61 49 62 const binaryString = atob(template.content); ··· 57 70 export function getAllTemplates(): Map<string, Uint8Array> { 58 71 const result = new Map<string, Uint8Array>(); 59 72 for (const template of EMBEDDED_TEMPLATES) { 73 + const binaryString = atob(template.content); 74 + const bytes = new Uint8Array(binaryString.length); 75 + for (let i = 0; i < binaryString.length; i++) { 76 + bytes[i] = binaryString.charCodeAt(i); 77 + } 78 + result.set(template.path, bytes); 79 + } 80 + return result; 81 + } 82 + 83 + export function getTemplatesForName(templateName: string): Map<string, Uint8Array> { 84 + const result = new Map<string, Uint8Array>(); 85 + for (const template of EMBEDDED_TEMPLATES) { 86 + if (template.template !== templateName) continue; 87 + 60 88 const binaryString = atob(template.content); 61 89 const bytes = new Uint8Array(binaryString.length); 62 90 for (let i = 0; i < binaryString.length; i++) {
+31 -16
packages/cli/src/commands/init.ts
··· 3 3 import { ensureDir } from "@std/fs"; 4 4 import { cyan, green, bold, dim } from "@std/fmt/colors"; 5 5 import { logger } from "../utils/logger.ts"; 6 - import { getAllTemplates } from "../templates/embedded.ts"; 6 + import { getTemplatesForName, AVAILABLE_TEMPLATES } from "../templates/embedded.ts"; 7 7 import { generateSliceName, generateDomain } from "../utils/name_generator.ts"; 8 8 import { createAuthenticatedClient } from "../utils/client.ts"; 9 9 import { ConfigManager } from "../auth/config.ts"; ··· 20 20 21 21 export async function initCommand(args: string[], _globalArgs: unknown) { 22 22 const parsed = parseArgs(args, { 23 - string: ["name"], 23 + string: ["name", "template"], 24 24 boolean: ["help"], 25 25 alias: { 26 26 n: "name", 27 27 h: "help", 28 + t: "template", 29 + }, 30 + default: { 31 + template: "deno-ssr", 28 32 }, 29 33 }); 30 34 ··· 33 37 return; 34 38 } 35 39 40 + // Validate template name 41 + const templateName = parsed.template as string; 42 + if (!AVAILABLE_TEMPLATES.includes(templateName)) { 43 + logger.error(`Invalid template: ${templateName}`); 44 + logger.info(`Available templates: ${AVAILABLE_TEMPLATES.join(", ")}`); 45 + Deno.exit(1); 46 + } 47 + 36 48 // Check if we're inside an existing project 37 49 const currentDir = Deno.cwd(); 38 50 const projectIndicators = ["deno.json", "slices.json", ".git"]; ··· 241 253 await ensureDir(targetDir); 242 254 243 255 // Extract embedded templates 244 - await extractEmbeddedTemplates(targetDir, projectName); 256 + await extractEmbeddedTemplates(targetDir, projectName, templateName); 245 257 246 258 // Update .env.example with slice URI if we created one 247 259 if (sliceUri) { ··· 421 433 422 434 async function extractEmbeddedTemplates( 423 435 targetDir: string, 424 - projectName: string 436 + projectName: string, 437 + templateName: string 425 438 ) { 426 439 try { 427 - const templates = getAllTemplates(); 440 + const templates = getTemplatesForName(templateName); 428 441 429 442 if (templates.size === 0) { 430 - throw new Error("No embedded templates found"); 443 + throw new Error(`No templates found for: ${templateName}`); 431 444 } 432 445 433 446 for (const [relativePath, content] of templates.entries()) { ··· 444 457 // Process template files for variable replacement 445 458 await processTemplateFiles(targetDir, projectName); 446 459 447 - logger.info("Template files extracted and processed"); 460 + logger.info(`Template files extracted and processed (${templateName})`); 448 461 } catch (error) { 449 462 const err = error as Error; 450 463 logger.error("Failed to extract templates:", err.message); ··· 471 484 472 485 function showInitHelp() { 473 486 console.log(` 474 - Initialize a new Deno SSR project with OAuth authentication 487 + Initialize a new Deno project with OAuth authentication 475 488 476 489 USAGE: 477 - slices init <project-name> Create project with specified name 478 - slices init Create project with random generated name 479 - slices init --name <name> Create project with specified name 490 + slices init <project-name> Create project with specified name 491 + slices init Create project with random generated name 492 + slices init --name <name> Create project with specified name 493 + slices init --template <template-name> Specify template to use 480 494 481 495 ARGUMENTS: 482 496 <project-name> Name of the project to create (optional) 483 497 484 498 OPTIONS: 485 - -n, --name <name> Project name 486 - -h, --help Show this help message 499 + -n, --name <name> Project name 500 + -t, --template <name> Template to use (default: deno-ssr) 501 + Available: ${AVAILABLE_TEMPLATES.join(", ")} 502 + -h, --help Show this help message 487 503 488 504 EXAMPLES: 489 - slices init my-app Creates "my-app" project and slice 490 - slices init Creates project with random name like "stellar-wave" 491 - slices init --name my-project 505 + slices init my-app Creates "my-app" project with deno-ssr template 506 + slices init Creates project with random name 492 507 493 508 FEATURES: 494 509 • Automatically creates a matching slice (if authenticated)
+39 -2
packages/cli/src/templates/embedded.ts
··· 2 2 // Generated by scripts/embed-templates.ts 3 3 4 4 export interface EmbeddedTemplate { 5 + template: string; // Template name (e.g., "deno-ssr", "deno-graphql") 5 6 path: string; 6 7 content: string; // Base64 encoded 7 8 } 8 9 9 10 export const EMBEDDED_TEMPLATES: EmbeddedTemplate[] = [ 10 11 { 12 + "template": "deno-ssr", 11 13 "path": "deno.json", 12 14 "content": "ewogICJ0YXNrcyI6IHsKICAgICJzdGFydCI6ICJkZW5vIHJ1biAtQSAtLWVudi1maWxlPS5lbnYgc3JjL21haW4udHMiLAogICAgImRldiI6ICJkZW5vIHJ1biAtQSAtLWVudi1maWxlPS5lbnYgLS13YXRjaCBzcmMvbWFpbi50cyIKICB9LAogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAianN4IjogInByZWNvbXBpbGUiLAogICAgImpzeEltcG9ydFNvdXJjZSI6ICJwcmVhY3QiCiAgfSwKICAiaW1wb3J0cyI6IHsKICAgICJAc2xpY2VzL2NsaWVudCI6ICJqc3I6QHNsaWNlcy9jbGllbnRAXjAuMS4wLWFscGhhLjQiLAogICAgIkBzbGljZXMvb2F1dGgiOiAianNyOkBzbGljZXMvb2F1dGhAXjAuNi4wIiwKICAgICJAc2xpY2VzL3Nlc3Npb24iOiAianNyOkBzbGljZXMvc2Vzc2lvbkBeMC4zLjAiLAogICAgIkBzdGQvYXNzZXJ0IjogImpzcjpAc3RkL2Fzc2VydEBeMS4wLjE0IiwKICAgICJAc3RkL2ZtdCI6ICJqc3I6QHN0ZC9mbXRAXjEuMC44IiwKICAgICJwcmVhY3QiOiAibnBtOnByZWFjdEBeMTAuMjcuMSIsCiAgICAicHJlYWN0LXJlbmRlci10by1zdHJpbmciOiAibnBtOnByZWFjdC1yZW5kZXItdG8tc3RyaW5nQF42LjUuMTMiLAogICAgInR5cGVkLWh0bXgiOiAibnBtOnR5cGVkLWh0bXhAXjAuMy4xIiwKICAgICJAc3RkL2h0dHAiOiAianNyOkBzdGQvaHR0cEBeMS4wLjIwIiwKICAgICJjbHN4IjogIm5wbTpjbHN4QF4yLjEuMSIsCiAgICAidGFpbHdpbmQtbWVyZ2UiOiAibnBtOnRhaWx3aW5kLW1lcmdlQF4yLjUuNSIsCiAgICAibHVjaWRlLXByZWFjdCI6ICJucG06bHVjaWRlLXByZWFjdEBeMC41NDQuMCIKICB9LAogICJub2RlTW9kdWxlc0RpciI6ICJhdXRvIgp9Cg==" 13 15 }, 14 16 { 17 + "template": "deno-ssr", 15 18 "path": "README.md", 16 19 "content": "IyB7e1BST0pFQ1RfTkFNRX19CgpBIERlbm8gU1NSIHdlYiBhcHBsaWNhdGlvbiB3aXRoIEFUIFByb3RvY29sIGludGVncmF0aW9uLCBidWlsdCB3aXRoIFByZWFjdCwKSFRNWCwgYW5kIE9BdXRoIGF1dGhlbnRpY2F0aW9uLgoKIyMgUXVpY2sgU3RhcnQKCmBgYGJhc2gKIyBTdGFydCB0aGUgZGV2ZWxvcG1lbnQgc2VydmVyCmRlbm8gdGFzayBkZXYKYGBgCgpWaXNpdCB5b3VyIGFwcCBhdCBodHRwOi8vbG9jYWxob3N0OjgwODAKCj4gKipOb3RlOioqIFlvdXIgc2xpY2UgYW5kIE9BdXRoIGNyZWRlbnRpYWxzIHdlcmUgYXV0b21hdGljYWxseSBjb25maWd1cmVkCj4gZHVyaW5nIHByb2plY3QgY3JlYXRpb24uIFRoZSBgLmVudmAgZmlsZSBpcyBhbHJlYWR5IHNldCB1cCB3aXRoIHlvdXIKPiBjcmVkZW50aWFscy4KCiMjIEZlYXR1cmVzCgotIPCflJAgKipPQXV0aCBBdXRoZW50aWNhdGlvbioqIHdpdGggUEtDRSBmbG93Ci0g4pqhICoqU2VydmVyLVNpZGUgUmVuZGVyaW5nKiogd2l0aCBQcmVhY3QKLSDwn46vICoqSW50ZXJhY3RpdmUgVUkqKiB3aXRoIEhUTVgKLSDwn46oICoqU3R5bGluZyoqIHdpdGggVGFpbHdpbmQgQ1NTCi0g8J+XhO+4jyAqKlNlc3Npb24gTWFuYWdlbWVudCoqIHdpdGggU1FMaXRlCi0g8J+UhCAqKkF1dG8gVG9rZW4gUmVmcmVzaCoqCi0g8J+Pl++4jyAqKkZlYXR1cmUtQmFzZWQgQXJjaGl0ZWN0dXJlKioKCiMjIERldmVsb3BtZW50CgpgYGBiYXNoCiMgU3RhcnQgZGV2ZWxvcG1lbnQgc2VydmVyIHdpdGggaG90IHJlbG9hZApkZW5vIHRhc2sgZGV2CgojIFN0YXJ0IHByb2R1Y3Rpb24gc2VydmVyCmRlbm8gdGFzayBzdGFydAoKIyBGb3JtYXQgY29kZQpkZW5vIGZtdAoKIyBDaGVjayB0eXBlcwpkZW5vIGNoZWNrIHNyYy8qKi8qLnRzIHNyYy8qKi8qLnRzeApgYGAKCiMjIFByb2plY3QgU3RydWN0dXJlCgpgYGAKc2xpY2VzLmpzb24gICAgICAgICAgICAgICMgU2xpY2VzIGNvbmZpZ3VyYXRpb24gZmlsZQpsZXhpY29ucy8gICAgICAgICAgICAgICAgIyBBVCBQcm90b2NvbCBsZXhpY29uIGRlZmluaXRpb25zCnNyYy8K4pSc4pSA4pSAIG1haW4udHMgICAgICAgICAgICAgICMgU2VydmVyIGVudHJ5IHBvaW50CuKUnOKUgOKUgCBjb25maWcudHMgICAgICAgICAgICAjIE9BdXRoICYgc2Vzc2lvbiBjb25maWd1cmF0aW9uCuKUnOKUgOKUgCBnZW5lcmF0ZWRfY2xpZW50LnRzICAjIEdlbmVyYXRlZCBUeXBlU2NyaXB0IGNsaWVudCBmcm9tIGxleGljb25zCuKUnOKUgOKUgCByb3V0ZXMvICAgICAgICAgICAgICAjIFJvdXRlIGRlZmluaXRpb25zCuKUnOKUgOKUgCBmZWF0dXJlcy8gICAgICAgICAgICAjIEZlYXR1cmUgbW9kdWxlcwrilIIgICDilJTilIDilIAgYXV0aC8gICAgICAgICAgICMgQXV0aGVudGljYXRpb24K4pSc4pSA4pSAIHNoYXJlZC9mcmFnbWVudHMvICAgICMgUmV1c2FibGUgVUkgY29tcG9uZW50cwrilJTilIDilIAgdXRpbHMvICAgICAgICAgICAgICAjIFV0aWxpdHkgZnVuY3Rpb25zCmBgYAoKIyMgT0F1dGggU2V0dXAKCllvdXIgT0F1dGggYXBwbGljYXRpb24gd2FzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBkdXJpbmcgcHJvamVjdCBpbml0aWFsaXphdGlvbgp3aXRoOgoKLSAqKkNsaWVudCBJRCAmIFNlY3JldCoqOiBBbHJlYWR5IGNvbmZpZ3VyZWQgaW4gYC5lbnZgCi0gKipSZWRpcmVjdCBVUkkqKjogYGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9vYXV0aC9jYWxsYmFja2AKLSAqKlNsaWNlKio6IEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgbGlua2VkCgpUbyBtYW5hZ2UgeW91ciBPQXV0aCBjbGllbnRzIG9yIGNyZWF0ZSBhZGRpdGlvbmFsIG9uZXM6CgoxLiBWaXNpdCBbU2xpY2VzIE5ldHdvcmtdKGh0dHBzOi8vc2xpY2VzLm5ldHdvcmspCjIuIFVzZSB0aGUgYHNsaWNlcyBsb2dpbmAgQ0xJIGNvbW1hbmQKCiMjIERvY3VtZW50YXRpb24KCi0gYENMQVVERS5tZGAgLSBBcmNoaXRlY3R1cmUgZ3VpZGUgZm9yIEFJIGFzc2lzdGFuY2UKLSBGZWF0dXJlIGRpcmVjdG9yaWVzIGNvbnRhaW4gaGFuZGxlcnMgYW5kIHRlbXBsYXRlcwotIENvbXBvbmVudHMgdXNlIFByZWFjdCB3aXRoIHNlcnZlci1zaWRlIHJlbmRlcmluZwotIEhUTVggcHJvdmlkZXMgaW50ZXJhY3RpdmUgYmVoYXZpb3Igd2l0aG91dCBwYWdlIHJlbG9hZHMKCiMjIExpY2Vuc2UKCk1JVAo=" 17 20 }, 18 21 { 22 + "template": "deno-ssr", 19 23 "path": ".gitignore", 20 24 "content": "LmVudioKbm9kZV9tb2R1bGVzCiouZGIqCg==" 21 25 }, 22 26 { 27 + "template": "deno-ssr", 23 28 "path": ".env.example", 24 29 "content": "IyBPQXV0aCBDb25maWd1cmF0aW9uIChyZXF1aXJlZCkKT0FVVEhfQ0xJRU5UX0lEPXlvdXJfb2F1dGhfY2xpZW50X2lkCk9BVVRIX0NMSUVOVF9TRUNSRVQ9eW91cl9vYXV0aF9jbGllbnRfc2VjcmV0Ck9BVVRIX1JFRElSRUNUX1VSST1odHRwOi8vbG9jYWxob3N0OjgwODAvb2F1dGgvY2FsbGJhY2sKT0FVVEhfQUlQX0JBU0VfVVJMPWh0dHBzOi8vYXV0aC5zbGljZXMubmV0d29yawoKIyBBUEkgQ29uZmlndXJhdGlvbiAocmVxdWlyZWQpCkFQSV9VUkw9aHR0cHM6Ly9hcGkuc2xpY2VzLm5ldHdvcmsKU0xJQ0VfVVJJPWF0Oi8vZGlkOnBsYzpiY2dsdHpxYXp3NXRiNmsyZzN0dGVuYmovbmV0d29yay5zbGljZXMuc2xpY2UvM2x6Ynp1bWNtdm8yegoKIyBEYXRhYmFzZSAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIHNsaWNlcy5kYikKREFUQUJBU0VfVVJMPXNsaWNlcy5kYgoKIyBFbnZpcm9ubWVudCAob3B0aW9uYWwsIGFmZmVjdHMgY29va2llIHNlY3VyaXR5KQpERU5PX0VOVj1kZXZlbG9wbWVudAoKIyBTZXJ2ZXIgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byA4MDgwKQpQT1JUPTgwODA=" 25 30 }, 26 31 { 32 + "template": "deno-ssr", 27 33 "path": "CLAUDE.md", 28 34 "content": "IyBDTEFVREUubWQKClRoaXMgZmlsZSBwcm92aWRlcyBndWlkYW5jZSB0byBDbGF1ZGUgQ29kZSAoY2xhdWRlLmFpL2NvZGUpIHdoZW4gd29ya2luZyB3aXRoCmNvZGUgaW4gdGhpcyByZXBvc2l0b3J5LgoKIyMgRGV2ZWxvcG1lbnQgQ29tbWFuZHMKCmBgYGJhc2gKIyBTdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBob3QgcmVsb2FkCmRlbm8gdGFzayBkZXYKCiMgU3RhcnQgcHJvZHVjdGlvbiBzZXJ2ZXIKZGVubyB0YXNrIHN0YXJ0CgojIEZvcm1hdCBjb2RlCmRlbm8gZm10CgojIENoZWNrIHR5cGVzCmRlbm8gY2hlY2sgc3JjLyoqLyoudHMgc3JjLyoqLyoudHN4CmBgYAoKIyMgQXJjaGl0ZWN0dXJlIE92ZXJ2aWV3CgpUaGlzIGlzIGEgRGVuby1iYXNlZCB3ZWIgYXBwbGljYXRpb24gYnVpbHQgd2l0aCB0aGUgU2xpY2VzIENMSS4gSXQgcHJvdmlkZXMKc2VydmVyLXNpZGUgcmVuZGVyaW5nIHdpdGggUHJlYWN0LCBPQXV0aCBhdXRoZW50aWNhdGlvbiwgYW5kIEFUIFByb3RvY29sCmludGVncmF0aW9uIGZvciBidWlsZGluZyBhcHBsaWNhdGlvbnMgb24gdGhlIGRlY2VudHJhbGl6ZWQgd2ViLgoKIyMjIFRlY2hub2xvZ3kgU3RhY2sKCi0gKipSdW50aW1lKio6IERlbm8gd2l0aCBUeXBlU2NyaXB0Ci0gKipGcm9udGVuZCoqOiBQcmVhY3Qgd2l0aCBzZXJ2ZXItc2lkZSByZW5kZXJpbmcKLSAqKlN0eWxpbmcqKjogVGFpbHdpbmQgQ1NTICh2aWEgQ0ROKQotICoqSW50ZXJhY3Rpdml0eSoqOiBIVE1YICsgSHlwZXJzY3JpcHQKLSAqKlJvdXRpbmcqKjogRGVubydzIHN0YW5kYXJkIEhUVFAgcm91dGluZwotICoqQXV0aGVudGljYXRpb24qKjogT0F1dGggd2l0aCBQS0NFIGZsb3cgdXNpbmcgYEBzbGljZXMvb2F1dGhgCi0gKipTZXNzaW9ucyoqOiBTUUxpdGUtYmFzZWQgd2l0aCBgQHNsaWNlcy9zZXNzaW9uYAotICoqRGF0YWJhc2UqKjogU1FMaXRlIHZpYSBPQXV0aCBhbmQgc2Vzc2lvbiBsaWJyYXJpZXMKCiMjIyBDb3JlIEFyY2hpdGVjdHVyZSBQYXR0ZXJucwoKIyMjIyBGZWF0dXJlLUJhc2VkIE9yZ2FuaXphdGlvbgoKVGhlIGNvZGViYXNlIGlzIG9yZ2FuaXplZCBieSBmZWF0dXJlcyByYXRoZXIgdGhhbiB0ZWNobmljYWwgbGF5ZXJzOgoKYGBgCnNyYy8K4pSc4pSA4pSAIGZlYXR1cmVzLyAgICAgICAgICAgIyBGZWF0dXJlIG1vZHVsZXMK4pSCICAg4pSU4pSA4pSAIGF1dGgvICAgICAgICAgICMgQXV0aGVudGljYXRpb24gKGxvZ2luL2xvZ291dCkK4pSc4pSA4pSAIHNoYXJlZC8gICAgICAgICAgICAjIFNoYXJlZCBVSSBjb21wb25lbnRzCuKUnOKUgOKUgCByb3V0ZXMvICAgICAgICAgICAgIyBSb3V0ZSBkZWZpbml0aW9ucyBhbmQgbWlkZGxld2FyZQrilJzilIDilIAgdXRpbHMvICAgICAgICAgICAgICMgVXRpbGl0eSBmdW5jdGlvbnMK4pSU4pSA4pSAIGNvbmZpZy50cyAgICAgICAgICAjIENvcmUgY29uZmlndXJhdGlvbgpgYGAKCiMjIyMgSGFuZGxlciBQYXR0ZXJuCgpFYWNoIGZlYXR1cmUgZm9sbG93cyBhIGNvbnNpc3RlbnQgcGF0dGVybjoKCi0gYGhhbmRsZXJzLnRzeGAgLSBSb3V0ZSBoYW5kbGVycyB0aGF0IHJldHVybiBSZXNwb25zZSBvYmplY3RzCi0gYHRlbXBsYXRlcy9gIC0gUHJlYWN0IGNvbXBvbmVudHMgZm9yIHJlbmRlcmluZwotIGB0ZW1wbGF0ZXMvZnJhZ21lbnRzL2AgLSBSZXVzYWJsZSBVSSBjb21wb25lbnRzCgojIyMjIEF1dGhlbnRpY2F0aW9uICYgU2Vzc2lvbnMKCi0gT0F1dGggaW50ZWdyYXRpb24gd2l0aCBBVCBQcm90b2NvbCB1c2luZyBgQHNsaWNlcy9vYXV0aGAKLSBQS0NFIGZsb3cgZm9yIHNlY3VyZSBhdXRoZW50aWNhdGlvbgotIFNlc3Npb24gbWFuYWdlbWVudCB3aXRoIGBAc2xpY2VzL3Nlc3Npb25gCi0gU1FMaXRlIHN0b3JhZ2UgZm9yIE9BdXRoIHN0YXRlIGFuZCBzZXNzaW9ucwotIEF1dG9tYXRpYyB0b2tlbiByZWZyZXNoIGNhcGFiaWxpdGllcwoKIyMjIEtleSBDb21wb25lbnRzCgojIyMjIFJvdXRlIFN5c3RlbQoKLSBBbGwgcm91dGVzIGRlZmluZWQgaW4gYHNyYy9yb3V0ZXMvbW9kLnRzYAotIEZlYXR1cmUgcm91dGVzIGV4cG9ydGVkIGZyb20gYHNyYy9mZWF0dXJlcy8qL2hhbmRsZXJzLnRzeGAKLSBNaWRkbGV3YXJlIGluIGBzcmMvcm91dGVzL21pZGRsZXdhcmUudHNgIGhhbmRsZXMgYXV0aCBzdGF0ZQoKIyMjIyBPQXV0aCBJbnRlZ3JhdGlvbgoKLSBgc3JjL2NvbmZpZy50c2AgLSBPQXV0aCBjbGllbnQgYW5kIHNlc3Npb24gc3RvcmUgc2V0dXAKLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVxdWlyZWQ6IGBPQVVUSF9DTElFTlRfSURgLCBgT0FVVEhfQ0xJRU5UX1NFQ1JFVGAsCiAgYE9BVVRIX1JFRElSRUNUX1VSSWAsIGBPQVVUSF9BSVBfQkFTRV9VUkxgLCBgQVBJX1VSTGAsIGBTTElDRV9VUklgCi0gUEtDRSBmbG93IGltcGxlbWVudGF0aW9uIGluIGF1dGggaGFuZGxlcnMKLSBTUUxpdGUgc3RvcmFnZSBmb3IgT0F1dGggc3RhdGUgYW5kIHRva2VucwoKIyMjIyBSZW5kZXJpbmcgU3lzdGVtCgotIGBzcmMvdXRpbHMvcmVuZGVyLnRzeGAgLSBVbmlmaWVkIEhUTUwgcmVuZGVyaW5nIHdpdGggcHJvcGVyIGhlYWRlcnMKLSBTZXJ2ZXItc2lkZSByZW5kZXJpbmcgd2l0aCBQcmVhY3QKLSBIVE1YIGZvciBkeW5hbWljIGludGVyYWN0aW9ucyB3aXRob3V0IHBhZ2UgcmVsb2FkcwotIFNoYXJlZCBgTGF5b3V0YCBjb21wb25lbnQgaW4gYHNyYy9zaGFyZWQvZnJhZ21lbnRzL0xheW91dC50c3hgCgojIyMgRGV2ZWxvcG1lbnQgR3VpZGVsaW5lcwoKIyMjIyBDb21wb25lbnQgQ29udmVudGlvbnMKCi0gVXNlIGAudHN4YCBleHRlbnNpb24gZm9yIGNvbXBvbmVudHMgd2l0aCBKU1gKLSBQcmVhY3QgY29tcG9uZW50cyBmb3IgYWxsIFVJIHJlbmRlcmluZwotIEhUTVggYXR0cmlidXRlcyBmb3IgaW50ZXJhY3RpdmUgYmVoYXZpb3IKLSBUYWlsd2luZCBjbGFzc2VzIGZvciBzdHlsaW5nCgojIyMjIEZlYXR1cmUgRGV2ZWxvcG1lbnQKCldoZW4gYWRkaW5nIG5ldyBmZWF0dXJlczoKCjEuIENyZWF0ZSBmZWF0dXJlIGRpcmVjdG9yeSB1bmRlciBgc3JjL2ZlYXR1cmVzL2AKMi4gQWRkIGBoYW5kbGVycy50c3hgIHdpdGggcm91dGUgZGVmaW5pdGlvbnMKMy4gQ3JlYXRlIGB0ZW1wbGF0ZXMvYCBkaXJlY3Rvcnkgd2l0aCBQcmVhY3QgY29tcG9uZW50cwo0LiBFeHBvcnQgcm91dGVzIGZyb20gZmVhdHVyZSBhbmQgYWRkIHRvIGBzcmMvcm91dGVzL21vZC50c2AKNS4gRm9sbG93IGV4aXN0aW5nIGF1dGhlbnRpY2F0aW9uIHBhdHRlcm5zIHVzaW5nIGF1dGggbWlkZGxld2FyZQoKIyMjIyBFbnZpcm9ubWVudCBTZXR1cAoKVGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGEgYC5lbnZgIGZpbGUgd2l0aCBPQXV0aCBhbmQgQVBJIGNvbmZpZ3VyYXRpb24uCkNvcHkgYC5lbnYuZXhhbXBsZWAgYW5kIGZpbGwgaW4geW91ciB2YWx1ZXMuIE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzCndpbGwgY2F1c2Ugc3RhcnR1cCBmYWlsdXJlcyB3aXRoIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzLgoKIyMjIFJlcXVlc3QvUmVzcG9uc2UgRmxvdwoKMS4gUmVxdWVzdCBoaXRzIG1haW4gc2VydmVyIGluIGBzcmMvbWFpbi50c2AKMi4gUm91dGVzIHByb2Nlc3NlZCB0aHJvdWdoIGBzcmMvcm91dGVzL21vZC50c2AKMy4gQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBhcHBsaWVzIHNlc3Npb24gc3RhdGUKNC4gRmVhdHVyZSBoYW5kbGVycyBwcm9jZXNzIHJlcXVlc3RzIGFuZCByZXR1cm4gcmVuZGVyZWQgSFRNTAo1LiBIVE1YIGhhbmRsZXMgcGFydGlhbCBwYWdlIHVwZGF0ZXMgb24gY2xpZW50LXNpZGUgaW50ZXJhY3Rpb25zCgojIyMgT0F1dGggRmxvdwoKMS4gVXNlciBpbml0aWF0ZXMgbG9naW4gd2l0aCBoYW5kbGUvaWRlbnRpZmllcgoyLiBPQXV0aCBjbGllbnQgZ2VuZXJhdGVzIFBLQ0UgY2hhbGxlbmdlIGFuZCByZWRpcmVjdHMgdG8gYXV0aCBzZXJ2ZXIKMy4gVXNlciBhdXRoZW50aWNhdGVzIGFuZCBpcyByZWRpcmVjdGVkIGJhY2sgd2l0aCBhdXRob3JpemF0aW9uIGNvZGUKNC4gQ2xpZW50IGV4Y2hhbmdlcyBjb2RlIGZvciB0b2tlbnMgdXNpbmcgUEtDRSB2ZXJpZmllcgo1LiBTZXNzaW9uIGNyZWF0ZWQgd2l0aCBhdXRvbWF0aWMgdG9rZW4gcmVmcmVzaAo2LiBQcm90ZWN0ZWQgcm91dGVzIGFjY2VzcyB1c2VyIGRhdGEgdGhyb3VnaCBhdXRoZW50aWNhdGVkIGNsaWVudAoKIyMjIEFkZGluZyBOZXcgRmVhdHVyZXMKClRvIGFkZCBhIG5ldyBmZWF0dXJlOgoKMS4gQ3JlYXRlIGBzcmMvZmVhdHVyZXMvZmVhdHVyZS1uYW1lL2AKMi4gQWRkIGBoYW5kbGVycy50c3hgIHdpdGggcm91dGUgaGFuZGxlcnMKMy4gQ3JlYXRlIGB0ZW1wbGF0ZXMvYCBkaXJlY3RvcnkgZm9yIFVJIGNvbXBvbmVudHMKNC4gRXhwb3J0IHJvdXRlcyBhbmQgYWRkIHRvIG1haW4gcm91dGVyCjUuIFVzZSBleGlzdGluZyBwYXR0ZXJucyBmb3IgYXV0aGVudGljYXRpb24gYW5kIHJlbmRlcmluZw==" 29 35 }, 30 36 { 37 + "template": "deno-ssr", 31 38 "path": "src/main.ts", 32 39 "content": "aW1wb3J0IHsgcm91dGUgfSBmcm9tICJAc3RkL2h0dHAvdW5zdGFibGUtcm91dGUiOwppbXBvcnQgeyBhbGxSb3V0ZXMgfSBmcm9tICIuL3JvdXRlcy9tb2QudHMiOwppbXBvcnQgeyBjcmVhdGVMb2dnaW5nSGFuZGxlciB9IGZyb20gIi4vdXRpbHMvbG9nZ2luZy50cyI7CgpmdW5jdGlvbiBkZWZhdWx0SGFuZGxlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiB7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShSZXNwb25zZS5yZWRpcmVjdChuZXcgVVJMKCIvIiwgcmVxLnVybCksIDMwMikpOwp9Cgpjb25zdCBoYW5kbGVyID0gY3JlYXRlTG9nZ2luZ0hhbmRsZXIocm91dGUoYWxsUm91dGVzLCBkZWZhdWx0SGFuZGxlcikpOwoKRGVuby5zZXJ2ZSgKICB7CiAgICBwb3J0OiBwYXJzZUludChEZW5vLmVudi5nZXQoIlBPUlQiKSB8fCAiODA4MCIpLAogICAgaG9zdG5hbWU6ICIwLjAuMC4wIiwKICAgIG9uTGlzdGVuOiAoeyBwb3J0LCBob3N0bmFtZSB9KSA9PgogICAgICBjb25zb2xlLmxvZyhg8J+agCBTZXJ2ZXIgcnVubmluZyBvbiBodHRwOi8vJHtob3N0bmFtZX06JHtwb3J0fWApLAogIH0sCiAgaGFuZGxlciwKKTs=" 33 40 }, 34 41 { 42 + "template": "deno-ssr", 35 43 "path": "src/features/auth/templates/LoginPage.tsx", 36 44 "content": "aW1wb3J0IHsgTGF5b3V0IH0gZnJvbSAiLi4vLi4vLi4vc2hhcmVkL2ZyYWdtZW50cy9MYXlvdXQudHN4IjsKaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAiLi4vLi4vLi4vc2hhcmVkL2ZyYWdtZW50cy9CdXR0b24udHN4IjsKaW1wb3J0IHsgSW5wdXQgfSBmcm9tICIuLi8uLi8uLi9zaGFyZWQvZnJhZ21lbnRzL0lucHV0LnRzeCI7CgppbnRlcmZhY2UgTG9naW5QYWdlUHJvcHMgewogIGVycm9yPzogc3RyaW5nOwp9CgpleHBvcnQgZnVuY3Rpb24gTG9naW5QYWdlKHsgZXJyb3IgfTogTG9naW5QYWdlUHJvcHMpIHsKICByZXR1cm4gKAogICAgPExheW91dCB0aXRsZT0iTG9naW4iPgogICAgICA8ZGl2IGNsYXNzTmFtZT0ibWluLWgtc2NyZWVuIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLWdyYXktNTAiPgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJtYXgtdy1tZCB3LWZ1bGwgc3BhY2UteS04Ij4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9Im10LTYgdGV4dC1jZW50ZXIgdGV4dC0zeGwgZm9udC1leHRyYWJvbGQgdGV4dC1ncmF5LTkwMCI+CiAgICAgICAgICAgICAgU2lnbiBpbiB0byB5b3VyIGFjY291bnQKICAgICAgICAgICAgPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJtdC0yIHRleHQtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTYwMCI+CiAgICAgICAgICAgICAgVXNlIHlvdXIgQVQgUHJvdG9jb2wgaGFuZGxlIG9yIERJRAogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICB7ZXJyb3IgJiYgKAogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctcmVkLTUwIGJvcmRlciBib3JkZXItcmVkLTIwMCB0ZXh0LXJlZC03MDAgcHgtNCBweS0zIHJvdW5kZWQiPgogICAgICAgICAgICAgIHtlcnJvciA9PT0gIk9BdXRoIGluaXRpYWxpemF0aW9uIGZhaWxlZCIgJiYgIkZhaWxlZCB0byBzdGFydCBhdXRoZW50aWNhdGlvbiJ9CiAgICAgICAgICAgICAge2Vycm9yID09PSAiSW52YWxpZCBPQXV0aCBjYWxsYmFjayIgJiYgIkF1dGhlbnRpY2F0aW9uIGNhbGxiYWNrIGZhaWxlZCJ9CiAgICAgICAgICAgICAge2Vycm9yID09PSAiQXV0aGVudGljYXRpb24gZmFpbGVkIiAmJiAiQXV0aGVudGljYXRpb24gZmFpbGVkIn0KICAgICAgICAgICAgICB7ZXJyb3IgPT09ICJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24iICYmICJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24ifQogICAgICAgICAgICAgIHshWyJPQXV0aCBpbml0aWFsaXphdGlvbiBmYWlsZWQiLCAiSW52YWxpZCBPQXV0aCBjYWxsYmFjayIsICJBdXRoZW50aWNhdGlvbiBmYWlsZWQiLCAiRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uIl0uaW5jbHVkZXMoZXJyb3IpICYmIGVycm9yfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICl9CgogICAgICAgICAgPGZvcm0gY2xhc3NOYW1lPSJtdC04IHNwYWNlLXktNiIgYWN0aW9uPSIvb2F1dGgvYXV0aG9yaXplIiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPSJsb2dpbkhpbnQiIGNsYXNzTmFtZT0iYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIj4KICAgICAgICAgICAgICAgIEhhbmRsZSBvciBESUQKICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgIDxJbnB1dAogICAgICAgICAgICAgICAgaWQ9ImxvZ2luSGludCIKICAgICAgICAgICAgICAgIG5hbWU9ImxvZ2luSGludCIKICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgICAgICByZXF1aXJlZAogICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9ImFsaWNlLmJza3kuc29jaWFsIG9yIGRpZDpwbGM6Li4uIgogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIgogICAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzTmFtZT0idy1mdWxsIj4KICAgICAgICAgICAgICBTaWduIGluCiAgICAgICAgICAgIDwvQnV0dG9uPgogICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvTGF5b3V0PgogICk7Cn0=" 37 45 }, 38 46 { 47 + "template": "deno-ssr", 39 48 "path": "src/features/auth/handlers.tsx", 40 49 "content": "aW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gIkBzdGQvaHR0cC91bnN0YWJsZS1yb3V0ZSI7CmltcG9ydCB7IHdpdGhBdXRoIH0gZnJvbSAiLi4vLi4vcm91dGVzL21pZGRsZXdhcmUudHMiOwppbXBvcnQgeyBPQXV0aENsaWVudCB9IGZyb20gIkBzbGljZXMvb2F1dGgiOwppbXBvcnQgewogIGNyZWF0ZU9BdXRoQ2xpZW50LAogIGNyZWF0ZVNlc3Npb25DbGllbnQsCiAgb2F1dGhDb25maWcsCiAgb2F1dGhTdG9yYWdlLAogIG9hdXRoU2Vzc2lvbnMsCiAgc2Vzc2lvblN0b3JlLAp9IGZyb20gIi4uLy4uL2NvbmZpZy50cyI7CmltcG9ydCB7IHJlbmRlckhUTUwgfSBmcm9tICIuLi8uLi91dGlscy9yZW5kZXIudHN4IjsKaW1wb3J0IHsgTG9naW5QYWdlIH0gZnJvbSAiLi90ZW1wbGF0ZXMvTG9naW5QYWdlLnRzeCI7Cgphc3luYyBmdW5jdGlvbiBoYW5kbGVMb2dpblBhZ2UocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4gewogIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB3aXRoQXV0aChyZXEpOwogIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCk7CgogIC8vIFJlZGlyZWN0IGlmIGFscmVhZHkgbG9nZ2VkIGluCiAgaWYgKGNvbnRleHQuY3VycmVudFVzZXIpIHsKICAgIHJldHVybiBSZXNwb25zZS5yZWRpcmVjdChuZXcgVVJMKCIvZGFzaGJvYXJkIiwgcmVxLnVybCksIDMwMik7CiAgfQoKICBjb25zdCBlcnJvciA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpOwogIHJldHVybiByZW5kZXJIVE1MKDxMb2dpblBhZ2UgZXJyb3I9e2Vycm9yIHx8IHVuZGVmaW5lZH0gLz4pOwp9Cgphc3luYyBmdW5jdGlvbiBoYW5kbGVPQXV0aEF1dGhvcml6ZShyZXE6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiB7CiAgdHJ5IHsKICAgIGNvbnN0IGZvcm1EYXRhID0gYXdhaXQgcmVxLmZvcm1EYXRhKCk7CiAgICBjb25zdCBsb2dpbkhpbnQgPSBmb3JtRGF0YS5nZXQoImxvZ2luSGludCIpIGFzIHN0cmluZzsKCiAgICBpZiAoIWxvZ2luSGludCkgewogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCJNaXNzaW5nIGxvZ2luIGhpbnQiLCB7IHN0YXR1czogNDAwIH0pOwogICAgfQoKICAgIGNvbnN0IHRlbXBPQXV0aENsaWVudCA9IG5ldyBPQXV0aENsaWVudCgKICAgICAgb2F1dGhDb25maWcsCiAgICAgIG9hdXRoU3RvcmFnZSwKICAgICAgbG9naW5IaW50CiAgICApOwogICAgY29uc3QgYXV0aFJlc3VsdCA9IGF3YWl0IHRlbXBPQXV0aENsaWVudC5hdXRob3JpemUoewogICAgICBsb2dpbkhpbnQsCiAgICB9KTsKCiAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QoYXV0aFJlc3VsdC5hdXRob3JpemF0aW9uVXJsLCAzMDIpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJPQXV0aCBhdXRob3JpemUgZXJyb3I6IiwgZXJyb3IpOwoKICAgIHJldHVybiBSZXNwb25zZS5yZWRpcmVjdCgKICAgICAgbmV3IFVSTCgKICAgICAgICAiL2xvZ2luP2Vycm9yPSIgKwogICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KCJQbGVhc2UgY2hlY2sgeW91ciBoYW5kbGUgYW5kIHRyeSBhZ2Fpbi4iKSwKICAgICAgICByZXEudXJsCiAgICAgICksCiAgICAgIDMwMgogICAgKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGhhbmRsZU9BdXRoQ2FsbGJhY2socmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4gewogIHRyeSB7CiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpOwogICAgY29uc3QgY29kZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCJjb2RlIik7CiAgICBjb25zdCBzdGF0ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpOwoKICAgIGlmICghY29kZSB8fCAhc3RhdGUpIHsKICAgICAgcmV0dXJuIFJlc3BvbnNlLnJlZGlyZWN0KAogICAgICAgIG5ldyBVUkwoCiAgICAgICAgICAiL2xvZ2luP2Vycm9yPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIkludmFsaWQgT0F1dGggY2FsbGJhY2siKSwKICAgICAgICAgIHJlcS51cmwKICAgICAgICApLAogICAgICAgIDMwMgogICAgICApOwogICAgfQoKICAgIGNvbnN0IHRlbXBPQXV0aENsaWVudCA9IG5ldyBPQXV0aENsaWVudChvYXV0aENvbmZpZywgb2F1dGhTdG9yYWdlLCAidGVtcCIpOwogICAgY29uc3QgdG9rZW5zID0gYXdhaXQgdGVtcE9BdXRoQ2xpZW50LmhhbmRsZUNhbGxiYWNrKHsgY29kZSwgc3RhdGUgfSk7CiAgICBjb25zdCBzZXNzaW9uSWQgPSBhd2FpdCBvYXV0aFNlc3Npb25zLmNyZWF0ZU9BdXRoU2Vzc2lvbih0b2tlbnMpOwoKICAgIGlmICghc2Vzc2lvbklkKSB7CiAgICAgIHJldHVybiBSZXNwb25zZS5yZWRpcmVjdCgKICAgICAgICBuZXcgVVJMKAogICAgICAgICAgIi9sb2dpbj9lcnJvcj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24iKSwKICAgICAgICAgIHJlcS51cmwKICAgICAgICApLAogICAgICAgIDMwMgogICAgICApOwogICAgfQoKICAgIGNvbnN0IHNlc3Npb25Db29raWUgPSBzZXNzaW9uU3RvcmUuY3JlYXRlU2Vzc2lvbkNvb2tpZShzZXNzaW9uSWQpOwoKICAgIGxldCB1c2VySW5mbzsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHNlc3Npb25PQXV0aENsaWVudCA9IGNyZWF0ZU9BdXRoQ2xpZW50KHNlc3Npb25JZCk7CiAgICAgIHVzZXJJbmZvID0gYXdhaXQgc2Vzc2lvbk9BdXRoQ2xpZW50LmdldFVzZXJJbmZvKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gZ2V0IHVzZXIgaW5mbzoiLCBlcnJvcik7CiAgICB9CgogICAgaWYgKHVzZXJJbmZvPy5zdWIpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB1c2VyQ2xpZW50ID0gY3JlYXRlU2Vzc2lvbkNsaWVudChzZXNzaW9uSWQpOwogICAgICAgIGF3YWl0IHVzZXJDbGllbnQuc3luY1VzZXJDb2xsZWN0aW9ucygpOwogICAgICAgIGNvbnNvbGUubG9nKCJTeW5jZWQgQmx1ZXNreSBwcm9maWxlIGZvciIsIHVzZXJJbmZvLnN1Yik7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiRXJyb3Igc3luY2luZyBCbHVlc2t5IHByb2ZpbGU6IiwgZXJyb3IpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7CiAgICAgIHN0YXR1czogMzAyLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgTG9jYXRpb246IG5ldyBVUkwoIi9kYXNoYm9hcmQiLCByZXEudXJsKS50b1N0cmluZygpLAogICAgICAgICJTZXQtQ29va2llIjogc2Vzc2lvbkNvb2tpZSwKICAgICAgfSwKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCJPQXV0aCBjYWxsYmFjayBlcnJvcjoiLCBlcnJvcik7CiAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QoCiAgICAgIG5ldyBVUkwoCiAgICAgICAgIi9sb2dpbj9lcnJvcj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCJBdXRoZW50aWNhdGlvbiBmYWlsZWQiKSwKICAgICAgICByZXEudXJsCiAgICAgICksCiAgICAgIDMwMgogICAgKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxvZ291dChyZXE6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiB7CiAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHNlc3Npb25TdG9yZS5nZXRTZXNzaW9uRnJvbVJlcXVlc3QocmVxKTsKCiAgaWYgKHNlc3Npb24pIHsKICAgIGF3YWl0IG9hdXRoU2Vzc2lvbnMubG9nb3V0KHNlc3Npb24uc2Vzc2lvbklkKTsKICB9CgogIGNvbnN0IGNsZWFyQ29va2llID0gc2Vzc2lvblN0b3JlLmNyZWF0ZUxvZ291dENvb2tpZSgpOwoKICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHsKICAgIHN0YXR1czogMzAyLAogICAgaGVhZGVyczogewogICAgICBMb2NhdGlvbjogbmV3IFVSTCgiL2xvZ2luIiwgcmVxLnVybCkudG9TdHJpbmcoKSwKICAgICAgIlNldC1Db29raWUiOiBjbGVhckNvb2tpZSwKICAgIH0sCiAgfSk7Cn0KCmV4cG9ydCBjb25zdCBhdXRoUm91dGVzOiBSb3V0ZVtdID0gWwogIHsKICAgIG1ldGhvZDogIkdFVCIsCiAgICBwYXR0ZXJuOiBuZXcgVVJMUGF0dGVybih7IHBhdGhuYW1lOiAiL2xvZ2luIiB9KSwKICAgIGhhbmRsZXI6IGhhbmRsZUxvZ2luUGFnZSwKICB9LAogIHsKICAgIG1ldGhvZDogIlBPU1QiLAogICAgcGF0dGVybjogbmV3IFVSTFBhdHRlcm4oeyBwYXRobmFtZTogIi9vYXV0aC9hdXRob3JpemUiIH0pLAogICAgaGFuZGxlcjogaGFuZGxlT0F1dGhBdXRob3JpemUsCiAgfSwKICB7CiAgICBtZXRob2Q6ICJHRVQiLAogICAgcGF0dGVybjogbmV3IFVSTFBhdHRlcm4oeyBwYXRobmFtZTogIi9vYXV0aC9jYWxsYmFjayIgfSksCiAgICBoYW5kbGVyOiBoYW5kbGVPQXV0aENhbGxiYWNrLAogIH0sCiAgewogICAgbWV0aG9kOiAiUE9TVCIsCiAgICBwYXR0ZXJuOiBuZXcgVVJMUGF0dGVybih7IHBhdGhuYW1lOiAiL2xvZ291dCIgfSksCiAgICBoYW5kbGVyOiBoYW5kbGVMb2dvdXQsCiAgfSwKXTsK" 41 50 }, 42 51 { 52 + "template": "deno-ssr", 43 53 "path": "src/features/dashboard/templates/DashboardPage.tsx", 44 54 "content": "aW1wb3J0IHsgTGF5b3V0IH0gZnJvbSAiLi4vLi4vLi4vc2hhcmVkL2ZyYWdtZW50cy9MYXlvdXQudHN4IjsKaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAiLi4vLi4vLi4vc2hhcmVkL2ZyYWdtZW50cy9CdXR0b24udHN4IjsKaW1wb3J0IHR5cGUgeyBBcHBCc2t5QWN0b3JQcm9maWxlIH0gZnJvbSAiLi4vLi4vLi4vZ2VuZXJhdGVkX2NsaWVudC50cyI7CgppbnRlcmZhY2UgRGFzaGJvYXJkUGFnZVByb3BzIHsKICBjdXJyZW50VXNlcjogewogICAgbmFtZT86IHN0cmluZzsKICAgIHN1Yjogc3RyaW5nOwogIH07CiAgcHJvZmlsZT86IEFwcEJza3lBY3RvclByb2ZpbGU7CiAgYXZhdGFyVXJsPzogc3RyaW5nOwp9CgpleHBvcnQgZnVuY3Rpb24gRGFzaGJvYXJkUGFnZSh7CiAgY3VycmVudFVzZXIsCiAgcHJvZmlsZSwKICBhdmF0YXJVcmwsCn06IERhc2hib2FyZFBhZ2VQcm9wcykgewogIHJldHVybiAoCiAgICA8TGF5b3V0IHRpdGxlPSJEYXNoYm9hcmQiPgogICAgICA8ZGl2IGNsYXNzTmFtZT0ibWluLWgtc2NyZWVuIGJnLWdyYXktNTAgcC04Ij4KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibWF4LXctMnhsIG14LWF1dG8iPgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLXdoaXRlIHJvdW5kZWQtbGcgc2hhZG93IHAtNiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgbWItNiI+CiAgICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT0idGV4dC0yeGwgZm9udC1ib2xkIj5EYXNoYm9hcmQ8L2gxPgogICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIvbG9nb3V0Ij4KICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT0ic3VibWl0IiB2YXJpYW50PSJzZWNvbmRhcnkiPgogICAgICAgICAgICAgICAgICBMb2dvdXQKICAgICAgICAgICAgICAgIDwvQnV0dG9uPgogICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibWItNiI+CiAgICAgICAgICAgICAge2F2YXRhclVybCAmJiAoCiAgICAgICAgICAgICAgICA8aW1nCiAgICAgICAgICAgICAgICAgIHNyYz17YXZhdGFyVXJsfQogICAgICAgICAgICAgICAgICBhbHQ9IlByb2ZpbGUiCiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy0yMCBoLTIwIHJvdW5kZWQtZnVsbCBtYi00IgogICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICApfQogICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9InRleHQteGwgZm9udC1zZW1pYm9sZCBtYi0yIj4KICAgICAgICAgICAgICAgIHtwcm9maWxlPy5kaXNwbGF5TmFtZSB8fCBjdXJyZW50VXNlci5uYW1lIHx8IGN1cnJlbnRVc2VyLnN1Yn0KICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICAgIHtjdXJyZW50VXNlci5uYW1lICYmICgKICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1ncmF5LTYwMCBtYi0yIj5Ae2N1cnJlbnRVc2VyLm5hbWV9PC9wPgogICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAge3Byb2ZpbGU/LmRlc2NyaXB0aW9uICYmICgKICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1ncmF5LTcwMCBtdC0yIj57cHJvZmlsZS5kZXNjcmlwdGlvbn08L3A+CiAgICAgICAgICAgICAgKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L0xheW91dD4KICApOwp9Cg==" 45 55 }, 46 56 { 57 + "template": "deno-ssr", 47 58 "path": "src/features/dashboard/handlers.tsx", 48 59 "content": "aW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gIkBzdGQvaHR0cC91bnN0YWJsZS1yb3V0ZSI7CmltcG9ydCB7IHdpdGhBdXRoIH0gZnJvbSAiLi4vLi4vcm91dGVzL21pZGRsZXdhcmUudHMiOwppbXBvcnQgeyByZW5kZXJIVE1MIH0gZnJvbSAiLi4vLi4vdXRpbHMvcmVuZGVyLnRzeCI7CmltcG9ydCB7IERhc2hib2FyZFBhZ2UgfSBmcm9tICIuL3RlbXBsYXRlcy9EYXNoYm9hcmRQYWdlLnRzeCI7CmltcG9ydCB7IHB1YmxpY0NsaWVudCB9IGZyb20gIi4uLy4uL2NvbmZpZy50cyI7CmltcG9ydCB7IHJlY29yZEJsb2JUb0NkblVybCB9IGZyb20gIkBzbGljZXMvY2xpZW50IjsKaW1wb3J0IHsgQXBwQnNreUFjdG9yUHJvZmlsZSB9IGZyb20gIi4uLy4uL2dlbmVyYXRlZF9jbGllbnQudHMiOwoKYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGFzaGJvYXJkKHJlcTogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+IHsKICBjb25zdCBjb250ZXh0ID0gYXdhaXQgd2l0aEF1dGgocmVxKTsKCiAgaWYgKCFjb250ZXh0LmN1cnJlbnRVc2VyKSB7CiAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QobmV3IFVSTCgiL2xvZ2luIiwgcmVxLnVybCksIDMwMik7CiAgfQoKICBsZXQgcHJvZmlsZTogQXBwQnNreUFjdG9yUHJvZmlsZSB8IHVuZGVmaW5lZDsKICBsZXQgYXZhdGFyVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7CiAgdHJ5IHsKICAgIGNvbnN0IHByb2ZpbGVSZXN1bHQgPSBhd2FpdCBwdWJsaWNDbGllbnQuYXBwLmJza3kuYWN0b3IucHJvZmlsZS5nZXRSZWNvcmQoewogICAgICB1cmk6IGBhdDovLyR7Y29udGV4dC5jdXJyZW50VXNlci5zdWJ9L2FwcC5ic2t5LmFjdG9yLnByb2ZpbGUvc2VsZmAsCiAgICB9KTsKCiAgICBpZiAocHJvZmlsZVJlc3VsdCkgewogICAgICBwcm9maWxlID0gcHJvZmlsZVJlc3VsdC52YWx1ZTsKCiAgICAgIGlmIChwcm9maWxlLmF2YXRhcikgewogICAgICAgIGF2YXRhclVybCA9IHJlY29yZEJsb2JUb0NkblVybChwcm9maWxlUmVzdWx0LCBwcm9maWxlLmF2YXRhciwgImF2YXRhciIpOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnNvbGUuZXJyb3IoIkVycm9yIGZldGNoaW5nIHByb2ZpbGU6IiwgZXJyb3IpOwogIH0KCiAgcmV0dXJuIHJlbmRlckhUTUwoCiAgICA8RGFzaGJvYXJkUGFnZQogICAgICBjdXJyZW50VXNlcj17Y29udGV4dC5jdXJyZW50VXNlcn0KICAgICAgcHJvZmlsZT17cHJvZmlsZX0KICAgICAgYXZhdGFyVXJsPXthdmF0YXJVcmx9CiAgICAvPgogICk7Cn0KCmV4cG9ydCBjb25zdCBkYXNoYm9hcmRSb3V0ZXM6IFJvdXRlW10gPSBbCiAgewogICAgbWV0aG9kOiAiR0VUIiwKICAgIHBhdHRlcm46IG5ldyBVUkxQYXR0ZXJuKHsgcGF0aG5hbWU6ICIvZGFzaGJvYXJkIiB9KSwKICAgIGhhbmRsZXI6IGhhbmRsZURhc2hib2FyZCwKICB9LApdOwo=" 49 60 }, 50 61 { 62 + "template": "deno-ssr", 51 63 "path": "src/utils/cn.ts", 52 64 "content": "aW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAiY2xzeCI7CmltcG9ydCB7IHR3TWVyZ2UgfSBmcm9tICJ0YWlsd2luZC1tZXJnZSI7CgpleHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pOiBzdHJpbmcgewogIHJldHVybiB0d01lcmdlKGNsc3goaW5wdXRzKSk7Cn0=" 53 65 }, 54 66 { 67 + "template": "deno-ssr", 55 68 "path": "src/utils/logging.ts", 56 69 "content": "aW1wb3J0IHsgY3lhbiwgZ3JlZW4sIHJlZCwgeWVsbG93LCBib2xkLCBkaW0gfSBmcm9tICJAc3RkL2ZtdC9jb2xvcnMiOwoKZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dpbmdIYW5kbGVyKAogIGhhbmRsZXI6IChyZXE6IFJlcXVlc3QpID0+IFJlc3BvbnNlIHwgUHJvbWlzZTxSZXNwb25zZT4KKSB7CiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7CiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7CiAgICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kOwogICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKTsKCiAgICB0cnkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShoYW5kbGVyKHJlcSkpOwogICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydDsKCiAgICAgIGNvbnN0IG1ldGhvZENvbG9yID0gY3lhbihib2xkKG1ldGhvZCkpOwogICAgICBjb25zdCBzdGF0dXNDb2xvciA9CiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDAKICAgICAgICAgID8gZ3JlZW4oU3RyaW5nKHJlc3BvbnNlLnN0YXR1cykpCiAgICAgICAgICA6IHJlc3BvbnNlLnN0YXR1cyA+PSAzMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgNDAwCiAgICAgICAgICA/IHllbGxvdyhTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKSkKICAgICAgICAgIDogcmVzcG9uc2Uuc3RhdHVzID49IDQwMAogICAgICAgICAgPyByZWQoU3RyaW5nKHJlc3BvbnNlLnN0YXR1cykpCiAgICAgICAgICA6IFN0cmluZyhyZXNwb25zZS5zdGF0dXMpOwogICAgICBjb25zdCBkdXJhdGlvblRleHQgPSBkaW0oYCgke2R1cmF0aW9ufW1zKWApOwoKICAgICAgY29uc29sZS5sb2coCiAgICAgICAgYCR7bWV0aG9kQ29sb3J9ICR7dXJsLnBhdGhuYW1lfSAtICR7c3RhdHVzQ29sb3J9ICR7ZHVyYXRpb25UZXh0fWAKICAgICAgKTsKICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7CiAgICAgIGNvbnN0IG1ldGhvZENvbG9yID0gY3lhbihib2xkKG1ldGhvZCkpOwogICAgICBjb25zdCBlcnJvclRleHQgPSByZWQoYm9sZCgiRVJST1IiKSk7CiAgICAgIGNvbnN0IGR1cmF0aW9uVGV4dCA9IGRpbShgKCR7ZHVyYXRpb259bXMpYCk7CgogICAgICBjb25zb2xlLmVycm9yKAogICAgICAgIGAke21ldGhvZENvbG9yfSAke3VybC5wYXRobmFtZX0gLSAke2Vycm9yVGV4dH0gJHtkdXJhdGlvblRleHR9OmAsCiAgICAgICAgZXJyb3IKICAgICAgKTsKICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CiAgfTsKfQo=" 57 70 }, 58 71 { 72 + "template": "deno-ssr", 59 73 "path": "src/utils/render.tsx", 60 74 "content": "aW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICJwcmVhY3QtcmVuZGVyLXRvLXN0cmluZyI7CmltcG9ydCB7IFZOb2RlIH0gZnJvbSAicHJlYWN0IjsKCmV4cG9ydCBmdW5jdGlvbiByZW5kZXJIVE1MKGVsZW1lbnQ6IFZOb2RlKTogUmVzcG9uc2UgewogIGNvbnN0IGh0bWwgPSByZW5kZXJUb1N0cmluZyhlbGVtZW50KTsKCiAgcmV0dXJuIG5ldyBSZXNwb25zZShodG1sLCB7CiAgICBoZWFkZXJzOiB7CiAgICAgICJDb250ZW50LVR5cGUiOiAidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiwKICAgIH0sCiAgfSk7Cn0=" 61 75 }, 62 76 { 77 + "template": "deno-ssr", 63 78 "path": "src/shared/fragments/Layout.tsx", 64 79 "content": "aW1wb3J0IHsgQ29tcG9uZW50Q2hpbGRyZW4gfSBmcm9tICJwcmVhY3QiOwoKaW50ZXJmYWNlIExheW91dFByb3BzIHsKICB0aXRsZT86IHN0cmluZzsKICBjaGlsZHJlbjogQ29tcG9uZW50Q2hpbGRyZW47Cn0KCmV4cG9ydCBmdW5jdGlvbiBMYXlvdXQoeyB0aXRsZSA9ICJBcHAiLCBjaGlsZHJlbiB9OiBMYXlvdXRQcm9wcykgewogIHJldHVybiAoCiAgICA8aHRtbCBsYW5nPSJlbiI+CiAgICAgIDxoZWFkPgogICAgICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgICAgIDx0aXRsZT57dGl0bGV9PC90aXRsZT4KICAgICAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4udGFpbHdpbmRjc3MuY29tIj48L3NjcmlwdD4KICAgICAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly91bnBrZy5jb20vaHRteC5vcmdAMS45LjEwIj48L3NjcmlwdD4KICAgICAgPC9oZWFkPgogICAgICA8Ym9keT4KICAgICAgICB7Y2hpbGRyZW59CiAgICAgIDwvYm9keT4KICAgIDwvaHRtbD4KICApOwp9" 65 80 }, 66 81 { 82 + "template": "deno-ssr", 67 83 "path": "src/shared/fragments/Button.tsx", 68 84 "content": "aW1wb3J0IHsgQ29tcG9uZW50Q2hpbGRyZW4sIEpTWCB9IGZyb20gInByZWFjdCI7CmltcG9ydCB7IGNuIH0gZnJvbSAiLi4vLi4vdXRpbHMvY24udHMiOwoKaW50ZXJmYWNlIEJ1dHRvblByb3BzIGV4dGVuZHMgT21pdDxKU1guSW50cmluc2ljRWxlbWVudHNbJ2J1dHRvbiddLCAic2l6ZSI+IHsKICBjaGlsZHJlbjogQ29tcG9uZW50Q2hpbGRyZW47CiAgdmFyaWFudD86ICJwcmltYXJ5IiB8ICJzZWNvbmRhcnkiIHwgImRhbmdlciI7CiAgc2l6ZT86ICJzbSIgfCAibWQiIHwgImxnIjsKfQoKZXhwb3J0IGZ1bmN0aW9uIEJ1dHRvbih7CiAgY2hpbGRyZW4sCiAgdHlwZSA9ICJidXR0b24iLAogIHZhcmlhbnQgPSAicHJpbWFyeSIsCiAgc2l6ZSA9ICJtZCIsCiAgY2xhc3NOYW1lLAogIGRpc2FibGVkLAogIC4uLnByb3BzCn06IEJ1dHRvblByb3BzKSB7CiAgY29uc3QgYmFzZUNsYXNzZXMgPQogICAgImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBmb250LW1lZGl1bSByb3VuZGVkLW1kIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpvcGFjaXR5LTUwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCI7CgogIGNvbnN0IHZhcmlhbnRDbGFzc2VzID0gewogICAgcHJpbWFyeTogImJnLWJsdWUtNjAwIGhvdmVyOmJnLWJsdWUtNzAwIHRleHQtd2hpdGUgZm9jdXM6cmluZy1ibHVlLTUwMCIsCiAgICBzZWNvbmRhcnk6CiAgICAgICJiZy1ncmF5LTIwMCBob3ZlcjpiZy1ncmF5LTMwMCB0ZXh0LWdyYXktOTAwIGZvY3VzOnJpbmctZ3JheS01MDAiLAogICAgZGFuZ2VyOiAiYmctcmVkLTYwMCBob3ZlcjpiZy1yZWQtNzAwIHRleHQtd2hpdGUgZm9jdXM6cmluZy1yZWQtNTAwIiwKICB9OwoKICBjb25zdCBzaXplQ2xhc3NlcyA9IHsKICAgIHNtOiAicHgtMyBweS0xLjUgdGV4dC1zbSIsCiAgICBtZDogInB4LTQgcHktMiB0ZXh0LXNtIiwKICAgIGxnOiAicHgtNiBweS0zIHRleHQtYmFzZSIsCiAgfTsKCiAgcmV0dXJuICgKICAgIDxidXR0b24KICAgICAgdHlwZT17dHlwZX0KICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfQogICAgICBjbGFzc05hbWU9e2NuKAogICAgICAgIGJhc2VDbGFzc2VzLAogICAgICAgIHZhcmlhbnRDbGFzc2VzW3ZhcmlhbnRdLAogICAgICAgIHNpemVDbGFzc2VzW3NpemVdLAogICAgICAgIGNsYXNzTmFtZQogICAgICApfQogICAgICB7Li4ucHJvcHN9CiAgICA+CiAgICAgIHtjaGlsZHJlbn0KICAgIDwvYnV0dG9uPgogICk7Cn0K" 69 85 }, 70 86 { 87 + "template": "deno-ssr", 71 88 "path": "src/shared/fragments/Input.tsx", 72 89 "content": "aW1wb3J0IHsgSlNYIH0gZnJvbSAicHJlYWN0IjsKaW1wb3J0IHsgY24gfSBmcm9tICIuLi8uLi91dGlscy9jbi50cyI7Cgp0eXBlIElucHV0UHJvcHMgPSBKU1guSW50cmluc2ljRWxlbWVudHNbJ2lucHV0J107CgpleHBvcnQgZnVuY3Rpb24gSW5wdXQoewogIHR5cGUgPSAidGV4dCIsCiAgY2xhc3NOYW1lLAogIC4uLnByb3BzCn06IElucHV0UHJvcHMpIHsKICByZXR1cm4gKAogICAgPGlucHV0CiAgICAgIHR5cGU9e3R5cGV9CiAgICAgIGNsYXNzTmFtZT17Y24oCiAgICAgICAgImJsb2NrIHctZnVsbCBweC0zIHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHNoYWRvdy1zbSIsCiAgICAgICAgImZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLWJsdWUtNTAwIGZvY3VzOmJvcmRlci1ibHVlLTUwMCIsCiAgICAgICAgImRpc2FibGVkOmJnLWdyYXktNTAgZGlzYWJsZWQ6dGV4dC1ncmF5LTUwMCIsCiAgICAgICAgY2xhc3NOYW1lCiAgICAgICl9CiAgICAgIHsuLi5wcm9wc30KICAgIC8+CiAgKTsKfQ==" 73 90 }, 74 91 { 92 + "template": "deno-ssr", 75 93 "path": "src/config.ts", 76 94 "content": "aW1wb3J0IHsgT0F1dGhDbGllbnQsIFNRTGl0ZU9BdXRoU3RvcmFnZSB9IGZyb20gIkBzbGljZXMvb2F1dGgiOwppbXBvcnQgeyBTZXNzaW9uU3RvcmUsIFNRTGl0ZUFkYXB0ZXIsIHdpdGhPQXV0aFNlc3Npb24gfSBmcm9tICJAc2xpY2VzL3Nlc3Npb24iOwppbXBvcnQgeyBBdFByb3RvQ2xpZW50IH0gZnJvbSAiLi9nZW5lcmF0ZWRfY2xpZW50LnRzIjsKCmNvbnN0IE9BVVRIX0NMSUVOVF9JRCA9IERlbm8uZW52LmdldCgiT0FVVEhfQ0xJRU5UX0lEIik7CmNvbnN0IE9BVVRIX0NMSUVOVF9TRUNSRVQgPSBEZW5vLmVudi5nZXQoIk9BVVRIX0NMSUVOVF9TRUNSRVQiKTsKY29uc3QgT0FVVEhfUkVESVJFQ1RfVVJJID0gRGVuby5lbnYuZ2V0KCJPQVVUSF9SRURJUkVDVF9VUkkiKTsKY29uc3QgT0FVVEhfQUlQX0JBU0VfVVJMID0gRGVuby5lbnYuZ2V0KCJPQVVUSF9BSVBfQkFTRV9VUkwiKTsKY29uc3QgQVBJX1VSTCA9IERlbm8uZW52LmdldCgiQVBJX1VSTCIpOwpleHBvcnQgY29uc3QgU0xJQ0VfVVJJID0gRGVuby5lbnYuZ2V0KCJTTElDRV9VUkkiKTsKCmlmICgKICAhT0FVVEhfQ0xJRU5UX0lEIHx8CiAgIU9BVVRIX0NMSUVOVF9TRUNSRVQgfHwKICAhT0FVVEhfUkVESVJFQ1RfVVJJIHx8CiAgIU9BVVRIX0FJUF9CQVNFX1VSTCB8fAogICFBUElfVVJMIHx8CiAgIVNMSUNFX1VSSQopIHsKICB0aHJvdyBuZXcgRXJyb3IoCiAgICAiTWlzc2luZyBPQXV0aCBjb25maWd1cmF0aW9uLiBQbGVhc2UgZW5zdXJlIC5lbnYgZmlsZSBjb250YWluczpcbiIgKwogICAgICAiT0FVVEhfQ0xJRU5UX0lELCBPQVVUSF9DTElFTlRfU0VDUkVULCBPQVVUSF9SRURJUkVDVF9VUkksIE9BVVRIX0FJUF9CQVNFX1VSTCwgQVBJX1VSTCwgU0xJQ0VfVVJJIgogICk7Cn0KCmNvbnN0IERBVEFCQVNFX1VSTCA9IERlbm8uZW52LmdldCgiREFUQUJBU0VfVVJMIikgfHwgInNsaWNlcy5kYiI7CgovLyBPQXV0aCBzZXR1cApjb25zdCBvYXV0aFN0b3JhZ2UgPSBuZXcgU1FMaXRlT0F1dGhTdG9yYWdlKERBVEFCQVNFX1VSTCk7CmNvbnN0IG9hdXRoQ29uZmlnID0gewogIGNsaWVudElkOiBPQVVUSF9DTElFTlRfSUQsCiAgY2xpZW50U2VjcmV0OiBPQVVUSF9DTElFTlRfU0VDUkVULAogIGF1dGhCYXNlVXJsOiBPQVVUSF9BSVBfQkFTRV9VUkwsCiAgcmVkaXJlY3RVcmk6IE9BVVRIX1JFRElSRUNUX1VSSSwKICBzY29wZXM6IFsiYXRwcm90byIsICJvcGVuaWQiLCAicHJvZmlsZSIsICJ0cmFuc2l0aW9uOmdlbmVyaWMiXSwKfTsKCi8vIEV4cG9ydCBjb25maWcgYW5kIHN0b3JhZ2UgZm9yIGNyZWF0aW5nIHVzZXItc2NvcGVkIGNsaWVudHMKZXhwb3J0IHsgb2F1dGhDb25maWcsIG9hdXRoU3RvcmFnZSB9OwoKLy8gU2Vzc2lvbiBzZXR1cCAoc2hhcmVkIGRhdGFiYXNlKQpleHBvcnQgY29uc3Qgc2Vzc2lvblN0b3JlID0gbmV3IFNlc3Npb25TdG9yZSh7CiAgYWRhcHRlcjogbmV3IFNRTGl0ZUFkYXB0ZXIoREFUQUJBU0VfVVJMKSwKICBjb29raWVOYW1lOiAie3tQUk9KRUNUX05BTUV9fS1zZXNzaW9uIiwKICBjb29raWVPcHRpb25zOiB7CiAgICBodHRwT25seTogdHJ1ZSwKICAgIHNlY3VyZTogRGVuby5lbnYuZ2V0KCJERU5PX0VOViIpID09PSAicHJvZHVjdGlvbiIsCiAgICBzYW1lU2l0ZTogImxheCIsCiAgICBwYXRoOiAiLyIsCiAgfSwKfSk7CgovLyBPQXV0aCArIFNlc3Npb24gaW50ZWdyYXRpb24KZXhwb3J0IGNvbnN0IG9hdXRoU2Vzc2lvbnMgPSB3aXRoT0F1dGhTZXNzaW9uKAogIHNlc3Npb25TdG9yZSwKICBvYXV0aENvbmZpZywKICBvYXV0aFN0b3JhZ2UsCiAgewogICAgYXV0b1JlZnJlc2g6IHRydWUsCiAgfQopOwoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB1c2VyLXNjb3BlZCBPQXV0aCBjbGllbnQKZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9BdXRoQ2xpZW50KHNlc3Npb25JZDogc3RyaW5nKTogT0F1dGhDbGllbnQgewogIHJldHVybiBuZXcgT0F1dGhDbGllbnQob2F1dGhDb25maWcsIG9hdXRoU3RvcmFnZSwgc2Vzc2lvbklkKTsKfQoKLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhdXRoZW50aWNhdGVkIEF0UHJvdG8gY2xpZW50IGZvciBhIHVzZXIKZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlc3Npb25DbGllbnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBBdFByb3RvQ2xpZW50IHsKICBjb25zdCB1c2VyT0F1dGhDbGllbnQgPSBjcmVhdGVPQXV0aENsaWVudChzZXNzaW9uSWQpOwogIHJldHVybiBuZXcgQXRQcm90b0NsaWVudChBUElfVVJMISwgU0xJQ0VfVVJJISwgdXNlck9BdXRoQ2xpZW50KTsKfQoKLy8gUHVibGljIGNsaWVudCBmb3IgdW5hdXRoZW50aWNhdGVkIHJlcXVlc3RzCmV4cG9ydCBjb25zdCBwdWJsaWNDbGllbnQgPSBuZXcgQXRQcm90b0NsaWVudChBUElfVVJMLCBTTElDRV9VUkkpOwo=" 77 95 }, 78 96 { 97 + "template": "deno-ssr", 79 98 "path": "src/routes/middleware.ts", 80 99 "content": "aW1wb3J0IHsgc2Vzc2lvblN0b3JlLCBjcmVhdGVPQXV0aENsaWVudCB9IGZyb20gIi4uL2NvbmZpZy50cyI7CgpleHBvcnQgaW50ZXJmYWNlIEF1dGhDb250ZXh0IHsKICBjdXJyZW50VXNlcjogewogICAgc3ViOiBzdHJpbmc7CiAgICBuYW1lPzogc3RyaW5nOwogICAgZW1haWw/OiBzdHJpbmc7CiAgfSB8IG51bGw7CiAgc2Vzc2lvbklkOiBzdHJpbmcgfCBudWxsOwp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aEF1dGgocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxBdXRoQ29udGV4dD4gewogIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBzZXNzaW9uU3RvcmUuZ2V0U2Vzc2lvbkZyb21SZXF1ZXN0KHJlcSk7CgogIGlmICghc2Vzc2lvbikgewogICAgcmV0dXJuIHsgY3VycmVudFVzZXI6IG51bGwsIHNlc3Npb25JZDogbnVsbCB9OwogIH0KCiAgdHJ5IHsKICAgIGNvbnN0IHNlc3Npb25PQXV0aENsaWVudCA9IGNyZWF0ZU9BdXRoQ2xpZW50KHNlc3Npb24uc2Vzc2lvbklkKTsKICAgIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgc2Vzc2lvbk9BdXRoQ2xpZW50LmdldFVzZXJJbmZvKCk7CiAgICByZXR1cm4gewogICAgICBjdXJyZW50VXNlcjogdXNlckluZm8gfHwgbnVsbCwKICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uLnNlc3Npb25JZCwKICAgIH07CiAgfSBjYXRjaCB7CiAgICByZXR1cm4geyBjdXJyZW50VXNlcjogbnVsbCwgc2Vzc2lvbklkOiBzZXNzaW9uLnNlc3Npb25JZCB9OwogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKAogIGhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIGNvbnRleHQ6IEF1dGhDb250ZXh0KSA9PiBQcm9taXNlPFJlc3BvbnNlPgopIHsKICByZXR1cm4gYXN5bmMgKHJlcTogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+ID0+IHsKICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB3aXRoQXV0aChyZXEpOwoKICAgIGlmICghY29udGV4dC5jdXJyZW50VXNlcikgewogICAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QobmV3IFVSTCgiL2xvZ2luIiwgcmVxLnVybCksIDMwMik7CiAgICB9CgogICAgcmV0dXJuIGhhbmRsZXIocmVxLCBjb250ZXh0KTsKICB9Owp9Cg==" 81 100 }, 82 101 { 102 + "template": "deno-ssr", 83 103 "path": "src/routes/mod.ts", 84 104 "content": "aW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gIkBzdGQvaHR0cC91bnN0YWJsZS1yb3V0ZSI7CmltcG9ydCB7IGF1dGhSb3V0ZXMgfSBmcm9tICIuLi9mZWF0dXJlcy9hdXRoL2hhbmRsZXJzLnRzeCI7CmltcG9ydCB7IGRhc2hib2FyZFJvdXRlcyB9IGZyb20gIi4uL2ZlYXR1cmVzL2Rhc2hib2FyZC9oYW5kbGVycy50c3giOwoKZXhwb3J0IGNvbnN0IGFsbFJvdXRlczogUm91dGVbXSA9IFsKICAvLyBSb290IHJlZGlyZWN0IHRvIGxvZ2luIGZvciBub3cKICB7CiAgICBtZXRob2Q6ICJHRVQiLAogICAgcGF0dGVybjogbmV3IFVSTFBhdHRlcm4oeyBwYXRobmFtZTogIi8iIH0pLAogICAgaGFuZGxlcjogKHJlcSkgPT4gUmVzcG9uc2UucmVkaXJlY3QobmV3IFVSTCgiL2xvZ2luIiwgcmVxLnVybCksIDMwMiksCiAgfSwKCiAgLy8gQXV0aCByb3V0ZXMKICAuLi5hdXRoUm91dGVzLAoKICAvLyBEYXNoYm9hcmQgcm91dGVzCiAgLi4uZGFzaGJvYXJkUm91dGVzLApdOw==" 85 105 } 86 106 ]; 87 107 88 - export function getTemplateContent(path: string): Uint8Array | undefined { 89 - const template = EMBEDDED_TEMPLATES.find(t => t.path === path); 108 + export const AVAILABLE_TEMPLATES = ["deno-ssr"]; 109 + 110 + export function getTemplateContent(templateName: string, path: string): Uint8Array | undefined { 111 + const template = EMBEDDED_TEMPLATES.find(t => t.template === templateName && t.path === path); 90 112 if (!template) return undefined; 91 113 92 114 const binaryString = atob(template.content); ··· 109 131 } 110 132 return result; 111 133 } 134 + 135 + export function getTemplatesForName(templateName: string): Map<string, Uint8Array> { 136 + const result = new Map<string, Uint8Array>(); 137 + for (const template of EMBEDDED_TEMPLATES) { 138 + if (template.template !== templateName) continue; 139 + 140 + const binaryString = atob(template.content); 141 + const bytes = new Uint8Array(binaryString.length); 142 + for (let i = 0; i < binaryString.length; i++) { 143 + bytes[i] = binaryString.charCodeAt(i); 144 + } 145 + result.set(template.path, bytes); 146 + } 147 + return result; 148 + }