@reckona/create-mreact-app 0.0.188 → 0.0.189
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.
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +9 -9
package/dist/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { basename, dirname, join, relative, resolve } from "node:path";
|
|
3
3
|
const internalPackageVersions = {
|
|
4
|
-
"@reckona/mreact-auth": "^0.0.
|
|
5
|
-
"@reckona/mreact-devtools": "^0.0.
|
|
6
|
-
"@reckona/mreact-forms": "^0.0.
|
|
7
|
-
"@reckona/mreact": "^0.0.
|
|
8
|
-
"@reckona/mreact-query": "^0.0.
|
|
9
|
-
"@reckona/mreact-reactive-core": "^0.0.
|
|
10
|
-
"@reckona/mreact-reactive-dom": "^0.0.
|
|
11
|
-
"@reckona/mreact-router": "^0.0.
|
|
12
|
-
"@reckona/mreact-test-utils": "^0.0.
|
|
4
|
+
"@reckona/mreact-auth": "^0.0.189",
|
|
5
|
+
"@reckona/mreact-devtools": "^0.0.189",
|
|
6
|
+
"@reckona/mreact-forms": "^0.0.189",
|
|
7
|
+
"@reckona/mreact": "^0.0.189",
|
|
8
|
+
"@reckona/mreact-query": "^0.0.189",
|
|
9
|
+
"@reckona/mreact-reactive-core": "^0.0.189",
|
|
10
|
+
"@reckona/mreact-reactive-dom": "^0.0.189",
|
|
11
|
+
"@reckona/mreact-router": "^0.0.189",
|
|
12
|
+
"@reckona/mreact-test-utils": "^0.0.189",
|
|
13
13
|
};
|
|
14
14
|
const currentMreactVersion = internalPackageVersions["@reckona/mreact"].replace(/^\^/, "");
|
|
15
15
|
const typescriptVersion = "^7.0.2";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\n\n/** Names the starter template used when scaffolding a new mreact app. */\nexport type CreateMreactAppTemplate = \"basic\" | \"tailwind\" | \"dashboard\";\n\n/** Names the package manager used to write install and script commands. */\nexport type CreateMreactAppPackageManager = \"pnpm\" | \"npm\" | \"bun\";\n\n/** Names the deployment target whose files are included in the generated app. */\nexport type CreateMreactAppDeployTarget = \"aws-lambda\" | \"cloudflare\" | \"container\";\n\n/** Configures the project directory, template, package manager, and deploy target for app scaffolding. */\nexport interface CreateMreactAppOptions {\n deploy?: CreateMreactAppDeployTarget | undefined;\n directory: string;\n name?: string | undefined;\n packageManager?: CreateMreactAppPackageManager | undefined;\n srcDir?: boolean | undefined;\n template?: CreateMreactAppTemplate | undefined;\n}\n\n/** Reports the generated app directory, files, package manager, template, and deploy target. */\nexport interface CreateMreactAppResult {\n deploy?: CreateMreactAppDeployTarget | undefined;\n directory: string;\n files: string[];\n packageManager: CreateMreactAppPackageManager;\n template: CreateMreactAppTemplate;\n}\n\n/** Configures an existing mreact app upgrade run. */\nexport interface UpgradeMreactAppOptions {\n directory: string;\n dryRun?: boolean | undefined;\n fromVersion?: string | undefined;\n targetVersion?: string | undefined;\n}\n\n/** Describes a package dependency version changed by an app upgrade run. */\nexport interface UpgradeMreactAppDependencyUpdate {\n field: PackageDependencyField;\n from: string;\n name: string;\n to: string;\n}\n\n/** Reports whether an upgrade codemod would be or was applied. */\nexport interface UpgradeMreactAppCodemodResult {\n applied: boolean;\n description: string;\n id: string;\n}\n\n/** Reports the package file, dependency updates, codemods, and change flag for an upgrade run. */\nexport interface UpgradeMreactAppResult {\n changed: boolean;\n codemods: UpgradeMreactAppCodemodResult[];\n packageJsonPath: string;\n updatedDependencies: UpgradeMreactAppDependencyUpdate[];\n}\n\ninterface TemplateFile {\n path: string;\n content: string;\n}\n\ninterface TemplateDefinition {\n files: TemplateFile[];\n}\n\nconst internalPackageVersions = {\n \"@reckona/mreact-auth\": \"^0.0.188\",\n \"@reckona/mreact-devtools\": \"^0.0.188\",\n \"@reckona/mreact-forms\": \"^0.0.188\",\n \"@reckona/mreact\": \"^0.0.188\",\n \"@reckona/mreact-query\": \"^0.0.188\",\n \"@reckona/mreact-reactive-core\": \"^0.0.188\",\n \"@reckona/mreact-reactive-dom\": \"^0.0.188\",\n \"@reckona/mreact-router\": \"^0.0.188\",\n \"@reckona/mreact-test-utils\": \"^0.0.188\",\n} as const satisfies Record<string, string>;\nconst currentMreactVersion = internalPackageVersions[\"@reckona/mreact\"].replace(/^\\^/, \"\");\nconst typescriptVersion = \"^7.0.2\";\nconst tailwindVersion = \"^4.3.0\";\nconst tailwindCliVersion = \"^4.3.0\";\nconst concurrentlyVersion = \"^9.2.0\";\nconst nodeTypesVersion = \"^25.7.0\";\nconst oxlintVersion = \"^1.69.0\";\nconst playwrightVersion = \"^1.60.0\";\nconst tsxVersion = \"^4.21.0\";\nconst viteVersion = \"^8.0.11\";\nconst vitestVersion = \"^4.1.8\";\nconst wranglerVersion = \"^4.100.0\";\nconst cloudflareWorkersTypesVersion = \"^4.20260522.1\";\nconst appRouterGlobalsType = \"@reckona/mreact-router/app-router-globals\";\nconst pnpmOnlyBuiltDependencies = [\"@parcel/watcher\", \"esbuild\", \"sharp\", \"workerd\"] as const;\n\n/** Scaffolds a new mreact app by writing the selected template files into the target directory. */\nexport async function createMreactApp(\n options: CreateMreactAppOptions,\n): Promise<CreateMreactAppResult> {\n const template = options.template ?? \"basic\";\n const packageManager = options.packageManager ?? \"pnpm\";\n const name = await inferPackageNameForTarget(options.directory, options.name);\n const workspacePackages = await detectWorkspacePackagesForTarget(options.directory);\n const definition = templateDefinition(\n template,\n name,\n packageManager,\n options.srcDir === true,\n options.deploy,\n workspacePackages,\n );\n\n await assertDirectoryWritable(options.directory);\n\n const files: string[] = [];\n for (const file of definition.files) {\n await writeProjectFile(options.directory, file);\n files.push(file.path);\n }\n\n return {\n directory: options.directory,\n ...(options.deploy === undefined ? {} : { deploy: options.deploy }),\n files,\n packageManager,\n template,\n };\n}\n\n/** Updates known mreact workspace dependencies and records version-gated codemods for an existing app. */\nexport async function upgradeMreactApp(\n options: UpgradeMreactAppOptions,\n): Promise<UpgradeMreactAppResult> {\n const packageJsonPath = join(options.directory, \"package.json\");\n const source = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(source) as Record<string, unknown>;\n const targetVersion = options.targetVersion ?? currentMreactVersion;\n const targetRange = `^${targetVersion}`;\n const updatedDependencies: UpgradeMreactAppDependencyUpdate[] = [];\n\n for (const field of packageDependencyFields) {\n const dependencies = packageJson[field];\n\n if (!isDependencyRecord(dependencies)) {\n continue;\n }\n\n for (const [name, from] of Object.entries(dependencies)) {\n if (!isMreactWorkspacePackage(name) || from === targetRange) {\n continue;\n }\n\n dependencies[name] = targetRange;\n updatedDependencies.push({\n field,\n from,\n name,\n to: targetRange,\n });\n }\n }\n\n const tsconfigUpdate = await appRouterGlobalsTsconfigUpdate(options.directory, packageJson);\n const codemods = createMreactAppCodemods\n .filter((codemod) => shouldRunCodemod(options.fromVersion, codemod.version, targetVersion))\n .map((codemod) => ({\n applied: options.dryRun !== true,\n description: codemod.description,\n id: codemod.id,\n }));\n const packageJsonChanged = updatedDependencies.length > 0;\n const changed = packageJsonChanged || tsconfigUpdate.changed;\n\n if (changed && options.dryRun !== true) {\n if (packageJsonChanged) {\n await writeFile(packageJsonPath, json(packageJson));\n }\n\n if (tsconfigUpdate.changed) {\n await writeFile(tsconfigUpdate.path, json(tsconfigUpdate.config));\n }\n }\n\n return {\n changed,\n codemods,\n packageJsonPath,\n updatedDependencies,\n };\n}\n\n/** Lists the templates supported by `createMreactApp()`. */\nexport const createMreactAppTemplates = [\n \"basic\",\n \"tailwind\",\n \"dashboard\",\n] as const satisfies readonly CreateMreactAppTemplate[];\n\n/** Lists the deployment targets supported by `createMreactApp()`. */\nexport const createMreactAppDeployTargets = [\n \"cloudflare\",\n \"container\",\n \"aws-lambda\",\n] as const satisfies readonly CreateMreactAppDeployTarget[];\n\n/** Lists version-gated codemods reported by `upgradeMreactApp()`. */\nexport const createMreactAppCodemods = [\n {\n description:\n \"Normalize app-router import policy examples after the 0.0.16 adapter template changes.\",\n id: \"0.0.16-import-policy-normalize\",\n version: \"0.0.16\",\n },\n {\n description:\n \"Check AWS Lambda template ESM entrypoints and package-manager production install guidance.\",\n id: \"0.0.16-aws-lambda-esm-template\",\n version: \"0.0.16\",\n },\n {\n description:\n \"Check app-router tsconfig global type declarations for Slot, Await, and generated route helpers.\",\n id: \"0.0.54-app-router-globals\",\n version: \"0.0.54\",\n },\n {\n description:\n \"Review generated app-router CSS imports and route stylesheet assumptions after automatic route CSS asset support.\",\n id: \"0.0.78-route-css-assets\",\n version: \"0.0.78\",\n },\n {\n description:\n \"Review AWS Lambda build/package scripts for generated Lambda targets, generated import policy, and minimal asset packaging.\",\n id: \"0.0.120-aws-lambda-generated-package\",\n version: \"0.0.120\",\n },\n {\n description:\n \"Review starter pages that still render static hello content; current basic and Tailwind starters use a small interactive cell counter.\",\n id: \"0.0.148-interactive-counter-starter\",\n version: \"0.0.148\",\n },\n] as const;\n\n/** Names package.json dependency sections that can contain mreact workspace packages. */\nexport type PackageDependencyField =\n | \"dependencies\"\n | \"devDependencies\"\n | \"peerDependencies\"\n | \"optionalDependencies\";\n\nconst packageDependencyFields = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n] as const satisfies readonly PackageDependencyField[];\n\nfunction templateDefinition(\n template: CreateMreactAppTemplate,\n name: string,\n packageManager: CreateMreactAppPackageManager,\n srcDir: boolean,\n deploy: CreateMreactAppDeployTarget | undefined,\n workspacePackages: ReadonlySet<string>,\n): TemplateDefinition {\n // `cloudflare` is a deploy target, orthogonal to the app-content template.\n const cloudflare = deploy === \"cloudflare\";\n\n if (template === \"tailwind\") {\n return appRouterTemplate(name, packageManager, workspacePackages, {\n cloudflare,\n dashboard: false,\n deploy,\n srcDir,\n tailwind: true,\n });\n }\n\n if (template === \"dashboard\") {\n return appRouterTemplate(name, packageManager, workspacePackages, {\n cloudflare,\n dashboard: true,\n deploy,\n srcDir,\n tailwind: true,\n });\n }\n\n return appRouterTemplate(name, packageManager, workspacePackages, {\n cloudflare,\n dashboard: false,\n deploy,\n srcDir,\n tailwind: false,\n });\n}\n\nfunction appRouterTemplate(\n name: string,\n packageManager: CreateMreactAppPackageManager,\n workspacePackages: ReadonlySet<string>,\n options: {\n cloudflare: boolean;\n dashboard: boolean;\n deploy: CreateMreactAppDeployTarget | undefined;\n srcDir: boolean;\n tailwind: boolean;\n },\n): TemplateDefinition {\n const paths = templatePaths(options.srcDir);\n const files: TemplateFile[] = [\n {\n path: \"package.json\",\n content: json({\n name,\n private: true,\n type: \"module\",\n scripts: packageScripts(packageManager, options),\n dependencies: {\n \"@reckona/mreact\": dependencyRange(\"@reckona/mreact\", workspacePackages),\n \"@reckona/mreact-reactive-core\": dependencyRange(\n \"@reckona/mreact-reactive-core\",\n workspacePackages,\n ),\n \"@reckona/mreact-router\": dependencyRange(\"@reckona/mreact-router\", workspacePackages),\n ...(options.tailwind || options.dashboard\n ? {\n \"@reckona/mreact-query\": dependencyRange(\n \"@reckona/mreact-query\",\n workspacePackages,\n ),\n \"@reckona/mreact-reactive-dom\": dependencyRange(\n \"@reckona/mreact-reactive-dom\",\n workspacePackages,\n ),\n \"@reckona/mreact-test-utils\": dependencyRange(\n \"@reckona/mreact-test-utils\",\n workspacePackages,\n ),\n }\n : {}),\n ...(options.dashboard\n ? {\n \"@reckona/mreact-auth\": dependencyRange(\"@reckona/mreact-auth\", workspacePackages),\n \"@reckona/mreact-devtools\": dependencyRange(\n \"@reckona/mreact-devtools\",\n workspacePackages,\n ),\n }\n : {}),\n },\n devDependencies: {\n \"@playwright/test\": playwrightVersion,\n \"@types/node\": nodeTypesVersion,\n oxlint: oxlintVersion,\n tsx: tsxVersion,\n typescript: typescriptVersion,\n vite: viteVersion,\n vitest: vitestVersion,\n ...(options.tailwind\n ? {\n \"@tailwindcss/cli\": tailwindCliVersion,\n concurrently: concurrentlyVersion,\n tailwindcss: tailwindVersion,\n }\n : {}),\n ...(options.cloudflare ? { wrangler: wranglerVersion } : {}),\n ...(options.cloudflare\n ? { \"@cloudflare/workers-types\": cloudflareWorkersTypesVersion }\n : {}),\n },\n ...(packageManager === \"pnpm\"\n ? { pnpm: { onlyBuiltDependencies: [...pnpmOnlyBuiltDependencies] } }\n : {}),\n }),\n },\n {\n path: \"tsconfig.json\",\n content: json({\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"ES2022\", \"DOM\"],\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n strict: true,\n jsx: \"react-jsx\",\n jsxImportSource: \"@reckona/mreact\",\n types: [\n \"node\",\n \"@reckona/mreact-router/app-router-globals\",\n ...(options.cloudflare ? [\"@cloudflare/workers-types\"] : []),\n ],\n skipLibCheck: true,\n },\n include: [\n ...(options.srcDir ? [\"src\"] : [\"app\", \"src\"]),\n \"vite.config.ts\",\n ...(options.cloudflare ? [\"worker-env.d.ts\"] : []),\n ],\n }),\n },\n {\n path: \"vite.config.ts\",\n content: viteConfigSource(paths),\n },\n {\n path: `${paths.routesDir}/layout.tsx`,\n content: layoutSourceForTemplate(options, paths),\n },\n {\n path: `${paths.routesDir}/page.tsx`,\n content: pageSourceForTemplate(options),\n },\n {\n path: \".gitignore\",\n content: \"node_modules\\n.mreact\\ndist\\n.env\\n\",\n },\n {\n path: \"README.md\",\n content: readmeSource(name, packageManager, options),\n },\n ];\n\n if (options.dashboard) {\n files.push(\n {\n path: `${paths.routesDir}/dashboard/page.tsx`,\n content: dashboardPageSource,\n },\n {\n path: `${paths.routesDir}/login/page.tsx`,\n content: dashboardLoginPageSource,\n },\n {\n path: `${paths.routesDir}/api/login/route.ts`,\n content: dashboardLoginRouteSource,\n },\n {\n path: `${paths.routesDir}/api/logout/route.ts`,\n content: dashboardLogoutRouteSource,\n },\n {\n path: `${paths.routesDir}/middleware.ts`,\n content: dashboardMiddlewareSource,\n },\n {\n path: `${paths.routesDir}/session-store.ts`,\n content: dashboardSessionStoreSource,\n },\n {\n path: \"src/devtools.ts\",\n content: dashboardDevtoolsSource,\n },\n {\n path: \"src/devtools.client.tsx\",\n content: dashboardDevtoolsBoundarySource,\n },\n );\n }\n\n if (options.tailwind) {\n files.push({\n path: `${paths.routesDir}/globals.css`,\n content: tailwindCssSource,\n });\n }\n\n if (options.srcDir) {\n files.push({\n path: \"src/lib/app-info.ts\",\n content: appInfoSource,\n });\n }\n\n if (options.cloudflare) {\n files.push(\n {\n path: \"wrangler.toml\",\n content: wranglerSource(name),\n },\n {\n path: \"worker-env.d.ts\",\n content: cloudflareWorkerEnvSource,\n },\n );\n }\n\n if (options.deploy === \"container\") {\n files.push(\n {\n path: \"Dockerfile\",\n content: dockerfileSource(packageManager),\n },\n {\n path: \".dockerignore\",\n content: dockerignoreSource,\n },\n {\n path: \"docs/deploy/container.md\",\n content: containerDeployReadmeSource(packageManager),\n },\n );\n }\n\n if (options.deploy === \"aws-lambda\") {\n files.push(\n {\n path: \"src/lambda.ts\",\n content: awsLambdaHandlerSource,\n },\n {\n path: \"docs/deploy/aws-lambda.md\",\n content: awsLambdaDeployReadmeSource(packageManager),\n },\n );\n }\n\n return { files };\n}\n\nfunction pageSourceForTemplate(options: {\n cloudflare: boolean;\n dashboard?: boolean | undefined;\n srcDir?: boolean | undefined;\n tailwind: boolean;\n}): string {\n if (options.dashboard) return dashboardHomePageSource;\n if (options.srcDir) return srcDirPageSource;\n if (options.tailwind) return tailwindPageSource;\n\n return pageSource;\n}\n\nfunction layoutSourceForTemplate(\n options: { dashboard: boolean; tailwind: boolean },\n paths: { routesDir: string; sourceDir: string },\n): string {\n if (options.dashboard) {\n return dashboardLayoutSource(\n paths.routesDir === \"src/app\" ? \"../devtools.client.js\" : \"../src/devtools.client.js\",\n );\n }\n\n return options.tailwind ? tailwindLayoutSource : layoutSource;\n}\n\nfunction templatePaths(srcDir: boolean): { routesDir: string; sourceDir: string } {\n return srcDir\n ? { routesDir: \"src/app\", sourceDir: \"src\" }\n : { routesDir: \"app\", sourceDir: \"app\" };\n}\n\nfunction viteConfigSource(paths: { routesDir: string; sourceDir: string }): string {\n return `import { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { defineConfig } from \"vite\";\nimport { mreactRouter } from \"@reckona/mreact-router/vite\";\n\nconst projectRoot = dirname(fileURLToPath(import.meta.url));\n\nexport default defineConfig({\n plugins: [\n mreactRouter({\n projectRoot,\n routesDir: \"${paths.routesDir}\",\n publicDir: \"public\",\n allowedSourceDirs: [\"${paths.sourceDir}\"],\n }),\n ],\n});\n`;\n}\n\nfunction packageScripts(\n packageManager: CreateMreactAppPackageManager,\n options: {\n cloudflare: boolean;\n deploy?: CreateMreactAppDeployTarget | undefined;\n srcDir: boolean;\n tailwind: boolean;\n },\n): Record<string, string> {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n const paths = templatePaths(options.srcDir);\n const scripts: Record<string, string> = {\n dev: \"mreact-router dev\",\n build: \"mreact-router build --target=node\",\n typecheck: \"tsc --noEmit\",\n lint: \"oxlint . --ignore-pattern .mreact\",\n test: \"vitest run --passWithNoTests\",\n start: \"mreact-router start .mreact\",\n };\n\n if (options.tailwind) {\n scripts[\"prepare:css\"] = \"node -e \\\"require('node:fs').mkdirSync('public',{recursive:true})\\\"\";\n scripts[\"dev:css\"] =\n `tailwindcss -i ./${paths.routesDir}/globals.css -o ./public/styles.css --watch`;\n scripts[\"build:css\"] =\n `tailwindcss -i ./${paths.routesDir}/globals.css -o ./public/styles.css --minify`;\n scripts.dev = `${run} prepare:css && concurrently \"${run} dev:css\" \"${run} dev:router\"`;\n scripts[\"dev:router\"] = \"mreact-router dev\";\n scripts.build = `${run} prepare:css && ${run} build:css && mreact-router build --target=node`;\n }\n\n if (options.cloudflare) {\n const cloudflareBuild = \"mreact-router build --target=cloudflare\";\n scripts.deploy = \"wrangler deploy\";\n scripts.dev = `${run} build && wrangler dev`;\n scripts.preview = `${run} build && wrangler dev`;\n scripts.build = options.tailwind\n ? `${run} prepare:css && ${run} build:css && ${cloudflareBuild}`\n : cloudflareBuild;\n }\n\n if (options.deploy === \"aws-lambda\") {\n const lambdaBuild = \"mreact-router build --target=aws-lambda\";\n scripts.build = options.tailwind\n ? `${run} prepare:css && ${run} build:css && ${lambdaBuild}`\n : lambdaBuild;\n scripts[\"package:lambda\"] =\n \"mreact-router package aws-lambda --from .mreact --out .lambda --skip-runtime-dependency-check\";\n }\n\n return scripts;\n}\n\nasync function assertDirectoryWritable(directory: string): Promise<void> {\n await mkdir(directory, { recursive: true });\n const entries = await readdir(directory);\n\n if (entries.length > 0) {\n throw new Error(`Target directory is not empty: ${directory}`);\n }\n}\n\nasync function writeProjectFile(root: string, file: TemplateFile): Promise<void> {\n const path = join(root, file.path);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, file.content);\n}\n\nfunction sanitizePackageName(name: string): string {\n const sanitized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[._-]+|[._-]+$/g, \"\")\n .slice(0, 214)\n .replace(/[._-]+$/g, \"\");\n\n return sanitized || \"mreact-app\";\n}\n\nfunction isDependencyRecord(value: unknown): value is Record<string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.values(value).every((entry) => typeof entry === \"string\")\n );\n}\n\nfunction isMreactWorkspacePackage(name: string): boolean {\n return name.startsWith(\"@reckona/mreact\") || name === \"@reckona/create-mreact-app\";\n}\n\nasync function appRouterGlobalsTsconfigUpdate(\n directory: string,\n packageJson: Record<string, unknown>,\n): Promise<{ changed: false } | { changed: true; config: Record<string, unknown>; path: string }> {\n if (!hasDependency(packageJson, \"@reckona/mreact-router\")) {\n return { changed: false };\n }\n\n const path = join(directory, \"tsconfig.json\");\n let source: string;\n\n try {\n source = await readFile(path, \"utf8\");\n } catch {\n return { changed: false };\n }\n\n let config: Record<string, unknown>;\n\n try {\n config = JSON.parse(source) as Record<string, unknown>;\n } catch {\n return { changed: false };\n }\n\n const compilerOptions = ensureObjectProperty(config, \"compilerOptions\");\n const types = compilerOptions.types;\n\n if (Array.isArray(types)) {\n if (types.includes(appRouterGlobalsType)) {\n return { changed: false };\n }\n\n types.push(appRouterGlobalsType);\n return { changed: true, config, path };\n }\n\n compilerOptions.types = [appRouterGlobalsType];\n return { changed: true, config, path };\n}\n\nfunction ensureObjectProperty(\n parent: Record<string, unknown>,\n key: string,\n): Record<string, unknown> {\n const value = parent[key];\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n const next: Record<string, unknown> = {};\n parent[key] = next;\n return next;\n}\n\nfunction hasDependency(packageJson: Record<string, unknown>, name: string): boolean {\n return packageDependencyFields.some((field) => {\n const dependencies = packageJson[field];\n return isDependencyRecord(dependencies) && Object.hasOwn(dependencies, name);\n });\n}\n\nasync function inferPackageNameForTarget(\n directory: string,\n name: string | undefined,\n): Promise<string> {\n if (name !== undefined) {\n return sanitizePackageName(name);\n }\n\n const targetDirectory = resolve(directory);\n const fallbackName = sanitizePackageName(basename(targetDirectory) || \"mreact-app\");\n const workspaceRoot = await findPnpmWorkspaceRoot(dirname(targetDirectory));\n\n if (workspaceRoot === undefined) {\n return fallbackName;\n }\n\n const workspaceGlobs = await readPnpmWorkspacePackageGlobs(workspaceRoot);\n const relativeTarget = relative(workspaceRoot, targetDirectory).replaceAll(\"\\\\\", \"/\");\n\n if (workspaceGlobs.includes(\"examples/*\") && /^examples\\/[^/]+$/.test(relativeTarget)) {\n return `@reckona/example-${fallbackName.replace(/^@[^/]+\\//, \"\")}`;\n }\n\n return fallbackName;\n}\n\nfunction dependencyRange(\n packageName: keyof typeof internalPackageVersions,\n workspacePackages: ReadonlySet<string>,\n): string {\n return workspacePackages.has(packageName) ? \"workspace:*\" : internalPackageVersions[packageName];\n}\n\nasync function detectWorkspacePackagesForTarget(directory: string): Promise<ReadonlySet<string>> {\n const workspaceRoot = await findPnpmWorkspaceRoot(dirname(resolve(directory)));\n\n if (workspaceRoot === undefined) {\n return new Set();\n }\n\n const workspaceGlobs = await readPnpmWorkspacePackageGlobs(workspaceRoot);\n const packageNames = new Set<string>();\n\n for (const glob of workspaceGlobs) {\n if (!glob.endsWith(\"/*\")) {\n continue;\n }\n\n const parent = join(workspaceRoot, glob.slice(0, -2));\n let entries: string[];\n\n try {\n entries = await readdir(parent);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const packageJsonPath = join(parent, entry, \"package.json\");\n\n try {\n const json = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as { name?: unknown };\n if (typeof json.name === \"string\" && json.name.startsWith(\"@reckona/\")) {\n packageNames.add(json.name);\n }\n } catch {\n continue;\n }\n }\n }\n\n return packageNames;\n}\n\nasync function findPnpmWorkspaceRoot(startDirectory: string): Promise<string | undefined> {\n let current = resolve(startDirectory);\n\n while (true) {\n try {\n await readFile(join(current, \"pnpm-workspace.yaml\"), \"utf8\");\n return current;\n } catch {\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n }\n}\n\nasync function readPnpmWorkspacePackageGlobs(workspaceRoot: string): Promise<string[]> {\n const source = await readFile(join(workspaceRoot, \"pnpm-workspace.yaml\"), \"utf8\");\n const globs: string[] = [];\n\n for (const line of source.split(/\\r?\\n/)) {\n const match = /^\\s*-\\s*[\"']?([^\"'\\s#]+)[\"']?/.exec(line);\n if (match?.[1] !== undefined) {\n globs.push(match[1]);\n }\n }\n\n return globs;\n}\n\nfunction shouldRunCodemod(\n fromVersion: string | undefined,\n codemodVersion: string,\n targetVersion: string,\n): boolean {\n if (fromVersion === undefined) {\n return true;\n }\n\n return (\n compareVersions(fromVersion, codemodVersion) < 0 &&\n compareVersions(codemodVersion, targetVersion) <= 0\n );\n}\n\nfunction compareVersions(left: string, right: string): number {\n const leftParts = parseVersion(left);\n const rightParts = parseVersion(right);\n\n for (let index = 0; index < 3; index += 1) {\n const difference = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);\n if (difference !== 0) {\n return difference;\n }\n }\n\n return 0;\n}\n\nfunction parseVersion(value: string): [number, number, number] {\n const [major = \"0\", minor = \"0\", patch = \"0\"] = value.replace(/^[^\\d]*/, \"\").split(\".\");\n\n return [Number(major) || 0, Number(minor) || 0, Number(patch) || 0];\n}\n\nfunction json(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nconst layoutSource = `export default function Layout() {\n return (\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n </head>\n <body>\n <Slot />\n </body>\n </html>\n );\n}\n`;\n\nconst tailwindLayoutSource = `export default function Layout() {\n return (\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"stylesheet\" href=\"/styles.css\" />\n </head>\n <body class=\"bg-slate-950 text-slate-100\">\n <Slot />\n </body>\n </html>\n );\n}\n`;\n\nfunction dashboardLayoutSource(devtoolsImport: string): string {\n return `import { DashboardDevtools } from \"${devtoolsImport}\";\n\nexport default function Layout() {\n return (\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"stylesheet\" href=\"/styles.css\" />\n </head>\n <body class=\"bg-slate-950 text-slate-100\">\n <Slot />\n <DashboardDevtools />\n </body>\n </html>\n );\n}\n`;\n}\n\nconst pageSource = `import { cell } from \"@reckona/mreact-reactive-core\";\n\nexport const metadata = {\n title: \"Counter\",\n};\n\nexport default function Page() {\n const count = cell<number>(0);\n\n return (\n <main>\n <h1>mreact counter</h1>\n <p>\n Count: <strong>{count.get()}</strong>\n </p>\n <p>\n <button type=\"button\" onClick={() => count.set((value) => value + 1)}>\n +1\n </button>{\" \"}\n <button type=\"button\" onClick={() => count.set(0)}>\n Reset\n </button>\n </p>\n </main>\n );\n}\n`;\n\nconst srcDirPageSource = `import { cell } from \"@reckona/mreact-reactive-core\";\nimport { appTitle } from \"../lib/app-info.js\";\n\nexport const metadata = {\n title: \"Counter\",\n};\n\nexport default function Page() {\n const count = cell<number>(0);\n\n return (\n <main>\n <h1>{appTitle}</h1>\n <p>\n Count: <strong>{count.get()}</strong>\n </p>\n <p>\n <button type=\"button\" onClick={() => count.set((value) => value + 1)}>\n +1\n </button>{\" \"}\n <button type=\"button\" onClick={() => count.set(0)}>\n Reset\n </button>\n </p>\n </main>\n );\n}\n`;\n\nconst appInfoSource = `export const appTitle = \"mreact counter\";\n`;\n\nconst cloudflareWorkerEnvSource = `export {};\n\ndeclare global {\n interface Env {\n ASSETS: Fetcher;\n // Example R2 binding. Uncomment the matching wrangler.toml stanza before use.\n MEDIA?: R2Bucket;\n }\n}\n`;\n\nconst tailwindPageSource = `import { cell } from \"@reckona/mreact-reactive-core\";\n\nexport const metadata = {\n title: \"Counter\",\n};\n\nexport default function Page() {\n const count = cell<number>(0);\n\n return (\n <main class=\"mx-auto flex min-h-screen max-w-3xl flex-col justify-center gap-5 px-6\">\n <p class=\"text-sm font-medium text-cyan-300\">mreact</p>\n <h1 class=\"text-4xl font-semibold\">Counter starter</h1>\n <section class=\"grid gap-3 rounded-lg border border-slate-800 bg-slate-900 p-5\">\n <p class=\"text-slate-300\">\n Count: <strong class=\"text-white\">{count.get()}</strong>\n </p>\n <div class=\"flex flex-wrap gap-3\">\n <button\n type=\"button\"\n class=\"rounded-md bg-cyan-300 px-4 py-2 font-medium text-slate-950\"\n onClick={() => count.set((value) => value + 1)}\n >\n +1\n </button>\n <button\n type=\"button\"\n class=\"rounded-md border border-slate-700 px-4 py-2 text-slate-100\"\n onClick={() => count.set(0)}\n >\n Reset\n </button>\n </div>\n </section>\n </main>\n );\n}\n`;\n\nconst dashboardHomePageSource = `export const metadata = {\n title: \"Dashboard starter\",\n};\n\nexport default function Page() {\n return (\n <main class=\"mx-auto grid min-h-screen max-w-5xl content-center gap-6 px-6 py-12\">\n <section class=\"grid gap-3\">\n <p class=\"text-sm font-medium text-cyan-300\">mreact dashboard starter</p>\n <h1 class=\"text-4xl font-semibold text-white\">Operations dashboard baseline</h1>\n <p class=\"max-w-2xl text-slate-300\">\n Auth guards, form state, query cache hydration, Tailwind, and the devtools overlay are\n wired into one starter.\n </p>\n </section>\n <nav class=\"flex flex-wrap gap-3\">\n <a class=\"rounded-md bg-cyan-300 px-4 py-2 font-medium text-slate-950\" href=\"/dashboard\">\n Open dashboard\n </a>\n <a class=\"rounded-md border border-slate-700 px-4 py-2 text-slate-100\" href=\"/login\">\n Login form\n </a>\n </nav>\n </main>\n );\n}\n`;\n\nconst dashboardPageSource = `import { requireRole } from \"@reckona/mreact-auth\";\nimport {\n createQuery,\n getQueryClient,\n type QueryKey,\n} from \"@reckona/mreact-query\";\nimport type { LoaderContext } from \"@reckona/mreact-router\";\nimport { sessions, type DashboardSessionData } from \"../session-store.js\";\n\nexport const metadata = {\n title: \"Dashboard\",\n};\n\ninterface DashboardMetric {\n label: string;\n value: string;\n}\n\ninterface DashboardData {\n actor: string;\n metrics: readonly DashboardMetric[];\n}\n\nconst DASHBOARD_KEY: QueryKey = [\"dashboard\", \"metrics\"];\n\nasync function fetchDashboardMetrics(): Promise<readonly DashboardMetric[]> {\n return [\n { label: \"Active users\", value: \"1,248\" },\n { label: \"Conversion\", value: \"7.4%\" },\n { label: \"Queue depth\", value: \"18\" },\n ];\n}\n\nexport async function loader(context: LoaderContext): Promise<DashboardData> {\n const session = await requireRole<DashboardSessionData>(context.request, sessions, \"admin\");\n const metrics = await context.queryClient.fetchQuery({\n queryKey: DASHBOARD_KEY,\n queryFn: fetchDashboardMetrics,\n });\n\n return {\n actor: session.data.userId,\n metrics,\n };\n}\n\nexport default function Page(props: { data: DashboardData }) {\n const observer = createQuery(getQueryClient(), {\n queryKey: DASHBOARD_KEY,\n queryFn: fetchDashboardMetrics,\n });\n const live = observer.result.get();\n const metrics = live.data ?? props.data.metrics;\n\n return (\n <main class=\"mx-auto grid max-w-6xl gap-6 px-6 py-10\">\n <header class=\"flex flex-wrap items-end justify-between gap-4\">\n <div>\n <p class=\"text-sm text-cyan-300\">Signed in as {props.data.actor}</p>\n <h1 class=\"text-3xl font-semibold text-white\">Dashboard</h1>\n </div>\n <form method=\"post\" action=\"/api/logout\">\n <button class=\"rounded-md border border-slate-700 px-3 py-2 text-sm text-slate-200\" type=\"submit\">\n Sign out\n </button>\n </form>\n </header>\n <section class=\"grid gap-4 md:grid-cols-3\">\n {metrics.map((metric) => (\n <article class=\"rounded-lg border border-slate-800 bg-slate-900 p-4\" key={metric.label}>\n <p class=\"text-sm text-slate-400\">{metric.label}</p>\n <strong class=\"mt-2 block text-3xl text-white\">{metric.value}</strong>\n </article>\n ))}\n </section>\n <section class=\"rounded-lg border border-slate-800 bg-slate-900\">\n <table class=\"w-full border-collapse text-left text-sm\">\n <thead class=\"text-slate-400\">\n <tr>\n <th class=\"border-b border-slate-800 p-3\">Segment</th>\n <th class=\"border-b border-slate-800 p-3\">Status</th>\n <th class=\"border-b border-slate-800 p-3\">Owner</th>\n </tr>\n </thead>\n <tbody>\n {[\"Acquisition\", \"Activation\", \"Retention\"].map((segment) => (\n <tr key={segment}>\n <td class=\"border-b border-slate-800 p-3\">{segment}</td>\n <td class=\"border-b border-slate-800 p-3 text-emerald-300\">On track</td>\n <td class=\"border-b border-slate-800 p-3\">Admin</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n </main>\n );\n}\n`;\n\nconst dashboardLoginPageSource = `export const metadata = {\n title: \"Login\",\n};\n\nexport default function Page() {\n return (\n <main class=\"mx-auto grid min-h-screen max-w-md content-center px-6\">\n <form\n class=\"grid gap-4 rounded-lg border border-slate-800 bg-slate-900 p-6\"\n method=\"post\"\n action=\"/api/login\"\n >\n <h1 class=\"text-2xl font-semibold text-white\">Login</h1>\n <p class=\"text-sm text-slate-300\">\n Demo account: <code>demo@example.com</code> / <code>kanban1234</code>\n </p>\n <p class=\"text-xs text-amber-200\">\n Replace these development-only credentials before production.\n </p>\n <label class=\"grid gap-1 text-sm text-slate-300\">\n Email\n <input class=\"rounded-md border border-slate-700 bg-slate-950 px-3 py-2\" name=\"email\" type=\"email\" defaultValue=\"demo@example.com\" required />\n </label>\n <label class=\"grid gap-1 text-sm text-slate-300\">\n Password\n <input class=\"rounded-md border border-slate-700 bg-slate-950 px-3 py-2\" name=\"password\" type=\"password\" defaultValue=\"kanban1234\" required />\n </label>\n <button class=\"rounded-md bg-cyan-300 px-4 py-2 font-medium text-slate-950\" type=\"submit\">\n Continue\n </button>\n </form>\n </main>\n );\n}\n`;\n\nconst dashboardLoginRouteSource = `import { createSession } from \"@reckona/mreact-auth\";\nimport { sessions } from \"../../session-store.js\";\n\n// Development-only demo credentials. Replace this route with your real\n// authentication provider before deploying the dashboard starter.\nconst demoAccount = {\n email: \"demo@example.com\",\n password: \"kanban1234\",\n roles: [\"admin\"],\n} as const;\n\nexport async function POST(request: Request): Promise<Response> {\n if (process.env.NODE_ENV !== \"development\" && process.env.NODE_ENV !== \"test\") {\n return Response.json(\n { ok: false, error: \"Development-only demo credentials are disabled outside development.\" },\n { status: 403 },\n );\n }\n\n const form = await request.formData();\n const email = String(form.get(\"email\") ?? \"\");\n const password = String(form.get(\"password\") ?? \"\");\n\n if (email !== demoAccount.email || password !== demoAccount.password) {\n return Response.json({ ok: false, error: \"Invalid demo credentials.\" }, { status: 401 });\n }\n\n const response = new Response(null, {\n status: 303,\n headers: { location: \"/dashboard\" },\n });\n await createSession(response, sessions, {\n userId: demoAccount.email,\n roles: demoAccount.roles,\n });\n return response;\n}\n`;\n\nconst dashboardLogoutRouteSource = `import { destroySession } from \"@reckona/mreact-auth\";\nimport { sessions } from \"../../session-store.js\";\n\nexport async function POST(request: Request): Promise<Response> {\n const response = new Response(null, {\n status: 303,\n headers: { location: \"/login\" },\n });\n await destroySession(request, response, sessions);\n return response;\n}\n`;\n\nconst dashboardMiddlewareSource = `import { getSession } from \"@reckona/mreact-auth\";\nimport { redirect } from \"@reckona/mreact-router\";\nimport { sessions } from \"./session-store.js\";\n\nexport const config = { matcher: [\"/dashboard/:path*\"] };\n\nexport async function middleware(request: Request): Promise<Response | undefined> {\n const session = await getSession(request, sessions);\n if (session === undefined) {\n redirect(\"/login\");\n }\n return undefined;\n}\n`;\n\nconst dashboardSessionStoreSource = `import { createMemorySessionStore, type AuthSessionClaims } from \"@reckona/mreact-auth\";\n\nexport interface DashboardSessionData extends AuthSessionClaims {\n roles: readonly string[];\n userId: string;\n}\n\nconst globalKey = \"__mreactDashboardSessions\";\nconst globalStore = globalThis as typeof globalThis & {\n [globalKey]?: ReturnType<typeof createMemorySessionStore<DashboardSessionData>>;\n};\n\nexport const sessions =\n globalStore[globalKey] ??= createMemorySessionStore<DashboardSessionData>();\n`;\n\nconst dashboardDevtoolsSource = `export async function mountDashboardDevtools(): Promise<void> {\n if (!import.meta.env.DEV || typeof document === \"undefined\") {\n return;\n }\n\n const { mountDevtoolsOverlay } = await import(\"@reckona/mreact-devtools/overlay\");\n mountDevtoolsOverlay();\n}\n`;\n\nconst dashboardDevtoolsBoundarySource = `import { effect } from \"@reckona/mreact-reactive-core\";\nimport { mountDashboardDevtools } from \"./devtools.js\";\n\nexport function DashboardDevtools() {\n effect(() => {\n void mountDashboardDevtools();\n });\n\n return null;\n}\n`;\n\nconst tailwindCssSource = `@import \"tailwindcss\";\n`;\n\nconst awsLambdaHandlerSource = `import { createPreloadedAwsLambdaRequestHandler } from \"@reckona/mreact-router/adapters/aws-lambda\";\n\nexport const handler = await createPreloadedAwsLambdaRequestHandler({\n outDir: new URL(\"../.mreact\", import.meta.url).pathname,\n importPolicy: \"generated\",\n});\n`;\n\nfunction wranglerSource(name: string): string {\n return `name = \"${name}\"\nmain = \".mreact/cloudflare/worker.mjs\"\ncompatibility_date = \"2026-05-15\"\n\n[assets]\ndirectory = \".mreact/client\"\nbinding = \"ASSETS\"\n\n# Example R2 binding. Uncomment and replace the bucket name when the app needs R2.\n# [[r2_buckets]]\n# binding = \"MEDIA\"\n# bucket_name = \"${name}-media\"\n`;\n}\n\nfunction dockerfileSource(packageManager: CreateMreactAppPackageManager): string {\n const installCommand =\n packageManager === \"pnpm\"\n ? \"pnpm install --frozen-lockfile || pnpm install\"\n : packageManager === \"npm\"\n ? \"npm install\"\n : \"bun install\";\n const buildCommand = packageManager === \"npm\" ? \"npm run build\" : `${packageManager} run build`;\n const startCommand =\n packageManager === \"npm\"\n ? `CMD [\"npm\", \"start\"]`\n : packageManager === \"bun\"\n ? `CMD [\"bun\", \"run\", \"start\"]`\n : `CMD [\"pnpm\", \"start\"]`;\n const enablePackageManager =\n packageManager === \"pnpm\"\n ? \"RUN corepack enable\\n\"\n : packageManager === \"bun\"\n ? \"RUN npm install -g bun\\n\"\n : \"\";\n\n return `FROM node:24-bookworm-slim AS deps\nWORKDIR /app\n${enablePackageManager}COPY . .\nRUN ${installCommand}\n\nFROM node:24-bookworm-slim AS build\nWORKDIR /app\n${enablePackageManager}COPY --from=deps /app ./\nRUN ${buildCommand}\n\nFROM node:24-bookworm-slim AS runner\nWORKDIR /app\nENV NODE_ENV=production\nENV HOST=0.0.0.0\nENV MREACT_ROUTER_HOST_POLICY=strict\nENV PORT=8080\n${enablePackageManager}COPY --from=build /app/package.json ./package.json\nCOPY --from=build /app/node_modules ./node_modules\nCOPY --from=build /app/.mreact ./.mreact\nEXPOSE 8080\n${startCommand}\n`;\n}\n\nconst dockerignoreSource = `node_modules\n.mreact\ndist\n.git\n.gitignore\n.env\n.env.*\nnpm-debug.log*\npnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n`;\n\nfunction containerDeployReadmeSource(packageManager: CreateMreactAppPackageManager): string {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n\n return `# Container deployment\n\nThis project includes a generic container image for platforms such as Cloud Run,\nAWS App Runner, Fly.io, Render, and other services that run an HTTP server from\na container.\n\n## Local build\n\n\\`\\`\\`bash\n${run} build\ndocker build -t mreact-app .\ndocker run --rm -p 8080:8080 -e HOST=0.0.0.0 -e MREACT_ROUTER_HOST_POLICY=strict -e PORT=8080 mreact-app\n\\`\\`\\`\n\nThe server reads \\`HOST\\` and \\`PORT\\` and defaults to the values provided by\nthe platform. The Dockerfile sets \\`HOST=0.0.0.0\\` so published container ports\ncan reach the Node server and \\`MREACT_ROUTER_HOST_POLICY=strict\\` so public\ncontainers do not implicitly trust arbitrary Host headers. Set\n\\`MREACT_ROUTER_ALLOWED_HOSTS\\` to your deployed hostnames when your app needs\nthe public origin for absolute URLs.\nThe Dockerfile uses Node 24 LTS and runs \\`${run} start\\`.\n\n## Cloud Run\n\nCloud Run injects \\`PORT\\` automatically. The Dockerfile sets \\`HOST=0.0.0.0\\`,\n\\`MREACT_ROUTER_HOST_POLICY=strict\\`, and \\`PORT=8080\\` for local runs, which\nmatches Cloud Run's common default. Build and deploy the image with your\npreferred Google Cloud workflow, then route HTTP traffic to the container.\n\n## AWS App Runner\n\nAWS App Runner can use the same image. Configure the service port as \\`8080\\`\nor set \\`PORT\\` to the value you choose for the service. Use a simple HTTP\nhealth check path such as \\`/\\`.\n\n## CDN assets\n\n\\`.mreact/client\\` contains hashed client route assets and copied public assets\nat their root paths, with \\`.mreact/client/public\\` kept as a compatibility\nmirror. To serve them from a CDN, upload that directory to your static origin\nand configure the router:\n\n\\`\\`\\`ts\nimport { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst projectRoot = dirname(fileURLToPath(import.meta.url));\n\nmreactRouter({\n projectRoot,\n routesDir: \"src/app\",\n publicDir: \"public\",\n allowedSourceDirs: [\"src\"],\n assetBaseUrl: \"https://cdn.example.com/_mreact/client/\",\n publicAssetBaseUrl: \"https://cdn.example.com/\",\n});\n\\`\\`\\`\n\nHashed route assets can use a long immutable cache. \\`manifest.json\\` and\nnon-fingerprinted public assets should use a shorter cache or revalidation.\n`;\n}\n\nfunction awsLambdaDeployReadmeSource(packageManager: CreateMreactAppPackageManager): string {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n const installProd =\n packageManager === \"pnpm\"\n ? \"pnpm --dir .lambda install --prod --frozen-lockfile --ignore-scripts --config.node-linker=hoisted\"\n : packageManager === \"npm\"\n ? \"(cd .lambda && npm ci --omit=dev --ignore-scripts)\"\n : \"(cd .lambda && bun install --production)\";\n const lockfiles =\n packageManager === \"pnpm\"\n ? \"pnpm-lock.yaml pnpm-workspace.yaml\"\n : packageManager === \"npm\"\n ? \"package-lock.json npm-shrinkwrap.json\"\n : \"bun.lock\";\n\n return `# AWS Lambda deployment\n\nThis project includes a generated Lambda handler for API Gateway HTTP API v2 and\nLambda Function URL events. \\`src/lambda.ts\\` is included as a small custom\nhandler starting point when you need to add adapter options.\n\n## Build\n\n\\`\\`\\`bash\n${run} build\n${run} package:lambda\n\\`\\`\\`\n\nThe generated \\`build\\` script runs \\`mreact-router build --target=aws-lambda\\`.\nThat target emits Node-compatible server/client output, a generated import\npolicy at \\`.mreact/server/import-policy.json\\`, and a preloaded Lambda handler\nat \\`.mreact/aws-lambda/mreact-handler.mjs\\`. If you replace the script, use the\nsame target explicitly:\n\n\\`\\`\\`bash\nmreact-router build --target=aws-lambda\n${run} package:lambda\n\\`\\`\\`\n\nYou can also make the target a project default in \\`vite.config.ts\\`:\n\n\\`\\`\\`ts\nmreactRouter({\n buildTargets: [\"aws-lambda\"],\n});\n\\`\\`\\`\n\n\\`.lambda/mreact-handler.mjs\\` exports \\`handler\\` after \\`${run} package:lambda\\`.\nPackage that file together with \\`.lambda/.mreact\\`, \\`package.json\\`, and\nproduction \\`node_modules\\`.\n\nThe generated \\`package:lambda\\` script uses \\`--skip-runtime-dependency-check\\` because the prepare script below installs production dependencies into \\`.lambda/node_modules\\` after creating the minimal artifact. Do not deploy the artifact before that install step finishes.\n\n## Minimal deployment artifact\n\nAWS Lambda has a 250 MB unzipped deployment package limit. Do not point CDK, SAM, Serverless Framework, or Terraform at the full project root after a CI install, because that can include source files, tests, dev dependencies, Vite/Vitest/Playwright tooling, and package-manager caches. The mreact runtime only needs the built app output, the Lambda handler bundle, and production runtime dependencies.\n\nThe Lambda adapter treats \\`outDir\\` as read-only. On cold start it materializes generated runtime files under \\`/tmp/mreact-router/<hash>/runtime\\` and creates a \\`node_modules\\` symlink back to the deployed package root so server-side imports resolve from the production dependencies. Static middleware \\`config.matcher\\` / \\`config.id\\` checks run before middleware module import, and loader redirects settle before page component server transforms for non-stream routes and stream routes without a loading boundary. Pass \\`runtimeDir\\` to \\`createAwsLambdaRequestHandler()\\` only if you need a custom writable cache directory.\n\npnpm's default isolated linker creates a symlink-heavy \\`node_modules\\` tree. Some Lambda packaging tools dereference those links or count their targets differently, which can make an artifact look small locally but exceed the unzipped limit after packaging. For pnpm Lambda artifacts, install production dependencies into \\`.lambda/\\` with \\`--config.node-linker=hoisted\\`, then verify both symlink count and actual file bytes before upload.\n\n\\`src/\\` is not required at runtime when \\`.mreact/server/manifest.json\\` is present. Server source needed by the runtime is materialized into the build manifest and server module artifacts during \\`${run} build\\`.\n\nRecommended artifact layout:\n\n\\`\\`\\`text\n.lambda/\n .mreact/\n mreact-handler.mjs\n mreact-lambda-artifact.json\n package.json\n lockfile\n node_modules/\n\\`\\`\\`\n\nCreate a dedicated asset directory before handing it to CDK/SAM/serverless. Save this as \\`scripts/prepare-lambda-asset.sh\\` if you want a repeatable deploy step:\n\n\\`\\`\\`bash\n#!/usr/bin/env bash\nset -euo pipefail\n\nrm -rf .lambda\n\n${run} build\n${run} package:lambda\ncp package.json .lambda/\nfor file in ${lockfiles}; do\n if [ -f \"$file\" ]; then\n cp \"$file\" .lambda/\n fi\ndone\n\n${installProd}\nfind .lambda -name '*.tsbuildinfo' -delete\ndu -sh .lambda\nfind .lambda -type l | wc -l\nfind .lambda -type f -printf '%s\\\\n' | awk '{ total += $1 } END { printf \"actual file bytes: %d\\\\n\", total }'\n\\`\\`\\`\n\n## Runtime shape\n\n- Use API Gateway HTTP API v2 or Lambda Function URL payload format 2.0.\n- Use a Node.js Lambda runtime that supports Web \\`Request\\` and \\`Response\\`.\n- The adapter returns the Lambda proxy response shape with \\`cookies\\`,\n \\`headers\\`, \\`statusCode\\`, \\`body\\`, and \\`isBase64Encoded\\`.\n- Binary responses are base64 encoded automatically.\n\n## Server dependencies\n\nProduction adapters enforce the app-router import policy when bundling loaders, middleware, route handlers, metadata, and server actions. The build writes \\`.mreact/server/import-policy.json\\` from server-side static imports, and generated Lambda handlers use \\`importPolicy: \"generated\"\\` by default. AWS Lambda request/control artifacts bundle the generated import-policy packages they use for loaders, middleware, route handlers, and metadata, reducing first-hit package resolution on sparse Lambda traffic. Packages listed in the generated import policy may still be needed by render-only modules, inferred server actions, custom handlers, or adapter code, so keep them installed in the production \\`node_modules\\` copied into the Lambda artifact.\n\n\\`\\`\\`ts\nexport const handler = await createPreloadedAwsLambdaRequestHandler({\n outDir: new URL(\"../.mreact\", import.meta.url).pathname,\n importPolicy: \"generated\",\n});\n\\`\\`\\`\n\nThe generated handler uses top-level \\`await\\` with \\`createPreloadedAwsLambdaRequestHandler()\\` so the built runtime, middleware, route modules, layouts, and metadata are imported during the Lambda initialization phase instead of racing the first user request. Static middleware matchers, loader redirects, request/control artifacts split from render artifacts, AWS Lambda request/control package bundling, compiled module files, and optional \\`hot-route-requests\\` preload avoid unnecessary dependency evaluation on unmatched health checks and simple redirects. Add \\`timings: true\\` while diagnosing production latency to emit \\`router:request:timing\\` and \\`router:render:timing\\` debug events for request conversion, render phases, loader wait, source analysis, page module load, page component render, layout module load, layout component render, response construction, and Lambda response conversion. Loader timing splits module load/evaluation from user loader execution with \\`loaderModuleLoadMs\\` and \\`loaderExecutionMs\\`; source analysis reports \\`sourceAnalysisArtifactMs\\` when a built analysis summary is reused; middleware timing similarly splits \\`middlewareModuleLoadMs\\` and \\`middlewareExecutionMs\\`.\n\n## Streaming SSR\n\nAPI Gateway and Lambda Function URL proxy responses are buffered. mreact still\nrenders through the same server pipeline, but Streaming SSR is materialized into\none Lambda response body.\n\nFor Lambda Function URL response streaming, switch \\`src/lambda.ts\\` to the\nexplicit streaming handler:\n\n\\`\\`\\`ts\nimport { createAwsLambdaStreamingRequestHandler } from \"@reckona/mreact-router/adapters/aws-lambda\";\n\nexport const handler = createAwsLambdaStreamingRequestHandler({\n outDir: new URL(\"../.mreact\", import.meta.url).pathname,\n});\n\\`\\`\\`\n\nThe streaming handler requires an AWS integration configured for payload\nresponse streaming and the Node.js Lambda runtime \\`awslambda.streamifyResponse()\\`\nplus \\`awslambda.HttpResponseStream.from()\\` APIs.\n\n## Static assets\n\nLambda can serve \\`.mreact/client\\`, but it is usually better to move static\nassets to S3 + CloudFront. Upload \\`.mreact/client\\` to your static origin and\nconfigure the router:\n\n\\`\\`\\`ts\nimport { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst projectRoot = dirname(fileURLToPath(import.meta.url));\n\nmreactRouter({\n projectRoot,\n routesDir: \"src/app\",\n publicDir: \"public\",\n allowedSourceDirs: [\"src\"],\n assetBaseUrl: \"https://cdn.example.com/_mreact/client/\",\n publicAssetBaseUrl: \"https://cdn.example.com/\",\n});\n\\`\\`\\`\n\nHashed route assets can use a long immutable cache. \\`manifest.json\\` and\nnon-fingerprinted public assets should use a shorter cache or revalidation.\n`;\n}\n\nfunction readmeSource(\n name: string,\n packageManager: CreateMreactAppPackageManager,\n options: {\n cloudflare: boolean;\n dashboard?: boolean | undefined;\n deploy?: CreateMreactAppDeployTarget | undefined;\n tailwind: boolean;\n },\n): string {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n const tailwindNote = options.tailwind\n ? \"\\nTailwind CSS v4 is configured in `app/globals.css`.\\n\"\n : \"\";\n const starterNote =\n options.dashboard\n ? \"\"\n : \"\\nThe generated home page is a counter starter that uses `cell` for client interactivity.\\n\";\n const cloudflareNote = options.cloudflare\n ? `\n## Cloudflare Workers\n\nThe Workers entrypoint is generated at \\`.mreact/cloudflare/worker.mjs\\`. \\`${run} dev\\` runs \\`${run} build\\` first so a fresh scaffold can start with Wrangler, and \\`${run} build\\` must still be run before \\`wrangler deploy\\`.\n\nBindings are declared in \\`wrangler.toml\\` and typed in \\`worker-env.d.ts\\`. The scaffold includes a commented R2 example named \\`MEDIA\\`; uncomment it and replace the bucket name before using \\`context.env.MEDIA\\` from loaders or route handlers.\n`\n : \"\";\n const deployNote =\n options.deploy === \"container\"\n ? \"\\nContainer deploy files are included. See `docs/deploy/container.md`.\\n\"\n : options.deploy === \"aws-lambda\"\n ? \"\\nAWS Lambda deploy files are included. See `docs/deploy/aws-lambda.md`.\\n\"\n : \"\";\n const dashboardNote = options.dashboard\n ? \"\\nThis is the dashboard starter. It includes auth guards, a development-only demo login, query cache hydration, Tailwind styling, and the devtools overlay in development. Demo account: `demo@example.com` / `kanban1234`. Replace these credentials before production; the generated login route enables them only when `NODE_ENV` is `development` or `test`.\\n\"\n : \"\";\n const pnpmTroubleshooting =\n packageManager === \"pnpm\"\n ? `\n## Troubleshooting\n\n### pnpm approve-builds warning\n\npnpm 10 may print an \\`Ignored build scripts\\` warning for transitive tooling packages such as \\`esbuild\\`, \\`@parcel/watcher\\`, \\`sharp\\`, or \\`workerd\\`. The generated \\`package.json\\` includes those packages in \\`pnpm.onlyBuiltDependencies\\`, so a fresh install or \\`pnpm rebuild\\` can run the required native build steps. If you add another native dependency, add its package name to \\`pnpm.onlyBuiltDependencies\\`, then run \\`pnpm rebuild <package>\\` or reinstall.\n\n### Adding native dependencies\n\nPackages such as \\`better-sqlite3\\`, \\`argon2\\`, \\`bcrypt\\`, \\`canvas\\`, and \\`node-pty\\` often use install scripts for native binaries. With pnpm 10, add the package to \\`pnpm.onlyBuiltDependencies\\` in \\`package.json\\` before rebuilding or reinstalling so the native binding is actually produced.\n`\n : \"\";\n\n return `# ${name}\n\nmreact app-router project generated by \\`@reckona/create-mreact-app\\`.\n\n## Scripts\n\n- \\`${run} dev\\`\n- \\`${run} build\\`\n- \\`${run} typecheck\\`\n- \\`${run} lint\\`\n- \\`${run} test\\`\n- \\`${run} start\\`\n${starterNote}${tailwindNote}${cloudflareNote}${deployNote}${dashboardNote}${pnpmTroubleshooting}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\n\n/** Names the starter template used when scaffolding a new mreact app. */\nexport type CreateMreactAppTemplate = \"basic\" | \"tailwind\" | \"dashboard\";\n\n/** Names the package manager used to write install and script commands. */\nexport type CreateMreactAppPackageManager = \"pnpm\" | \"npm\" | \"bun\";\n\n/** Names the deployment target whose files are included in the generated app. */\nexport type CreateMreactAppDeployTarget = \"aws-lambda\" | \"cloudflare\" | \"container\";\n\n/** Configures the project directory, template, package manager, and deploy target for app scaffolding. */\nexport interface CreateMreactAppOptions {\n deploy?: CreateMreactAppDeployTarget | undefined;\n directory: string;\n name?: string | undefined;\n packageManager?: CreateMreactAppPackageManager | undefined;\n srcDir?: boolean | undefined;\n template?: CreateMreactAppTemplate | undefined;\n}\n\n/** Reports the generated app directory, files, package manager, template, and deploy target. */\nexport interface CreateMreactAppResult {\n deploy?: CreateMreactAppDeployTarget | undefined;\n directory: string;\n files: string[];\n packageManager: CreateMreactAppPackageManager;\n template: CreateMreactAppTemplate;\n}\n\n/** Configures an existing mreact app upgrade run. */\nexport interface UpgradeMreactAppOptions {\n directory: string;\n dryRun?: boolean | undefined;\n fromVersion?: string | undefined;\n targetVersion?: string | undefined;\n}\n\n/** Describes a package dependency version changed by an app upgrade run. */\nexport interface UpgradeMreactAppDependencyUpdate {\n field: PackageDependencyField;\n from: string;\n name: string;\n to: string;\n}\n\n/** Reports whether an upgrade codemod would be or was applied. */\nexport interface UpgradeMreactAppCodemodResult {\n applied: boolean;\n description: string;\n id: string;\n}\n\n/** Reports the package file, dependency updates, codemods, and change flag for an upgrade run. */\nexport interface UpgradeMreactAppResult {\n changed: boolean;\n codemods: UpgradeMreactAppCodemodResult[];\n packageJsonPath: string;\n updatedDependencies: UpgradeMreactAppDependencyUpdate[];\n}\n\ninterface TemplateFile {\n path: string;\n content: string;\n}\n\ninterface TemplateDefinition {\n files: TemplateFile[];\n}\n\nconst internalPackageVersions = {\n \"@reckona/mreact-auth\": \"^0.0.189\",\n \"@reckona/mreact-devtools\": \"^0.0.189\",\n \"@reckona/mreact-forms\": \"^0.0.189\",\n \"@reckona/mreact\": \"^0.0.189\",\n \"@reckona/mreact-query\": \"^0.0.189\",\n \"@reckona/mreact-reactive-core\": \"^0.0.189\",\n \"@reckona/mreact-reactive-dom\": \"^0.0.189\",\n \"@reckona/mreact-router\": \"^0.0.189\",\n \"@reckona/mreact-test-utils\": \"^0.0.189\",\n} as const satisfies Record<string, string>;\nconst currentMreactVersion = internalPackageVersions[\"@reckona/mreact\"].replace(/^\\^/, \"\");\nconst typescriptVersion = \"^7.0.2\";\nconst tailwindVersion = \"^4.3.0\";\nconst tailwindCliVersion = \"^4.3.0\";\nconst concurrentlyVersion = \"^9.2.0\";\nconst nodeTypesVersion = \"^25.7.0\";\nconst oxlintVersion = \"^1.69.0\";\nconst playwrightVersion = \"^1.60.0\";\nconst tsxVersion = \"^4.21.0\";\nconst viteVersion = \"^8.0.11\";\nconst vitestVersion = \"^4.1.8\";\nconst wranglerVersion = \"^4.100.0\";\nconst cloudflareWorkersTypesVersion = \"^4.20260522.1\";\nconst appRouterGlobalsType = \"@reckona/mreact-router/app-router-globals\";\nconst pnpmOnlyBuiltDependencies = [\"@parcel/watcher\", \"esbuild\", \"sharp\", \"workerd\"] as const;\n\n/** Scaffolds a new mreact app by writing the selected template files into the target directory. */\nexport async function createMreactApp(\n options: CreateMreactAppOptions,\n): Promise<CreateMreactAppResult> {\n const template = options.template ?? \"basic\";\n const packageManager = options.packageManager ?? \"pnpm\";\n const name = await inferPackageNameForTarget(options.directory, options.name);\n const workspacePackages = await detectWorkspacePackagesForTarget(options.directory);\n const definition = templateDefinition(\n template,\n name,\n packageManager,\n options.srcDir === true,\n options.deploy,\n workspacePackages,\n );\n\n await assertDirectoryWritable(options.directory);\n\n const files: string[] = [];\n for (const file of definition.files) {\n await writeProjectFile(options.directory, file);\n files.push(file.path);\n }\n\n return {\n directory: options.directory,\n ...(options.deploy === undefined ? {} : { deploy: options.deploy }),\n files,\n packageManager,\n template,\n };\n}\n\n/** Updates known mreact workspace dependencies and records version-gated codemods for an existing app. */\nexport async function upgradeMreactApp(\n options: UpgradeMreactAppOptions,\n): Promise<UpgradeMreactAppResult> {\n const packageJsonPath = join(options.directory, \"package.json\");\n const source = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(source) as Record<string, unknown>;\n const targetVersion = options.targetVersion ?? currentMreactVersion;\n const targetRange = `^${targetVersion}`;\n const updatedDependencies: UpgradeMreactAppDependencyUpdate[] = [];\n\n for (const field of packageDependencyFields) {\n const dependencies = packageJson[field];\n\n if (!isDependencyRecord(dependencies)) {\n continue;\n }\n\n for (const [name, from] of Object.entries(dependencies)) {\n if (!isMreactWorkspacePackage(name) || from === targetRange) {\n continue;\n }\n\n dependencies[name] = targetRange;\n updatedDependencies.push({\n field,\n from,\n name,\n to: targetRange,\n });\n }\n }\n\n const tsconfigUpdate = await appRouterGlobalsTsconfigUpdate(options.directory, packageJson);\n const codemods = createMreactAppCodemods\n .filter((codemod) => shouldRunCodemod(options.fromVersion, codemod.version, targetVersion))\n .map((codemod) => ({\n applied: options.dryRun !== true,\n description: codemod.description,\n id: codemod.id,\n }));\n const packageJsonChanged = updatedDependencies.length > 0;\n const changed = packageJsonChanged || tsconfigUpdate.changed;\n\n if (changed && options.dryRun !== true) {\n if (packageJsonChanged) {\n await writeFile(packageJsonPath, json(packageJson));\n }\n\n if (tsconfigUpdate.changed) {\n await writeFile(tsconfigUpdate.path, json(tsconfigUpdate.config));\n }\n }\n\n return {\n changed,\n codemods,\n packageJsonPath,\n updatedDependencies,\n };\n}\n\n/** Lists the templates supported by `createMreactApp()`. */\nexport const createMreactAppTemplates = [\n \"basic\",\n \"tailwind\",\n \"dashboard\",\n] as const satisfies readonly CreateMreactAppTemplate[];\n\n/** Lists the deployment targets supported by `createMreactApp()`. */\nexport const createMreactAppDeployTargets = [\n \"cloudflare\",\n \"container\",\n \"aws-lambda\",\n] as const satisfies readonly CreateMreactAppDeployTarget[];\n\n/** Lists version-gated codemods reported by `upgradeMreactApp()`. */\nexport const createMreactAppCodemods = [\n {\n description:\n \"Normalize app-router import policy examples after the 0.0.16 adapter template changes.\",\n id: \"0.0.16-import-policy-normalize\",\n version: \"0.0.16\",\n },\n {\n description:\n \"Check AWS Lambda template ESM entrypoints and package-manager production install guidance.\",\n id: \"0.0.16-aws-lambda-esm-template\",\n version: \"0.0.16\",\n },\n {\n description:\n \"Check app-router tsconfig global type declarations for Slot, Await, and generated route helpers.\",\n id: \"0.0.54-app-router-globals\",\n version: \"0.0.54\",\n },\n {\n description:\n \"Review generated app-router CSS imports and route stylesheet assumptions after automatic route CSS asset support.\",\n id: \"0.0.78-route-css-assets\",\n version: \"0.0.78\",\n },\n {\n description:\n \"Review AWS Lambda build/package scripts for generated Lambda targets, generated import policy, and minimal asset packaging.\",\n id: \"0.0.120-aws-lambda-generated-package\",\n version: \"0.0.120\",\n },\n {\n description:\n \"Review starter pages that still render static hello content; current basic and Tailwind starters use a small interactive cell counter.\",\n id: \"0.0.148-interactive-counter-starter\",\n version: \"0.0.148\",\n },\n] as const;\n\n/** Names package.json dependency sections that can contain mreact workspace packages. */\nexport type PackageDependencyField =\n | \"dependencies\"\n | \"devDependencies\"\n | \"peerDependencies\"\n | \"optionalDependencies\";\n\nconst packageDependencyFields = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n] as const satisfies readonly PackageDependencyField[];\n\nfunction templateDefinition(\n template: CreateMreactAppTemplate,\n name: string,\n packageManager: CreateMreactAppPackageManager,\n srcDir: boolean,\n deploy: CreateMreactAppDeployTarget | undefined,\n workspacePackages: ReadonlySet<string>,\n): TemplateDefinition {\n // `cloudflare` is a deploy target, orthogonal to the app-content template.\n const cloudflare = deploy === \"cloudflare\";\n\n if (template === \"tailwind\") {\n return appRouterTemplate(name, packageManager, workspacePackages, {\n cloudflare,\n dashboard: false,\n deploy,\n srcDir,\n tailwind: true,\n });\n }\n\n if (template === \"dashboard\") {\n return appRouterTemplate(name, packageManager, workspacePackages, {\n cloudflare,\n dashboard: true,\n deploy,\n srcDir,\n tailwind: true,\n });\n }\n\n return appRouterTemplate(name, packageManager, workspacePackages, {\n cloudflare,\n dashboard: false,\n deploy,\n srcDir,\n tailwind: false,\n });\n}\n\nfunction appRouterTemplate(\n name: string,\n packageManager: CreateMreactAppPackageManager,\n workspacePackages: ReadonlySet<string>,\n options: {\n cloudflare: boolean;\n dashboard: boolean;\n deploy: CreateMreactAppDeployTarget | undefined;\n srcDir: boolean;\n tailwind: boolean;\n },\n): TemplateDefinition {\n const paths = templatePaths(options.srcDir);\n const files: TemplateFile[] = [\n {\n path: \"package.json\",\n content: json({\n name,\n private: true,\n type: \"module\",\n scripts: packageScripts(packageManager, options),\n dependencies: {\n \"@reckona/mreact\": dependencyRange(\"@reckona/mreact\", workspacePackages),\n \"@reckona/mreact-reactive-core\": dependencyRange(\n \"@reckona/mreact-reactive-core\",\n workspacePackages,\n ),\n \"@reckona/mreact-router\": dependencyRange(\"@reckona/mreact-router\", workspacePackages),\n ...(options.tailwind || options.dashboard\n ? {\n \"@reckona/mreact-query\": dependencyRange(\n \"@reckona/mreact-query\",\n workspacePackages,\n ),\n \"@reckona/mreact-reactive-dom\": dependencyRange(\n \"@reckona/mreact-reactive-dom\",\n workspacePackages,\n ),\n \"@reckona/mreact-test-utils\": dependencyRange(\n \"@reckona/mreact-test-utils\",\n workspacePackages,\n ),\n }\n : {}),\n ...(options.dashboard\n ? {\n \"@reckona/mreact-auth\": dependencyRange(\"@reckona/mreact-auth\", workspacePackages),\n \"@reckona/mreact-devtools\": dependencyRange(\n \"@reckona/mreact-devtools\",\n workspacePackages,\n ),\n }\n : {}),\n },\n devDependencies: {\n \"@playwright/test\": playwrightVersion,\n \"@types/node\": nodeTypesVersion,\n oxlint: oxlintVersion,\n tsx: tsxVersion,\n typescript: typescriptVersion,\n vite: viteVersion,\n vitest: vitestVersion,\n ...(options.tailwind\n ? {\n \"@tailwindcss/cli\": tailwindCliVersion,\n concurrently: concurrentlyVersion,\n tailwindcss: tailwindVersion,\n }\n : {}),\n ...(options.cloudflare ? { wrangler: wranglerVersion } : {}),\n ...(options.cloudflare\n ? { \"@cloudflare/workers-types\": cloudflareWorkersTypesVersion }\n : {}),\n },\n ...(packageManager === \"pnpm\"\n ? { pnpm: { onlyBuiltDependencies: [...pnpmOnlyBuiltDependencies] } }\n : {}),\n }),\n },\n {\n path: \"tsconfig.json\",\n content: json({\n compilerOptions: {\n target: \"ES2022\",\n lib: [\"ES2022\", \"DOM\"],\n module: \"NodeNext\",\n moduleResolution: \"NodeNext\",\n strict: true,\n jsx: \"react-jsx\",\n jsxImportSource: \"@reckona/mreact\",\n types: [\n \"node\",\n \"@reckona/mreact-router/app-router-globals\",\n ...(options.cloudflare ? [\"@cloudflare/workers-types\"] : []),\n ],\n skipLibCheck: true,\n },\n include: [\n ...(options.srcDir ? [\"src\"] : [\"app\", \"src\"]),\n \"vite.config.ts\",\n ...(options.cloudflare ? [\"worker-env.d.ts\"] : []),\n ],\n }),\n },\n {\n path: \"vite.config.ts\",\n content: viteConfigSource(paths),\n },\n {\n path: `${paths.routesDir}/layout.tsx`,\n content: layoutSourceForTemplate(options, paths),\n },\n {\n path: `${paths.routesDir}/page.tsx`,\n content: pageSourceForTemplate(options),\n },\n {\n path: \".gitignore\",\n content: \"node_modules\\n.mreact\\ndist\\n.env\\n\",\n },\n {\n path: \"README.md\",\n content: readmeSource(name, packageManager, options),\n },\n ];\n\n if (options.dashboard) {\n files.push(\n {\n path: `${paths.routesDir}/dashboard/page.tsx`,\n content: dashboardPageSource,\n },\n {\n path: `${paths.routesDir}/login/page.tsx`,\n content: dashboardLoginPageSource,\n },\n {\n path: `${paths.routesDir}/api/login/route.ts`,\n content: dashboardLoginRouteSource,\n },\n {\n path: `${paths.routesDir}/api/logout/route.ts`,\n content: dashboardLogoutRouteSource,\n },\n {\n path: `${paths.routesDir}/middleware.ts`,\n content: dashboardMiddlewareSource,\n },\n {\n path: `${paths.routesDir}/session-store.ts`,\n content: dashboardSessionStoreSource,\n },\n {\n path: \"src/devtools.ts\",\n content: dashboardDevtoolsSource,\n },\n {\n path: \"src/devtools.client.tsx\",\n content: dashboardDevtoolsBoundarySource,\n },\n );\n }\n\n if (options.tailwind) {\n files.push({\n path: `${paths.routesDir}/globals.css`,\n content: tailwindCssSource,\n });\n }\n\n if (options.srcDir) {\n files.push({\n path: \"src/lib/app-info.ts\",\n content: appInfoSource,\n });\n }\n\n if (options.cloudflare) {\n files.push(\n {\n path: \"wrangler.toml\",\n content: wranglerSource(name),\n },\n {\n path: \"worker-env.d.ts\",\n content: cloudflareWorkerEnvSource,\n },\n );\n }\n\n if (options.deploy === \"container\") {\n files.push(\n {\n path: \"Dockerfile\",\n content: dockerfileSource(packageManager),\n },\n {\n path: \".dockerignore\",\n content: dockerignoreSource,\n },\n {\n path: \"docs/deploy/container.md\",\n content: containerDeployReadmeSource(packageManager),\n },\n );\n }\n\n if (options.deploy === \"aws-lambda\") {\n files.push(\n {\n path: \"src/lambda.ts\",\n content: awsLambdaHandlerSource,\n },\n {\n path: \"docs/deploy/aws-lambda.md\",\n content: awsLambdaDeployReadmeSource(packageManager),\n },\n );\n }\n\n return { files };\n}\n\nfunction pageSourceForTemplate(options: {\n cloudflare: boolean;\n dashboard?: boolean | undefined;\n srcDir?: boolean | undefined;\n tailwind: boolean;\n}): string {\n if (options.dashboard) return dashboardHomePageSource;\n if (options.srcDir) return srcDirPageSource;\n if (options.tailwind) return tailwindPageSource;\n\n return pageSource;\n}\n\nfunction layoutSourceForTemplate(\n options: { dashboard: boolean; tailwind: boolean },\n paths: { routesDir: string; sourceDir: string },\n): string {\n if (options.dashboard) {\n return dashboardLayoutSource(\n paths.routesDir === \"src/app\" ? \"../devtools.client.js\" : \"../src/devtools.client.js\",\n );\n }\n\n return options.tailwind ? tailwindLayoutSource : layoutSource;\n}\n\nfunction templatePaths(srcDir: boolean): { routesDir: string; sourceDir: string } {\n return srcDir\n ? { routesDir: \"src/app\", sourceDir: \"src\" }\n : { routesDir: \"app\", sourceDir: \"app\" };\n}\n\nfunction viteConfigSource(paths: { routesDir: string; sourceDir: string }): string {\n return `import { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { defineConfig } from \"vite\";\nimport { mreactRouter } from \"@reckona/mreact-router/vite\";\n\nconst projectRoot = dirname(fileURLToPath(import.meta.url));\n\nexport default defineConfig({\n plugins: [\n mreactRouter({\n projectRoot,\n routesDir: \"${paths.routesDir}\",\n publicDir: \"public\",\n allowedSourceDirs: [\"${paths.sourceDir}\"],\n }),\n ],\n});\n`;\n}\n\nfunction packageScripts(\n packageManager: CreateMreactAppPackageManager,\n options: {\n cloudflare: boolean;\n deploy?: CreateMreactAppDeployTarget | undefined;\n srcDir: boolean;\n tailwind: boolean;\n },\n): Record<string, string> {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n const paths = templatePaths(options.srcDir);\n const scripts: Record<string, string> = {\n dev: \"mreact-router dev\",\n build: \"mreact-router build --target=node\",\n typecheck: \"tsc --noEmit\",\n lint: \"oxlint . --ignore-pattern .mreact\",\n test: \"vitest run --passWithNoTests\",\n start: \"mreact-router start .mreact\",\n };\n\n if (options.tailwind) {\n scripts[\"prepare:css\"] = \"node -e \\\"require('node:fs').mkdirSync('public',{recursive:true})\\\"\";\n scripts[\"dev:css\"] =\n `tailwindcss -i ./${paths.routesDir}/globals.css -o ./public/styles.css --watch`;\n scripts[\"build:css\"] =\n `tailwindcss -i ./${paths.routesDir}/globals.css -o ./public/styles.css --minify`;\n scripts.dev = `${run} prepare:css && concurrently \"${run} dev:css\" \"${run} dev:router\"`;\n scripts[\"dev:router\"] = \"mreact-router dev\";\n scripts.build = `${run} prepare:css && ${run} build:css && mreact-router build --target=node`;\n }\n\n if (options.cloudflare) {\n const cloudflareBuild = \"mreact-router build --target=cloudflare\";\n scripts.deploy = \"wrangler deploy\";\n scripts.dev = `${run} build && wrangler dev`;\n scripts.preview = `${run} build && wrangler dev`;\n scripts.build = options.tailwind\n ? `${run} prepare:css && ${run} build:css && ${cloudflareBuild}`\n : cloudflareBuild;\n }\n\n if (options.deploy === \"aws-lambda\") {\n const lambdaBuild = \"mreact-router build --target=aws-lambda\";\n scripts.build = options.tailwind\n ? `${run} prepare:css && ${run} build:css && ${lambdaBuild}`\n : lambdaBuild;\n scripts[\"package:lambda\"] =\n \"mreact-router package aws-lambda --from .mreact --out .lambda --skip-runtime-dependency-check\";\n }\n\n return scripts;\n}\n\nasync function assertDirectoryWritable(directory: string): Promise<void> {\n await mkdir(directory, { recursive: true });\n const entries = await readdir(directory);\n\n if (entries.length > 0) {\n throw new Error(`Target directory is not empty: ${directory}`);\n }\n}\n\nasync function writeProjectFile(root: string, file: TemplateFile): Promise<void> {\n const path = join(root, file.path);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, file.content);\n}\n\nfunction sanitizePackageName(name: string): string {\n const sanitized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[._-]+|[._-]+$/g, \"\")\n .slice(0, 214)\n .replace(/[._-]+$/g, \"\");\n\n return sanitized || \"mreact-app\";\n}\n\nfunction isDependencyRecord(value: unknown): value is Record<string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.values(value).every((entry) => typeof entry === \"string\")\n );\n}\n\nfunction isMreactWorkspacePackage(name: string): boolean {\n return name.startsWith(\"@reckona/mreact\") || name === \"@reckona/create-mreact-app\";\n}\n\nasync function appRouterGlobalsTsconfigUpdate(\n directory: string,\n packageJson: Record<string, unknown>,\n): Promise<{ changed: false } | { changed: true; config: Record<string, unknown>; path: string }> {\n if (!hasDependency(packageJson, \"@reckona/mreact-router\")) {\n return { changed: false };\n }\n\n const path = join(directory, \"tsconfig.json\");\n let source: string;\n\n try {\n source = await readFile(path, \"utf8\");\n } catch {\n return { changed: false };\n }\n\n let config: Record<string, unknown>;\n\n try {\n config = JSON.parse(source) as Record<string, unknown>;\n } catch {\n return { changed: false };\n }\n\n const compilerOptions = ensureObjectProperty(config, \"compilerOptions\");\n const types = compilerOptions.types;\n\n if (Array.isArray(types)) {\n if (types.includes(appRouterGlobalsType)) {\n return { changed: false };\n }\n\n types.push(appRouterGlobalsType);\n return { changed: true, config, path };\n }\n\n compilerOptions.types = [appRouterGlobalsType];\n return { changed: true, config, path };\n}\n\nfunction ensureObjectProperty(\n parent: Record<string, unknown>,\n key: string,\n): Record<string, unknown> {\n const value = parent[key];\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n\n const next: Record<string, unknown> = {};\n parent[key] = next;\n return next;\n}\n\nfunction hasDependency(packageJson: Record<string, unknown>, name: string): boolean {\n return packageDependencyFields.some((field) => {\n const dependencies = packageJson[field];\n return isDependencyRecord(dependencies) && Object.hasOwn(dependencies, name);\n });\n}\n\nasync function inferPackageNameForTarget(\n directory: string,\n name: string | undefined,\n): Promise<string> {\n if (name !== undefined) {\n return sanitizePackageName(name);\n }\n\n const targetDirectory = resolve(directory);\n const fallbackName = sanitizePackageName(basename(targetDirectory) || \"mreact-app\");\n const workspaceRoot = await findPnpmWorkspaceRoot(dirname(targetDirectory));\n\n if (workspaceRoot === undefined) {\n return fallbackName;\n }\n\n const workspaceGlobs = await readPnpmWorkspacePackageGlobs(workspaceRoot);\n const relativeTarget = relative(workspaceRoot, targetDirectory).replaceAll(\"\\\\\", \"/\");\n\n if (workspaceGlobs.includes(\"examples/*\") && /^examples\\/[^/]+$/.test(relativeTarget)) {\n return `@reckona/example-${fallbackName.replace(/^@[^/]+\\//, \"\")}`;\n }\n\n return fallbackName;\n}\n\nfunction dependencyRange(\n packageName: keyof typeof internalPackageVersions,\n workspacePackages: ReadonlySet<string>,\n): string {\n return workspacePackages.has(packageName) ? \"workspace:*\" : internalPackageVersions[packageName];\n}\n\nasync function detectWorkspacePackagesForTarget(directory: string): Promise<ReadonlySet<string>> {\n const workspaceRoot = await findPnpmWorkspaceRoot(dirname(resolve(directory)));\n\n if (workspaceRoot === undefined) {\n return new Set();\n }\n\n const workspaceGlobs = await readPnpmWorkspacePackageGlobs(workspaceRoot);\n const packageNames = new Set<string>();\n\n for (const glob of workspaceGlobs) {\n if (!glob.endsWith(\"/*\")) {\n continue;\n }\n\n const parent = join(workspaceRoot, glob.slice(0, -2));\n let entries: string[];\n\n try {\n entries = await readdir(parent);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const packageJsonPath = join(parent, entry, \"package.json\");\n\n try {\n const json = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as { name?: unknown };\n if (typeof json.name === \"string\" && json.name.startsWith(\"@reckona/\")) {\n packageNames.add(json.name);\n }\n } catch {\n continue;\n }\n }\n }\n\n return packageNames;\n}\n\nasync function findPnpmWorkspaceRoot(startDirectory: string): Promise<string | undefined> {\n let current = resolve(startDirectory);\n\n while (true) {\n try {\n await readFile(join(current, \"pnpm-workspace.yaml\"), \"utf8\");\n return current;\n } catch {\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n }\n}\n\nasync function readPnpmWorkspacePackageGlobs(workspaceRoot: string): Promise<string[]> {\n const source = await readFile(join(workspaceRoot, \"pnpm-workspace.yaml\"), \"utf8\");\n const globs: string[] = [];\n\n for (const line of source.split(/\\r?\\n/)) {\n const match = /^\\s*-\\s*[\"']?([^\"'\\s#]+)[\"']?/.exec(line);\n if (match?.[1] !== undefined) {\n globs.push(match[1]);\n }\n }\n\n return globs;\n}\n\nfunction shouldRunCodemod(\n fromVersion: string | undefined,\n codemodVersion: string,\n targetVersion: string,\n): boolean {\n if (fromVersion === undefined) {\n return true;\n }\n\n return (\n compareVersions(fromVersion, codemodVersion) < 0 &&\n compareVersions(codemodVersion, targetVersion) <= 0\n );\n}\n\nfunction compareVersions(left: string, right: string): number {\n const leftParts = parseVersion(left);\n const rightParts = parseVersion(right);\n\n for (let index = 0; index < 3; index += 1) {\n const difference = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);\n if (difference !== 0) {\n return difference;\n }\n }\n\n return 0;\n}\n\nfunction parseVersion(value: string): [number, number, number] {\n const [major = \"0\", minor = \"0\", patch = \"0\"] = value.replace(/^[^\\d]*/, \"\").split(\".\");\n\n return [Number(major) || 0, Number(minor) || 0, Number(patch) || 0];\n}\n\nfunction json(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nconst layoutSource = `export default function Layout() {\n return (\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n </head>\n <body>\n <Slot />\n </body>\n </html>\n );\n}\n`;\n\nconst tailwindLayoutSource = `export default function Layout() {\n return (\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"stylesheet\" href=\"/styles.css\" />\n </head>\n <body class=\"bg-slate-950 text-slate-100\">\n <Slot />\n </body>\n </html>\n );\n}\n`;\n\nfunction dashboardLayoutSource(devtoolsImport: string): string {\n return `import { DashboardDevtools } from \"${devtoolsImport}\";\n\nexport default function Layout() {\n return (\n <html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"stylesheet\" href=\"/styles.css\" />\n </head>\n <body class=\"bg-slate-950 text-slate-100\">\n <Slot />\n <DashboardDevtools />\n </body>\n </html>\n );\n}\n`;\n}\n\nconst pageSource = `import { cell } from \"@reckona/mreact-reactive-core\";\n\nexport const metadata = {\n title: \"Counter\",\n};\n\nexport default function Page() {\n const count = cell<number>(0);\n\n return (\n <main>\n <h1>mreact counter</h1>\n <p>\n Count: <strong>{count.get()}</strong>\n </p>\n <p>\n <button type=\"button\" onClick={() => count.set((value) => value + 1)}>\n +1\n </button>{\" \"}\n <button type=\"button\" onClick={() => count.set(0)}>\n Reset\n </button>\n </p>\n </main>\n );\n}\n`;\n\nconst srcDirPageSource = `import { cell } from \"@reckona/mreact-reactive-core\";\nimport { appTitle } from \"../lib/app-info.js\";\n\nexport const metadata = {\n title: \"Counter\",\n};\n\nexport default function Page() {\n const count = cell<number>(0);\n\n return (\n <main>\n <h1>{appTitle}</h1>\n <p>\n Count: <strong>{count.get()}</strong>\n </p>\n <p>\n <button type=\"button\" onClick={() => count.set((value) => value + 1)}>\n +1\n </button>{\" \"}\n <button type=\"button\" onClick={() => count.set(0)}>\n Reset\n </button>\n </p>\n </main>\n );\n}\n`;\n\nconst appInfoSource = `export const appTitle = \"mreact counter\";\n`;\n\nconst cloudflareWorkerEnvSource = `export {};\n\ndeclare global {\n interface Env {\n ASSETS: Fetcher;\n // Example R2 binding. Uncomment the matching wrangler.toml stanza before use.\n MEDIA?: R2Bucket;\n }\n}\n`;\n\nconst tailwindPageSource = `import { cell } from \"@reckona/mreact-reactive-core\";\n\nexport const metadata = {\n title: \"Counter\",\n};\n\nexport default function Page() {\n const count = cell<number>(0);\n\n return (\n <main class=\"mx-auto flex min-h-screen max-w-3xl flex-col justify-center gap-5 px-6\">\n <p class=\"text-sm font-medium text-cyan-300\">mreact</p>\n <h1 class=\"text-4xl font-semibold\">Counter starter</h1>\n <section class=\"grid gap-3 rounded-lg border border-slate-800 bg-slate-900 p-5\">\n <p class=\"text-slate-300\">\n Count: <strong class=\"text-white\">{count.get()}</strong>\n </p>\n <div class=\"flex flex-wrap gap-3\">\n <button\n type=\"button\"\n class=\"rounded-md bg-cyan-300 px-4 py-2 font-medium text-slate-950\"\n onClick={() => count.set((value) => value + 1)}\n >\n +1\n </button>\n <button\n type=\"button\"\n class=\"rounded-md border border-slate-700 px-4 py-2 text-slate-100\"\n onClick={() => count.set(0)}\n >\n Reset\n </button>\n </div>\n </section>\n </main>\n );\n}\n`;\n\nconst dashboardHomePageSource = `export const metadata = {\n title: \"Dashboard starter\",\n};\n\nexport default function Page() {\n return (\n <main class=\"mx-auto grid min-h-screen max-w-5xl content-center gap-6 px-6 py-12\">\n <section class=\"grid gap-3\">\n <p class=\"text-sm font-medium text-cyan-300\">mreact dashboard starter</p>\n <h1 class=\"text-4xl font-semibold text-white\">Operations dashboard baseline</h1>\n <p class=\"max-w-2xl text-slate-300\">\n Auth guards, form state, query cache hydration, Tailwind, and the devtools overlay are\n wired into one starter.\n </p>\n </section>\n <nav class=\"flex flex-wrap gap-3\">\n <a class=\"rounded-md bg-cyan-300 px-4 py-2 font-medium text-slate-950\" href=\"/dashboard\">\n Open dashboard\n </a>\n <a class=\"rounded-md border border-slate-700 px-4 py-2 text-slate-100\" href=\"/login\">\n Login form\n </a>\n </nav>\n </main>\n );\n}\n`;\n\nconst dashboardPageSource = `import { requireRole } from \"@reckona/mreact-auth\";\nimport {\n createQuery,\n getQueryClient,\n type QueryKey,\n} from \"@reckona/mreact-query\";\nimport type { LoaderContext } from \"@reckona/mreact-router\";\nimport { sessions, type DashboardSessionData } from \"../session-store.js\";\n\nexport const metadata = {\n title: \"Dashboard\",\n};\n\ninterface DashboardMetric {\n label: string;\n value: string;\n}\n\ninterface DashboardData {\n actor: string;\n metrics: readonly DashboardMetric[];\n}\n\nconst DASHBOARD_KEY: QueryKey = [\"dashboard\", \"metrics\"];\n\nasync function fetchDashboardMetrics(): Promise<readonly DashboardMetric[]> {\n return [\n { label: \"Active users\", value: \"1,248\" },\n { label: \"Conversion\", value: \"7.4%\" },\n { label: \"Queue depth\", value: \"18\" },\n ];\n}\n\nexport async function loader(context: LoaderContext): Promise<DashboardData> {\n const session = await requireRole<DashboardSessionData>(context.request, sessions, \"admin\");\n const metrics = await context.queryClient.fetchQuery({\n queryKey: DASHBOARD_KEY,\n queryFn: fetchDashboardMetrics,\n });\n\n return {\n actor: session.data.userId,\n metrics,\n };\n}\n\nexport default function Page(props: { data: DashboardData }) {\n const observer = createQuery(getQueryClient(), {\n queryKey: DASHBOARD_KEY,\n queryFn: fetchDashboardMetrics,\n });\n const live = observer.result.get();\n const metrics = live.data ?? props.data.metrics;\n\n return (\n <main class=\"mx-auto grid max-w-6xl gap-6 px-6 py-10\">\n <header class=\"flex flex-wrap items-end justify-between gap-4\">\n <div>\n <p class=\"text-sm text-cyan-300\">Signed in as {props.data.actor}</p>\n <h1 class=\"text-3xl font-semibold text-white\">Dashboard</h1>\n </div>\n <form method=\"post\" action=\"/api/logout\">\n <button class=\"rounded-md border border-slate-700 px-3 py-2 text-sm text-slate-200\" type=\"submit\">\n Sign out\n </button>\n </form>\n </header>\n <section class=\"grid gap-4 md:grid-cols-3\">\n {metrics.map((metric) => (\n <article class=\"rounded-lg border border-slate-800 bg-slate-900 p-4\" key={metric.label}>\n <p class=\"text-sm text-slate-400\">{metric.label}</p>\n <strong class=\"mt-2 block text-3xl text-white\">{metric.value}</strong>\n </article>\n ))}\n </section>\n <section class=\"rounded-lg border border-slate-800 bg-slate-900\">\n <table class=\"w-full border-collapse text-left text-sm\">\n <thead class=\"text-slate-400\">\n <tr>\n <th class=\"border-b border-slate-800 p-3\">Segment</th>\n <th class=\"border-b border-slate-800 p-3\">Status</th>\n <th class=\"border-b border-slate-800 p-3\">Owner</th>\n </tr>\n </thead>\n <tbody>\n {[\"Acquisition\", \"Activation\", \"Retention\"].map((segment) => (\n <tr key={segment}>\n <td class=\"border-b border-slate-800 p-3\">{segment}</td>\n <td class=\"border-b border-slate-800 p-3 text-emerald-300\">On track</td>\n <td class=\"border-b border-slate-800 p-3\">Admin</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n </main>\n );\n}\n`;\n\nconst dashboardLoginPageSource = `export const metadata = {\n title: \"Login\",\n};\n\nexport default function Page() {\n return (\n <main class=\"mx-auto grid min-h-screen max-w-md content-center px-6\">\n <form\n class=\"grid gap-4 rounded-lg border border-slate-800 bg-slate-900 p-6\"\n method=\"post\"\n action=\"/api/login\"\n >\n <h1 class=\"text-2xl font-semibold text-white\">Login</h1>\n <p class=\"text-sm text-slate-300\">\n Demo account: <code>demo@example.com</code> / <code>kanban1234</code>\n </p>\n <p class=\"text-xs text-amber-200\">\n Replace these development-only credentials before production.\n </p>\n <label class=\"grid gap-1 text-sm text-slate-300\">\n Email\n <input class=\"rounded-md border border-slate-700 bg-slate-950 px-3 py-2\" name=\"email\" type=\"email\" defaultValue=\"demo@example.com\" required />\n </label>\n <label class=\"grid gap-1 text-sm text-slate-300\">\n Password\n <input class=\"rounded-md border border-slate-700 bg-slate-950 px-3 py-2\" name=\"password\" type=\"password\" defaultValue=\"kanban1234\" required />\n </label>\n <button class=\"rounded-md bg-cyan-300 px-4 py-2 font-medium text-slate-950\" type=\"submit\">\n Continue\n </button>\n </form>\n </main>\n );\n}\n`;\n\nconst dashboardLoginRouteSource = `import { createSession } from \"@reckona/mreact-auth\";\nimport { sessions } from \"../../session-store.js\";\n\n// Development-only demo credentials. Replace this route with your real\n// authentication provider before deploying the dashboard starter.\nconst demoAccount = {\n email: \"demo@example.com\",\n password: \"kanban1234\",\n roles: [\"admin\"],\n} as const;\n\nexport async function POST(request: Request): Promise<Response> {\n if (process.env.NODE_ENV !== \"development\" && process.env.NODE_ENV !== \"test\") {\n return Response.json(\n { ok: false, error: \"Development-only demo credentials are disabled outside development.\" },\n { status: 403 },\n );\n }\n\n const form = await request.formData();\n const email = String(form.get(\"email\") ?? \"\");\n const password = String(form.get(\"password\") ?? \"\");\n\n if (email !== demoAccount.email || password !== demoAccount.password) {\n return Response.json({ ok: false, error: \"Invalid demo credentials.\" }, { status: 401 });\n }\n\n const response = new Response(null, {\n status: 303,\n headers: { location: \"/dashboard\" },\n });\n await createSession(response, sessions, {\n userId: demoAccount.email,\n roles: demoAccount.roles,\n });\n return response;\n}\n`;\n\nconst dashboardLogoutRouteSource = `import { destroySession } from \"@reckona/mreact-auth\";\nimport { sessions } from \"../../session-store.js\";\n\nexport async function POST(request: Request): Promise<Response> {\n const response = new Response(null, {\n status: 303,\n headers: { location: \"/login\" },\n });\n await destroySession(request, response, sessions);\n return response;\n}\n`;\n\nconst dashboardMiddlewareSource = `import { getSession } from \"@reckona/mreact-auth\";\nimport { redirect } from \"@reckona/mreact-router\";\nimport { sessions } from \"./session-store.js\";\n\nexport const config = { matcher: [\"/dashboard/:path*\"] };\n\nexport async function middleware(request: Request): Promise<Response | undefined> {\n const session = await getSession(request, sessions);\n if (session === undefined) {\n redirect(\"/login\");\n }\n return undefined;\n}\n`;\n\nconst dashboardSessionStoreSource = `import { createMemorySessionStore, type AuthSessionClaims } from \"@reckona/mreact-auth\";\n\nexport interface DashboardSessionData extends AuthSessionClaims {\n roles: readonly string[];\n userId: string;\n}\n\nconst globalKey = \"__mreactDashboardSessions\";\nconst globalStore = globalThis as typeof globalThis & {\n [globalKey]?: ReturnType<typeof createMemorySessionStore<DashboardSessionData>>;\n};\n\nexport const sessions =\n globalStore[globalKey] ??= createMemorySessionStore<DashboardSessionData>();\n`;\n\nconst dashboardDevtoolsSource = `export async function mountDashboardDevtools(): Promise<void> {\n if (!import.meta.env.DEV || typeof document === \"undefined\") {\n return;\n }\n\n const { mountDevtoolsOverlay } = await import(\"@reckona/mreact-devtools/overlay\");\n mountDevtoolsOverlay();\n}\n`;\n\nconst dashboardDevtoolsBoundarySource = `import { effect } from \"@reckona/mreact-reactive-core\";\nimport { mountDashboardDevtools } from \"./devtools.js\";\n\nexport function DashboardDevtools() {\n effect(() => {\n void mountDashboardDevtools();\n });\n\n return null;\n}\n`;\n\nconst tailwindCssSource = `@import \"tailwindcss\";\n`;\n\nconst awsLambdaHandlerSource = `import { createPreloadedAwsLambdaRequestHandler } from \"@reckona/mreact-router/adapters/aws-lambda\";\n\nexport const handler = await createPreloadedAwsLambdaRequestHandler({\n outDir: new URL(\"../.mreact\", import.meta.url).pathname,\n importPolicy: \"generated\",\n});\n`;\n\nfunction wranglerSource(name: string): string {\n return `name = \"${name}\"\nmain = \".mreact/cloudflare/worker.mjs\"\ncompatibility_date = \"2026-05-15\"\n\n[assets]\ndirectory = \".mreact/client\"\nbinding = \"ASSETS\"\n\n# Example R2 binding. Uncomment and replace the bucket name when the app needs R2.\n# [[r2_buckets]]\n# binding = \"MEDIA\"\n# bucket_name = \"${name}-media\"\n`;\n}\n\nfunction dockerfileSource(packageManager: CreateMreactAppPackageManager): string {\n const installCommand =\n packageManager === \"pnpm\"\n ? \"pnpm install --frozen-lockfile || pnpm install\"\n : packageManager === \"npm\"\n ? \"npm install\"\n : \"bun install\";\n const buildCommand = packageManager === \"npm\" ? \"npm run build\" : `${packageManager} run build`;\n const startCommand =\n packageManager === \"npm\"\n ? `CMD [\"npm\", \"start\"]`\n : packageManager === \"bun\"\n ? `CMD [\"bun\", \"run\", \"start\"]`\n : `CMD [\"pnpm\", \"start\"]`;\n const enablePackageManager =\n packageManager === \"pnpm\"\n ? \"RUN corepack enable\\n\"\n : packageManager === \"bun\"\n ? \"RUN npm install -g bun\\n\"\n : \"\";\n\n return `FROM node:24-bookworm-slim AS deps\nWORKDIR /app\n${enablePackageManager}COPY . .\nRUN ${installCommand}\n\nFROM node:24-bookworm-slim AS build\nWORKDIR /app\n${enablePackageManager}COPY --from=deps /app ./\nRUN ${buildCommand}\n\nFROM node:24-bookworm-slim AS runner\nWORKDIR /app\nENV NODE_ENV=production\nENV HOST=0.0.0.0\nENV MREACT_ROUTER_HOST_POLICY=strict\nENV PORT=8080\n${enablePackageManager}COPY --from=build /app/package.json ./package.json\nCOPY --from=build /app/node_modules ./node_modules\nCOPY --from=build /app/.mreact ./.mreact\nEXPOSE 8080\n${startCommand}\n`;\n}\n\nconst dockerignoreSource = `node_modules\n.mreact\ndist\n.git\n.gitignore\n.env\n.env.*\nnpm-debug.log*\npnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n`;\n\nfunction containerDeployReadmeSource(packageManager: CreateMreactAppPackageManager): string {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n\n return `# Container deployment\n\nThis project includes a generic container image for platforms such as Cloud Run,\nAWS App Runner, Fly.io, Render, and other services that run an HTTP server from\na container.\n\n## Local build\n\n\\`\\`\\`bash\n${run} build\ndocker build -t mreact-app .\ndocker run --rm -p 8080:8080 -e HOST=0.0.0.0 -e MREACT_ROUTER_HOST_POLICY=strict -e PORT=8080 mreact-app\n\\`\\`\\`\n\nThe server reads \\`HOST\\` and \\`PORT\\` and defaults to the values provided by\nthe platform. The Dockerfile sets \\`HOST=0.0.0.0\\` so published container ports\ncan reach the Node server and \\`MREACT_ROUTER_HOST_POLICY=strict\\` so public\ncontainers do not implicitly trust arbitrary Host headers. Set\n\\`MREACT_ROUTER_ALLOWED_HOSTS\\` to your deployed hostnames when your app needs\nthe public origin for absolute URLs.\nThe Dockerfile uses Node 24 LTS and runs \\`${run} start\\`.\n\n## Cloud Run\n\nCloud Run injects \\`PORT\\` automatically. The Dockerfile sets \\`HOST=0.0.0.0\\`,\n\\`MREACT_ROUTER_HOST_POLICY=strict\\`, and \\`PORT=8080\\` for local runs, which\nmatches Cloud Run's common default. Build and deploy the image with your\npreferred Google Cloud workflow, then route HTTP traffic to the container.\n\n## AWS App Runner\n\nAWS App Runner can use the same image. Configure the service port as \\`8080\\`\nor set \\`PORT\\` to the value you choose for the service. Use a simple HTTP\nhealth check path such as \\`/\\`.\n\n## CDN assets\n\n\\`.mreact/client\\` contains hashed client route assets and copied public assets\nat their root paths, with \\`.mreact/client/public\\` kept as a compatibility\nmirror. To serve them from a CDN, upload that directory to your static origin\nand configure the router:\n\n\\`\\`\\`ts\nimport { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst projectRoot = dirname(fileURLToPath(import.meta.url));\n\nmreactRouter({\n projectRoot,\n routesDir: \"src/app\",\n publicDir: \"public\",\n allowedSourceDirs: [\"src\"],\n assetBaseUrl: \"https://cdn.example.com/_mreact/client/\",\n publicAssetBaseUrl: \"https://cdn.example.com/\",\n});\n\\`\\`\\`\n\nHashed route assets can use a long immutable cache. \\`manifest.json\\` and\nnon-fingerprinted public assets should use a shorter cache or revalidation.\n`;\n}\n\nfunction awsLambdaDeployReadmeSource(packageManager: CreateMreactAppPackageManager): string {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n const installProd =\n packageManager === \"pnpm\"\n ? \"pnpm --dir .lambda install --prod --frozen-lockfile --ignore-scripts --config.node-linker=hoisted\"\n : packageManager === \"npm\"\n ? \"(cd .lambda && npm ci --omit=dev --ignore-scripts)\"\n : \"(cd .lambda && bun install --production)\";\n const lockfiles =\n packageManager === \"pnpm\"\n ? \"pnpm-lock.yaml pnpm-workspace.yaml\"\n : packageManager === \"npm\"\n ? \"package-lock.json npm-shrinkwrap.json\"\n : \"bun.lock\";\n\n return `# AWS Lambda deployment\n\nThis project includes a generated Lambda handler for API Gateway HTTP API v2 and\nLambda Function URL events. \\`src/lambda.ts\\` is included as a small custom\nhandler starting point when you need to add adapter options.\n\n## Build\n\n\\`\\`\\`bash\n${run} build\n${run} package:lambda\n\\`\\`\\`\n\nThe generated \\`build\\` script runs \\`mreact-router build --target=aws-lambda\\`.\nThat target emits Node-compatible server/client output, a generated import\npolicy at \\`.mreact/server/import-policy.json\\`, and a preloaded Lambda handler\nat \\`.mreact/aws-lambda/mreact-handler.mjs\\`. If you replace the script, use the\nsame target explicitly:\n\n\\`\\`\\`bash\nmreact-router build --target=aws-lambda\n${run} package:lambda\n\\`\\`\\`\n\nYou can also make the target a project default in \\`vite.config.ts\\`:\n\n\\`\\`\\`ts\nmreactRouter({\n buildTargets: [\"aws-lambda\"],\n});\n\\`\\`\\`\n\n\\`.lambda/mreact-handler.mjs\\` exports \\`handler\\` after \\`${run} package:lambda\\`.\nPackage that file together with \\`.lambda/.mreact\\`, \\`package.json\\`, and\nproduction \\`node_modules\\`.\n\nThe generated \\`package:lambda\\` script uses \\`--skip-runtime-dependency-check\\` because the prepare script below installs production dependencies into \\`.lambda/node_modules\\` after creating the minimal artifact. Do not deploy the artifact before that install step finishes.\n\n## Minimal deployment artifact\n\nAWS Lambda has a 250 MB unzipped deployment package limit. Do not point CDK, SAM, Serverless Framework, or Terraform at the full project root after a CI install, because that can include source files, tests, dev dependencies, Vite/Vitest/Playwright tooling, and package-manager caches. The mreact runtime only needs the built app output, the Lambda handler bundle, and production runtime dependencies.\n\nThe Lambda adapter treats \\`outDir\\` as read-only. On cold start it materializes generated runtime files under \\`/tmp/mreact-router/<hash>/runtime\\` and creates a \\`node_modules\\` symlink back to the deployed package root so server-side imports resolve from the production dependencies. Static middleware \\`config.matcher\\` / \\`config.id\\` checks run before middleware module import, and loader redirects settle before page component server transforms for non-stream routes and stream routes without a loading boundary. Pass \\`runtimeDir\\` to \\`createAwsLambdaRequestHandler()\\` only if you need a custom writable cache directory.\n\npnpm's default isolated linker creates a symlink-heavy \\`node_modules\\` tree. Some Lambda packaging tools dereference those links or count their targets differently, which can make an artifact look small locally but exceed the unzipped limit after packaging. For pnpm Lambda artifacts, install production dependencies into \\`.lambda/\\` with \\`--config.node-linker=hoisted\\`, then verify both symlink count and actual file bytes before upload.\n\n\\`src/\\` is not required at runtime when \\`.mreact/server/manifest.json\\` is present. Server source needed by the runtime is materialized into the build manifest and server module artifacts during \\`${run} build\\`.\n\nRecommended artifact layout:\n\n\\`\\`\\`text\n.lambda/\n .mreact/\n mreact-handler.mjs\n mreact-lambda-artifact.json\n package.json\n lockfile\n node_modules/\n\\`\\`\\`\n\nCreate a dedicated asset directory before handing it to CDK/SAM/serverless. Save this as \\`scripts/prepare-lambda-asset.sh\\` if you want a repeatable deploy step:\n\n\\`\\`\\`bash\n#!/usr/bin/env bash\nset -euo pipefail\n\nrm -rf .lambda\n\n${run} build\n${run} package:lambda\ncp package.json .lambda/\nfor file in ${lockfiles}; do\n if [ -f \"$file\" ]; then\n cp \"$file\" .lambda/\n fi\ndone\n\n${installProd}\nfind .lambda -name '*.tsbuildinfo' -delete\ndu -sh .lambda\nfind .lambda -type l | wc -l\nfind .lambda -type f -printf '%s\\\\n' | awk '{ total += $1 } END { printf \"actual file bytes: %d\\\\n\", total }'\n\\`\\`\\`\n\n## Runtime shape\n\n- Use API Gateway HTTP API v2 or Lambda Function URL payload format 2.0.\n- Use a Node.js Lambda runtime that supports Web \\`Request\\` and \\`Response\\`.\n- The adapter returns the Lambda proxy response shape with \\`cookies\\`,\n \\`headers\\`, \\`statusCode\\`, \\`body\\`, and \\`isBase64Encoded\\`.\n- Binary responses are base64 encoded automatically.\n\n## Server dependencies\n\nProduction adapters enforce the app-router import policy when bundling loaders, middleware, route handlers, metadata, and server actions. The build writes \\`.mreact/server/import-policy.json\\` from server-side static imports, and generated Lambda handlers use \\`importPolicy: \"generated\"\\` by default. AWS Lambda request/control artifacts bundle the generated import-policy packages they use for loaders, middleware, route handlers, and metadata, reducing first-hit package resolution on sparse Lambda traffic. Packages listed in the generated import policy may still be needed by render-only modules, inferred server actions, custom handlers, or adapter code, so keep them installed in the production \\`node_modules\\` copied into the Lambda artifact.\n\n\\`\\`\\`ts\nexport const handler = await createPreloadedAwsLambdaRequestHandler({\n outDir: new URL(\"../.mreact\", import.meta.url).pathname,\n importPolicy: \"generated\",\n});\n\\`\\`\\`\n\nThe generated handler uses top-level \\`await\\` with \\`createPreloadedAwsLambdaRequestHandler()\\` so the built runtime, middleware, route modules, layouts, and metadata are imported during the Lambda initialization phase instead of racing the first user request. Static middleware matchers, loader redirects, request/control artifacts split from render artifacts, AWS Lambda request/control package bundling, compiled module files, and optional \\`hot-route-requests\\` preload avoid unnecessary dependency evaluation on unmatched health checks and simple redirects. Add \\`timings: true\\` while diagnosing production latency to emit \\`router:request:timing\\` and \\`router:render:timing\\` debug events for request conversion, render phases, loader wait, source analysis, page module load, page component render, layout module load, layout component render, response construction, and Lambda response conversion. Loader timing splits module load/evaluation from user loader execution with \\`loaderModuleLoadMs\\` and \\`loaderExecutionMs\\`; source analysis reports \\`sourceAnalysisArtifactMs\\` when a built analysis summary is reused; middleware timing similarly splits \\`middlewareModuleLoadMs\\` and \\`middlewareExecutionMs\\`.\n\n## Streaming SSR\n\nAPI Gateway and Lambda Function URL proxy responses are buffered. mreact still\nrenders through the same server pipeline, but Streaming SSR is materialized into\none Lambda response body.\n\nFor Lambda Function URL response streaming, switch \\`src/lambda.ts\\` to the\nexplicit streaming handler:\n\n\\`\\`\\`ts\nimport { createAwsLambdaStreamingRequestHandler } from \"@reckona/mreact-router/adapters/aws-lambda\";\n\nexport const handler = createAwsLambdaStreamingRequestHandler({\n outDir: new URL(\"../.mreact\", import.meta.url).pathname,\n});\n\\`\\`\\`\n\nThe streaming handler requires an AWS integration configured for payload\nresponse streaming and the Node.js Lambda runtime \\`awslambda.streamifyResponse()\\`\nplus \\`awslambda.HttpResponseStream.from()\\` APIs.\n\n## Static assets\n\nLambda can serve \\`.mreact/client\\`, but it is usually better to move static\nassets to S3 + CloudFront. Upload \\`.mreact/client\\` to your static origin and\nconfigure the router:\n\n\\`\\`\\`ts\nimport { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst projectRoot = dirname(fileURLToPath(import.meta.url));\n\nmreactRouter({\n projectRoot,\n routesDir: \"src/app\",\n publicDir: \"public\",\n allowedSourceDirs: [\"src\"],\n assetBaseUrl: \"https://cdn.example.com/_mreact/client/\",\n publicAssetBaseUrl: \"https://cdn.example.com/\",\n});\n\\`\\`\\`\n\nHashed route assets can use a long immutable cache. \\`manifest.json\\` and\nnon-fingerprinted public assets should use a shorter cache or revalidation.\n`;\n}\n\nfunction readmeSource(\n name: string,\n packageManager: CreateMreactAppPackageManager,\n options: {\n cloudflare: boolean;\n dashboard?: boolean | undefined;\n deploy?: CreateMreactAppDeployTarget | undefined;\n tailwind: boolean;\n },\n): string {\n const run = packageManager === \"npm\" ? \"npm run\" : `${packageManager} run`;\n const tailwindNote = options.tailwind\n ? \"\\nTailwind CSS v4 is configured in `app/globals.css`.\\n\"\n : \"\";\n const starterNote =\n options.dashboard\n ? \"\"\n : \"\\nThe generated home page is a counter starter that uses `cell` for client interactivity.\\n\";\n const cloudflareNote = options.cloudflare\n ? `\n## Cloudflare Workers\n\nThe Workers entrypoint is generated at \\`.mreact/cloudflare/worker.mjs\\`. \\`${run} dev\\` runs \\`${run} build\\` first so a fresh scaffold can start with Wrangler, and \\`${run} build\\` must still be run before \\`wrangler deploy\\`.\n\nBindings are declared in \\`wrangler.toml\\` and typed in \\`worker-env.d.ts\\`. The scaffold includes a commented R2 example named \\`MEDIA\\`; uncomment it and replace the bucket name before using \\`context.env.MEDIA\\` from loaders or route handlers.\n`\n : \"\";\n const deployNote =\n options.deploy === \"container\"\n ? \"\\nContainer deploy files are included. See `docs/deploy/container.md`.\\n\"\n : options.deploy === \"aws-lambda\"\n ? \"\\nAWS Lambda deploy files are included. See `docs/deploy/aws-lambda.md`.\\n\"\n : \"\";\n const dashboardNote = options.dashboard\n ? \"\\nThis is the dashboard starter. It includes auth guards, a development-only demo login, query cache hydration, Tailwind styling, and the devtools overlay in development. Demo account: `demo@example.com` / `kanban1234`. Replace these credentials before production; the generated login route enables them only when `NODE_ENV` is `development` or `test`.\\n\"\n : \"\";\n const pnpmTroubleshooting =\n packageManager === \"pnpm\"\n ? `\n## Troubleshooting\n\n### pnpm approve-builds warning\n\npnpm 10 may print an \\`Ignored build scripts\\` warning for transitive tooling packages such as \\`esbuild\\`, \\`@parcel/watcher\\`, \\`sharp\\`, or \\`workerd\\`. The generated \\`package.json\\` includes those packages in \\`pnpm.onlyBuiltDependencies\\`, so a fresh install or \\`pnpm rebuild\\` can run the required native build steps. If you add another native dependency, add its package name to \\`pnpm.onlyBuiltDependencies\\`, then run \\`pnpm rebuild <package>\\` or reinstall.\n\n### Adding native dependencies\n\nPackages such as \\`better-sqlite3\\`, \\`argon2\\`, \\`bcrypt\\`, \\`canvas\\`, and \\`node-pty\\` often use install scripts for native binaries. With pnpm 10, add the package to \\`pnpm.onlyBuiltDependencies\\` in \\`package.json\\` before rebuilding or reinstalling so the native binding is actually produced.\n`\n : \"\";\n\n return `# ${name}\n\nmreact app-router project generated by \\`@reckona/create-mreact-app\\`.\n\n## Scripts\n\n- \\`${run} dev\\`\n- \\`${run} build\\`\n- \\`${run} typecheck\\`\n- \\`${run} lint\\`\n- \\`${run} test\\`\n- \\`${run} start\\`\n${starterNote}${tailwindNote}${cloudflareNote}${deployNote}${dashboardNote}${pnpmTroubleshooting}`;\n}\n"]}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -70,15 +70,15 @@ interface TemplateDefinition {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
const internalPackageVersions = {
|
|
73
|
-
"@reckona/mreact-auth": "^0.0.
|
|
74
|
-
"@reckona/mreact-devtools": "^0.0.
|
|
75
|
-
"@reckona/mreact-forms": "^0.0.
|
|
76
|
-
"@reckona/mreact": "^0.0.
|
|
77
|
-
"@reckona/mreact-query": "^0.0.
|
|
78
|
-
"@reckona/mreact-reactive-core": "^0.0.
|
|
79
|
-
"@reckona/mreact-reactive-dom": "^0.0.
|
|
80
|
-
"@reckona/mreact-router": "^0.0.
|
|
81
|
-
"@reckona/mreact-test-utils": "^0.0.
|
|
73
|
+
"@reckona/mreact-auth": "^0.0.189",
|
|
74
|
+
"@reckona/mreact-devtools": "^0.0.189",
|
|
75
|
+
"@reckona/mreact-forms": "^0.0.189",
|
|
76
|
+
"@reckona/mreact": "^0.0.189",
|
|
77
|
+
"@reckona/mreact-query": "^0.0.189",
|
|
78
|
+
"@reckona/mreact-reactive-core": "^0.0.189",
|
|
79
|
+
"@reckona/mreact-reactive-dom": "^0.0.189",
|
|
80
|
+
"@reckona/mreact-router": "^0.0.189",
|
|
81
|
+
"@reckona/mreact-test-utils": "^0.0.189",
|
|
82
82
|
} as const satisfies Record<string, string>;
|
|
83
83
|
const currentMreactVersion = internalPackageVersions["@reckona/mreact"].replace(/^\^/, "");
|
|
84
84
|
const typescriptVersion = "^7.0.2";
|