@medplum/cli 2.0.21 → 2.0.22

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.
@@ -204,7 +204,6 @@ function getEcsServiceName(resource) {
204
204
 
205
205
  /**
206
206
  * The AWS "describe" command prints details about a Medplum CloudFormation stack.
207
- *
208
207
  * @param tag The Medplum stack tag.
209
208
  */
210
209
  async function describeStacksCommand(tag) {
@@ -343,7 +342,6 @@ function escapeRegex(str) {
343
342
  * Expanding archive files without controlling resource consumption is security-sensitive
344
343
  *
345
344
  * See: https://sonarcloud.io/organizations/medplum/rules?open=typescript%3AS5042&rule_key=typescript%3AS5042
346
- *
347
345
  * @param destinationDir The destination directory where all files will be extracted.
348
346
  * @returns A tar file extractor.
349
347
  */
@@ -409,6 +407,8 @@ async function updateAppCommand(tag) {
409
407
  * Returns NPM package metadata for a given package name.
410
408
  * See: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#getpackageversion
411
409
  * @param packageName The npm package name.
410
+ * @param version The npm package version string.
411
+ * @returns The package.json metadata content.
412
412
  */
413
413
  async function getNpmPackageMetadata(packageName, version) {
414
414
  const url = `https://registry.npmjs.org/${packageName}/${version}`;
@@ -508,6 +508,11 @@ async function uploadAppToS3(tmpDir, bucketName) {
508
508
  /**
509
509
  * Uploads a directory of files to S3.
510
510
  * @param options The upload options such as bucket name, content type, and cache control.
511
+ * @param options.rootDir The root directory of the upload.
512
+ * @param options.bucketName The destination bucket name.
513
+ * @param options.fileNamePattern The glob file pattern to upload.
514
+ * @param options.contentType The content type MIME type.
515
+ * @param options.cached True to mark as public and cached forever.
511
516
  */
512
517
  async function uploadFolderToS3(options) {
513
518
  const items = fastGlob.sync(options.fileNamePattern, { cwd: options.rootDir });
@@ -519,6 +524,10 @@ async function uploadFolderToS3(options) {
519
524
  * Uploads a file to S3.
520
525
  * @param filePath The file path.
521
526
  * @param options The upload options such as bucket name, content type, and cache control.
527
+ * @param options.rootDir The root directory of the upload.
528
+ * @param options.bucketName The destination bucket name.
529
+ * @param options.contentType The content type MIME type.
530
+ * @param options.cached True to mark as public and cached forever.
522
531
  */
523
532
  async function uploadFileToS3(filePath, options) {
524
533
  const fileStream = fs.createReadStream(filePath);
@@ -561,7 +570,6 @@ async function createInvalidation(distributionId) {
561
570
  /**
562
571
  * The AWS "update-server" command updates the Medplum server in a Medplum CloudFormation stack.
563
572
  * @param tag The Medplum stack tag.
564
- * @returns
565
573
  */
566
574
  async function updateServerCommand(tag) {
567
575
  const details = await getStackByTag(tag);
@@ -800,15 +808,26 @@ async function initStackCommand() {
800
808
  print(' https://www.medplum.com/docs/self-hosting/install-on-aws');
801
809
  print('');
802
810
  }
803
- /** Prints to stdout. */
811
+ /**
812
+ * Prints to stdout.
813
+ * @param text The text to print.
814
+ */
804
815
  function print(text) {
805
816
  terminal.write(text + '\n');
806
817
  }
807
- /** Prints a header with extra line spacing. */
818
+ /**
819
+ * Prints a header with extra line spacing.
820
+ * @param text The text to print.
821
+ */
808
822
  function header(text) {
809
823
  print('\n' + text + '\n');
810
824
  }
811
- /** Prints a question and waits for user input. */
825
+ /**
826
+ * Prints a question and waits for user input.
827
+ * @param text The question text to print.
828
+ * @param defaultValue Optional default value.
829
+ * @returns The selected value, or default value on empty selection.
830
+ */
812
831
  function ask(text, defaultValue = '') {
813
832
  return new Promise((resolve) => {
814
833
  terminal.question(text + (defaultValue ? ' (' + defaultValue + ')' : '') + ' ', (answer) => {
@@ -816,7 +835,13 @@ function ask(text, defaultValue = '') {
816
835
  });
817
836
  });
818
837
  }
819
- /** Prints a question and waits for user to choose one of the provided options. */
838
+ /**
839
+ * Prints a question and waits for user to choose one of the provided options.
840
+ * @param text The prompt text to print.
841
+ * @param options The list of options that the user can select.
842
+ * @param defaultValue Optional default value.
843
+ * @returns The selected value, or default value on empty selection.
844
+ */
820
845
  async function choose(text, options, defaultValue = '') {
821
846
  const str = text + ' [' + options.map((o) => (o === defaultValue ? '(' + o + ')' : o)).join('|') + ']';
822
847
  // eslint-disable-next-line no-constant-condition
@@ -828,15 +853,28 @@ async function choose(text, options, defaultValue = '') {
828
853
  print('Please choose one of the following options: ' + options.join(', '));
829
854
  }
830
855
  }
831
- /** Prints a question and waits for the user to choose a valid integer option. */
856
+ /**
857
+ * Prints a question and waits for the user to choose a valid integer option.
858
+ * @param text The prompt text to print.
859
+ * @param options The list of options that the user can select.
860
+ * @param defaultValue Optional default value.
861
+ * @returns The selected value, or default value on empty selection.
862
+ */
832
863
  async function chooseInt(text, options, defaultValue = 0) {
833
864
  return parseInt(await choose(text, options.map((o) => o.toString()), defaultValue.toString()));
834
865
  }
835
- /** Prints a question and waits for the user to choose yes or no. */
866
+ /**
867
+ * Prints a question and waits for the user to choose yes or no.
868
+ * @param text The question to print.
869
+ * @returns true on accept or false on reject.
870
+ */
836
871
  async function yesOrNo(text) {
837
872
  return (await choose(text, ['y', 'n'])).toLowerCase() === 'y';
838
873
  }
839
- /** Prints a question and waits for the user to confirm yes. Throws error on no, and exits the program. */
874
+ /**
875
+ * Prints a question and waits for the user to confirm yes. Throws error on no, and exits the program.
876
+ * @param text The prompt text to print.
877
+ */
840
878
  async function checkOk(text) {
841
879
  if (!(await yesOrNo(text))) {
842
880
  print('Exiting...');
@@ -908,7 +946,6 @@ async function listCertificates(region) {
908
946
  * 1. If the certificate already exists, return the ARN.
909
947
  * 2. If the certificate does not exist, and the user wants to create a new certificate, create it and return the ARN.
910
948
  * 3. If the certificate does not exist, and the user does not want to create a new certificate, return a placeholder.
911
- *
912
949
  * @param config In-progress config settings.
913
950
  * @param allCerts List of all existing certificates.
914
951
  * @param region The AWS region where the certificate is needed.
@@ -963,7 +1000,6 @@ async function requestCert(region, domain) {
963
1000
  * 3. It must be a 2048-bit key pair.
964
1001
  *
965
1002
  * See: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs
966
- *
967
1003
  * @returns A new signing key.
968
1004
  */
969
1005
  function generateSigningKey() {
@@ -1095,8 +1131,9 @@ bulk
1095
1131
  .action(async ({ exportLevel, types, since }) => {
1096
1132
  const response = await exports.medplum.bulkExport(exportLevel, types, since);
1097
1133
  response.output?.forEach(async ({ type, url }) => {
1134
+ const fileUrl = new URL(url);
1098
1135
  const data = await exports.medplum.download(url);
1099
- const fileName = `${type}.ndjson`;
1136
+ const fileName = `${type}_${fileUrl.pathname}`.replace(/[^a-zA-Z0-9]+/g, '_') + '.ndjson';
1100
1137
  fs.writeFile(`${fileName}`, await data.text(), () => {
1101
1138
  console.log(`${fileName} is created`);
1102
1139
  });
@@ -1318,13 +1355,13 @@ class FileSystemStorage extends core.ClientStorage {
1318
1355
  exports.medplum = void 0;
1319
1356
  async function main(medplumClient, argv) {
1320
1357
  exports.medplum = medplumClient;
1321
- // Legacy support for MEDPLUM_CLIENT_ID and MEDPLUM_CLIENT_SECRET environment variables
1322
- const clientId = process.env['MEDPLUM_CLIENT_ID'];
1323
- const clientSecret = process.env['MEDPLUM_CLIENT_SECRET'];
1324
- if (clientId && clientSecret) {
1325
- await exports.medplum.startClientLogin(clientId, clientSecret);
1326
- }
1327
1358
  try {
1359
+ const clientId = process.env['MEDPLUM_CLIENT_ID'];
1360
+ const clientSecret = process.env['MEDPLUM_CLIENT_SECRET'];
1361
+ if (clientId && clientSecret) {
1362
+ medplumClient.setBasicAuth(clientId, clientSecret);
1363
+ await medplumClient.startClientLogin(clientId, clientSecret);
1364
+ }
1328
1365
  const index = new commander.Command('medplum').description('Command to access Medplum CLI');
1329
1366
  index.version(core.MEDPLUM_VERSION);
1330
1367
  // Auth commands
@@ -1354,14 +1391,16 @@ async function main(medplumClient, argv) {
1354
1391
  console.error('Error: ' + core.normalizeErrorString(err));
1355
1392
  }
1356
1393
  }
1357
- function run() {
1394
+ async function run() {
1358
1395
  dotenv.config();
1359
1396
  const baseUrl = process.env['MEDPLUM_BASE_URL'] || 'https://api.medplum.com/';
1360
1397
  const fhirUrlPath = process.env['MEDPLUM_FHIR_URL_PATH'] || '';
1361
1398
  const accessToken = process.env['MEDPLUM_CLIENT_ACCESS_TOKEN'] || '';
1399
+ const tokenUrl = process.env['MEDPLUM_TOKEN_URL'] || '';
1362
1400
  const medplumClient = new core.MedplumClient({
1363
1401
  fetch,
1364
1402
  baseUrl,
1403
+ tokenUrl,
1365
1404
  fhirUrlPath,
1366
1405
  storage: new FileSystemStorage(),
1367
1406
  onUnauthenticated: onUnauthenticated,
@@ -1369,10 +1408,10 @@ function run() {
1369
1408
  if (accessToken) {
1370
1409
  medplumClient.setAccessToken(accessToken);
1371
1410
  }
1372
- main(medplumClient, process.argv).catch((err) => console.error('Unhandled error:', err));
1411
+ await main(medplumClient, process.argv);
1373
1412
  }
1374
1413
  if (require.main === module) {
1375
- run();
1414
+ run().catch((err) => console.error('Unhandled error:', err));
1376
1415
  }
1377
1416
  function onUnauthenticated() {
1378
1417
  console.log('Unauthenticated: run `npx medplum login` to sign in');
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/auth.ts","../../../src/aws/utils.ts","../../../src/aws/describe.ts","../../../src/aws/list.ts","../../../src/utils.ts","../../../src/aws/update-app.ts","../../../src/aws/update-server.ts","../../../src/aws/init.ts","../../../src/aws/index.ts","../../../src/bots.ts","../../../src/bulk.ts","../../../src/project.ts","../../../src/rest.ts","../../../src/storage.ts","../../../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { medplum } from '.';\nimport { MedplumClient, getDisplayString, normalizeErrorString } from '@medplum/core';\nimport { platform } from 'os';\nimport { exec } from 'child_process';\nimport { createServer } from 'http';\n\nconst clientId = 'medplum-cli';\nconst redirectUri = 'http://localhost:9615';\n\nexport const login = new Command('login');\nexport const whoami = new Command('whoami');\n\nlogin.action(async () => {\n await startLogin(medplum);\n});\n\nwhoami.action(() => {\n printMe(medplum);\n});\n\nasync function startLogin(medplum: MedplumClient): Promise<void> {\n await startWebServer(medplum);\n\n const loginUrl = new URL('/oauth2/authorize', medplum.getBaseUrl());\n loginUrl.searchParams.set('client_id', clientId);\n loginUrl.searchParams.set('redirect_uri', redirectUri);\n loginUrl.searchParams.set('scope', 'openid');\n loginUrl.searchParams.set('response_type', 'code');\n loginUrl.searchParams.set('prompt', 'login');\n await openBrowser(loginUrl.toString());\n}\n\nasync function startWebServer(medplum: MedplumClient): Promise<void> {\n const server = createServer(async (req, res) => {\n const url = new URL(req.url as string, 'http://localhost:9615');\n const code = url.searchParams.get('code');\n if (url.pathname === '/' && code) {\n try {\n const profile = await medplum.processCode(code, { clientId, redirectUri });\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end(`Signed in as ${getDisplayString(profile)}. You may close this window.`);\n } catch (err) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end(`Error: ${normalizeErrorString(err)}`);\n } finally {\n server.close();\n }\n } else {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n }\n }).listen(9615);\n}\n\n/**\n * Opens a web browser to the specified URL.\n * See: https://hasinthaindrajee.medium.com/browser-sso-for-cli-applications-b0be743fa656\n * @param url The URL to open.\n */\nasync function openBrowser(url: string): Promise<void> {\n const os = platform();\n let cmd = undefined;\n switch (os) {\n case 'openbsd':\n case 'linux':\n cmd = `xdg-open '${url}'`;\n break;\n case 'darwin':\n cmd = `open '${url}'`;\n break;\n case 'win32':\n cmd = `cmd /c start \"\" \"${url}\"`;\n break;\n default:\n throw new Error('Unsupported platform: ' + os);\n }\n exec(cmd);\n}\n\n/**\n * Prints the current user and project.\n * @param medplum The Medplum client.\n */\nfunction printMe(medplum: MedplumClient): void {\n const loginState = medplum.getActiveLogin();\n if (loginState) {\n console.log(`Server: ${medplum.getBaseUrl()}`);\n console.log(`Profile: ${loginState.profile?.display} (${loginState.profile?.reference})`);\n console.log(`Project: ${loginState.project?.display} (${loginState.project?.reference})`);\n } else {\n console.log('Not logged in');\n }\n}\n","import {\n CloudFormationClient,\n DescribeStackResourcesCommand,\n DescribeStacksCommand,\n ListStacksCommand,\n Stack,\n StackResource,\n StackSummary,\n} from '@aws-sdk/client-cloudformation';\nimport { CloudFrontClient } from '@aws-sdk/client-cloudfront';\nimport { ECSClient } from '@aws-sdk/client-ecs';\nimport { S3Client } from '@aws-sdk/client-s3';\n\nexport interface MedplumStackDetails {\n stack: Stack;\n tag: string;\n ecsCluster?: StackResource;\n ecsService?: StackResource;\n appBucket?: StackResource;\n appDistribution?: StackResource;\n storageBucket?: StackResource;\n}\n\nexport const cloudFormationClient = new CloudFormationClient({});\nexport const cloudFrontClient = new CloudFrontClient({});\nexport const ecsClient = new ECSClient({});\nexport const s3Client = new S3Client({});\nexport const tagKey = 'medplum:environment';\n\n/**\n * Returns a list of all AWS CloudFormation stacks (both Medplum and non-Medplum).\n * @returns List of AWS CloudFormation stacks.\n */\nexport async function getAllStacks(): Promise<(StackSummary & { StackName: string })[]> {\n const listResult = await cloudFormationClient.send(new ListStacksCommand({}));\n return (\n (listResult.StackSummaries?.filter((s) => s.StackName && s.StackStatus !== 'DELETE_COMPLETE') as (StackSummary & {\n StackName: string;\n })[]) || []\n );\n}\n\n/**\n * Returns Medplum stack details for the given tag.\n * @param tag The Medplum stack tag.\n * @returns The Medplum stack details.\n */\nexport async function getStackByTag(tag: string): Promise<MedplumStackDetails | undefined> {\n const stackSummaries = await getAllStacks();\n for (const stackSummary of stackSummaries) {\n const stackName = stackSummary.StackName;\n const details = await getStackDetails(stackName);\n if (details?.tag === tag) {\n return details;\n }\n }\n return undefined;\n}\n\n/**\n * Returns Medplum stack details for the given stack name.\n * @param stackName The CloudFormation stack name.\n * @returns The Medplum stack details.\n */\nexport async function getStackDetails(stackName: string): Promise<MedplumStackDetails | undefined> {\n const describeStacksCommand = new DescribeStacksCommand({ StackName: stackName });\n const stackDetails = await cloudFormationClient.send(describeStacksCommand);\n const stack = stackDetails?.Stacks?.[0];\n const medplumTag = stack?.Tags?.find((tag) => tag.Key === tagKey);\n if (!medplumTag) {\n return undefined;\n }\n\n const stackResources = await cloudFormationClient.send(new DescribeStackResourcesCommand({ StackName: stackName }));\n if (!stackResources.StackResources) {\n return undefined;\n }\n\n const result: MedplumStackDetails = {\n stack: stack as Stack,\n tag: medplumTag.Value as string,\n };\n\n for (const resource of stackResources.StackResources) {\n if (resource.ResourceType === 'AWS::ECS::Cluster') {\n result.ecsCluster = resource;\n } else if (resource.ResourceType === 'AWS::ECS::Service') {\n result.ecsService = resource;\n } else if (\n resource.ResourceType === 'AWS::S3::Bucket' &&\n resource.LogicalResourceId?.startsWith('FrontEndAppBucket')\n ) {\n result.appBucket = resource;\n } else if (\n resource.ResourceType === 'AWS::S3::Bucket' &&\n resource.LogicalResourceId?.startsWith('StorageStorageBucket')\n ) {\n result.storageBucket = resource;\n } else if (\n resource.ResourceType === 'AWS::CloudFront::Distribution' &&\n resource.LogicalResourceId?.startsWith('FrontEndAppDistribution')\n ) {\n result.appDistribution = resource;\n }\n }\n\n return result;\n}\n\n/**\n * Prints the given Medplum stack details to stdout.\n * @param details The Medplum stack details.\n */\nexport function printStackDetails(details: MedplumStackDetails): void {\n console.log(`Medplum Tag: ${details.tag}`);\n console.log(`Stack Name: ${details.stack.StackName}`);\n console.log(`Stack ID: ${details.stack.StackId}`);\n console.log(`Status: ${details.stack.StackStatus}`);\n console.log(`ECS Cluster: ${details.ecsCluster?.PhysicalResourceId}`);\n console.log(`ECS Service: ${getEcsServiceName(details.ecsService)}`);\n console.log(`App Bucket: ${details.appBucket?.PhysicalResourceId}`);\n console.log(`Storage Bucket: ${details.storageBucket?.PhysicalResourceId}`);\n}\n\n/**\n * Parses the ECS service name from the given AWS ECS service resource.\n * @param resource The AWS ECS service resource.\n * @returns The ECS service name.\n */\nexport function getEcsServiceName(resource: StackResource | undefined): string | undefined {\n return resource?.PhysicalResourceId?.split('/')?.pop() || '';\n}\n","import { getStackByTag, printStackDetails } from './utils';\n\n/**\n * The AWS \"describe\" command prints details about a Medplum CloudFormation stack.\n *\n * @param tag The Medplum stack tag.\n */\nexport async function describeStacksCommand(tag: string): Promise<void> {\n const details = await getStackByTag(tag);\n if (!details) {\n console.log('Stack not found');\n return;\n }\n printStackDetails(details);\n}\n","import { getAllStacks, getStackDetails, printStackDetails } from './utils';\n\n/**\n * The AWS \"list\" command prints summary details about all Medplum CloudFormation stacks.\n */\nexport async function listStacksCommand(): Promise<void> {\n const stackSummaries = await getAllStacks();\n for (const stackSummary of stackSummaries) {\n const stackName = stackSummary.StackName;\n const details = await getStackDetails(stackName);\n if (!details) {\n continue;\n }\n printStackDetails(details);\n console.log('');\n }\n}\n","import { MedplumClient } from '@medplum/core';\nimport { Bot, OperationOutcome } from '@medplum/fhirtypes';\nimport { existsSync, readFileSync, writeFile } from 'fs';\nimport { resolve } from 'path';\nimport internal from 'stream';\nimport tar from 'tar';\n\ninterface MedplumConfig {\n readonly baseUrl?: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly registerEnabled?: boolean;\n readonly bots?: MedplumBotConfig[];\n}\n\ninterface MedplumBotConfig {\n readonly name: string;\n readonly id: string;\n readonly source: string;\n readonly dist?: string;\n}\n\nexport function prettyPrint(input: unknown): void {\n console.log(JSON.stringify(input, null, 2));\n}\n\nexport async function saveBot(medplum: MedplumClient, botConfig: MedplumBotConfig, bot: Bot): Promise<void> {\n const code = readFileContents(botConfig.source);\n if (!code) {\n return;\n }\n\n try {\n console.log('Update bot code.....');\n const updateResult = await medplum.updateResource({\n ...bot,\n code,\n });\n if (!updateResult) {\n console.log('Bot not modified');\n } else {\n console.log('Success! New bot version: ' + updateResult.meta?.versionId);\n }\n } catch (err) {\n console.log('Update error: ', err);\n }\n}\n\nexport async function deployBot(medplum: MedplumClient, botConfig: MedplumBotConfig, bot: Bot): Promise<void> {\n const code = readFileContents(botConfig.dist ?? botConfig.source);\n if (!code) {\n return;\n }\n\n try {\n console.log('Deploying bot...');\n const deployResult = (await medplum.post(medplum.fhirUrl('Bot', bot.id as string, '$deploy'), {\n code,\n })) as OperationOutcome;\n console.log('Deploy result: ' + deployResult.issue?.[0]?.details?.text);\n } catch (err) {\n console.log('Deploy error: ', err);\n }\n}\n\nexport async function createBot(medplum: MedplumClient, argv: string[]): Promise<void> {\n if (argv.length < 4) {\n console.log(`Error: command needs to be npx medplum <new-bot-name> <project-id> <source-file> <dist-file>`);\n return;\n }\n const botName = argv[0];\n const projectId = argv[1];\n const sourceFile = argv[2];\n const distFile = argv[3];\n\n try {\n const body = {\n name: botName,\n description: '',\n };\n const newBot = await medplum.post('admin/projects/' + projectId + '/bot', body);\n const bot = await medplum.readResource('Bot', newBot.id);\n\n const botConfig = {\n name: botName,\n id: newBot.id,\n source: sourceFile,\n dist: distFile,\n };\n await saveBot(medplum, botConfig as MedplumBotConfig, bot);\n console.log(`Success! Bot created: ${bot.id}`);\n\n addBotToConfig(botConfig);\n } catch (err) {\n console.log('Error while creating new bot: ' + err);\n }\n}\n\nexport function readBotConfigs(botName: string): MedplumBotConfig[] {\n const regExBotName = new RegExp('^' + escapeRegex(botName).replace(/\\\\\\*/g, '.*') + '$');\n const botConfigs = readConfig()?.bots?.filter((b) => regExBotName.test(b.name));\n if (!botConfigs) {\n return [];\n }\n return botConfigs;\n}\n\nexport function readConfig(tagName?: string): MedplumConfig | undefined {\n const fileName = tagName ? `medplum.${tagName}.config.json` : 'medplum.config.json';\n const content = readFileContents(fileName);\n if (!content) {\n return undefined;\n }\n return JSON.parse(content);\n}\n\nfunction readFileContents(fileName: string): string | undefined {\n const path = resolve(process.cwd(), fileName);\n if (!existsSync(path)) {\n console.log('Error: File does not exist: ' + path);\n return '';\n }\n return readFileSync(path, 'utf8');\n}\n\nfunction addBotToConfig(botConfig: MedplumBotConfig): void {\n const config = readConfig();\n config?.bots?.push(botConfig);\n writeFile('medplum.config.json', JSON.stringify(config), () => {\n console.log(`Bot added to config: ${botConfig.id}`);\n });\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\n/**\n * Creates a safe tar extractor that limits the number of files and total size.\n *\n * Expanding archive files without controlling resource consumption is security-sensitive\n *\n * See: https://sonarcloud.io/organizations/medplum/rules?open=typescript%3AS5042&rule_key=typescript%3AS5042\n *\n * @param destinationDir The destination directory where all files will be extracted.\n * @returns A tar file extractor.\n */\nexport function safeTarExtractor(destinationDir: string): internal.Writable {\n const MAX_FILES = 100;\n const MAX_SIZE = 10 * 1024 * 1024; // 10 MB\n\n let fileCount = 0;\n let totalSize = 0;\n\n return tar.x({\n cwd: destinationDir,\n filter: (_path, entry) => {\n fileCount++;\n if (fileCount > MAX_FILES) {\n throw new Error('Tar extractor reached max number of files');\n }\n\n totalSize += entry.size;\n if (totalSize > MAX_SIZE) {\n throw new Error('Tar extractor reached max size');\n }\n\n return true;\n },\n });\n}\n","import { CreateInvalidationCommand } from '@aws-sdk/client-cloudfront';\nimport { PutObjectCommand } from '@aws-sdk/client-s3';\nimport fastGlob from 'fast-glob';\nimport { createReadStream, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';\nimport fetch from 'node-fetch';\nimport { tmpdir } from 'os';\nimport { join, sep } from 'path';\nimport { pipeline } from 'stream/promises';\nimport { readConfig, safeTarExtractor } from '../utils';\nimport { cloudFrontClient, getStackByTag, s3Client } from './utils';\n\n/**\n * The AWS \"update-app\" command updates the Medplum app in a Medplum CloudFormation stack to the latest version.\n * @param tag The Medplum stack tag.\n */\nexport async function updateAppCommand(tag: string): Promise<void> {\n const config = readConfig(tag);\n if (!config) {\n console.log('Config not found');\n return;\n }\n const details = await getStackByTag(tag);\n if (!details) {\n console.log('Stack not found');\n return;\n }\n const appBucket = details.appBucket;\n if (!appBucket) {\n console.log('App bucket not found');\n return;\n }\n\n const tmpDir = await downloadNpmPackage('@medplum/app', 'latest');\n\n // Replace variables in the app\n replaceVariables(tmpDir, {\n MEDPLUM_BASE_URL: config.baseUrl as string,\n MEDPLUM_CLIENT_ID: config.clientId || '',\n GOOGLE_CLIENT_ID: config.googleClientId || '',\n RECAPTCHA_SITE_KEY: config.recaptchaSiteKey || '',\n MEDPLUM_REGISTER_ENABLED: config.registerEnabled ? 'true' : 'false',\n });\n\n // Upload the app to S3 with correct content-type and cache-control\n await uploadAppToS3(tmpDir, appBucket.PhysicalResourceId as string);\n\n // Create a CloudFront invalidation to clear any cached resources\n if (details.appDistribution?.PhysicalResourceId) {\n await createInvalidation(details.appDistribution.PhysicalResourceId);\n }\n\n console.log('Done');\n}\n\n/**\n * Returns NPM package metadata for a given package name.\n * See: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#getpackageversion\n * @param packageName The npm package name.\n */\nasync function getNpmPackageMetadata(packageName: string, version: string): Promise<any> {\n const url = `https://registry.npmjs.org/${packageName}/${version}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Downloads and extracts an NPM package.\n * @param packageName The NPM package name.\n * @param version The NPM package version or \"latest\".\n * @returns Path to temporary directory where the package was downloaded and extracted.\n */\nasync function downloadNpmPackage(packageName: string, version: string): Promise<string> {\n const packageMetadata = await getNpmPackageMetadata(packageName, version);\n const tarballUrl = packageMetadata.dist.tarball as string;\n const tmpDir = mkdtempSync(join(tmpdir(), 'tarball-'));\n try {\n const response = await fetch(tarballUrl);\n const extractor = safeTarExtractor(tmpDir);\n await pipeline(response.body, extractor);\n return join(tmpDir, 'package', 'dist');\n } catch (error) {\n rmSync(tmpDir, { recursive: true, force: true });\n throw error;\n }\n}\n\n/**\n * Replaces variables in all JS files in the given folder.\n * @param folderName The folder name of the files.\n * @param replacements The collection of variable placeholders and replacements.\n */\nfunction replaceVariables(folderName: string, replacements: Record<string, string>): void {\n for (const item of readdirSync(folderName, { withFileTypes: true })) {\n const itemPath = join(folderName, item.name);\n if (item.isDirectory()) {\n replaceVariables(itemPath, replacements);\n } else if (item.isFile() && itemPath.endsWith('.js')) {\n replaceVariablesInFile(itemPath, replacements);\n }\n }\n}\n\n/**\n * Replaces variables in the JS file.\n * @param fileName The file name.\n * @param replacements The collection of variable placeholders and replacements.\n */\nfunction replaceVariablesInFile(fileName: string, replacements: Record<string, string>): void {\n let contents = readFileSync(fileName, 'utf-8');\n for (const [placeholder, replacement] of Object.entries(replacements)) {\n contents = contents.replaceAll(`process.env.${placeholder}`, `'${replacement}'`);\n }\n writeFileSync(fileName, contents);\n}\n\n/**\n * Uploads the app to S3.\n * Ensures correct content-type and cache-control for each file.\n * @param tmpDir The temporary directory where the app is located.\n * @param bucketName The destination S3 bucket name.\n */\nasync function uploadAppToS3(tmpDir: string, bucketName: string): Promise<void> {\n // Manually iterate and upload files\n // Automatic content-type detection is not reliable on Microsoft Windows\n // So we explicitly set content-type\n const uploadPatterns: [string, string, boolean][] = [\n // Cached\n // These files generally have a hash, so they can be cached forever\n // It is important to upload them first to avoid broken references from index.html\n ['css/**/*.css', 'text/css', true],\n ['css/**/*.css.map', 'application/json', true],\n ['img/**/*.png', 'image/png', true],\n ['img/**/*.svg', 'image/svg+xml', true],\n ['js/**/*.js', 'application/javascript', true],\n ['js/**/*.js.map', 'application/json', true],\n ['js/**/*.txt', 'text/plain', true],\n ['favicon.ico', 'image/vnd.microsoft.icon', true],\n ['robots.txt', 'text/plain', true],\n ['workbox-*.js', 'application/javascript', true],\n ['workbox-*.js.map', 'application/json', true],\n\n // Not cached\n ['manifest.webmanifest', 'application/manifest+json', false],\n ['service-worker.js', 'application/javascript', false],\n ['service-worker.js.map', 'application/json', false],\n ['index.html', 'text/html', false],\n ];\n for (const uploadPattern of uploadPatterns) {\n await uploadFolderToS3({\n rootDir: tmpDir,\n bucketName,\n fileNamePattern: uploadPattern[0],\n contentType: uploadPattern[1],\n cached: uploadPattern[2],\n });\n }\n}\n\n/**\n * Uploads a directory of files to S3.\n * @param options The upload options such as bucket name, content type, and cache control.\n */\nasync function uploadFolderToS3(options: {\n rootDir: string;\n bucketName: string;\n fileNamePattern: string;\n contentType: string;\n cached: boolean;\n}): Promise<void> {\n const items = fastGlob.sync(options.fileNamePattern, { cwd: options.rootDir });\n for (const item of items) {\n await uploadFileToS3(join(options.rootDir, item), options);\n }\n}\n\n/**\n * Uploads a file to S3.\n * @param filePath The file path.\n * @param options The upload options such as bucket name, content type, and cache control.\n */\nasync function uploadFileToS3(\n filePath: string,\n options: {\n rootDir: string;\n bucketName: string;\n contentType: string;\n cached: boolean;\n }\n): Promise<void> {\n const fileStream = createReadStream(filePath);\n const s3Key = filePath\n .substring(options.rootDir.length + 1)\n .split(sep)\n .join('/');\n\n const putObjectParams = {\n Bucket: options.bucketName,\n Key: s3Key,\n Body: fileStream,\n ContentType: options.contentType,\n CacheControl: options.cached ? 'public, max-age=31536000' : 'no-cache, no-store, must-revalidate',\n };\n\n console.log(`Uploading ${s3Key} to ${options.bucketName}...`);\n await s3Client.send(new PutObjectCommand(putObjectParams));\n}\n\n/**\n * Creates a CloudFront invalidation to clear the cache for all files.\n * This is not strictly necessary, but it helps to ensure that the latest version of the app is served.\n * In a perfect world, every deploy is clean, and hashed resources should be cached forever.\n * However, we do not recalculate hashes after variable replacements.\n * So if variables change, we need to invalidate the cache.\n * @param distributionId The CloudFront distribution ID.\n */\nasync function createInvalidation(distributionId: string): Promise<void> {\n const response = await cloudFrontClient.send(\n new CreateInvalidationCommand({\n DistributionId: distributionId,\n InvalidationBatch: {\n CallerReference: `invalidate-all-${Date.now()}`,\n Paths: {\n Quantity: 1,\n Items: ['/*'],\n },\n },\n })\n );\n console.log(`Created invalidation with ID: ${response.Invalidation?.Id}`);\n}\n","import { UpdateServiceCommand } from '@aws-sdk/client-ecs';\nimport { ecsClient, getEcsServiceName, getStackByTag } from './utils';\n\n/**\n * The AWS \"update-server\" command updates the Medplum server in a Medplum CloudFormation stack.\n * @param tag The Medplum stack tag.\n * @returns\n */\nexport async function updateServerCommand(tag: string): Promise<void> {\n const details = await getStackByTag(tag);\n if (!details) {\n console.log('Stack not found');\n return;\n }\n const ecsCluster = details.ecsCluster?.PhysicalResourceId;\n if (!ecsCluster) {\n console.log('ECS Cluster not found');\n return;\n }\n const ecsService = getEcsServiceName(details.ecsService);\n if (!ecsService) {\n console.log('ECS Service not found');\n return;\n }\n await ecsClient.send(\n new UpdateServiceCommand({\n cluster: ecsCluster,\n service: ecsService,\n forceNewDeployment: true,\n })\n );\n console.log(`Service \"${ecsService}\" updated successfully.`);\n}\n","import { ACMClient, CertificateSummary, ListCertificatesCommand, RequestCertificateCommand } from '@aws-sdk/client-acm';\nimport { PutParameterCommand, SSMClient } from '@aws-sdk/client-ssm';\nimport { GetCallerIdentityCommand, STSClient } from '@aws-sdk/client-sts';\nimport { MedplumInfraConfig } from '@medplum/core';\nimport { generateKeyPairSync, randomUUID } from 'crypto';\nimport { existsSync, writeFileSync } from 'fs';\nimport { resolve } from 'path';\nimport readline from 'readline';\n\ntype MedplumDomainType = 'api' | 'app' | 'storage';\ntype MedplumDomainSetting = `${MedplumDomainType}DomainName`;\ntype MedplumDomainCertSetting = `${MedplumDomainType}SslCertArn`;\n\nconst getDomainSetting = (domain: MedplumDomainType): MedplumDomainSetting => `${domain}DomainName`;\nconst getDomainCertSetting = (domain: MedplumDomainType): MedplumDomainCertSetting => `${domain}SslCertArn`;\n\nlet terminal: readline.Interface;\n\nexport async function initStackCommand(): Promise<void> {\n const config = { apiPort: 8103, region: 'us-east-1' } as MedplumInfraConfig;\n terminal = readline.createInterface({ input: process.stdin, output: process.stdout });\n header('MEDPLUM');\n print('This tool prepares the necessary prerequisites for deploying Medplum in your AWS account.');\n print('');\n print('Most Medplum infrastructure is deployed using the AWS CDK.');\n print('However, some AWS resources must be created manually, such as email addresses and SSL certificates.');\n print('This tool will help you create those resources.');\n print('');\n print('Upon completion, this tool will:');\n print(' 1. Generate a Medplum CDK config file (i.e., medplum.demo.config.json)');\n print(' 2. Optionally generate an AWS CloudFront signing key');\n print(' 3. Optionally request SSL certificates from AWS Certificate Manager');\n print(' 4. Optionally write server config settings to AWS Parameter Store');\n print('');\n print('The Medplum infra config file is an input to the Medplum CDK.');\n print('The Medplum CDK will create and manage the necessary AWS resources.');\n print('');\n print('We will ask a series of questions to generate your infra config file.');\n print('Some questions have predefined options in [square brackets].');\n print('Some questions have default values in (parentheses), which you can accept by pressing Enter.');\n print('Press Ctrl+C at any time to exit.');\n\n header('ENVIRONMENT NAME');\n print('Medplum deployments have a short environment name such as \"prod\", \"staging\", \"alice\", or \"demo\".');\n print('The environment name is used in multiple places:');\n print(' 1. As part of config file names (i.e., medplum.demo.config.json)');\n print(' 2. As the base of CloudFormation stack names (i.e., MedplumDemo)');\n print(' 3. AWS Parameter Store keys (i.e., /medplum/demo/...)');\n config.name = await ask('What is your environment name?', 'demo');\n print('Using environment name \"' + config.name + '\"...');\n\n header('CONFIG FILE');\n print('Medplum Infrastructure will create a config file in the current directory.');\n const configFileName = await ask('What is the config file name?', `medplum.${config.name}.config.json`);\n if (existsSync(configFileName)) {\n print('Config file already exists.');\n await checkOk('Do you want to overwrite the config file?');\n }\n print('Using config file \"' + configFileName + '\"...');\n writeConfig(configFileName, config);\n\n header('AWS REGION');\n print('Most Medplum resources will be created in a single AWS region.');\n config.region = await ask('Enter your AWS region:', 'us-east-1');\n writeConfig(configFileName, config);\n\n header('AWS ACCOUNT NUMBER');\n print('Medplum Infrastructure will use your AWS account number to create AWS resources.');\n const currentAccountId = await getAccountId(config.region);\n print('Using the AWS CLI, your current account ID is: ' + currentAccountId);\n config.accountNumber = await ask('What is your AWS account number?', currentAccountId);\n writeConfig(configFileName, config);\n\n header('STACK NAME');\n print('Medplum will create a CloudFormation stack to manage AWS resources.');\n const defaultStackName = 'Medplum' + config.name.charAt(0).toUpperCase() + config.name.slice(1);\n config.stackName = await ask('Enter your CloudFormation stack name?', defaultStackName);\n writeConfig(configFileName, config);\n\n header('BASE DOMAIN NAME');\n print('Medplum deploys multiple subdomains for various services.');\n print('');\n print('For example, \"api.\" for the REST API and \"app.\" for the web application.');\n print('The base domain name is the common suffix for all subdomains.');\n print('');\n print('For example, if your base domain name is \"example.com\",');\n print('then the REST API will be \"api.example.com\".');\n print('');\n print('Note that you must own the base domain, and it must use Route53 DNS.');\n print('Medplum will create subdomains for you, but you must configure the base domain.');\n while (!config.domainName) {\n config.domainName = await ask('Enter your base domain name:');\n }\n writeConfig(configFileName, config);\n\n header('SUPPORT EMAIL');\n print('Medplum sends transactional emails to users.');\n print('For example, emails to new users or for password reset.');\n print('Medplum will use the support email address to send these emails.');\n print('Note that you must verify the support email address in SES.');\n const supportEmail = await ask('Enter your support email address:');\n\n header('API DOMAIN NAME');\n print('Medplum deploys a REST API for the backend services.');\n config.apiDomainName = await ask('Enter your REST API domain name:', 'api.' + config.domainName);\n writeConfig(configFileName, config);\n\n header('APP DOMAIN NAME');\n print('Medplum deploys a web application for the user interface.');\n config.appDomainName = await ask('Enter your web application domain name:', 'app.' + config.domainName);\n writeConfig(configFileName, config);\n\n header('STORAGE DOMAIN NAME');\n print('Medplum deploys a storage service for file uploads.');\n config.storageDomainName = await ask('Enter your storage domain name:', 'storage.' + config.domainName);\n writeConfig(configFileName, config);\n\n header('STORAGE BUCKET');\n print('Medplum uses an S3 bucket to store binary content such as file uploads.');\n print('Medplum will create a the S3 bucket as part of the CloudFormation stack.');\n config.storageBucketName = await ask('Enter your storage bucket name:', 'medplum-' + config.name + '-storage');\n writeConfig(configFileName, config);\n\n header('MAX AVAILABILITY ZONES');\n print('Medplum API servers can be deployed in multiple availability zones.');\n print('This provides redundancy and high availability.');\n print('However, it also increases the cost of the deployment.');\n print('If you want to use all availability zones, choose a large number such as 99.');\n print('If you want to restrict the number, for example to manage EIP limits,');\n print('then choose a small number such as 1 or 2.');\n config.maxAzs = await chooseInt('Enter the maximum number of availability zones:', [1, 2, 3, 99], 2);\n\n header('DATABASE INSTANCES');\n print('Medplum uses a relational database to store data.');\n print('You can set up your own database,');\n print('or Medplum can create a new RDS database as part of the CloudFormation stack.');\n if (await yesOrNo('Do you want to create a new RDS database as part of the CloudFormation stack?')) {\n print('Medplum will create a new RDS database as part of the CloudFormation stack.');\n print('');\n print('If you need high availability, you can choose multiple instances.');\n print('Use 1 for a single instance, or 2 for a primary and a standby.');\n config.rdsInstances = await chooseInt('Enter the number of database instances:', [1, 2], 1);\n } else {\n print('Medplum will not create a new RDS database.');\n print('Please create a new RDS database and enter the database name, username, and password.');\n print('Set the AWS Secrets Manager secret ARN in the config file in the \"rdsSecretsArn\" setting.');\n config.rdsSecretsArn = 'TODO';\n }\n writeConfig(configFileName, config);\n\n header('SERVER INSTANCES');\n print('Medplum uses AWS Fargate to run the API servers.');\n print('Medplum will create a new Fargate cluster as part of the CloudFormation stack.');\n print('Fargate will automatically scale the number of servers up and down.');\n print('If you need high availability, you can choose multiple instances.');\n config.desiredServerCount = await chooseInt('Enter the number of server instances:', [1, 2, 3, 4, 6, 8], 1);\n writeConfig(configFileName, config);\n\n header('SERVER MEMORY');\n print('You can choose the amount of memory for each server instance.');\n print('The default is 512 MB, which is sufficient for getting started.');\n print('Note that only certain CPU units are compatible with memory units.');\n print('Consult AWS Fargate \"Task Definition Parameters\" for more information.');\n config.serverMemory = await chooseInt('Enter the server memory (MB):', [512, 1024, 2048, 4096, 8192, 16384], 512);\n writeConfig(configFileName, config);\n\n header('SERVER CPU');\n print('You can choose the amount of CPU for each server instance.');\n print('CPU is expressed as an integer using AWS CPU units');\n print('The default is 256, which is sufficient for getting started.');\n print('Note that only certain CPU units are compatible with memory units.');\n print('Consult AWS Fargate \"Task Definition Parameters\" for more information.');\n config.serverCpu = await chooseInt('Enter the server CPU:', [256, 512, 1024, 2048, 4096, 8192, 16384], 256);\n writeConfig(configFileName, config);\n\n header('SERVER IMAGE');\n print('Medplum uses Docker images for the API servers.');\n print('You can choose the image to use for the servers.');\n print('Docker images can be loaded from either Docker Hub or AWS ECR.');\n print('The default is the latest Medplum release.');\n config.serverImage = await ask('Enter the server image:', 'medplum/medplum-server:latest');\n writeConfig(configFileName, config);\n\n header('SIGNING KEY');\n print('Medplum uses AWS CloudFront Presigned URLs for binary content such as file uploads.');\n const { privateKey, publicKey, passphrase } = generateSigningKey();\n config.storagePublicKey = publicKey;\n writeConfig(configFileName, config);\n\n header('SSL CERTIFICATES');\n print(`Medplum will now check for existing SSL certificates for the subdomains.`);\n const allCerts = await listAllCertificates(config.region);\n print('Found ' + allCerts.length + ' certificate(s).');\n\n // Process certificates for each subdomain\n // Note: The \"api\" certificate must be created in the same region as the API\n // Note: The \"app\" and \"storage\" certificates must be created in us-east-1\n for (const { region, certName } of [\n { region: config.region, certName: 'api' },\n { region: 'us-east-1', certName: 'app' },\n { region: 'us-east-1', certName: 'storage' },\n ] as const) {\n print('');\n const arn = await processCert(config, allCerts, region, certName);\n config[getDomainCertSetting(certName)] = arn;\n writeConfig(configFileName, config);\n }\n\n header('AWS PARAMETER STORE');\n print('Medplum uses AWS Parameter Store to store sensitive configuration values.');\n print('These values will be encrypted at rest.');\n print(`The values will be stored in the \"/medplum/${config.name}\" path.`);\n\n const serverParams = {\n port: config.apiPort,\n baseUrl: `https://${config.apiDomainName}/`,\n appBaseUrl: `https://${config.appDomainName}/`,\n storageBaseUrl: `https://${config.storageDomainName}/binary/`,\n binaryStorage: `s3:${config.storageBucketName}`,\n signingKey: privateKey,\n signingKeyPassphrase: passphrase,\n supportEmail: supportEmail,\n };\n\n print(\n JSON.stringify(\n {\n ...serverParams,\n signingKey: '****',\n signingKeyPassphrase: '****',\n },\n null,\n 2\n )\n );\n\n await checkOk('Do you want to store these values in AWS Parameter Store?');\n await writeParameters(config.region, `/medplum/${config.name}/`, serverParams);\n\n header('DONE!');\n print('Medplum configuration complete.');\n print('You can now proceed to deploying the Medplum infrastructure with CDK.');\n print('Run:');\n print('');\n print(` npx cdk bootstrap -c config=${configFileName}`);\n print(` npx cdk synth -c config=${configFileName}`);\n if (config.region === 'us-east-1') {\n print(` npx cdk deploy -c config=${configFileName}`);\n } else {\n print(` npx cdk deploy -c config=${configFileName} --all`);\n }\n print('');\n print('See Medplum documentation for more information:');\n print('');\n print(' https://www.medplum.com/docs/self-hosting/install-on-aws');\n print('');\n}\n\n/** Prints to stdout. */\nfunction print(text: string): void {\n terminal.write(text + '\\n');\n}\n\n/** Prints a header with extra line spacing. */\nfunction header(text: string): void {\n print('\\n' + text + '\\n');\n}\n\n/** Prints a question and waits for user input. */\nfunction ask(text: string, defaultValue: string | number = ''): Promise<string> {\n return new Promise((resolve) => {\n terminal.question(text + (defaultValue ? ' (' + defaultValue + ')' : '') + ' ', (answer: string) => {\n resolve(answer || defaultValue.toString());\n });\n });\n}\n\n/** Prints a question and waits for user to choose one of the provided options. */\nasync function choose(text: string, options: (string | number)[], defaultValue = ''): Promise<string> {\n const str = text + ' [' + options.map((o) => (o === defaultValue ? '(' + o + ')' : o)).join('|') + ']';\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const answer = (await ask(str)) || defaultValue;\n if (options.includes(answer)) {\n return answer;\n }\n print('Please choose one of the following options: ' + options.join(', '));\n }\n}\n\n/** Prints a question and waits for the user to choose a valid integer option. */\nasync function chooseInt(text: string, options: number[], defaultValue = 0): Promise<number> {\n return parseInt(\n await choose(\n text,\n options.map((o) => o.toString()),\n defaultValue.toString()\n )\n );\n}\n\n/** Prints a question and waits for the user to choose yes or no. */\nasync function yesOrNo(text: string): Promise<boolean> {\n return (await choose(text, ['y', 'n'])).toLowerCase() === 'y';\n}\n\n/** Prints a question and waits for the user to confirm yes. Throws error on no, and exits the program. */\nasync function checkOk(text: string): Promise<void> {\n if (!(await yesOrNo(text))) {\n print('Exiting...');\n throw new Error('User cancelled');\n }\n}\n\n/**\n * Writes a config file to disk.\n * @param configFileName The config file name.\n * @param config The config file contents.\n */\nfunction writeConfig(configFileName: string, config: MedplumInfraConfig): void {\n writeFileSync(resolve(configFileName), JSON.stringify(config, undefined, 2), 'utf-8');\n}\n\n/**\n * Returns the current AWS account ID.\n * This is used as the default value for the \"accountNumber\" config setting.\n * @param region The AWS region.\n * @returns The AWS account ID.\n */\nasync function getAccountId(region: string): Promise<string | undefined> {\n try {\n const client = new STSClient({ region });\n const command = new GetCallerIdentityCommand({});\n const response = await client.send(command);\n return response.Account as string;\n } catch (err) {\n console.log('Warning: Unable to get AWS account ID', (err as Error).message);\n return undefined;\n }\n}\n\n/**\n * Returns a list of all AWS certificates.\n * This is used to find existing certificates for the subdomains.\n * If the primary region is not us-east-1, then certificates in us-east-1 will also be returned.\n * @param region The AWS region.\n * @returns The list of AWS Certificates.\n */\nasync function listAllCertificates(region: string): Promise<CertificateSummary[]> {\n const result = await listCertificates(region);\n if (region !== 'us-east-1') {\n const usEast1Result = await listCertificates('us-east-1');\n result.push(...usEast1Result);\n }\n return result;\n}\n\n/**\n * Returns a list of AWS Certificates.\n * This is used to find existing certificates for the subdomains.\n * @param region The AWS region.\n * @returns The list of AWS Certificates.\n */\nasync function listCertificates(region: string): Promise<CertificateSummary[]> {\n try {\n const client = new ACMClient({ region });\n const command = new ListCertificatesCommand({ MaxItems: 1000 });\n const response = await client.send(command);\n return response.CertificateSummaryList as CertificateSummary[];\n } catch (err) {\n console.log('Warning: Unable to list certificates', (err as Error).message);\n return [];\n }\n}\n\n/**\n * Processes a required certificate.\n *\n * 1. If the certificate already exists, return the ARN.\n * 2. If the certificate does not exist, and the user wants to create a new certificate, create it and return the ARN.\n * 3. If the certificate does not exist, and the user does not want to create a new certificate, return a placeholder.\n *\n * @param config In-progress config settings.\n * @param allCerts List of all existing certificates.\n * @param region The AWS region where the certificate is needed.\n * @param certName The name of the certificate (api, app, or storage).\n * @returns The ARN of the certificate or placeholder if a new certificate is needed.\n */\nasync function processCert(\n config: MedplumInfraConfig,\n allCerts: CertificateSummary[],\n region: string,\n certName: 'api' | 'app' | 'storage'\n): Promise<string> {\n const domainName = config[getDomainSetting(certName)];\n const existingCert = allCerts.find((cert) => cert.CertificateArn?.includes(region) && cert.DomainName === domainName);\n if (existingCert) {\n print(`Found existing certificate for \"${domainName}\" in \"${region}.`);\n return existingCert.CertificateArn as string;\n }\n\n print(`No existing certificate found for \"${domainName}\" in \"${region}.`);\n if (!(await yesOrNo('Do you want to request a new certificate?'))) {\n print(`Please add your certificate ARN to the config file in the \"${getDomainCertSetting(certName)}\" setting.`);\n return 'TODO';\n }\n\n const arn = await requestCert(region, domainName);\n print('Certificate ARN: ' + arn);\n return arn;\n}\n\n/**\n * Requests an AWS Certificate.\n * @param region The AWS region.\n * @param domain The domain name.\n * @returns The AWS Certificate ARN on success, or undefined on failure.\n */\nasync function requestCert(region: string, domain: string): Promise<string> {\n try {\n const validationMethod = await choose(\n 'Validate certificate using DNS or email validation?',\n ['dns', 'email'],\n 'dns'\n );\n const client = new ACMClient({ region });\n const command = new RequestCertificateCommand({\n DomainName: domain,\n ValidationMethod: validationMethod.toUpperCase(),\n });\n const response = await client.send(command);\n return response.CertificateArn as string;\n } catch (err) {\n console.log('Error: Unable to request certificate', (err as Error).message);\n return 'TODO';\n }\n}\n\n/**\n * Generates an AWS CloudFront signing key.\n *\n * Requirements:\n *\n * 1. It must be an SSH-2 RSA key pair.\n * 2. It must be in base64-encoded PEM format.\n * 3. It must be a 2048-bit key pair.\n *\n * See: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs\n *\n * @returns A new signing key.\n */\nfunction generateSigningKey(): { publicKey: string; privateKey: string; passphrase: string } {\n const passphrase = randomUUID();\n const signingKey = generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem',\n },\n privateKeyEncoding: {\n type: 'pkcs1',\n format: 'pem',\n cipher: 'aes-256-cbc',\n passphrase,\n },\n });\n return {\n publicKey: signingKey.publicKey,\n privateKey: signingKey.privateKey,\n passphrase,\n };\n}\n\n/**\n * Writes a parameter to AWS Parameter Store.\n * @param region The AWS region.\n * @param key The parameter key.\n * @param value The parameter value.\n */\nasync function writeParameter(region: string, key: string, value: string): Promise<void> {\n const client = new SSMClient({ region });\n const command = new PutParameterCommand({\n Name: key,\n Value: value,\n Type: 'SecureString',\n Overwrite: true,\n });\n await client.send(command);\n}\n\n/**\n * Writes a collection of parameters to AWS Parameter Store.\n * @param region The AWS region.\n * @param prefix The AWS Parameter Store prefix.\n * @param params The parameters to write.\n */\nasync function writeParameters(region: string, prefix: string, params: Record<string, string | number>): Promise<void> {\n for (const [key, value] of Object.entries(params)) {\n const valueStr = value.toString();\n if (valueStr) {\n await writeParameter(region, prefix + key, valueStr);\n }\n }\n}\n","import { Command } from 'commander';\nimport { describeStacksCommand } from './describe';\nimport { listStacksCommand } from './list';\nimport { updateAppCommand } from './update-app';\nimport { updateServerCommand } from './update-server';\nimport { initStackCommand } from './init';\n\nexport const aws = new Command('aws').description('Commands to manage AWS resources');\n\naws.command('init').description('Initialize a new Medplum AWS CloudFormation stacks').action(initStackCommand);\n\naws.command('list').description('List Medplum AWS CloudFormation stacks').action(listStacksCommand);\n\naws\n .command('describe')\n .description('Describe a Medplum AWS CloudFormation stack by tag')\n .argument('<tag>')\n .action(describeStacksCommand);\n\naws.command('update-server').description('Update the server image').argument('<tag>').action(updateServerCommand);\n\naws.command('update-app').description('Update the app site').argument('<tag>').action(updateAppCommand);\n","import { Command } from 'commander';\nimport { medplum } from '.';\nimport { createBot, deployBot, readBotConfigs, saveBot } from './utils';\nimport { MedplumClient } from '@medplum/core';\n\nexport const bot = new Command('bot');\n\n// Commands to deprecate\nexport const saveBotDeprecate = new Command('save-bot');\nexport const deployBotDeprecate = new Command('deploy-bot');\nexport const createBotDeprecate = new Command('create-bot');\n\nbot\n .command('save')\n .description('Saving the bot')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName);\n });\n\nbot\n .command('deploy')\n .description('Deploy the app to AWS')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName, true);\n });\n\nbot\n .command('create')\n .arguments('<botName> <projectId> <sourceFile> <distFile>')\n .description('Creating a bot')\n .action(async (botName, projectId, sourceFile, distFile) => {\n await createBot(medplum, [botName, projectId, sourceFile, distFile]);\n });\n\nexport async function botWrapper(medplum: MedplumClient, botName: string, deploy = false): Promise<void> {\n const botConfigs = readBotConfigs(botName);\n for (const botConfig of botConfigs) {\n const bot = await medplum.readResource('Bot', botConfig.id);\n await saveBot(medplum, botConfig, bot);\n if (deploy) {\n await deployBot(medplum, botConfig, bot);\n }\n }\n console.log(`Number of bots deployed: ${botConfigs.length}`);\n}\n\n// Deprecate bot commands\nsaveBotDeprecate\n .description('Saves the bot')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName);\n });\n\ndeployBotDeprecate\n .description('Deploy the bot to AWS')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName, true);\n });\n\ncreateBotDeprecate\n .arguments('<botName> <projectId> <sourceFile> <distFile>')\n .description('Creates and saves the bot')\n .action(async (botName, projectId, sourceFile, distFile) => {\n await createBot(medplum, [botName, projectId, sourceFile, distFile]);\n });\n","import { BundleEntry } from '@medplum/fhirtypes';\nimport { Command } from 'commander';\nimport { createReadStream, writeFile } from 'fs';\nimport { resolve } from 'path';\nimport { createInterface } from 'readline';\nimport { medplum } from '.';\nimport { prettyPrint } from './utils';\n\nexport const bulk = new Command('bulk');\n\nbulk\n .command('export')\n .option(\n '-e, --exportLevel <exportLevel>',\n 'Optional export level. Defaults to system level export. \"Group/:id\" - Group of Patients, \"Patient\" - All Patients.'\n )\n .option('-t, --types <types>', 'optional resource types to export')\n .option(\n '-s, --since <since>',\n 'optional Resources will be included in the response if their state has changed after the supplied time (e.g. if Resource.meta.lastUpdated is later than the supplied _since time).'\n )\n .action(async ({ exportLevel, types, since }) => {\n const response = await medplum.bulkExport(exportLevel, types, since);\n response.output?.forEach(async ({ type, url }) => {\n const data = await medplum.download(url as string);\n const fileName = `${type}.ndjson`;\n writeFile(`${fileName}`, await data.text(), () => {\n console.log(`${fileName} is created`);\n });\n });\n });\n\nbulk\n .command('import')\n .argument('<filename>', 'File Name')\n .option(\n '--numResourcesPerRequest <numResourcesPerRequest>',\n 'optional number of resources to import per batch request. Defaults to 25.',\n '25'\n )\n .action(async (fileName, options) => {\n const path = resolve(process.cwd(), fileName);\n const { numResourcesPerRequest } = options;\n\n await importFile(path, parseInt(numResourcesPerRequest));\n });\n\nasync function importFile(path: string, numResourcesPerRequest: number): Promise<void> {\n let entries = [] as BundleEntry[];\n const fileStream = createReadStream(path);\n const rl = createInterface({\n input: fileStream,\n });\n\n for await (const line of rl) {\n const resource = JSON.parse(line);\n entries.push({\n resource: resource,\n request: {\n method: 'POST',\n url: resource.resourceType,\n },\n });\n if (entries.length % numResourcesPerRequest === 0) {\n await sendBatchEntries(entries);\n entries = [];\n }\n }\n if (entries.length > 0) {\n await sendBatchEntries(entries);\n }\n}\n\nasync function sendBatchEntries(entries: BundleEntry[]): Promise<void> {\n const result = await medplum.executeBatch({\n resourceType: 'Bundle',\n type: 'transaction',\n entry: entries,\n });\n\n result.entry?.forEach((resultEntry) => {\n prettyPrint(resultEntry.response);\n });\n}\n","import { Command, Option } from 'commander';\nimport { medplum } from '.';\nimport { MedplumClient, LoginState, InviteBody } from '@medplum/core';\n\nexport const project = new Command('project');\n\nproject\n .command('list')\n .description('List of current projects')\n .action(async () => {\n projectList(medplum);\n });\n\nfunction projectList(medplum: MedplumClient): void {\n const logins = medplum.getLogins();\n\n const projects = logins\n .map((login: LoginState) => `${login.project.display} (${login.project.reference})`)\n .join('\\n\\n');\n\n console.log(projects);\n}\n\nproject\n .command('current')\n .description('Project you are currently on')\n .action(() => {\n const login = medplum.getActiveLogin();\n if (!login) {\n throw new Error('Unauthenticated: run `npx medplum login` to login');\n }\n console.log(`${login.project.display} (${login.project.reference})`);\n });\n\nproject\n .command('switch')\n .description('Switching to another project from the current one')\n .argument('<projectId>')\n .action(async (projectId) => {\n await switchProject(medplum, projectId);\n });\n\nproject\n .command('invite')\n .description('Invite a member to your current project (run npx medplum project current to confirm)')\n .arguments('<firstName> <lastName> <email>')\n .option('--send-email', 'If you want to send the email when inviting the user')\n .option('--admin', 'If the user you are inviting is an admin')\n .addOption(\n new Option('-r, --role <role>', 'Role of user')\n .choices(['Practitioner', 'Patient', 'RelatedPerson'])\n .default('Practitioner')\n )\n .action(async (firstName, lastName, email, options) => {\n const login = medplum.getActiveLogin();\n if (!login) {\n throw new Error('Unauthenticated: run `npx medplum login` to login');\n }\n if (!login.project?.reference) {\n throw new Error('No current project to invite user to');\n }\n\n const projectId = login.project.reference.split('/')[1];\n const inviteBody: InviteBody = {\n resourceType: options.role,\n firstName,\n lastName,\n email,\n sendEmail: !!options.sendEmail,\n admin: !!options.admin,\n };\n await inviteUser(projectId, inviteBody);\n });\n\nasync function switchProject(medplum: MedplumClient, projectId: string): Promise<void> {\n const logins = medplum.getLogins();\n const login = logins.find((login: LoginState) => login.project?.reference?.includes(projectId));\n if (!login) {\n console.log(`Error: project ${projectId} not found. Make sure you are added as a user to this project`);\n } else {\n await medplum.setActiveLogin(login);\n console.log(`Switched to project ${projectId}\\n`);\n }\n}\n\nasync function inviteUser(projectId: string, inviteBody: InviteBody): Promise<void> {\n try {\n await medplum.invite(projectId, inviteBody);\n if (inviteBody.sendEmail) {\n console.log('Email sent');\n }\n console.log('See your users at https://app.medplum.com/admin/users');\n } catch (err) {\n console.log('Error while sending invite ' + err);\n }\n}\n","import { convertToTransactionBundle } from '@medplum/core';\nimport { Command } from 'commander';\nimport { medplum } from '.';\nimport { prettyPrint } from './utils';\n\nexport const deleteObject = new Command('delete');\nexport const get = new Command('get');\nexport const patch = new Command('patch');\nexport const post = new Command('post');\nexport const put = new Command('put');\n\ndeleteObject.argument('<url>', 'Resource/$id').action(async (url) => {\n prettyPrint(await medplum.delete(cleanUrl(url)));\n});\n\nget\n .argument('<url>', 'Resource/$id')\n .option('--as-transaction', 'Print out the bundle as a transaction type')\n .action(async (url, options) => {\n const response = await medplum.get(cleanUrl(url));\n if (options.asTransaction) {\n prettyPrint(convertToTransactionBundle(response));\n } else {\n prettyPrint(response);\n }\n });\n\npatch.arguments('<url> <body>').action(async (url, body) => {\n prettyPrint(await medplum.patch(cleanUrl(url), parseBody(body)));\n});\n\npost.arguments('<url> <body>').action(async (url, body) => {\n prettyPrint(await medplum.post(cleanUrl(url), parseBody(body)));\n});\n\nput.arguments('<url> <body>').action(async (url, body) => {\n prettyPrint(await medplum.put(cleanUrl(url), parseBody(body)));\n});\n\nfunction parseBody(input: string | undefined): any {\n if (!input) {\n return undefined;\n }\n try {\n return JSON.parse(input);\n } catch (err) {\n return input;\n }\n}\n\nexport function cleanUrl(input: string): string {\n const knownPrefixes = ['admin/', 'auth/', 'fhir/R4'];\n if (knownPrefixes.some((p) => input.startsWith(p))) {\n // If the URL starts with a known prefix, return it as-is\n return input;\n }\n // Otherwise, default to FHIR\n return 'fhir/R4/' + input;\n}\n","import { ClientStorage } from '@medplum/core';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { resolve } from 'path';\n\nexport class FileSystemStorage extends ClientStorage {\n private readonly dirName: string;\n private readonly fileName: string;\n\n constructor() {\n super();\n this.dirName = resolve(homedir(), '.medplum');\n this.fileName = resolve(this.dirName, 'credentials');\n }\n\n clear(): void {\n this.writeFile({});\n }\n\n getString(key: string): string | undefined {\n return this.readFile()?.[key];\n }\n\n setString(key: string, value: string | undefined): void {\n const data = this.readFile() || {};\n if (value) {\n data[key] = value;\n } else {\n delete data[key];\n }\n this.writeFile(data);\n }\n\n private readFile(): Record<string, string> | undefined {\n if (existsSync(this.fileName)) {\n return JSON.parse(readFileSync(this.fileName, 'utf8'));\n }\n return undefined;\n }\n\n private writeFile(data: Record<string, string>): void {\n if (!existsSync(this.dirName)) {\n mkdirSync(this.dirName);\n }\n writeFileSync(this.fileName, JSON.stringify(data, null, 2), 'utf8');\n }\n}\n","import { MEDPLUM_VERSION, MedplumClient, normalizeErrorString } from '@medplum/core';\nimport { Command } from 'commander';\nimport dotenv from 'dotenv';\nimport { login, whoami } from './auth';\nimport { aws } from './aws/index';\nimport { bot, createBotDeprecate, deployBotDeprecate, saveBotDeprecate } from './bots';\nimport { bulk } from './bulk';\nimport { project } from './project';\nimport { deleteObject, get, patch, post, put } from './rest';\nimport { FileSystemStorage } from './storage';\n\nexport let medplum: MedplumClient;\n\nexport async function main(medplumClient: MedplumClient, argv: string[]): Promise<void> {\n medplum = medplumClient;\n\n // Legacy support for MEDPLUM_CLIENT_ID and MEDPLUM_CLIENT_SECRET environment variables\n const clientId = process.env['MEDPLUM_CLIENT_ID'];\n const clientSecret = process.env['MEDPLUM_CLIENT_SECRET'];\n if (clientId && clientSecret) {\n await medplum.startClientLogin(clientId, clientSecret);\n }\n try {\n const index = new Command('medplum').description('Command to access Medplum CLI');\n index.version(MEDPLUM_VERSION);\n\n // Auth commands\n index.addCommand(login);\n index.addCommand(whoami);\n\n // REST commands\n index.addCommand(get);\n index.addCommand(post);\n index.addCommand(patch);\n index.addCommand(put);\n index.addCommand(deleteObject);\n\n // Project\n index.addCommand(project);\n\n // Export\n index.addCommand(bulk);\n\n // Bot Commands\n index.addCommand(bot);\n\n // Deprecated Bot Commands\n index.addCommand(saveBotDeprecate);\n index.addCommand(deployBotDeprecate);\n index.addCommand(createBotDeprecate);\n\n // AWS commands\n index.addCommand(aws);\n\n await index.parseAsync(argv);\n } catch (err) {\n console.error('Error: ' + normalizeErrorString(err));\n }\n}\n\nexport function run(): void {\n dotenv.config();\n const baseUrl = process.env['MEDPLUM_BASE_URL'] || 'https://api.medplum.com/';\n const fhirUrlPath = process.env['MEDPLUM_FHIR_URL_PATH'] || '';\n const accessToken = process.env['MEDPLUM_CLIENT_ACCESS_TOKEN'] || '';\n\n const medplumClient = new MedplumClient({\n fetch,\n baseUrl,\n fhirUrlPath,\n storage: new FileSystemStorage(),\n onUnauthenticated: onUnauthenticated,\n });\n\n if (accessToken) {\n medplumClient.setAccessToken(accessToken);\n }\n main(medplumClient, process.argv).catch((err) => console.error('Unhandled error:', err));\n}\n\nif (require.main === module) {\n run();\n}\n\nfunction onUnauthenticated(): void {\n console.log('Unauthenticated: run `npx medplum login` to sign in');\n}\n"],"names":["Command","medplum","createServer","getDisplayString","normalizeErrorString","os","platform","exec","CloudFormationClient","CloudFrontClient","ECSClient","S3Client","ListStacksCommand","DescribeStacksCommand","DescribeStackResourcesCommand","path","resolve","existsSync","readFileSync","writeFile","fetch","mkdtempSync","join","tmpdir","pipeline","rmSync","readdirSync","writeFileSync","createReadStream","sep","PutObjectCommand","CreateInvalidationCommand","UpdateServiceCommand","STSClient","GetCallerIdentityCommand","ACMClient","ListCertificatesCommand","RequestCertificateCommand","randomUUID","generateKeyPairSync","SSMClient","PutParameterCommand","createInterface","Option","convertToTransactionBundle","ClientStorage","homedir","mkdirSync","MEDPLUM_VERSION","MedplumClient"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/auth.ts","../../../src/aws/utils.ts","../../../src/aws/describe.ts","../../../src/aws/list.ts","../../../src/utils.ts","../../../src/aws/update-app.ts","../../../src/aws/update-server.ts","../../../src/aws/init.ts","../../../src/aws/index.ts","../../../src/bots.ts","../../../src/bulk.ts","../../../src/project.ts","../../../src/rest.ts","../../../src/storage.ts","../../../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { medplum } from '.';\nimport { MedplumClient, getDisplayString, normalizeErrorString } from '@medplum/core';\nimport { platform } from 'os';\nimport { exec } from 'child_process';\nimport { createServer } from 'http';\n\nconst clientId = 'medplum-cli';\nconst redirectUri = 'http://localhost:9615';\n\nexport const login = new Command('login');\nexport const whoami = new Command('whoami');\n\nlogin.action(async () => {\n await startLogin(medplum);\n});\n\nwhoami.action(() => {\n printMe(medplum);\n});\n\nasync function startLogin(medplum: MedplumClient): Promise<void> {\n await startWebServer(medplum);\n\n const loginUrl = new URL('/oauth2/authorize', medplum.getBaseUrl());\n loginUrl.searchParams.set('client_id', clientId);\n loginUrl.searchParams.set('redirect_uri', redirectUri);\n loginUrl.searchParams.set('scope', 'openid');\n loginUrl.searchParams.set('response_type', 'code');\n loginUrl.searchParams.set('prompt', 'login');\n await openBrowser(loginUrl.toString());\n}\n\nasync function startWebServer(medplum: MedplumClient): Promise<void> {\n const server = createServer(async (req, res) => {\n const url = new URL(req.url as string, 'http://localhost:9615');\n const code = url.searchParams.get('code');\n if (url.pathname === '/' && code) {\n try {\n const profile = await medplum.processCode(code, { clientId, redirectUri });\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end(`Signed in as ${getDisplayString(profile)}. You may close this window.`);\n } catch (err) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end(`Error: ${normalizeErrorString(err)}`);\n } finally {\n server.close();\n }\n } else {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n }\n }).listen(9615);\n}\n\n/**\n * Opens a web browser to the specified URL.\n * See: https://hasinthaindrajee.medium.com/browser-sso-for-cli-applications-b0be743fa656\n * @param url The URL to open.\n */\nasync function openBrowser(url: string): Promise<void> {\n const os = platform();\n let cmd = undefined;\n switch (os) {\n case 'openbsd':\n case 'linux':\n cmd = `xdg-open '${url}'`;\n break;\n case 'darwin':\n cmd = `open '${url}'`;\n break;\n case 'win32':\n cmd = `cmd /c start \"\" \"${url}\"`;\n break;\n default:\n throw new Error('Unsupported platform: ' + os);\n }\n exec(cmd);\n}\n\n/**\n * Prints the current user and project.\n * @param medplum The Medplum client.\n */\nfunction printMe(medplum: MedplumClient): void {\n const loginState = medplum.getActiveLogin();\n if (loginState) {\n console.log(`Server: ${medplum.getBaseUrl()}`);\n console.log(`Profile: ${loginState.profile?.display} (${loginState.profile?.reference})`);\n console.log(`Project: ${loginState.project?.display} (${loginState.project?.reference})`);\n } else {\n console.log('Not logged in');\n }\n}\n","import {\n CloudFormationClient,\n DescribeStackResourcesCommand,\n DescribeStacksCommand,\n ListStacksCommand,\n Stack,\n StackResource,\n StackSummary,\n} from '@aws-sdk/client-cloudformation';\nimport { CloudFrontClient } from '@aws-sdk/client-cloudfront';\nimport { ECSClient } from '@aws-sdk/client-ecs';\nimport { S3Client } from '@aws-sdk/client-s3';\n\nexport interface MedplumStackDetails {\n stack: Stack;\n tag: string;\n ecsCluster?: StackResource;\n ecsService?: StackResource;\n appBucket?: StackResource;\n appDistribution?: StackResource;\n storageBucket?: StackResource;\n}\n\nexport const cloudFormationClient = new CloudFormationClient({});\nexport const cloudFrontClient = new CloudFrontClient({});\nexport const ecsClient = new ECSClient({});\nexport const s3Client = new S3Client({});\nexport const tagKey = 'medplum:environment';\n\n/**\n * Returns a list of all AWS CloudFormation stacks (both Medplum and non-Medplum).\n * @returns List of AWS CloudFormation stacks.\n */\nexport async function getAllStacks(): Promise<(StackSummary & { StackName: string })[]> {\n const listResult = await cloudFormationClient.send(new ListStacksCommand({}));\n return (\n (listResult.StackSummaries?.filter((s) => s.StackName && s.StackStatus !== 'DELETE_COMPLETE') as (StackSummary & {\n StackName: string;\n })[]) || []\n );\n}\n\n/**\n * Returns Medplum stack details for the given tag.\n * @param tag The Medplum stack tag.\n * @returns The Medplum stack details.\n */\nexport async function getStackByTag(tag: string): Promise<MedplumStackDetails | undefined> {\n const stackSummaries = await getAllStacks();\n for (const stackSummary of stackSummaries) {\n const stackName = stackSummary.StackName;\n const details = await getStackDetails(stackName);\n if (details?.tag === tag) {\n return details;\n }\n }\n return undefined;\n}\n\n/**\n * Returns Medplum stack details for the given stack name.\n * @param stackName The CloudFormation stack name.\n * @returns The Medplum stack details.\n */\nexport async function getStackDetails(stackName: string): Promise<MedplumStackDetails | undefined> {\n const describeStacksCommand = new DescribeStacksCommand({ StackName: stackName });\n const stackDetails = await cloudFormationClient.send(describeStacksCommand);\n const stack = stackDetails?.Stacks?.[0];\n const medplumTag = stack?.Tags?.find((tag) => tag.Key === tagKey);\n if (!medplumTag) {\n return undefined;\n }\n\n const stackResources = await cloudFormationClient.send(new DescribeStackResourcesCommand({ StackName: stackName }));\n if (!stackResources.StackResources) {\n return undefined;\n }\n\n const result: MedplumStackDetails = {\n stack: stack as Stack,\n tag: medplumTag.Value as string,\n };\n\n for (const resource of stackResources.StackResources) {\n if (resource.ResourceType === 'AWS::ECS::Cluster') {\n result.ecsCluster = resource;\n } else if (resource.ResourceType === 'AWS::ECS::Service') {\n result.ecsService = resource;\n } else if (\n resource.ResourceType === 'AWS::S3::Bucket' &&\n resource.LogicalResourceId?.startsWith('FrontEndAppBucket')\n ) {\n result.appBucket = resource;\n } else if (\n resource.ResourceType === 'AWS::S3::Bucket' &&\n resource.LogicalResourceId?.startsWith('StorageStorageBucket')\n ) {\n result.storageBucket = resource;\n } else if (\n resource.ResourceType === 'AWS::CloudFront::Distribution' &&\n resource.LogicalResourceId?.startsWith('FrontEndAppDistribution')\n ) {\n result.appDistribution = resource;\n }\n }\n\n return result;\n}\n\n/**\n * Prints the given Medplum stack details to stdout.\n * @param details The Medplum stack details.\n */\nexport function printStackDetails(details: MedplumStackDetails): void {\n console.log(`Medplum Tag: ${details.tag}`);\n console.log(`Stack Name: ${details.stack.StackName}`);\n console.log(`Stack ID: ${details.stack.StackId}`);\n console.log(`Status: ${details.stack.StackStatus}`);\n console.log(`ECS Cluster: ${details.ecsCluster?.PhysicalResourceId}`);\n console.log(`ECS Service: ${getEcsServiceName(details.ecsService)}`);\n console.log(`App Bucket: ${details.appBucket?.PhysicalResourceId}`);\n console.log(`Storage Bucket: ${details.storageBucket?.PhysicalResourceId}`);\n}\n\n/**\n * Parses the ECS service name from the given AWS ECS service resource.\n * @param resource The AWS ECS service resource.\n * @returns The ECS service name.\n */\nexport function getEcsServiceName(resource: StackResource | undefined): string | undefined {\n return resource?.PhysicalResourceId?.split('/')?.pop() || '';\n}\n","import { getStackByTag, printStackDetails } from './utils';\n\n/**\n * The AWS \"describe\" command prints details about a Medplum CloudFormation stack.\n * @param tag The Medplum stack tag.\n */\nexport async function describeStacksCommand(tag: string): Promise<void> {\n const details = await getStackByTag(tag);\n if (!details) {\n console.log('Stack not found');\n return;\n }\n printStackDetails(details);\n}\n","import { getAllStacks, getStackDetails, printStackDetails } from './utils';\n\n/**\n * The AWS \"list\" command prints summary details about all Medplum CloudFormation stacks.\n */\nexport async function listStacksCommand(): Promise<void> {\n const stackSummaries = await getAllStacks();\n for (const stackSummary of stackSummaries) {\n const stackName = stackSummary.StackName;\n const details = await getStackDetails(stackName);\n if (!details) {\n continue;\n }\n printStackDetails(details);\n console.log('');\n }\n}\n","import { MedplumClient } from '@medplum/core';\nimport { Bot, OperationOutcome } from '@medplum/fhirtypes';\nimport { existsSync, readFileSync, writeFile } from 'fs';\nimport { resolve } from 'path';\nimport internal from 'stream';\nimport tar from 'tar';\n\ninterface MedplumConfig {\n readonly baseUrl?: string;\n readonly clientId?: string;\n readonly googleClientId?: string;\n readonly recaptchaSiteKey?: string;\n readonly registerEnabled?: boolean;\n readonly bots?: MedplumBotConfig[];\n}\n\ninterface MedplumBotConfig {\n readonly name: string;\n readonly id: string;\n readonly source: string;\n readonly dist?: string;\n}\n\nexport function prettyPrint(input: unknown): void {\n console.log(JSON.stringify(input, null, 2));\n}\n\nexport async function saveBot(medplum: MedplumClient, botConfig: MedplumBotConfig, bot: Bot): Promise<void> {\n const code = readFileContents(botConfig.source);\n if (!code) {\n return;\n }\n\n try {\n console.log('Update bot code.....');\n const updateResult = await medplum.updateResource({\n ...bot,\n code,\n });\n if (!updateResult) {\n console.log('Bot not modified');\n } else {\n console.log('Success! New bot version: ' + updateResult.meta?.versionId);\n }\n } catch (err) {\n console.log('Update error: ', err);\n }\n}\n\nexport async function deployBot(medplum: MedplumClient, botConfig: MedplumBotConfig, bot: Bot): Promise<void> {\n const code = readFileContents(botConfig.dist ?? botConfig.source);\n if (!code) {\n return;\n }\n\n try {\n console.log('Deploying bot...');\n const deployResult = (await medplum.post(medplum.fhirUrl('Bot', bot.id as string, '$deploy'), {\n code,\n })) as OperationOutcome;\n console.log('Deploy result: ' + deployResult.issue?.[0]?.details?.text);\n } catch (err) {\n console.log('Deploy error: ', err);\n }\n}\n\nexport async function createBot(medplum: MedplumClient, argv: string[]): Promise<void> {\n if (argv.length < 4) {\n console.log(`Error: command needs to be npx medplum <new-bot-name> <project-id> <source-file> <dist-file>`);\n return;\n }\n const botName = argv[0];\n const projectId = argv[1];\n const sourceFile = argv[2];\n const distFile = argv[3];\n\n try {\n const body = {\n name: botName,\n description: '',\n };\n const newBot = await medplum.post('admin/projects/' + projectId + '/bot', body);\n const bot = await medplum.readResource('Bot', newBot.id);\n\n const botConfig = {\n name: botName,\n id: newBot.id,\n source: sourceFile,\n dist: distFile,\n };\n await saveBot(medplum, botConfig as MedplumBotConfig, bot);\n console.log(`Success! Bot created: ${bot.id}`);\n\n addBotToConfig(botConfig);\n } catch (err) {\n console.log('Error while creating new bot: ' + err);\n }\n}\n\nexport function readBotConfigs(botName: string): MedplumBotConfig[] {\n const regExBotName = new RegExp('^' + escapeRegex(botName).replace(/\\\\\\*/g, '.*') + '$');\n const botConfigs = readConfig()?.bots?.filter((b) => regExBotName.test(b.name));\n if (!botConfigs) {\n return [];\n }\n return botConfigs;\n}\n\nexport function readConfig(tagName?: string): MedplumConfig | undefined {\n const fileName = tagName ? `medplum.${tagName}.config.json` : 'medplum.config.json';\n const content = readFileContents(fileName);\n if (!content) {\n return undefined;\n }\n return JSON.parse(content);\n}\n\nfunction readFileContents(fileName: string): string | undefined {\n const path = resolve(process.cwd(), fileName);\n if (!existsSync(path)) {\n console.log('Error: File does not exist: ' + path);\n return '';\n }\n return readFileSync(path, 'utf8');\n}\n\nfunction addBotToConfig(botConfig: MedplumBotConfig): void {\n const config = readConfig();\n config?.bots?.push(botConfig);\n writeFile('medplum.config.json', JSON.stringify(config), () => {\n console.log(`Bot added to config: ${botConfig.id}`);\n });\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\n/**\n * Creates a safe tar extractor that limits the number of files and total size.\n *\n * Expanding archive files without controlling resource consumption is security-sensitive\n *\n * See: https://sonarcloud.io/organizations/medplum/rules?open=typescript%3AS5042&rule_key=typescript%3AS5042\n * @param destinationDir The destination directory where all files will be extracted.\n * @returns A tar file extractor.\n */\nexport function safeTarExtractor(destinationDir: string): internal.Writable {\n const MAX_FILES = 100;\n const MAX_SIZE = 10 * 1024 * 1024; // 10 MB\n\n let fileCount = 0;\n let totalSize = 0;\n\n return tar.x({\n cwd: destinationDir,\n filter: (_path, entry) => {\n fileCount++;\n if (fileCount > MAX_FILES) {\n throw new Error('Tar extractor reached max number of files');\n }\n\n totalSize += entry.size;\n if (totalSize > MAX_SIZE) {\n throw new Error('Tar extractor reached max size');\n }\n\n return true;\n },\n });\n}\n","import { CreateInvalidationCommand } from '@aws-sdk/client-cloudfront';\nimport { PutObjectCommand } from '@aws-sdk/client-s3';\nimport fastGlob from 'fast-glob';\nimport { createReadStream, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'fs';\nimport fetch from 'node-fetch';\nimport { tmpdir } from 'os';\nimport { join, sep } from 'path';\nimport { pipeline } from 'stream/promises';\nimport { readConfig, safeTarExtractor } from '../utils';\nimport { cloudFrontClient, getStackByTag, s3Client } from './utils';\n\n/**\n * The AWS \"update-app\" command updates the Medplum app in a Medplum CloudFormation stack to the latest version.\n * @param tag The Medplum stack tag.\n */\nexport async function updateAppCommand(tag: string): Promise<void> {\n const config = readConfig(tag);\n if (!config) {\n console.log('Config not found');\n return;\n }\n const details = await getStackByTag(tag);\n if (!details) {\n console.log('Stack not found');\n return;\n }\n const appBucket = details.appBucket;\n if (!appBucket) {\n console.log('App bucket not found');\n return;\n }\n\n const tmpDir = await downloadNpmPackage('@medplum/app', 'latest');\n\n // Replace variables in the app\n replaceVariables(tmpDir, {\n MEDPLUM_BASE_URL: config.baseUrl as string,\n MEDPLUM_CLIENT_ID: config.clientId || '',\n GOOGLE_CLIENT_ID: config.googleClientId || '',\n RECAPTCHA_SITE_KEY: config.recaptchaSiteKey || '',\n MEDPLUM_REGISTER_ENABLED: config.registerEnabled ? 'true' : 'false',\n });\n\n // Upload the app to S3 with correct content-type and cache-control\n await uploadAppToS3(tmpDir, appBucket.PhysicalResourceId as string);\n\n // Create a CloudFront invalidation to clear any cached resources\n if (details.appDistribution?.PhysicalResourceId) {\n await createInvalidation(details.appDistribution.PhysicalResourceId);\n }\n\n console.log('Done');\n}\n\n/**\n * Returns NPM package metadata for a given package name.\n * See: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#getpackageversion\n * @param packageName The npm package name.\n * @param version The npm package version string.\n * @returns The package.json metadata content.\n */\nasync function getNpmPackageMetadata(packageName: string, version: string): Promise<any> {\n const url = `https://registry.npmjs.org/${packageName}/${version}`;\n const response = await fetch(url);\n return response.json();\n}\n\n/**\n * Downloads and extracts an NPM package.\n * @param packageName The NPM package name.\n * @param version The NPM package version or \"latest\".\n * @returns Path to temporary directory where the package was downloaded and extracted.\n */\nasync function downloadNpmPackage(packageName: string, version: string): Promise<string> {\n const packageMetadata = await getNpmPackageMetadata(packageName, version);\n const tarballUrl = packageMetadata.dist.tarball as string;\n const tmpDir = mkdtempSync(join(tmpdir(), 'tarball-'));\n try {\n const response = await fetch(tarballUrl);\n const extractor = safeTarExtractor(tmpDir);\n await pipeline(response.body, extractor);\n return join(tmpDir, 'package', 'dist');\n } catch (error) {\n rmSync(tmpDir, { recursive: true, force: true });\n throw error;\n }\n}\n\n/**\n * Replaces variables in all JS files in the given folder.\n * @param folderName The folder name of the files.\n * @param replacements The collection of variable placeholders and replacements.\n */\nfunction replaceVariables(folderName: string, replacements: Record<string, string>): void {\n for (const item of readdirSync(folderName, { withFileTypes: true })) {\n const itemPath = join(folderName, item.name);\n if (item.isDirectory()) {\n replaceVariables(itemPath, replacements);\n } else if (item.isFile() && itemPath.endsWith('.js')) {\n replaceVariablesInFile(itemPath, replacements);\n }\n }\n}\n\n/**\n * Replaces variables in the JS file.\n * @param fileName The file name.\n * @param replacements The collection of variable placeholders and replacements.\n */\nfunction replaceVariablesInFile(fileName: string, replacements: Record<string, string>): void {\n let contents = readFileSync(fileName, 'utf-8');\n for (const [placeholder, replacement] of Object.entries(replacements)) {\n contents = contents.replaceAll(`process.env.${placeholder}`, `'${replacement}'`);\n }\n writeFileSync(fileName, contents);\n}\n\n/**\n * Uploads the app to S3.\n * Ensures correct content-type and cache-control for each file.\n * @param tmpDir The temporary directory where the app is located.\n * @param bucketName The destination S3 bucket name.\n */\nasync function uploadAppToS3(tmpDir: string, bucketName: string): Promise<void> {\n // Manually iterate and upload files\n // Automatic content-type detection is not reliable on Microsoft Windows\n // So we explicitly set content-type\n const uploadPatterns: [string, string, boolean][] = [\n // Cached\n // These files generally have a hash, so they can be cached forever\n // It is important to upload them first to avoid broken references from index.html\n ['css/**/*.css', 'text/css', true],\n ['css/**/*.css.map', 'application/json', true],\n ['img/**/*.png', 'image/png', true],\n ['img/**/*.svg', 'image/svg+xml', true],\n ['js/**/*.js', 'application/javascript', true],\n ['js/**/*.js.map', 'application/json', true],\n ['js/**/*.txt', 'text/plain', true],\n ['favicon.ico', 'image/vnd.microsoft.icon', true],\n ['robots.txt', 'text/plain', true],\n ['workbox-*.js', 'application/javascript', true],\n ['workbox-*.js.map', 'application/json', true],\n\n // Not cached\n ['manifest.webmanifest', 'application/manifest+json', false],\n ['service-worker.js', 'application/javascript', false],\n ['service-worker.js.map', 'application/json', false],\n ['index.html', 'text/html', false],\n ];\n for (const uploadPattern of uploadPatterns) {\n await uploadFolderToS3({\n rootDir: tmpDir,\n bucketName,\n fileNamePattern: uploadPattern[0],\n contentType: uploadPattern[1],\n cached: uploadPattern[2],\n });\n }\n}\n\n/**\n * Uploads a directory of files to S3.\n * @param options The upload options such as bucket name, content type, and cache control.\n * @param options.rootDir The root directory of the upload.\n * @param options.bucketName The destination bucket name.\n * @param options.fileNamePattern The glob file pattern to upload.\n * @param options.contentType The content type MIME type.\n * @param options.cached True to mark as public and cached forever.\n */\nasync function uploadFolderToS3(options: {\n rootDir: string;\n bucketName: string;\n fileNamePattern: string;\n contentType: string;\n cached: boolean;\n}): Promise<void> {\n const items = fastGlob.sync(options.fileNamePattern, { cwd: options.rootDir });\n for (const item of items) {\n await uploadFileToS3(join(options.rootDir, item), options);\n }\n}\n\n/**\n * Uploads a file to S3.\n * @param filePath The file path.\n * @param options The upload options such as bucket name, content type, and cache control.\n * @param options.rootDir The root directory of the upload.\n * @param options.bucketName The destination bucket name.\n * @param options.contentType The content type MIME type.\n * @param options.cached True to mark as public and cached forever.\n */\nasync function uploadFileToS3(\n filePath: string,\n options: {\n rootDir: string;\n bucketName: string;\n contentType: string;\n cached: boolean;\n }\n): Promise<void> {\n const fileStream = createReadStream(filePath);\n const s3Key = filePath\n .substring(options.rootDir.length + 1)\n .split(sep)\n .join('/');\n\n const putObjectParams = {\n Bucket: options.bucketName,\n Key: s3Key,\n Body: fileStream,\n ContentType: options.contentType,\n CacheControl: options.cached ? 'public, max-age=31536000' : 'no-cache, no-store, must-revalidate',\n };\n\n console.log(`Uploading ${s3Key} to ${options.bucketName}...`);\n await s3Client.send(new PutObjectCommand(putObjectParams));\n}\n\n/**\n * Creates a CloudFront invalidation to clear the cache for all files.\n * This is not strictly necessary, but it helps to ensure that the latest version of the app is served.\n * In a perfect world, every deploy is clean, and hashed resources should be cached forever.\n * However, we do not recalculate hashes after variable replacements.\n * So if variables change, we need to invalidate the cache.\n * @param distributionId The CloudFront distribution ID.\n */\nasync function createInvalidation(distributionId: string): Promise<void> {\n const response = await cloudFrontClient.send(\n new CreateInvalidationCommand({\n DistributionId: distributionId,\n InvalidationBatch: {\n CallerReference: `invalidate-all-${Date.now()}`,\n Paths: {\n Quantity: 1,\n Items: ['/*'],\n },\n },\n })\n );\n console.log(`Created invalidation with ID: ${response.Invalidation?.Id}`);\n}\n","import { UpdateServiceCommand } from '@aws-sdk/client-ecs';\nimport { ecsClient, getEcsServiceName, getStackByTag } from './utils';\n\n/**\n * The AWS \"update-server\" command updates the Medplum server in a Medplum CloudFormation stack.\n * @param tag The Medplum stack tag.\n */\nexport async function updateServerCommand(tag: string): Promise<void> {\n const details = await getStackByTag(tag);\n if (!details) {\n console.log('Stack not found');\n return;\n }\n const ecsCluster = details.ecsCluster?.PhysicalResourceId;\n if (!ecsCluster) {\n console.log('ECS Cluster not found');\n return;\n }\n const ecsService = getEcsServiceName(details.ecsService);\n if (!ecsService) {\n console.log('ECS Service not found');\n return;\n }\n await ecsClient.send(\n new UpdateServiceCommand({\n cluster: ecsCluster,\n service: ecsService,\n forceNewDeployment: true,\n })\n );\n console.log(`Service \"${ecsService}\" updated successfully.`);\n}\n","import { ACMClient, CertificateSummary, ListCertificatesCommand, RequestCertificateCommand } from '@aws-sdk/client-acm';\nimport { PutParameterCommand, SSMClient } from '@aws-sdk/client-ssm';\nimport { GetCallerIdentityCommand, STSClient } from '@aws-sdk/client-sts';\nimport { MedplumInfraConfig } from '@medplum/core';\nimport { generateKeyPairSync, randomUUID } from 'crypto';\nimport { existsSync, writeFileSync } from 'fs';\nimport { resolve } from 'path';\nimport readline from 'readline';\n\ntype MedplumDomainType = 'api' | 'app' | 'storage';\ntype MedplumDomainSetting = `${MedplumDomainType}DomainName`;\ntype MedplumDomainCertSetting = `${MedplumDomainType}SslCertArn`;\n\nconst getDomainSetting = (domain: MedplumDomainType): MedplumDomainSetting => `${domain}DomainName`;\nconst getDomainCertSetting = (domain: MedplumDomainType): MedplumDomainCertSetting => `${domain}SslCertArn`;\n\nlet terminal: readline.Interface;\n\nexport async function initStackCommand(): Promise<void> {\n const config = { apiPort: 8103, region: 'us-east-1' } as MedplumInfraConfig;\n terminal = readline.createInterface({ input: process.stdin, output: process.stdout });\n header('MEDPLUM');\n print('This tool prepares the necessary prerequisites for deploying Medplum in your AWS account.');\n print('');\n print('Most Medplum infrastructure is deployed using the AWS CDK.');\n print('However, some AWS resources must be created manually, such as email addresses and SSL certificates.');\n print('This tool will help you create those resources.');\n print('');\n print('Upon completion, this tool will:');\n print(' 1. Generate a Medplum CDK config file (i.e., medplum.demo.config.json)');\n print(' 2. Optionally generate an AWS CloudFront signing key');\n print(' 3. Optionally request SSL certificates from AWS Certificate Manager');\n print(' 4. Optionally write server config settings to AWS Parameter Store');\n print('');\n print('The Medplum infra config file is an input to the Medplum CDK.');\n print('The Medplum CDK will create and manage the necessary AWS resources.');\n print('');\n print('We will ask a series of questions to generate your infra config file.');\n print('Some questions have predefined options in [square brackets].');\n print('Some questions have default values in (parentheses), which you can accept by pressing Enter.');\n print('Press Ctrl+C at any time to exit.');\n\n header('ENVIRONMENT NAME');\n print('Medplum deployments have a short environment name such as \"prod\", \"staging\", \"alice\", or \"demo\".');\n print('The environment name is used in multiple places:');\n print(' 1. As part of config file names (i.e., medplum.demo.config.json)');\n print(' 2. As the base of CloudFormation stack names (i.e., MedplumDemo)');\n print(' 3. AWS Parameter Store keys (i.e., /medplum/demo/...)');\n config.name = await ask('What is your environment name?', 'demo');\n print('Using environment name \"' + config.name + '\"...');\n\n header('CONFIG FILE');\n print('Medplum Infrastructure will create a config file in the current directory.');\n const configFileName = await ask('What is the config file name?', `medplum.${config.name}.config.json`);\n if (existsSync(configFileName)) {\n print('Config file already exists.');\n await checkOk('Do you want to overwrite the config file?');\n }\n print('Using config file \"' + configFileName + '\"...');\n writeConfig(configFileName, config);\n\n header('AWS REGION');\n print('Most Medplum resources will be created in a single AWS region.');\n config.region = await ask('Enter your AWS region:', 'us-east-1');\n writeConfig(configFileName, config);\n\n header('AWS ACCOUNT NUMBER');\n print('Medplum Infrastructure will use your AWS account number to create AWS resources.');\n const currentAccountId = await getAccountId(config.region);\n print('Using the AWS CLI, your current account ID is: ' + currentAccountId);\n config.accountNumber = await ask('What is your AWS account number?', currentAccountId);\n writeConfig(configFileName, config);\n\n header('STACK NAME');\n print('Medplum will create a CloudFormation stack to manage AWS resources.');\n const defaultStackName = 'Medplum' + config.name.charAt(0).toUpperCase() + config.name.slice(1);\n config.stackName = await ask('Enter your CloudFormation stack name?', defaultStackName);\n writeConfig(configFileName, config);\n\n header('BASE DOMAIN NAME');\n print('Medplum deploys multiple subdomains for various services.');\n print('');\n print('For example, \"api.\" for the REST API and \"app.\" for the web application.');\n print('The base domain name is the common suffix for all subdomains.');\n print('');\n print('For example, if your base domain name is \"example.com\",');\n print('then the REST API will be \"api.example.com\".');\n print('');\n print('Note that you must own the base domain, and it must use Route53 DNS.');\n print('Medplum will create subdomains for you, but you must configure the base domain.');\n while (!config.domainName) {\n config.domainName = await ask('Enter your base domain name:');\n }\n writeConfig(configFileName, config);\n\n header('SUPPORT EMAIL');\n print('Medplum sends transactional emails to users.');\n print('For example, emails to new users or for password reset.');\n print('Medplum will use the support email address to send these emails.');\n print('Note that you must verify the support email address in SES.');\n const supportEmail = await ask('Enter your support email address:');\n\n header('API DOMAIN NAME');\n print('Medplum deploys a REST API for the backend services.');\n config.apiDomainName = await ask('Enter your REST API domain name:', 'api.' + config.domainName);\n writeConfig(configFileName, config);\n\n header('APP DOMAIN NAME');\n print('Medplum deploys a web application for the user interface.');\n config.appDomainName = await ask('Enter your web application domain name:', 'app.' + config.domainName);\n writeConfig(configFileName, config);\n\n header('STORAGE DOMAIN NAME');\n print('Medplum deploys a storage service for file uploads.');\n config.storageDomainName = await ask('Enter your storage domain name:', 'storage.' + config.domainName);\n writeConfig(configFileName, config);\n\n header('STORAGE BUCKET');\n print('Medplum uses an S3 bucket to store binary content such as file uploads.');\n print('Medplum will create a the S3 bucket as part of the CloudFormation stack.');\n config.storageBucketName = await ask('Enter your storage bucket name:', 'medplum-' + config.name + '-storage');\n writeConfig(configFileName, config);\n\n header('MAX AVAILABILITY ZONES');\n print('Medplum API servers can be deployed in multiple availability zones.');\n print('This provides redundancy and high availability.');\n print('However, it also increases the cost of the deployment.');\n print('If you want to use all availability zones, choose a large number such as 99.');\n print('If you want to restrict the number, for example to manage EIP limits,');\n print('then choose a small number such as 1 or 2.');\n config.maxAzs = await chooseInt('Enter the maximum number of availability zones:', [1, 2, 3, 99], 2);\n\n header('DATABASE INSTANCES');\n print('Medplum uses a relational database to store data.');\n print('You can set up your own database,');\n print('or Medplum can create a new RDS database as part of the CloudFormation stack.');\n if (await yesOrNo('Do you want to create a new RDS database as part of the CloudFormation stack?')) {\n print('Medplum will create a new RDS database as part of the CloudFormation stack.');\n print('');\n print('If you need high availability, you can choose multiple instances.');\n print('Use 1 for a single instance, or 2 for a primary and a standby.');\n config.rdsInstances = await chooseInt('Enter the number of database instances:', [1, 2], 1);\n } else {\n print('Medplum will not create a new RDS database.');\n print('Please create a new RDS database and enter the database name, username, and password.');\n print('Set the AWS Secrets Manager secret ARN in the config file in the \"rdsSecretsArn\" setting.');\n config.rdsSecretsArn = 'TODO';\n }\n writeConfig(configFileName, config);\n\n header('SERVER INSTANCES');\n print('Medplum uses AWS Fargate to run the API servers.');\n print('Medplum will create a new Fargate cluster as part of the CloudFormation stack.');\n print('Fargate will automatically scale the number of servers up and down.');\n print('If you need high availability, you can choose multiple instances.');\n config.desiredServerCount = await chooseInt('Enter the number of server instances:', [1, 2, 3, 4, 6, 8], 1);\n writeConfig(configFileName, config);\n\n header('SERVER MEMORY');\n print('You can choose the amount of memory for each server instance.');\n print('The default is 512 MB, which is sufficient for getting started.');\n print('Note that only certain CPU units are compatible with memory units.');\n print('Consult AWS Fargate \"Task Definition Parameters\" for more information.');\n config.serverMemory = await chooseInt('Enter the server memory (MB):', [512, 1024, 2048, 4096, 8192, 16384], 512);\n writeConfig(configFileName, config);\n\n header('SERVER CPU');\n print('You can choose the amount of CPU for each server instance.');\n print('CPU is expressed as an integer using AWS CPU units');\n print('The default is 256, which is sufficient for getting started.');\n print('Note that only certain CPU units are compatible with memory units.');\n print('Consult AWS Fargate \"Task Definition Parameters\" for more information.');\n config.serverCpu = await chooseInt('Enter the server CPU:', [256, 512, 1024, 2048, 4096, 8192, 16384], 256);\n writeConfig(configFileName, config);\n\n header('SERVER IMAGE');\n print('Medplum uses Docker images for the API servers.');\n print('You can choose the image to use for the servers.');\n print('Docker images can be loaded from either Docker Hub or AWS ECR.');\n print('The default is the latest Medplum release.');\n config.serverImage = await ask('Enter the server image:', 'medplum/medplum-server:latest');\n writeConfig(configFileName, config);\n\n header('SIGNING KEY');\n print('Medplum uses AWS CloudFront Presigned URLs for binary content such as file uploads.');\n const { privateKey, publicKey, passphrase } = generateSigningKey();\n config.storagePublicKey = publicKey;\n writeConfig(configFileName, config);\n\n header('SSL CERTIFICATES');\n print(`Medplum will now check for existing SSL certificates for the subdomains.`);\n const allCerts = await listAllCertificates(config.region);\n print('Found ' + allCerts.length + ' certificate(s).');\n\n // Process certificates for each subdomain\n // Note: The \"api\" certificate must be created in the same region as the API\n // Note: The \"app\" and \"storage\" certificates must be created in us-east-1\n for (const { region, certName } of [\n { region: config.region, certName: 'api' },\n { region: 'us-east-1', certName: 'app' },\n { region: 'us-east-1', certName: 'storage' },\n ] as const) {\n print('');\n const arn = await processCert(config, allCerts, region, certName);\n config[getDomainCertSetting(certName)] = arn;\n writeConfig(configFileName, config);\n }\n\n header('AWS PARAMETER STORE');\n print('Medplum uses AWS Parameter Store to store sensitive configuration values.');\n print('These values will be encrypted at rest.');\n print(`The values will be stored in the \"/medplum/${config.name}\" path.`);\n\n const serverParams = {\n port: config.apiPort,\n baseUrl: `https://${config.apiDomainName}/`,\n appBaseUrl: `https://${config.appDomainName}/`,\n storageBaseUrl: `https://${config.storageDomainName}/binary/`,\n binaryStorage: `s3:${config.storageBucketName}`,\n signingKey: privateKey,\n signingKeyPassphrase: passphrase,\n supportEmail: supportEmail,\n };\n\n print(\n JSON.stringify(\n {\n ...serverParams,\n signingKey: '****',\n signingKeyPassphrase: '****',\n },\n null,\n 2\n )\n );\n\n await checkOk('Do you want to store these values in AWS Parameter Store?');\n await writeParameters(config.region, `/medplum/${config.name}/`, serverParams);\n\n header('DONE!');\n print('Medplum configuration complete.');\n print('You can now proceed to deploying the Medplum infrastructure with CDK.');\n print('Run:');\n print('');\n print(` npx cdk bootstrap -c config=${configFileName}`);\n print(` npx cdk synth -c config=${configFileName}`);\n if (config.region === 'us-east-1') {\n print(` npx cdk deploy -c config=${configFileName}`);\n } else {\n print(` npx cdk deploy -c config=${configFileName} --all`);\n }\n print('');\n print('See Medplum documentation for more information:');\n print('');\n print(' https://www.medplum.com/docs/self-hosting/install-on-aws');\n print('');\n}\n\n/**\n * Prints to stdout.\n * @param text The text to print.\n */\nfunction print(text: string): void {\n terminal.write(text + '\\n');\n}\n\n/**\n * Prints a header with extra line spacing.\n * @param text The text to print.\n */\nfunction header(text: string): void {\n print('\\n' + text + '\\n');\n}\n\n/**\n * Prints a question and waits for user input.\n * @param text The question text to print.\n * @param defaultValue Optional default value.\n * @returns The selected value, or default value on empty selection.\n */\nfunction ask(text: string, defaultValue: string | number = ''): Promise<string> {\n return new Promise((resolve) => {\n terminal.question(text + (defaultValue ? ' (' + defaultValue + ')' : '') + ' ', (answer: string) => {\n resolve(answer || defaultValue.toString());\n });\n });\n}\n\n/**\n * Prints a question and waits for user to choose one of the provided options.\n * @param text The prompt text to print.\n * @param options The list of options that the user can select.\n * @param defaultValue Optional default value.\n * @returns The selected value, or default value on empty selection.\n */\nasync function choose(text: string, options: (string | number)[], defaultValue = ''): Promise<string> {\n const str = text + ' [' + options.map((o) => (o === defaultValue ? '(' + o + ')' : o)).join('|') + ']';\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const answer = (await ask(str)) || defaultValue;\n if (options.includes(answer)) {\n return answer;\n }\n print('Please choose one of the following options: ' + options.join(', '));\n }\n}\n\n/**\n * Prints a question and waits for the user to choose a valid integer option.\n * @param text The prompt text to print.\n * @param options The list of options that the user can select.\n * @param defaultValue Optional default value.\n * @returns The selected value, or default value on empty selection.\n */\nasync function chooseInt(text: string, options: number[], defaultValue = 0): Promise<number> {\n return parseInt(\n await choose(\n text,\n options.map((o) => o.toString()),\n defaultValue.toString()\n )\n );\n}\n\n/**\n * Prints a question and waits for the user to choose yes or no.\n * @param text The question to print.\n * @returns true on accept or false on reject.\n */\nasync function yesOrNo(text: string): Promise<boolean> {\n return (await choose(text, ['y', 'n'])).toLowerCase() === 'y';\n}\n\n/**\n * Prints a question and waits for the user to confirm yes. Throws error on no, and exits the program.\n * @param text The prompt text to print.\n */\nasync function checkOk(text: string): Promise<void> {\n if (!(await yesOrNo(text))) {\n print('Exiting...');\n throw new Error('User cancelled');\n }\n}\n\n/**\n * Writes a config file to disk.\n * @param configFileName The config file name.\n * @param config The config file contents.\n */\nfunction writeConfig(configFileName: string, config: MedplumInfraConfig): void {\n writeFileSync(resolve(configFileName), JSON.stringify(config, undefined, 2), 'utf-8');\n}\n\n/**\n * Returns the current AWS account ID.\n * This is used as the default value for the \"accountNumber\" config setting.\n * @param region The AWS region.\n * @returns The AWS account ID.\n */\nasync function getAccountId(region: string): Promise<string | undefined> {\n try {\n const client = new STSClient({ region });\n const command = new GetCallerIdentityCommand({});\n const response = await client.send(command);\n return response.Account as string;\n } catch (err) {\n console.log('Warning: Unable to get AWS account ID', (err as Error).message);\n return undefined;\n }\n}\n\n/**\n * Returns a list of all AWS certificates.\n * This is used to find existing certificates for the subdomains.\n * If the primary region is not us-east-1, then certificates in us-east-1 will also be returned.\n * @param region The AWS region.\n * @returns The list of AWS Certificates.\n */\nasync function listAllCertificates(region: string): Promise<CertificateSummary[]> {\n const result = await listCertificates(region);\n if (region !== 'us-east-1') {\n const usEast1Result = await listCertificates('us-east-1');\n result.push(...usEast1Result);\n }\n return result;\n}\n\n/**\n * Returns a list of AWS Certificates.\n * This is used to find existing certificates for the subdomains.\n * @param region The AWS region.\n * @returns The list of AWS Certificates.\n */\nasync function listCertificates(region: string): Promise<CertificateSummary[]> {\n try {\n const client = new ACMClient({ region });\n const command = new ListCertificatesCommand({ MaxItems: 1000 });\n const response = await client.send(command);\n return response.CertificateSummaryList as CertificateSummary[];\n } catch (err) {\n console.log('Warning: Unable to list certificates', (err as Error).message);\n return [];\n }\n}\n\n/**\n * Processes a required certificate.\n *\n * 1. If the certificate already exists, return the ARN.\n * 2. If the certificate does not exist, and the user wants to create a new certificate, create it and return the ARN.\n * 3. If the certificate does not exist, and the user does not want to create a new certificate, return a placeholder.\n * @param config In-progress config settings.\n * @param allCerts List of all existing certificates.\n * @param region The AWS region where the certificate is needed.\n * @param certName The name of the certificate (api, app, or storage).\n * @returns The ARN of the certificate or placeholder if a new certificate is needed.\n */\nasync function processCert(\n config: MedplumInfraConfig,\n allCerts: CertificateSummary[],\n region: string,\n certName: 'api' | 'app' | 'storage'\n): Promise<string> {\n const domainName = config[getDomainSetting(certName)];\n const existingCert = allCerts.find((cert) => cert.CertificateArn?.includes(region) && cert.DomainName === domainName);\n if (existingCert) {\n print(`Found existing certificate for \"${domainName}\" in \"${region}.`);\n return existingCert.CertificateArn as string;\n }\n\n print(`No existing certificate found for \"${domainName}\" in \"${region}.`);\n if (!(await yesOrNo('Do you want to request a new certificate?'))) {\n print(`Please add your certificate ARN to the config file in the \"${getDomainCertSetting(certName)}\" setting.`);\n return 'TODO';\n }\n\n const arn = await requestCert(region, domainName);\n print('Certificate ARN: ' + arn);\n return arn;\n}\n\n/**\n * Requests an AWS Certificate.\n * @param region The AWS region.\n * @param domain The domain name.\n * @returns The AWS Certificate ARN on success, or undefined on failure.\n */\nasync function requestCert(region: string, domain: string): Promise<string> {\n try {\n const validationMethod = await choose(\n 'Validate certificate using DNS or email validation?',\n ['dns', 'email'],\n 'dns'\n );\n const client = new ACMClient({ region });\n const command = new RequestCertificateCommand({\n DomainName: domain,\n ValidationMethod: validationMethod.toUpperCase(),\n });\n const response = await client.send(command);\n return response.CertificateArn as string;\n } catch (err) {\n console.log('Error: Unable to request certificate', (err as Error).message);\n return 'TODO';\n }\n}\n\n/**\n * Generates an AWS CloudFront signing key.\n *\n * Requirements:\n *\n * 1. It must be an SSH-2 RSA key pair.\n * 2. It must be in base64-encoded PEM format.\n * 3. It must be a 2048-bit key pair.\n *\n * See: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs\n * @returns A new signing key.\n */\nfunction generateSigningKey(): { publicKey: string; privateKey: string; passphrase: string } {\n const passphrase = randomUUID();\n const signingKey = generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem',\n },\n privateKeyEncoding: {\n type: 'pkcs1',\n format: 'pem',\n cipher: 'aes-256-cbc',\n passphrase,\n },\n });\n return {\n publicKey: signingKey.publicKey,\n privateKey: signingKey.privateKey,\n passphrase,\n };\n}\n\n/**\n * Writes a parameter to AWS Parameter Store.\n * @param region The AWS region.\n * @param key The parameter key.\n * @param value The parameter value.\n */\nasync function writeParameter(region: string, key: string, value: string): Promise<void> {\n const client = new SSMClient({ region });\n const command = new PutParameterCommand({\n Name: key,\n Value: value,\n Type: 'SecureString',\n Overwrite: true,\n });\n await client.send(command);\n}\n\n/**\n * Writes a collection of parameters to AWS Parameter Store.\n * @param region The AWS region.\n * @param prefix The AWS Parameter Store prefix.\n * @param params The parameters to write.\n */\nasync function writeParameters(region: string, prefix: string, params: Record<string, string | number>): Promise<void> {\n for (const [key, value] of Object.entries(params)) {\n const valueStr = value.toString();\n if (valueStr) {\n await writeParameter(region, prefix + key, valueStr);\n }\n }\n}\n","import { Command } from 'commander';\nimport { describeStacksCommand } from './describe';\nimport { listStacksCommand } from './list';\nimport { updateAppCommand } from './update-app';\nimport { updateServerCommand } from './update-server';\nimport { initStackCommand } from './init';\n\nexport const aws = new Command('aws').description('Commands to manage AWS resources');\n\naws.command('init').description('Initialize a new Medplum AWS CloudFormation stacks').action(initStackCommand);\n\naws.command('list').description('List Medplum AWS CloudFormation stacks').action(listStacksCommand);\n\naws\n .command('describe')\n .description('Describe a Medplum AWS CloudFormation stack by tag')\n .argument('<tag>')\n .action(describeStacksCommand);\n\naws.command('update-server').description('Update the server image').argument('<tag>').action(updateServerCommand);\n\naws.command('update-app').description('Update the app site').argument('<tag>').action(updateAppCommand);\n","import { Command } from 'commander';\nimport { medplum } from '.';\nimport { createBot, deployBot, readBotConfigs, saveBot } from './utils';\nimport { MedplumClient } from '@medplum/core';\n\nexport const bot = new Command('bot');\n\n// Commands to deprecate\nexport const saveBotDeprecate = new Command('save-bot');\nexport const deployBotDeprecate = new Command('deploy-bot');\nexport const createBotDeprecate = new Command('create-bot');\n\nbot\n .command('save')\n .description('Saving the bot')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName);\n });\n\nbot\n .command('deploy')\n .description('Deploy the app to AWS')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName, true);\n });\n\nbot\n .command('create')\n .arguments('<botName> <projectId> <sourceFile> <distFile>')\n .description('Creating a bot')\n .action(async (botName, projectId, sourceFile, distFile) => {\n await createBot(medplum, [botName, projectId, sourceFile, distFile]);\n });\n\nexport async function botWrapper(medplum: MedplumClient, botName: string, deploy = false): Promise<void> {\n const botConfigs = readBotConfigs(botName);\n for (const botConfig of botConfigs) {\n const bot = await medplum.readResource('Bot', botConfig.id);\n await saveBot(medplum, botConfig, bot);\n if (deploy) {\n await deployBot(medplum, botConfig, bot);\n }\n }\n console.log(`Number of bots deployed: ${botConfigs.length}`);\n}\n\n// Deprecate bot commands\nsaveBotDeprecate\n .description('Saves the bot')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName);\n });\n\ndeployBotDeprecate\n .description('Deploy the bot to AWS')\n .argument('<botName>')\n .action(async (botName) => {\n await botWrapper(medplum, botName, true);\n });\n\ncreateBotDeprecate\n .arguments('<botName> <projectId> <sourceFile> <distFile>')\n .description('Creates and saves the bot')\n .action(async (botName, projectId, sourceFile, distFile) => {\n await createBot(medplum, [botName, projectId, sourceFile, distFile]);\n });\n","import { BundleEntry } from '@medplum/fhirtypes';\nimport { Command } from 'commander';\nimport { createReadStream, writeFile } from 'fs';\nimport { resolve } from 'path';\nimport { createInterface } from 'readline';\nimport { medplum } from '.';\nimport { prettyPrint } from './utils';\n\nexport const bulk = new Command('bulk');\n\nbulk\n .command('export')\n .option(\n '-e, --exportLevel <exportLevel>',\n 'Optional export level. Defaults to system level export. \"Group/:id\" - Group of Patients, \"Patient\" - All Patients.'\n )\n .option('-t, --types <types>', 'optional resource types to export')\n .option(\n '-s, --since <since>',\n 'optional Resources will be included in the response if their state has changed after the supplied time (e.g. if Resource.meta.lastUpdated is later than the supplied _since time).'\n )\n .action(async ({ exportLevel, types, since }) => {\n const response = await medplum.bulkExport(exportLevel, types, since);\n response.output?.forEach(async ({ type, url }) => {\n const fileUrl = new URL(url as string);\n const data = await medplum.download(url as string);\n const fileName = `${type}_${fileUrl.pathname}`.replace(/[^a-zA-Z0-9]+/g, '_') + '.ndjson';\n\n writeFile(`${fileName}`, await data.text(), () => {\n console.log(`${fileName} is created`);\n });\n });\n });\n\nbulk\n .command('import')\n .argument('<filename>', 'File Name')\n .option(\n '--numResourcesPerRequest <numResourcesPerRequest>',\n 'optional number of resources to import per batch request. Defaults to 25.',\n '25'\n )\n .action(async (fileName, options) => {\n const path = resolve(process.cwd(), fileName);\n const { numResourcesPerRequest } = options;\n\n await importFile(path, parseInt(numResourcesPerRequest));\n });\n\nasync function importFile(path: string, numResourcesPerRequest: number): Promise<void> {\n let entries = [] as BundleEntry[];\n const fileStream = createReadStream(path);\n const rl = createInterface({\n input: fileStream,\n });\n\n for await (const line of rl) {\n const resource = JSON.parse(line);\n entries.push({\n resource: resource,\n request: {\n method: 'POST',\n url: resource.resourceType,\n },\n });\n if (entries.length % numResourcesPerRequest === 0) {\n await sendBatchEntries(entries);\n entries = [];\n }\n }\n if (entries.length > 0) {\n await sendBatchEntries(entries);\n }\n}\n\nasync function sendBatchEntries(entries: BundleEntry[]): Promise<void> {\n const result = await medplum.executeBatch({\n resourceType: 'Bundle',\n type: 'transaction',\n entry: entries,\n });\n\n result.entry?.forEach((resultEntry) => {\n prettyPrint(resultEntry.response);\n });\n}\n","import { Command, Option } from 'commander';\nimport { medplum } from '.';\nimport { MedplumClient, LoginState, InviteBody } from '@medplum/core';\n\nexport const project = new Command('project');\n\nproject\n .command('list')\n .description('List of current projects')\n .action(async () => {\n projectList(medplum);\n });\n\nfunction projectList(medplum: MedplumClient): void {\n const logins = medplum.getLogins();\n\n const projects = logins\n .map((login: LoginState) => `${login.project.display} (${login.project.reference})`)\n .join('\\n\\n');\n\n console.log(projects);\n}\n\nproject\n .command('current')\n .description('Project you are currently on')\n .action(() => {\n const login = medplum.getActiveLogin();\n if (!login) {\n throw new Error('Unauthenticated: run `npx medplum login` to login');\n }\n console.log(`${login.project.display} (${login.project.reference})`);\n });\n\nproject\n .command('switch')\n .description('Switching to another project from the current one')\n .argument('<projectId>')\n .action(async (projectId) => {\n await switchProject(medplum, projectId);\n });\n\nproject\n .command('invite')\n .description('Invite a member to your current project (run npx medplum project current to confirm)')\n .arguments('<firstName> <lastName> <email>')\n .option('--send-email', 'If you want to send the email when inviting the user')\n .option('--admin', 'If the user you are inviting is an admin')\n .addOption(\n new Option('-r, --role <role>', 'Role of user')\n .choices(['Practitioner', 'Patient', 'RelatedPerson'])\n .default('Practitioner')\n )\n .action(async (firstName, lastName, email, options) => {\n const login = medplum.getActiveLogin();\n if (!login) {\n throw new Error('Unauthenticated: run `npx medplum login` to login');\n }\n if (!login.project?.reference) {\n throw new Error('No current project to invite user to');\n }\n\n const projectId = login.project.reference.split('/')[1];\n const inviteBody: InviteBody = {\n resourceType: options.role,\n firstName,\n lastName,\n email,\n sendEmail: !!options.sendEmail,\n admin: !!options.admin,\n };\n await inviteUser(projectId, inviteBody);\n });\n\nasync function switchProject(medplum: MedplumClient, projectId: string): Promise<void> {\n const logins = medplum.getLogins();\n const login = logins.find((login: LoginState) => login.project?.reference?.includes(projectId));\n if (!login) {\n console.log(`Error: project ${projectId} not found. Make sure you are added as a user to this project`);\n } else {\n await medplum.setActiveLogin(login);\n console.log(`Switched to project ${projectId}\\n`);\n }\n}\n\nasync function inviteUser(projectId: string, inviteBody: InviteBody): Promise<void> {\n try {\n await medplum.invite(projectId, inviteBody);\n if (inviteBody.sendEmail) {\n console.log('Email sent');\n }\n console.log('See your users at https://app.medplum.com/admin/users');\n } catch (err) {\n console.log('Error while sending invite ' + err);\n }\n}\n","import { convertToTransactionBundle } from '@medplum/core';\nimport { Command } from 'commander';\nimport { medplum } from '.';\nimport { prettyPrint } from './utils';\n\nexport const deleteObject = new Command('delete');\nexport const get = new Command('get');\nexport const patch = new Command('patch');\nexport const post = new Command('post');\nexport const put = new Command('put');\n\ndeleteObject.argument('<url>', 'Resource/$id').action(async (url) => {\n prettyPrint(await medplum.delete(cleanUrl(url)));\n});\n\nget\n .argument('<url>', 'Resource/$id')\n .option('--as-transaction', 'Print out the bundle as a transaction type')\n .action(async (url, options) => {\n const response = await medplum.get(cleanUrl(url));\n if (options.asTransaction) {\n prettyPrint(convertToTransactionBundle(response));\n } else {\n prettyPrint(response);\n }\n });\n\npatch.arguments('<url> <body>').action(async (url, body) => {\n prettyPrint(await medplum.patch(cleanUrl(url), parseBody(body)));\n});\n\npost.arguments('<url> <body>').action(async (url, body) => {\n prettyPrint(await medplum.post(cleanUrl(url), parseBody(body)));\n});\n\nput.arguments('<url> <body>').action(async (url, body) => {\n prettyPrint(await medplum.put(cleanUrl(url), parseBody(body)));\n});\n\nfunction parseBody(input: string | undefined): any {\n if (!input) {\n return undefined;\n }\n try {\n return JSON.parse(input);\n } catch (err) {\n return input;\n }\n}\n\nexport function cleanUrl(input: string): string {\n const knownPrefixes = ['admin/', 'auth/', 'fhir/R4'];\n if (knownPrefixes.some((p) => input.startsWith(p))) {\n // If the URL starts with a known prefix, return it as-is\n return input;\n }\n // Otherwise, default to FHIR\n return 'fhir/R4/' + input;\n}\n","import { ClientStorage } from '@medplum/core';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { homedir } from 'os';\nimport { resolve } from 'path';\n\nexport class FileSystemStorage extends ClientStorage {\n private readonly dirName: string;\n private readonly fileName: string;\n\n constructor() {\n super();\n this.dirName = resolve(homedir(), '.medplum');\n this.fileName = resolve(this.dirName, 'credentials');\n }\n\n clear(): void {\n this.writeFile({});\n }\n\n getString(key: string): string | undefined {\n return this.readFile()?.[key];\n }\n\n setString(key: string, value: string | undefined): void {\n const data = this.readFile() || {};\n if (value) {\n data[key] = value;\n } else {\n delete data[key];\n }\n this.writeFile(data);\n }\n\n private readFile(): Record<string, string> | undefined {\n if (existsSync(this.fileName)) {\n return JSON.parse(readFileSync(this.fileName, 'utf8'));\n }\n return undefined;\n }\n\n private writeFile(data: Record<string, string>): void {\n if (!existsSync(this.dirName)) {\n mkdirSync(this.dirName);\n }\n writeFileSync(this.fileName, JSON.stringify(data, null, 2), 'utf8');\n }\n}\n","import { MEDPLUM_VERSION, MedplumClient, normalizeErrorString } from '@medplum/core';\nimport { Command } from 'commander';\nimport dotenv from 'dotenv';\nimport { login, whoami } from './auth';\nimport { aws } from './aws/index';\nimport { bot, createBotDeprecate, deployBotDeprecate, saveBotDeprecate } from './bots';\nimport { bulk } from './bulk';\nimport { project } from './project';\nimport { deleteObject, get, patch, post, put } from './rest';\nimport { FileSystemStorage } from './storage';\n\nexport let medplum: MedplumClient;\n\nexport async function main(medplumClient: MedplumClient, argv: string[]): Promise<void> {\n medplum = medplumClient;\n\n try {\n const clientId = process.env['MEDPLUM_CLIENT_ID'];\n const clientSecret = process.env['MEDPLUM_CLIENT_SECRET'];\n if (clientId && clientSecret) {\n medplumClient.setBasicAuth(clientId, clientSecret);\n await medplumClient.startClientLogin(clientId, clientSecret);\n }\n const index = new Command('medplum').description('Command to access Medplum CLI');\n index.version(MEDPLUM_VERSION);\n\n // Auth commands\n index.addCommand(login);\n index.addCommand(whoami);\n\n // REST commands\n index.addCommand(get);\n index.addCommand(post);\n index.addCommand(patch);\n index.addCommand(put);\n index.addCommand(deleteObject);\n\n // Project\n index.addCommand(project);\n\n // Export\n index.addCommand(bulk);\n\n // Bot Commands\n index.addCommand(bot);\n\n // Deprecated Bot Commands\n index.addCommand(saveBotDeprecate);\n index.addCommand(deployBotDeprecate);\n index.addCommand(createBotDeprecate);\n\n // AWS commands\n index.addCommand(aws);\n\n await index.parseAsync(argv);\n } catch (err) {\n console.error('Error: ' + normalizeErrorString(err));\n }\n}\n\nexport async function run(): Promise<void> {\n dotenv.config();\n const baseUrl = process.env['MEDPLUM_BASE_URL'] || 'https://api.medplum.com/';\n const fhirUrlPath = process.env['MEDPLUM_FHIR_URL_PATH'] || '';\n const accessToken = process.env['MEDPLUM_CLIENT_ACCESS_TOKEN'] || '';\n const tokenUrl = process.env['MEDPLUM_TOKEN_URL'] || '';\n\n const medplumClient = new MedplumClient({\n fetch,\n baseUrl,\n tokenUrl,\n fhirUrlPath,\n storage: new FileSystemStorage(),\n onUnauthenticated: onUnauthenticated,\n });\n\n if (accessToken) {\n medplumClient.setAccessToken(accessToken);\n }\n await main(medplumClient, process.argv);\n}\n\nif (require.main === module) {\n run().catch((err) => console.error('Unhandled error:', err));\n}\n\nfunction onUnauthenticated(): void {\n console.log('Unauthenticated: run `npx medplum login` to sign in');\n}\n"],"names":["Command","medplum","createServer","getDisplayString","normalizeErrorString","os","platform","exec","CloudFormationClient","CloudFrontClient","ECSClient","S3Client","ListStacksCommand","DescribeStacksCommand","DescribeStackResourcesCommand","path","resolve","existsSync","readFileSync","writeFile","fetch","mkdtempSync","join","tmpdir","pipeline","rmSync","readdirSync","writeFileSync","createReadStream","sep","PutObjectCommand","CreateInvalidationCommand","UpdateServiceCommand","STSClient","GetCallerIdentityCommand","ACMClient","ListCertificatesCommand","RequestCertificateCommand","randomUUID","generateKeyPairSync","SSMClient","PutParameterCommand","createInterface","Option","convertToTransactionBundle","ClientStorage","homedir","mkdirSync","MEDPLUM_VERSION","MedplumClient"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medplum/cli",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Medplum Command Line Interface",
5
5
  "author": "Medplum <hello@medplum.com>",
6
6
  "license": "Apache-2.0",
@@ -17,17 +17,18 @@
17
17
  "test": "jest"
18
18
  },
19
19
  "dependencies": {
20
- "@aws-sdk/client-acm": "3.332.0",
21
- "@aws-sdk/client-cloudformation": "3.332.0",
22
- "@aws-sdk/client-cloudfront": "3.332.0",
23
- "@aws-sdk/client-ecs": "3.332.0",
24
- "@aws-sdk/client-s3": "3.332.0",
25
- "@aws-sdk/client-ssm": "3.332.0",
26
- "@aws-sdk/client-sts": "3.332.0",
20
+ "@aws-sdk/client-acm": "3.347.0",
21
+ "@aws-sdk/client-cloudformation": "3.347.0",
22
+ "@aws-sdk/client-cloudfront": "3.347.0",
23
+ "@aws-sdk/client-ecs": "3.347.0",
24
+ "@aws-sdk/client-s3": "3.347.0",
25
+ "@aws-sdk/client-ssm": "3.347.0",
26
+ "@aws-sdk/client-sts": "3.347.0",
27
+ "@aws-sdk/types": "3.347.0",
27
28
  "@medplum/core": "*",
28
29
  "aws-sdk-client-mock": "2.1.1",
29
30
  "commander": "10.0.1",
30
- "dotenv": "16.0.3",
31
+ "dotenv": "16.1.4",
31
32
  "fast-glob": "3.2.12",
32
33
  "node-fetch": "2.6.11",
33
34
  "tar": "6.1.15"