@kosmojs/dev 0.1.1 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"chassis.js","names":["defaults","RequestMetadataTargets","RequestBodyTargets","pathResolver","pathExists","render","renderToFile","package_default"],"sources":["../../lib/pkg/index.js","../../../generators/core-generator/pkg/index.js","../package.json","../src/cache.ts","../src/chassis.ts"],"sourcesContent":["import { builtinModules } from \"node:module\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport { Project, SyntaxKind } from \"ts-morph\";\nimport picomatch from \"picomatch\";\nimport { access, constants, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport handlebars from \"handlebars\";\nimport { glob } from \"tinyglobby\";\nimport { parse } from \"path-to-regexp\";\nimport mimeTypes from \"mime-types\";\nimport { Spinner } from \"@topcli/spinner\";\n//#region ../core/pkg/index.js\nvar defaults = {\n\tappPrefix: \"@\",\n\tsrcPrefix: \"~\",\n\tlibPrefix: \"_\",\n\tcoreDir: \"core\",\n\tsrcDir: \"src\",\n\tlibDir: \"lib\",\n\tconfigDir: \"config\",\n\tapiDir: \"api\",\n\tpagesDir: \"pages\",\n\tentryDir: \"entry\",\n\tfetchDir: \"fetch\",\n\trefineTypeName: \"VRefine\"\n};\n/**\n* Request metadata validation targets.\n* */\nvar RequestMetadataTargets = {\n\tquery: \"URL query parameters\",\n\theaders: \"HTTP request headers\",\n\tcookies: \"HTTP cookies\"\n};\n/**\n* Request body validation targets.\n*\n* Body formats are mutually exclusive - only one should be specified per handler.\n*\n* **Development behavior:**\n* - If multiple formats are defined, the builder displays a warning and\n* disables validation schemas for the affected handler.\n* - If an unsuitable target is defined (e.g., `json`, `form`)\n* for a method without a body like GET, HEAD), a warning is displayed and\n* validation schemas are disabled for that handler.\n*\n* This ensures misconfigurations are detected during development\n* for runtime to execute without false positive validation failures.\n*\n* Always define exactly one target that is suitable for current handler.\n* */\nvar RequestBodyTargets = {\n\tjson: \"JSON request body\",\n\tform: \"URL-encoded or Multipart form\",\n\traw: \"Raw body format (string/Buffer/ArrayBuffer/Blob)\"\n};\nvar RequestValidationTargets = {\n\t...RequestMetadataTargets,\n\t...RequestBodyTargets\n};\n//#endregion\n//#region ../core/pkg/api/index.js\nvar HTTPMethods = /* @__PURE__ */ function(HTTPMethods) {\n\tHTTPMethods[\"HEAD\"] = \"HEAD\";\n\tHTTPMethods[\"OPTIONS\"] = \"OPTIONS\";\n\tHTTPMethods[\"GET\"] = \"GET\";\n\tHTTPMethods[\"PUT\"] = \"PUT\";\n\tHTTPMethods[\"PATCH\"] = \"PATCH\";\n\tHTTPMethods[\"POST\"] = \"POST\";\n\tHTTPMethods[\"DELETE\"] = \"DELETE\";\n\treturn HTTPMethods;\n}({});\n//#endregion\n//#region src/ast.ts\nvar astFactory = () => {\n\tconst createProject = (opts) => new Project(opts);\n\tconst resolveRouteSignature = async (route, opts) => {\n\t\tconst { sourceFile = createProject().addSourceFileAtPath(route.fileFullpath) } = { ...opts };\n\t\tconst [typeDeclarations, referencedFiles] = extractTypeDeclarations(sourceFile, opts);\n\t\tconst defaultExport = extractDefaultExport(sourceFile);\n\t\tconst paramsRefinements = defaultExport ? extractParamsRefinements(defaultExport) : void 0;\n\t\tconst methods = defaultExport ? extractRouteMethods(route, defaultExport) : [];\n\t\treturn {\n\t\t\ttypeDeclarations,\n\t\t\tparamsRefinements,\n\t\t\tmethods: methods.map((e) => e.method),\n\t\t\tvalidationDefinitions: methods.flatMap((e) => e.validationDefinitions),\n\t\t\treferencedFiles\n\t\t};\n\t};\n\tconst extractDefaultExport = (sourceFile) => {\n\t\tconst [defaultExport] = sourceFile.getExportAssignments().flatMap((exportAssignment) => {\n\t\t\tif (exportAssignment.isExportEquals()) return [];\n\t\t\tconst callExpression = exportAssignment.getExpression();\n\t\t\treturn callExpression.isKind(SyntaxKind.CallExpression) ? [callExpression] : [];\n\t\t});\n\t\treturn defaultExport;\n\t};\n\tconst extractParamsRefinements = (callExpression) => {\n\t\tconst [_routeName, paramsGeneric] = extractGenerics(callExpression);\n\t\tif (!paramsGeneric?.isKind(SyntaxKind.TupleType)) return;\n\t\treturn paramsGeneric.getElements().map((node, index) => {\n\t\t\treturn {\n\t\t\t\tindex,\n\t\t\t\ttext: node.getText()\n\t\t\t};\n\t\t});\n\t};\n\tconst extractRouteMethods = (route, callExpression) => {\n\t\tconst funcDeclaration = callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) || callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\t\tif (!funcDeclaration) return [];\n\t\tconst arrayLiteralExpression = funcDeclaration.getFirstChildByKind(SyntaxKind.ArrayLiteralExpression);\n\t\tif (!arrayLiteralExpression) return [];\n\t\tconst callExpressions = [];\n\t\tfor (const e of arrayLiteralExpression.getChildrenOfKind(SyntaxKind.CallExpression)) {\n\t\t\tconst name = e.getExpression().getText();\n\t\t\tif (HTTPMethods[name]) callExpressions.push([e, name]);\n\t\t}\n\t\tconst methods = [];\n\t\tfor (const [callExpression, method] of callExpressions) {\n\t\t\tconst [vDefs, vOpts] = extractGenerics(callExpression);\n\t\t\tmethods.push({\n\t\t\t\tmethod,\n\t\t\t\tvalidationDefinitions: extractValidationDefinitions(route, method, vDefs, vOpts)\n\t\t\t});\n\t\t}\n\t\treturn methods;\n\t};\n\t/** Parse a boolean literal type node */\n\tconst parseRuntimeValidation = (typeNode) => {\n\t\tif (typeNode.isKind(SyntaxKind.LiteralType)) {\n\t\t\tconst literal = typeNode.getFirstChild();\n\t\t\tif (literal?.isKind(SyntaxKind.TrueKeyword)) return true;\n\t\t\telse if (literal?.isKind(SyntaxKind.FalseKeyword)) return false;\n\t\t}\n\t};\n\tconst extractResponseVariant = (typeNode) => {\n\t\tif (!typeNode.isKind(SyntaxKind.TupleType)) return;\n\t\tlet status = 200;\n\t\tlet contentType;\n\t\tlet body;\n\t\tconst [statusNode, contentTypeNode, bodyNode] = typeNode.getElements();\n\t\tif (statusNode?.isKind(SyntaxKind.LiteralType)) {\n\t\t\tconst literal = statusNode.getFirstChildByKind(SyntaxKind.NumericLiteral);\n\t\t\tif (literal) status = Number(literal.getText());\n\t\t}\n\t\tif (contentTypeNode) contentType = extractStringLiteral(contentTypeNode);\n\t\tif (bodyNode) {\n\t\t\tbody = bodyNode.getText();\n\t\t\tif ([\"object\"].includes(body)) body = \"{}\";\n\t\t}\n\t\treturn {\n\t\t\tstatus,\n\t\t\tcontentType,\n\t\t\tbody\n\t\t};\n\t};\n\t/** Parse opts TypeLiteral into a map keyed by target */\n\tconst parseValidationOptions = (typeNode) => {\n\t\tconst opts = {};\n\t\tif (!typeNode?.isKind(SyntaxKind.TypeLiteral)) return opts;\n\t\tfor (const prop of typeNode.getMembers()) {\n\t\t\tif (!prop.isKind(SyntaxKind.PropertySignature)) continue;\n\t\t\tconst target = prop.getName();\n\t\t\tconst typeNode = prop.getTypeNodeOrThrow();\n\t\t\tif (!typeNode.isKind(SyntaxKind.TypeLiteral)) continue;\n\t\t\tlet contentType;\n\t\t\tlet runtimeValidation;\n\t\t\tconst customErrors = {};\n\t\t\tfor (const member of typeNode.getMembers()) {\n\t\t\t\tif (!member.isKind(SyntaxKind.PropertySignature)) continue;\n\t\t\t\tconst nameNode = member.getNameNode();\n\t\t\t\tconst valueNode = member.getTypeNodeOrThrow();\n\t\t\t\tconst name = nameNode.isKind(SyntaxKind.StringLiteral) ? nameNode.getLiteralText() : nameNode.getText();\n\t\t\t\tif (name === \"contentType\") contentType = extractStringLiteral(valueNode);\n\t\t\t\telse if (name === \"runtimeValidation\") runtimeValidation = parseRuntimeValidation(valueNode);\n\t\t\t\telse if (name.startsWith(\"error\")) {\n\t\t\t\t\tconst literal = extractStringLiteral(valueNode);\n\t\t\t\t\tif (literal) customErrors[name] = literal;\n\t\t\t\t}\n\t\t\t}\n\t\t\topts[target] = {\n\t\t\t\tcontentType,\n\t\t\t\truntimeValidation,\n\t\t\t\tcustomErrors\n\t\t\t};\n\t\t}\n\t\treturn opts;\n\t};\n\tconst extractStringLiteral = (typeNode) => {\n\t\tconst literal = typeNode.isKind(SyntaxKind.LiteralType) ? typeNode.getFirstChildByKind(SyntaxKind.StringLiteral) : void 0;\n\t\treturn literal ? literal.getLiteralText() : void 0;\n\t};\n\t/**\n\t* Extract validation definitions from route handler generics.\n\t* Merges defs (schemas) and opts (validation options) into a flat array.\n\t* */\n\tconst extractValidationDefinitions = (route, method, defsNode, optsNode) => {\n\t\tconst definitions = [];\n\t\tif (!defsNode?.isKind(SyntaxKind.TypeLiteral)) return definitions;\n\t\tconst optsMap = parseValidationOptions(optsNode);\n\t\tconst createId = (target, hash) => {\n\t\t\treturn [\n\t\t\t\ttarget.replace(/^./, (c) => c.toUpperCase()),\n\t\t\t\t\"T\",\n\t\t\t\tmethod,\n\t\t\t\tcrc(route.id + hash)\n\t\t\t].join(\"\");\n\t\t};\n\t\tfor (const prop of defsNode.getMembers()) {\n\t\t\tif (!prop.isKind(SyntaxKind.PropertySignature)) continue;\n\t\t\tconst target = prop.getName();\n\t\t\tconst typeNode = prop.getTypeNodeOrThrow();\n\t\t\tif (target === \"response\") {\n\t\t\t\tconst variants = typeNode.isKind(SyntaxKind.UnionType) ? typeNode.getChildrenOfKind(SyntaxKind.TupleType) : [typeNode];\n\t\t\t\tdefinitions.push({\n\t\t\t\t\t...optsMap[target],\n\t\t\t\t\tmethod,\n\t\t\t\t\ttarget,\n\t\t\t\t\tvariants: variants.flatMap((e, i) => {\n\t\t\t\t\t\tconst { status, contentType, body } = extractResponseVariant(e) || {};\n\t\t\t\t\t\tif (!status) return [];\n\t\t\t\t\t\tif (contentType && typeof contentType !== \"string\") {\n\t\t\t\t\t\t\tconsole.warn(styleText([\"bold\", \"red\"], `✗ The second element of a response variant should specify the Response Content Type`));\n\t\t\t\t\t\t\tconsole.warn(styleText([\"blue\"], ` Example: [200, \"json\", Schema]`));\n\t\t\t\t\t\t\tconsole.warn(` Route: ${route.name}; Method: ${method}; Response Variant: #${i}`);\n\t\t\t\t\t\t\tconsole.warn();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [{\n\t\t\t\t\t\t\tid: createId(target, JSON.stringify([\n\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\tcontentType,\n\t\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t\t])),\n\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\tcontentType,\n\t\t\t\t\t\t\tbody\n\t\t\t\t\t\t}];\n\t\t\t\t\t})\n\t\t\t\t});\n\t\t\t} else if (Object.keys(RequestValidationTargets).includes(target)) definitions.push({\n\t\t\t\t...optsMap[target],\n\t\t\t\tmethod,\n\t\t\t\ttarget,\n\t\t\t\tschema: {\n\t\t\t\t\tid: createId(target),\n\t\t\t\t\ttext: typeNode.getText()\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn definitions;\n\t};\n\tconst extractTypeDeclarations = (sourceFile, opts) => {\n\t\tconst declarations = [];\n\t\tconst referencedFiles = opts?.withReferencedFiles ? [] : void 0;\n\t\tfor (const declaration of sourceFile.getImportDeclarations()) {\n\t\t\tconst modulePath = declaration.getModuleSpecifierValue();\n\t\t\tconst path = /^\\.\\.?\\/?/.test(modulePath) ? opts?.relpathResolver ? opts.relpathResolver(modulePath) : modulePath : modulePath;\n\t\t\tconst typeOnlyDeclaration = declaration.isTypeOnly();\n\t\t\tconst defaultImport = typeOnlyDeclaration ? declaration.getDefaultImport() : void 0;\n\t\t\tif (defaultImport) {\n\t\t\t\tconst name = defaultImport.getText();\n\t\t\t\tconst text = `import type ${name} from \"${path}\";`;\n\t\t\t\tdeclarations.push({\n\t\t\t\t\timportDeclaration: {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tpath\n\t\t\t\t\t},\n\t\t\t\t\ttext\n\t\t\t\t});\n\t\t\t\tif (referencedFiles) referencedFiles.push(...getReferencedFiles(defaultImport));\n\t\t\t}\n\t\t\tconst namespaceImport = typeOnlyDeclaration ? declaration.getNamespaceImport() : void 0;\n\t\t\tif (namespaceImport) {\n\t\t\t\tconst name = namespaceImport.getText();\n\t\t\t\tconst text = `import type * as ${name} from \"${path}\";`;\n\t\t\t\tdeclarations.push({\n\t\t\t\t\timportDeclaration: {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tpath\n\t\t\t\t\t},\n\t\t\t\t\ttext\n\t\t\t\t});\n\t\t\t\tif (referencedFiles) referencedFiles.push(...getReferencedFiles(namespaceImport));\n\t\t\t}\n\t\t\tfor (const namedImport of declaration.getNamedImports()) if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n\t\t\t\tconst nameNode = namedImport.getNameNode();\n\t\t\t\tconst name = nameNode.getText();\n\t\t\t\tconst alias = namedImport.getAliasNode()?.getText();\n\t\t\t\tconst nameText = alias ? `${name} as ${alias}` : name;\n\t\t\t\tdeclarations.push({\n\t\t\t\t\timportDeclaration: {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\talias,\n\t\t\t\t\t\tpath\n\t\t\t\t\t},\n\t\t\t\t\ttext: `import type { ${nameText} } from \"${path}\";`\n\t\t\t\t});\n\t\t\t\tif (referencedFiles) {\n\t\t\t\t\tif (nameNode.isKind(SyntaxKind.Identifier)) referencedFiles.push(...getReferencedFiles(nameNode));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const declaration of sourceFile.getTypeAliases()) {\n\t\t\tconst name = declaration.getName();\n\t\t\tconst text = declaration.getFullText().trim();\n\t\t\tdeclarations.push({\n\t\t\t\ttypeAliasDeclaration: { name },\n\t\t\t\ttext\n\t\t\t});\n\t\t}\n\t\tfor (const declaration of sourceFile.getInterfaces()) {\n\t\t\tconst name = declaration.getName();\n\t\t\tconst text = declaration.getFullText().trim();\n\t\t\tdeclarations.push({\n\t\t\t\tinterfaceDeclaration: { name },\n\t\t\t\ttext\n\t\t\t});\n\t\t}\n\t\tfor (const declaration of sourceFile.getEnums()) {\n\t\t\tconst name = declaration.getName();\n\t\t\tconst text = declaration.getFullText().trim();\n\t\t\tdeclarations.push({\n\t\t\t\tenumDeclaration: { name },\n\t\t\t\ttext\n\t\t\t});\n\t\t}\n\t\tfor (const declaration of sourceFile.getExportDeclarations()) {\n\t\t\tconst typeOnlyDeclaration = declaration.isTypeOnly();\n\t\t\tconst modulePath = declaration.getModuleSpecifierValue();\n\t\t\tconst path = modulePath ? /^\\.\\.?\\/?/.test(modulePath) ? opts?.relpathResolver ? opts.relpathResolver(modulePath) : modulePath : modulePath : void 0;\n\t\t\tfor (const namedExport of declaration.getNamedExports()) if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n\t\t\t\tconst nameNode = namedExport.getNameNode();\n\t\t\t\tconst name = nameNode.getText();\n\t\t\t\tconst alias = namedExport.getAliasNode()?.getText();\n\t\t\t\tconst nameText = alias ? `${name} as ${alias}` : name;\n\t\t\t\tdeclarations.push({\n\t\t\t\t\texportDeclaration: {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\talias: alias ?? name,\n\t\t\t\t\t\tpath\n\t\t\t\t\t},\n\t\t\t\t\ttext: path ? `export type { ${nameText} } from \"${path}\";` : `export type { ${nameText} };`\n\t\t\t\t});\n\t\t\t\tif (referencedFiles) {\n\t\t\t\t\tif (nameNode.isKind(SyntaxKind.Identifier)) referencedFiles.push(...getReferencedFiles(nameNode));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn referencedFiles ? [declarations, [...new Set(referencedFiles)]] : [declarations];\n\t};\n\tconst getReferencedFiles = (importIdentifier) => {\n\t\treturn (importIdentifier?.getSymbol()?.getAliasedSymbol()?.getDeclarations() || []).flatMap((e) => {\n\t\t\tconst sourceFile = e.getSourceFile();\n\t\t\treturn sourceFile ? [sourceFile.getFilePath()] : [];\n\t\t});\n\t};\n\tconst extractGenerics = (callExpression) => {\n\t\treturn callExpression.getTypeArguments();\n\t};\n\tconst typeResolverFactory = ({ root, name }) => {\n\t\tconst project = createProject({\n\t\t\ttsConfigFilePath: resolve(root, join(defaults.srcDir, name, \"tsconfig.json\")),\n\t\t\tskipAddingFilesFromTsConfig: true\n\t\t});\n\t\tconst literalTypesResolver = (literalTypes, options) => {\n\t\t\tconst sourceFile = project.createSourceFile(`${crc(literalTypes)}-${Date.now()}.ts`, literalTypes, { overwrite: true });\n\t\t\tconst resolvedTypes = flattener(project, sourceFile, {\n\t\t\t\t...options,\n\t\t\t\tstripComments: true\n\t\t\t});\n\t\t\tproject.removeSourceFile(sourceFile);\n\t\t\treturn resolvedTypes;\n\t\t};\n\t\treturn {\n\t\t\tgetSourceFile: (fileFullpath) => {\n\t\t\t\treturn project.getSourceFile(fileFullpath) || project.addSourceFileAtPath(fileFullpath);\n\t\t\t},\n\t\t\trefreshSourceFile: async (fileFullpath) => {\n\t\t\t\tconst sourceFile = project.getSourceFile(fileFullpath);\n\t\t\t\tif (sourceFile) await sourceFile.refreshFromFileSystem();\n\t\t\t},\n\t\t\tliteralTypesResolver\n\t\t};\n\t};\n\treturn {\n\t\tcreateProject,\n\t\textractDefaultExport,\n\t\textractParamsRefinements,\n\t\textractRouteMethods,\n\t\textractTypeDeclarations,\n\t\tresolveRouteSignature,\n\t\ttypeResolverFactory\n\t};\n};\n//#endregion\n//#region src/generators.ts\nvar defineGenerator = (f) => f;\nvar defineGeneratorFactory = (f) => f;\nvar createTemplateResolver = (customTemplates, defaultTemplate) => {\n\tconst templates = Object.entries({ ...customTemplates }).map(([pattern, template]) => [picomatch(pattern), template]);\n\treturn (pattern, entry) => {\n\t\tconst match = templates.find(([isMatch]) => isMatch(pattern));\n\t\tif (!match) return defaultTemplate;\n\t\treturn typeof match[1] === \"function\" ? match[1](entry) : match[1];\n\t};\n};\n//#endregion\n//#region src/paths.ts\nvar pathResolver = (sourceFolder) => {\n\tconst createPath = (...a) => {\n\t\treturn sourceFolder.root ? resolve(sourceFolder.root, join(...a)) : join(...a);\n\t};\n\tconst createImport = {\n\t\tsrc(a, { origin }) {\n\t\t\treturn origin === \"src\" ? join(defaults.srcPrefix, ...a) : join(defaults.appPrefix, defaults.srcDir, sourceFolder.name, ...a);\n\t\t},\n\t\tapi(a, o) {\n\t\t\treturn this.src([defaults.apiDir, ...a], o);\n\t\t},\n\t\tpages(a, o) {\n\t\t\treturn this.src([defaults.pagesDir, ...a], o);\n\t\t},\n\t\tlib(a, { origin }) {\n\t\t\treturn origin === \"src\" ? join(defaults.libPrefix, ...a) : join(defaults.appPrefix, defaults.libDir, sourceFolder.name, ...a);\n\t\t},\n\t\tlibCore(a, o) {\n\t\t\treturn this.lib([\"core\", ...a], o);\n\t\t},\n\t\tlibApi(a, o) {\n\t\t\treturn this.lib([defaults.apiDir, ...a], o);\n\t\t},\n\t\tlibEntry(a, o) {\n\t\t\treturn this.lib([defaults.entryDir, ...a], o);\n\t\t}\n\t};\n\treturn {\n\t\tcreatePath: {\n\t\t\tsrc(...a) {\n\t\t\t\treturn createPath(defaults.srcDir, sourceFolder.name, ...a);\n\t\t\t},\n\t\t\tapi(...a) {\n\t\t\t\treturn this.src(defaults.apiDir, ...a);\n\t\t\t},\n\t\t\tpages(...a) {\n\t\t\t\treturn this.src(defaults.pagesDir, ...a);\n\t\t\t},\n\t\t\tentry(...a) {\n\t\t\t\treturn this.src(defaults.entryDir, ...a);\n\t\t\t},\n\t\t\tlib(...a) {\n\t\t\t\treturn createPath(defaults.libDir, sourceFolder.name, ...a);\n\t\t\t},\n\t\t\tlibCore(...a) {\n\t\t\t\treturn this.lib(\"core\", ...a);\n\t\t\t},\n\t\t\tlibApi(...a) {\n\t\t\t\treturn this.lib(defaults.apiDir, ...a);\n\t\t\t},\n\t\t\tlibEntry(...a) {\n\t\t\t\treturn this.lib(defaults.entryDir, ...a);\n\t\t\t},\n\t\t\tlibPages(...a) {\n\t\t\t\treturn this.lib(defaults.pagesDir, ...a);\n\t\t\t},\n\t\t\tdistDir(...a) {\n\t\t\t\treturn createPath(sourceFolder.distDir, sourceFolder.name, ...a);\n\t\t\t}\n\t\t},\n\t\tcreateImport,\n\t\tcreateImportHelpers(o) {\n\t\t\tif (![\"src\", \"lib\"].includes(o?.origin)) throw new Error(`createImportHelpers: required exactly one argument of shape { origin: \"src|lib\" }`);\n\t\t\treturn { createImport(key, ...a) {\n\t\t\t\treturn createImport[key](a.slice(0, -1), o);\n\t\t\t} };\n\t\t}\n\t};\n};\nvar pathExists = async (path) => {\n\ttry {\n\t\tawait access(path, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n//#endregion\n//#region src/render.ts\nvar render = (template, context, options) => {\n\tconst { noEscape = true, renderer = handlebars } = { ...options };\n\treturn renderer.compile(template, { noEscape })(context);\n};\nvar renderToFile = async (file, template, context, options) => {\n\tconst content = render(template, context, options);\n\t/**\n\t* Two fs calls (exists + read) are worth it to avoid touching the file\n\t* and triggering watchers unnecessarily.\n\t* */\n\tif (await pathExists(file)) {\n\t\tconst { overwrite = true } = { ...options };\n\t\tif (overwrite === false) return;\n\t\tconst fileContent = await readFile(file, \"utf8\");\n\t\tif (typeof overwrite === \"function\" && !overwrite(fileContent)) return;\n\t\tif (crc(content) === crc(fileContent)) return;\n\t}\n\tawait mkdir(dirname(file), { recursive: true });\n\tawait writeFile(file, content, \"utf8\");\n};\nvar renderFactory = (options) => {\n\tconst createRenderer = (selfOoptions) => {\n\t\tconst renderer = handlebars.create();\n\t\trenderer.registerPartial({\n\t\t\t...options?.partials,\n\t\t\t...selfOoptions?.partials\n\t\t});\n\t\trenderer.registerHelper({\n\t\t\t...options?.helpers,\n\t\t\t...selfOoptions?.helpers\n\t\t});\n\t\treturn renderer;\n\t};\n\treturn {\n\t\trender(template, context, selfOoptions) {\n\t\t\treturn render(template, context, {\n\t\t\t\t...options,\n\t\t\t\t...selfOoptions,\n\t\t\t\trenderer: createRenderer(selfOoptions)\n\t\t\t});\n\t\t},\n\t\tasync renderToFile(file, template, context, selfOoptions) {\n\t\t\treturn renderToFile(options?.outdir ? join(options.outdir, file) : file, template, context, {\n\t\t\t\t...options,\n\t\t\t\t...selfOoptions,\n\t\t\t\trenderer: createRenderer(selfOoptions)\n\t\t\t});\n\t\t}\n\t};\n};\n//#endregion\n//#region src/routes/paths.ts\n/**\n* Parse a filesystem route path into structured PathToken array.\n*\n* Uses path-to-regexp v8 AST for parsing, with directory-friendly syntax:\n* - [param] => required param - :param\n* - {param} => optional param - {:param}\n* - {...param} => splat - {*param}\n*\n* Direct :param syntax is prohibited outside {} to avoid ambiguity.\n* Inside {} it is treated as path-to-regexp power syntax and used as-is.\n*\n* Examples:\n* Required: [id], [name]\n* Optional: {name}, {format}\n* Splat: {...path}\n* Mixed segments: shop/[id]-{name}\n* Power syntax: {-v:version{-:pre}}, :name{@:version{.:min}}.js\n* */\nvar pathTokensFactory = (path, { transformStaticValue = normalizeStaticValue } = {}) => {\n\t/**\n\t* Recursively extract parts from path-to-regexp AST tokens.\n\t* A param inside a group is optional; top-level params are required.\n\t* Wildcard tokens are always splat.\n\t* Slash-only text nodes (restored for parsing) are skipped.\n\t* */\n\tconst extractParts = (tokens, createConst, insideGroup = false) => {\n\t\tconst parts = [];\n\t\tfor (const token of tokens) switch (token.type) {\n\t\t\tcase \"text\":\n\t\t\t\tif (token.value !== \"/\") parts.push({\n\t\t\t\t\ttype: \"static\",\n\t\t\t\t\tvalue: transformStaticValue(token.value)\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"param\":\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: \"param\",\n\t\t\t\t\tkind: insideGroup ? \"optional\" : \"required\",\n\t\t\t\t\tname: token.name,\n\t\t\t\t\tconst: createConst(token.name)\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"wildcard\":\n\t\t\t\tparts.push({\n\t\t\t\t\ttype: \"param\",\n\t\t\t\t\tkind: \"splat\",\n\t\t\t\t\tname: token.name,\n\t\t\t\t\tconst: createConst(token.name)\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase \"group\":\n\t\t\t\tparts.push(...extractParts(token.tokens, createConst, true));\n\t\t\t\tbreak;\n\t\t}\n\t\treturn parts;\n\t};\n\tconst patternTransforms = [\n\t\t(s) => s.replace(/\\[(\\w+)\\]/g, \":$1\"),\n\t\t(s) => s.replace(/\\{(\\w+)\\}/g, \"{:$1}\"),\n\t\t(s) => s.replace(/\\{\\.\\.\\./g, \"{*\"),\n\t\t(s) => {\n\t\t\treturn s.startsWith(\"{\") ? s.replace(/^\\{/, \"{/\") : s;\n\t\t}\n\t];\n\tconst detectBareParams = (s) => {\n\t\tlet depth = 0;\n\t\tfor (const [i, ch] of [...s].entries()) if (ch === \"{\") depth += 1;\n\t\telse if (ch === \"}\") depth -= 1;\n\t\telse if (ch === \":\" && depth === 0) return s.slice(i + 1).match(/^\\w+/)?.[0] || \":\";\n\t};\n\treturn path.replace(/^index\\/?/, \"\").split(\"/\").flatMap((orig) => {\n\t\tif (!orig.length) return [];\n\t\tconst bareParam = detectBareParams(orig);\n\t\tif (bareParam === \":\") throw new Error(`${path} contains colons outside braces, use : only within {}`);\n\t\telse if (bareParam) throw new Error(`${path} contains bare params, use [${bareParam}] instead of :${bareParam}`);\n\t\tconst pattern = patternTransforms.reduce((src, fn) => fn(src), orig);\n\t\tconst { tokens } = parse(pattern.replace(/\\{[^}]*\\}|(\\+)/g, (m, p1) => p1 ? \"\\\\+\" : m));\n\t\tconst parts = extractParts(tokens, (val) => {\n\t\t\treturn /\\W/.test(val) || /^\\d/.test(val) ? [val.replace(/^\\d+|\\W/g, \"_\"), crc(orig)].join(\"_\") : val;\n\t\t});\n\t\tconst isStatic = parts.length === 1 ? parts[0].type === \"static\" : false;\n\t\tconst isParam = parts.length === 1 ? parts[0].type === \"param\" : false;\n\t\treturn [{\n\t\t\tkind: isStatic ? \"static\" : isParam ? \"param\" : \"mixed\",\n\t\t\torig,\n\t\t\tpattern,\n\t\t\tparts\n\t\t}];\n\t});\n};\nvar createPathPattern = (tokens) => {\n\treturn tokens.map(({ pattern }, i) => {\n\t\tconst next = tokens[i + 1];\n\t\tif (!next || next.pattern.includes(\"/\")) return pattern;\n\t\treturn tokens.slice(i + 1).some((e) => {\n\t\t\treturn e.parts.some((e) => {\n\t\t\t\treturn e.type === \"static\" || e.kind === \"required\";\n\t\t\t});\n\t\t}) ? `${pattern}/` : pattern;\n\t}).join(\"\");\n};\nvar createHonoPattern = (tokens) => {\n\tconst staticValue = ({ value }) => {\n\t\treturn normalizeStaticValue(value);\n\t};\n\tconst paramValue = (p) => {\n\t\tif (p.kind === \"splat\") return `*`;\n\t\tif (p.kind === \"optional\") return `:${p.name}?`;\n\t\treturn `:${p.name}`;\n\t};\n\tconst escapeRegex = (s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\tconst tokensToRegex = (tokens) => {\n\t\treturn tokens.flatMap((t) => {\n\t\t\tif (t.type === \"text\") return t.value === \"/\" ? [] : [escapeRegex(t.value)];\n\t\t\tif (t.type === \"wildcard\") return [\".+\"];\n\t\t\tif (t.type === \"param\") return [\"[^/]+\"];\n\t\t\tif (t.type === \"group\") return [`(?:${tokensToRegex(t.tokens)})?`];\n\t\t\treturn [];\n\t\t}).join(\"\");\n\t};\n\treturn tokens.flatMap((token, i) => {\n\t\tif (token.kind === \"static\") return [staticValue(token.parts[0])];\n\t\tif (token.kind === \"param\") return [paramValue(token.parts[0])];\n\t\tconst { tokens } = parse(token.pattern.replace(/\\//g, \"\"));\n\t\treturn [`:_${i}{${tokensToRegex(tokens)}}`];\n\t}).join(\"/\");\n};\nvar normalizeStaticValue = (value) => {\n\treturn value.replace(/\\+/g, \"\\\\\\\\+\");\n};\n//#endregion\n//#region src/routes/base.ts\nvar API_INDEX_BASENAME = \"index\";\nvar API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;\nvar API_USE_BASENAME = \"use\";\nvar API_USE_PATTERN = `use.ts`;\nvar PAGE_INDEX_BASENAME = \"index\";\nvar PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue,mdx,md}`;\nvar PAGE_LAYOUT_BASENAME = \"layout\";\nvar PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue,mdx}`;\nvar ROUTE_FILE_PATTERNS = [\n\t`${defaults.apiDir}/**/${API_INDEX_PATTERN}`,\n\t`${defaults.apiDir}/**/${API_USE_PATTERN}`,\n\t`${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,\n\t`${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`\n];\nvar scanRoutes = async (sourceFolder) => {\n\tconst { createPath } = pathResolver(sourceFolder);\n\treturn glob(ROUTE_FILE_PATTERNS, {\n\t\tcwd: createPath.src(),\n\t\tabsolute: true,\n\t\tonlyFiles: true,\n\t\tfollowSymbolicLinks: false,\n\t\tignore: [\n\t\t\t`${defaults.apiDir}/${API_INDEX_PATTERN}`,\n\t\t\t`${defaults.apiDir}/${API_USE_PATTERN}`,\n\t\t\t`${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,\n\t\t\t`${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`\n\t\t]\n\t});\n};\nvar isRouteFile = (file, sourceFolder) => {\n\tconst [_sourceFolder, _folder, ...rest] = resolve(sourceFolder.root, file).replace(`${sourceFolder.root}/${defaults.srcDir}/`, \"\").split(\"/\");\n\t/**\n\t* Ensure the file:\n\t* - is under the correct source root\n\t* - belongs to a known route folder (`api/` or `pages/`)\n\t* - is nested at least one level deep (not a direct child of the folder)\n\t* */\n\tif (!_folder || _sourceFolder !== sourceFolder.name || rest.length < 2) return false;\n\treturn picomatch.isMatch(join(_folder, ...rest), ROUTE_FILE_PATTERNS) ? [_folder, rest.join(\"/\")] : false;\n};\nvar isApiRoute = (file) => {\n\treturn picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);\n};\nvar isApiUse = (file) => {\n\treturn picomatch.matchBase(file, `**/${API_USE_PATTERN}`);\n};\nvar isPageRoute = (file) => {\n\treturn picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);\n};\nvar isPageLayout = (file) => {\n\treturn picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);\n};\nvar createRouteEntry = (fileFullpath, sourceFolder) => {\n\tconst resolvedPaths = isRouteFile(fileFullpath, sourceFolder);\n\tif (!resolvedPaths) return;\n\tconst [folder, file] = resolvedPaths;\n\tconst id = `${file.replace(/\\W+/g, \"_\")}_${crc(file)}`;\n\tconst name = dirname(file);\n\ttry {\n\t\tconst pathTokens = pathTokensFactory(dirname(file));\n\t\treturn {\n\t\t\tid,\n\t\t\tname,\n\t\t\tfolder,\n\t\t\tfile,\n\t\t\tfileFullpath,\n\t\t\tpathTokens,\n\t\t\tpathPattern: createPathPattern(pathTokens),\n\t\t\thonoPattern: createHonoPattern(pathTokens)\n\t\t};\n\t} catch (error) {\n\t\tconsole.error(`❗${styleText(\"red\", \"ERROR\")}: Failed parsing path for \"${styleText(\"cyan\", file)}\"`);\n\t\tconsole.error(error);\n\t\treturn;\n\t}\n};\n/**\n* Weight of a single path segment.\n*\n* Fixed values per kind prevent complex mixed segments\n* from outscoring multiple statics.\n*\n* static: 4 (exact match, most specific)\n* mixed: 3+ (static + param parts; more statics = slightly higher)\n* required: 2 (matches any single segment)\n* optional: 1 (may or may not match)\n* splat: 0 (matches anything, least specific)\n* */\nvar segmentWeight = (token) => {\n\tif (token.kind === \"static\") return 4;\n\tif (token.kind === \"mixed\") {\n\t\tlet statics = 0;\n\t\tlet optionals = 0;\n\t\tfor (const part of token.parts) if (part.type === \"static\") statics += 1;\n\t\telse if (part.kind === \"optional\" || part.kind === \"splat\") optionals += 1;\n\t\treturn 3 + statics * .01 - optionals * .005;\n\t}\n\tswitch (token.parts[0].kind) {\n\t\tcase \"required\": return 2;\n\t\tcase \"optional\": return 1;\n\t\tcase \"splat\": return 0;\n\t}\n};\n/**\n* Compare two route entries for registration order.\n*\n* More specific routes sort first (higher priority).\n* Segments are compared left-to-right; first difference wins.\n*\n* When one route is a prefix of the other, the trailing segment\n* determines order: a trailing splat loses (shorter sibling first),\n* anything else wins (longer route is more specific).\n*\n* At equal weight and length, lexicographic tiebreak ensures\n* deterministic ordering across JS engines.\n* */\nvar sortRoutes = (a, b) => {\n\tconst pairs = Array.from({ length: Math.max(a.pathTokens.length, b.pathTokens.length) }, (_, i) => [a.pathTokens[i], b.pathTokens[i]]);\n\tfor (const [at, bt] of pairs) {\n\t\tif (!at || !bt) {\n\t\t\tconst extra = at ?? bt;\n\t\t\tif (extra?.kind === \"param\" ? extra.parts[0].kind === \"splat\" : false) return at ? 1 : -1;\n\t\t\treturn at ? -1 : 1;\n\t\t}\n\t\tconst aw = segmentWeight(at);\n\t\tconst bw = segmentWeight(bt);\n\t\tif (aw !== bw) return bw - aw;\n\t}\n\treturn a.pathPattern.localeCompare(b.pathPattern);\n};\n//#endregion\n//#region src/templates/resolved-types.hbs?raw\nvar resolved_types_default = \"{{#each resolvedTypes}}\\nexport type {{name}} = {{text}};\\n{{/each}}\\n\";\n//#endregion\n//#region src/templates/types.hbs?raw\nvar types_default = \"{{#each typeDeclarations}}{{text}}\\n{{/each}}\\n\\nexport type {{params.id}} = {\\n {{#each paramsSchema}}\\n \\\"{{name}}\\\"{{#unless isRequired}}?{{/unless}}: {{#if refinement}}\\n {{refinement.text}},\\n {{else}}\\n {{#if isSplat}}Array<string>{{else}}string{{/if}},\\n {{/if}}\\n {{/each}}\\n};\\n\\n{{#each validationTypes}}export type {{id}} = {{text}};\\n{{/each}}\\n\";\n//#endregion\n//#region src/routes/resolve.ts\nvar resolverFactory = (sourceFolder, cacheFactory) => {\n\tconst { generators = [], refineTypeName = defaults.refineTypeName } = sourceFolder.config;\n\tconst { typeResolverFactory, resolveRouteSignature } = astFactory();\n\tconst resolveTypes = generators.some(({ meta }) => meta.resolveTypes);\n\tconst { literalTypesResolver, getSourceFile, refreshSourceFile } = typeResolverFactory(sourceFolder);\n\treturn {\n\t\tpageLayoutResolver(entry) {\n\t\t\tconst { name } = entry;\n\t\t\tconst handler = async () => {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"pageLayout\",\n\t\t\t\t\tentry\n\t\t\t\t};\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\thandler\n\t\t\t};\n\t\t},\n\t\tpageRouteResolver(entry) {\n\t\t\tconst { id, name, folder, file, fileFullpath, pathTokens, pathPattern, honoPattern } = entry;\n\t\t\tconst handler = async () => {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"pageRoute\",\n\t\t\t\t\tentry: {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tpathTokens,\n\t\t\t\t\t\tpathPattern,\n\t\t\t\t\t\thonoPattern,\n\t\t\t\t\t\tparams: { schema: pathTokens.flatMap((e) => {\n\t\t\t\t\t\t\treturn e.parts.filter((p) => p.type === \"param\");\n\t\t\t\t\t\t}) },\n\t\t\t\t\t\tfolder,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfileFullpath\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\thandler\n\t\t\t};\n\t\t},\n\t\tapiUseResolver(entry) {\n\t\t\tconst { name } = entry;\n\t\t\tconst handler = async () => {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"apiUse\",\n\t\t\t\t\tentry\n\t\t\t\t};\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\thandler\n\t\t\t};\n\t\t},\n\t\tapiRouteResolver(entry) {\n\t\t\tconst { id, name, file, folder, fileFullpath, pathTokens, pathPattern, honoPattern } = entry;\n\t\t\tconst handler = async (updatedFile) => {\n\t\t\t\tconst paramsSchema = pathTokens.flatMap((e) => {\n\t\t\t\t\treturn e.parts.flatMap((p) => {\n\t\t\t\t\t\treturn p.type === \"param\" ? [p] : [];\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tconst optionalParams = paramsSchema.length ? paramsSchema.filter((e) => e.kind === \"required\").length === 0 : true;\n\t\t\t\tconst cacheStore = cacheFactory ? cacheFactory({\n\t\t\t\t\tid,\n\t\t\t\t\tfile,\n\t\t\t\t\tfileFullpath\n\t\t\t\t}, sourceFolder, { resolveTypes }) : void 0;\n\t\t\t\tlet cache = cacheStore ? await cacheStore.get({ validate: true }) : void 0;\n\t\t\t\tif (!cache) {\n\t\t\t\t\tif (updatedFile === fileFullpath) await refreshSourceFile(fileFullpath);\n\t\t\t\t\tconst { typeDeclarations, paramsRefinements, methods, validationDefinitions, referencedFiles = [] } = await resolveRouteSignature({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tfileFullpath,\n\t\t\t\t\t\toptionalParams\n\t\t\t\t\t}, {\n\t\t\t\t\t\twithReferencedFiles: true,\n\t\t\t\t\t\tsourceFile: getSourceFile(fileFullpath),\n\t\t\t\t\t\trelpathResolver(path) {\n\t\t\t\t\t\t\treturn join(sourceFolder.name, defaults.apiDir, dirname(file), path);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tconst validationTypes = validationDefinitions.flatMap((def) => {\n\t\t\t\t\t\treturn def.target === \"response\" ? def.variants.flatMap(({ id, body }) => {\n\t\t\t\t\t\t\treturn body ? [{\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\ttext: body\n\t\t\t\t\t\t\t}] : [];\n\t\t\t\t\t\t}) : [def.schema];\n\t\t\t\t\t});\n\t\t\t\t\tconst numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {\n\t\t\t\t\t\tif (text === \"number\") {\n\t\t\t\t\t\t\tconst param = paramsSchema.at(index);\n\t\t\t\t\t\t\treturn param ? [param.name] : [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}) : [];\n\t\t\t\t\tconst typesFile = pathResolver(sourceFolder).createPath.libApi(dirname(file), \"types.ts\");\n\t\t\t\t\tconst params = {\n\t\t\t\t\t\tid: [\"ParamsT\", crc(name)].join(\"\"),\n\t\t\t\t\t\tschema: paramsSchema,\n\t\t\t\t\t\tresolvedType: void 0\n\t\t\t\t\t};\n\t\t\t\t\tconst typesFileContent = render(types_default, {\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tparamsSchema: paramsSchema.map((param, index) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...param,\n\t\t\t\t\t\t\t\tisRequired: param.kind === \"required\",\n\t\t\t\t\t\t\t\tisSplat: param.kind === \"splat\",\n\t\t\t\t\t\t\t\trefinement: paramsRefinements?.at(index)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttypeDeclarations,\n\t\t\t\t\t\tvalidationTypes\n\t\t\t\t\t});\n\t\t\t\t\tconst resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {\n\t\t\t\t\t\tstripComments: true,\n\t\t\t\t\t\toverrides: { [refineTypeName]: refineTypeName },\n\t\t\t\t\t\twithProperties: [params.id, ...validationTypes.flatMap(({ id }) => id)]\n\t\t\t\t\t}) : void 0;\n\t\t\t\t\t/**\n\t\t\t\t\t* Deploy types.ts file; required by core generators (like fetch).\n\t\t\t\t\t* If types resolved, write resolved types;\n\t\t\t\t\t* otherwise write original types extracted from API route.\n\t\t\t\t\t* */\n\t\t\t\t\tawait renderToFile(typesFile, resolvedTypes ? resolved_types_default : typesFileContent, { resolvedTypes });\n\t\t\t\t\tparams.resolvedType = resolvedTypes?.find((e) => e.name === params.id);\n\t\t\t\t\tcache = {\n\t\t\t\t\t\thash: 0,\n\t\t\t\t\t\treferencedFiles: {},\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tmethods,\n\t\t\t\t\t\ttypeDeclarations,\n\t\t\t\t\t\tnumericParams,\n\t\t\t\t\t\tvalidationDefinitions: validationDefinitions.map((def) => {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...def,\n\t\t\t\t\t\t\t\t...def.target === \"response\" ? { variants: def.variants.map((variant) => {\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t...variant,\n\t\t\t\t\t\t\t\t\t\tresolvedType: resolvedTypes?.find((e) => e.name === variant.id)\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}) } : { schema: {\n\t\t\t\t\t\t\t\t\t...def.schema,\n\t\t\t\t\t\t\t\t\tresolvedType: resolvedTypes?.find((e) => e.name === def.schema.id)\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t\tif (cacheStore) {\n\t\t\t\t\t\tconst { referencedFiles: _void, ...rest } = cache;\n\t\t\t\t\t\tcache = await cacheStore.set({\n\t\t\t\t\t\t\t...rest,\n\t\t\t\t\t\t\treferencedFiles\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst validationDefinitions = cache.validationDefinitions.flatMap((def) => {\n\t\t\t\t\tlet augmentedDef = def;\n\t\t\t\t\tif (def.target === \"response\") augmentedDef = {\n\t\t\t\t\t\t...def,\n\t\t\t\t\t\tvariants: def.variants.flatMap((variant, i) => {\n\t\t\t\t\t\t\tif (typeof variant.contentType !== \"string\") return [variant];\n\t\t\t\t\t\t\tif (variant.contentType.includes(\"/\")) return [variant];\n\t\t\t\t\t\t\tconst contentType = mimeTypes.lookup(variant.contentType);\n\t\t\t\t\t\t\tif (contentType === false) {\n\t\t\t\t\t\t\t\tconsole.warn(styleText([\"bold\", \"red\"], \"✗ Failed resolving Response Content Type\"));\n\t\t\t\t\t\t\t\tconsole.warn(` Invalid value provided for mime-types lookup - ${variant.contentType}`);\n\t\t\t\t\t\t\t\tconsole.warn(styleText([\"cyan\"], ` Response variant #${i} excluded from route schemas`));\n\t\t\t\t\t\t\t\tconsole.warn(` Route: ${name}; Method: ${def.method}`);\n\t\t\t\t\t\t\t\tconsole.warn();\n\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn [{\n\t\t\t\t\t\t\t\t...variant,\n\t\t\t\t\t\t\t\tcontentType\n\t\t\t\t\t\t\t}];\n\t\t\t\t\t\t})\n\t\t\t\t\t};\n\t\t\t\t\telse if (def.contentType && !def.contentType.includes(\"/\")) {\n\t\t\t\t\t\tconst contentType = mimeTypes.lookup(def.contentType);\n\t\t\t\t\t\tif (contentType === false) {\n\t\t\t\t\t\t\tconsole.warn(styleText([\"bold\", \"red\"], \"✗ Failed resolving Response Content Type\"));\n\t\t\t\t\t\t\tconsole.warn(` Invalid value provided for mime-types lookup - ${def.contentType}`);\n\t\t\t\t\t\t\tconsole.warn(` Route: ${name}; Method: ${def.method}`);\n\t\t\t\t\t\t\tconsole.warn();\n\t\t\t\t\t\t} else augmentedDef = {\n\t\t\t\t\t\t\t...def,\n\t\t\t\t\t\t\tcontentType\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn augmentedDef ? [augmentedDef] : [];\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"apiRoute\",\n\t\t\t\t\tentry: {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tpathTokens,\n\t\t\t\t\t\tpathPattern,\n\t\t\t\t\t\thonoPattern,\n\t\t\t\t\t\tparams: cache.params,\n\t\t\t\t\t\tnumericParams: cache.numericParams,\n\t\t\t\t\t\toptionalParams,\n\t\t\t\t\t\tfolder,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfileFullpath,\n\t\t\t\t\t\tmethods: cache.methods,\n\t\t\t\t\t\ttypeDeclarations: cache.typeDeclarations,\n\t\t\t\t\t\tvalidationDefinitions,\n\t\t\t\t\t\treferencedFiles: Object.keys(cache.referencedFiles).map((e) => resolve(sourceFolder.root, e))\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\thandler\n\t\t\t};\n\t\t}\n\t};\n};\n//#endregion\n//#region src/routes/nesting.ts\nvar nestedRoutesFactory = (routeEntries) => {\n\tconst entryStack = structuredClone(routeEntries).sort(sortRoutes);\n\t/**\n\t* Group entries by name (at the same level, both layout and index share same name).\n\t*\n\t* Handle 3 cases:\n\t* - both index and layout exists\n\t* - only index exists\n\t* - only layout exists\n\t*\n\t* */\n\tconst transformEntries = (entries, parent) => {\n\t\treturn [...new Set(entries.map((e) => e.name))].flatMap((name) => {\n\t\t\tconst nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {\n\t\t\t\treturn entry.name === name ? [entry] : [];\n\t\t\t});\n\t\t\tconst index = nameEntries.find((e) => basename(e.file).startsWith(PAGE_INDEX_BASENAME));\n\t\t\tconst layout = nameEntries.find((e) => basename(e.file).startsWith(PAGE_LAYOUT_BASENAME));\n\t\t\tif (index || layout) return [{\n\t\t\t\tindex: index ? {\n\t\t\t\t\t...index,\n\t\t\t\t\tpathTokens: index.pathTokens.slice(parent?.pathTokens.length || 0)\n\t\t\t\t} : void 0,\n\t\t\t\tlayout: layout ? {\n\t\t\t\t\t...layout,\n\t\t\t\t\tpathTokens: layout.pathTokens.slice(parent?.pathTokens.length || 0)\n\t\t\t\t} : void 0,\n\t\t\t\tparent: parent?.name,\n\t\t\t\tchildren: transformEntries(findDescendantEntries(index || layout), index || layout)\n\t\t\t}];\n\t\t\treturn [];\n\t\t});\n\t};\n\t/**\n\t* Recursively finds direct descendant routes.\n\t*\n\t* \"Direct\" means the next existing route in the path hierarchy,\n\t* skipping intermediate path segments that don't have index/layout files.\n\t*\n\t* Example: blog/post/[slug]/index.tsx is a direct child of blog/index.tsx\n\t* even though \"post\" segment exists (it has no index.tsx).\n\t* */\n\tconst findDescendantEntries = ({ name, pathTokens }) => {\n\t\tconst potentialChildren = entryStack.filter((entry) => {\n\t\t\tif (entry.pathTokens.length <= pathTokens.length) return false;\n\t\t\tif (!entry.name.startsWith(`${name}/`)) return false;\n\t\t\treturn true;\n\t\t});\n\t\treturn potentialChildren.filter((child) => {\n\t\t\treturn !potentialChildren.some((intermediate) => {\n\t\t\t\tif (intermediate === child) return false;\n\t\t\t\tif (intermediate.pathTokens.length <= pathTokens.length) return false;\n\t\t\t\tif (intermediate.pathTokens.length >= child.pathTokens.length) return false;\n\t\t\t\treturn child.name.startsWith(`${intermediate.name}/`);\n\t\t\t});\n\t\t});\n\t};\n\treturn transformEntries(entryStack.filter((entry) => {\n\t\treturn !entryStack.some((potential) => {\n\t\t\tif (potential === entry) return false;\n\t\t\tif (potential.pathTokens.length >= entry.pathTokens.length) return false;\n\t\t\treturn entry.name.startsWith(`${potential.name}/`);\n\t\t});\n\t}));\n};\n//#endregion\n//#region src/routes/index.ts\nvar routesFactory = async (sourceFolder, cacheFactory) => {\n\tconst { apiRouteResolver, apiUseResolver, pageRouteResolver, pageLayoutResolver } = resolverFactory(sourceFolder, cacheFactory);\n\tconst resolversFactory = (routeFiles) => {\n\t\tconst resolvers = /* @__PURE__ */ new Map();\n\t\tconst entries = routeFiles.flatMap((file) => {\n\t\t\tconst entry = createRouteEntry(file, sourceFolder);\n\t\t\treturn entry ? [entry] : [];\n\t\t});\n\t\tfor (const entry of entries) if (entry.folder === defaults.apiDir) {\n\t\t\tif (isApiRoute(entry.file)) resolvers.set(entry.fileFullpath, apiRouteResolver(entry));\n\t\t\telse if (isApiUse(entry.file)) resolvers.set(entry.fileFullpath, apiUseResolver(entry));\n\t\t} else if (entry.folder === defaults.pagesDir) {\n\t\t\tif (isPageRoute(entry.file)) resolvers.set(entry.fileFullpath, pageRouteResolver(entry));\n\t\t\telse if (isPageLayout(entry.file)) resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));\n\t\t}\n\t\treturn resolvers;\n\t};\n\treturn {\n\t\tresolvers: resolversFactory(await scanRoutes(sourceFolder)),\n\t\tresolversFactory\n\t};\n};\n//#endregion\n//#region src/spinner.ts\nvar spinnerFactory = (startText) => {\n\tconst spinner = new Spinner().start(startText);\n\tlet _text = startText;\n\treturn {\n\t\ttext(text) {\n\t\t\t_text = text;\n\t\t\tspinner.text = text;\n\t\t},\n\t\tappend(text) {\n\t\t\tspinner.text = `${_text} › ${text}`;\n\t\t},\n\t\tsucceed(text) {\n\t\t\tif (text) this.append(text);\n\t\t\telse this.text(_text);\n\t\t\tspinner.succeed();\n\t\t},\n\t\tfailed(text) {\n\t\t\tif (text) this.text([_text, text].join(\"\\n\"));\n\t\t\tspinner.failed();\n\t\t}\n\t};\n};\nvar withSpinner = (text, pipe, spinner) => pipe(spinner || spinnerFactory(text));\n//#endregion\n//#region src/typebox.ts\nvar typeboxLiteralText = (text, sourceFolder) => {\n\tconst { refineTypeName = defaults.refineTypeName } = sourceFolder.config;\n\treturn [\n\t\t[/(?<!\\\\)`/g, \"\\\\`\"],\n\t\t[/(?<!\\\\)\\$\\{/g, \"\\\\${\"],\n\t\t[new RegExp(`\\\\b${refineTypeName}\\\\s*<`, \"g\"), \"Options<\"]\n\t].reduce((text, [a, b]) => text.replace(a, b), text);\n};\n//#endregion\n//#region src/vite.ts\nvar nodePrefix = () => {\n\treturn {\n\t\tname: \"kosmojs:node-prefix\",\n\t\tenforce: \"pre\",\n\t\tresolveId(source) {\n\t\t\treturn builtinModules.includes(source) ? {\n\t\t\t\tid: `node:${source}`,\n\t\t\t\texternal: true\n\t\t\t} : void 0;\n\t\t}\n\t};\n};\nvar vitePlugins = { nodePrefix };\n//#endregion\nexport { API_INDEX_BASENAME, API_INDEX_PATTERN, API_USE_BASENAME, API_USE_PATTERN, PAGE_INDEX_BASENAME, PAGE_INDEX_PATTERN, PAGE_LAYOUT_BASENAME, PAGE_LAYOUT_PATTERN, astFactory, createHonoPattern, createPathPattern, createRouteEntry, createTemplateResolver, defineGenerator, defineGeneratorFactory, isApiRoute, isApiUse, isPageLayout, isPageRoute, isRouteFile, nestedRoutesFactory, normalizeStaticValue, pathExists, pathResolver, pathTokensFactory, render, renderFactory, renderToFile, routesFactory, scanRoutes, sortRoutes, spinnerFactory, typeboxLiteralText, vitePlugins, withSpinner };\n\n//# sourceMappingURL=index.js.map","import { dirname, join, resolve } from \"node:path\";\nimport crc from \"crc/crc32\";\nimport \"tfusion\";\nimport \"ts-morph\";\nimport { access, constants, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport handlebars from \"handlebars\";\nimport \"path-to-regexp\";\nimport \"mime-types\";\nimport \"@topcli/spinner\";\n//#region ../../packages/core/pkg/generators/index.js\nvar routeRenderHelpers = () => {\n\treturn {\n\t\tpageLinkBase({ name, pathPattern, params }) {\n\t\t\treturn JSON.stringify({\n\t\t\t\tname,\n\t\t\t\tpathPattern,\n\t\t\t\tparams\n\t\t\t});\n\t\t},\n\t\tserializeParamsTupleElements: (route) => {\n\t\t\treturn route.params.schema.map((p, i) => {\n\t\t\t\tif (p.kind === \"splat\") {\n\t\t\t\t\tconst suffix = route.params.schema[i + 1] ? \"\" : \"?\";\n\t\t\t\t\treturn `${p.const + suffix}: Array<string | number>`;\n\t\t\t\t}\n\t\t\t\treturn p.kind === \"optional\" ? `${p.const}?: string | number` : `${p.const}: string | number`;\n\t\t\t}).join(\", \");\n\t\t},\n\t\tserializeParamsLiteral(route) {\n\t\t\treturn `{ ${route.params.schema.map((e) => {\n\t\t\t\treturn [[e.name, e.kind === \"required\" ? \"\" : \"?\"].join(\"\"), e.kind === \"splat\" ? \"Array<string>\" : \"string\"].join(\": \");\n\t\t\t}).join(\"; \")} }`;\n\t\t}\n\t};\n};\n//#endregion\n//#region ../../packages/lib/pkg/index.js\nvar defaults$1 = {\n\tappPrefix: \"@\",\n\tsrcPrefix: \"~\",\n\tlibPrefix: \"_\",\n\tcoreDir: \"core\",\n\tsrcDir: \"src\",\n\tlibDir: \"lib\",\n\tconfigDir: \"config\",\n\tapiDir: \"api\",\n\tpagesDir: \"pages\",\n\tentryDir: \"entry\",\n\tfetchDir: \"fetch\",\n\trefineTypeName: \"VRefine\"\n};\n/**\n* Request metadata validation targets.\n* */\nvar RequestMetadataTargets$1 = {\n\tquery: \"URL query parameters\",\n\theaders: \"HTTP request headers\",\n\tcookies: \"HTTP cookies\"\n};\n/**\n* Request body validation targets.\n*\n* Body formats are mutually exclusive - only one should be specified per handler.\n*\n* **Development behavior:**\n* - If multiple formats are defined, the builder displays a warning and\n* disables validation schemas for the affected handler.\n* - If an unsuitable target is defined (e.g., `json`, `form`)\n* for a method without a body like GET, HEAD), a warning is displayed and\n* validation schemas are disabled for that handler.\n*\n* This ensures misconfigurations are detected during development\n* for runtime to execute without false positive validation failures.\n*\n* Always define exactly one target that is suitable for current handler.\n* */\nvar RequestBodyTargets$1 = {\n\tjson: \"JSON request body\",\n\tform: \"URL-encoded or Multipart form\",\n\traw: \"Raw body format (string/Buffer/ArrayBuffer/Blob)\"\n};\n({\n\t...RequestMetadataTargets$1,\n\t...RequestBodyTargets$1\n});\nvar defineGenerator = (f) => f;\nvar defineGeneratorFactory = (f) => f;\nvar pathResolver = (sourceFolder) => {\n\tconst createPath = (...a) => {\n\t\treturn sourceFolder.root ? resolve(sourceFolder.root, join(...a)) : join(...a);\n\t};\n\tconst createImport = {\n\t\tsrc(a, { origin }) {\n\t\t\treturn origin === \"src\" ? join(defaults$1.srcPrefix, ...a) : join(defaults$1.appPrefix, defaults$1.srcDir, sourceFolder.name, ...a);\n\t\t},\n\t\tapi(a, o) {\n\t\t\treturn this.src([defaults$1.apiDir, ...a], o);\n\t\t},\n\t\tpages(a, o) {\n\t\t\treturn this.src([defaults$1.pagesDir, ...a], o);\n\t\t},\n\t\tlib(a, { origin }) {\n\t\t\treturn origin === \"src\" ? join(defaults$1.libPrefix, ...a) : join(defaults$1.appPrefix, defaults$1.libDir, sourceFolder.name, ...a);\n\t\t},\n\t\tlibCore(a, o) {\n\t\t\treturn this.lib([\"core\", ...a], o);\n\t\t},\n\t\tlibApi(a, o) {\n\t\t\treturn this.lib([defaults$1.apiDir, ...a], o);\n\t\t},\n\t\tlibEntry(a, o) {\n\t\t\treturn this.lib([defaults$1.entryDir, ...a], o);\n\t\t}\n\t};\n\treturn {\n\t\tcreatePath: {\n\t\t\tsrc(...a) {\n\t\t\t\treturn createPath(defaults$1.srcDir, sourceFolder.name, ...a);\n\t\t\t},\n\t\t\tapi(...a) {\n\t\t\t\treturn this.src(defaults$1.apiDir, ...a);\n\t\t\t},\n\t\t\tpages(...a) {\n\t\t\t\treturn this.src(defaults$1.pagesDir, ...a);\n\t\t\t},\n\t\t\tentry(...a) {\n\t\t\t\treturn this.src(defaults$1.entryDir, ...a);\n\t\t\t},\n\t\t\tlib(...a) {\n\t\t\t\treturn createPath(defaults$1.libDir, sourceFolder.name, ...a);\n\t\t\t},\n\t\t\tlibCore(...a) {\n\t\t\t\treturn this.lib(\"core\", ...a);\n\t\t\t},\n\t\t\tlibApi(...a) {\n\t\t\t\treturn this.lib(defaults$1.apiDir, ...a);\n\t\t\t},\n\t\t\tlibEntry(...a) {\n\t\t\t\treturn this.lib(defaults$1.entryDir, ...a);\n\t\t\t},\n\t\t\tlibPages(...a) {\n\t\t\t\treturn this.lib(defaults$1.pagesDir, ...a);\n\t\t\t},\n\t\t\tdistDir(...a) {\n\t\t\t\treturn createPath(sourceFolder.distDir, sourceFolder.name, ...a);\n\t\t\t}\n\t\t},\n\t\tcreateImport,\n\t\tcreateImportHelpers(o) {\n\t\t\tif (![\"src\", \"lib\"].includes(o?.origin)) throw new Error(`createImportHelpers: required exactly one argument of shape { origin: \"src|lib\" }`);\n\t\t\treturn { createImport(key, ...a) {\n\t\t\t\treturn createImport[key](a.slice(0, -1), o);\n\t\t\t} };\n\t\t}\n\t};\n};\nvar pathExists = async (path) => {\n\ttry {\n\t\tawait access(path, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\nvar render = (template, context, options) => {\n\tconst { noEscape = true, renderer = handlebars } = { ...options };\n\treturn renderer.compile(template, { noEscape })(context);\n};\nvar renderToFile = async (file, template, context, options) => {\n\tconst content = render(template, context, options);\n\t/**\n\t* Two fs calls (exists + read) are worth it to avoid touching the file\n\t* and triggering watchers unnecessarily.\n\t* */\n\tif (await pathExists(file)) {\n\t\tconst { overwrite = true } = { ...options };\n\t\tif (overwrite === false) return;\n\t\tconst fileContent = await readFile(file, \"utf8\");\n\t\tif (typeof overwrite === \"function\" && !overwrite(fileContent)) return;\n\t\tif (crc(content) === crc(fileContent)) return;\n\t}\n\tawait mkdir(dirname(file), { recursive: true });\n\tawait writeFile(file, content, \"utf8\");\n};\nvar renderFactory = (options) => {\n\tconst createRenderer = (selfOoptions) => {\n\t\tconst renderer = handlebars.create();\n\t\trenderer.registerPartial({\n\t\t\t...options?.partials,\n\t\t\t...selfOoptions?.partials\n\t\t});\n\t\trenderer.registerHelper({\n\t\t\t...options?.helpers,\n\t\t\t...selfOoptions?.helpers\n\t\t});\n\t\treturn renderer;\n\t};\n\treturn {\n\t\trender(template, context, selfOoptions) {\n\t\t\treturn render(template, context, {\n\t\t\t\t...options,\n\t\t\t\t...selfOoptions,\n\t\t\t\trenderer: createRenderer(selfOoptions)\n\t\t\t});\n\t\t},\n\t\tasync renderToFile(file, template, context, selfOoptions) {\n\t\t\treturn renderToFile(options?.outdir ? join(options.outdir, file) : file, template, context, {\n\t\t\t\t...options,\n\t\t\t\t...selfOoptions,\n\t\t\t\trenderer: createRenderer(selfOoptions)\n\t\t\t});\n\t\t}\n\t};\n};\n`${defaults$1.apiDir}`, `${defaults$1.apiDir}`, `${defaults$1.pagesDir}`, `${defaults$1.pagesDir}`;\nvar package_default = {\n\ttype: \"module\",\n\t\"private\": true,\n\tname: \"@kosmojs/core-generator\",\n\tversion: \"0.1.0\",\n\tauthor: \"Slee Woo\",\n\tlicense: \"MIT\",\n\tfiles: [\"pkg/*\"],\n\timports: { \"#templates/*\": \"./src/templates/*\" },\n\texports: { \".\": {\n\t\t\"types\": \"./pkg/index.d.ts\",\n\t\t\"default\": \"./pkg/index.js\"\n\t} },\n\tscripts: { \"build\": \"wsbuild src/index.ts\" },\n\tdevDependencies: {\n\t\t\"@kosmojs/core\": \"workspace:^\",\n\t\t\"@kosmojs/lib\": \"workspace:^\",\n\t\t\"path-to-regexp\": \"^8.4.2\"\n\t}\n};\n//#endregion\n//#region src/templates/core/config.ts?raw\nvar config_default = \"export const base = \\\"{{config.base}}\\\";\\nexport const apiBase = \\\"{{config.apiBase}}\\\";\\n\";\n//#endregion\n//#region src/templates/core/index.hbs?raw\nvar core_default = \"export * from \\\"./config\\\";\\nexport * from \\\"./routeMap\\\";\\n\";\n//#endregion\n//#region src/templates/core/pathMapper.ts?raw\nvar pathMapper_default = \"import { compile } from \\\"path-to-regexp\\\";\\n\\nimport type { PathMapperSignature } from \\\"@kosmojs/core\\\";\\nimport { createHost, join, stringify } from \\\"@kosmojs/core/fetch\\\";\\n\\nexport const pathMapper = <ParamsT extends readonly unknown[]>(\\n basePath: string,\\n routeName: string,\\n pathPattern: string,\\n paramsMap: Array<[name: string, kind: string]>,\\n numericParams: Array<string>,\\n): PathMapperSignature<ParamsT> => {\\n const toPath = compile(pathPattern);\\n\\n const castParam = (name: string, value: unknown) => {\\n if (numericParams.includes(name)) {\\n const n = Number(value);\\n return Number.isFinite(n) ? n : String(value);\\n }\\n return String(value);\\n };\\n\\n const paramsMapper: PathMapperSignature<ParamsT>[\\\"paramsMapper\\\"] = (\\n params,\\n ) => {\\n return paramsMap.reduce<Record<string, unknown>>((map, [name, kind], i) => {\\n if (kind === \\\"splat\\\") {\\n if (Array.isArray(params[i]) && params[i].length) {\\n map[name] = params[i].map((v) => castParam(name, v));\\n }\\n } else if (params[i] !== undefined) {\\n map[name] = castParam(name, params[i]);\\n }\\n return map;\\n }, {});\\n };\\n\\n const parametrize: PathMapperSignature<ParamsT>[\\\"parametrize\\\"] = (params) => {\\n try {\\n return toPath(paramsMapper(params) as never);\\n } catch (error) {\\n console.error(`❗ERROR: Failed building path for ${routeName}`);\\n throw error;\\n }\\n };\\n\\n const base: PathMapperSignature<ParamsT>[\\\"base\\\"] = (params, query) => {\\n const path = join(\\\"/\\\", parametrize(params));\\n return query ? [path, stringify(query)].join(\\\"?\\\") : path;\\n };\\n\\n const path: PathMapperSignature<ParamsT>[\\\"path\\\"] = (params, query) => {\\n return join(basePath, base(params, query));\\n };\\n\\n const href: PathMapperSignature<ParamsT>[\\\"href\\\"] = (host, params, query) => {\\n return createHost(host) + path(params, query);\\n };\\n\\n return {\\n paramsMapper,\\n parametrize,\\n base,\\n path,\\n href,\\n };\\n};\\n\";\n//#endregion\n//#region src/templates/core/routeMap.hbs?raw\nvar routeMap_default = \"{{> pathMapper}}\\n\\nimport { base, apiBase } from \\\"./config\\\";\\n\\n{{#if pageRoutes.length}}\\nexport type LinkProps =\\n {{#each pageRoutes}}\\n | [ \\\"{{name}}\\\", {{serializeParamsTupleElements .}} ]\\n {{/each}};\\n{{else}}\\nexport type LinkProps = never;\\n{{/if}}\\n\\nexport const apiRouteMap = {\\n {{#each apiRoutes}}\\n \\\"{{name}}\\\": pathMapper<[{{serializeParamsTupleElements .}}]>(\\n apiBase,\\n \\\"{{name}}\\\",\\n \\\"{{pathPattern}}\\\",\\n [{{#each params.schema}}[\\\"{{name}}\\\", \\\"{{kind}}\\\"], {{/each}}],\\n [{{#each numericParams}}\\\"{{.}}\\\", {{/each}}],\\n ),\\n {{/each}}\\n};\\n\\nexport const pageRouteMap = {\\n {{#each pageRoutes}}\\n \\\"{{name}}\\\": pathMapper<[{{serializeParamsTupleElements .}}]>(\\n base,\\n \\\"{{name}}\\\",\\n \\\"{{pathPattern}}\\\",\\n [{{#each params.schema}}[\\\"{{name}}\\\", \\\"{{kind}}\\\"], {{/each}}],\\n [{{#each numericParams}}\\\"{{.}}\\\", {{/each}}],\\n ),\\n {{/each}}\\n};\\n\";\n//#endregion\n//#region src/templates/env.d.ts?raw\nvar env_d_default = \"declare const KOSMO_PRODUCTION_BUILD: boolean;\\n\\n/**\\n * Enhances base TypeScript types with JSON Schema validation constraints.\\n * Allows declaring refined types that carry validation metadata for runtime\\n * schema validation while maintaining full TypeScript type safety.\\n *\\n * Useful for generating validation schemas and ensuring\\n * data conforms to specific business rules beyond basic type checking.\\n * */\\ndeclare type VRefine<\\n T extends unknown[] | number | string | object,\\n _ extends T extends unknown[]\\n ? TArrayOptions\\n : T extends number\\n ? TNumberOptions\\n : T extends string\\n ? TStringOptions\\n : TObjectOptions,\\n> = T;\\n\\n/**\\n * Type definitions inspired by and gently adapted from TypeBox.\\n * Original TypeBox created by sinclairzx81: https://github.com/sinclairzx81/typebox\\n * TypeBox is licensed under MIT: https://github.com/sinclairzx81/typebox/blob/main/license\\n *\\n * These types provide JSON Schema compatible type refinements for TypeScript.\\n * */\\ninterface TSchema {}\\n\\n// ------------------------------------------------------------------\\n// ObjectOptions\\n// ------------------------------------------------------------------\\ninterface TObjectOptions {\\n /**\\n * Defines whether additional properties are allowed beyond those explicitly defined in `properties`.\\n */\\n additionalProperties?: TSchema | boolean;\\n /**\\n * The minimum number of properties required in the object.\\n */\\n minProperties?: number;\\n /**\\n * The maximum number of properties allowed in the object.\\n */\\n maxProperties?: number;\\n /**\\n * Defines conditional requirements for properties.\\n */\\n dependencies?: Record<string, boolean | TSchema | string[]>;\\n /**\\n * Specifies properties that *must* be present if a given property is present.\\n */\\n dependentRequired?: Record<string, string[]>;\\n /**\\n * Defines schemas that apply if a specific property is present.\\n */\\n dependentSchemas?: Record<string, TSchema>;\\n /**\\n * Maps regular expressions to schemas properties matching a pattern must validate against the schema.\\n */\\n patternProperties?: Record<string, TSchema>;\\n /**\\n * A schema that all property names within the object must validate against.\\n */\\n propertyNames?: TSchema;\\n}\\n\\n// ------------------------------------------------------------------\\n// ArrayOptions\\n// ------------------------------------------------------------------\\ninterface TArrayOptions {\\n /**\\n * The minimum number of items allowed in the array.\\n */\\n minItems?: number;\\n /**\\n * The maximum number of items allowed in the array.\\n */\\n maxItems?: number;\\n /**\\n * A schema that at least one item in the array must validate against.\\n */\\n contains?: TSchema;\\n /**\\n * The minimum number of array items that must validate against the `contains` schema.\\n */\\n minContains?: number;\\n /**\\n * The maximum number of array items that may validate against the `contains` schema.\\n */\\n maxContains?: number;\\n /**\\n * An array of schemas, where each schema in `prefixItems` validates against items at corresponding positions from the beginning of the array.\\n */\\n prefixItems?: TSchema[];\\n /**\\n * If `true`, all items in the array must be unique.\\n */\\n uniqueItems?: boolean;\\n}\\n\\n// ------------------------------------------------------------------\\n// NumberOptions\\n// ------------------------------------------------------------------\\ninterface TNumberOptions {\\n /**\\n * Specifies an exclusive upper limit for the number (number must be less than this value).\\n */\\n exclusiveMaximum?: number | bigint;\\n /**\\n * Specifies an exclusive lower limit for the number (number must be greater than this value).\\n */\\n exclusiveMinimum?: number | bigint;\\n /**\\n * Specifies an inclusive upper limit for the number (number must be less than or equal to this value).\\n */\\n maximum?: number | bigint;\\n /**\\n * Specifies an inclusive lower limit for the number (number must be greater than or equal to this value).\\n */\\n minimum?: number | bigint;\\n /**\\n * Specifies that the number must be a multiple of this value.\\n */\\n multipleOf?: number | bigint;\\n}\\n\\n// ------------------------------------------------------------------\\n// StringOptions\\n// ------------------------------------------------------------------\\ntype TFormat =\\n | \\\"date-time\\\"\\n | \\\"date\\\"\\n | \\\"duration\\\"\\n | \\\"email\\\"\\n | \\\"hostname\\\"\\n | \\\"idn-email\\\"\\n | \\\"idn-hostname\\\"\\n | \\\"ipv4\\\"\\n | \\\"ipv6\\\"\\n | \\\"iri-reference\\\"\\n | \\\"iri\\\"\\n | \\\"json-pointer-uri-fragment\\\"\\n | \\\"json-pointer\\\"\\n | \\\"json-string\\\"\\n | \\\"regex\\\"\\n | \\\"relative-json-pointer\\\"\\n | \\\"time\\\"\\n | \\\"uri-reference\\\"\\n | \\\"uri-template\\\"\\n | \\\"url\\\"\\n | \\\"uuid\\\";\\n\\ninterface TStringOptions {\\n /**\\n * Specifies the expected string format.\\n *\\n * Common values include:\\n * - `base64` – Base64-encoded string.\\n * - `date-time` – [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time format.\\n * - `date` – [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date (YYYY-MM-DD).\\n * - `duration` – [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) duration format.\\n * - `email` – RFC 5321/5322 compliant email address.\\n * - `hostname` – RFC 1034/1035 compliant host name.\\n * - `idn-email` – Internationalized email address.\\n * - `idn-hostname` – Internationalized host name.\\n * - `ipv4` – IPv4 address.\\n * - `ipv6` – IPv6 address.\\n * - `iri` / `iri-reference` – Internationalized Resource Identifier.\\n * - `json-pointer` / `json-pointer-uri-fragment` – JSON Pointer format.\\n * - `json-string` – String containing valid JSON.\\n * - `regex` – Regular expression syntax.\\n * - `relative-json-pointer` – Relative JSON Pointer format.\\n * - `time` – [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) time (HH:MM:SS).\\n * - `uri-reference` / `uri-template` – URI reference or template.\\n * - `url` – Web URL format.\\n * - `uuid` – RFC 4122 UUID string.\\n *\\n * May also be a custom format string.\\n */\\n format?: TFormat;\\n /**\\n * Specifies the minimum number of characters allowed in the string.\\n * Must be a non-negative integer.\\n */\\n minLength?: number;\\n /**\\n * Specifies the maximum number of characters allowed in the string.\\n * Must be a non-negative integer.\\n */\\n maxLength?: number;\\n /**\\n * Specifies a regular expression pattern that the string value must match.\\n * Can be provided as a string (ECMA-262 regex syntax) or a `RegExp` object.\\n */\\n pattern?: string | RegExp;\\n}\\n\";\n//#endregion\n//#region src/templates/gitignore.hbs?raw\nvar gitignore_default = \"# Ignore all files\\n*\\n\\n# But don't ignore directories (so Git can traverse them)\\n!*/\\n\\n# And don't ignore these files at any depth\\n!cache.json\\n!types.ts\\n\";\n//#endregion\n//#region src/templates/schemas.hbs?raw\nvar schemas_default = \"// stub schemas, specialized generators supposed to overwrite this file\\nimport type { ValidationSchemas } from \\\"@kosmojs/core/api\\\";\\nexport type { ValidationSchemas };\\nexport const validationSchemas: ValidationSchemas = {};\\n\";\n//#endregion\n//#region ../../packages/core/pkg/index.js\nvar defaults = {\n\tappPrefix: \"@\",\n\tsrcPrefix: \"~\",\n\tlibPrefix: \"_\",\n\tcoreDir: \"core\",\n\tsrcDir: \"src\",\n\tlibDir: \"lib\",\n\tconfigDir: \"config\",\n\tapiDir: \"api\",\n\tpagesDir: \"pages\",\n\tentryDir: \"entry\",\n\tfetchDir: \"fetch\",\n\trefineTypeName: \"VRefine\"\n};\n/**\n* Request metadata validation targets.\n* */\nvar RequestMetadataTargets = {\n\tquery: \"URL query parameters\",\n\theaders: \"HTTP request headers\",\n\tcookies: \"HTTP cookies\"\n};\n/**\n* Request body validation targets.\n*\n* Body formats are mutually exclusive - only one should be specified per handler.\n*\n* **Development behavior:**\n* - If multiple formats are defined, the builder displays a warning and\n* disables validation schemas for the affected handler.\n* - If an unsuitable target is defined (e.g., `json`, `form`)\n* for a method without a body like GET, HEAD), a warning is displayed and\n* validation schemas are disabled for that handler.\n*\n* This ensures misconfigurations are detected during development\n* for runtime to execute without false positive validation failures.\n*\n* Always define exactly one target that is suitable for current handler.\n* */\nvar RequestBodyTargets = {\n\tjson: \"JSON request body\",\n\tform: \"URL-encoded or Multipart form\",\n\traw: \"Raw body format (string/Buffer/ArrayBuffer/Blob)\"\n};\n({\n\t...RequestMetadataTargets,\n\t...RequestBodyTargets\n});\n//#endregion\n//#region src/tsconfig.ts\nvar generateTsconfig = (sourceFolder) => {\n\tconst rootDir = \"${configDir}\";\n\tconst compilerOptions = {\n\t\ttypes: [\"@types/node\", \"vite/client\"],\n\t\tmoduleResolution: \"bundler\",\n\t\tmodule: \"ESNext\",\n\t\ttarget: \"ESNext\",\n\t\tstrict: true,\n\t\texactOptionalPropertyTypes: true,\n\t\tnoImplicitAny: true,\n\t\tnoImplicitThis: true,\n\t\tnoImplicitOverride: true,\n\t\tnoImplicitReturns: true,\n\t\tnoUnusedLocals: false,\n\t\tnoUnusedParameters: false,\n\t\tallowArbitraryExtensions: true,\n\t\tallowImportingTsExtensions: true,\n\t\tallowUnreachableCode: false,\n\t\tallowUnusedLabels: false,\n\t\tuseUnknownInCatchVariables: true,\n\t\tnoFallthroughCasesInSwitch: true,\n\t\tnoUncheckedSideEffectImports: true,\n\t\tresolveJsonModule: true,\n\t\tesModuleInterop: true,\n\t\tverbatimModuleSyntax: true,\n\t\tskipLibCheck: true,\n\t\tnoEmit: true\n\t};\n\tif (sourceFolder) return {\n\t\tinclude: [\n\t\t\t`${rootDir}/`,\n\t\t\t`${rootDir}/../../${defaults.libDir}/${sourceFolder}/`,\n\t\t\t`${rootDir}/../../**/*.d.ts`\n\t\t],\n\t\tcompilerOptions: {\n\t\t\t...compilerOptions,\n\t\t\ttypes: [...compilerOptions.types],\n\t\t\tpaths: {\n\t\t\t\t[`${defaults.appPrefix}/*`]: [`${rootDir}/../../*`],\n\t\t\t\t[`${defaults.srcPrefix}/*`]: [`${rootDir}/*`],\n\t\t\t\t[`${defaults.libPrefix}/*`]: [`${rootDir}/../../${defaults.libDir}/${sourceFolder}/*`]\n\t\t\t},\n\t\t\tjsx: \"preserve\"\n\t\t}\n\t};\n\treturn {\n\t\tinclude: [`${rootDir}/`],\n\t\texclude: [`${rootDir}/${defaults.srcDir}/`],\n\t\tcompilerOptions: {\n\t\t\t...compilerOptions,\n\t\t\tpaths: { [`${defaults.appPrefix}/*`]: [`${rootDir}/*`] }\n\t\t}\n\t};\n};\n//#endregion\n//#region src/index.ts\nvar factory = defineGeneratorFactory((meta, sourceFolder) => {\n\tconst { createPath, createImportHelpers } = pathResolver(sourceFolder);\n\tconst start = async () => {\n\t\tawait renderToFile(createPath.lib(\"../tsconfig.base.json\"), JSON.stringify(generateTsconfig(), void 0, 2), {});\n\t\t{\n\t\t\tconst tsconfig = generateTsconfig(sourceFolder.name);\n\t\t\tconst compilerOptions = {};\n\t\t\tconst types = new Set(tsconfig.compilerOptions.types || []);\n\t\t\tfor (const { meta } of sourceFolder.config.generators || []) {\n\t\t\t\tif (meta.jsxImportSource) compilerOptions.jsxImportSource = meta.jsxImportSource;\n\t\t\t\tfor (const type of meta.types || []) types.add(type);\n\t\t\t}\n\t\t\tawait renderToFile(createPath.lib(\"tsconfig.base.json\"), JSON.stringify({\n\t\t\t\t...tsconfig,\n\t\t\t\tcompilerOptions: {\n\t\t\t\t\t...tsconfig.compilerOptions,\n\t\t\t\t\t...compilerOptions,\n\t\t\t\t\ttypes: [...types.values()]\n\t\t\t\t}\n\t\t\t}, void 0, 2), {});\n\t\t}\n\t\t/**\n\t\t* expose VRefine as a global type.\n\t\t* not supposed to be overriden by generators.\n\t\t* */\n\t\tawait renderToFile(createPath.lib(\"../env.d.ts\"), env_d_default, {});\n\t\t/**\n\t\t* deploy a default gitignore file that ignore everything,\n\t\t* except cache.json files; if file exists, do not override.\n\t\t* */\n\t\tawait renderToFile(createPath.lib(\"../.gitignore\"), gitignore_default, {}, { overwrite: false });\n\t\t/**\n\t\t* deploy a stub SSG file.\n\t\t* generators that support SSG will override it as needed.\n\t\t* then SSG generator will import it and generate static files for exported routes.\n\t\t* */\n\t\tawait renderToFile(createPath.lib(\"ssg.ts\"), \"export default [];\", {});\n\t};\n\tconst generateLibFiles = async (entries) => {\n\t\tconst { renderToFile } = renderFactory({\n\t\t\thelpers: {\n\t\t\t\t...createImportHelpers({ origin: \"lib\" }),\n\t\t\t\t...routeRenderHelpers()\n\t\t\t},\n\t\t\tpartials: { pathMapper: pathMapper_default }\n\t\t});\n\t\tawait renderToFile(createPath.libCore(\"routeMap.ts\"), routeMap_default, {\n\t\t\tapiRoutes: entries.flatMap(({ kind, entry }) => {\n\t\t\t\treturn kind === \"apiRoute\" ? [entry] : [];\n\t\t\t}),\n\t\t\tpageRoutes: entries.flatMap(({ kind, entry }) => {\n\t\t\t\treturn kind === \"pageRoute\" ? [entry] : [];\n\t\t\t})\n\t\t});\n\t\tfor (const [file, template] of [[\"config.ts\", config_default], [\"index.ts\", core_default]]) await renderToFile(createPath.libCore(file), template, sourceFolder);\n\t\tfor (const { kind, entry } of entries) if (kind === \"apiRoute\") await renderToFile(createPath.libApi(dirname(entry.file), \"schemas.ts\"), schemas_default, { route: entry }, { overwrite: false });\n\t};\n\treturn {\n\t\tmeta,\n\t\toptions: void 0,\n\t\tstart,\n\t\twatch: generateLibFiles,\n\t\tbuild: generateLibFiles\n\t};\n});\n/**\n* Generates stub files required by various generators.\n* Ensures cross-generator dependencies remain resolvable\n* even if specialized generators supposed to generate these files are not installed.\n* */\nvar src_default = defineGenerator(() => {\n\tconst meta = {\n\t\tname: \"Core\",\n\t\tdependencies: { \"path-to-regexp\": package_default.devDependencies[\"path-to-regexp\"] }\n\t};\n\treturn {\n\t\tmeta,\n\t\toptions: void 0,\n\t\tfactory: (sourceFolder) => factory(meta, sourceFolder)\n\t};\n});\n//#endregion\nexport { src_default as default };\n\n//# sourceMappingURL=index.js.map","{\n \"type\": \"module\",\n \"name\": \"@kosmojs/dev\",\n \"version\": \"0.1.0\",\n \"cacheVersion\": \"001\",\n \"author\": \"Slee Woo\",\n \"license\": \"MIT\",\n \"files\": [\n \"pkg/*\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./pkg/index.d.ts\",\n \"default\": \"./pkg/index.js\"\n },\n \"./chassis\": {\n \"types\": \"./pkg/chassis.d.ts\",\n \"default\": \"./pkg/chassis.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"wsbuild src/index.ts src/chassis.ts\"\n },\n \"dependencies\": {\n \"crc\": \"^4.3.2\"\n },\n \"devDependencies\": {\n \"@kosmojs/core\": \"workspace:^\",\n \"@kosmojs/core-generator\": \"workspace:^\",\n \"@kosmojs/fetch-generator\": \"workspace:^\",\n \"@kosmojs/hono-generator\": \"workspace:^\",\n \"@kosmojs/koa-generator\": \"workspace:^\",\n \"@kosmojs/lib\": \"workspace:^\",\n \"@kosmojs/mdx-generator\": \"workspace:^\",\n \"@kosmojs/openapi-generator\": \"workspace:^\",\n \"@kosmojs/react-generator\": \"workspace:^\",\n \"@kosmojs/solid-generator\": \"workspace:^\",\n \"@kosmojs/ssg-generator\": \"workspace:^\",\n \"@kosmojs/ssr-generator\": \"workspace:^\",\n \"@kosmojs/typebox-generator\": \"workspace:^\",\n \"@kosmojs/vue-generator\": \"workspace:^\"\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\nimport type {\n RouteResolverCache,\n RouteResolverCacheFactory,\n} from \"@kosmojs/core\";\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { pathExists, pathResolver } from \"@kosmojs/lib\";\n\nexport const cacheFactory: RouteResolverCacheFactory = (\n route,\n sourceFolder,\n extraContext,\n) => {\n const cacheFile = pathResolver(sourceFolder).createPath.libApi(\n dirname(route.file),\n \"cache.json\",\n );\n\n const validateCache = async (cache: RouteResolverCache) => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(\n hash,\n await generateFileHash(resolve(sourceFolder.root, file)),\n )\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n async get(opt?: { validate?: boolean }) {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n },\n\n async set(cache) {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Record<string, number> = {};\n\n for (const file of cache.referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${sourceFolder.root}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const value = { ...cache, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(value, null, 2), \"utf8\");\n\n return value;\n },\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: object,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n","import http, { type IncomingMessage, type ServerResponse } from \"node:http\";\nimport net from \"node:net\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { build, createServer, type RunnableDevEnvironment } from \"vite\";\n\nimport {\n defaults,\n type GeneratorBase,\n type GeneratorFactoryInstance,\n type GeneratorMeta,\n type ProjectSettings,\n type ResolvedEntry,\n type SourceFolder,\n type WatcherEvent,\n} from \"@kosmojs/core\";\nimport type { DevSetup } from \"@kosmojs/core/api\";\nimport { pathResolver, routesFactory, spinnerFactory } from \"@kosmojs/lib\";\n\nimport coreGenerator from \"@kosmojs/core-generator\";\n\nimport { cacheFactory } from \"./cache\";\n\nexport default async (\n projectSettings: ProjectSettings,\n): Promise<() => Promise<void>> => {\n const { devPort, command } = projectSettings;\n\n // NOTE: initialize generators before anything else, regardless command\n for (const sourceFolder of projectSettings.sourceFolders) {\n for (const base of folderGenerators(sourceFolder)) {\n if (!base.meta?.name || typeof base.factory !== \"function\") {\n throw new Error(\n `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`,\n );\n }\n\n const factory = base.factory(sourceFolder);\n\n if (!factory.meta?.name) {\n throw new Error(\n `${sourceFolder.name}: ${base.meta.name} generator is missing meta property`,\n );\n }\n\n try {\n await factory.start?.();\n } catch (error) {\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${base.meta.name} generator failed to initialize`,\n ),\n );\n throw error;\n }\n }\n }\n\n if (command === \"build\") {\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n const { createPath } = pathResolver(sourceFolder);\n\n const resolvedRoutes = [];\n\n {\n const { resolvers } = await routesFactory(sourceFolder, cacheFactory);\n\n const spinner = spinnerFactory(\n `${sourceFolder.name}: resolving routes`,\n );\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedRoutes.push(await handler());\n }\n\n spinner.succeed(\"ready ✨\");\n }\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n await base.factory(sourceFolder).build?.(resolvedRoutes);\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n // build client\n {\n const outDir = createPath.distDir(\"client\");\n\n await build({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(config.base, \"/\"),\n plugins,\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n build: {\n ...config?.build,\n outDir,\n manifest: true,\n emptyOutDir: true,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n }\n\n // build backend\n const apiGenerator = generators.find((e) => e.meta.slot === \"api\");\n\n if (apiGenerator) {\n const dir = createPath.distDir(\"api\");\n\n const noExternal = Array.isArray(apiGenerator.options?.noExternal)\n ? apiGenerator.options.noExternal\n : generators.flatMap(({ meta }) => {\n return Object.keys({\n ...meta.dependencies,\n ...meta.devDependencies,\n });\n });\n\n await build({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n plugins: [...(apiGenerator.plugins?.(sourceFolder, command) || [])],\n define: {\n ...config.define,\n KOSMO_PRODUCTION_BUILD: \"true\",\n },\n ssr: { noExternal },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n conditions: [\"node\"],\n },\n build: {\n ssr: true,\n target: \"esnext\",\n sourcemap: true,\n emptyOutDir: true,\n rolldownOptions: {\n input: [createPath.api(\"app.ts\"), createPath.api(\"server.ts\")],\n output: {\n dir,\n format: \"esm\",\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n }\n\n for (const base of generators) {\n await base.factory(sourceFolder).postBuild?.(resolvedRoutes);\n }\n }\n\n return async () => {};\n }\n\n type RequestMatcher = (req: IncomingMessage) => boolean;\n type RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\n const requestHandlers: Array<\n [\n segments: [base: string, api?: string],\n matcherFactory: () => RequestMatcher,\n handlerFactory: () => RequestHandler,\n ]\n > = [];\n\n const teardownHandlers: Array<() => Promise<unknown>> = [];\n\n const eventMap: Record<string, Awaited<ReturnType<typeof eventFactory>>> = {};\n\n // WARN: call this before starting any server!\n for (const sourceFolder of projectSettings.sourceFolders) {\n eventMap[sourceFolder.name] = await eventFactory(sourceFolder);\n }\n\n let port = await findFreePort(devPort);\n\n // start client servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n const { createPath } = pathResolver(sourceFolder);\n const requestMatchers = matchersFactory(sourceFolder);\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n const viteServer = await createServer({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(config.base, \"/\"),\n plugins,\n server: {\n ...config.server,\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n define: {\n ...config.define,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, handler);\n }\n\n requestHandlers.push([\n [sourceFolder.config.base],\n () => requestMatchers.base,\n () => viteServer.middlewares,\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n // start backend servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n if (!folderGenerators(sourceFolder).find((e) => e.meta.slot === \"api\")) {\n continue;\n }\n\n const { createPath } = pathResolver(sourceFolder);\n\n const requestMatchers = matchersFactory(sourceFolder);\n\n const viteServer = await createServer({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n server: {\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: { tsconfigPaths: true },\n define: {\n ...config?.define,\n KOSMO_PRODUCTION_BUILD: \"false\",\n },\n environments: {\n api: {\n resolve: {\n conditions: [\"node\"],\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n\n const env = viteServer.environments.api as RunnableDevEnvironment;\n\n const loadDevSetup = async () => {\n env.runner.clearCache();\n return env.runner\n .import<{ default: DevSetup }>(join(defaults.apiDir, \"dev.ts\"))\n .then((e) => e.default);\n };\n\n let devSetup = await loadDevSetup();\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, async (file) => {\n const mods = env.moduleGraph.getModulesByFile(file);\n if (mods?.size) {\n await handler(file);\n await devSetup?.teardownHandler?.();\n devSetup = await loadDevSetup();\n }\n });\n }\n\n requestHandlers.push([\n [sourceFolder.config.base, sourceFolder.config.apiBase],\n () => devSetup.requestMatcher || requestMatchers.api,\n () => devSetup.requestHandler(),\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n /**\n * Sorting is essential to ensure more specific paths are matched before broader ones.\n *\n * Given source folders:\n * - main app: baseurl=/ apiurl=/api\n * - admin app: baseurl=/admin apiurl=/admin/api\n *\n * Correct sort order:\n * 1. /admin/api — most specific\n * 2. /api\n * 3. /admin\n * 4. /\n * */\n const requestHandlerWeight = ([\n segments,\n ]: (typeof requestHandlers)[number]) => {\n const [base, api] = segments;\n /**\n * set weight to number of non-empty segments:\n * \"/\" weight is 0\n * \"/admin\" weight is 1\n * */\n const weight = base.split(\"/\").filter(Boolean).length;\n return api ? weight + 5 : weight;\n };\n\n const handlers = requestHandlers.sort(\n (a, b) => requestHandlerWeight(b) - requestHandlerWeight(a),\n );\n\n const httpServer = http.createServer((req, res) => {\n for (const [, matcherFactory, handlerFactory] of handlers) {\n // should be called on every request\n const [matcher, handler] = [matcherFactory(), handlerFactory()];\n if (matcher(req)) {\n handler(req, res);\n return;\n }\n }\n res.writeHead(404, { \"Content-Type\": \"text/html\" });\n res.end(\"<h1>404: Not Found</h1>\");\n });\n\n httpServer.on(\"error\", (error) => {\n console.error(\n styleText(\"red\", `Failed to start dev server on port ${devPort}`),\n );\n console.error(error.message);\n process.exit(1);\n });\n\n httpServer.listen(devPort);\n\n teardownHandlers.push(async () => {\n httpServer.close();\n });\n\n return async () => {\n for (const handler of teardownHandlers) {\n await handler();\n }\n // Let chokidar fully release file handles\n await new Promise((resolve) => setTimeout(resolve, 100));\n };\n};\n\nconst cacheDir = (\n { root, name }: SourceFolder,\n command: ProjectSettings[\"command\"],\n mode: \"client\" | \"backend\",\n) => {\n return resolve(root, `var/.vite/${name}/${command}/${mode}`);\n};\n\nconst folderGenerators = (sourceFolder: SourceFolder): Array<GeneratorBase> => {\n const { generators = [] } = sourceFolder.config;\n\n const coreGenerators: Partial<\n Record<NonNullable<GeneratorMeta[\"slot\"]>, GeneratorBase>\n > = {};\n\n const userGenerators: Array<GeneratorBase> = [];\n\n for (const base of generators) {\n if (base.meta.slot) {\n coreGenerators[base.meta.slot] = base;\n } else {\n userGenerators.push(base);\n }\n }\n\n return [\n // core generator should run first\n coreGenerator(),\n // then api generator\n ...(coreGenerators.api ? [coreGenerators.api] : []),\n // then fetch generator, only if api generator also enabled\n ...(coreGenerators.fetch && coreGenerators.api\n ? [coreGenerators.fetch]\n : []),\n // then user generators in the order they were added\n ...userGenerators,\n // then ssr generator should run after user generators\n ...(coreGenerators.ssr ? [coreGenerators.ssr] : []),\n // and ssg generator should run last\n ...(coreGenerators.ssg ? [coreGenerators.ssg] : []),\n ];\n};\n\nconst eventFactory = async (\n sourceFolder: SourceFolder,\n): Promise<\n Record<\"add\" | \"change\" | \"unlink\", (f: string) => Promise<void>>\n> => {\n const { resolvers, resolversFactory } = await routesFactory(\n sourceFolder,\n cacheFactory,\n );\n\n const { createPath } = pathResolver(sourceFolder);\n\n const generators: Array<{\n name: string | undefined;\n factory: GeneratorFactoryInstance;\n }> = [];\n\n for (const base of folderGenerators(sourceFolder)) {\n const factory = base.factory(sourceFolder);\n generators.push({ name: base.meta.name, factory });\n }\n\n const resolvedRoutes = new Map<\n string, // fileFullpath\n ResolvedEntry\n >();\n\n const runGenerators = async (event?: WatcherEvent) => {\n /**\n * Watch handlers receive the full list of entries\n * and should process only those whose source file or dependencies were updated.\n * */\n const entries = Array.from(resolvedRoutes.values());\n\n for (const { name, factory } of generators) {\n try {\n await factory.watch?.(entries, event);\n } catch (error) {\n console.error(\n styleText(\"red\", `${sourceFolder.name}: ${name} generator failed`),\n );\n if (event) {\n console.error(event);\n }\n console.error(error);\n }\n }\n };\n\n const updateResolvedEntry = async (file: string) => {\n const resolver = resolvers.get(file);\n\n if (!resolver) {\n return;\n }\n\n try {\n const resolvedEntry = await resolver.handler(file);\n resolvedRoutes.set(resolvedEntry.entry.fileFullpath, resolvedEntry);\n return resolvedEntry;\n } catch (error) {\n const route = file.replace(`${createPath.api()}/`, \"\");\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${route} route resolution failed`,\n ),\n );\n console.error(error);\n return;\n }\n };\n\n {\n const spinner = spinnerFactory(`${sourceFolder.name}: resolving routes`);\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`,\n );\n const route = await handler();\n resolvedRoutes.set(route.entry.fileFullpath, route);\n }\n spinner.succeed(\"ready ✨\");\n }\n\n // NOTE: call only after routes resolved\n await runGenerators();\n\n return {\n async add(file: string) {\n const [resolver] = resolversFactory([file]).values();\n\n if (!resolver) {\n return;\n }\n\n resolvers.set(file, resolver);\n\n // call only after `resolvers.set(file)`\n const resolvedEntry = await updateResolvedEntry(file);\n\n if (resolvedEntry) {\n await runGenerators({ kind: \"create\", file });\n }\n },\n\n async change(file: string) {\n if (resolvedRoutes.has(file)) {\n // route updated\n await updateResolvedEntry(file);\n } else {\n // updating entries that are referencing updated file\n const relatedRoutes = resolvedRoutes\n .values()\n .flatMap(({ kind, entry }) => {\n return kind === \"apiRoute\"\n ? entry.referencedFiles.includes(file)\n ? [entry]\n : []\n : [];\n });\n\n for (const route of relatedRoutes) {\n await updateResolvedEntry(route.fileFullpath);\n }\n }\n\n await runGenerators({ kind: \"update\", file });\n },\n\n async unlink(file) {\n // route deleted\n resolvers.delete(file);\n resolvedRoutes.delete(file);\n await runGenerators({ kind: \"delete\", file });\n },\n };\n};\n\nconst matchersFactory: (\n sourceFolder: SourceFolder,\n) => Record<\"base\" | \"api\", (req: IncomingMessage) => boolean> = ({\n config,\n}) => {\n const basePattern = new RegExp(`^${config.base}($|/*)`);\n const apiPattern = new RegExp(`^${join(config.base, config.apiBase)}($|/*)`);\n return {\n base(req) {\n return apiPattern.test(req.url as string)\n ? false\n : basePattern.test(req.url as string);\n },\n api(req) {\n return apiPattern.test(req.url as string);\n },\n };\n};\n\nconst findFreePort = async (devPort: number): Promise<number> => {\n let minPort = 0;\n let maxPort = 0;\n\n for (const n of [3, 2, 1, \"\"]) {\n minPort = Number(`${n}${devPort}`) + 100;\n maxPort = minPort + 100;\n if (maxPort < 65000) {\n break;\n }\n }\n\n if (maxPort >= 65000) {\n throw new Error(\"the devPort in package.json should be less than 64000\");\n }\n\n const range = maxPort - minPort + 1;\n const startOffset = Math.floor(Math.random() * range);\n\n const ports = Array.from({ length: range }, (_, i) => {\n return minPort + ((startOffset + i) % range);\n });\n\n const freePort = await ports.reduce(\n async (prevPromise, port) => {\n const freePort = await prevPromise;\n if (freePort) {\n return freePort;\n }\n const isFree = await isPortFree(port);\n return isFree ? port : undefined;\n },\n Promise.resolve(undefined as number | undefined),\n );\n\n if (!freePort) {\n throw new Error(`No free ports found in range ${minPort}-${maxPort}`);\n }\n\n return freePort;\n};\n\nconst isPortFree = (port: number): Promise<boolean> => {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n server.once(\"error\", () => resolve(false));\n\n server.once(\"listening\", () => {\n server.close();\n resolve(true);\n });\n\n server.listen(port, \"127.0.0.1\");\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"chassis.js","names":[],"sources":["../package.json","../src/cache.ts","../src/chassis.ts"],"sourcesContent":["{\n \"type\": \"module\",\n \"name\": \"@kosmojs/dev\",\n \"version\": \"0.1.5\",\n \"cacheVersion\": \"001\",\n \"author\": \"Slee Woo\",\n \"license\": \"MIT\",\n \"files\": [\n \"pkg/*\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./pkg/index.d.ts\",\n \"default\": \"./pkg/index.js\"\n },\n \"./chassis\": {\n \"types\": \"./pkg/chassis.d.ts\",\n \"default\": \"./pkg/chassis.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"wsbuild src/index.ts src/chassis.ts\"\n },\n \"dependencies\": {\n \"@kosmojs/core\": \"workspace:^\",\n \"@kosmojs/core-generator\": \"workspace:^\",\n \"@kosmojs/fetch-generator\": \"workspace:^\",\n \"@kosmojs/hono-generator\": \"workspace:^\",\n \"@kosmojs/koa-generator\": \"workspace:^\",\n \"@kosmojs/lib\": \"workspace:^\",\n \"@kosmojs/mdx-generator\": \"workspace:^\",\n \"@kosmojs/openapi-generator\": \"workspace:^\",\n \"@kosmojs/react-generator\": \"workspace:^\",\n \"@kosmojs/solid-generator\": \"workspace:^\",\n \"@kosmojs/ssg-generator\": \"workspace:^\",\n \"@kosmojs/ssr-generator\": \"workspace:^\",\n \"@kosmojs/typebox-generator\": \"workspace:^\",\n \"@kosmojs/vue-generator\": \"workspace:^\",\n \"crc\": \"^4.3.2\",\n \"vite\": \"^8.0.10\"\n }\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\nimport type {\n RouteResolverCache,\n RouteResolverCacheFactory,\n} from \"@kosmojs/core\";\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { pathExists, pathResolver } from \"@kosmojs/lib\";\n\nexport const cacheFactory: RouteResolverCacheFactory = (\n route,\n sourceFolder,\n extraContext,\n) => {\n const cacheFile = pathResolver(sourceFolder).createPath.libApi(\n dirname(route.file),\n \"cache.json\",\n );\n\n const validateCache = async (cache: RouteResolverCache) => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(\n hash,\n await generateFileHash(resolve(sourceFolder.root, file)),\n )\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n async get(opt?: { validate?: boolean }) {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n },\n\n async set(cache) {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Record<string, number> = {};\n\n for (const file of cache.referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${sourceFolder.root}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const value = { ...cache, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(value, null, 2), \"utf8\");\n\n return value;\n },\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: object,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n","import http, { type IncomingMessage, type ServerResponse } from \"node:http\";\nimport net from \"node:net\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { build, createServer, type RunnableDevEnvironment } from \"vite\";\n\nimport {\n defaults,\n type GeneratorBase,\n type GeneratorFactoryInstance,\n type GeneratorMeta,\n type ProjectSettings,\n type ResolvedEntry,\n type SourceFolder,\n type WatcherEvent,\n} from \"@kosmojs/core\";\nimport type { DevSetup } from \"@kosmojs/core/api\";\nimport { pathResolver, routesFactory, spinnerFactory } from \"@kosmojs/lib\";\n\nimport coreGenerator from \"@kosmojs/core-generator\";\n\nimport { cacheFactory } from \"./cache\";\n\nexport default async (\n projectSettings: ProjectSettings,\n): Promise<() => Promise<void>> => {\n const { devPort, command } = projectSettings;\n\n // NOTE: initialize generators before anything else, regardless command\n for (const sourceFolder of projectSettings.sourceFolders) {\n for (const base of folderGenerators(sourceFolder)) {\n if (!base.meta?.name || typeof base.factory !== \"function\") {\n throw new Error(\n `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`,\n );\n }\n\n const factory = base.factory(sourceFolder);\n\n if (!factory.meta?.name) {\n throw new Error(\n `${sourceFolder.name}: ${base.meta.name} generator is missing meta property`,\n );\n }\n\n try {\n await factory.start?.();\n } catch (error) {\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${base.meta.name} generator failed to initialize`,\n ),\n );\n throw error;\n }\n }\n }\n\n if (command === \"build\") {\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n const { createPath } = pathResolver(sourceFolder);\n\n const resolvedRoutes = [];\n\n {\n const { resolvers } = await routesFactory(sourceFolder, cacheFactory);\n\n const spinner = spinnerFactory(\n `${sourceFolder.name}: resolving routes`,\n );\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedRoutes.push(await handler());\n }\n\n spinner.succeed(\"ready ✨\");\n }\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n await base.factory(sourceFolder).build?.(resolvedRoutes);\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n // build client\n {\n const outDir = createPath.distDir(\"client\");\n\n await build({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(config.base, \"/\"),\n plugins,\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n build: {\n ...config?.build,\n outDir,\n manifest: true,\n emptyOutDir: true,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n }\n\n // build backend\n const apiGenerator = generators.find((e) => e.meta.slot === \"api\");\n\n if (apiGenerator) {\n const dir = createPath.distDir(\"api\");\n\n const externalizeOptions = apiGenerator.options\n ? Object.entries(apiGenerator.options).flatMap(([k, v]) => {\n return k === \"external\" || k === \"noExternal\" ? [[k, v]] : [];\n })\n : [];\n\n await build({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n plugins: [...(apiGenerator.plugins?.(sourceFolder, command) || [])],\n define: {\n ...config.define,\n KOSMO_PRODUCTION_BUILD: \"true\",\n },\n ssr: externalizeOptions.length\n ? Object.fromEntries(externalizeOptions)\n : { external: true },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n conditions: [\"node\"],\n },\n build: {\n ssr: true,\n target: \"esnext\",\n sourcemap: true,\n emptyOutDir: true,\n rolldownOptions: {\n input: [createPath.api(\"app.ts\"), createPath.api(\"server.ts\")],\n output: {\n dir,\n format: \"esm\",\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n }\n\n for (const base of generators) {\n await base.factory(sourceFolder).postBuild?.(resolvedRoutes);\n }\n }\n\n return async () => {};\n }\n\n type RequestMatcher = (req: IncomingMessage) => boolean;\n type RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\n const requestHandlers: Array<\n [\n segments: [base: string, api?: string],\n matcherFactory: () => RequestMatcher,\n handlerFactory: () => RequestHandler,\n ]\n > = [];\n\n const teardownHandlers: Array<() => Promise<unknown>> = [];\n\n const eventMap: Record<string, Awaited<ReturnType<typeof eventFactory>>> = {};\n\n // WARN: call this before starting any server!\n for (const sourceFolder of projectSettings.sourceFolders) {\n eventMap[sourceFolder.name] = await eventFactory(sourceFolder);\n }\n\n let port = await findFreePort(devPort);\n\n // start client servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n const { createPath } = pathResolver(sourceFolder);\n const requestMatchers = matchersFactory(sourceFolder);\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n const viteServer = await createServer({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(config.base, \"/\"),\n plugins,\n server: {\n ...config.server,\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n define: {\n ...config.define,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, handler);\n }\n\n requestHandlers.push([\n [sourceFolder.config.base],\n () => requestMatchers.base,\n () => viteServer.middlewares,\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n // start backend servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n if (!folderGenerators(sourceFolder).find((e) => e.meta.slot === \"api\")) {\n continue;\n }\n\n const { createPath } = pathResolver(sourceFolder);\n\n const requestMatchers = matchersFactory(sourceFolder);\n\n const viteServer = await createServer({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n server: {\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: { tsconfigPaths: true },\n define: {\n ...config?.define,\n KOSMO_PRODUCTION_BUILD: \"false\",\n },\n environments: {\n api: {\n resolve: {\n conditions: [\"node\"],\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n\n const env = viteServer.environments.api as RunnableDevEnvironment;\n\n const loadDevSetup = async () => {\n env.runner.clearCache();\n return env.runner\n .import<{ default: DevSetup }>(join(defaults.apiDir, \"dev.ts\"))\n .then((e) => e.default);\n };\n\n let devSetup = await loadDevSetup();\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, async (file) => {\n const mods = env.moduleGraph.getModulesByFile(file);\n if (mods?.size) {\n await handler(file);\n await devSetup?.teardownHandler?.();\n devSetup = await loadDevSetup();\n }\n });\n }\n\n requestHandlers.push([\n [sourceFolder.config.base, sourceFolder.config.apiBase],\n () => devSetup.requestMatcher || requestMatchers.api,\n () => devSetup.requestHandler(),\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n /**\n * Sorting is essential to ensure more specific paths are matched before broader ones.\n *\n * Given source folders:\n * - main app: baseurl=/ apiurl=/api\n * - admin app: baseurl=/admin apiurl=/admin/api\n *\n * Correct sort order:\n * 1. /admin/api — most specific\n * 2. /api\n * 3. /admin\n * 4. /\n * */\n const requestHandlerWeight = ([\n segments,\n ]: (typeof requestHandlers)[number]) => {\n const [base, api] = segments;\n /**\n * set weight to number of non-empty segments:\n * \"/\" weight is 0\n * \"/admin\" weight is 1\n * */\n const weight = base.split(\"/\").filter(Boolean).length;\n return api ? weight + 5 : weight;\n };\n\n const handlers = requestHandlers.sort(\n (a, b) => requestHandlerWeight(b) - requestHandlerWeight(a),\n );\n\n const httpServer = http.createServer((req, res) => {\n for (const [, matcherFactory, handlerFactory] of handlers) {\n // should be called on every request\n const [matcher, handler] = [matcherFactory(), handlerFactory()];\n if (matcher(req)) {\n handler(req, res);\n return;\n }\n }\n res.writeHead(404, { \"Content-Type\": \"text/html\" });\n res.end(\"<h1>404: Not Found</h1>\");\n });\n\n httpServer.on(\"error\", (error) => {\n console.error(\n styleText(\"red\", `Failed to start dev server on port ${devPort}`),\n );\n console.error(error.message);\n process.exit(1);\n });\n\n httpServer.listen(devPort);\n\n teardownHandlers.push(async () => {\n httpServer.close();\n });\n\n return async () => {\n for (const handler of teardownHandlers) {\n await handler();\n }\n // Let chokidar fully release file handles\n await new Promise((resolve) => setTimeout(resolve, 100));\n };\n};\n\nconst cacheDir = (\n { root, name }: SourceFolder,\n command: ProjectSettings[\"command\"],\n mode: \"client\" | \"backend\",\n) => {\n return resolve(root, `var/.vite/${name}/${command}/${mode}`);\n};\n\nconst folderGenerators = (sourceFolder: SourceFolder): Array<GeneratorBase> => {\n const { generators = [] } = sourceFolder.config;\n\n const coreGenerators: Partial<\n Record<NonNullable<GeneratorMeta[\"slot\"]>, GeneratorBase>\n > = {};\n\n const userGenerators: Array<GeneratorBase> = [];\n\n for (const base of generators) {\n if (base.meta.slot) {\n coreGenerators[base.meta.slot] = base;\n } else {\n userGenerators.push(base);\n }\n }\n\n return [\n // core generator should run first\n coreGenerator(),\n // then api generator\n ...(coreGenerators.api ? [coreGenerators.api] : []),\n // then fetch generator, only if api generator also enabled\n ...(coreGenerators.fetch && coreGenerators.api\n ? [coreGenerators.fetch]\n : []),\n // then user generators in the order they were added\n ...userGenerators,\n // then ssr generator should run after user generators\n ...(coreGenerators.ssr ? [coreGenerators.ssr] : []),\n // and ssg generator should run last\n ...(coreGenerators.ssg ? [coreGenerators.ssg] : []),\n ];\n};\n\nconst eventFactory = async (\n sourceFolder: SourceFolder,\n): Promise<\n Record<\"add\" | \"change\" | \"unlink\", (f: string) => Promise<void>>\n> => {\n const { resolvers, resolversFactory } = await routesFactory(\n sourceFolder,\n cacheFactory,\n );\n\n const { createPath } = pathResolver(sourceFolder);\n\n const generators: Array<{\n name: string | undefined;\n factory: GeneratorFactoryInstance;\n }> = [];\n\n for (const base of folderGenerators(sourceFolder)) {\n const factory = base.factory(sourceFolder);\n generators.push({ name: base.meta.name, factory });\n }\n\n const resolvedRoutes = new Map<\n string, // fileFullpath\n ResolvedEntry\n >();\n\n const runGenerators = async (event?: WatcherEvent) => {\n /**\n * Watch handlers receive the full list of entries\n * and should process only those whose source file or dependencies were updated.\n * */\n const entries = Array.from(resolvedRoutes.values());\n\n for (const { name, factory } of generators) {\n try {\n await factory.watch?.(entries, event);\n } catch (error) {\n console.error(\n styleText(\"red\", `${sourceFolder.name}: ${name} generator failed`),\n );\n if (event) {\n console.error(event);\n }\n console.error(error);\n }\n }\n };\n\n const updateResolvedEntry = async (file: string) => {\n const resolver = resolvers.get(file);\n\n if (!resolver) {\n return;\n }\n\n try {\n const resolvedEntry = await resolver.handler(file);\n resolvedRoutes.set(resolvedEntry.entry.fileFullpath, resolvedEntry);\n return resolvedEntry;\n } catch (error) {\n const route = file.replace(`${createPath.api()}/`, \"\");\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${route} route resolution failed`,\n ),\n );\n console.error(error);\n return;\n }\n };\n\n {\n const spinner = spinnerFactory(`${sourceFolder.name}: resolving routes`);\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`,\n );\n const route = await handler();\n resolvedRoutes.set(route.entry.fileFullpath, route);\n }\n spinner.succeed(\"ready ✨\");\n }\n\n // NOTE: call only after routes resolved\n await runGenerators();\n\n return {\n async add(file: string) {\n const [resolver] = resolversFactory([file]).values();\n\n if (!resolver) {\n return;\n }\n\n resolvers.set(file, resolver);\n\n // call only after `resolvers.set(file)`\n const resolvedEntry = await updateResolvedEntry(file);\n\n if (resolvedEntry) {\n await runGenerators({ kind: \"create\", file });\n }\n },\n\n async change(file: string) {\n if (resolvedRoutes.has(file)) {\n // route updated\n await updateResolvedEntry(file);\n } else {\n // updating entries that are referencing updated file\n const relatedRoutes = resolvedRoutes\n .values()\n .flatMap(({ kind, entry }) => {\n return kind === \"apiRoute\"\n ? entry.referencedFiles.includes(file)\n ? [entry]\n : []\n : [];\n });\n\n for (const route of relatedRoutes) {\n await updateResolvedEntry(route.fileFullpath);\n }\n }\n\n await runGenerators({ kind: \"update\", file });\n },\n\n async unlink(file) {\n // route deleted\n resolvers.delete(file);\n resolvedRoutes.delete(file);\n await runGenerators({ kind: \"delete\", file });\n },\n };\n};\n\nconst matchersFactory: (\n sourceFolder: SourceFolder,\n) => Record<\"base\" | \"api\", (req: IncomingMessage) => boolean> = ({\n config,\n}) => {\n const basePattern = new RegExp(`^${config.base}($|/*)`);\n const apiPattern = new RegExp(`^${join(config.base, config.apiBase)}($|/*)`);\n return {\n base(req) {\n return apiPattern.test(req.url as string)\n ? false\n : basePattern.test(req.url as string);\n },\n api(req) {\n return apiPattern.test(req.url as string);\n },\n };\n};\n\nconst findFreePort = async (devPort: number): Promise<number> => {\n let minPort = 0;\n let maxPort = 0;\n\n for (const n of [3, 2, 1, \"\"]) {\n minPort = Number(`${n}${devPort}`) + 100;\n maxPort = minPort + 100;\n if (maxPort < 65000) {\n break;\n }\n }\n\n if (maxPort >= 65000) {\n throw new Error(\"the devPort in package.json should be less than 64000\");\n }\n\n const range = maxPort - minPort + 1;\n const startOffset = Math.floor(Math.random() * range);\n\n const ports = Array.from({ length: range }, (_, i) => {\n return minPort + ((startOffset + i) % range);\n });\n\n const freePort = await ports.reduce(\n async (prevPromise, port) => {\n const freePort = await prevPromise;\n if (freePort) {\n return freePort;\n }\n const isFree = await isPortFree(port);\n return isFree ? port : undefined;\n },\n Promise.resolve(undefined as number | undefined),\n );\n\n if (!freePort) {\n throw new Error(`No free ports found in range ${minPort}-${maxPort}`);\n }\n\n return freePort;\n};\n\nconst isPortFree = (port: number): Promise<boolean> => {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n server.once(\"error\", () => resolve(false));\n\n server.once(\"listening\", () => {\n server.close();\n resolve(true);\n });\n\n server.listen(port, \"127.0.0.1\");\n });\n};\n"],"mappings":"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"}