@proofkit/cli 2.0.0-beta.21 → 2.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/add-DrcID6d6.js +57 -0
  3. package/dist/add-DrcID6d6.js.map +1 -0
  4. package/dist/addPackageDependency-BGZl7xc5.js +4 -0
  5. package/dist/addPackageDependency-BGZl7xc5.js.map +1 -0
  6. package/dist/consts-BZnOMxpW.js +10 -0
  7. package/dist/consts-BZnOMxpW.js.map +1 -0
  8. package/dist/deploy-D25sPO7K.js +34 -0
  9. package/dist/deploy-D25sPO7K.js.map +1 -0
  10. package/dist/fmdapi-BO4QL0F8.js +2 -0
  11. package/dist/fmdapi-BO4QL0F8.js.map +1 -0
  12. package/dist/fmdapi-DyRYZWzI.js +3 -0
  13. package/dist/fmdapi-DyRYZWzI.js.map +1 -0
  14. package/dist/getUserPkgManager-Cph_6l1P.js +2 -0
  15. package/dist/getUserPkgManager-Cph_6l1P.js.map +1 -0
  16. package/dist/globalOptions-CkqEi9uC.js +2 -0
  17. package/dist/globalOptions-CkqEi9uC.js.map +1 -0
  18. package/dist/index-DALPpGd1.d.ts +366 -0
  19. package/dist/index-DALPpGd1.d.ts.map +1 -0
  20. package/dist/index.js +10 -157
  21. package/dist/index.js.map +1 -1
  22. package/dist/logger-DCEXcH26.js +2 -0
  23. package/dist/logger-DCEXcH26.js.map +1 -0
  24. package/dist/parseSettings-DJ2m9sgJ.js +2 -0
  25. package/dist/parseSettings-DJ2m9sgJ.js.map +1 -0
  26. package/dist/proofkit-webviewer-73IB1OBU.js +2 -0
  27. package/dist/proofkit-webviewer-73IB1OBU.js.map +1 -0
  28. package/dist/remove-BOCU6In3.js +2 -0
  29. package/dist/remove-BOCU6In3.js.map +1 -0
  30. package/dist/state-BVEcvFT3.js +41 -0
  31. package/dist/state-BVEcvFT3.js.map +1 -0
  32. package/dist/typegen-DyXaif5O.js +2 -0
  33. package/dist/typegen-DyXaif5O.js.map +1 -0
  34. package/dist/update-FX71y5b3.js +7 -0
  35. package/dist/update-FX71y5b3.js.map +1 -0
  36. package/dist/utils-DymV7zmv.js +3 -0
  37. package/dist/utils-DymV7zmv.js.map +1 -0
  38. package/package.json +18 -8
  39. package/template/fm-addon/ProofKitWV/de.xml +517 -20
  40. package/template/fm-addon/ProofKitWV/en.xml +517 -20
  41. package/template/fm-addon/ProofKitWV/es.xml +517 -20
  42. package/template/fm-addon/ProofKitWV/fr.xml +517 -20
  43. package/template/fm-addon/ProofKitWV/icon.png +0 -0
  44. package/template/fm-addon/ProofKitWV/icon@2x.png +0 -0
  45. package/template/fm-addon/ProofKitWV/info.json +9 -6
  46. package/template/fm-addon/ProofKitWV/info_de.json +12 -5
  47. package/template/fm-addon/ProofKitWV/info_en.json +16 -5
  48. package/template/fm-addon/ProofKitWV/info_es.json +12 -5
  49. package/template/fm-addon/ProofKitWV/info_fr.json +12 -5
  50. package/template/fm-addon/ProofKitWV/info_it.json +12 -5
  51. package/template/fm-addon/ProofKitWV/info_ja.json +12 -5
  52. package/template/fm-addon/ProofKitWV/info_ko.json +12 -5
  53. package/template/fm-addon/ProofKitWV/info_nl.json +12 -5
  54. package/template/fm-addon/ProofKitWV/info_pt.json +12 -5
  55. package/template/fm-addon/ProofKitWV/info_sv.json +12 -5
  56. package/template/fm-addon/ProofKitWV/info_zh.json +12 -5
  57. package/template/fm-addon/ProofKitWV/it.xml +517 -20
  58. package/template/fm-addon/ProofKitWV/ja.xml +517 -20
  59. package/template/fm-addon/ProofKitWV/ko.xml +517 -20
  60. package/template/fm-addon/ProofKitWV/nl.xml +517 -20
  61. package/template/fm-addon/ProofKitWV/preview.png +0 -0
  62. package/template/fm-addon/ProofKitWV/pt.xml +517 -20
  63. package/template/fm-addon/ProofKitWV/records_de.xml +0 -0
  64. package/template/fm-addon/ProofKitWV/records_en.xml +0 -0
  65. package/template/fm-addon/ProofKitWV/records_es.xml +0 -0
  66. package/template/fm-addon/ProofKitWV/records_fr.xml +0 -0
  67. package/template/fm-addon/ProofKitWV/records_it.xml +0 -0
  68. package/template/fm-addon/ProofKitWV/records_ja.xml +0 -0
  69. package/template/fm-addon/ProofKitWV/records_ko.xml +0 -0
  70. package/template/fm-addon/ProofKitWV/records_nl.xml +0 -0
  71. package/template/fm-addon/ProofKitWV/records_pt.xml +0 -0
  72. package/template/fm-addon/ProofKitWV/records_sv.xml +0 -0
  73. package/template/fm-addon/ProofKitWV/records_zh.xml +0 -0
  74. package/template/fm-addon/ProofKitWV/sv.xml +517 -20
  75. package/template/fm-addon/ProofKitWV/template.xml +0 -0
  76. package/template/fm-addon/ProofKitWV/zh.xml +517 -20
  77. package/template/nextjs-mantine/AGENTS.md +1 -0
  78. package/template/nextjs-mantine/package.json +2 -3
  79. package/template/nextjs-shadcn/AGENTS.md +1 -0
  80. package/template/nextjs-shadcn/package.json +3 -4
  81. package/template/vite-wv/.claude/launch.json +18 -0
  82. package/template/vite-wv/AGENTS.md +1 -0
  83. package/template/vite-wv/_gitignore +1 -0
  84. package/template/vite-wv/components.json +6 -6
  85. package/template/vite-wv/index.html +2 -2
  86. package/template/vite-wv/package.json +20 -37
  87. package/template/vite-wv/proofkit-typegen.config.jsonc +18 -0
  88. package/template/vite-wv/proofkit.json +4 -1
  89. package/template/vite-wv/scripts/filemaker.js +96 -0
  90. package/template/vite-wv/scripts/launch-fm.js +19 -0
  91. package/template/vite-wv/scripts/upload.js +17 -14
  92. package/template/vite-wv/src/App.tsx +84 -0
  93. package/template/vite-wv/src/index.css +96 -0
  94. package/template/vite-wv/src/lib/utils.ts +6 -0
  95. package/template/vite-wv/src/main.tsx +14 -35
  96. package/template/vite-wv/src/router.tsx +57 -0
  97. package/template/vite-wv/src/routes/query-demo.tsx +37 -0
  98. package/template/vite-wv/tsconfig.json +3 -1
  99. package/template/vite-wv/vite.config.ts +5 -5
  100. package/dist/index-JtcdNmdz.d.ts +0 -1
  101. package/template/vite-wv/pnpm-lock.yaml +0 -2294
  102. package/template/vite-wv/postcss.config.cjs +0 -15
  103. package/template/vite-wv/scripts/launch-fm.sh +0 -3
  104. package/template/vite-wv/src/components/AppLogo.tsx +0 -5
  105. package/template/vite-wv/src/components/full-screen-loader.tsx +0 -9
  106. package/template/vite-wv/src/config/env.ts +0 -16
  107. package/template/vite-wv/src/config/theme/globals.css +0 -125
  108. package/template/vite-wv/src/config/theme/mantine-theme.ts +0 -22
  109. package/template/vite-wv/src/routeTree.gen.ts +0 -111
  110. package/template/vite-wv/src/routes/__root.tsx +0 -21
  111. package/template/vite-wv/src/routes/index.tsx +0 -51
  112. package/template/vite-wv/src/routes/secondary.tsx +0 -26
  113. package/template/vite-wv/src/utils/notification-helpers.ts +0 -32
  114. package/template/vite-wv/src/utils/styles.ts +0 -6
@@ -0,0 +1,4 @@
1
+ import{r as e}from"./state-BVEcvFT3.js";import{i as t}from"./consts-BZnOMxpW.js";import{t as n}from"./logger-DCEXcH26.js";import{t as r}from"./getUserPkgManager-Cph_6l1P.js";import i from"node:path";import a from"chalk";import o from"sort-package-json";import{execa as s}from"execa";import c from"fs-extra";import l from"ora";import u from"semver";const d=async(e,t,n)=>{let{onDataHandle:r,args:i=[`install`],stdout:a=`pipe`}=n;process.env.PROOFKIT_ENV===`development`&&i.push(`--prefer-offline`);let o=l(n.loadingMessage??`Running ${t} ${i.join(` `)} ...`).start(),c=s(t,i,{cwd:e,stdout:a,stderr:`pipe`});return await new Promise((e,n)=>{let a=``,s=``;r?c.stdout?.on(`data`,r(o)):c.stdout?.on(`data`,e=>{a+=e.toString()}),c.stderr?.on(`data`,e=>{s+=e.toString()}),c.on(`error`,e=>n(e)),c.on(`close`,r=>{if(r===0)e();else{let e=[a,s].filter(e=>e.trim()).join(`
2
+ `).trim().replace(/^- Checking registry\.$/gm,``).replace(/^\s*$/gm,``).trim()||`Command failed with exit code ${r}: ${t} ${i.join(` `)}`;n(Error(e))}})}),o},f=async(e,t)=>{switch(e){case`npm`:return await s(e,[`install`],{cwd:t,stderr:`inherit`}),null;case`pnpm`:return d(t,e,{onDataHandle:e=>t=>{let n=t.toString();n.includes(`Progress`)&&(e.text=n.includes(`|`)?n.split(` | `)[1]??``:n)}});case`yarn`:return d(t,e,{onDataHandle:e=>t=>{e.text=t.toString()}});case`bun`:return d(t,e,{stdout:`ignore`});default:throw Error(`Unknown package manager: ${e}`)}},p=async t=>{let{projectDir:i=e.projectDir}=t??{};n.info(`Installing dependencies...`),(await f(r(),i)??l()).succeed(a.green(`Successfully installed dependencies!
3
+ `))},m=()=>{let e=i.join(t,`package.json`);return c.readJSONSync(e).version??`1.0.0`},h=()=>__FMDAPI_VERSION__,g=()=>{try{return process.versions.node.split(`.`)[0]??`22`}catch{return`22`}},_=()=>__BETTER_AUTH_VERSION__,v=()=>__WEBVIEWER_VERSION__,y=()=>__TYPEGEN_VERSION__;function b(e){let t=i.resolve(e),{root:n}=i.parse(t);for(;t!==n;){if(c.existsSync(i.join(t,`.changeset`)))return t;t=i.dirname(t)}return null}function x(e=process.cwd()){let t=b(e);if(!t)return null;let n=i.join(t,`.changeset`,`pre.json`);if(!c.existsSync(n))return null;try{return c.readJSONSync(n)}catch{return null}}function S(e){if(e)return e.some(e=>e?u.valid(e)&&u.prerelease(e):!1);let t=e=>{try{return e()}catch{return null}};return[t(m),t(h),t(v),t(y),t(_)].filter(e=>!!e).some(e=>u.valid(e)&&u.prerelease(e))}function C(e=process.cwd()){let t=x(e);return t?.mode===`pre`&&t.tag===`beta`||S()?`beta`:`latest`}const w=C(),T={"@proofkit/fmdapi":w,"@proofkit/webviewer":w,"@proofkit/cli":w,"@proofkit/typegen":w,"@proofkit/better-auth":w,"next-auth":`beta`,"next-auth-adapter-filemaker":`beta`,"@auth/prisma-adapter":`^1.6.0`,"@auth/drizzle-adapter":`^1.1.0`,prisma:`^5.14.0`,"@prisma/client":`^5.14.0`,"@prisma/adapter-planetscale":`^5.14.0`,"drizzle-orm":`^0.30.10`,"drizzle-kit":`^0.21.4`,mysql2:`^3.9.7`,"@planetscale/database":`^1.18.0`,postgres:`^3.4.4`,"@libsql/client":`^0.6.0`,tailwindcss:`^4.1.10`,postcss:`^8.4.41`,"@tailwindcss/postcss":`^4.1.10`,"@tailwindcss/vite":`^4.2.1`,"class-variance-authority":`^0.7.1`,clsx:`^2.1.1`,"tailwind-merge":`^3.5.0`,"tw-animate-css":`^1.4.0`,"@trpc/client":`^11.0.0-rc.446`,"@trpc/server":`^11.0.0-rc.446`,"@trpc/react-query":`^11.0.0-rc.446`,"@trpc/next":`^11.0.0-rc.446`,superjson:`^2.2.1`,"server-only":`^0.0.1`,"@clerk/nextjs":`^6.3.1`,"@clerk/themes":`^2.1.33`,"@tanstack/react-query":`^5.59.0`,"@tanstack/react-query-devtools":`^5.59.0`,"@node-rs/argon2":`^2.0.2`,"@oslojs/binary":`^1.0.0`,"@oslojs/crypto":`^1.0.1`,"@oslojs/encoding":`^1.1.0`,"js-cookie":`^3.0.5`,"@types/js-cookie":`^3.0.6`,"@react-email/components":`^0.5.0`,"@react-email/render":`1.2.0`,"@react-email/preview-server":`^4.2.8`,"@plunk/node":`^3.0.3`,"react-email":`^4.2.8`,resend:`^4.0.0`,"@sendgrid/mail":`^8.1.4`,"@types/node":`^${g()}`,"@radix-ui/react-slot":`^1.2.3`,"lucide-react":`^0.577.0`,"better-auth":`^1.3.4`,"@daveyplate/better-auth-ui":`^2.1.3`,"@mantine/core":`^7.15.0`,"@mantine/dates":`^7.15.0`,"@mantine/hooks":`^7.15.0`,"@mantine/modals":`^7.15.0`,"@mantine/notifications":`^7.15.0`,"mantine-react-table":`^2.0.0`,"next-themes":`^0.4.6`,ultracite:`^7.0.8`,zod:`^4`},E=t=>{let{dependencies:n,devMode:r,projectDir:a=e.projectDir}=t,s=c.readJSONSync(i.join(a,`package.json`));for(let e of n){let t=T[e];r&&s.devDependencies?s.devDependencies[e]=t:s.dependencies&&(s.dependencies[e]=t)}let l=o(s);c.writeJSONSync(i.join(a,`package.json`),l,{spaces:2})};export{m as n,p as r,E as t};
4
+ //# sourceMappingURL=addPackageDependency-BGZl7xc5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addPackageDependency-BGZl7xc5.js","names":[],"sources":["../src/helpers/installDependencies.ts","../src/utils/getProofKitVersion.ts","../src/utils/proofkitReleaseChannel.ts","../src/installers/dependencyVersionMap.ts","../src/utils/addPackageDependency.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { execa, type StdoutStderrOption } from \"execa\";\nimport ora, { type Ora } from \"ora\";\n\nimport { state } from \"~/state.js\";\nimport { getUserPkgManager, type PackageManager } from \"~/utils/getUserPkgManager.js\";\nimport { logger } from \"~/utils/logger.js\";\n\nconst execWithSpinner = async (\n projectDir: string,\n pkgManager: PackageManager | \"pnpx\" | \"bunx\",\n options: {\n args?: string[];\n stdout?: StdoutStderrOption;\n onDataHandle?: (spinner: Ora) => (data: Buffer) => void;\n loadingMessage?: string;\n },\n) => {\n const { onDataHandle, args = [\"install\"], stdout = \"pipe\" } = options;\n\n if (process.env.PROOFKIT_ENV === \"development\") {\n args.push(\"--prefer-offline\");\n }\n\n const spinner = ora(options.loadingMessage ?? `Running ${pkgManager} ${args.join(\" \")} ...`).start();\n const subprocess = execa(pkgManager, args, {\n cwd: projectDir,\n stdout,\n stderr: \"pipe\", // Capture stderr to get error messages\n });\n\n await new Promise<void>((res, rej) => {\n let stdoutOutput = \"\";\n let stderrOutput = \"\";\n\n if (onDataHandle) {\n subprocess.stdout?.on(\"data\", onDataHandle(spinner));\n } else {\n // If no custom handler, capture stdout for error reporting\n subprocess.stdout?.on(\"data\", (data) => {\n stdoutOutput += data.toString();\n });\n }\n\n // Capture stderr output for error reporting\n subprocess.stderr?.on(\"data\", (data) => {\n stderrOutput += data.toString();\n });\n\n subprocess.on(\"error\", (e) => rej(e));\n subprocess.on(\"close\", (code) => {\n if (code === 0) {\n res();\n } else {\n // Combine stdout and stderr for complete error message\n const combinedOutput = [stdoutOutput, stderrOutput]\n .filter((output) => output.trim())\n .join(\"\\n\")\n .trim()\n // Remove spinner-related lines that aren't useful in error output\n .replace(/^- Checking registry\\.$/gm, \"\")\n .replace(/^\\s*$/gm, \"\") // Remove empty lines\n .trim();\n\n const errorMessage = combinedOutput || `Command failed with exit code ${code}: ${pkgManager} ${args.join(\" \")}`;\n rej(new Error(errorMessage));\n }\n });\n });\n\n return spinner;\n};\n\nconst runInstallCommand = async (pkgManager: PackageManager, projectDir: string): Promise<Ora | null> => {\n switch (pkgManager) {\n // When using npm, inherit the stderr stream so that the progress bar is shown\n case \"npm\":\n await execa(pkgManager, [\"install\"], {\n cwd: projectDir,\n stderr: \"inherit\",\n });\n\n return null;\n // When using yarn or pnpm, use the stdout stream and ora spinner to show the progress\n case \"pnpm\":\n return execWithSpinner(projectDir, pkgManager, {\n onDataHandle: (spinner) => (data) => {\n const text = data.toString();\n\n if (text.includes(\"Progress\")) {\n spinner.text = text.includes(\"|\") ? (text.split(\" | \")[1] ?? \"\") : text;\n }\n },\n });\n case \"yarn\":\n return execWithSpinner(projectDir, pkgManager, {\n onDataHandle: (spinner) => (data) => {\n spinner.text = data.toString();\n },\n });\n // When using bun, the stdout stream is ignored and the spinner is shown\n case \"bun\":\n return execWithSpinner(projectDir, pkgManager, { stdout: \"ignore\" });\n default:\n throw new Error(`Unknown package manager: ${pkgManager}`);\n }\n};\n\nexport const installDependencies = async (args?: { projectDir?: string }) => {\n const { projectDir = state.projectDir } = args ?? {};\n logger.info(\"Installing dependencies...\");\n const pkgManager = getUserPkgManager();\n\n const installSpinner = await runInstallCommand(pkgManager, projectDir);\n\n // If the spinner was used to show the progress, use succeed method on it\n // If not, use the succeed on a new spinner\n (installSpinner ?? ora()).succeed(chalk.green(\"Successfully installed dependencies!\\n\"));\n};\n\nexport const runExecCommand = async ({\n command,\n projectDir = state.projectDir,\n successMessage,\n errorMessage,\n loadingMessage,\n}: {\n command: string[];\n projectDir?: string;\n successMessage?: string;\n errorMessage?: string;\n loadingMessage?: string;\n}) => {\n let spinner: Ora | null = null;\n\n try {\n spinner = await _runExecCommand({\n projectDir,\n command,\n loadingMessage,\n });\n\n // If the spinner was used to show the progress, use succeed method on it\n // If not, use the succeed on a new spinner\n (spinner ?? ora()).succeed(\n chalk.green(successMessage ? `${successMessage}\\n` : `Successfully ran ${command.join(\" \")}!\\n`),\n );\n } catch (error) {\n // If we have a spinner, fail it, otherwise just throw the error\n if (spinner) {\n const failMessage = errorMessage || `Failed to run ${command.join(\" \")}`;\n spinner.fail(chalk.red(failMessage));\n }\n throw error;\n }\n};\n\nexport const _runExecCommand = async ({\n projectDir,\n command,\n loadingMessage,\n}: {\n projectDir: string;\n exec?: boolean;\n command: string[];\n loadingMessage?: string;\n}): Promise<Ora | null> => {\n const pkgManager = getUserPkgManager();\n switch (pkgManager) {\n // When using npm, capture both stdout and stderr to show error messages\n case \"npm\": {\n const result = await execa(\"npx\", [...command], {\n cwd: projectDir,\n stdout: \"pipe\",\n stderr: \"pipe\",\n reject: false,\n });\n\n if (result.exitCode !== 0) {\n // Combine stdout and stderr for complete error message\n const combinedOutput = [result.stdout, result.stderr]\n .filter((output) => output?.trim())\n .join(\"\\n\")\n .trim()\n // Remove spinner-related lines that aren't useful in error output\n .replace(/^- Checking registry\\.$/gm, \"\")\n .replace(/^\\s*$/gm, \"\") // Remove empty lines\n .trim();\n\n const errorMessage =\n combinedOutput || `Command failed with exit code ${result.exitCode}: npx ${command.join(\" \")}`;\n throw new Error(errorMessage);\n }\n\n return null;\n }\n // When using yarn or pnpm, use the stdout stream and ora spinner to show the progress\n case \"pnpm\": {\n // For shadcn commands, don't use progress handler to capture full output\n const isInstallCommand = command.includes(\"install\");\n return execWithSpinner(projectDir, \"pnpm\", {\n args: [\"dlx\", ...command],\n loadingMessage,\n onDataHandle: isInstallCommand\n ? (spinner) => (data) => {\n const text = data.toString();\n\n if (text.includes(\"Progress\")) {\n spinner.text = text.includes(\"|\") ? (text.split(\" | \")[1] ?? \"\") : text;\n }\n }\n : undefined,\n });\n }\n case \"yarn\": {\n // For shadcn commands, don't use progress handler to capture full output\n const isYarnInstallCommand = command.includes(\"install\");\n return execWithSpinner(projectDir, pkgManager, {\n args: [...command],\n loadingMessage,\n onDataHandle: isYarnInstallCommand\n ? (spinner) => (data) => {\n spinner.text = data.toString();\n }\n : undefined,\n });\n }\n // When using bun, the stdout stream is ignored and the spinner is shown\n case \"bun\":\n return execWithSpinner(projectDir, \"bunx\", {\n stdout: \"ignore\",\n args: [...command],\n loadingMessage,\n });\n default:\n throw new Error(`Unknown package manager: ${pkgManager}`);\n }\n};\n\nexport function generateRandomSecret(): string {\n return crypto.randomUUID().replace(/-/g, \"\");\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport type { PackageJson } from \"type-fest\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\n\nexport const getVersion = () => {\n const packageJsonPath = path.join(PKG_ROOT, \"package.json\");\n\n const packageJsonContent = fs.readJSONSync(packageJsonPath) as PackageJson;\n\n return packageJsonContent.version ?? \"1.0.0\";\n};\n\nexport const getFmdapiVersion = () => {\n return __FMDAPI_VERSION__;\n};\n\nexport const getNodeMajorVersion = () => {\n const defaultVersion = \"22\";\n try {\n return process.versions.node.split(\".\")[0] ?? defaultVersion;\n } catch {\n return defaultVersion;\n }\n};\n\nexport const getProofkitBetterAuthVersion = () => {\n return __BETTER_AUTH_VERSION__;\n};\n\nexport const getProofkitWebviewerVersion = () => {\n return __WEBVIEWER_VERSION__;\n};\n\nexport const getTypegenVersion = () => {\n return __TYPEGEN_VERSION__;\n};\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport semver from \"semver\";\n\nimport {\n getFmdapiVersion,\n getProofkitBetterAuthVersion,\n getProofkitWebviewerVersion,\n getTypegenVersion,\n getVersion,\n} from \"~/utils/getProofKitVersion.js\";\n\nexport type ProofkitReleaseTag = \"latest\" | \"beta\";\n\ninterface ChangesetPreState {\n mode?: string;\n tag?: string;\n}\n\nfunction findRepoRootWithChangeset(startDir: string): string | null {\n let currentDir = path.resolve(startDir);\n const { root } = path.parse(currentDir);\n\n while (currentDir !== root) {\n if (fs.existsSync(path.join(currentDir, \".changeset\"))) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n\n return null;\n}\n\nfunction readChangesetPreState(startDir = process.cwd()): ChangesetPreState | null {\n const repoRoot = findRepoRootWithChangeset(startDir);\n if (!repoRoot) {\n return null;\n }\n\n const prePath = path.join(repoRoot, \".changeset\", \"pre.json\");\n if (!fs.existsSync(prePath)) {\n return null;\n }\n\n try {\n return fs.readJSONSync(prePath) as ChangesetPreState;\n } catch {\n return null;\n }\n}\n\nexport function hasAnyPrereleaseVersion(versionCandidates?: Array<string | null>) {\n if (versionCandidates) {\n return versionCandidates.some((version) => {\n if (!version) {\n return false;\n }\n return semver.valid(version) && semver.prerelease(version);\n });\n }\n\n const readVersion = (getter: () => string) => {\n try {\n return getter();\n } catch {\n return null;\n }\n };\n\n const proofkitVersions = [\n readVersion(getVersion),\n readVersion(getFmdapiVersion),\n readVersion(getProofkitWebviewerVersion),\n readVersion(getTypegenVersion),\n readVersion(getProofkitBetterAuthVersion),\n ].filter((version): version is string => Boolean(version));\n\n return proofkitVersions.some((version) => semver.valid(version) && semver.prerelease(version));\n}\n\nexport function getProofkitReleaseTag(startDir = process.cwd()): ProofkitReleaseTag {\n const preState = readChangesetPreState(startDir);\n\n if (preState?.mode === \"pre\" && preState.tag === \"beta\") {\n return \"beta\";\n }\n\n if (hasAnyPrereleaseVersion()) {\n return \"beta\";\n }\n\n return \"latest\";\n}\n","import { getNodeMajorVersion } from \"~/utils/getProofKitVersion.js\";\nimport { getProofkitReleaseTag } from \"~/utils/proofkitReleaseChannel.js\";\n\nconst proofkitReleaseTag = getProofkitReleaseTag();\n\n/*\n * This maps the necessary packages to a version.\n * This improves performance significantly over fetching it from the npm registry.\n */\nexport const dependencyVersionMap = {\n // Resolve to \"latest\" or \"beta\" based on current changeset state / versions.\n \"@proofkit/fmdapi\": proofkitReleaseTag,\n \"@proofkit/webviewer\": proofkitReleaseTag,\n \"@proofkit/cli\": proofkitReleaseTag,\n \"@proofkit/typegen\": proofkitReleaseTag,\n \"@proofkit/better-auth\": proofkitReleaseTag,\n\n // NextAuth.js\n \"next-auth\": \"beta\",\n \"next-auth-adapter-filemaker\": \"beta\",\n\n \"@auth/prisma-adapter\": \"^1.6.0\",\n \"@auth/drizzle-adapter\": \"^1.1.0\",\n\n // Prisma\n prisma: \"^5.14.0\",\n \"@prisma/client\": \"^5.14.0\",\n \"@prisma/adapter-planetscale\": \"^5.14.0\",\n\n // Drizzle\n \"drizzle-orm\": \"^0.30.10\",\n \"drizzle-kit\": \"^0.21.4\",\n mysql2: \"^3.9.7\",\n \"@planetscale/database\": \"^1.18.0\",\n postgres: \"^3.4.4\",\n \"@libsql/client\": \"^0.6.0\",\n\n // TailwindCSS\n tailwindcss: \"^4.1.10\",\n postcss: \"^8.4.41\",\n \"@tailwindcss/postcss\": \"^4.1.10\",\n \"@tailwindcss/vite\": \"^4.2.1\",\n \"class-variance-authority\": \"^0.7.1\",\n clsx: \"^2.1.1\",\n \"tailwind-merge\": \"^3.5.0\",\n \"tw-animate-css\": \"^1.4.0\",\n\n // tRPC\n \"@trpc/client\": \"^11.0.0-rc.446\",\n \"@trpc/server\": \"^11.0.0-rc.446\",\n \"@trpc/react-query\": \"^11.0.0-rc.446\",\n \"@trpc/next\": \"^11.0.0-rc.446\",\n superjson: \"^2.2.1\",\n \"server-only\": \"^0.0.1\",\n\n // Clerk\n \"@clerk/nextjs\": \"^6.3.1\",\n \"@clerk/themes\": \"^2.1.33\",\n\n // Tanstack Query\n \"@tanstack/react-query\": \"^5.59.0\",\n \"@tanstack/react-query-devtools\": \"^5.59.0\",\n\n // ProofKit Auth\n \"@node-rs/argon2\": \"^2.0.2\",\n \"@oslojs/binary\": \"^1.0.0\",\n \"@oslojs/crypto\": \"^1.0.1\",\n \"@oslojs/encoding\": \"^1.1.0\",\n \"js-cookie\": \"^3.0.5\",\n \"@types/js-cookie\": \"^3.0.6\",\n\n // React Email\n \"@react-email/components\": \"^0.5.0\",\n \"@react-email/render\": \"1.2.0\",\n \"@react-email/preview-server\": \"^4.2.8\",\n \"@plunk/node\": \"^3.0.3\",\n \"react-email\": \"^4.2.8\",\n resend: \"^4.0.0\",\n \"@sendgrid/mail\": \"^8.1.4\",\n\n // Node\n \"@types/node\": `^${getNodeMajorVersion()}`,\n\n // Radix (for shadcn/ui)\n \"@radix-ui/react-slot\": \"^1.2.3\",\n\n // Icons (for shadcn/ui)\n \"lucide-react\": \"^0.577.0\",\n\n // better-auth\n \"better-auth\": \"^1.3.4\",\n \"@daveyplate/better-auth-ui\": \"^2.1.3\",\n\n // Mantine UI\n \"@mantine/core\": \"^7.15.0\",\n \"@mantine/dates\": \"^7.15.0\",\n \"@mantine/hooks\": \"^7.15.0\",\n \"@mantine/modals\": \"^7.15.0\",\n \"@mantine/notifications\": \"^7.15.0\",\n \"mantine-react-table\": \"^2.0.0\",\n\n // Theme utilities\n \"next-themes\": \"^0.4.6\",\n\n // Linting and formatting\n ultracite: \"^7.0.8\",\n\n // Zod\n zod: \"^4\",\n} as const;\nexport type AvailableDependencies = keyof typeof dependencyVersionMap;\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport sortPackageJson from \"sort-package-json\";\nimport type { PackageJson } from \"type-fest\";\n\nimport { type AvailableDependencies, dependencyVersionMap } from \"~/installers/dependencyVersionMap.js\";\nimport { state } from \"~/state.js\";\n\nexport const addPackageDependency = (opts: {\n dependencies: AvailableDependencies[];\n devMode: boolean;\n projectDir?: string;\n}) => {\n const { dependencies, devMode, projectDir = state.projectDir } = opts;\n\n const pkgJson = fs.readJSONSync(path.join(projectDir, \"package.json\")) as PackageJson;\n\n for (const pkgName of dependencies) {\n const version = dependencyVersionMap[pkgName];\n\n if (devMode && pkgJson.devDependencies) {\n pkgJson.devDependencies[pkgName] = version;\n } else if (pkgJson.dependencies) {\n pkgJson.dependencies[pkgName] = version;\n }\n }\n const sortedPkgJson = sortPackageJson(pkgJson);\n\n fs.writeJSONSync(path.join(projectDir, \"package.json\"), sortedPkgJson, {\n spaces: 2,\n });\n};\n"],"mappings":"4VAQA,MAAM,EAAkB,MACtB,EACA,EACA,IAMG,CACH,GAAM,CAAE,eAAc,OAAO,CAAC,UAAU,CAAE,SAAS,QAAW,EAE1D,QAAQ,IAAI,eAAiB,eAC/B,EAAK,KAAK,mBAAmB,CAG/B,IAAM,EAAU,EAAI,EAAQ,gBAAkB,WAAW,EAAW,GAAG,EAAK,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAC9F,EAAa,EAAM,EAAY,EAAM,CACzC,IAAK,EACL,SACA,OAAQ,OACT,CAAC,CAyCF,OAvCA,MAAM,IAAI,SAAe,EAAK,IAAQ,CACpC,IAAI,EAAe,GACf,EAAe,GAEf,EACF,EAAW,QAAQ,GAAG,OAAQ,EAAa,EAAQ,CAAC,CAGpD,EAAW,QAAQ,GAAG,OAAS,GAAS,CACtC,GAAgB,EAAK,UAAU,EAC/B,CAIJ,EAAW,QAAQ,GAAG,OAAS,GAAS,CACtC,GAAgB,EAAK,UAAU,EAC/B,CAEF,EAAW,GAAG,QAAU,GAAM,EAAI,EAAE,CAAC,CACrC,EAAW,GAAG,QAAU,GAAS,CAC/B,GAAI,IAAS,EACX,GAAK,KACA,CAWL,IAAM,EATiB,CAAC,EAAc,EAAa,CAChD,OAAQ,GAAW,EAAO,MAAM,CAAC,CACjC,KAAK;EAAK,CACV,MAAM,CAEN,QAAQ,4BAA6B,GAAG,CACxC,QAAQ,UAAW,GAAG,CACtB,MAAM,EAE8B,iCAAiC,EAAK,IAAI,EAAW,GAAG,EAAK,KAAK,IAAI,GAC7G,EAAQ,MAAM,EAAa,CAAC,GAE9B,EACF,CAEK,GAGH,EAAoB,MAAO,EAA4B,IAA4C,CACvG,OAAQ,EAAR,CAEE,IAAK,MAMH,OALA,MAAM,EAAM,EAAY,CAAC,UAAU,CAAE,CACnC,IAAK,EACL,OAAQ,UACT,CAAC,CAEK,KAET,IAAK,OACH,OAAO,EAAgB,EAAY,EAAY,CAC7C,aAAe,GAAa,GAAS,CACnC,IAAM,EAAO,EAAK,UAAU,CAExB,EAAK,SAAS,WAAW,GAC3B,EAAQ,KAAO,EAAK,SAAS,IAAI,CAAI,EAAK,MAAM,MAAM,CAAC,IAAM,GAAM,IAGxE,CAAC,CACJ,IAAK,OACH,OAAO,EAAgB,EAAY,EAAY,CAC7C,aAAe,GAAa,GAAS,CACnC,EAAQ,KAAO,EAAK,UAAU,EAEjC,CAAC,CAEJ,IAAK,MACH,OAAO,EAAgB,EAAY,EAAY,CAAE,OAAQ,SAAU,CAAC,CACtE,QACE,MAAU,MAAM,4BAA4B,IAAa,GAIlD,EAAsB,KAAO,IAAmC,CAC3E,GAAM,CAAE,aAAa,EAAM,YAAe,GAAQ,EAAE,CACpD,EAAO,KAAK,6BAA6B,EAGlB,MAAM,EAFV,GAAmB,CAEqB,EAAW,EAInD,GAAK,EAAE,QAAQ,EAAM,MAAM;EAAyC,CAAC,EC/G7E,MAAmB,CAC9B,IAAM,EAAkB,EAAK,KAAK,EAAU,eAAe,CAI3D,OAF2B,EAAG,aAAa,EAAgB,CAEjC,SAAW,SAG1B,MACJ,mBAGI,MAA4B,CAEvC,GAAI,CACF,OAAO,QAAQ,SAAS,KAAK,MAAM,IAAI,CAAC,IAAM,UACxC,CACN,MAAO,OAIE,MACJ,wBAGI,MACJ,sBAGI,MACJ,oBCjBT,SAAS,EAA0B,EAAiC,CAClE,IAAI,EAAa,EAAK,QAAQ,EAAS,CACjC,CAAE,QAAS,EAAK,MAAM,EAAW,CAEvC,KAAO,IAAe,GAAM,CAC1B,GAAI,EAAG,WAAW,EAAK,KAAK,EAAY,aAAa,CAAC,CACpD,OAAO,EAET,EAAa,EAAK,QAAQ,EAAW,CAGvC,OAAO,KAGT,SAAS,EAAsB,EAAW,QAAQ,KAAK,CAA4B,CACjF,IAAM,EAAW,EAA0B,EAAS,CACpD,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAU,EAAK,KAAK,EAAU,aAAc,WAAW,CAC7D,GAAI,CAAC,EAAG,WAAW,EAAQ,CACzB,OAAO,KAGT,GAAI,CACF,OAAO,EAAG,aAAa,EAAQ,MACzB,CACN,OAAO,MAIX,SAAgB,EAAwB,EAA0C,CAChF,GAAI,EACF,OAAO,EAAkB,KAAM,GACxB,EAGE,EAAO,MAAM,EAAQ,EAAI,EAAO,WAAW,EAAQ,CAFjD,GAGT,CAGJ,IAAM,EAAe,GAAyB,CAC5C,GAAI,CACF,OAAO,GAAQ,MACT,CACN,OAAO,OAYX,MARyB,CACvB,EAAY,EAAW,CACvB,EAAY,EAAiB,CAC7B,EAAY,EAA4B,CACxC,EAAY,EAAkB,CAC9B,EAAY,EAA6B,CAC1C,CAAC,OAAQ,GAA+B,EAAQ,EAAS,CAElC,KAAM,GAAY,EAAO,MAAM,EAAQ,EAAI,EAAO,WAAW,EAAQ,CAAC,CAGhG,SAAgB,EAAsB,EAAW,QAAQ,KAAK,CAAsB,CAClF,IAAM,EAAW,EAAsB,EAAS,CAUhD,OARI,GAAU,OAAS,OAAS,EAAS,MAAQ,QAI7C,GAAyB,CACpB,OAGF,SCxFT,MAAM,EAAqB,GAAuB,CAMrC,EAAuB,CAElC,mBAAoB,EACpB,sBAAuB,EACvB,gBAAiB,EACjB,oBAAqB,EACrB,wBAAyB,EAGzB,YAAa,OACb,8BAA+B,OAE/B,uBAAwB,SACxB,wBAAyB,SAGzB,OAAQ,UACR,iBAAkB,UAClB,8BAA+B,UAG/B,cAAe,WACf,cAAe,UACf,OAAQ,SACR,wBAAyB,UACzB,SAAU,SACV,iBAAkB,SAGlB,YAAa,UACb,QAAS,UACT,uBAAwB,UACxB,oBAAqB,SACrB,2BAA4B,SAC5B,KAAM,SACN,iBAAkB,SAClB,iBAAkB,SAGlB,eAAgB,iBAChB,eAAgB,iBAChB,oBAAqB,iBACrB,aAAc,iBACd,UAAW,SACX,cAAe,SAGf,gBAAiB,SACjB,gBAAiB,UAGjB,wBAAyB,UACzB,iCAAkC,UAGlC,kBAAmB,SACnB,iBAAkB,SAClB,iBAAkB,SAClB,mBAAoB,SACpB,YAAa,SACb,mBAAoB,SAGpB,0BAA2B,SAC3B,sBAAuB,QACvB,8BAA+B,SAC/B,cAAe,SACf,cAAe,SACf,OAAQ,SACR,iBAAkB,SAGlB,cAAe,IAAI,GAAqB,GAGxC,uBAAwB,SAGxB,eAAgB,WAGhB,cAAe,SACf,6BAA8B,SAG9B,gBAAiB,UACjB,iBAAkB,UAClB,iBAAkB,UAClB,kBAAmB,UACnB,yBAA0B,UAC1B,sBAAuB,SAGvB,cAAe,SAGf,UAAW,SAGX,IAAK,KACN,CCrGY,EAAwB,GAI/B,CACJ,GAAM,CAAE,eAAc,UAAS,aAAa,EAAM,YAAe,EAE3D,EAAU,EAAG,aAAa,EAAK,KAAK,EAAY,eAAe,CAAC,CAEtE,IAAK,IAAM,KAAW,EAAc,CAClC,IAAM,EAAU,EAAqB,GAEjC,GAAW,EAAQ,gBACrB,EAAQ,gBAAgB,GAAW,EAC1B,EAAQ,eACjB,EAAQ,aAAa,GAAW,GAGpC,IAAM,EAAgB,EAAgB,EAAQ,CAE9C,EAAG,cAAc,EAAK,KAAK,EAAY,eAAe,CAAE,EAAe,CACrE,OAAQ,EACT,CAAC"}
@@ -0,0 +1,10 @@
1
+ import e from"node:fs";import t from"node:path";import{fileURLToPath as n}from"node:url";const r=n(import.meta.url),i=t.dirname(r),a=t.join(i,`../`),o=`my-proofkit-app`,s=`proofkit`,c=`@proofkit/cli`,l=[`Use the ProofKit docs as the primary reference for this project: https://proofkit.dev/docs`,"Before doing any AI-assisted development here, run `npx @tanstack/intent@latest install` in the project root to load skills relevant to this project"].join(`
2
+ `),u=typeof __REGISTRY_URL__<`u`&&__REGISTRY_URL__?__REGISTRY_URL__:`https://proofkit.dev`;function d(e){let t=`v${e}`,n=Math.max(61-t.length,0);return`
3
+ _______ ___ ___ ____ _ _
4
+ |_ __ \\ .' ..]|_ ||_ _| (_) / |_
5
+ | |__) |_ .--. .--. .--. _| |_ | |_/ / __ \`| |-'
6
+ | ___/[ \`/'\`\\]/ .'\`\\ \\/ .'\`\\ \\'-| |-' | __'. [ | | |
7
+ _| |_ | | | \\__. || \\__. | | | _| | \\ \\_ | | | |,
8
+ |_____| [___] '.__.' '.__.' [___] |____||____|[___]\\__/
9
+ ${` `.repeat(n)}${t}\n`}function f(){let n=[t.join(a,`template`),t.resolve(a,`../cli/template`)];for(let t of n)if(e.existsSync(t))return t;return n[0]}const p=f();export{p as a,c,a as i,o as n,s as o,u as r,d as s,l as t};
10
+ //# sourceMappingURL=consts-BZnOMxpW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts-BZnOMxpW.js","names":[],"sources":["../src/consts.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst distPath = path.dirname(__filename);\nexport const PKG_ROOT = path.join(distPath, \"../\");\n\nexport const DEFAULT_APP_NAME = \"my-proofkit-app\";\nexport const cliName = \"proofkit\";\nexport const npmName = \"@proofkit/cli\";\nexport const DOCS_URL = \"https://proofkit.dev\";\n\nexport const AGENT_INSTRUCTIONS = [\n \"Use the ProofKit docs as the primary reference for this project: https://proofkit.dev/docs\",\n \"Before doing any AI-assisted development here, run `npx @tanstack/intent@latest install` in the project root to load skills relevant to this project\",\n].join(\"\\n\");\n\n// Registry URL is injected at build time via tsdown define.\ndeclare const __REGISTRY_URL__: string;\nexport const DEFAULT_REGISTRY_URL =\n typeof __REGISTRY_URL__ !== \"undefined\" && __REGISTRY_URL__ ? __REGISTRY_URL__ : \"https://proofkit.dev\";\nconst TITLE_ASCII = `\n _______ ___ ___ ____ _ _\n|_ __ \\\\ .' ..]|_ ||_ _| (_) / |_\n | |__) |_ .--. .--. .--. _| |_ | |_/ / __ \\`| |-'\n | ___/[ \\`/'\\`\\\\]/ .'\\`\\\\ \\\\/ .'\\`\\\\ \\\\'-| |-' | __'. [ | | |\n _| |_ | | | \\\\__. || \\\\__. | | | _| | \\\\ \\\\_ | | | |,\n|_____| [___] '.__.' '.__.' [___] |____||____|[___]\\\\__/\n`;\nexport function getTitleText(version: string) {\n const versionText = `v${version}`;\n const lineWidth = 61;\n const padding = Math.max(lineWidth - versionText.length, 0);\n return `${TITLE_ASCII}${\" \".repeat(padding)}${versionText}\\n`;\n}\nfunction resolveTemplateRoot(): string {\n const candidates = [path.join(PKG_ROOT, \"template\"), path.resolve(PKG_ROOT, \"../cli/template\")] as const;\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return candidates[0];\n}\n\nexport const TEMPLATE_ROOT = resolveTemplateRoot();\n"],"mappings":"yFAIA,MAAM,EAAa,EAAc,OAAO,KAAK,IAAI,CAC3C,EAAW,EAAK,QAAQ,EAAW,CAC5B,EAAW,EAAK,KAAK,EAAU,MAAM,CAErC,EAAmB,kBACnB,EAAU,WACV,EAAU,gBAGV,EAAqB,CAChC,6FACA,uJACD,CAAC,KAAK;EAAK,CAIC,EACX,OAAO,iBAAqB,KAAe,iBAAmB,iBAAmB,uBASnF,SAAgB,EAAa,EAAiB,CAC5C,IAAM,EAAc,IAAI,IAElB,EAAU,KAAK,IADH,GACmB,EAAY,OAAQ,EAAE,CAC3D,MAAO;;;;;;;EAAiB,IAAI,OAAO,EAAQ,GAAG,EAAY,IAE5D,SAAS,GAA8B,CACrC,IAAM,EAAa,CAAC,EAAK,KAAK,EAAU,WAAW,CAAE,EAAK,QAAQ,EAAU,kBAAkB,CAAC,CAE/F,IAAK,IAAM,KAAa,EACtB,GAAI,EAAG,WAAW,EAAU,CAC1B,OAAO,EAIX,OAAO,EAAW,GAGpB,MAAa,EAAgB,GAAqB"}
@@ -0,0 +1,34 @@
1
+ import{r as e,t}from"./state-BVEcvFT3.js";import"./consts-BZnOMxpW.js";import{f as n,o as r,p as i,r as a}from"./utils-DymV7zmv.js";import{n as o,t as s}from"./globalOptions-CkqEi9uC.js";import{n as c}from"./parseSettings-DJ2m9sgJ.js";import{t as l}from"./getUserPkgManager-Cph_6l1P.js";import u from"node:path";import d from"chalk";import{execa as f}from"execa";import p from"fs-extra";import{Command as m,Option as h}from"commander";const g=/^[✔\s]+/,_=/\s{2,}/,v=/^v/;async function y(){try{return await f(`vercel`,[`--version`]),!0}catch{return!1}}async function b(){let e=l(),t=i();t.start(`Installing Vercel CLI...`);try{return await f(e,[e===`npm`?`install`:`add`,`-g`,`vercel`]),t.stop(`Vercel CLI installed successfully`),!0}catch(e){return t.stop(`Failed to install Vercel CLI`),console.error(d.red(`Error installing Vercel CLI:`),e),!1}}async function x(){try{return!!(await p.readJSON(`.vercel/project.json`)).projectId}catch{return e.debug&&console.log(`
2
+ Debug: No Vercel project configuration found`),!1}}async function S(){try{e.debug&&console.log(`
3
+ Debug: Running vercel teams list command...`);let t=await f(`vercel`,[`teams`,`list`],{all:!0});e.debug&&console.log(`
4
+ Debug: Command output:`,t.all);let n=(t.all??``).split(`
5
+ `).filter(Boolean),r=n.findIndex(e=>e.includes(`id`));if(r===-1)return[];let i=n.slice(r+1);if(e.debug){console.log(`
6
+ Debug: Team lines:`);for(let e of i)console.log(`"${e}"`)}let a=i.map(e=>{let[t,...n]=e.replace(g,``).trim().split(_);return!t||n.length===0?null:{slug:t,name:n.join(` `).trim()}}).filter(e=>e!==null);return e.debug&&console.log(`
7
+ Debug: Parsed teams:`,a),a}catch(t){return e.debug&&console.error(`Error getting Vercel teams:`,t),[]}}async function C(){let e=i();try{let t=(await p.readJSON(`package.json`)).name,i=await S(),a=``;if(i.length>1){let e=await n({message:`Select a team to deploy under:`,options:[...i.map(e=>({value:e.slug,label:e.name}))]});if(r(e))return console.log(d.yellow(`
8
+ Operation cancelled`)),!1;e&&typeof e==`string`&&(a=`--scope=${e}`)}return e.start(`Creating Vercel project...`),await f(`vercel`,[`link`,`--yes`,...a?[a]:[]],{env:{VERCEL_PROJECT_NAME:t}}),e.message(`Pulling project settings...`),await f(`vercel`,[`pull`,`--yes`],{stdio:`inherit`}),e.stop(`Vercel project created successfully`),!0}catch(t){return e.stop(`Failed to set up Vercel project`),console.error(d.red(`Error setting up Vercel project:`),t),!1}}async function w(){let t=i();t.start(`Pushing environment variables to Vercel...`);try{let n=c(),r=u.join(process.cwd(),n.envFile??`.env`);if(!p.existsSync(r))return t.stop(`No environment file found`),!0;let i=(await p.readFile(r,`utf-8`)).split(`
9
+ `).filter(e=>e.trim()&&!e.startsWith(`#`)).map(e=>{let[t,...n]=e.split(`=`);if(!t)return null;let r=n.join(`=`);return{key:t.trim(),value:r.trim()}}).filter(e=>e!==null);if(e.debug){t.stop(),console.log(`
10
+ Debug: Parsed environment variables:`);for(let{key:e,value:t}of i)console.log(` ${e}=${t.substring(0,3)}...`);t.start(`Pushing environment variables to Vercel...`)}let a=0,o=i.length;for(let n=0;n<o;n++){let r=i[n];if(!r)continue;let{key:s,value:c}=r;t.message(`Pushing environment variables to Vercel... (${n+1}/${o})`);try{e.debug&&console.log(`\nDebug: Attempting to add ${s} to Vercel...`);let t=await f(`vercel`,[`env`,`add`,s,`production`],{input:c,stdio:`pipe`,reject:!1});if(e.debug&&(console.log(`Debug: Command exit code: ${t.exitCode}`),t.stdout&&console.log(`Debug: stdout:`,t.stdout),t.stderr&&console.log(`Debug: stderr:`,t.stderr)),t.exitCode!==0)throw Error(`Command failed with exit code ${t.exitCode}`)}catch(t){a++,e.debug&&(console.error(d.yellow(`\nDebug: Failed to add ${s}`)),console.error(`Debug: Full error:`,t))}}return a>0?t.stop(d.yellow(`Environment variables pushed with ${a} failures`)):t.stop(`Environment variables pushed successfully`),a<o}catch(n){return t.stop(`Failed to push environment variables`),e.debug&&(console.error(`
11
+ Debug: Top-level error in pushEnvironmentVariables:`),console.error(n)),!1}}async function T(){let t=process.version.replace(v,``).split(`.`)[0];try{let n=`.vercel/project.json`;if(!p.existsSync(n))return e.debug&&console.log(`Debug: No project.json found`),!1;let r=await p.readJSON(n);return e.debug&&console.log(`Debug: Current project config:`,r),r.settings={...r.settings,nodeVersion:`${t}.x`},await p.writeJSON(n,r,{spaces:2}),e.debug&&console.log(`Debug: Updated Node.js version to ${t}.x`),!0}catch(t){return e.debug&&console.error(`Debug: Failed to update Node.js version:`,t),!1}}async function E(){try{let t=await f(`vercel`,[`whoami`],{stdio:`pipe`,reject:!1});return e.debug&&console.log(`
12
+ Debug: Vercel whoami result:`,t),t.exitCode===0}catch(t){return e.debug&&console.error(`Debug: Error checking Vercel login status:`,t),!1}}async function D(){console.log(d.blue(`
13
+ You need to log in to Vercel first.`));try{return await f(`vercel`,[`login`],{stdio:`inherit`}),!0}catch(e){return console.error(d.red(`
14
+ Failed to log in to Vercel:`),e),!1}}async function O(){if(e.debug&&console.log(`Running deploy...`),!await y()&&!await b()){console.log(d.red(`
15
+ Failed to install Vercel CLI. Please install it manually using:`)),console.log(d.blue(`
16
+ npm install -g vercel`));return}if(!await E()&&!await D()){console.log(d.red(`
17
+ Failed to log in to Vercel. Please try again.`));return}if(!await x()){if(console.log(d.blue(`
18
+ Setting up new Vercel project...`)),!await C()){console.log(d.red(`
19
+ Failed to set up Vercel project automatically.`));return}if(!await w()){console.log(d.red(`
20
+ Failed to push environment variables. Aborting deployment.`));return}}console.log(d.blue(`
21
+ Pulling latest project settings...`));try{await f(`vercel`,[`pull`,`--yes`],{stdio:`inherit`})}catch(e){console.error(d.red(`
22
+ Failed to pull project settings:`),e);return}if(await T()||console.error(d.red(`
23
+ Failed to set Node.js version. Continuing anyway...`)),e.localBuild){console.log(d.blue(`
24
+ Preparing local build for Vercel...`));try{if((await f(`vercel`,[`build`],{stdio:`inherit`,reject:!1})).exitCode===0)console.log(d.green(`
25
+ ✓ Local build successful!`));else{console.error(d.red(`
26
+ ✖ Local build failed`)),console.log(d.yellow(`Fix the errors above and then try again.`));return}}catch(e){console.error(d.red(`
27
+ Vercel build failed:`),e);return}console.log(d.blue(`
28
+ Deploying to Vercel...`)),(await f(`vercel`,[`deploy`,`--prebuilt`,`--yes`],{stdio:`inherit`,reject:!1})).exitCode===0&&console.log(d.green(`
29
+ ✓ Deployment successful!`))}else{console.log(d.blue(`
30
+ Deploying to Vercel...`));try{if((await f(`vercel`,[`deploy`,`--yes`],{stdio:`inherit`,reject:!1})).exitCode===0)console.log(d.green(`
31
+ ✓ Deployment successful!`));else{let e=l(),t=e===`npm`?`npm run`:e;console.error(d.red(`
32
+ ✖ Deployment failed`)),console.log(d.yellow(`
33
+ Troubleshooting Tips:`)),console.log(d.dim(`You can check for most errors before deploying for a faster iteration cycle`)),console.log(`${d.dim(`Run`)} ${t} tsc ${d.dim(`to check for TypeScript errors (most common build errors)`)}`),console.log(`${d.dim(`Run`)} ${t} build ${d.dim(`to run the full production build locally`)}`)}}catch{return}}}const k=()=>{let n=new m(`deploy`).description(`Deploy your ProofKit application to Vercel`).addOption(o).addOption(s).addOption(new h(`--local-build`,`Build locally before deploying`)).action(O);return n.hook(`preAction`,n=>{t(n.opts()),e.baseCommand=`deploy`,a({commandName:`deploy`})}),n};export{k as makeDeployCommand,O as runDeploy};
34
+ //# sourceMappingURL=deploy-D25sPO7K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-D25sPO7K.js","names":["spinner","p.spinner","p.select","p.isCancel"],"sources":["../src/cli/deploy/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { Command, Option } from \"commander\";\nimport { execa } from \"execa\";\nimport fs from \"fs-extra\";\nimport type { PackageJson } from \"type-fest\";\nimport * as p from \"~/cli/prompts.js\";\n\nimport { debugOption, nonInteractiveOption } from \"~/globalOptions.js\";\n\n// Regex patterns defined at top level for performance\nconst LEADING_SYMBOLS_REGEX = /^[✔\\s]+/;\nconst MULTI_SPACE_REGEX = /\\s{2,}/;\nconst VERSION_PREFIX_REGEX = /^v/;\n\nimport { initProgramState, state } from \"~/state.js\";\nimport { getUserPkgManager } from \"~/utils/getUserPkgManager.js\";\nimport { getSettings } from \"~/utils/parseSettings.js\";\nimport { ensureProofKitProject } from \"../utils.js\";\n\nasync function checkVercelCLI(): Promise<boolean> {\n try {\n await execa(\"vercel\", [\"--version\"]);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nasync function installVercelCLI() {\n const pkgManager = getUserPkgManager();\n const spinner = p.spinner();\n spinner.start(\"Installing Vercel CLI...\");\n\n try {\n const installCmd = pkgManager === \"npm\" ? \"install\" : \"add\";\n await execa(pkgManager, [installCmd, \"-g\", \"vercel\"]);\n spinner.stop(\"Vercel CLI installed successfully\");\n return true;\n } catch (error) {\n spinner.stop(\"Failed to install Vercel CLI\");\n console.error(chalk.red(\"Error installing Vercel CLI:\"), error);\n return false;\n }\n}\n\nasync function checkVercelProject(): Promise<boolean> {\n try {\n // Try to read the .vercel/project.json file which exists when a project is linked\n const projectConfig = (await fs.readJSON(\".vercel/project.json\")) as VercelProjectConfig;\n return Boolean(projectConfig.projectId);\n } catch (_error) {\n if (state.debug) {\n console.log(\"\\nDebug: No Vercel project configuration found\");\n }\n return false;\n }\n}\n\nasync function getVercelTeams(): Promise<{ slug: string; name: string }[]> {\n try {\n if (state.debug) {\n console.log(\"\\nDebug: Running vercel teams list command...\");\n }\n\n const result = await execa(\"vercel\", [\"teams\", \"list\"], {\n all: true,\n });\n\n if (state.debug) {\n console.log(\"\\nDebug: Command output:\", result.all);\n }\n\n const lines = (result.all ?? \"\").split(\"\\n\").filter(Boolean);\n\n // Find the index of the header line\n const headerIndex = lines.findIndex((line) => line.includes(\"id\"));\n if (headerIndex === -1) {\n return [];\n }\n\n // Get only the lines after the header\n const teamLines = lines.slice(headerIndex + 1);\n\n if (state.debug) {\n console.log(\"\\nDebug: Team lines:\");\n for (const line of teamLines) {\n console.log(`\"${line}\"`);\n }\n }\n\n const teams = teamLines\n .map((line) => {\n // Remove any leading symbols (✔ or spaces) and trim\n const cleanLine = line.replace(LEADING_SYMBOLS_REGEX, \"\").trim();\n // Split on multiple spaces and take the first part as slug, rest as name\n const [slug, ...nameParts] = cleanLine.split(MULTI_SPACE_REGEX);\n if (!slug || nameParts.length === 0) {\n return null;\n }\n\n return {\n slug,\n name: nameParts.join(\" \").trim(),\n };\n })\n .filter((team): team is { slug: string; name: string } => team !== null);\n\n if (state.debug) {\n console.log(\"\\nDebug: Parsed teams:\", teams);\n }\n\n return teams;\n } catch (error) {\n if (state.debug) {\n console.error(\"Error getting Vercel teams:\", error);\n }\n return [];\n }\n}\n\nasync function setupVercelProject() {\n const spinner = p.spinner();\n\n try {\n // Get project name from package.json\n const pkgJson = (await fs.readJSON(\"package.json\")) as PackageJson;\n const projectName = pkgJson.name;\n\n // Get available teams\n const teams = await getVercelTeams();\n\n let teamFlag = \"\";\n if (teams.length > 1) {\n const teamChoice = await p.select({\n message: \"Select a team to deploy under:\",\n options: [\n ...teams.map((team) => ({\n value: team.slug,\n label: team.name,\n })),\n ],\n });\n\n if (p.isCancel(teamChoice)) {\n console.log(chalk.yellow(\"\\nOperation cancelled\"));\n return false;\n }\n\n if (teamChoice && typeof teamChoice === \"string\") {\n teamFlag = `--scope=${teamChoice}`;\n }\n }\n\n spinner.start(\"Creating Vercel project...\");\n\n // Create project with default settings\n await execa(\"vercel\", [\"link\", \"--yes\", ...(teamFlag ? [teamFlag] : [])], {\n env: {\n VERCEL_PROJECT_NAME: projectName,\n },\n });\n\n // Pull project settings\n spinner.message(\"Pulling project settings...\");\n await execa(\"vercel\", [\"pull\", \"--yes\"], {\n stdio: \"inherit\",\n });\n\n spinner.stop(\"Vercel project created successfully\");\n return true;\n } catch (error) {\n spinner.stop(\"Failed to set up Vercel project\");\n console.error(chalk.red(\"Error setting up Vercel project:\"), error);\n return false;\n }\n}\n\nasync function pushEnvironmentVariables() {\n const spinner = p.spinner();\n spinner.start(\"Pushing environment variables to Vercel...\");\n\n try {\n const settings = getSettings();\n const envFile = path.join(process.cwd(), settings.envFile ?? \".env\");\n\n if (!fs.existsSync(envFile)) {\n spinner.stop(\"No environment file found\");\n return true;\n }\n\n const envContent = await fs.readFile(envFile, \"utf-8\");\n const envVars = envContent\n .split(\"\\n\")\n .filter((line) => line.trim() && !line.startsWith(\"#\"))\n .map((line) => {\n const [key, ...valueParts] = line.split(\"=\");\n if (!key) {\n return null;\n }\n const value = valueParts.join(\"=\"); // Rejoin in case value contains =\n return { key: key.trim(), value: value.trim() };\n })\n .filter((item): item is { key: string; value: string } => item !== null);\n\n if (state.debug) {\n spinner.stop();\n console.log(\"\\nDebug: Parsed environment variables:\");\n for (const { key, value } of envVars) {\n console.log(` ${key}=${value.substring(0, 3)}...`);\n }\n spinner.start(\"Pushing environment variables to Vercel...\");\n }\n\n let failed = 0;\n const total = envVars.length;\n\n for (let i = 0; i < total; i++) {\n const envVar = envVars[i];\n if (!envVar) {\n continue;\n }\n const { key, value } = envVar;\n spinner.message(`Pushing environment variables to Vercel... (${i + 1}/${total})`);\n\n try {\n if (state.debug) {\n console.log(`\\nDebug: Attempting to add ${key} to Vercel...`);\n }\n\n const result = await execa(\"vercel\", [\"env\", \"add\", key, \"production\"], {\n input: value,\n stdio: \"pipe\",\n reject: false,\n });\n\n if (state.debug) {\n console.log(`Debug: Command exit code: ${result.exitCode}`);\n if (result.stdout) {\n console.log(\"Debug: stdout:\", result.stdout);\n }\n if (result.stderr) {\n console.log(\"Debug: stderr:\", result.stderr);\n }\n }\n\n if (result.exitCode !== 0) {\n throw new Error(`Command failed with exit code ${result.exitCode}`);\n }\n } catch (error) {\n failed++;\n if (state.debug) {\n console.error(chalk.yellow(`\\nDebug: Failed to add ${key}`));\n console.error(\"Debug: Full error:\", error);\n }\n }\n }\n\n if (failed > 0) {\n spinner.stop(chalk.yellow(`Environment variables pushed with ${failed} failures`));\n } else {\n spinner.stop(\"Environment variables pushed successfully\");\n }\n return failed < total;\n } catch (error) {\n spinner.stop(\"Failed to push environment variables\");\n if (state.debug) {\n console.error(\"\\nDebug: Top-level error in pushEnvironmentVariables:\");\n console.error(error);\n }\n return false;\n }\n}\n\ninterface VercelProjectConfig {\n projectId: string;\n settings?: {\n nodeVersion?: string;\n };\n [key: string]: unknown;\n}\n\nasync function ensureCorrectNodeVersion() {\n const nodeVersion = process.version.replace(VERSION_PREFIX_REGEX, \"\");\n const majorVersion = nodeVersion.split(\".\")[0];\n\n try {\n const projectJsonPath = \".vercel/project.json\";\n if (!fs.existsSync(projectJsonPath)) {\n if (state.debug) {\n console.log(\"Debug: No project.json found\");\n }\n return false;\n }\n\n const projectConfig = (await fs.readJSON(projectJsonPath)) as VercelProjectConfig;\n if (state.debug) {\n console.log(\"Debug: Current project config:\", projectConfig);\n }\n\n // Update the Node.js version\n projectConfig.settings = {\n ...projectConfig.settings,\n nodeVersion: `${majorVersion}.x`,\n };\n\n await fs.writeJSON(projectJsonPath, projectConfig, { spaces: 2 });\n if (state.debug) {\n console.log(`Debug: Updated Node.js version to ${majorVersion}.x`);\n }\n return true;\n } catch (error) {\n if (state.debug) {\n console.error(\"Debug: Failed to update Node.js version:\", error);\n }\n return false;\n }\n}\n\nasync function checkVercelLogin(): Promise<boolean> {\n try {\n const result = await execa(\"vercel\", [\"whoami\"], {\n stdio: \"pipe\",\n reject: false,\n });\n\n if (state.debug) {\n console.log(\"\\nDebug: Vercel whoami result:\", result);\n }\n\n return result.exitCode === 0;\n } catch (error) {\n if (state.debug) {\n console.error(\"Debug: Error checking Vercel login status:\", error);\n }\n return false;\n }\n}\n\nasync function loginToVercel(): Promise<boolean> {\n console.log(chalk.blue(\"\\nYou need to log in to Vercel first.\"));\n\n try {\n await execa(\"vercel\", [\"login\"], {\n stdio: \"inherit\",\n });\n return true;\n } catch (error) {\n console.error(chalk.red(\"\\nFailed to log in to Vercel:\"), error);\n return false;\n }\n}\n\nexport async function runDeploy() {\n if (state.debug) {\n console.log(\"Running deploy...\");\n }\n\n // Check if Vercel CLI is installed\n const hasVercelCLI = await checkVercelCLI();\n\n if (!hasVercelCLI) {\n const installed = await installVercelCLI();\n if (!installed) {\n console.log(chalk.red(\"\\nFailed to install Vercel CLI. Please install it manually using:\"));\n console.log(chalk.blue(\"\\n npm install -g vercel\"));\n return;\n }\n }\n\n // Check if user is logged in\n const isLoggedIn = await checkVercelLogin();\n if (!isLoggedIn) {\n const loginSuccessful = await loginToVercel();\n if (!loginSuccessful) {\n console.log(chalk.red(\"\\nFailed to log in to Vercel. Please try again.\"));\n return;\n }\n }\n\n // Check if project is set up with Vercel\n const hasVercelProject = await checkVercelProject();\n\n if (!hasVercelProject) {\n console.log(chalk.blue(\"\\nSetting up new Vercel project...\"));\n const setup = await setupVercelProject();\n if (!setup) {\n console.log(chalk.red(\"\\nFailed to set up Vercel project automatically.\"));\n return;\n }\n\n const envPushed = await pushEnvironmentVariables();\n if (!envPushed) {\n console.log(chalk.red(\"\\nFailed to push environment variables. Aborting deployment.\"));\n return;\n }\n }\n\n // Pull latest project settings\n console.log(chalk.blue(\"\\nPulling latest project settings...\"));\n try {\n await execa(\"vercel\", [\"pull\", \"--yes\"], {\n stdio: \"inherit\",\n });\n } catch (error) {\n console.error(chalk.red(\"\\nFailed to pull project settings:\"), error);\n return;\n }\n\n // Ensure correct Node.js version is set\n if (!(await ensureCorrectNodeVersion())) {\n console.error(chalk.red(\"\\nFailed to set Node.js version. Continuing anyway...\"));\n }\n\n if (state.localBuild) {\n // Build locally for Vercel\n console.log(chalk.blue(\"\\nPreparing local build for Vercel...\"));\n try {\n const result = await execa(\"vercel\", [\"build\"], {\n stdio: \"inherit\",\n reject: false,\n });\n if (result.exitCode === 0) {\n console.log(chalk.green(\"\\n✓ Local build successful!\"));\n } else {\n console.error(chalk.red(\"\\n✖ Local build failed\"));\n console.log(chalk.yellow(\"Fix the errors above and then try again.\"));\n return;\n }\n } catch (error) {\n console.error(chalk.red(\"\\nVercel build failed:\"), error);\n return;\n }\n\n // Deploy the pre-built project\n console.log(chalk.blue(\"\\nDeploying to Vercel...\"));\n\n const result = await execa(\"vercel\", [\"deploy\", \"--prebuilt\", \"--yes\"], {\n stdio: \"inherit\",\n reject: false,\n });\n if (result.exitCode === 0) {\n console.log(chalk.green(\"\\n✓ Deployment successful!\"));\n }\n } else {\n // Deploy and build on Vercel\n console.log(chalk.blue(\"\\nDeploying to Vercel...\"));\n try {\n const result = await execa(\"vercel\", [\"deploy\", \"--yes\"], {\n stdio: \"inherit\",\n reject: false,\n });\n if (result.exitCode === 0) {\n console.log(chalk.green(\"\\n✓ Deployment successful!\"));\n } else {\n const pkgManager = getUserPkgManager();\n const runCmd = pkgManager === \"npm\" ? \"npm run\" : pkgManager;\n console.error(chalk.red(\"\\n✖ Deployment failed\"));\n\n console.log(chalk.yellow(\"\\nTroubleshooting Tips:\"));\n console.log(chalk.dim(\"You can check for most errors before deploying for a faster iteration cycle\"));\n console.log(\n `${chalk.dim(\"Run\")} ${runCmd} tsc ${chalk.dim(\"to check for TypeScript errors (most common build errors)\")}`,\n );\n console.log(`${chalk.dim(\"Run\")} ${runCmd} build ${chalk.dim(\"to run the full production build locally\")}`);\n }\n } catch {\n // This catch block should rarely be hit since we're using reject: false\n return;\n }\n }\n}\n\nexport const makeDeployCommand = () => {\n const deployCommand = new Command(\"deploy\")\n .description(\"Deploy your ProofKit application to Vercel\")\n .addOption(nonInteractiveOption)\n .addOption(debugOption)\n .addOption(new Option(\"--local-build\", \"Build locally before deploying\"))\n .action(runDeploy);\n\n deployCommand.hook(\"preAction\", (thisCommand) => {\n initProgramState(thisCommand.opts());\n state.baseCommand = \"deploy\";\n ensureProofKitProject({ commandName: \"deploy\" });\n });\n\n return deployCommand;\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e}from"./consts-BZnOMxpW.js";import{t}from"./logger-DCEXcH26.js";import n from"node:path";import r from"chalk";import i from"fs-extra";import a from"node:os";import o,{OttoAdapter as s}from"@proofkit/fmdapi";const c=/<FMAdd_on[^>]*\bversion="([^"]+)"/i,l=/^\d+$/;function u(e){return e===`auth`?`FM Auth Add-on`:`ProofKit WebViewer`}function d(e){return e===`auth`?`ProofKitAuth`:`ProofKitWV`}function f(e){return e===`auth`?`proofkit add addon auth`:`proofkit add addon webviewer`}function p(e=process.platform,t=a.homedir()){return process.env.PROOFKIT_FM_ADDON_MODULES_DIR||(e===`win32`?n.join(t,`AppData`,`Local`,`FileMaker`,`Extensions`,`AddonModules`):e===`darwin`?n.join(t,`Library`,`Application Support`,`FileMaker`,`Extensions`,`AddonModules`):null)}function m(e){let t=e.split(`.`).map(e=>e.trim()).filter(Boolean);if(!(t.length===0||t.some(e=>!l.test(e))))return t.map(e=>Number.parseInt(e,10))}function h(e,t){let n=m(e),r=m(t);if(!(n&&r))return;let i=Math.max(n.length,r.length);for(let e=0;e<i;e+=1){let t=n[e]??0,i=r[e]??0;if(t<i)return-1;if(t>i)return 1}return 0}async function g(e){let t=n.join(e,`template.xml`);if(await i.pathExists(t)){let e=(await i.readFile(t,`utf8`)).match(c);if(e?.[1])return e[1]}let r=n.join(e,`info.json`);if(await i.pathExists(r)){let e=await i.readJson(r);if(typeof e.Version==`string`||typeof e.Version==`number`)return String(e.Version)}}async function _({addonName:t},r){let a=d(t),o=u(t),s=f(t),c=r&&`targetDir`in r?r.targetDir:p(),l=r?.bundledPath??n.join(e,`template/fm-addon/${a}`),m=await g(l);if(!c)return{status:`unknown`,addonName:t,addonDir:a,addonDisplayName:o,installCommand:s,targetDir:null,installedPath:null,bundledPath:l,bundledVersion:m,reason:`unsupported-platform`};let _=n.join(c,a);if(!await i.pathExists(_))return{status:`missing`,addonName:t,addonDir:a,addonDisplayName:o,installCommand:s,targetDir:c,installedPath:_,bundledPath:l,bundledVersion:m};let v=await g(_);if(!(v&&m))return{status:`unknown`,addonName:t,addonDir:a,addonDisplayName:o,installCommand:s,targetDir:c,installedPath:_,bundledPath:l,bundledVersion:m,installedVersion:v,reason:`unreadable-version`};let y=h(v,m);return y===void 0?{status:`unknown`,addonName:t,addonDir:a,addonDisplayName:o,installCommand:s,targetDir:c,installedPath:_,bundledPath:l,bundledVersion:m,installedVersion:v,reason:`invalid-version`}:{status:y<0?`installed-outdated`:`installed-current`,addonName:t,addonDir:a,addonDisplayName:o,installCommand:s,targetDir:c,installedPath:_,bundledPath:l,bundledVersion:m,installedVersion:v}}function v(e){let t=u(e),n=f(e);return{addonDisplayName:t,installCommand:n,docsUrl:e===`auth`?`https://proofkit.dev/auth/fm-addon`:`https://proofkit.dev/webviewer`,steps:[`Run \`${n}\` to install or update the local add-on files`,`Restart FileMaker Pro (if it's currently running)`,`Open your FileMaker file, go to layout mode, and install the ${t} add-on to the file`]}}async function y({addonName:a}){let o=u(a),s=p();if(!s)return t.warn(`Could not install the ${o} addon. You will need to do this manually.`),!1;let c=d(a);return await i.copy(n.join(e,`template/fm-addon/${c}`),n.join(s,c),{overwrite:!0}),console.log(``),console.log(r.bgYellow(` ACTION REQUIRED: `)),console.log(a===`auth`?`${r.yellowBright(`You must install the FM Auth addon in your FileMaker file to continue.`)} ${r.dim(`(Learn more: https://proofkit.dev/auth/fm-addon)`)}`:`${r.yellowBright(`You must install the ProofKit WebViewer addon in your FileMaker file to continue.`)} ${r.dim(`(Learn more: https://proofkit.dev/webviewer)`)}`),[`Restart FileMaker Pro (if it's currently running)`,`Open your FileMaker file, go to layout mode, and install the ${o} addon to the file`].forEach((e,t)=>{console.log(`${t+1}. ${e}`)}),!0}function b({addonName:e}){return y({addonName:e})}async function x({dataApiKey:e,fmFile:t,server:n}){return w((await o({adapter:new s({auth:{apiKey:e},db:t,server:n}),layout:``}).layouts()).layouts)}function S(e){return`isFolder`in e?(e.folderLayoutNames??[]).flatMap(S):[e.name]}const C=[`API_`,`API `,`dapi_`,`dapi`];function w(e){return e.flatMap(S).sort((e,t)=>{let n=C.find(t=>e.startsWith(t)),r=C.find(e=>t.startsWith(e));return n&&r?e.localeCompare(t):n?-1:r?1:e.localeCompare(t)})}export{b as a,_ as i,x as n,y as o,v as r,C as t};
2
+ //# sourceMappingURL=fmdapi-BO4QL0F8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fmdapi-BO4QL0F8.js","names":[],"sources":["../src/installers/install-fm-addon.ts","../src/cli/fmdapi.ts"],"sourcesContent":["import os from \"node:os\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { logger } from \"~/utils/logger.js\";\n\nexport type FmAddonName = \"auth\" | \"wv\";\nexport type FmAddonInspectionStatus = \"missing\" | \"installed-current\" | \"installed-outdated\" | \"unknown\";\n\nexport interface FmAddonInspection {\n status: FmAddonInspectionStatus;\n addonName: FmAddonName;\n addonDir: string;\n addonDisplayName: string;\n installCommand: string;\n targetDir: string | null;\n installedPath: string | null;\n bundledPath: string;\n bundledVersion?: string;\n installedVersion?: string;\n reason?: string;\n}\n\nconst FM_ADDON_VERSION_REGEX = /<FMAdd_on[^>]*\\bversion=\"([^\"]+)\"/i;\nconst NUMERIC_VERSION_PART_REGEX = /^\\d+$/;\n\nfunction getAddonDisplayName(addonName: FmAddonName) {\n return addonName === \"auth\" ? \"FM Auth Add-on\" : \"ProofKit WebViewer\";\n}\n\nfunction getAddonDir(addonName: FmAddonName) {\n return addonName === \"auth\" ? \"ProofKitAuth\" : \"ProofKitWV\";\n}\n\nfunction getAddonInstallCommand(addonName: FmAddonName) {\n return addonName === \"auth\" ? \"proofkit add addon auth\" : \"proofkit add addon webviewer\";\n}\n\nexport function resolveFmAddonModulesDir(platform = process.platform, homeDir = os.homedir()): string | null {\n const overrideDir = process.env.PROOFKIT_FM_ADDON_MODULES_DIR;\n if (overrideDir) {\n return overrideDir;\n }\n if (platform === \"win32\") {\n return path.join(homeDir, \"AppData\", \"Local\", \"FileMaker\", \"Extensions\", \"AddonModules\");\n }\n if (platform === \"darwin\") {\n return path.join(homeDir, \"Library\", \"Application Support\", \"FileMaker\", \"Extensions\", \"AddonModules\");\n }\n return null;\n}\n\nfunction parseAddonVersion(version: string) {\n const parts = version\n .split(\".\")\n .map((part) => part.trim())\n .filter(Boolean);\n\n if (parts.length === 0 || parts.some((part) => !NUMERIC_VERSION_PART_REGEX.test(part))) {\n return undefined;\n }\n\n return parts.map((part) => Number.parseInt(part, 10));\n}\n\nexport function compareAddonVersions(installedVersion: string, bundledVersion: string) {\n const installed = parseAddonVersion(installedVersion);\n const bundled = parseAddonVersion(bundledVersion);\n\n if (!(installed && bundled)) {\n return undefined;\n }\n\n const maxLength = Math.max(installed.length, bundled.length);\n for (let index = 0; index < maxLength; index += 1) {\n const installedPart = installed[index] ?? 0;\n const bundledPart = bundled[index] ?? 0;\n\n if (installedPart < bundledPart) {\n return -1;\n }\n if (installedPart > bundledPart) {\n return 1;\n }\n }\n\n return 0;\n}\n\nasync function readAddonVersionFromDirectory(addonPath: string): Promise<string | undefined> {\n const templateXmlPath = path.join(addonPath, \"template.xml\");\n if (await fs.pathExists(templateXmlPath)) {\n const templateXml = await fs.readFile(templateXmlPath, \"utf8\");\n const versionMatch = templateXml.match(FM_ADDON_VERSION_REGEX);\n if (versionMatch?.[1]) {\n return versionMatch[1];\n }\n }\n\n const infoJsonPath = path.join(addonPath, \"info.json\");\n if (await fs.pathExists(infoJsonPath)) {\n const infoJson = (await fs.readJson(infoJsonPath)) as { Version?: string | number };\n if (typeof infoJson.Version === \"string\" || typeof infoJson.Version === \"number\") {\n return String(infoJson.Version);\n }\n }\n\n return undefined;\n}\n\nexport async function inspectFmAddon(\n {\n addonName,\n }: {\n addonName: FmAddonName;\n },\n options?: {\n targetDir?: string | null;\n bundledPath?: string;\n },\n): Promise<FmAddonInspection> {\n const addonDir = getAddonDir(addonName);\n const addonDisplayName = getAddonDisplayName(addonName);\n const installCommand = getAddonInstallCommand(addonName);\n const targetDir = options && \"targetDir\" in options ? options.targetDir : resolveFmAddonModulesDir();\n const bundledPath = options?.bundledPath ?? path.join(PKG_ROOT, `template/fm-addon/${addonDir}`);\n const bundledVersion = await readAddonVersionFromDirectory(bundledPath);\n\n if (!targetDir) {\n return {\n status: \"unknown\",\n addonName,\n addonDir,\n addonDisplayName,\n installCommand,\n targetDir: null,\n installedPath: null,\n bundledPath,\n bundledVersion,\n reason: \"unsupported-platform\",\n };\n }\n\n const installedPath = path.join(targetDir, addonDir);\n const installedExists = await fs.pathExists(installedPath);\n\n if (!installedExists) {\n return {\n status: \"missing\",\n addonName,\n addonDir,\n addonDisplayName,\n installCommand,\n targetDir,\n installedPath,\n bundledPath,\n bundledVersion,\n };\n }\n\n const installedVersion = await readAddonVersionFromDirectory(installedPath);\n if (!(installedVersion && bundledVersion)) {\n return {\n status: \"unknown\",\n addonName,\n addonDir,\n addonDisplayName,\n installCommand,\n targetDir,\n installedPath,\n bundledPath,\n bundledVersion,\n installedVersion,\n reason: \"unreadable-version\",\n };\n }\n\n const comparison = compareAddonVersions(installedVersion, bundledVersion);\n if (comparison === undefined) {\n return {\n status: \"unknown\",\n addonName,\n addonDir,\n addonDisplayName,\n installCommand,\n targetDir,\n installedPath,\n bundledPath,\n bundledVersion,\n installedVersion,\n reason: \"invalid-version\",\n };\n }\n\n return {\n status: comparison < 0 ? \"installed-outdated\" : \"installed-current\",\n addonName,\n addonDir,\n addonDisplayName,\n installCommand,\n targetDir,\n installedPath,\n bundledPath,\n bundledVersion,\n installedVersion,\n };\n}\n\nexport function getFmAddonInstallInstructions(addonName: FmAddonName) {\n const addonDisplayName = getAddonDisplayName(addonName);\n const installCommand = getAddonInstallCommand(addonName);\n\n return {\n addonDisplayName,\n installCommand,\n docsUrl: addonName === \"auth\" ? \"https://proofkit.dev/auth/fm-addon\" : \"https://proofkit.dev/webviewer\",\n steps: [\n `Run \\`${installCommand}\\` to install or update the local add-on files`,\n \"Restart FileMaker Pro (if it's currently running)\",\n `Open your FileMaker file, go to layout mode, and install the ${addonDisplayName} add-on to the file`,\n ],\n };\n}\n\nexport async function installFmAddonExplicitly({ addonName }: { addonName: FmAddonName }) {\n const addonDisplayName = getAddonDisplayName(addonName);\n\n const targetDir = resolveFmAddonModulesDir();\n\n if (!targetDir) {\n logger.warn(`Could not install the ${addonDisplayName} addon. You will need to do this manually.`);\n return false;\n }\n\n const addonDir = getAddonDir(addonName);\n\n await fs.copy(path.join(PKG_ROOT, `template/fm-addon/${addonDir}`), path.join(targetDir, addonDir), {\n overwrite: true,\n });\n\n console.log(\"\");\n console.log(chalk.bgYellow(\" ACTION REQUIRED: \"));\n if (addonName === \"auth\") {\n console.log(\n `${chalk.yellowBright(\n \"You must install the FM Auth addon in your FileMaker file to continue.\",\n )} ${chalk.dim(\"(Learn more: https://proofkit.dev/auth/fm-addon)\")}`,\n );\n } else {\n console.log(\n `${chalk.yellowBright(\n \"You must install the ProofKit WebViewer addon in your FileMaker file to continue.\",\n )} ${chalk.dim(\"(Learn more: https://proofkit.dev/webviewer)\")}`,\n );\n }\n const steps = [\n \"Restart FileMaker Pro (if it's currently running)\",\n `Open your FileMaker file, go to layout mode, and install the ${addonDisplayName} addon to the file`,\n ];\n steps.forEach((step, index) => {\n console.log(`${index + 1}. ${step}`);\n });\n return true;\n}\n\nexport function installFmAddon({ addonName }: { addonName: FmAddonName }) {\n return installFmAddonExplicitly({ addonName });\n}\n","import DataApi, { type clientTypes, OttoAdapter, type OttoAPIKey } from \"@proofkit/fmdapi\";\n\nexport async function getLayouts({\n dataApiKey,\n fmFile,\n server,\n}: {\n dataApiKey: OttoAPIKey;\n fmFile: string;\n server: string;\n}) {\n const DapiClient = DataApi({\n adapter: new OttoAdapter({\n auth: { apiKey: dataApiKey },\n db: fmFile,\n server,\n }),\n layout: \"\",\n });\n\n const layoutsResp = await DapiClient.layouts();\n\n const layouts = transformLayoutList(layoutsResp.layouts);\n\n return layouts;\n}\n\nfunction getAllLayoutNames(layout: clientTypes.LayoutOrFolder): string[] {\n if (\"isFolder\" in layout) {\n return (layout.folderLayoutNames ?? []).flatMap(getAllLayoutNames);\n }\n return [layout.name];\n}\n\nexport const commonFileMakerLayoutPrefixes = [\"API_\", \"API \", \"dapi_\", \"dapi\"];\n\nexport function transformLayoutList(layouts: clientTypes.LayoutOrFolder[]): string[] {\n const flatList = layouts.flatMap(getAllLayoutNames);\n\n // sort the list so that any values that begin with one of the prefixes are at the top\n\n const sortedList = flatList.sort((a, b) => {\n const aPrefix = commonFileMakerLayoutPrefixes.find((prefix) => a.startsWith(prefix));\n const bPrefix = commonFileMakerLayoutPrefixes.find((prefix) => b.startsWith(prefix));\n if (aPrefix && bPrefix) {\n return a.localeCompare(b);\n }\n if (aPrefix) {\n return -1;\n }\n if (bPrefix) {\n return 1;\n }\n return a.localeCompare(b);\n });\n return sortedList;\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{r as e}from"./state-BVEcvFT3.js";import{t}from"./logger-DCEXcH26.js";import n from"node:path";import{applyEdits as r,modify as i,parse as a}from"jsonc-parser";import{execa as o}from"execa";import s from"fs-extra";import{Project as c,SyntaxKind as l}from"ts-morph";import{config as u}from"dotenv";import{generateTypedClients as d}from"@proofkit/typegen";async function f(t){await t.save();try{await o(`npx`,[`ultracite`,`fix`,`.`],{cwd:e.projectDir})}catch(t){e.debug&&(console.log(`Error formatting files with ultracite`),console.error(t))}}function p(e){let t=e?.getExpressionIfKind(l.ParenthesizedExpression)?.getExpression()??e?.getExpression();return t?.isKind(l.JsxFragment)||e?.replaceWithText(`return <>${t}</>;`),e}function m(e){return new c({tsConfigFilePath:n.join(e??process.cwd(),`tsconfig.json`)})}const h=`proofkit-typegen.config.jsonc`;function g(e){return!(`type`in e)||e.type===void 0?{...e,type:`fmdapi`}:e}function _(e){return Array.isArray(e)?e.map(g):g(e)}async function v(e){if(!s.existsSync(e))return null;try{let t=a(await s.readFile(e,`utf8`));return t.config&&=_(t.config),t}catch(t){return console.error(`Error reading or parsing JSONC config at ${e}:`,t),{$schema:`https://proofkit.dev/typegen-config-schema.json`,config:[]}}}async function y(e,t){if(s.existsSync(e)){let n=await s.readFile(e,`utf8`),a=r(n,i(n,[`config`],t.config,{formattingOptions:{tabSize:2,insertSpaces:!0,eol:`
2
+ `}}));await s.writeFile(e,a,`utf8`)}else await s.writeJson(e,t,{spaces:2})}async function b({projectDir:e=process.cwd(),schemas:t,runCodegen:r=!0,dataSourceName:i}){let a=n.join(e,h),o=await v(a);o||={$schema:`https://proofkit.dev/typegen-config-schema.json`,config:[]};let s=o.config,c;Array.isArray(s)?c=s:(c=[s],o.config=c);let l=t.map(e=>({layoutName:e.layoutName,schemaName:e.schemaName,valueLists:e.valueLists,generateClient:e.generateClient,strictNumbers:e.strictNumbers})),u=c.find(e=>e.type===`fmdapi`&&(e.path?.endsWith(i)||e.path?.endsWith(`${i}/`)||e.path===i));u?u.layouts=u.layouts||[]:(u={type:`fmdapi`,layouts:[],path:`./src/config/schemas/${i}`,envNames:void 0},c.push(u)),u.layouts.push(...l),await y(a,o),r&&await C()}async function x({config:e,projectDir:t,runCodegen:r=!0}){let i=n.join(t,h),a=await v(i),o=Array.isArray(e)?e:[e];a?Array.isArray(a.config)?a.config.push(...o):a.config=[a.config,...o]:a={$schema:`https://proofkit.dev/typegen-config-schema.json`,config:o},await y(i,a),r&&await C()}async function S({projectDir:e,connectedFileName:t,dataSourceName:r=`filemaker`,baseUrl:i}){let a={type:`fmdapi`,path:`./src/config/schemas/${r}`,clearOldFiles:!0,clientSuffix:`Layout`,webviewerScriptName:`ExecuteDataApi`,envNames:void 0,layouts:[],fmMcp:{enabled:!0,...i?{baseUrl:i}:{},...t?{connectedFileName:t}:{}}},o=n.join(e,h),s=await v(o);if(!s){s={$schema:`https://proofkit.dev/typegen-config-schema.json`,config:[a]},await y(o,s);return}let c=Array.isArray(s.config)?s.config:[s.config];Array.isArray(s.config)||(s.config=c);let l=c.findIndex(e=>e.type===`fmdapi`&&e.path===a.path);if(l===-1)c.push(a);else{let e=c[l];c[l]={...e,...a,layouts:e.layouts??[],fmMcp:{enabled:!0,...e.fmMcp??{},...a.fmMcp??{}}}}await y(o,s)}async function C(){let r=e.projectDir,i=await v(n.join(r,h));if(!i){t.info(`no typegen config found, skipping typegen`);return}u({path:n.join(r,`.env`)}),await d(i.config,{cwd:r})}function w({projectDir:e=process.cwd(),dataSourceName:t}){let r=n.join(e,h);if(!s.existsSync(r))return`Client`;try{let e=_(a(s.readFileSync(r,`utf8`)).config);return(Array.isArray(e)?e:[e]).find(e=>e.type===`fmdapi`&&(e.path?.endsWith(t)||e.path?.endsWith(`${t}/`)||e.path===t))?.clientSuffix??`Client`}catch(e){return console.error(`Error reading or parsing JSONC config for getClientSuffix: ${r}`,e),`Client`}}function T({projectDir:e=process.cwd(),dataSourceName:t}){let r=n.join(e,h);if(!s.existsSync(r))return[];try{let e=_(a(s.readFileSync(r,`utf8`)).config),n=(Array.isArray(e)?e:[e]).find(e=>e.type===`fmdapi`&&(e.path?.endsWith(t)||e.path?.endsWith(`${t}/`)||e.path===t));return n?.layouts?n.layouts.map(e=>({layout:e.layoutName,schemaName:e.schemaName})):[]}catch(e){return console.error(`Error reading or parsing JSONC config for getExistingSchemas: ${r}`,e),[]}}async function E({dataSourceName:t,envNames:r}){let i=e.projectDir,a=n.join(i,h),o=await v(a),s={type:`fmdapi`,layouts:[],path:`./src/config/schemas/${t}`,envNames:void 0,clearOldFiles:!0,clientSuffix:`Layout`};if(r&&(s.envNames={server:r.server,db:r.database,auth:{apiKey:r.apiKey}}),e.appType===`webviewer`&&(s.webviewerScriptName=`ExecuteDataApi`),o){let e;Array.isArray(o.config)?e=o.config:(e=[o.config],o.config=e);let t=e.findIndex(e=>e.type===`fmdapi`&&e.path===s.path);if(t===-1)e.push(s);else{let n=e[t];e[t]={...n,...s,layouts:s.layouts.length>0?s.layouts:n.layouts||[]}}}else o={$schema:`https://proofkit.dev/typegen-config-schema.json`,config:[s]};await y(a,o)}function D({schemaName:t,dataSourceName:r}){let i=e.projectDir,a=m(i),o=n.join(i,`src/config/schemas/${r}/generated/${t}.ts`),c=n.join(i,`src/config/schemas/${r}/${t}.ts`),u=o;if(!s.existsSync(o))if(s.existsSync(c))u=c;else return[];let d=a.addSourceFileAtPath(u),f=d.getVariableDeclaration(`Z${t}`);return f?(f.getInitializer()?.getFirstDescendantByKind(l.ObjectLiteralExpression)?.getProperties())?.map(e=>e.asKind(l.PropertyAssignment)?.getName()?.replace(/"/g,``)).filter(Boolean)??[]:(d.getTypeAlias(`T${t}`)?.getFirstDescendantByKind(l.TypeLiteral)?.getProperties())?.map(e=>e.asKind(l.PropertySignature)?.getName()?.replace(/"/g,``)).filter(Boolean)??[]}async function O({dataSourceName:t}){let r=e.projectDir,i=n.join(r,h),a=await v(i);if(!a)return;let o=`./src/config/schemas/${t}`;if(Array.isArray(a.config))a.config=a.config.filter(e=>!(e.type===`fmdapi`&&e.path===o));else{let e=a.config;e.type===`fmdapi`&&e.path===o&&(a.config=[])}await y(i,a)}async function k({projectDir:t=e.projectDir,schemaName:r,dataSourceName:i,runCodegen:a=!0}){let o=n.join(t,h),c=await v(o);if(!c)throw Error(`${h} not found, cannot remove layout.`);let l=!1,u=`./src/config/schemas/${i}`,d;Array.isArray(c.config)?d=c.config:(d=[c.config],c.config=d);let f=d.find(e=>e.type===`fmdapi`&&e.path===u);if(f?.layouts){let e=f.layouts.length;f.layouts=f.layouts.filter(e=>e.schemaName!==r),f.layouts.length<e&&(l=!0)}l&&await y(o,c);let p=n.join(t,`src`,`config`,`schemas`,i,`${r}.ts`);s.existsSync(p)&&s.removeSync(p),a&&l&&await C()}export{w as a,O as c,p as d,m as f,S as i,k as l,b as n,T as o,f as p,E as r,D as s,x as t,C as u};
3
+ //# sourceMappingURL=fmdapi-DyRYZWzI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fmdapi-DyRYZWzI.js","names":["parseJsonc","config"],"sources":["../src/utils/formatting.ts","../src/utils/ts-morph.ts","../src/generators/fmdapi.ts"],"sourcesContent":["import { execa } from \"execa\";\nimport type { Project } from \"ts-morph\";\n\nimport { state } from \"~/state.js\";\n\n/**\n * Formats all source files in a ts-morph Project using ultracite and saves the changes.\n * @param project The ts-morph Project containing the files to format\n */\nexport async function formatAndSaveSourceFiles(project: Project) {\n await project.save(); // save files first\n try {\n // Run ultracite fix on the project directory\n await execa(\"npx\", [\"ultracite\", \"fix\", \".\"], {\n cwd: state.projectDir,\n });\n } catch (error) {\n if (state.debug) {\n console.log(\"Error formatting files with ultracite\");\n console.error(error);\n }\n // Continue even if formatting fails\n }\n}\n","import path from \"node:path\";\nimport { Project, type ReturnStatement, SyntaxKind } from \"ts-morph\";\n\nexport { formatAndSaveSourceFiles } from \"./formatting.js\";\n\nexport function ensureReturnStatementIsWrappedInFragment(returnStatement: ReturnStatement | undefined) {\n const expression =\n returnStatement?.getExpressionIfKind(SyntaxKind.ParenthesizedExpression)?.getExpression() ??\n returnStatement?.getExpression();\n\n if (expression?.isKind(SyntaxKind.JsxFragment)) {\n return returnStatement;\n }\n\n returnStatement?.replaceWithText(`return <>${expression}</>;`);\n return returnStatement;\n}\n\nexport function getNewProject(projectDir?: string) {\n const project = new Project({\n tsConfigFilePath: path.join(projectDir ?? process.cwd(), \"tsconfig.json\"),\n });\n\n return project;\n}\n","import path from \"node:path\";\nimport { generateTypedClients } from \"@proofkit/typegen\";\nimport type { typegenConfigSingle } from \"@proofkit/typegen/config\";\nimport { config as dotenvConfig } from \"dotenv\";\nimport fs from \"fs-extra\";\nimport { applyEdits, modify, parse as parseJsonc } from \"jsonc-parser\";\nimport { SyntaxKind } from \"ts-morph\";\nimport type { z } from \"zod/v4\";\n\nimport { state } from \"~/state.js\";\nimport { logger } from \"~/utils/logger.js\";\nimport type { envNamesSchema } from \"~/utils/parseSettings.js\";\nimport { getNewProject } from \"~/utils/ts-morph.js\";\n\n// Input schema for functions like addLayout\n// This might be different from the layout config stored in the file\ninterface Schema {\n layoutName: string;\n schemaName: string;\n valueLists?: \"strict\" | \"allowEmpty\" | \"ignore\";\n generateClient?: boolean;\n strictNumbers?: boolean;\n}\n\n// For any data source configuration object (fmdapi or fmodata)\ntype AnyDataSourceConfig = z.infer<typeof typegenConfigSingle>;\n// For a single fmdapi data source configuration object\ntype FmdapiDataSourceConfig = Extract<AnyDataSourceConfig, { type: \"fmdapi\" }>;\n// For a single layout configuration object within a data source\ntype ImportedLayoutConfig = FmdapiDataSourceConfig[\"layouts\"][number];\n\n// This type represents the actual structure of the JSONC file, including $schema\ninterface FullProofkitTypegenJsonFile {\n $schema?: string;\n config: AnyDataSourceConfig | AnyDataSourceConfig[];\n}\n\nconst typegenConfigFileName = \"proofkit-typegen.config.jsonc\";\n\n// Helper function to normalize data sources by adding default type for backwards compatibility\n// This mirrors the zod preprocess in @proofkit/typegen that defaults type to \"fmdapi\"\nfunction normalizeDataSource(ds: AnyDataSourceConfig): AnyDataSourceConfig {\n if (!(\"type\" in ds) || ds.type === undefined) {\n return { ...(ds as object), type: \"fmdapi\" } as AnyDataSourceConfig;\n }\n return ds;\n}\n\nfunction normalizeConfig(\n config: AnyDataSourceConfig | AnyDataSourceConfig[],\n): AnyDataSourceConfig | AnyDataSourceConfig[] {\n if (Array.isArray(config)) {\n return config.map(normalizeDataSource);\n }\n return normalizeDataSource(config);\n}\n\n// Helper functions for JSON config\nasync function readJsonConfigFile(configPath: string): Promise<FullProofkitTypegenJsonFile | null> {\n if (!fs.existsSync(configPath)) {\n return null;\n }\n try {\n const fileContent = await fs.readFile(configPath, \"utf8\");\n const parsed = parseJsonc(fileContent) as FullProofkitTypegenJsonFile;\n // Normalize config to add default type for backwards compatibility\n if (parsed.config) {\n parsed.config = normalizeConfig(parsed.config);\n }\n return parsed;\n } catch (error) {\n console.error(`Error reading or parsing JSONC config at ${configPath}:`, error);\n // Return a default structure for the *file* if parsing fails but file exists\n return {\n $schema: \"https://proofkit.dev/typegen-config-schema.json\",\n config: [],\n };\n }\n}\n\nasync function writeJsonConfigFile(configPath: string, fileContent: FullProofkitTypegenJsonFile) {\n // Check if file exists to preserve comments\n if (fs.existsSync(configPath)) {\n const originalText = await fs.readFile(configPath, \"utf8\");\n // Use jsonc-parser's modify function to preserve comments\n const edits = modify(originalText, [\"config\"], fileContent.config, {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n eol: \"\\n\",\n },\n });\n const modifiedText = applyEdits(originalText, edits);\n await fs.writeFile(configPath, modifiedText, \"utf8\");\n } else {\n // If file doesn't exist, create it with proper formatting\n await fs.writeJson(configPath, fileContent, { spaces: 2 });\n }\n}\n\nexport async function addLayout({\n projectDir = process.cwd(),\n schemas,\n runCodegen = true,\n dataSourceName,\n}: {\n projectDir?: string;\n schemas: Schema[];\n runCodegen?: boolean;\n dataSourceName: string;\n}) {\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n let fileContent = await readJsonConfigFile(jsonConfigPath);\n\n if (!fileContent) {\n fileContent = {\n $schema: \"https://proofkit.dev/typegen-config-schema.json\",\n config: [],\n };\n }\n\n // Work with the 'config' property which is TypegenConfig['config']\n const configProperty = fileContent.config;\n\n let configArray: AnyDataSourceConfig[];\n if (Array.isArray(configProperty)) {\n configArray = configProperty;\n } else {\n configArray = [configProperty];\n fileContent.config = configArray; // Update fileContent to ensure it's an array for later ops\n }\n\n const layoutsToAdd: ImportedLayoutConfig[] = schemas.map((schema) => ({\n layoutName: schema.layoutName,\n schemaName: schema.schemaName,\n valueLists: schema.valueLists,\n generateClient: schema.generateClient,\n strictNumbers: schema.strictNumbers,\n }));\n\n let targetDataSource: FmdapiDataSourceConfig | undefined = configArray.find(\n (ds): ds is FmdapiDataSourceConfig =>\n ds.type === \"fmdapi\" &&\n (ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName),\n );\n\n if (targetDataSource) {\n targetDataSource.layouts = targetDataSource.layouts || [];\n } else {\n targetDataSource = {\n type: \"fmdapi\",\n layouts: [],\n path: `./src/config/schemas/${dataSourceName}`,\n // other default properties for a new DataSourceConfig can be added here if needed\n envNames: undefined,\n };\n configArray.push(targetDataSource);\n }\n\n targetDataSource.layouts.push(...layoutsToAdd);\n // fileContent.config is already pointing to configArray if it was modified\n\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n\n if (runCodegen) {\n await runCodegenCommand();\n }\n}\n\nexport async function addConfig({\n config,\n projectDir,\n runCodegen = true,\n}: {\n config: FmdapiDataSourceConfig | FmdapiDataSourceConfig[];\n projectDir: string;\n runCodegen?: boolean;\n}) {\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n let fileContent = await readJsonConfigFile(jsonConfigPath);\n\n const configsToAdd = Array.isArray(config) ? config : [config];\n\n if (fileContent) {\n if (Array.isArray(fileContent.config)) {\n fileContent.config.push(...configsToAdd);\n } else {\n fileContent.config = [fileContent.config, ...configsToAdd];\n }\n } else {\n fileContent = {\n $schema: \"https://proofkit.dev/typegen-config-schema.json\",\n config: configsToAdd,\n };\n }\n\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n\n if (runCodegen) {\n await runCodegenCommand();\n }\n}\n\nexport async function ensureWebviewerFmMcpConfig({\n projectDir,\n connectedFileName,\n dataSourceName = \"filemaker\",\n baseUrl,\n}: {\n projectDir: string;\n connectedFileName?: string;\n dataSourceName?: string;\n baseUrl?: string;\n}) {\n const newConfig: FmdapiDataSourceConfig = {\n type: \"fmdapi\",\n path: `./src/config/schemas/${dataSourceName}`,\n clearOldFiles: true,\n clientSuffix: \"Layout\",\n webviewerScriptName: \"ExecuteDataApi\",\n envNames: undefined,\n layouts: [],\n fmMcp: {\n enabled: true,\n ...(baseUrl ? { baseUrl } : {}),\n ...(connectedFileName ? { connectedFileName } : {}),\n },\n };\n\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n let fileContent = await readJsonConfigFile(jsonConfigPath);\n\n if (!fileContent) {\n fileContent = {\n $schema: \"https://proofkit.dev/typegen-config-schema.json\",\n config: [newConfig],\n };\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n return;\n }\n\n const configArray = Array.isArray(fileContent.config) ? fileContent.config : [fileContent.config];\n if (!Array.isArray(fileContent.config)) {\n fileContent.config = configArray;\n }\n\n const existingConfigIndex = configArray.findIndex(\n (config): config is FmdapiDataSourceConfig => config.type === \"fmdapi\" && config.path === newConfig.path,\n );\n\n if (existingConfigIndex === -1) {\n configArray.push(newConfig);\n } else {\n const existingConfig = configArray[existingConfigIndex] as FmdapiDataSourceConfig;\n configArray[existingConfigIndex] = {\n ...existingConfig,\n ...newConfig,\n layouts: existingConfig.layouts ?? [],\n fmMcp: {\n enabled: true,\n ...(existingConfig.fmMcp ?? {}),\n ...(newConfig.fmMcp ?? {}),\n },\n };\n }\n\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n}\n\nexport async function runCodegenCommand() {\n const projectDir = state.projectDir;\n const config = await readJsonConfigFile(path.join(projectDir, typegenConfigFileName));\n if (!config) {\n logger.info(\"no typegen config found, skipping typegen\");\n return;\n }\n\n // make sure to load the .env file\n dotenvConfig({ path: path.join(projectDir, \".env\") });\n await generateTypedClients(config.config, { cwd: projectDir });\n}\n\nexport function getClientSuffix({\n projectDir = process.cwd(),\n dataSourceName,\n}: {\n projectDir?: string;\n dataSourceName: string;\n}): string {\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n if (!fs.existsSync(jsonConfigPath)) {\n return \"Client\";\n }\n try {\n const fileContent = fs.readFileSync(jsonConfigPath, \"utf8\");\n const parsed = parseJsonc(fileContent) as FullProofkitTypegenJsonFile;\n\n // Normalize config to add default type for backwards compatibility\n const normalizedConfig = normalizeConfig(parsed.config);\n const configToSearch = Array.isArray(normalizedConfig) ? normalizedConfig : [normalizedConfig];\n\n const targetDataSource = configToSearch.find(\n (ds): ds is FmdapiDataSourceConfig =>\n ds.type === \"fmdapi\" &&\n (ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName),\n );\n return targetDataSource?.clientSuffix ?? \"Client\";\n } catch (error) {\n console.error(`Error reading or parsing JSONC config for getClientSuffix: ${jsonConfigPath}`, error);\n return \"Client\";\n }\n}\n\nexport function getExistingSchemas({\n projectDir = process.cwd(),\n dataSourceName,\n}: {\n projectDir?: string;\n dataSourceName: string;\n}): { layout?: string; schemaName?: string }[] {\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n if (!fs.existsSync(jsonConfigPath)) {\n return [];\n }\n try {\n const fileContent = fs.readFileSync(jsonConfigPath, \"utf8\");\n const parsed = parseJsonc(fileContent) as FullProofkitTypegenJsonFile;\n\n // Normalize config to add default type for backwards compatibility\n const normalizedConfig = normalizeConfig(parsed.config);\n const configToSearch = Array.isArray(normalizedConfig) ? normalizedConfig : [normalizedConfig];\n\n const targetDataSource = configToSearch.find(\n (ds): ds is FmdapiDataSourceConfig =>\n ds.type === \"fmdapi\" &&\n (ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName),\n );\n\n if (targetDataSource?.layouts) {\n return targetDataSource.layouts.map((layout) => ({\n layout: layout.layoutName,\n schemaName: layout.schemaName,\n }));\n }\n return [];\n } catch (error) {\n console.error(`Error reading or parsing JSONC config for getExistingSchemas: ${jsonConfigPath}`, error);\n return [];\n }\n}\n\nexport async function addToFmschemaConfig({\n dataSourceName,\n envNames,\n}: {\n dataSourceName: string;\n envNames?: z.infer<typeof envNamesSchema>;\n}) {\n const projectDir = state.projectDir;\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n let fileContent = await readJsonConfigFile(jsonConfigPath);\n\n const newDataSource: FmdapiDataSourceConfig = {\n type: \"fmdapi\",\n layouts: [],\n path: `./src/config/schemas/${dataSourceName}`,\n envNames: undefined,\n clearOldFiles: true,\n clientSuffix: \"Layout\",\n };\n\n if (envNames) {\n newDataSource.envNames = {\n server: envNames.server,\n db: envNames.database,\n auth: { apiKey: envNames.apiKey },\n };\n }\n if (state.appType === \"webviewer\") {\n newDataSource.webviewerScriptName = \"ExecuteDataApi\";\n }\n\n if (fileContent) {\n let configArray: AnyDataSourceConfig[];\n if (Array.isArray(fileContent.config)) {\n configArray = fileContent.config;\n } else {\n configArray = [fileContent.config];\n fileContent.config = configArray;\n }\n\n const existingDsIndex = configArray.findIndex((ds) => ds.type === \"fmdapi\" && ds.path === newDataSource.path);\n if (existingDsIndex === -1) {\n configArray.push(newDataSource);\n } else {\n const existingConfig = configArray[existingDsIndex] as FmdapiDataSourceConfig;\n configArray[existingDsIndex] = {\n ...existingConfig,\n ...newDataSource,\n layouts: newDataSource.layouts.length > 0 ? newDataSource.layouts : existingConfig.layouts || [],\n };\n }\n } else {\n fileContent = {\n $schema: \"https://proofkit.dev/typegen-config-schema.json\",\n config: [newDataSource],\n };\n }\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n}\n\nexport function getFieldNamesForSchema({ schemaName, dataSourceName }: { schemaName: string; dataSourceName: string }) {\n const projectDir = state.projectDir;\n const project = getNewProject(projectDir);\n const sourceFilePath = path.join(projectDir, `src/config/schemas/${dataSourceName}/generated/${schemaName}.ts`);\n\n const sourceFilePathAlternative = path.join(projectDir, `src/config/schemas/${dataSourceName}/${schemaName}.ts`);\n\n let fileToUse = sourceFilePath;\n if (!fs.existsSync(sourceFilePath)) {\n if (fs.existsSync(sourceFilePathAlternative)) {\n fileToUse = sourceFilePathAlternative;\n } else {\n return [];\n }\n }\n const sourceFile = project.addSourceFileAtPath(fileToUse);\n\n const zodSchema = sourceFile.getVariableDeclaration(`Z${schemaName}`);\n if (zodSchema) {\n const properties = zodSchema\n .getInitializer()\n ?.getFirstDescendantByKind(SyntaxKind.ObjectLiteralExpression)\n ?.getProperties();\n return (\n properties?.map((pr) => pr.asKind(SyntaxKind.PropertyAssignment)?.getName()?.replace(/\"/g, \"\")).filter(Boolean) ??\n []\n );\n }\n const typeAlias = sourceFile.getTypeAlias(`T${schemaName}`);\n const properties = typeAlias?.getFirstDescendantByKind(SyntaxKind.TypeLiteral)?.getProperties();\n return (\n properties?.map((pr) => pr.asKind(SyntaxKind.PropertySignature)?.getName()?.replace(/\"/g, \"\")).filter(Boolean) ?? []\n );\n}\n\nexport async function removeFromFmschemaConfig({ dataSourceName }: { dataSourceName: string }) {\n const projectDir = state.projectDir;\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n const fileContent = await readJsonConfigFile(jsonConfigPath);\n\n if (!fileContent) {\n return;\n }\n\n const pathToRemove = `./src/config/schemas/${dataSourceName}`;\n\n if (Array.isArray(fileContent.config)) {\n fileContent.config = fileContent.config.filter((ds) => !(ds.type === \"fmdapi\" && ds.path === pathToRemove));\n } else {\n const currentConfig = fileContent.config;\n if (currentConfig.type === \"fmdapi\" && currentConfig.path === pathToRemove) {\n fileContent.config = [];\n }\n }\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n}\n\nexport async function removeLayout({\n projectDir = state.projectDir,\n schemaName,\n dataSourceName,\n runCodegen = true,\n}: {\n projectDir?: string;\n schemaName: string;\n dataSourceName: string;\n runCodegen?: boolean;\n}) {\n const jsonConfigPath = path.join(projectDir, typegenConfigFileName);\n const fileContent = await readJsonConfigFile(jsonConfigPath);\n\n if (!fileContent) {\n throw new Error(`${typegenConfigFileName} not found, cannot remove layout.`);\n }\n\n let dataSourceModified = false;\n const targetDsPath = `./src/config/schemas/${dataSourceName}`;\n\n let configArray: AnyDataSourceConfig[];\n if (Array.isArray(fileContent.config)) {\n configArray = fileContent.config;\n } else {\n configArray = [fileContent.config];\n fileContent.config = configArray;\n }\n\n const targetDataSource = configArray.find(\n (ds): ds is FmdapiDataSourceConfig => ds.type === \"fmdapi\" && ds.path === targetDsPath,\n );\n\n if (targetDataSource?.layouts) {\n const initialCount = targetDataSource.layouts.length;\n targetDataSource.layouts = targetDataSource.layouts.filter((layout) => layout.schemaName !== schemaName);\n if (targetDataSource.layouts.length < initialCount) {\n dataSourceModified = true;\n }\n }\n\n if (dataSourceModified) {\n await writeJsonConfigFile(jsonConfigPath, fileContent);\n }\n\n const schemaFilePath = path.join(projectDir, \"src\", \"config\", \"schemas\", dataSourceName, `${schemaName}.ts`);\n if (fs.existsSync(schemaFilePath)) {\n fs.removeSync(schemaFilePath);\n }\n\n if (runCodegen && dataSourceModified) {\n await runCodegenCommand();\n }\n}\n\n// Make sure to remove unused imports like Project, SyntaxKind, etc. if they are no longer used anywhere.\n// Also remove getNewProject and formatAndSaveSourceFiles from imports if they were only for config.\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith(`yarn`)?`yarn`:e.startsWith(`pnpm`)?`pnpm`:e.startsWith(`bun`)?`bun`:`npm`:`pnpm`};export{e as t};
2
+ //# sourceMappingURL=getUserPkgManager-Cph_6l1P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUserPkgManager-Cph_6l1P.js","names":[],"sources":["../src/utils/getUserPkgManager.ts"],"sourcesContent":["export type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport const getUserPkgManager: () => PackageManager = () => {\n // This environment variable is set by npm and yarn but pnpm seems less consistent\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\";\n }\n return \"npm\";\n }\n // If no user agent is set, assume pnpm\n return \"pnpm\";\n};\n"],"mappings":"AAEA,MAAa,MAAgD,CAE3D,IAAM,EAAY,QAAQ,IAAI,sBAe9B,OAbI,EACE,EAAU,WAAW,OAAO,CACvB,OAEL,EAAU,WAAW,OAAO,CACvB,OAEL,EAAU,WAAW,MAAM,CACtB,MAEF,MAGF"}
@@ -0,0 +1,2 @@
1
+ import{Option as e}from"commander";const t=new e(`--non-interactive`,`Never prompt for input; fail with a clear error when required values are missing`).default(!1),n=new e(`--debug`,`Run in debug mode`).default(!1);export{t as n,n as t};
2
+ //# sourceMappingURL=globalOptions-CkqEi9uC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalOptions-CkqEi9uC.js","names":[],"sources":["../src/globalOptions.ts"],"sourcesContent":["import { Option } from \"commander\";\n\nexport const nonInteractiveOption = new Option(\n \"--non-interactive\",\n \"Never prompt for input; fail with a clear error when required values are missing\",\n).default(false);\nexport const debugOption = new Option(\"--debug\", \"Run in debug mode\").default(false);\n"],"mappings":"mCAEA,MAAa,EAAuB,IAAI,EACtC,oBACA,mFACD,CAAC,QAAQ,GAAM,CACH,EAAc,IAAI,EAAO,UAAW,oBAAoB,CAAC,QAAQ,GAAM"}