@kosmojs/dev 0.0.5 → 0.0.7

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.
Files changed (40) hide show
  1. package/package.json +34 -13
  2. package/pkg/base-plugin/routes.js +12 -11
  3. package/pkg/base-plugin/routes.js.map +3 -3
  4. package/pkg/base-plugin/worker.js +12 -11
  5. package/pkg/base-plugin/worker.js.map +3 -3
  6. package/pkg/cli/cli.js +589 -0
  7. package/pkg/cli/cli.js.map +7 -0
  8. package/pkg/cli/index.js +431 -0
  9. package/pkg/cli/index.js.map +7 -0
  10. package/pkg/cli/templates/.env +1 -0
  11. package/pkg/cli/templates/@src/api/app.hbs +32 -0
  12. package/pkg/cli/templates/@src/api/router.hbs +11 -0
  13. package/pkg/cli/templates/@src/api/server.hbs +4 -0
  14. package/pkg/cli/templates/@src/api/use.hbs +6 -0
  15. package/pkg/cli/templates/@src/config/index.hbs +2 -0
  16. package/pkg/cli/templates/@src/index.html +4 -0
  17. package/pkg/cli/templates/@src/vite.config.hbs +29 -0
  18. package/pkg/cli/templates/core/api/app.ts +6 -0
  19. package/pkg/cli/templates/core/api/env.d.ts +4 -0
  20. package/pkg/cli/templates/core/api/router.ts +6 -0
  21. package/pkg/cli/templates/core/api/server.ts +49 -0
  22. package/pkg/cli/templates/core/api/use.ts +21 -0
  23. package/pkg/cli/templates/vite.base.hbs +44 -0
  24. package/pkg/index.js +16 -13
  25. package/pkg/index.js.map +3 -3
  26. package/pkg/src/cli/base.d.ts +30 -0
  27. package/pkg/src/cli/cli.d.ts +2 -0
  28. package/pkg/src/cli/factory.d.ts +12 -0
  29. package/pkg/src/cli/index.d.ts +2 -0
  30. package/pkg/src/cli/templates/core/api/app.d.ts +3 -0
  31. package/pkg/src/cli/templates/core/api/router.d.ts +3 -0
  32. package/pkg/src/cli/templates/core/api/server.d.ts +3 -0
  33. package/pkg/src/cli/templates/core/api/use.d.ts +2 -0
  34. package/pkg/stub-generator/index.js +1 -1
  35. package/pkg/stub-generator/index.js.map +1 -1
  36. package/pkg/test/cli/create.test.d.ts +1 -0
  37. package/pkg/test/setup.d.ts +1 -0
  38. package/pkg/cli.js +0 -3
  39. package/pkg/cli.js.map +0 -7
  40. package/pkg/src/cli.d.ts +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/base-plugin/worker.ts", "../../src/base-plugin/routes.ts", "../../src/base-plugin/ast.ts", "../../src/base-plugin/cache.ts", "../../src/base-plugin/templates/resolved-types.hbs", "../../src/base-plugin/templates/types.hbs"],
4
- "sourcesContent": ["import { parentPort, workerData } from \"node:worker_threads\";\n\nimport chokidar from \"chokidar\";\nimport crc from \"crc/crc32\";\n\nimport {\n type Formatter,\n type GeneratorConstructor,\n type PluginOptionsResolved,\n pathResolver,\n type RouteResolver,\n type RouteResolverEntry,\n type WatcherEvent,\n type WatchHandler,\n} from \"@kosmojs/devlib\";\n\nimport routesFactory from \"./routes\";\nimport type { SpinnerFactory } from \"./spinner\";\n\nexport type WorkerData = Omit<\n PluginOptionsResolved,\n \"generators\" | \"formatters\"\n> & {\n generatorModules: Array<[string, unknown]>;\n formatterModules: Array<[string, unknown]>;\n};\n\nexport type WorkerSpinner = {\n id: string;\n startText: string;\n method: keyof SpinnerFactory;\n text?: string | undefined;\n};\n\nexport type WorkerError = {\n name: string;\n message: string;\n stack?: string;\n};\n\nconst {\n //\n generatorModules,\n formatterModules,\n ...restOptions\n} = workerData as WorkerData;\n\nconst generators: Array<GeneratorConstructor> = [];\nconst formatters: Array<Formatter> = [];\n\nfor (const [path, opts] of generatorModules) {\n generators.push(await import(path).then((m) => m.default(opts)));\n}\n\nfor (const [path, opts] of formatterModules) {\n formatters.push(await import(path).then((m) => m.default(opts).formatter));\n}\n\nconst resolvedOptions: PluginOptionsResolved = {\n ...restOptions,\n generators,\n formatters,\n};\n\nconst { appRoot, sourceFolder } = resolvedOptions;\n\nconst watchHandlers: Array<{ name: string; handler: WatchHandler }> = [];\n\nconst resolvedRoutes = new Map<\n string, // fileFullpath\n RouteResolverEntry\n>();\n\nconst {\n //\n resolvers,\n resolversFactory,\n resolveRouteFile,\n} = await routesFactory(resolvedOptions);\n\nconst { resolve } = pathResolver({ appRoot, sourceFolder });\n\nconst spinnerFactory = (startText: string) => {\n const id = [startText, Date.now().toString()].map(crc).join(\":\");\n\n const postMessage = (\n method: keyof SpinnerFactory,\n text?: string | undefined,\n ) => {\n const spinner: WorkerSpinner = { id, startText, method, text };\n parentPort?.postMessage({ spinner });\n };\n\n const postError = (error: Error) => {\n parentPort?.postMessage({ error: structuredClone(error) });\n };\n\n return {\n id,\n startText,\n text(text: string) {\n postMessage(\"text\", text);\n },\n append(text: string) {\n postMessage(\"append\", text);\n },\n succeed(text?: string) {\n postMessage(\"succeed\", text);\n },\n failed(error: Error) {\n postError(error);\n postMessage(\"failed\", error?.stack || error?.message);\n },\n };\n};\n\nconst createEventHandler = async (file: string) => {\n const [resolver] = resolversFactory([file]).values();\n if (resolver) {\n const spinner = spinnerFactory(`Resolving ${resolver.name} Route`);\n try {\n const resolvedRoute = await resolver.handler();\n resolvers.set(file, resolver);\n resolvedRoutes.set(resolvedRoute.route.fileFullpath, resolvedRoute);\n spinner.succeed();\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n }\n }\n};\n\nconst updateEventHandler = async (file: string) => {\n const relatedResolvers = new Map<string, RouteResolver>();\n\n if (resolvedRoutes.has(file)) {\n // some route updated\n const resolver = resolvers.get(file);\n if (resolver) {\n relatedResolvers.set(file, resolver);\n }\n } else {\n // checking if changed file is referenced by any routes\n const referencedRoutes = resolvedRoutes\n .values()\n .filter(({ kind, route }) => {\n return kind === \"api\" ? route.referencedFiles.includes(file) : false;\n });\n for (const { route } of referencedRoutes) {\n const resolver = resolvers.get(route.fileFullpath);\n if (resolver) {\n relatedResolvers.set(route.fileFullpath, resolver);\n }\n }\n }\n\n let spinner = spinnerFactory(`Updating ${relatedResolvers.size} Routes`);\n\n for (const resolver of relatedResolvers.values()) {\n spinner.append(resolver.name);\n try {\n const route = await resolver.handler(file);\n resolvedRoutes.set(route.route.fileFullpath, route);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(`Updating ${relatedResolvers.size} Routes`);\n }\n }\n\n spinner.succeed();\n};\n\nconst deleteEventHandler = async () => {\n // TODO: cleanup related files in libDir\n};\n\nconst runWatchHandlers = async (event?: WatcherEvent) => {\n let spinner = spinnerFactory(\"Running Generators\");\n\n /**\n * Watch handlers receive the full list of routes\n * and should process only those whose source file or dependencies were updated.\n */\n const routes = Array.from(resolvedRoutes.values());\n\n for (const { name, handler } of watchHandlers) {\n spinner.append(name);\n try {\n // using structuredClone to make sure no generator would alter routes\n await handler(structuredClone(routes), event);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Running Generators\");\n }\n }\n\n spinner.succeed();\n};\n\nconst watcher = chokidar.watch(\n [\n // watching for changes in sourceFolder's apiDir and pagesDir\n resolve(\"apiDir\"),\n resolve(\"pagesDir\"),\n ],\n {\n ...resolvedOptions.watcher.options,\n awaitWriteFinish:\n typeof resolvedOptions.watcher.options?.awaitWriteFinish === \"object\"\n ? resolvedOptions.watcher.options.awaitWriteFinish\n : {\n stabilityThreshold: resolvedOptions.watcher.delay,\n pollInterval: Math.floor(resolvedOptions.watcher.delay / 4),\n },\n // Do Not emit \"add\" event for existing files\n ignoreInitial: true,\n // Not using Chokidar's `ignored` option.\n // Instead, allow all events through and filter them manually as needed.\n },\n);\n\nwatcher.on(\"all\", async (event, file) => {\n if (event.endsWith(\"Dir\")) {\n // skipping folder events\n return;\n }\n\n if (!resolveRouteFile(file)) {\n // not a route file\n return;\n }\n\n const match = (\n {\n add: { handler: createEventHandler, kind: \"create\" },\n change: { handler: updateEventHandler, kind: \"update\" },\n unlink: { handler: deleteEventHandler, kind: \"delete\" },\n } as const\n )[event as string];\n\n if (match) {\n const { handler, kind } = match;\n\n /**\n * This handler is responsible for updating `resolvedRoutes`\n * before they are passed to generators.\n * */\n await handler(file);\n\n await runWatchHandlers({ kind, file });\n }\n});\n\n{\n let spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`,\n );\n try {\n const resolvedEntry = await handler();\n resolvedRoutes.set(resolvedEntry.route.fileFullpath, resolvedEntry);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Resolving Routes\");\n }\n }\n\n spinner.succeed();\n}\n\n{\n let spinner = spinnerFactory(\"Initializing Generators\");\n\n for (const { name, factory } of generators) {\n spinner.append(name);\n try {\n const { watchHandler } = await factory(resolvedOptions);\n watchHandlers.push({ name, handler: watchHandler });\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Initializing Generators\");\n }\n }\n\n spinner.succeed();\n}\n\nawait runWatchHandlers();\n\nparentPort?.postMessage(\"ready\");\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PluginOptionsResolved,\n pathResolver,\n pathTokensFactory,\n type RouteEntry,\n type RouteResolver,\n render,\n renderToFile,\n} from \"@kosmojs/devlib\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"./ast\";\nimport { cacheFactory } from \"./cache\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type Resolvers = Map<string, RouteResolver>;\n\nexport type ResolveRouteFile = (file: string) =>\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | undefined;\n\nexport type ResolversFactory = (\n routeFiles: Array<string>,\n) => Map<string, RouteResolver>;\n\nexport default async (\n pluginOptions: PluginOptionsResolved,\n): Promise<{\n resolvers: Resolvers;\n resolversFactory: ResolversFactory;\n resolveRouteFile: ResolveRouteFile;\n}> => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n const routeFilePatterns = [\n `${defaults.apiDir}/**/index.ts`,\n `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`,\n ];\n\n const resolveRouteFile: ResolveRouteFile = (file) => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return;\n }\n\n return picomatch.isMatch(join(folder, ...rest), routeFilePatterns)\n ? [folder, rest.join(\"/\")]\n : undefined;\n };\n\n const resolversFactory: ResolversFactory = (routeFiles) => {\n const resolvers = new Map<\n string, // fileFullpath\n RouteResolver\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((_file) => {\n const resolvedPaths = resolveRouteFile(_file);\n\n if (!resolvedPaths) {\n return [];\n }\n\n const [folder, file] = resolvedPaths;\n\n const fileFullpath = join(appRoot, sourceFolder, folder, file);\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n const name = pathTokens.map((e) => e.orig).join(\"/\");\n\n const importPath = dirname(file);\n\n const importName = [\n importPath\n .split(/\\[/)[0]\n .replace(/^\\W+|\\W+$/g, \"\")\n .replace(/\\W+/g, \"_\"),\n crc(importPath),\n ].join(\"_\");\n\n return [\n {\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n },\n ];\n });\n\n for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {\n const {\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { file, fileFullpath, importName, importPath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { importName, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({ appRoot, sourceFolder }).resolve(\n \"apiLibDir\",\n importPath,\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const route: ApiRoute = {\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n importName,\n importPath,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"api\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {\n const {\n //\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async () => {\n const route: PageRoute = {\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n importPath,\n importName,\n };\n\n return {\n kind: \"page\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n return resolvers;\n };\n\n const routeFiles = await glob(routeFilePatterns, {\n cwd: resolve(appRoot, sourceFolder),\n absolute: true,\n onlyFiles: true,\n ignore: [\n `${defaults.apiDir}/index.ts`,\n `${defaults.pagesDir}/index.ts{x,}`,\n ],\n });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n resolveRouteFile,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@kosmojs/devlib\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"importName\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"importName\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.importName + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.importName + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport fsx from \"fs-extra\";\n\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 { type ApiRoute, pathResolver } from \"@kosmojs/devlib\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"file\" | \"fileFullpath\" | \"importName\" | \"importPath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).resolve(\"apiLibDir\", route.importPath, \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await fsx.exists(cacheFile)) {\n try {\n const cache = JSON.parse(await fsx.readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await fsx.outputJson(cacheFile, cache, { spaces: 2 });\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\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(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await fsx.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", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n"],
5
- "mappings": "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",
6
- "names": ["crc", "pathResolver", "resolve", "crc", "pathResolver", "callExpression", "appRoot", "resolve", "crc", "appRoot", "sourceFolder", "hash", "appRoot", "sourceFolder", "generators", "formatters", "resolveRouteFile", "resolve", "resolversFactory", "routeFiles", "resolvers", "crc", "pathResolver", "resolve", "pathResolver", "crc"]
4
+ "sourcesContent": ["import { parentPort, workerData } from \"node:worker_threads\";\n\nimport chokidar from \"chokidar\";\nimport crc from \"crc/crc32\";\n\nimport {\n type Formatter,\n type GeneratorConstructor,\n type PluginOptionsResolved,\n pathResolver,\n type RouteResolver,\n type RouteResolverEntry,\n type WatcherEvent,\n type WatchHandler,\n} from \"@kosmojs/devlib\";\n\nimport routesFactory from \"./routes\";\nimport type { SpinnerFactory } from \"./spinner\";\n\nexport type WorkerData = Omit<\n PluginOptionsResolved,\n \"generators\" | \"formatters\"\n> & {\n generatorModules: Array<[string, unknown]>;\n formatterModules: Array<[string, unknown]>;\n};\n\nexport type WorkerSpinner = {\n id: string;\n startText: string;\n method: keyof SpinnerFactory;\n text?: string | undefined;\n};\n\nexport type WorkerError = {\n name: string;\n message: string;\n stack?: string;\n};\n\nconst {\n //\n generatorModules,\n formatterModules,\n ...restOptions\n} = workerData as WorkerData;\n\nconst generators: Array<GeneratorConstructor> = [];\nconst formatters: Array<Formatter> = [];\n\nfor (const [path, opts] of generatorModules) {\n generators.push(await import(path).then((m) => m.default(opts)));\n}\n\nfor (const [path, opts] of formatterModules) {\n formatters.push(await import(path).then((m) => m.default(opts).formatter));\n}\n\nconst resolvedOptions: PluginOptionsResolved = {\n ...restOptions,\n generators,\n formatters,\n};\n\nconst { appRoot, sourceFolder } = resolvedOptions;\n\nconst watchHandlers: Array<{ name: string; handler: WatchHandler }> = [];\n\nconst resolvedRoutes = new Map<\n string, // fileFullpath\n RouteResolverEntry\n>();\n\nconst {\n //\n resolvers,\n resolversFactory,\n resolveRouteFile,\n} = await routesFactory(resolvedOptions);\n\nconst { resolve } = pathResolver({ appRoot, sourceFolder });\n\nconst spinnerFactory = (startText: string) => {\n const id = [startText, Date.now().toString()].map(crc).join(\":\");\n\n const postMessage = (\n method: keyof SpinnerFactory,\n text?: string | undefined,\n ) => {\n const spinner: WorkerSpinner = { id, startText, method, text };\n parentPort?.postMessage({ spinner });\n };\n\n const postError = (error: Error) => {\n parentPort?.postMessage({ error: structuredClone(error) });\n };\n\n return {\n id,\n startText,\n text(text: string) {\n postMessage(\"text\", text);\n },\n append(text: string) {\n postMessage(\"append\", text);\n },\n succeed(text?: string) {\n postMessage(\"succeed\", text);\n },\n failed(error: Error) {\n postError(error);\n postMessage(\"failed\", error?.stack || error?.message);\n },\n };\n};\n\nconst createEventHandler = async (file: string) => {\n const [resolver] = resolversFactory([file]).values();\n if (resolver) {\n const spinner = spinnerFactory(`Resolving ${resolver.name} Route`);\n try {\n const resolvedRoute = await resolver.handler();\n resolvers.set(file, resolver);\n resolvedRoutes.set(resolvedRoute.route.fileFullpath, resolvedRoute);\n spinner.succeed();\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n }\n }\n};\n\nconst updateEventHandler = async (file: string) => {\n const relatedResolvers = new Map<string, RouteResolver>();\n\n if (resolvedRoutes.has(file)) {\n // some route updated\n const resolver = resolvers.get(file);\n if (resolver) {\n relatedResolvers.set(file, resolver);\n }\n } else {\n // checking if changed file is referenced by any routes\n const referencedRoutes = resolvedRoutes\n .values()\n .filter(({ kind, route }) => {\n return kind === \"api\" ? route.referencedFiles.includes(file) : false;\n });\n for (const { route } of referencedRoutes) {\n const resolver = resolvers.get(route.fileFullpath);\n if (resolver) {\n relatedResolvers.set(route.fileFullpath, resolver);\n }\n }\n }\n\n let spinner = spinnerFactory(`Updating ${relatedResolvers.size} Routes`);\n\n for (const resolver of relatedResolvers.values()) {\n spinner.append(resolver.name);\n try {\n const route = await resolver.handler(file);\n resolvedRoutes.set(route.route.fileFullpath, route);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(`Updating ${relatedResolvers.size} Routes`);\n }\n }\n\n spinner.succeed();\n};\n\nconst deleteEventHandler = async () => {\n // TODO: cleanup related files in libDir\n};\n\nconst runWatchHandlers = async (event?: WatcherEvent) => {\n let spinner = spinnerFactory(\"Running Generators\");\n\n /**\n * Watch handlers receive the full list of routes\n * and should process only those whose source file or dependencies were updated.\n */\n const routes = Array.from(resolvedRoutes.values());\n\n for (const { name, handler } of watchHandlers) {\n spinner.append(name);\n try {\n // using structuredClone to make sure no generator would alter routes\n await handler(structuredClone(routes), event);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Running Generators\");\n }\n }\n\n spinner.succeed();\n};\n\nconst watcher = chokidar.watch(\n [\n // watching for changes in sourceFolder's apiDir and pagesDir\n resolve(\"apiDir\"),\n resolve(\"pagesDir\"),\n ],\n {\n ...resolvedOptions.watcher.options,\n awaitWriteFinish:\n typeof resolvedOptions.watcher.options?.awaitWriteFinish === \"object\"\n ? resolvedOptions.watcher.options.awaitWriteFinish\n : {\n stabilityThreshold: resolvedOptions.watcher.delay,\n pollInterval: Math.floor(resolvedOptions.watcher.delay / 4),\n },\n // Do Not emit \"add\" event for existing files\n ignoreInitial: true,\n // Not using Chokidar's `ignored` option.\n // Instead, allow all events through and filter them manually as needed.\n },\n);\n\nwatcher.on(\"all\", async (event, file) => {\n if (event.endsWith(\"Dir\")) {\n // skipping folder events\n return;\n }\n\n if (!resolveRouteFile(file)) {\n // not a route file\n return;\n }\n\n const match = (\n {\n add: { handler: createEventHandler, kind: \"create\" },\n change: { handler: updateEventHandler, kind: \"update\" },\n unlink: { handler: deleteEventHandler, kind: \"delete\" },\n } as const\n )[event as string];\n\n if (match) {\n const { handler, kind } = match;\n\n /**\n * This handler is responsible for updating `resolvedRoutes`\n * before they are passed to generators.\n * */\n await handler(file);\n\n await runWatchHandlers({ kind, file });\n }\n});\n\n{\n let spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`,\n );\n try {\n const resolvedEntry = await handler();\n resolvedRoutes.set(resolvedEntry.route.fileFullpath, resolvedEntry);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Resolving Routes\");\n }\n }\n\n spinner.succeed();\n}\n\n{\n let spinner = spinnerFactory(\"Initializing Generators\");\n\n for (const { name, factory } of generators) {\n spinner.append(name);\n try {\n const { watchHandler } = await factory(resolvedOptions);\n watchHandlers.push({ name, handler: watchHandler });\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Initializing Generators\");\n }\n }\n\n spinner.succeed();\n}\n\nawait runWatchHandlers();\n\nparentPort?.postMessage(\"ready\");\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PluginOptionsResolved,\n pathResolver,\n pathTokensFactory,\n type RouteEntry,\n type RouteResolver,\n render,\n renderToFile,\n} from \"@kosmojs/devlib\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"./ast\";\nimport { cacheFactory } from \"./cache\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type Resolvers = Map<string, RouteResolver>;\n\nexport type ResolveRouteFile = (file: string) =>\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | undefined;\n\nexport type ResolversFactory = (\n routeFiles: Array<string>,\n) => Map<string, RouteResolver>;\n\nexport default async (\n pluginOptions: PluginOptionsResolved,\n): Promise<{\n resolvers: Resolvers;\n resolversFactory: ResolversFactory;\n resolveRouteFile: ResolveRouteFile;\n}> => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n const routeFilePatterns = [\n `${defaults.apiDir}/**/index.ts`,\n `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`,\n ];\n\n const resolveRouteFile: ResolveRouteFile = (file) => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return;\n }\n\n return picomatch.isMatch(join(folder, ...rest), routeFilePatterns)\n ? [folder, rest.join(\"/\")]\n : undefined;\n };\n\n const resolversFactory: ResolversFactory = (routeFiles) => {\n const resolvers = new Map<\n string, // fileFullpath\n RouteResolver\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((_file) => {\n const resolvedPaths = resolveRouteFile(_file);\n\n if (!resolvedPaths) {\n return [];\n }\n\n const [folder, file] = resolvedPaths;\n\n const fileFullpath = join(appRoot, sourceFolder, folder, file);\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n const name = pathTokens.map((e) => e.orig).join(\"/\");\n\n const importPath = dirname(file);\n\n const importName = [\n importPath\n .split(/\\[/)[0]\n .replace(/^\\W+|\\W+$/g, \"\")\n .replace(/\\W+/g, \"_\"),\n crc(importPath),\n ].join(\"_\");\n\n return [\n {\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n },\n ];\n });\n\n for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {\n const {\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { file, fileFullpath, importName, importPath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { importName, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({ appRoot, sourceFolder }).resolve(\n \"apiLibDir\",\n importPath,\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const route: ApiRoute = {\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n importName,\n importPath,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"api\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {\n const {\n //\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async () => {\n const route: PageRoute = {\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n importPath,\n importName,\n };\n\n return {\n kind: \"page\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n return resolvers;\n };\n\n const routeFiles = await glob(routeFilePatterns, {\n cwd: resolve(appRoot, sourceFolder),\n absolute: true,\n onlyFiles: true,\n ignore: [\n `${defaults.apiDir}/index.ts`,\n `${defaults.pagesDir}/index.ts{x,}`,\n ],\n });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n resolveRouteFile,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@kosmojs/devlib\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"importName\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"importName\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.importName + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.importName + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\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 { type ApiRoute, pathExists, pathResolver } from \"@kosmojs/devlib\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"file\" | \"fileFullpath\" | \"importName\" | \"importPath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).resolve(\"apiLibDir\", route.importPath, \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\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 const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(cache, null, 2), \"utf8\");\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\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(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\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", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n"],
5
+ "mappings": "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",
6
+ "names": ["crc", "pathResolver", "dirname", "resolve", "crc", "pathResolver", "callExpression", "appRoot", "resolve", "crc", "appRoot", "sourceFolder", "hash", "appRoot", "sourceFolder", "generators", "formatters", "resolveRouteFile", "resolve", "resolversFactory", "routeFiles", "resolvers", "dirname", "crc", "pathResolver", "resolve", "pathResolver", "crc"]
7
7
  }