{
  "version": 3,
  "sources": ["../../src/main.ts"],
  "sourcesContent": ["#!/usr/bin/env node\n// SPDX-FileCopyrightText: Copyright Orangebot, Inc. and Medplum contributors\n// SPDX-License-Identifier: Apache-2.0\nimport cp from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'node:readline/promises';\n\ninterface StarterProject {\n  id: string;\n  name: string;\n  description: string;\n}\n\ninterface ProjectConfig {\n  starterProject: StarterProject;\n  projectName: string;\n  serverUrl: string;\n}\n\nconst STARTER_PROJECTS: StarterProject[] = [\n  {\n    id: 'medplum-hello-world',\n    name: 'Hello World',\n    description: 'Minimal starter application showing basic Medplum integration',\n  },\n  {\n    id: 'foomedical',\n    name: 'Foo Medical',\n    description: 'Full featured patient portal with open registration',\n  },\n  {\n    id: 'medplum-provider',\n    name: 'Provider',\n    description: 'Simple EHR application with patient and encounter management',\n  },\n];\n\nasync function prompt(\n  terminal: readline.Interface,\n  question: string,\n  defaultValue: string,\n  validationFunc: (str: string) => boolean | string,\n  validationMessage: string\n): Promise<string> {\n  while (true) {\n    const defaultPrompt = defaultValue ? ` (${defaultValue})` : '';\n    const answer = (await terminal.question(`${question}${defaultPrompt}: `)) || defaultValue;\n    if (validationFunc(answer)) {\n      return answer;\n    }\n    console.log(validationMessage);\n  }\n}\n\nasync function promptForConfig(): Promise<ProjectConfig> {\n  const terminal = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout,\n  });\n\n  // Display the list of starter projects\n  console.log('Which starter project would you like to use?');\n  for (let i = 0; i < STARTER_PROJECTS.length; i++) {\n    console.log(`${i + 1}) ${STARTER_PROJECTS[i].name} - ${STARTER_PROJECTS[i].description}`);\n  }\n\n  // Prompt the user to select a project\n  const answer = await prompt(\n    terminal,\n    'Enter number',\n    '1',\n    (str) => {\n      const num = Number.parseInt(str, 10);\n      return num >= 1 && num <= STARTER_PROJECTS.length;\n    },\n    'Please enter a number between 1 and ' + STARTER_PROJECTS.length\n  );\n  const starterProject = STARTER_PROJECTS[Number.parseInt(answer, 10) - 1];\n\n  // Prompt the user for the project name\n  const projectName = await prompt(\n    terminal,\n    'What is your project name?',\n    starterProject.id,\n    (name) => name && /^[a-zA-Z0-9-_]+$/.test(name),\n    'Project name may only include letters, numbers, dashes, and underscores'\n  );\n\n  // Prompt the user for the server URL\n  const serverUrl = await prompt(\n    terminal,\n    'What is your Medplum server URL?',\n    'https://api.medplum.com/',\n    (url) => URL.canParse(url),\n    'Please enter a valid URL'\n  );\n\n  // Cleanup\n  terminal.close();\n\n  return { starterProject, projectName, serverUrl };\n}\n\nasync function initializeProject(config: ProjectConfig): Promise<void> {\n  const projectDir = path.join(process.cwd(), config.projectName);\n\n  try {\n    // Clone the repository\n    console.log('Cloning starter project...');\n    cp.execSync(`git clone git@github.com:medplum/${config.starterProject.id} ${config.projectName}`, {\n      stdio: 'inherit',\n    });\n\n    // Remove .git directory\n    fs.rmSync(path.join(projectDir, '.git'), { recursive: true, force: true });\n\n    // Update configuration\n    const configPath = path.join(projectDir, 'src', 'config.ts');\n    if (fs.existsSync(configPath)) {\n      let configContent = fs.readFileSync(configPath, 'utf8');\n      configContent = configContent.replace(/baseUrl:.*$/m, `baseUrl: '${config.serverUrl}',`);\n      fs.writeFileSync(configPath, configContent);\n    }\n\n    // Initialize new git repository\n    console.log('Initializing new git repository...');\n    cp.execSync('git init', { cwd: projectDir, stdio: 'inherit' });\n    cp.execSync('git add .', { cwd: projectDir, stdio: 'inherit' });\n    cp.execSync('git commit -m \"Initial commit from Medplum initializer\"', {\n      cwd: projectDir,\n      stdio: 'inherit',\n    });\n\n    // Install dependencies\n    console.log('Installing dependencies...');\n    cp.execSync('npm install', { cwd: projectDir, stdio: 'inherit' });\n\n    console.log(`Successfully created project ${config.projectName}!`);\n    console.log(`Next steps:`);\n    console.log(`  cd ${config.projectName}`);\n    console.log('  npm run dev');\n  } catch (error) {\n    console.error('Error initializing project:', error);\n    // Clean up on failure\n    if (fs.existsSync(projectDir)) {\n      fs.rmSync(projectDir, { recursive: true, force: true });\n    }\n    throw error;\n  }\n}\n\nexport async function main(): Promise<void> {\n  console.log('Welcome to Medplum project initializer!');\n  const config = await promptForConfig();\n  await initializeProject(config);\n}\n\nif (process.env.NODE_ENV !== 'test') {\n  main().catch((error) => {\n    console.error('Unexpected error:', error);\n    process.exit(1);\n  });\n}\n"],
  "mappings": "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",
  "names": []
}
