@proofkit/cli 2.0.0-beta.23 → 2.0.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/add-h15IdCWp.js +57 -0
- package/dist/add-h15IdCWp.js.map +1 -0
- package/dist/{addPackageDependency-BGZl7xc5.js → addPackageDependency-BUJ8tT5i.js} +2 -2
- package/dist/{addPackageDependency-BGZl7xc5.js.map → addPackageDependency-BUJ8tT5i.js.map} +1 -1
- package/dist/{consts-BZnOMxpW.js → consts-CE9CE6Fo.js} +4 -4
- package/dist/{consts-BZnOMxpW.js.map → consts-CE9CE6Fo.js.map} +1 -1
- package/dist/{deploy-D25sPO7K.js → deploy-BJryOaec.js} +3 -3
- package/dist/{deploy-D25sPO7K.js.map → deploy-BJryOaec.js.map} +1 -1
- package/dist/errors-DxuuVXoQ.js +2 -0
- package/dist/errors-DxuuVXoQ.js.map +1 -0
- package/dist/{fmdapi-BO4QL0F8.js → fmdapi-D4f7TrLy.js} +2 -2
- package/dist/{fmdapi-BO4QL0F8.js.map → fmdapi-D4f7TrLy.js.map} +1 -1
- package/dist/{fmdapi-DyRYZWzI.js → fmdapi-H4o2qGE2.js} +3 -3
- package/dist/{fmdapi-DyRYZWzI.js.map → fmdapi-H4o2qGE2.js.map} +1 -1
- package/dist/{getUserPkgManager-Cph_6l1P.js → getUserPkgManager-CZwrE7fs.js} +1 -1
- package/dist/{getUserPkgManager-Cph_6l1P.js.map → getUserPkgManager-CZwrE7fs.js.map} +1 -1
- package/dist/{globalOptions-CkqEi9uC.js → globalOptions-C6fknjPB.js} +1 -1
- package/dist/{globalOptions-CkqEi9uC.js.map → globalOptions-C6fknjPB.js.map} +1 -1
- package/dist/{index-DALPpGd1.d.ts → index-D9Y-xAF1.d.ts} +124 -42
- package/dist/index-D9Y-xAF1.d.ts.map +1 -0
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/dist/{logger-DCEXcH26.js → logger-DxbfijxS.js} +1 -1
- package/dist/{logger-DCEXcH26.js.map → logger-DxbfijxS.js.map} +1 -1
- package/dist/{parseSettings-DJ2m9sgJ.js → parseSettings-xU5Rw3Ne.js} +1 -1
- package/dist/{parseSettings-DJ2m9sgJ.js.map → parseSettings-xU5Rw3Ne.js.map} +1 -1
- package/dist/{proofkit-webviewer-73IB1OBU.js → proofkit-webviewer-Baa93FAx.js} +2 -2
- package/dist/{proofkit-webviewer-73IB1OBU.js.map → proofkit-webviewer-Baa93FAx.js.map} +1 -1
- package/dist/remove-COo1Ju8v.js +2 -0
- package/dist/remove-COo1Ju8v.js.map +1 -0
- package/dist/typegen-DrfVmQfx.js +2 -0
- package/dist/{typegen-DyXaif5O.js.map → typegen-DrfVmQfx.js.map} +1 -1
- package/dist/update-Cpyhj57Y.js +7 -0
- package/dist/{update-FX71y5b3.js.map → update-Cpyhj57Y.js.map} +1 -1
- package/dist/utils-DGwyHkvO.js +3 -0
- package/dist/{utils-DymV7zmv.js.map → utils-DGwyHkvO.js.map} +1 -1
- package/package.json +2 -2
- package/template/nextjs-mantine/package.json +2 -1
- package/template/nextjs-shadcn/package.json +2 -0
- package/template/vite-wv/package.json +2 -2
- package/dist/add-DrcID6d6.js +0 -57
- package/dist/add-DrcID6d6.js.map +0 -1
- package/dist/index-DALPpGd1.d.ts.map +0 -1
- package/dist/remove-BOCU6In3.js +0 -2
- package/dist/remove-BOCU6In3.js.map +0 -1
- package/dist/typegen-DyXaif5O.js +0 -2
- package/dist/update-FX71y5b3.js +0 -7
- package/dist/utils-DymV7zmv.js +0 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import e from"chalk";const t={error(...t){console.log(e.red(...t))},warn(...t){console.log(e.yellow(...t))},info(...t){console.log(e.cyan(...t))},success(...t){console.log(e.green(...t))},dim(...t){console.log(e.dim(...t))}};export{t};
|
|
2
|
-
//# sourceMappingURL=logger-
|
|
2
|
+
//# sourceMappingURL=logger-DxbfijxS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-
|
|
1
|
+
{"version":3,"file":"logger-DxbfijxS.js","names":[],"sources":["../src/utils/logger.ts"],"sourcesContent":["import chalk from \"chalk\";\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args));\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args));\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args));\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args));\n },\n dim(...args: unknown[]) {\n console.log(chalk.dim(...args));\n },\n};\n"],"mappings":"qBAEA,MAAa,EAAS,CACpB,MAAM,GAAG,EAAiB,CACxB,QAAQ,IAAI,EAAM,IAAI,GAAG,EAAK,CAAC,EAEjC,KAAK,GAAG,EAAiB,CACvB,QAAQ,IAAI,EAAM,OAAO,GAAG,EAAK,CAAC,EAEpC,KAAK,GAAG,EAAiB,CACvB,QAAQ,IAAI,EAAM,KAAK,GAAG,EAAK,CAAC,EAElC,QAAQ,GAAG,EAAiB,CAC1B,QAAQ,IAAI,EAAM,MAAM,GAAG,EAAK,CAAC,EAEnC,IAAI,GAAG,EAAiB,CACtB,QAAQ,IAAI,EAAM,IAAI,GAAG,EAAK,CAAC,EAElC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{_ as e,c as t,d as n,h as r,l as i,m as a,p as o,r as s,s as c,u as l}from"./state-BVEcvFT3.js";import u from"node:path";import d from"fs-extra";var f=e({appTypes:()=>g,dataSourceSchema:()=>h,defaultSettings:()=>v,envNamesSchema:()=>m,getSettings:()=>x,mergeSettings:()=>C,readSettings:()=>S,setSettings:()=>w,validateAndSetEnvFile:()=>T});const p=l(`type`,[o({type:n(`clerk`)}),o({type:n(`next-auth`)}),o({type:n(`proofkit`).transform(()=>`fmaddon`)}),o({type:n(`fmaddon`)}),o({type:n(`better-auth`)}),o({type:n(`none`)})]).default({type:`none`}),m=o({database:a().default(`FM_DATABASE`),server:a().default(`FM_SERVER`),apiKey:a().default(`OTTO_API_KEY`)}),h=l(`type`,[o({type:n(`fm`),name:a(),envNames:m}),o({type:n(`supabase`),name:a()})]),g=[`browser`,`webviewer`],_=l(`ui`,[o({ui:n(`mantine`),appType:c(g).default(`browser`),auth:p,envFile:a().optional(),dataSources:t(h).default([]),tanstackQuery:i().catch(!1),replacedMainPage:i().catch(!1),reactEmail:i().catch(!1),reactEmailServer:i().catch(!1),appliedUpgrades:t(a()).default([]),registryUrl:r().optional(),registryTemplates:t(a()).default([])}),o({ui:n(`shadcn`),appType:c(g).default(`browser`),envFile:a().optional(),dataSources:t(h).default([]),replacedMainPage:i().catch(!1),registryUrl:r().optional(),registryTemplates:t(a()).default([])})]),v=_.parse({auth:{type:`none`},ui:`shadcn`,appType:`browser`,dataSources:[],replacedMainPage:!1,registryTemplates:[]});let y;function b(e){if(!d.existsSync(e))throw Error(`ProofKit settings file not found at: ${e}`);let t=d.readJSONSync(e);return typeof t==`object`&&t&&!(`ui`in t)&&(t={...t,ui:`mantine`}),_.parse(t)}const x=()=>{if(y)return y;let e=b(u.join(s.projectDir,`proofkit.json`));return s.appType=e.appType,y=e,e};function S(e=s.projectDir){return b(u.join(e,`proofkit.json`))}function C(e){let t={...x(),...e};w(_.parse(t))}function w(e){return d.writeJSONSync(u.join(s.projectDir,`proofkit.json`),e,{spaces:2}),y=e,y}function T(e=`.env`){let t=x(),n=u.join(s.projectDir,e);if(d.existsSync(n))return w({...t,envFile:e}),e;if(t.envFile){let{envFile:e,...n}=t;w(n)}}export{S as a,f as i,x as n,w as o,C as r,T as s,v as t};
|
|
2
|
-
//# sourceMappingURL=parseSettings-
|
|
2
|
+
//# sourceMappingURL=parseSettings-xU5Rw3Ne.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseSettings-
|
|
1
|
+
{"version":3,"file":"parseSettings-xU5Rw3Ne.js","names":["z\n .discriminatedUnion","z.object","z.literal","z.string","z.discriminatedUnion","z.enum","z.array","z.boolean","z.url"],"sources":["../src/utils/parseSettings.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod/v4\";\n\nimport { state } from \"~/state.js\";\n\nconst authSchema = z\n .discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"clerk\"),\n }),\n z.object({\n type: z.literal(\"next-auth\"),\n }),\n z.object({\n type: z.literal(\"proofkit\").transform(() => \"fmaddon\"),\n }),\n z.object({\n type: z.literal(\"fmaddon\"),\n }),\n z.object({\n type: z.literal(\"better-auth\"),\n }),\n z.object({\n type: z.literal(\"none\"),\n }),\n ])\n .default({ type: \"none\" });\n\nexport const envNamesSchema = z.object({\n database: z.string().default(\"FM_DATABASE\"),\n server: z.string().default(\"FM_SERVER\"),\n apiKey: z.string().default(\"OTTO_API_KEY\"),\n});\nexport const dataSourceSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"fm\"),\n name: z.string(),\n envNames: envNamesSchema,\n }),\n z.object({\n type: z.literal(\"supabase\"),\n name: z.string(),\n }),\n]);\nexport type DataSource = z.infer<typeof dataSourceSchema>;\n\nexport const appTypes = [\"browser\", \"webviewer\"] as const;\n\nexport const uiTypes = [\"shadcn\", \"mantine\"] as const;\nexport type Ui = (typeof uiTypes)[number];\n\nconst settingsSchema = z.discriminatedUnion(\"ui\", [\n z.object({\n ui: z.literal(\"mantine\"),\n appType: z.enum(appTypes).default(\"browser\"),\n auth: authSchema,\n envFile: z.string().optional(),\n dataSources: z.array(dataSourceSchema).default([]),\n tanstackQuery: z.boolean().catch(false),\n replacedMainPage: z.boolean().catch(false),\n // Whether React Email scaffolding has been installed\n reactEmail: z.boolean().catch(false),\n // Whether provider-specific server email sender files have been installed\n reactEmailServer: z.boolean().catch(false),\n appliedUpgrades: z.array(z.string()).default([]),\n registryUrl: z.url().optional(),\n registryTemplates: z.array(z.string()).default([]),\n }),\n z.object({\n ui: z.literal(\"shadcn\"),\n appType: z.enum(appTypes).default(\"browser\"),\n envFile: z.string().optional(),\n dataSources: z.array(dataSourceSchema).default([]),\n replacedMainPage: z.boolean().catch(false),\n registryUrl: z.url().optional(),\n registryTemplates: z.array(z.string()).default([]),\n }),\n]);\n\nexport const defaultSettings = settingsSchema.parse({\n auth: { type: \"none\" },\n ui: \"shadcn\",\n appType: \"browser\",\n dataSources: [],\n replacedMainPage: false,\n registryTemplates: [],\n});\n\nlet settings: Settings | undefined;\nfunction parseSettingsFile(settingsPath: string) {\n // Check if the settings file exists before trying to read it\n if (!fs.existsSync(settingsPath)) {\n throw new Error(`ProofKit settings file not found at: ${settingsPath}`);\n }\n\n let settingsFile: unknown = fs.readJSONSync(settingsPath);\n\n if (typeof settingsFile === \"object\" && settingsFile !== null && !(\"ui\" in settingsFile)) {\n settingsFile = { ...settingsFile, ui: \"mantine\" };\n }\n\n const parsed = settingsSchema.parse(settingsFile);\n return parsed;\n}\n\nexport const getSettings = () => {\n if (settings) {\n return settings;\n }\n\n const settingsPath = path.join(state.projectDir, \"proofkit.json\");\n const parsed = parseSettingsFile(settingsPath);\n\n state.appType = parsed.appType;\n settings = parsed;\n return parsed;\n};\n\nexport function readSettings(projectDir = state.projectDir) {\n return parseSettingsFile(path.join(projectDir, \"proofkit.json\"));\n}\n\nexport type Settings = z.infer<typeof settingsSchema>;\n\nexport function mergeSettings(_settings: Partial<Settings>) {\n const settings = getSettings();\n const merged = { ...settings, ..._settings };\n const validated = settingsSchema.parse(merged);\n setSettings(validated);\n}\n\nexport function setSettings(_settings: Settings) {\n fs.writeJSONSync(path.join(state.projectDir, \"proofkit.json\"), _settings, {\n spaces: 2,\n });\n settings = _settings;\n return settings;\n}\n\n/**\n * Validates and sets the envFile in settings only if the file exists.\n * Used during stealth initialization to avoid setting non-existent env files.\n */\nexport function validateAndSetEnvFile(envFileName = \".env\") {\n const settings = getSettings();\n const envFilePath = path.join(state.projectDir, envFileName);\n\n if (fs.existsSync(envFilePath)) {\n const updatedSettings = { ...settings, envFile: envFileName };\n setSettings(updatedSettings);\n return envFileName;\n }\n\n // If no env file exists, ensure envFile is undefined in settings\n if (settings.envFile) {\n const { envFile, ...settingsWithoutEnvFile } = settings;\n setSettings(settingsWithoutEnvFile as Settings);\n }\n\n return undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./state-BVEcvFT3.js";import"./consts-
|
|
2
|
-
//# sourceMappingURL=proofkit-webviewer-
|
|
1
|
+
import{r as e}from"./state-BVEcvFT3.js";import"./consts-CE9CE6Fo.js";import"./logger-DxbfijxS.js";import{a as t}from"./parseSettings-xU5Rw3Ne.js";import{i as n,n as r,r as i}from"./fmdapi-D4f7TrLy.js";import a from"node:path";import o from"dotenv";import s from"chalk";async function c(i=e.projectDir){let s=t(i),c=await n({addonName:`wv`}),l=s.dataSources.filter(e=>e.type===`fm`).find(e=>e.name===`filemaker`);if(!l)return{inspection:c};s.envFile&&o.config({path:a.join(i,s.envFile)});let u=process.env[l.envNames.apiKey],d=process.env[l.envNames.database],f=process.env[l.envNames.server];if(!(u&&d&&f))return{inspection:c};let p=await r({dataApiKey:u,fmFile:d,server:f});return{hasRequiredLayouts:[`ProofKitWV`].every(e=>p.some(t=>t===e)),inspection:c}}function l({hasRequiredLayouts:e,inspection:t}){let n={info:[],warn:[],nextSteps:[]};if(e&&n.info.push(`Successfully detected all required layouts for ProofKit WebViewer in your FileMaker file.`),t.status===`installed-outdated`){let e=t.installedVersion&&t.bundledVersion?` Local version: ${t.installedVersion}. Bundled version: ${t.bundledVersion}.`:``;n.warn.push(`New ProofKit WebViewer add-on available. Run \`${t.installCommand}\` to update the local add-on files.${e}`),n.nextSteps.push(t.installCommand)}if(t.status===`unknown`&&t.reason===`unsupported-platform`&&n.warn.push(`Could not inspect the local ProofKit WebViewer add-on on this platform.`),e===!1){let e=i(`wv`);n.warn.push(`ProofKit WebViewer layouts were not detected in your FileMaker file. The add-on may not be installed in the file yet.`),t.status===`missing`&&(n.warn.push(`Local ProofKit WebViewer add-on files were not found. Run \`${t.installCommand}\` before installing the add-on into the FileMaker file.`),n.nextSteps.push(t.installCommand)),t.status===`unknown`&&t.reason!==`unsupported-platform`&&(n.warn.push(`Could not determine the local ProofKit WebViewer add-on version. Reinstall it explicitly if you need the latest local files.`),n.nextSteps.push(t.installCommand)),n.info.push(s.bgYellow(` ACTION REQUIRED: `)+` Install or update the ProofKit WebViewer add-on in your FileMaker file. ${s.dim(`(Learn more: ${e.docsUrl})`)}`);for(let t of e.steps)n.info.push(t)}return n}export{c as checkForWebViewerLayouts,l as getWebViewerAddonMessages};
|
|
2
|
+
//# sourceMappingURL=proofkit-webviewer-Baa93FAx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proofkit-webviewer-
|
|
1
|
+
{"version":3,"file":"proofkit-webviewer-Baa93FAx.js","names":[],"sources":["../src/installers/proofkit-webviewer.ts"],"sourcesContent":["import path from \"node:path\";\nimport type { OttoAPIKey } from \"@proofkit/fmdapi\";\nimport chalk from \"chalk\";\nimport dotenv from \"dotenv\";\nimport { getLayouts } from \"~/cli/fmdapi.js\";\nimport { state } from \"~/state.js\";\nimport { readSettings } from \"~/utils/parseSettings.js\";\nimport { type FmAddonInspection, getFmAddonInstallInstructions, inspectFmAddon } from \"./install-fm-addon.js\";\n\nexport interface WebViewerAddonStatus {\n hasRequiredLayouts?: boolean;\n inspection: FmAddonInspection;\n}\n\nexport async function checkForWebViewerLayouts(projectDir = state.projectDir): Promise<WebViewerAddonStatus> {\n const settings = readSettings(projectDir);\n const inspection = await inspectFmAddon({ addonName: \"wv\" });\n\n const dataSource = settings.dataSources\n .filter((s: { type: string }) => s.type === \"fm\")\n .find((s: { name: string; type: string }) => s.name === \"filemaker\") as\n | {\n type: \"fm\";\n name: string;\n envNames: { database: string; server: string; apiKey: string };\n }\n | undefined;\n\n if (!dataSource) {\n return { inspection };\n }\n if (settings.envFile) {\n dotenv.config({\n path: path.join(projectDir, settings.envFile),\n });\n }\n const dataApiKey = process.env[dataSource.envNames.apiKey] as OttoAPIKey | undefined;\n const fmFile = process.env[dataSource.envNames.database];\n const server = process.env[dataSource.envNames.server];\n\n if (!(dataApiKey && fmFile && server)) {\n return { inspection };\n }\n\n const existingLayouts = await getLayouts({\n dataApiKey,\n fmFile,\n server,\n });\n const webviewerLayouts = [\"ProofKitWV\"];\n\n const allWebViewerLayoutsExist = webviewerLayouts.every((layout) =>\n existingLayouts.some((l: string) => l === layout),\n );\n\n return {\n hasRequiredLayouts: allWebViewerLayoutsExist,\n inspection,\n };\n}\n\nexport function getWebViewerAddonMessages({ hasRequiredLayouts, inspection }: WebViewerAddonStatus): {\n info: string[];\n warn: string[];\n nextSteps: string[];\n} {\n const messages = {\n info: [] as string[],\n warn: [] as string[],\n nextSteps: [] as string[],\n };\n\n if (hasRequiredLayouts) {\n messages.info.push(\"Successfully detected all required layouts for ProofKit WebViewer in your FileMaker file.\");\n }\n\n if (inspection.status === \"installed-outdated\") {\n const versionSuffix =\n inspection.installedVersion && inspection.bundledVersion\n ? ` Local version: ${inspection.installedVersion}. Bundled version: ${inspection.bundledVersion}.`\n : \"\";\n messages.warn.push(\n `New ProofKit WebViewer add-on available. Run \\`${inspection.installCommand}\\` to update the local add-on files.${versionSuffix}`,\n );\n messages.nextSteps.push(inspection.installCommand);\n }\n\n if (inspection.status === \"unknown\" && inspection.reason === \"unsupported-platform\") {\n messages.warn.push(\"Could not inspect the local ProofKit WebViewer add-on on this platform.\");\n }\n\n if (hasRequiredLayouts === false) {\n const instructions = getFmAddonInstallInstructions(\"wv\");\n messages.warn.push(\n \"ProofKit WebViewer layouts were not detected in your FileMaker file. The add-on may not be installed in the file yet.\",\n );\n if (inspection.status === \"missing\") {\n messages.warn.push(\n `Local ProofKit WebViewer add-on files were not found. Run \\`${inspection.installCommand}\\` before installing the add-on into the FileMaker file.`,\n );\n messages.nextSteps.push(inspection.installCommand);\n }\n if (inspection.status === \"unknown\" && inspection.reason !== \"unsupported-platform\") {\n messages.warn.push(\n \"Could not determine the local ProofKit WebViewer add-on version. Reinstall it explicitly if you need the latest local files.\",\n );\n messages.nextSteps.push(inspection.installCommand);\n }\n messages.info.push(\n chalk.bgYellow(\" ACTION REQUIRED: \") +\n ` Install or update the ProofKit WebViewer add-on in your FileMaker file. ${chalk.dim(`(Learn more: ${instructions.docsUrl})`)}`,\n );\n for (const step of instructions.steps) {\n messages.info.push(step);\n }\n }\n\n return messages;\n}\n\nexport async function ensureWebViewerAddonInstalled() {\n const status = await checkForWebViewerLayouts();\n const messages = getWebViewerAddonMessages(status);\n\n for (const message of messages.warn) {\n console.log(chalk.yellow(message));\n }\n for (const message of messages.info) {\n console.log(message);\n }\n\n return status;\n}\n"],"mappings":"6QAcA,eAAsB,EAAyB,EAAa,EAAM,WAA2C,CAC3G,IAAM,EAAW,EAAa,EAAW,CACnC,EAAa,MAAM,EAAe,CAAE,UAAW,KAAM,CAAC,CAEtD,EAAa,EAAS,YACzB,OAAQ,GAAwB,EAAE,OAAS,KAAK,CAChD,KAAM,GAAsC,EAAE,OAAS,YAAY,CAQtE,GAAI,CAAC,EACH,MAAO,CAAE,aAAY,CAEnB,EAAS,SACX,EAAO,OAAO,CACZ,KAAM,EAAK,KAAK,EAAY,EAAS,QAAQ,CAC9C,CAAC,CAEJ,IAAM,EAAa,QAAQ,IAAI,EAAW,SAAS,QAC7C,EAAS,QAAQ,IAAI,EAAW,SAAS,UACzC,EAAS,QAAQ,IAAI,EAAW,SAAS,QAE/C,GAAI,EAAE,GAAc,GAAU,GAC5B,MAAO,CAAE,aAAY,CAGvB,IAAM,EAAkB,MAAM,EAAW,CACvC,aACA,SACA,SACD,CAAC,CAOF,MAAO,CACL,mBAPuB,CAAC,aAAa,CAEW,MAAO,GACvD,EAAgB,KAAM,GAAc,IAAM,EAAO,CAClD,CAIC,aACD,CAGH,SAAgB,EAA0B,CAAE,qBAAoB,cAI9D,CACA,IAAM,EAAW,CACf,KAAM,EAAE,CACR,KAAM,EAAE,CACR,UAAW,EAAE,CACd,CAMD,GAJI,GACF,EAAS,KAAK,KAAK,4FAA4F,CAG7G,EAAW,SAAW,qBAAsB,CAC9C,IAAM,EACJ,EAAW,kBAAoB,EAAW,eACtC,mBAAmB,EAAW,iBAAiB,qBAAqB,EAAW,eAAe,GAC9F,GACN,EAAS,KAAK,KACZ,kDAAkD,EAAW,eAAe,sCAAsC,IACnH,CACD,EAAS,UAAU,KAAK,EAAW,eAAe,CAOpD,GAJI,EAAW,SAAW,WAAa,EAAW,SAAW,wBAC3D,EAAS,KAAK,KAAK,0EAA0E,CAG3F,IAAuB,GAAO,CAChC,IAAM,EAAe,EAA8B,KAAK,CACxD,EAAS,KAAK,KACZ,wHACD,CACG,EAAW,SAAW,YACxB,EAAS,KAAK,KACZ,+DAA+D,EAAW,eAAe,0DAC1F,CACD,EAAS,UAAU,KAAK,EAAW,eAAe,EAEhD,EAAW,SAAW,WAAa,EAAW,SAAW,yBAC3D,EAAS,KAAK,KACZ,+HACD,CACD,EAAS,UAAU,KAAK,EAAW,eAAe,EAEpD,EAAS,KAAK,KACZ,EAAM,SAAS,qBAAqB,CAClC,4EAA4E,EAAM,IAAI,gBAAgB,EAAa,QAAQ,GAAG,GACjI,CACD,IAAK,IAAM,KAAQ,EAAa,MAC9B,EAAS,KAAK,KAAK,EAAK,CAI5B,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{m as e,n as t,p as n,r,t as i}from"./state-BVEcvFT3.js";import"./consts-CE9CE6Fo.js";import{s as a}from"./errors-DxuuVXoQ.js";import{a as o,c as s,d as c,f as l,i as u,n as d,r as f,s as p,t as m}from"./utils-DGwyHkvO.js";import{n as h,t as g}from"./globalOptions-C6fknjPB.js";import"./logger-DxbfijxS.js";import{n as _,o as v}from"./parseSettings-xU5Rw3Ne.js";import{c as y,f as b,l as x,o as S,p as C,u as w}from"./fmdapi-H4o2qGE2.js";import T from"node:path";import E from"dotenv";import D from"fs-extra";import{Command as O}from"commander";import{Node as k,SyntaxKind as A}from"ts-morph";function j(e){if(e.type!==`fm`)return e.type;let t=T.join(r.projectDir,`.env`);D.existsSync(t)&&E.config({path:t});let n=process.env[e.envNames.server]||`unknown server`,i=process.env[e.envNames.database]||`unknown database`;try{return`${new URL(n).hostname}/${i}`}catch(e){return r.debug&&console.error(`Error parsing server URL:`,e),`${n}/${i}`}}const M=async e=>{let n=_();if(n.dataSources.length===0){p(`No data sources found in your project.`);return}let i=e;if(i){if(!n.dataSources.some(e=>e.name===i))throw Error(`Data source "${i}" not found in your project.`)}else i=m(await c({message:`Which data source do you want to remove?`,options:n.dataSources.map(e=>{let t=``;try{t=j(e)}catch(e){r.debug&&console.error(`Error getting data source info:`,e),t=`unknown connection`}return{label:`${e.name} (${t})`,value:e.name}})}));let o=!0;if(!t()&&(o=m(await u({message:`Are you sure you want to remove the data source "${i}"? This will only remove it from your configuration, not replace any possible usage, which may cause TypeScript errors.`})),!o))throw new a({message:`User aborted the operation`});let s=n.dataSources.find(e=>e.name===i);if(n.dataSources=n.dataSources.filter(e=>e.name!==i),v(n),s?.type===`fm`){y({dataSourceName:i}),r.debug&&p(`Removed schemas from fmschema.config.mjs`);let e=T.join(r.projectDir,`src`,`config`,`schemas`,i);D.existsSync(e)&&(D.removeSync(e),r.debug&&p(`Removed schema folder at ${e}`)),await w(),r.debug&&p(`Successfully regenerated types`)}p(`Successfully removed data source "${i}"`)},N=()=>{let t=new O(`data`).description(`Remove a data source from your project`).option(`--name <name>`,`Name of the data source to remove`).addOption(h).addOption(g).action(async t=>{await M(n({name:e().optional()}).parse(t).name)});return t.hook(`preAction`,(e,t)=>{i(t.opts()),r.baseCommand=`remove`,d({commandName:`remove`})}),t},P=e=>{let t=T.join(r.projectDir,`src/app/navigation.tsx`);if(!D.existsSync(t))return[];let n=e.addSourceFileAtPath(t),i=[],a=n.getVariableDeclaration(`primaryRoutes`)?.getInitializerIfKind(A.ArrayLiteralExpression)?.getElements();if(a){for(let e of a)if(k.isObjectLiteralExpression(e)){let t=e.getProperties().find(e=>k.isPropertyAssignment(e)&&e.getName()===`label`),n=e.getProperties().find(e=>k.isPropertyAssignment(e)&&e.getName()===`href`),r=t?.getInitializer()?.getText().replace(/['"]/g,``),a=n?.getInitializer()?.getText().replace(/['"]/g,``);r&&a&&i.push({label:r,href:a})}}let o=n.getVariableDeclaration(`secondaryRoutes`)?.getInitializerIfKind(A.ArrayLiteralExpression)?.getElements();if(o){for(let e of o)if(k.isObjectLiteralExpression(e)){let t=e.getProperties().find(e=>k.isPropertyAssignment(e)&&e.getName()===`label`),n=e.getProperties().find(e=>k.isPropertyAssignment(e)&&e.getName()===`href`),r=t?.getInitializer()?.getText().replace(/['"]/g,``),a=n?.getInitializer()?.getText().replace(/['"]/g,``);r&&a&&i.push({label:r,href:a})}}return i},F=async(e,t)=>{let n=T.join(r.projectDir,`src/app/navigation.tsx`);if(!D.existsSync(n))return;let i=e.addSourceFileAtPath(n),a=i.getVariableDeclaration(`primaryRoutes`)?.getInitializerIfKind(A.ArrayLiteralExpression);if(a){let e=a.getElements();for(let n=e.length-1;n>=0;n--){let r=e[n];k.isObjectLiteralExpression(r)&&r.getProperties().find(e=>k.isPropertyAssignment(e)&&e.getName()===`href`)?.getInitializer()?.getText().replace(/['"]/g,``)===t&&a.removeElement(n)}}let o=i.getVariableDeclaration(`secondaryRoutes`)?.getInitializerIfKind(A.ArrayLiteralExpression);if(o){let e=o.getElements();for(let n=e.length-1;n>=0;n--){let r=e[n];k.isObjectLiteralExpression(r)&&r.getProperties().find(e=>k.isPropertyAssignment(e)&&e.getName()===`href`)?.getInitializer()?.getText().replace(/['"]/g,``)===t&&o.removeElement(n)}}await C(e)},I=async e=>{_();let t=r.projectDir,n=b(t),i=P(n);if(i.length===0)return f(`No pages found in the navigation.`);let a=e;if(!a){if(r.nonInteractive)throw Error(`Route is required in non-interactive mode.`);a=m(await c({message:`Select the page to remove`,options:i.map(e=>({label:`${e.label} (${e.href})`,value:e.href}))}))}a.startsWith(`/`)||(a=`/${a}`);let o=r.appType===`browser`?T.join(t,`src/app/(main)`,a):T.join(t,`src/routes`,a),s=l();s.start(`Removing page`);try{if(!D.existsSync(o))return s.stop(`Page not found!`),f(`Page at ${a} does not exist`);await F(n,a),await D.remove(o),s.stop(`Page removed successfully!`)}catch(e){s.stop(`Failed to remove page!`),console.error(`Error removing page:`,e),process.exit(1)}},L=()=>{let e=new O(`page`).description(`Remove a page from your project`).argument(`[route]`,`The route of the page to remove`).addOption(h).addOption(g).action(async e=>{await I(e)});return e.hook(`preAction`,(e,t)=>{i(t.opts()),r.baseCommand=`remove`,d({commandName:`remove`})}),e},R=async t=>{let n=t?.settings??_(),i=t?.projectDir??r.projectDir,a=t?.sourceName;if(!a&&n.dataSources.filter(e=>e.type===`fm`).length>1){let t=await c({message:`Which FileMaker data source do you want to remove a layout from?`,options:n.dataSources.filter(e=>e.type===`fm`).map(e=>({label:e.name,value:e.name}))});o(t)&&(f(),process.exit(0)),a=e().parse(t)}if(a||=`filemaker`,!n.dataSources.filter(e=>e.type===`fm`).find(e=>e.name===a))throw Error(`FileMaker data source ${a} not found in your ProofKit config`);let l=S({projectDir:i,dataSourceName:a});if(l.length===0){p(`No layouts found in data source "${a}"`,`Nothing to remove`);return}let d=t?.schemaName??m(await c({message:`Select a layout to remove`,options:l.map(e=>({label:`${e.layout} (${e.schemaName})`,value:e.schemaName??``})).filter(e=>e.value!==``)})),h=await u({message:`Are you sure you want to remove the layout "${d}"?`,initialValue:!1});(o(h)||!h)&&(f(`Operation cancelled`),process.exit(0)),await x({projectDir:i,dataSourceName:a,schemaName:d,runCodegen:!0}),s(`Layout "${d}" has been removed from your project`)},z=()=>new O(`layout`).alias(`schema`).description(`Remove a layout from your fmschema file`).action(async e=>{let t=e.settings;await R({settings:t})}),B=async e=>{let t=m(await c({message:`What do you want to remove from your project?`,options:[{label:`Page`,value:`page`},{label:`Schema`,value:`schema`,hint:`remove a table or layout schema`},..._().appType===`browser`?[{label:`Data Source`,value:`data`,hint:`remove a database or FileMaker connection`}]:[]]}));t===`data`?await M():t===`page`?await I():t===`schema`&&await R()};function V(){let e=new O(`remove`).description(`Remove a component from your project`).argument(`[name]`,`Type of component to remove`).addOption(g).action(B);return e.hook(`preAction`,(e,t)=>{i(t.opts()),r.baseCommand=`remove`,d({commandName:`remove`})}),e.hook(`preSubcommand`,(e,t)=>{i(t.opts()),r.baseCommand=`remove`,d({commandName:`remove`})}),e.addCommand(N()),e.addCommand(L()),e.addCommand(z()),e}export{V as makeRemoveCommand,B as runRemove};
|
|
2
|
+
//# sourceMappingURL=remove-COo1Ju8v.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-COo1Ju8v.js","names":["p.select","p.confirm","z.object","z.string","p.cancel","p.select","spinner","p.spinner","p.select","p.isCancel","z.string","p.confirm","p.select"],"sources":["../src/cli/remove/data-source.ts","../src/cli/remove/page.ts","../src/cli/remove/schema.ts","../src/cli/remove/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport { Command } from \"commander\";\nimport dotenv from \"dotenv\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod/v4\";\nimport * as p from \"~/cli/prompts.js\";\nimport { UserCancelledError } from \"~/core/errors.js\";\nimport { removeFromFmschemaConfig, runCodegenCommand } from \"~/generators/fmdapi.js\";\nimport { debugOption, nonInteractiveOption } from \"~/globalOptions.js\";\nimport { initProgramState, isNonInteractiveMode, state } from \"~/state.js\";\nimport { type DataSource, getSettings, setSettings } from \"~/utils/parseSettings.js\";\nimport { abortIfCancel, ensureProofKitProject } from \"../utils.js\";\n\nfunction getDataSourceInfo(source: DataSource) {\n if (source.type !== \"fm\") {\n return source.type;\n }\n\n const envFile = path.join(state.projectDir, \".env\");\n if (fs.existsSync(envFile)) {\n dotenv.config({ path: envFile });\n }\n\n const server = process.env[source.envNames.server] || \"unknown server\";\n const database = process.env[source.envNames.database] || \"unknown database\";\n\n try {\n // Format the server URL to be more readable\n const serverUrl = new URL(server);\n const formattedServer = serverUrl.hostname;\n return `${formattedServer}/${database}`;\n } catch (error) {\n if (state.debug) {\n console.error(\"Error parsing server URL:\", error);\n }\n return `${server}/${database}`;\n }\n}\n\nexport const runRemoveDataSourceCommand = async (name?: string) => {\n const settings = getSettings();\n\n if (settings.dataSources.length === 0) {\n p.note(\"No data sources found in your project.\");\n return;\n }\n\n let dataSourceName = name;\n\n // If no name provided, prompt for selection\n if (dataSourceName) {\n // Validate that the provided name exists\n const dataSourceExists = settings.dataSources.some((source) => source.name === dataSourceName);\n if (!dataSourceExists) {\n throw new Error(`Data source \"${dataSourceName}\" not found in your project.`);\n }\n } else {\n dataSourceName = abortIfCancel(\n await p.select({\n message: \"Which data source do you want to remove?\",\n options: settings.dataSources.map((source) => {\n let info = \"\";\n try {\n info = getDataSourceInfo(source);\n } catch (error) {\n if (state.debug) {\n console.error(\"Error getting data source info:\", error);\n }\n info = \"unknown connection\";\n }\n return {\n label: `${source.name} (${info})`,\n value: source.name,\n };\n }),\n }),\n );\n }\n\n let confirmed = true;\n if (!isNonInteractiveMode()) {\n confirmed = abortIfCancel(\n await p.confirm({\n message: `Are you sure you want to remove the data source \"${dataSourceName}\"? This will only remove it from your configuration, not replace any possible usage, which may cause TypeScript errors.`,\n }),\n );\n\n if (!confirmed) {\n throw new UserCancelledError({ message: \"User aborted the operation\" });\n }\n }\n\n // Get the data source before removing it\n const dataSource = settings.dataSources.find((source) => source.name === dataSourceName);\n\n // Remove the data source from settings\n settings.dataSources = settings.dataSources.filter((source) => source.name !== dataSourceName);\n\n // Save the updated settings\n setSettings(settings);\n\n if (dataSource?.type === \"fm\") {\n // For FileMaker data sources, remove from fmschema.config.mjs\n removeFromFmschemaConfig({\n dataSourceName,\n });\n\n if (state.debug) {\n p.note(\"Removed schemas from fmschema.config.mjs\");\n }\n\n // Remove the schema folder for this data source\n const schemaFolderPath = path.join(state.projectDir, \"src\", \"config\", \"schemas\", dataSourceName);\n if (fs.existsSync(schemaFolderPath)) {\n fs.removeSync(schemaFolderPath);\n if (state.debug) {\n p.note(`Removed schema folder at ${schemaFolderPath}`);\n }\n }\n\n // Run typegen to regenerate types\n await runCodegenCommand();\n if (state.debug) {\n p.note(\"Successfully regenerated types\");\n }\n }\n\n p.note(`Successfully removed data source \"${dataSourceName}\"`);\n};\n\nexport const makeRemoveDataSourceCommand = () => {\n const removeDataSourceCommand = new Command(\"data\")\n .description(\"Remove a data source from your project\")\n .option(\"--name <name>\", \"Name of the data source to remove\")\n .addOption(nonInteractiveOption)\n .addOption(debugOption)\n .action(async (options) => {\n const schema = z.object({\n name: z.string().optional(),\n });\n const validated = schema.parse(options);\n await runRemoveDataSourceCommand(validated.name);\n });\n\n removeDataSourceCommand.hook(\"preAction\", (_thisCommand, actionCommand) => {\n initProgramState(actionCommand.opts());\n state.baseCommand = \"remove\";\n ensureProofKitProject({ commandName: \"remove\" });\n });\n\n return removeDataSourceCommand;\n};\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport fs from \"fs-extra\";\nimport { Node, type Project, type PropertyAssignment, SyntaxKind } from \"ts-morph\";\nimport * as p from \"~/cli/prompts.js\";\n\nimport { debugOption, nonInteractiveOption } from \"~/globalOptions.js\";\nimport { initProgramState, state } from \"~/state.js\";\nimport { getSettings } from \"~/utils/parseSettings.js\";\nimport { formatAndSaveSourceFiles, getNewProject } from \"~/utils/ts-morph.js\";\nimport { abortIfCancel, ensureProofKitProject } from \"../utils.js\";\n\nconst getExistingRoutes = (project: Project): { label: string; href: string }[] => {\n const navFilePath = path.join(state.projectDir, \"src/app/navigation.tsx\");\n\n // If navigation file doesn't exist (e.g., webviewer apps), there are no nav routes to remove\n if (!fs.existsSync(navFilePath)) {\n return [];\n }\n\n const sourceFile = project.addSourceFileAtPath(navFilePath);\n\n const routes: { label: string; href: string }[] = [];\n\n // Get primary routes\n const primaryRoutes = sourceFile\n .getVariableDeclaration(\"primaryRoutes\")\n ?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression)\n ?.getElements();\n\n if (primaryRoutes) {\n for (const element of primaryRoutes) {\n if (Node.isObjectLiteralExpression(element)) {\n const labelProp = element\n .getProperties()\n .find((prop): prop is PropertyAssignment => Node.isPropertyAssignment(prop) && prop.getName() === \"label\");\n const hrefProp = element\n .getProperties()\n .find((prop): prop is PropertyAssignment => Node.isPropertyAssignment(prop) && prop.getName() === \"href\");\n\n const label = labelProp?.getInitializer()?.getText().replace(/['\"]/g, \"\");\n const href = hrefProp?.getInitializer()?.getText().replace(/['\"]/g, \"\");\n\n if (label && href) {\n routes.push({ label, href });\n }\n }\n }\n }\n\n // Get secondary routes\n const secondaryRoutes = sourceFile\n .getVariableDeclaration(\"secondaryRoutes\")\n ?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression)\n ?.getElements();\n\n if (secondaryRoutes) {\n for (const element of secondaryRoutes) {\n if (Node.isObjectLiteralExpression(element)) {\n const labelProp = element\n .getProperties()\n .find((prop): prop is PropertyAssignment => Node.isPropertyAssignment(prop) && prop.getName() === \"label\");\n const hrefProp = element\n .getProperties()\n .find((prop): prop is PropertyAssignment => Node.isPropertyAssignment(prop) && prop.getName() === \"href\");\n\n const label = labelProp?.getInitializer()?.getText().replace(/['\"]/g, \"\");\n const href = hrefProp?.getInitializer()?.getText().replace(/['\"]/g, \"\");\n\n if (label && href) {\n routes.push({ label, href });\n }\n }\n }\n }\n\n return routes;\n};\n\nconst removeRouteFromNav = async (project: Project, routeToRemove: string) => {\n const navFilePath = path.join(state.projectDir, \"src/app/navigation.tsx\");\n\n // Skip if there is no navigation file\n if (!fs.existsSync(navFilePath)) {\n return;\n }\n\n const sourceFile = project.addSourceFileAtPath(navFilePath);\n\n // Remove from primary routes\n const primaryRoutes = sourceFile\n .getVariableDeclaration(\"primaryRoutes\")\n ?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression);\n\n if (primaryRoutes) {\n const elements = primaryRoutes.getElements();\n for (let i = elements.length - 1; i >= 0; i--) {\n const element = elements[i];\n if (Node.isObjectLiteralExpression(element)) {\n const hrefProp = element\n .getProperties()\n .find((prop): prop is PropertyAssignment => Node.isPropertyAssignment(prop) && prop.getName() === \"href\");\n\n const href = hrefProp?.getInitializer()?.getText().replace(/['\"]/g, \"\");\n\n if (href === routeToRemove) {\n primaryRoutes.removeElement(i);\n }\n }\n }\n }\n\n // Remove from secondary routes\n const secondaryRoutes = sourceFile\n .getVariableDeclaration(\"secondaryRoutes\")\n ?.getInitializerIfKind(SyntaxKind.ArrayLiteralExpression);\n\n if (secondaryRoutes) {\n const elements = secondaryRoutes.getElements();\n for (let i = elements.length - 1; i >= 0; i--) {\n const element = elements[i];\n if (Node.isObjectLiteralExpression(element)) {\n const hrefProp = element\n .getProperties()\n .find((prop): prop is PropertyAssignment => Node.isPropertyAssignment(prop) && prop.getName() === \"href\");\n\n const href = hrefProp?.getInitializer()?.getText().replace(/['\"]/g, \"\");\n\n if (href === routeToRemove) {\n secondaryRoutes.removeElement(i);\n }\n }\n }\n }\n\n await formatAndSaveSourceFiles(project);\n};\n\nexport const runRemovePageAction = async (routeName?: string) => {\n const _settings = getSettings();\n const projectDir = state.projectDir;\n const project = getNewProject(projectDir);\n\n // Get existing routes\n const routes = getExistingRoutes(project);\n\n if (routes.length === 0) {\n return p.cancel(\"No pages found in the navigation.\");\n }\n\n let selectedRouteName = routeName;\n if (!selectedRouteName) {\n if (state.nonInteractive) {\n throw new Error(\"Route is required in non-interactive mode.\");\n }\n\n selectedRouteName = abortIfCancel(\n await p.select({\n message: \"Select the page to remove\",\n options: routes.map((route) => ({\n label: `${route.label} (${route.href})`,\n value: route.href,\n })),\n }),\n );\n }\n\n if (!selectedRouteName.startsWith(\"/\")) {\n selectedRouteName = `/${selectedRouteName}`;\n }\n\n const pagePath =\n state.appType === \"browser\"\n ? path.join(projectDir, \"src/app/(main)\", selectedRouteName)\n : path.join(projectDir, \"src/routes\", selectedRouteName);\n\n const spinner = p.spinner();\n spinner.start(\"Removing page\");\n\n try {\n // Check if directory exists\n if (!fs.existsSync(pagePath)) {\n spinner.stop(\"Page not found!\");\n return p.cancel(`Page at ${selectedRouteName} does not exist`);\n }\n\n // Remove from navigation first (if present)\n await removeRouteFromNav(project, selectedRouteName);\n\n // Remove the page directory\n await fs.remove(pagePath);\n\n spinner.stop(\"Page removed successfully!\");\n } catch (error) {\n spinner.stop(\"Failed to remove page!\");\n console.error(\"Error removing page:\", error);\n process.exit(1);\n }\n};\n\nexport const makeRemovePageCommand = () => {\n const removePageCommand = new Command(\"page\")\n .description(\"Remove a page from your project\")\n .argument(\"[route]\", \"The route of the page to remove\")\n .addOption(nonInteractiveOption)\n .addOption(debugOption)\n .action(async (route: string) => {\n await runRemovePageAction(route);\n });\n\n removePageCommand.hook(\"preAction\", (_thisCommand, actionCommand) => {\n initProgramState(actionCommand.opts());\n state.baseCommand = \"remove\";\n ensureProofKitProject({ commandName: \"remove\" });\n });\n\n return removePageCommand;\n};\n","import { Command } from \"commander\";\nimport { z } from \"zod/v4\";\nimport * as p from \"~/cli/prompts.js\";\n\nimport { getExistingSchemas, removeLayout } from \"~/generators/fmdapi.js\";\nimport { state } from \"~/state.js\";\nimport { getSettings, type Settings } from \"~/utils/parseSettings.js\";\nimport { abortIfCancel } from \"../utils.js\";\n\nexport const runRemoveSchemaAction = async (opts?: {\n projectDir?: string;\n settings?: Settings;\n sourceName?: string;\n schemaName?: string;\n}) => {\n const settings = opts?.settings ?? getSettings();\n const projectDir = opts?.projectDir ?? state.projectDir;\n let sourceName = opts?.sourceName;\n\n // If there is more than one fm data source, prompt for which one to remove from\n if (!sourceName && settings.dataSources.filter((s) => s.type === \"fm\").length > 1) {\n const dataSourceName = await p.select({\n message: \"Which FileMaker data source do you want to remove a layout from?\",\n options: settings.dataSources.filter((s) => s.type === \"fm\").map((s) => ({ label: s.name, value: s.name })),\n });\n if (p.isCancel(dataSourceName)) {\n p.cancel();\n process.exit(0);\n }\n sourceName = z.string().parse(dataSourceName);\n }\n\n if (!sourceName) {\n sourceName = \"filemaker\";\n }\n\n const dataSource = settings.dataSources.filter((s) => s.type === \"fm\").find((s) => s.name === sourceName);\n if (!dataSource) {\n throw new Error(`FileMaker data source ${sourceName} not found in your ProofKit config`);\n }\n\n // Get existing schemas for this data source\n const existingSchemas = getExistingSchemas({\n projectDir,\n dataSourceName: sourceName,\n });\n\n if (existingSchemas.length === 0) {\n p.note(`No layouts found in data source \"${sourceName}\"`, \"Nothing to remove\");\n return;\n }\n\n // Show existing schemas and let user pick one to remove\n const schemaToRemove =\n opts?.schemaName ??\n abortIfCancel(\n await p.select({\n message: \"Select a layout to remove\",\n options: existingSchemas\n .map((schema) => ({\n label: `${schema.layout} (${schema.schemaName})`,\n value: schema.schemaName ?? \"\",\n }))\n .filter((opt) => opt.value !== \"\"),\n }),\n );\n\n // Confirm removal\n const confirmRemoval = await p.confirm({\n message: `Are you sure you want to remove the layout \"${schemaToRemove}\"?`,\n initialValue: false,\n });\n\n if (p.isCancel(confirmRemoval) || !confirmRemoval) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n // Remove the schema\n await removeLayout({\n projectDir,\n dataSourceName: sourceName,\n schemaName: schemaToRemove,\n runCodegen: true,\n });\n\n p.outro(`Layout \"${schemaToRemove}\" has been removed from your project`);\n};\n\nexport const makeRemoveSchemaCommand = () => {\n const removeSchemaCommand = new Command(\"layout\")\n .alias(\"schema\")\n .description(\"Remove a layout from your fmschema file\")\n .action(async (opts: { settings: Settings }) => {\n const settings = opts.settings;\n await runRemoveSchemaAction({ settings });\n });\n\n return removeSchemaCommand;\n};\n","import { Command } from \"commander\";\nimport * as p from \"~/cli/prompts.js\";\n\nimport { debugOption } from \"~/globalOptions.js\";\nimport { initProgramState, state } from \"~/state.js\";\nimport { getSettings } from \"~/utils/parseSettings.js\";\nimport { abortIfCancel, ensureProofKitProject } from \"../utils.js\";\nimport { makeRemoveDataSourceCommand, runRemoveDataSourceCommand } from \"./data-source.js\";\nimport { makeRemovePageCommand, runRemovePageAction } from \"./page.js\";\nimport { makeRemoveSchemaCommand, runRemoveSchemaAction } from \"./schema.js\";\n\nexport const runRemove = async (_name: string | undefined) => {\n const settings = getSettings();\n\n const removeType = abortIfCancel(\n await p.select({\n message: \"What do you want to remove from your project?\",\n options: [\n { label: \"Page\", value: \"page\" },\n {\n label: \"Schema\",\n value: \"schema\",\n hint: \"remove a table or layout schema\",\n },\n ...(settings.appType === \"browser\"\n ? [\n {\n label: \"Data Source\",\n value: \"data\",\n hint: \"remove a database or FileMaker connection\",\n },\n ]\n : []),\n ],\n }),\n );\n\n if (removeType === \"data\") {\n await runRemoveDataSourceCommand();\n } else if (removeType === \"page\") {\n await runRemovePageAction();\n } else if (removeType === \"schema\") {\n await runRemoveSchemaAction();\n }\n};\n\nexport function makeRemoveCommand() {\n const removeCommand = new Command(\"remove\")\n .description(\"Remove a component from your project\")\n .argument(\"[name]\", \"Type of component to remove\")\n .addOption(debugOption)\n .action(runRemove);\n\n removeCommand.hook(\"preAction\", (_thisCommand, _actionCommand) => {\n initProgramState(_actionCommand.opts());\n state.baseCommand = \"remove\";\n ensureProofKitProject({ commandName: \"remove\" });\n });\n removeCommand.hook(\"preSubcommand\", (_thisCommand, _subCommand) => {\n initProgramState(_subCommand.opts());\n state.baseCommand = \"remove\";\n ensureProofKitProject({ commandName: \"remove\" });\n });\n\n // Add subcommands\n removeCommand.addCommand(makeRemoveDataSourceCommand());\n removeCommand.addCommand(makeRemovePageCommand());\n removeCommand.addCommand(makeRemoveSchemaCommand());\n\n return removeCommand;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./state-BVEcvFT3.js";import"./consts-CE9CE6Fo.js";import"./errors-DxuuVXoQ.js";import{n as e}from"./utils-DGwyHkvO.js";import"./logger-DxbfijxS.js";import"./parseSettings-xU5Rw3Ne.js";import{u as t}from"./fmdapi-H4o2qGE2.js";import{Command as n}from"commander";async function r(e){await t()}const i=()=>{let t=new n(`typegen`).description(`Generate types for your project`).action(r);return t.hook(`preAction`,(t,n)=>{let r=e({commandName:`typegen`});n.setOptionValue(`settings`,r)}),t};export{i as makeTypegenCommand,r as runTypegen};
|
|
2
|
+
//# sourceMappingURL=typegen-DrfVmQfx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typegen-
|
|
1
|
+
{"version":3,"file":"typegen-DrfVmQfx.js","names":[],"sources":["../src/cli/typegen/index.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nimport { runCodegenCommand } from \"~/generators/fmdapi.js\";\nimport type { Settings } from \"~/utils/parseSettings.js\";\nimport { ensureProofKitProject } from \"../utils.js\";\n\nexport async function runTypegen(_opts: { settings: Settings }) {\n await runCodegenCommand();\n}\n\nexport const makeTypegenCommand = () => {\n const typegenCommand = new Command(\"typegen\").description(\"Generate types for your project\").action(runTypegen);\n\n typegenCommand.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const settings = ensureProofKitProject({ commandName: \"typegen\" });\n actionCommand.setOptionValue(\"settings\", settings);\n });\n\n return typegenCommand;\n};\n"],"mappings":"4QAMA,eAAsB,EAAW,EAA+B,CAC9D,MAAM,GAAmB,CAG3B,MAAa,MAA2B,CACtC,IAAM,EAAiB,IAAI,EAAQ,UAAU,CAAC,YAAY,kCAAkC,CAAC,OAAO,EAAW,CAO/G,OALA,EAAe,KAAK,aAAc,EAAc,IAAkB,CAChE,IAAM,EAAW,EAAsB,CAAE,YAAa,UAAW,CAAC,CAClE,EAAc,eAAe,WAAY,EAAS,EAClD,CAEK"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{r as e,t}from"./state-BVEcvFT3.js";import{a as n}from"./consts-CE9CE6Fo.js";import"./errors-DxuuVXoQ.js";import{n as r}from"./utils-DGwyHkvO.js";import{t as i}from"./logger-DxbfijxS.js";import{n as a,r as o}from"./parseSettings-xU5Rw3Ne.js";import{t as s}from"./getUserPkgManager-CZwrE7fs.js";import{r as c,t as l}from"./addPackageDependency-BUJ8tT5i.js";import u from"node:path";import d from"chalk";import f from"fs-extra";import{Command as p}from"commander";async function m(){let t=e.projectDir,r=u.join(n,`template/extras`),i=u.join(r,`_cursor/rules`),a=u.join(t,`.cursor/rules`);if(!f.existsSync(i))return;let o=s();await f.ensureDir(a),await f.copy(i,a);let c=u.join(r,`_cursor/conditional-rules`),l={pnpm:`pnpm.mdc`,npm:`npm.mdc`,yarn:`yarn.mdc`}[o];if(l){let e=u.join(c,l),t=u.join(a,`package-manager.mdc`);f.existsSync(e)&&await f.copy(e,t,{overwrite:!0})}}const h=[`@radix-ui/react-slot`,`@tailwindcss/postcss`,`class-variance-authority`,`clsx`,`lucide-react`,`tailwind-merge`,`tailwindcss`,`tw-animate-css`],g=[];async function _(){let t=e.projectDir,r=u.join(n,`template/nextjs`);l({dependencies:h,devMode:!1,projectDir:t}),l({dependencies:g,devMode:!0,projectDir:t}),f.copySync(u.join(r,`components.json`),u.join(t,`components.json`)),f.copySync(u.join(r,`postcss.config.cjs`),u.join(t,`postcss.config.cjs`)),f.copySync(u.join(r,`src/utils/styles.ts`),u.join(t,`src/utils/styles.ts`)),f.copySync(u.join(r,`src/config/theme/globals.css`),u.join(t,`src/config/theme/globals.css`)),await c(),console.log(`
|
|
2
|
+
✅ shadcn/ui + Tailwind v4 upgrade complete!
|
|
3
|
+
`)}const v=[{key:`cursorRules`,title:`Upgrade Cursor Rules`,description:`Upgrade the .cursor rules in your project to the latest version.`,appType:[`browser`],function:m},{key:`shadcn`,title:`Add Shadcn`,description:`Add Shadcn to your project, to support easily adding new components from a variety of component registries.`,appType:[`browser`,`webviewer`],function:_}];function y(){let e=a();if(e.ui===`shadcn`)return[];let t=e.appliedUpgrades;return v.filter(n=>!t.includes(n.key)&&n.appType.includes(e.appType)).map(({key:e,title:t,description:n})=>({key:e,title:t,description:n}))}async function b(){let e=y(),t=a();if(t.ui!==`shadcn`)for(let n of e){let e=v.find(e=>e.key===n.key)?.function;if(e){await e();let r=t.appliedUpgrades;o({appliedUpgrades:[...r,n.key]})}}}const x=async()=>{t({}),e.baseCommand=`upgrade`,r({commandName:`upgrade`}),i.info(`
|
|
4
|
+
Upgrading ProofKit components...
|
|
5
|
+
`);try{await b(),i.info(d.green(`✔ Successfully upgraded components
|
|
6
|
+
`))}catch(e){i.error(`Failed to upgrade components:`,e),process.exit(1)}},S=new p().name(`upgrade`).description(`Upgrade ProofKit components in your project`).action(x);export{x as runUpgrade,S as upgrade};
|
|
7
|
+
//# sourceMappingURL=update-Cpyhj57Y.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-
|
|
1
|
+
{"version":3,"file":"update-Cpyhj57Y.js","names":[],"sources":["../src/upgrades/cursorRules.ts","../src/upgrades/shadcn.ts","../src/upgrades/index.ts","../src/cli/update/index.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { state } from \"~/state.js\";\nimport { getUserPkgManager } from \"~/utils/getUserPkgManager.js\";\n\nexport async function copyCursorRules() {\n const projectDir = state.projectDir;\n const extrasDir = path.join(PKG_ROOT, \"template/extras\");\n const cursorRulesSrcDir = path.join(extrasDir, \"_cursor/rules\");\n const cursorRulesDestDir = path.join(projectDir, \".cursor/rules\");\n\n if (!fs.existsSync(cursorRulesSrcDir)) {\n return;\n }\n\n const pkgManager = getUserPkgManager();\n await fs.ensureDir(cursorRulesDestDir);\n await fs.copy(cursorRulesSrcDir, cursorRulesDestDir);\n\n // Copy package manager specific rules\n const conditionalRulesDir = path.join(extrasDir, \"_cursor/conditional-rules\");\n\n const packageManagerRules = {\n pnpm: \"pnpm.mdc\",\n npm: \"npm.mdc\",\n yarn: \"yarn.mdc\",\n };\n\n const selectedRule = packageManagerRules[pkgManager as keyof typeof packageManagerRules];\n\n if (selectedRule) {\n const ruleSrc = path.join(conditionalRulesDir, selectedRule);\n const ruleDest = path.join(cursorRulesDestDir, \"package-manager.mdc\");\n\n if (fs.existsSync(ruleSrc)) {\n await fs.copy(ruleSrc, ruleDest, { overwrite: true });\n }\n }\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\n\nimport { PKG_ROOT } from \"~/consts.js\";\nimport { installDependencies } from \"~/helpers/installDependencies.js\";\nimport type { AvailableDependencies } from \"~/installers/dependencyVersionMap.js\";\nimport { state } from \"~/state.js\";\nimport { addPackageDependency } from \"~/utils/addPackageDependency.js\";\n\nconst BASE_DEPS = [\n \"@radix-ui/react-slot\",\n \"@tailwindcss/postcss\",\n \"class-variance-authority\",\n \"clsx\",\n \"lucide-react\",\n \"tailwind-merge\",\n \"tailwindcss\",\n \"tw-animate-css\",\n] as AvailableDependencies[];\nconst BASE_DEV_DEPS = [] as AvailableDependencies[];\n\nexport async function addShadcn() {\n const projectDir = state.projectDir;\n\n const TEMPLATE_ROOT = path.join(PKG_ROOT, \"template/nextjs\");\n\n // 1. Add dependencies\n addPackageDependency({\n dependencies: BASE_DEPS,\n devMode: false,\n projectDir,\n });\n addPackageDependency({\n dependencies: BASE_DEV_DEPS,\n devMode: true,\n projectDir,\n });\n\n // 2. Copy config and utility files\n fs.copySync(path.join(TEMPLATE_ROOT, \"components.json\"), path.join(projectDir, \"components.json\"));\n fs.copySync(path.join(TEMPLATE_ROOT, \"postcss.config.cjs\"), path.join(projectDir, \"postcss.config.cjs\"));\n fs.copySync(path.join(TEMPLATE_ROOT, \"src/utils/styles.ts\"), path.join(projectDir, \"src/utils/styles.ts\"));\n fs.copySync(\n path.join(TEMPLATE_ROOT, \"src/config/theme/globals.css\"),\n path.join(projectDir, \"src/config/theme/globals.css\"),\n );\n\n // 3. Install dependencies\n await installDependencies();\n\n // 4. Success message\n console.log(\"\\n✅ shadcn/ui + Tailwind v4 upgrade complete!\\n\");\n}\n","import { type appTypes, getSettings, mergeSettings } from \"~/utils/parseSettings.js\";\nimport { copyCursorRules } from \"./cursorRules.js\";\nimport { addShadcn } from \"./shadcn.js\";\n\ninterface Upgrade {\n key: string;\n title: string;\n description: string;\n appType: (typeof appTypes)[number][];\n function: () => Promise<void>;\n}\n\nconst availableUpgrades: Upgrade[] = [\n {\n key: \"cursorRules\",\n title: \"Upgrade Cursor Rules\",\n description: \"Upgrade the .cursor rules in your project to the latest version.\",\n appType: [\"browser\"],\n function: copyCursorRules,\n },\n {\n key: \"shadcn\",\n title: \"Add Shadcn\",\n description:\n \"Add Shadcn to your project, to support easily adding new components from a variety of component registries.\",\n appType: [\"browser\", \"webviewer\"],\n function: addShadcn,\n },\n];\n\nexport type UpgradeKeys = (typeof availableUpgrades)[number][\"key\"];\n\nexport function checkForAvailableUpgrades() {\n const settings = getSettings();\n if (settings.ui === \"shadcn\") {\n return [];\n }\n\n const appliedUpgrades = settings.appliedUpgrades;\n\n const neededUpgrades = availableUpgrades.filter(\n (upgrade) => !appliedUpgrades.includes(upgrade.key) && upgrade.appType.includes(settings.appType),\n );\n\n return neededUpgrades.map(({ key, title, description }) => ({\n key,\n title,\n description,\n }));\n}\n\nexport async function runAllAvailableUpgrades() {\n const upgrades = checkForAvailableUpgrades();\n const settings = getSettings();\n if (settings.ui === \"shadcn\") {\n return;\n }\n\n for (const upgrade of upgrades) {\n const upgradeFunction = availableUpgrades.find((u) => u.key === upgrade.key)?.function;\n if (upgradeFunction) {\n await upgradeFunction();\n const appliedUpgrades = settings.appliedUpgrades;\n mergeSettings({\n appliedUpgrades: [...appliedUpgrades, upgrade.key],\n });\n }\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n\nimport { initProgramState, state } from \"~/state.js\";\nimport { runAllAvailableUpgrades } from \"~/upgrades/index.js\";\nimport { logger } from \"~/utils/logger.js\";\nimport { ensureProofKitProject } from \"../utils.js\";\n\nexport const runUpgrade = async () => {\n initProgramState({});\n state.baseCommand = \"upgrade\";\n ensureProofKitProject({ commandName: \"upgrade\" });\n\n logger.info(\"\\nUpgrading ProofKit components...\\n\");\n\n try {\n await runAllAvailableUpgrades();\n logger.info(chalk.green(\"✔ Successfully upgraded components\\n\"));\n } catch (error) {\n logger.error(\"Failed to upgrade components:\", error);\n process.exit(1);\n }\n};\n\nexport const upgrade = new Command()\n .name(\"upgrade\")\n .description(\"Upgrade ProofKit components in your project\")\n .action(runUpgrade);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as e,g as t}from"./state-BVEcvFT3.js";import{l as n}from"./consts-CE9CE6Fo.js";import{s as r}from"./errors-DxuuVXoQ.js";import{n as i}from"./parseSettings-xU5Rw3Ne.js";import a from"node:path";import o from"chalk";import s from"fs-extra";import*as c from"@clack/prompts";import{confirm as l,input as u,password as d,search as f,select as p}from"@inquirer/prompts";const m=Symbol.for(`@proofkit/cli/prompt-cancelled`);c.intro;const h=c.outro,g=c.note,_=c.log,v=c.spinner,y=c.cancel;function b(e){if(e)return t=>e(t)??!0}function x(e){return typeof e==`string`?e:e?!0:void 0}function S(e){return e instanceof Error&&e.name===`ExitPromptError`}function C(e){return e().catch(e=>{if(S(e))return m;throw e})}function w(e){return e===m||c.isCancel(e)}function T(e,t){return[e.label,e.hint??``,...e.keywords??[]].join(` `).toLowerCase().includes(t.trim().toLowerCase())}function E(e,t){let n=t?.trim();return n?e.filter(e=>T(e,n)):e}function D(e){return C(()=>u({message:e.message,default:e.defaultValue,validate:b(e.validate)}))}function O(e){return C(()=>d({message:e.message,validate:b(e.validate)}))}function k(e){return C(()=>l({message:e.message,default:e.initialValue}))}function A(e){return C(()=>p({message:e.message,pageSize:e.maxItems??10,default:e.initialValue,choices:e.options.map(e=>({value:e.value,name:e.label,description:e.hint,disabled:x(e.disabled)}))}))}function j(e){return C(()=>f({message:e.message,pageSize:10,source:t=>{let n=E(e.options,t);return n.length===0?[{value:`__no_matches__`,name:e.emptyMessage??`No matches found. Keep typing to refine your search.`,disabled:e.emptyMessage??`No matches found`}]:n.map(e=>({value:e.value,name:e.label,description:e.hint,disabled:x(e.disabled)}))}}))}const M=({commandName:r})=>{s.existsSync(a.join(process.cwd(),`proofkit.json`))||(console.log(o.yellow(`The "${r}" command requires an existing ProofKit project.
|
|
2
|
+
Please run " ${n} init" first, or try this command again when inside a ProofKit project.`)),process.exit(1));try{return i()}catch(n){console.log(o.red(`Error parsing ProofKit settings file:`)),n instanceof t?console.log(e.prettifyError(n)):console.log(n),process.exit(1)}};function N(e){if(w(e))throw y(),new r({message:`User aborted the operation`});return e}export{w as a,h as c,A as d,v as f,k as i,O as l,M as n,_ as o,D as p,y as r,g as s,N as t,j as u};
|
|
3
|
+
//# sourceMappingURL=utils-DGwyHkvO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-
|
|
1
|
+
{"version":3,"file":"utils-DGwyHkvO.js","names":["intro","note","log","spinner","isCancel","inquirerInput","password","inquirerPassword","confirm","inquirerConfirm","select","inquirerSelect","inquirerSearch","z","isCancel"],"sources":["../src/cli/prompts.ts","../src/cli/utils.ts"],"sourcesContent":["import * as clack from \"@clack/prompts\";\nimport {\n checkbox as inquirerCheckbox,\n confirm as inquirerConfirm,\n input as inquirerInput,\n password as inquirerPassword,\n search as inquirerSearch,\n select as inquirerSelect,\n} from \"@inquirer/prompts\";\n\nconst CANCEL_SYMBOL = Symbol.for(\"@proofkit/cli/prompt-cancelled\");\n\nexport const intro = clack.intro;\nexport const outro = clack.outro;\nexport const note = clack.note;\nexport const log = clack.log;\nexport const spinner = clack.spinner;\nexport const cancel = clack.cancel;\n\nexport interface PromptOption<T extends string> {\n value: T;\n label: string;\n hint?: string;\n disabled?: boolean | string;\n}\n\nexport interface SearchPromptOption<T extends string> extends PromptOption<T> {\n keywords?: readonly string[];\n}\n\nfunction normalizeValidate(\n validate: ((value: string) => string | undefined) | undefined,\n): ((value: string) => string | boolean) | undefined {\n if (!validate) {\n return undefined;\n }\n\n return (value: string) => validate(value) ?? true;\n}\n\nfunction normalizeDisabledMessage(value: boolean | string | undefined) {\n if (typeof value === \"string\") {\n return value;\n }\n return value ? true : undefined;\n}\n\nfunction isPromptCancel(error: unknown) {\n return error instanceof Error && error.name === \"ExitPromptError\";\n}\n\nfunction withCancelSentinel<T>(fn: () => Promise<T>): Promise<T | symbol> {\n return fn().catch((error: unknown) => {\n if (isPromptCancel(error)) {\n return CANCEL_SYMBOL;\n }\n throw error;\n });\n}\n\nexport function isCancel(value: unknown): value is symbol {\n return value === CANCEL_SYMBOL || clack.isCancel(value);\n}\n\nfunction matchesSearch(option: SearchPromptOption<string>, query: string) {\n const haystack = [option.label, option.hint ?? \"\", ...(option.keywords ?? [])].join(\" \").toLowerCase();\n return haystack.includes(query.trim().toLowerCase());\n}\n\nexport function filterSearchOptions<T extends string>(\n options: readonly SearchPromptOption<T>[],\n query: string | undefined,\n) {\n const term = query?.trim();\n if (!term) {\n return options;\n }\n\n return options.filter((option) => matchesSearch(option, term));\n}\n\nexport function text(options: {\n message: string;\n defaultValue?: string;\n validate?: (value: string) => string | undefined;\n}) {\n return withCancelSentinel(() =>\n inquirerInput({\n message: options.message,\n default: options.defaultValue,\n validate: normalizeValidate(options.validate),\n }),\n );\n}\n\nexport function password(options: { message: string; validate?: (value: string) => string | undefined }) {\n return withCancelSentinel(() =>\n inquirerPassword({\n message: options.message,\n validate: normalizeValidate(options.validate),\n }),\n );\n}\n\nexport function confirm(options: { message: string; initialValue?: boolean }) {\n return withCancelSentinel(\n () =>\n inquirerConfirm({\n message: options.message,\n default: options.initialValue,\n }) as Promise<boolean>,\n );\n}\n\nexport function select<T extends string>(options: {\n message: string;\n options: PromptOption<T>[];\n maxItems?: number;\n initialValue?: T;\n}) {\n return withCancelSentinel(() =>\n inquirerSelect<T>({\n message: options.message,\n pageSize: options.maxItems ?? 10,\n default: options.initialValue,\n choices: options.options.map((option) => ({\n value: option.value,\n name: option.label,\n description: option.hint,\n disabled: normalizeDisabledMessage(option.disabled),\n })),\n }),\n );\n}\n\nexport function searchSelect<T extends string>(options: {\n message: string;\n emptyMessage?: string;\n options: SearchPromptOption<T>[];\n}) {\n return withCancelSentinel(() =>\n inquirerSearch<T>({\n message: options.message,\n pageSize: 10,\n source: (input) => {\n const filtered = filterSearchOptions(options.options, input);\n if (filtered.length === 0) {\n return [\n {\n value: \"__no_matches__\" as T,\n name: options.emptyMessage ?? \"No matches found. Keep typing to refine your search.\",\n disabled: options.emptyMessage ?? \"No matches found\",\n },\n ];\n }\n\n return filtered.map((option) => ({\n value: option.value,\n name: option.label,\n description: option.hint,\n disabled: normalizeDisabledMessage(option.disabled),\n }));\n },\n }),\n );\n}\n\nexport function multiSearchSelect<T extends string>(options: {\n message: string;\n options: SearchPromptOption<T>[];\n required?: boolean;\n}) {\n return withCancelSentinel(() =>\n inquirerCheckbox<T>({\n message: options.message,\n pageSize: 10,\n required: options.required,\n choices: options.options.map((option) => ({\n value: option.value,\n name: option.label,\n description: option.hint,\n disabled: normalizeDisabledMessage(option.disabled),\n })),\n }),\n );\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport z, { ZodError } from \"zod/v4\";\n\nimport { cancel, isCancel } from \"~/cli/prompts.js\";\nimport { npmName } from \"~/consts.js\";\nimport { UserCancelledError } from \"~/core/errors.js\";\nimport { getSettings } from \"~/utils/parseSettings.js\";\n\n/**\n * Runs before any add command is run. Checks if the user is in a ProofKit project and if the\n * proofkit.json file is valid.\n */\nexport const ensureProofKitProject = ({ commandName }: { commandName: string }) => {\n const settingsExists = fs.existsSync(path.join(process.cwd(), \"proofkit.json\"));\n if (!settingsExists) {\n console.log(\n chalk.yellow(\n `The \"${commandName}\" command requires an existing ProofKit project.\nPlease run \" ${npmName} init\" first, or try this command again when inside a ProofKit project.`,\n ),\n );\n process.exit(1);\n }\n\n try {\n return getSettings();\n } catch (error) {\n console.log(chalk.red(\"Error parsing ProofKit settings file:\"));\n if (error instanceof ZodError) {\n console.log(z.prettifyError(error));\n } else {\n console.log(error);\n }\n\n process.exit(1);\n }\n};\n\nexport function abortIfCancel(value: symbol | string): string;\nexport function abortIfCancel<T extends boolean>(value: symbol | T): T;\nexport function abortIfCancel<T extends string | boolean>(value: T | symbol): T {\n if (isCancel(value)) {\n cancel();\n throw new UserCancelledError({ message: \"User aborted the operation\" });\n }\n return value;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proofkit/cli",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.26",
|
|
4
4
|
"description": "Interactive CLI to scaffold and manage ProofKit projects",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"ts-morph": "^26.0.0",
|
|
72
72
|
"type-fest": "^3.13.1",
|
|
73
73
|
"@proofkit/fmdapi": "5.1.0-beta.3",
|
|
74
|
-
"@proofkit/typegen": "1.1.0-beta.
|
|
74
|
+
"@proofkit/typegen": "1.1.0-beta.20"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@auth/drizzle-adapter": "^1.11.1",
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"lint": "ultracite check .",
|
|
10
10
|
"format": "ultracite fix .",
|
|
11
11
|
"proofkit": "proofkit",
|
|
12
|
-
"typegen": "proofkit
|
|
12
|
+
"typegen": "npx @proofkit/typegen",
|
|
13
|
+
"typegen:ui": "npx @proofkit/typegen ui",
|
|
13
14
|
"deploy": "proofkit deploy"
|
|
14
15
|
},
|
|
15
16
|
"dependencies": {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"proofkit": "proofkit",
|
|
12
12
|
"serve": "vite preview",
|
|
13
13
|
"start": "vite",
|
|
14
|
-
"typegen": "typegen",
|
|
15
|
-
"typegen:ui": "typegen ui",
|
|
14
|
+
"typegen": "npx @proofkit/typegen",
|
|
15
|
+
"typegen:ui": "npx @proofkit/typegen ui",
|
|
16
16
|
"upload": "node ./scripts/upload.js",
|
|
17
17
|
"lint": "ultracite check .",
|
|
18
18
|
"format": "ultracite fix ."
|