@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/add-h15IdCWp.js +57 -0
  3. package/dist/add-h15IdCWp.js.map +1 -0
  4. package/dist/{addPackageDependency-BGZl7xc5.js → addPackageDependency-BUJ8tT5i.js} +2 -2
  5. package/dist/{addPackageDependency-BGZl7xc5.js.map → addPackageDependency-BUJ8tT5i.js.map} +1 -1
  6. package/dist/{consts-BZnOMxpW.js → consts-CE9CE6Fo.js} +4 -4
  7. package/dist/{consts-BZnOMxpW.js.map → consts-CE9CE6Fo.js.map} +1 -1
  8. package/dist/{deploy-D25sPO7K.js → deploy-BJryOaec.js} +3 -3
  9. package/dist/{deploy-D25sPO7K.js.map → deploy-BJryOaec.js.map} +1 -1
  10. package/dist/errors-DxuuVXoQ.js +2 -0
  11. package/dist/errors-DxuuVXoQ.js.map +1 -0
  12. package/dist/{fmdapi-BO4QL0F8.js → fmdapi-D4f7TrLy.js} +2 -2
  13. package/dist/{fmdapi-BO4QL0F8.js.map → fmdapi-D4f7TrLy.js.map} +1 -1
  14. package/dist/{fmdapi-DyRYZWzI.js → fmdapi-H4o2qGE2.js} +3 -3
  15. package/dist/{fmdapi-DyRYZWzI.js.map → fmdapi-H4o2qGE2.js.map} +1 -1
  16. package/dist/{getUserPkgManager-Cph_6l1P.js → getUserPkgManager-CZwrE7fs.js} +1 -1
  17. package/dist/{getUserPkgManager-Cph_6l1P.js.map → getUserPkgManager-CZwrE7fs.js.map} +1 -1
  18. package/dist/{globalOptions-CkqEi9uC.js → globalOptions-C6fknjPB.js} +1 -1
  19. package/dist/{globalOptions-CkqEi9uC.js.map → globalOptions-C6fknjPB.js.map} +1 -1
  20. package/dist/{index-DALPpGd1.d.ts → index-D9Y-xAF1.d.ts} +124 -42
  21. package/dist/index-D9Y-xAF1.d.ts.map +1 -0
  22. package/dist/index.js +10 -7
  23. package/dist/index.js.map +1 -1
  24. package/dist/{logger-DCEXcH26.js → logger-DxbfijxS.js} +1 -1
  25. package/dist/{logger-DCEXcH26.js.map → logger-DxbfijxS.js.map} +1 -1
  26. package/dist/{parseSettings-DJ2m9sgJ.js → parseSettings-xU5Rw3Ne.js} +1 -1
  27. package/dist/{parseSettings-DJ2m9sgJ.js.map → parseSettings-xU5Rw3Ne.js.map} +1 -1
  28. package/dist/{proofkit-webviewer-73IB1OBU.js → proofkit-webviewer-Baa93FAx.js} +2 -2
  29. package/dist/{proofkit-webviewer-73IB1OBU.js.map → proofkit-webviewer-Baa93FAx.js.map} +1 -1
  30. package/dist/remove-COo1Ju8v.js +2 -0
  31. package/dist/remove-COo1Ju8v.js.map +1 -0
  32. package/dist/typegen-DrfVmQfx.js +2 -0
  33. package/dist/{typegen-DyXaif5O.js.map → typegen-DrfVmQfx.js.map} +1 -1
  34. package/dist/update-Cpyhj57Y.js +7 -0
  35. package/dist/{update-FX71y5b3.js.map → update-Cpyhj57Y.js.map} +1 -1
  36. package/dist/utils-DGwyHkvO.js +3 -0
  37. package/dist/{utils-DymV7zmv.js.map → utils-DGwyHkvO.js.map} +1 -1
  38. package/package.json +2 -2
  39. package/template/nextjs-mantine/package.json +2 -1
  40. package/template/nextjs-shadcn/package.json +2 -0
  41. package/template/vite-wv/package.json +2 -2
  42. package/dist/add-DrcID6d6.js +0 -57
  43. package/dist/add-DrcID6d6.js.map +0 -1
  44. package/dist/index-DALPpGd1.d.ts.map +0 -1
  45. package/dist/remove-BOCU6In3.js +0 -2
  46. package/dist/remove-BOCU6In3.js.map +0 -1
  47. package/dist/typegen-DyXaif5O.js +0 -2
  48. package/dist/update-FX71y5b3.js +0 -7
  49. package/dist/utils-DymV7zmv.js +0 -3
@@ -1 +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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"}
1
+ {"version":3,"file":"fmdapi-H4o2qGE2.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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"}
@@ -1,2 +1,2 @@
1
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
2
+ //# sourceMappingURL=getUserPkgManager-CZwrE7fs.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"getUserPkgManager-CZwrE7fs.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"}
@@ -1,2 +1,2 @@
1
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
2
+ //# sourceMappingURL=globalOptions-C6fknjPB.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"globalOptions-C6fknjPB.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"}
@@ -1,5 +1,7 @@
1
1
  import * as _effect_cli_ValidationError0 from "@effect/cli/ValidationError";
2
- import { Context, Effect } from "effect";
2
+ import { Cause, Context, Effect } from "effect";
3
+ import * as effect_Types0 from "effect/Types";
4
+ import * as effect_Cause0 from "effect/Cause";
3
5
  import * as _effect_cli_CliApp0 from "@effect/cli/CliApp";
4
6
 
5
7
  //#region src/utils/packageManager.d.ts
@@ -135,7 +137,70 @@ interface InitPlan {
135
137
  nextSteps: string[];
136
138
  }
137
139
  //#endregion
140
+ //#region src/core/errors.d.ts
141
+ declare const CliValidationError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
142
+ readonly _tag: "CliValidationError";
143
+ } & Readonly<A>;
144
+ declare class CliValidationError extends CliValidationError_base<{
145
+ readonly message: string;
146
+ readonly cause?: unknown;
147
+ }> {}
148
+ declare const UserCancelledError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
149
+ readonly _tag: "UserCancelledError";
150
+ } & Readonly<A>;
151
+ declare class UserCancelledError extends UserCancelledError_base<{
152
+ readonly message: string;
153
+ }> {}
154
+ declare const NonInteractiveInputError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
155
+ readonly _tag: "NonInteractiveInputError";
156
+ } & Readonly<A>;
157
+ declare class NonInteractiveInputError extends NonInteractiveInputError_base<{
158
+ readonly message: string;
159
+ }> {}
160
+ declare const DirectoryConflictError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
161
+ readonly _tag: "DirectoryConflictError";
162
+ } & Readonly<A>;
163
+ declare class DirectoryConflictError extends DirectoryConflictError_base<{
164
+ readonly message: string;
165
+ readonly path: string;
166
+ }> {}
167
+ declare const FileMakerSetupError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
168
+ readonly _tag: "FileMakerSetupError";
169
+ } & Readonly<A>;
170
+ declare class FileMakerSetupError extends FileMakerSetupError_base<{
171
+ readonly message: string;
172
+ readonly cause?: unknown;
173
+ }> {}
174
+ declare const RegistryError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
175
+ readonly _tag: "RegistryError";
176
+ } & Readonly<A>;
177
+ declare class RegistryError extends RegistryError_base<{
178
+ readonly message: string;
179
+ readonly cause?: unknown;
180
+ }> {}
181
+ declare const ExternalCommandError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
182
+ readonly _tag: "ExternalCommandError";
183
+ } & Readonly<A>;
184
+ declare class ExternalCommandError extends ExternalCommandError_base<{
185
+ readonly message: string;
186
+ readonly command: string;
187
+ readonly args: readonly string[];
188
+ readonly cwd: string;
189
+ readonly cause?: unknown;
190
+ }> {}
191
+ declare const FileSystemError_base: new <A extends Record<string, any> = {}>(args: effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => effect_Cause0.YieldableError & {
192
+ readonly _tag: "FileSystemError";
193
+ } & Readonly<A>;
194
+ declare class FileSystemError extends FileSystemError_base<{
195
+ readonly message: string;
196
+ readonly operation: string;
197
+ readonly path: string;
198
+ readonly cause?: unknown;
199
+ }> {}
200
+ type CliError = CliValidationError | UserCancelledError | NonInteractiveInputError | DirectoryConflictError | FileMakerSetupError | RegistryError | ExternalCommandError | FileSystemError;
201
+ //#endregion
138
202
  //#region src/core/context.d.ts
203
+ type Eff<A, E = never, R = never> = Effect.Effect<A, E, R>;
139
204
  interface CliContextValue {
140
205
  cwd: string;
141
206
  debug: boolean;
@@ -203,18 +268,18 @@ interface ConsoleService {
203
268
  }
204
269
  declare const ConsoleService: Context.Tag<ConsoleService, ConsoleService>;
205
270
  interface FileSystemService {
206
- readonly exists: (path: string) => Promise<boolean>;
207
- readonly readdir: (path: string) => Promise<string[]>;
208
- readonly emptyDir: (path: string) => Promise<void>;
271
+ readonly exists: (path: string) => Eff<boolean, CliError>;
272
+ readonly readdir: (path: string) => Eff<string[], CliError>;
273
+ readonly emptyDir: (path: string) => Eff<void, CliError>;
209
274
  readonly copyDir: (from: string, to: string, options?: {
210
275
  overwrite?: boolean;
211
- }) => Promise<void>;
212
- readonly rename: (from: string, to: string) => Promise<void>;
213
- readonly remove: (path: string) => Promise<void>;
214
- readonly readJson: <T>(path: string) => Promise<T>;
215
- readonly writeJson: (path: string, value: unknown) => Promise<void>;
216
- readonly writeFile: (path: string, content: string) => Promise<void>;
217
- readonly readFile: (path: string) => Promise<string>;
276
+ }) => Eff<void, CliError>;
277
+ readonly rename: (from: string, to: string) => Eff<void, CliError>;
278
+ readonly remove: (path: string) => Eff<void, CliError>;
279
+ readonly readJson: <T>(path: string) => Eff<T, CliError>;
280
+ readonly writeJson: (path: string, value: unknown) => Eff<void, CliError>;
281
+ readonly writeFile: (path: string, content: string) => Eff<void, CliError>;
282
+ readonly readFile: (path: string) => Eff<string, CliError>;
218
283
  }
219
284
  declare const FileSystemService: Context.Tag<FileSystemService, FileSystemService>;
220
285
  interface TemplateService {
@@ -222,7 +287,7 @@ interface TemplateService {
222
287
  }
223
288
  declare const TemplateService: Context.Tag<TemplateService, TemplateService>;
224
289
  interface PackageManagerService {
225
- readonly getVersion: (packageManager: PackageManager, cwd: string) => Promise<string | undefined>;
290
+ readonly getVersion: (packageManager: PackageManager, cwd: string) => Eff<string | undefined, CliError>;
226
291
  }
227
292
  declare const PackageManagerService: Context.Tag<PackageManagerService, PackageManagerService>;
228
293
  interface ProcessService {
@@ -230,23 +295,19 @@ interface ProcessService {
230
295
  cwd: string;
231
296
  stdout?: "pipe" | "inherit" | "ignore";
232
297
  stderr?: "pipe" | "inherit" | "ignore";
233
- }) => Promise<{
298
+ }) => Eff<{
234
299
  stdout: string;
235
300
  stderr: string;
236
- }>;
301
+ }, CliError>;
237
302
  }
238
303
  declare const ProcessService: Context.Tag<ProcessService, ProcessService>;
239
304
  interface GitService {
240
- readonly initialize: (projectDir: string) => Promise<void>;
305
+ readonly initialize: (projectDir: string) => Eff<void, CliError>;
241
306
  }
242
307
  declare const GitService: Context.Tag<GitService, GitService>;
243
308
  interface SettingsService {
244
- readonly writeSettings: (projectDir: string, settings: ProofKitSettings) => Promise<void>;
245
- readonly appendEnvVars: (projectDir: string, vars: Record<string, string>) => Promise<void>;
246
- readonly ensureTypegenConfig: (projectDir: string, options: {
247
- appType: AppType;
248
- fileMaker?: FileMakerInputs;
249
- }) => Promise<void>;
309
+ readonly writeSettings: (projectDir: string, settings: ProofKitSettings) => Eff<void, CliError>;
310
+ readonly appendEnvVars: (projectDir: string, vars: Record<string, string>) => Eff<void, CliError>;
250
311
  }
251
312
  declare const SettingsService: Context.Tag<SettingsService, SettingsService>;
252
313
  interface FmMcpStatus {
@@ -288,51 +349,51 @@ interface FileMakerBootstrapArtifacts {
288
349
  };
289
350
  }
290
351
  interface FileMakerService {
291
- readonly detectLocalFmMcp: (baseUrl?: string) => Promise<FmMcpStatus>;
292
- readonly validateHostedServerUrl: (serverUrl: string, ottoPort?: number | null) => Promise<{
352
+ readonly detectLocalFmMcp: (baseUrl?: string) => Eff<FmMcpStatus, CliError>;
353
+ readonly validateHostedServerUrl: (serverUrl: string, ottoPort?: number | null) => Eff<{
293
354
  normalizedUrl: string;
294
355
  versions: FileMakerServerVersions;
295
- }>;
356
+ }, CliError>;
296
357
  readonly getOttoFMSToken: (options: {
297
358
  url: URL;
298
- }) => Promise<{
359
+ }) => Eff<{
299
360
  token: string;
300
- }>;
361
+ }, CliError>;
301
362
  readonly listFiles: (options: {
302
363
  url: URL;
303
364
  token: string;
304
- }) => Promise<OttoFileInfo[]>;
365
+ }) => Eff<OttoFileInfo[], CliError>;
305
366
  readonly listAPIKeys: (options: {
306
367
  url: URL;
307
368
  token: string;
308
- }) => Promise<OttoApiKeyInfo[]>;
369
+ }) => Eff<OttoApiKeyInfo[], CliError>;
309
370
  readonly createDataAPIKeyWithCredentials: (options: {
310
371
  url: URL;
311
372
  filename: string;
312
373
  username: string;
313
374
  password: string;
314
- }) => Promise<{
375
+ }) => Eff<{
315
376
  apiKey: string;
316
- }>;
377
+ }, CliError>;
317
378
  readonly deployDemoFile: (options: {
318
379
  url: URL;
319
380
  token: string;
320
381
  operation: "install" | "replace";
321
- }) => Promise<{
382
+ }) => Eff<{
322
383
  apiKey: string;
323
384
  filename: string;
324
- }>;
385
+ }, CliError>;
325
386
  readonly listLayouts: (options: {
326
387
  dataApiKey: string;
327
388
  fmFile: string;
328
389
  server: string;
329
- }) => Promise<string[]>;
330
- readonly createFileMakerBootstrapArtifacts: (settings: ProofKitSettings, inputs: FileMakerInputs, appType: AppType) => Promise<FileMakerBootstrapArtifacts>;
331
- readonly bootstrap: (projectDir: string, settings: ProofKitSettings, inputs: FileMakerInputs, appType: AppType) => Promise<ProofKitSettings>;
390
+ }) => Eff<string[], CliError>;
391
+ readonly createFileMakerBootstrapArtifacts: (settings: ProofKitSettings, inputs: FileMakerInputs, appType: AppType) => Eff<FileMakerBootstrapArtifacts, CliError>;
392
+ readonly bootstrap: (projectDir: string, settings: ProofKitSettings, inputs: FileMakerInputs, appType: AppType) => Eff<ProofKitSettings, CliError>;
332
393
  }
333
394
  declare const FileMakerService: Context.Tag<FileMakerService, FileMakerService>;
334
395
  interface CodegenService {
335
- readonly runInitial: (projectDir: string, packageManager: PackageManager) => Promise<void>;
396
+ readonly runInitial: (projectDir: string, packageManager: PackageManager) => Eff<void, CliError>;
336
397
  }
337
398
  declare const CodegenService: Context.Tag<CodegenService, CodegenService>;
338
399
  //#endregion
@@ -353,14 +414,35 @@ declare const runInit: (name?: string, rawFlags?: Partial<CliFlags>) => Effect.E
353
414
  importAlias: string;
354
415
  nonInteractive: boolean;
355
416
  debug: boolean;
356
- fileMaker: FileMakerInputs | undefined;
417
+ fileMaker: {
418
+ mode: "hosted-otto";
419
+ dataSourceName: string;
420
+ envNames: FileMakerEnvNames;
421
+ server: string;
422
+ fileName: string;
423
+ dataApiKey: string;
424
+ layoutName: string | undefined;
425
+ schemaName: string | undefined;
426
+ adminApiKey: string | undefined;
427
+ fmsVersion: string;
428
+ ottoVersion: string | null;
429
+ } | {
430
+ mode: "local-fm-mcp";
431
+ dataSourceName: string;
432
+ envNames: FileMakerEnvNames;
433
+ fmMcpBaseUrl: string;
434
+ fileName: string;
435
+ layoutName: string | undefined;
436
+ schemaName: string | undefined;
437
+ } | undefined;
357
438
  skipFileMakerSetup: boolean;
358
439
  hasExplicitFileMakerInputs: boolean;
359
440
  };
360
441
  plan: InitPlan;
361
- }, Error, PromptService | CliContextValue | FileMakerService | TemplateService | PackageManagerService | FileSystemService | ConsoleService | SettingsService | ProcessService | GitService | CodegenService>;
362
- declare const runDefaultCommand: (rawFlags?: Partial<CliFlags>) => Effect.Effect<void, Error, PromptService | CliContextValue | FileMakerService | TemplateService | PackageManagerService | FileSystemService | ConsoleService | SettingsService | ProcessService | GitService | CodegenService>;
363
- declare const cli: (args: ReadonlyArray<string>) => Effect.Effect<void, Error | _effect_cli_ValidationError0.ValidationError, _effect_cli_CliApp0.CliApp.Environment>;
442
+ }, CliError, PromptService | CliContextValue | ConsoleService | FileMakerService | TemplateService | PackageManagerService | FileSystemService | SettingsService | ProcessService | GitService | CodegenService>;
443
+ declare const runDefaultCommand: (rawFlags?: Partial<CliFlags>) => Effect.Effect<undefined, CliError, PromptService | CliContextValue | ConsoleService | FileMakerService | TemplateService | PackageManagerService | FileSystemService | SettingsService | ProcessService | GitService | CodegenService>;
444
+ declare const cli: (args: ReadonlyArray<string>) => Effect.Effect<void, CliError | _effect_cli_ValidationError0.ValidationError, _effect_cli_CliApp0.CliApp.Environment>;
445
+ declare function renderFailure(cause: Cause.Cause<unknown>, showDebugDetails: boolean): void;
364
446
  //#endregion
365
- export { cli, runDefaultCommand, runInit };
366
- //# sourceMappingURL=index-DALPpGd1.d.ts.map
447
+ export { cli, renderFailure, runDefaultCommand, runInit };
448
+ //# sourceMappingURL=index-D9Y-xAF1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D9Y-xAF1.d.ts","names":[],"sources":["../packages/cli/src/utils/packageManager.ts","../packages/cli/src/core/types.ts","../packages/cli/src/core/errors.ts","../packages/cli/src/core/context.ts","../packages/cli/src/index.ts"],"sourcesContent":[],"mappings":"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"}