@openhi/platform 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{openhi.d.ts → index.d.mts} +42 -16
- package/lib/index.d.ts +195 -2
- package/lib/index.js +825 -17
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +818 -0
- package/lib/index.mjs.map +1 -0
- package/package.json +33 -24
- package/lib/openhi.js +0 -108
- package/lib/service.d.ts +0 -36
- package/lib/service.js +0 -203
- package/lib/templates/generate-templates.d.ts +0 -5
- package/lib/templates/generate-templates.js +0 -45
- package/lib/templates/service-template.d.ts +0 -33
- package/lib/templates/service-template.js +0 -42
- package/lib/templates/src/README.md.d.ts +0 -5
- package/lib/templates/src/README.md.js +0 -19
- package/lib/templates/src/app-test.d.ts +0 -5
- package/lib/templates/src/app-test.js +0 -61
- package/lib/templates/src/app.d.ts +0 -5
- package/lib/templates/src/app.js +0 -27
- package/lib/templates/src/config.d.ts +0 -5
- package/lib/templates/src/config.js +0 -23
- package/lib/templates/src/data/README.md.d.ts +0 -5
- package/lib/templates/src/data/README.md.js +0 -19
- package/lib/templates/src/data/models/README.md.d.ts +0 -5
- package/lib/templates/src/data/models/README.md.js +0 -19
- package/lib/templates/src/infrastructure/README.md.d.ts +0 -5
- package/lib/templates/src/infrastructure/README.md.js +0 -19
- package/lib/templates/src/integrations/README.md.d.ts +0 -5
- package/lib/templates/src/integrations/README.md.js +0 -19
- package/lib/templates/src/main.d.ts +0 -5
- package/lib/templates/src/main.js +0 -15
- package/lib/templates/src/workflows/README.md.d.ts +0 -5
- package/lib/templates/src/workflows/README.md.js +0 -19
- package/lib/workflows/aws-teardown-workflow.d.ts +0 -13
- package/lib/workflows/aws-teardown-workflow.js +0 -222
- package/lib/workflows/build-dev-workflow.d.ts +0 -12
- package/lib/workflows/build-dev-workflow.js +0 -48
- package/lib/workflows/build-stage-workflow.d.ts +0 -12
- package/lib/workflows/build-stage-workflow.js +0 -60
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../config/src/open-hi-config.ts","../../config/src/index.ts","../src/openhi.ts","../src/service.ts","../src/templates/service-template.ts","../src/templates/src/app.ts","../src/templates/src/app-test.ts","../src/templates/src/config.ts","../src/templates/src/data/models/README.md.ts","../src/templates/src/data/README.md.ts","../src/templates/src/infrastructure/README.md.ts","../src/templates/src/integrations/README.md.ts","../src/templates/src/main.ts","../src/templates/src/README.md.ts","../src/templates/src/workflows/README.md.ts","../src/templates/generate-templates.ts","../src/workflows/aws-teardown-workflow.ts","../src/workflows/build-dev-workflow.ts","../src/workflows/build-stage-workflow.ts"],"sourcesContent":["/*******************************************************************************\n *\n * OpenHi Config\n *\n * These types are kept in their own package to prevent dependency conflicts and\n * conditions between @openhi/constructs and @openhi/platform.\n *\n ******************************************************************************/\n\n/**\n * Stage Types\n *\n * What stage of deployment is this? Dev, staging, or prod?\n */\nexport const OPEN_HI_STAGE = {\n /**\n * Development environment, typically used for testing and development.\n */\n DEV: \"dev\",\n /**\n * Staging environment, used for pre-production testing.\n */\n STAGE: \"stage\",\n /**\n * Production environment, used for live deployments.\n */\n PROD: \"prod\",\n} as const;\n\n/**\n * Above const as a type.\n */\nexport type OpenHiStageType =\n (typeof OPEN_HI_STAGE)[keyof typeof OPEN_HI_STAGE];\n\n/**\n * Deployment Target Role\n *\n * Is this (account, region) the primary or a secondary deployment target for the stage?\n * Works for both multi-region (different regions) and cellular (same region, different accounts).\n */\nexport const OPEN_HI_DEPLOYMENT_TARGET_ROLE = {\n /**\n * The primary deployment target for this stage (main account/region).\n * For example, the base DynamoDB region for global tables.\n */\n PRIMARY: \"primary\",\n\n /**\n * A secondary deployment target for this stage (additional account/region).\n * For example, a replica region for a global DynamoDB table, or another cell in the same region.\n */\n SECONDARY: \"secondary\",\n} as const;\n\n/**\n * Above const as a type.\n */\nexport type OpenHiDeploymentTargetRoleType =\n (typeof OPEN_HI_DEPLOYMENT_TARGET_ROLE)[keyof typeof OPEN_HI_DEPLOYMENT_TARGET_ROLE];\n\nexport interface OpenHiEnvironmentConfig {\n account: string;\n region: string;\n /**\n * Route53 zone containing DNS for this service.\n */\n hostedZoneId?: string;\n zoneName?: string;\n}\n\n/**\n * Represents the configuration for OpenHi services across different stages and\n * deployment targets.\n */\nexport interface OpenHiConfig {\n versions?: {\n cdk?: {\n cdkLibVersion?: string;\n cdkCliVersion?: string;\n };\n };\n deploymentTargets?: {\n [OPEN_HI_STAGE.DEV]?: {\n [OPEN_HI_DEPLOYMENT_TARGET_ROLE.PRIMARY]?: OpenHiEnvironmentConfig;\n [OPEN_HI_DEPLOYMENT_TARGET_ROLE.SECONDARY]?: Array<OpenHiEnvironmentConfig>;\n };\n [OPEN_HI_STAGE.STAGE]?: {\n [OPEN_HI_DEPLOYMENT_TARGET_ROLE.PRIMARY]?: OpenHiEnvironmentConfig;\n [OPEN_HI_DEPLOYMENT_TARGET_ROLE.SECONDARY]?: Array<OpenHiEnvironmentConfig>;\n };\n [OPEN_HI_STAGE.PROD]?: {\n [OPEN_HI_DEPLOYMENT_TARGET_ROLE.PRIMARY]?: OpenHiEnvironmentConfig;\n [OPEN_HI_DEPLOYMENT_TARGET_ROLE.SECONDARY]?: Array<OpenHiEnvironmentConfig>;\n };\n };\n}\n","export * from \"./open-hi-config\";\n","import {\n MonorepoProject,\n MonorepoProjectOptions,\n} from \"@codedrifters/configulator\";\nimport { OpenHiConfig } from \"@openhi/config\";\nimport { merge } from \"ts-deepmerge\";\nimport { SetOptional } from \"type-fest\";\nimport { OPEN_HI_SERVICE_TYPE, OpenHiService } from \"./service\";\nimport { AwsTeardownWorkflow } from \"./workflows/aws-teardown-workflow\";\nimport { BuildDevelopmentWorkflow } from \"./workflows/build-dev-workflow\";\nimport { BuildStageWorkflow } from \"./workflows/build-stage-workflow\";\n\nexport interface OpenHiOptions {\n /*****************************************************************************\n *\n * Root Project Configuration Options\n *\n * Configuration options for the root monorepo project that contains all\n * OpenHi services and coordinate releases and builds.\n *\n ****************************************************************************/\n\n readonly rootProjectOptions?: SetOptional<MonorepoProjectOptions, \"name\">;\n\n /**\n * Monorepo root project, if using an existing project.\n */\n readonly rootProject?: MonorepoProject;\n\n /*****************************************************************************\n *\n * Service Configuration Options\n *\n * These options are used to configure the various services within the OpenHi\n * framework. Each service can have its own configuration settings, which will\n * be merged with the default configuration.\n *\n ****************************************************************************/\n\n /**\n * Default configuration used in all services with undefined configs.\n */\n readonly defaultConfig?: OpenHiConfig;\n\n /**\n * Global Service Config\n */\n readonly globalServiceConfig?: OpenHiConfig;\n\n /**\n * Auth Service Config\n */\n readonly authServiceConfig?: OpenHiConfig;\n\n /**\n * Rest API Service Config\n */\n readonly restApiServiceConfig?: OpenHiConfig;\n\n /**\n * Data Service Config (DynamoDB FHIR store, S3, etc.)\n */\n readonly dataServiceConfig?: OpenHiConfig;\n}\n\nexport class OpenHi {\n /**\n * Final options used to build this instance.\n */\n public options: OpenHiOptions;\n\n /**\n * Monorepo root project, either passed in as an argument or generated in\n * this component\n */\n public readonly rootProject?: MonorepoProject;\n\n /**\n * Test identifier for this instance.\n */\n public readonly id: string;\n\n /**\n * Global service (deployed first; Auth, data service, and other stacks depend on it).\n */\n public readonly global: OpenHiService;\n\n /**\n * Auth service (deployed first; data service, REST API, and data services depend on it).\n */\n public readonly auth: OpenHiService;\n\n /**\n * Rest API service\n */\n public readonly restApi: OpenHiService;\n\n /**\n * Data service (DynamoDB FHIR store, S3, and other persistence).\n */\n public readonly data: OpenHiService;\n\n constructor(options: OpenHiOptions = {}) {\n /***************************************************************************\n *\n * Options\n *\n * Combine input options with defaults.\n *\n **************************************************************************/\n\n this.options = merge({ name: \"openhi\" }, options);\n this.rootProject = this.options.rootProject;\n this.id = this.options.rootProject?.name ?? \"openhi\";\n\n /**\n * In future we would create root project here. For now, require it to be\n * passed in.\n */\n if (!this.rootProject) {\n throw new Error(\n \"OpenHi requires a MonorepoProject to be passed in via the rootProject option\",\n );\n }\n\n const rootProject = this.rootProject;\n\n /***************************************************************************\n *\n * Global Service\n *\n * Global infrastructure (Route53, ACM). Deployed first in primary;\n * Auth, data service, and other stacks depend on it.\n *\n **************************************************************************/\n\n this.global = new OpenHiService(this, \"global\", {\n type: OPEN_HI_SERVICE_TYPE.GLOBAL,\n config: merge(\n this.options?.defaultConfig ?? {},\n this.options?.globalServiceConfig ?? {},\n ),\n });\n\n /***************************************************************************\n *\n * Auth Service\n *\n * Authentication (Cognito user pool, client, domain, KMS). Deployed first;\n * data service, REST API, and data services consume auth via SSM.\n *\n **************************************************************************/\n\n this.auth = new OpenHiService(this, \"auth\", {\n type: OPEN_HI_SERVICE_TYPE.AUTH,\n config: merge(\n this.options?.defaultConfig ?? {},\n this.options?.authServiceConfig ?? {},\n ),\n });\n\n /***************************************************************************\n *\n * Rest API service\n *\n * This contains the REST API for the OpenHi platform.\n *\n **************************************************************************/\n\n this.restApi = new OpenHiService(this, \"rest-api\", {\n type: OPEN_HI_SERVICE_TYPE.REST_API,\n config: merge(\n this.options?.defaultConfig ?? {},\n this.options?.restApiServiceConfig ?? {},\n ),\n });\n\n /***************************************************************************\n *\n * Data Service\n *\n * Data storage stack (DynamoDB FHIR store, S3, etc.). Deployed so that\n * REST API and other services can reference the table via cross-stack.\n *\n **************************************************************************/\n\n this.data = new OpenHiService(this, \"data\", {\n type: OPEN_HI_SERVICE_TYPE.DATA_SERVICE,\n config: merge(\n this.options?.defaultConfig ?? {},\n this.options?.dataServiceConfig ?? {},\n ),\n });\n\n /***************************************************************************\n *\n * Integrations\n *\n * Various purpose specific integrations.\n *\n **************************************************************************/\n\n /***************************************************************************\n *\n * Workflows\n *\n * Workflows for each environment.\n *\n **************************************************************************/\n\n new BuildDevelopmentWorkflow(rootProject, { openhi: this });\n new BuildStageWorkflow(rootProject, { openhi: this });\n\n new AwsTeardownWorkflow(rootProject, { openhi: this });\n }\n}\n","import { sep } from \"path\";\nimport {\n AwsDeploymentTarget,\n TurboRepo,\n VERSION,\n} from \"@codedrifters/configulator\";\nimport {\n OPEN_HI_DEPLOYMENT_TARGET_ROLE,\n OPEN_HI_STAGE,\n OpenHiConfig,\n OpenHiEnvironmentConfig,\n} from \"@openhi/config\";\nimport { paramCase, pascalCase } from \"change-case\";\nimport { awscdk } from \"projen\";\nimport { NodePackageManager, Transform } from \"projen/lib/javascript\";\nimport { ValueOf } from \"type-fest\";\nimport { OpenHi } from \"./openhi\";\nimport { GenerateTemplates } from \"./templates/generate-templates\";\n\nexport const OPEN_HI_SERVICE_TYPE = {\n AUTH: \"auth\",\n DATA_SERVICE: \"data\",\n GLOBAL: \"global\",\n INTEGRATION: \"integration\",\n REST_API: \"rest-api\",\n} as const;\n\nexport interface OpenHiServiceOptions {\n /**\n * Configuration for this service.\n *\n * @default uses the global default config.\n */\n readonly config: OpenHiConfig;\n\n /**\n * What type of service is this?\n */\n readonly type: ValueOf<typeof OPEN_HI_SERVICE_TYPE>;\n}\n\nexport class OpenHiService {\n public readonly project: awscdk.AwsCdkTypeScriptApp;\n\n constructor(\n public openHi: OpenHi,\n public id: string,\n public options: OpenHiServiceOptions,\n ) {\n /**\n * Build the construct name we expect to use in this service.\n */\n\n /***************************************************************************\n *\n * Projen based CDK build\n *\n **************************************************************************/\n\n this.project = new awscdk.AwsCdkTypeScriptApp({\n /**\n * Top level project config options\n */\n defaultReleaseBranch: \"main\",\n name: this.serviceName,\n outdir: this.outDir,\n parent: this.openHi.rootProject,\n cdkVersion:\n this.options?.config?.versions?.cdk?.cdkLibVersion ??\n VERSION.AWS_CDK_LIB_VERSION,\n cdkCliVersion:\n this.options?.config?.versions?.cdk?.cdkCliVersion ??\n VERSION.AWS_CDK_CLI_VERSION,\n\n /**\n * Packaging options\n *\n * TODO: Figure out license for monorepo vs per package?\n */\n licensed: false,\n\n /**\n * Node configs\n */\n packageManager: NodePackageManager.PNPM,\n\n /**\n * Turn on prettier formatting\n */\n prettier: true,\n\n /**\n * Don't generate sample code.\n */\n sampleCode: false,\n\n /**\n * Make sure jest config is stored outside of package.json and use SWC\n * for faster tests.\n */\n jestOptions: {\n configFilePath: \"jest.config.json\",\n jestConfig: {\n transform: {\n [\"^.+\\\\.[t]sx?$\"]: new Transform(\"@swc/jest\"),\n },\n },\n },\n\n /**\n * SWC for faster testing\n */\n devDeps: [\"@swc/jest\", \"@swc/core\"],\n\n /**\n * Don't package test files.\n */\n npmIgnoreOptions: {\n ignorePatterns: [\"*.spec.*\", \"*.test.*\"],\n },\n });\n\n /**\n * We're using SWC now, remove ts-jest which is included by default.\n */\n this.project.deps.removeDependency(\"ts-jest\");\n\n /***************************************************************************\n *\n * Workspace Dependencies\n *\n * - Constructs are used to build out the AWS CDK environments.\n *\n **************************************************************************/\n\n this.project.addDeps(\n \"@openhi/config@workspace:*\",\n \"@openhi/constructs@workspace:*\",\n );\n\n /***************************************************************************\n *\n * Turbo Configuration\n *\n * - Activate turborepo for the project.\n *\n **************************************************************************/\n\n new TurboRepo(this.project);\n\n /***************************************************************************\n *\n * Define some basic Service Structure\n *\n **************************************************************************/\n\n new GenerateTemplates(this);\n\n /***************************************************************************\n *\n * Deployment Targets\n *\n **************************************************************************/\n\n [OPEN_HI_STAGE.DEV, OPEN_HI_STAGE.STAGE, OPEN_HI_STAGE.PROD].forEach(\n (stage) => {\n const targets = this.options?.config?.deploymentTargets?.[stage];\n if (targets?.primary) {\n this.addDeploymentTarget(\n stage,\n OPEN_HI_DEPLOYMENT_TARGET_ROLE.PRIMARY,\n targets.primary,\n );\n }\n targets?.secondary?.forEach((env) => {\n this.addDeploymentTarget(\n stage,\n OPEN_HI_DEPLOYMENT_TARGET_ROLE.SECONDARY,\n env,\n );\n });\n },\n );\n }\n\n private addDeploymentTarget = (\n awsStageType: ValueOf<typeof OPEN_HI_STAGE>,\n awsEnvironmentType: ValueOf<typeof OPEN_HI_DEPLOYMENT_TARGET_ROLE>,\n envConfig: OpenHiEnvironmentConfig,\n ) => {\n new AwsDeploymentTarget(this.project, {\n account: envConfig.account,\n region: envConfig.region,\n awsStageType,\n awsEnvironmentType,\n localDeployment: true,\n localDeploymentConfig: {\n stackPattern: `${awsStageType}/${awsEnvironmentType}/*-${envConfig.account}-${envConfig.region}`,\n roleName: \"poweruseraccess\",\n },\n ciDeployment: true,\n ciDeploymentConfig: {\n roleArn: `arn:aws:iam::${envConfig.account}:role/GitHubOpenHiDeployer`,\n stackPattern: `${awsStageType}/${awsEnvironmentType}/*-${envConfig.account}-${envConfig.region}`,\n },\n\n branches:\n awsStageType === OPEN_HI_STAGE.DEV\n ? [\n {\n branch: \"feat/*\",\n description: [\n \"Feature branches for OpenHI (short form).\",\n \"These branches are used for developing new features.\",\n ],\n },\n {\n branch: \"feature/*\",\n description: [\n \"Feature branches for OpenHI.\",\n \"These branches are used for developing new features.\",\n ],\n },\n {\n branch: \"fix/*\",\n description: [\n \"Fix branches for OpenHI.\",\n \"This branch pattern is used when a developer is working on a fix on the project.\",\n ],\n },\n ]\n : [\n {\n branch: \"main\",\n description: [\n \"Main branch for OpenHI.\",\n \"This branch is used for the main branch.\",\n ],\n },\n ],\n });\n };\n\n get constructName(): string {\n return pascalCase([\"open\", \"hi\", this.id, \"service\"].join(\"-\"));\n }\n\n get outDir() {\n return [paramCase(this.openHi.id), paramCase(this.id)].join(sep);\n }\n\n get serviceName() {\n return [paramCase(this.openHi.id), paramCase(this.id)].join(\"-\");\n }\n}\n","import { existsSync, unlinkSync } from \"node:fs\";\nimport { sep } from \"node:path\";\nimport { SampleFile } from \"projen\";\nimport { OpenHiService } from \"../service\";\n\nexport interface ServiceTemplateOptions {\n /**\n * The content of the sample file, as an array.\n */\n readonly contents: Array<string>;\n\n /**\n * The relative file path from the project root.\n */\n readonly filePath: string;\n\n /**\n * Overwrite this template file to it's original state?\n *\n * @default false\n */\n readonly overwrite?: boolean;\n}\n\nexport class ServiceTemplate {\n /**\n * The file being generated.\n */\n public file?: SampleFile;\n\n /**\n * Absolute Filepath, including the project path.\n */\n public fullFilePath: string;\n\n constructor(\n public service: OpenHiService,\n public options: ServiceTemplateOptions,\n ) {\n /**\n * Determine the full file path for this file.\n */\n this.fullFilePath = [\n this.service.project.outdir,\n this.options.filePath,\n ].join(sep);\n\n /**\n * Build the template file.\n */\n this.createTemplate();\n }\n\n protected createTemplate() {\n if (this.options.overwrite) {\n this.overwriteTemplate();\n }\n\n this.file = new SampleFile(this.service.project, this.options.filePath, {\n contents: this.options.contents.join(\"\\n\"),\n });\n }\n\n public overwriteTemplate() {\n /**\n * Delete file, if it exists.\n */\n if (existsSync(this.fullFilePath)) {\n unlinkSync(this.fullFilePath);\n }\n this.file = undefined;\n }\n}\n","import { OpenHiService } from \"../../service\";\nimport { ServiceTemplate, ServiceTemplateOptions } from \"../service-template\";\n\nexport class SrcApp extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/app.ts\",\n contents: [\n `import { OpenHiApp, ${service.constructName} } from \"@openhi/constructs\";`,\n `import { CONFIG } from \"./config\";`,\n ``,\n `const app = new OpenHiApp({ config: CONFIG });`,\n ``,\n `const stacks = app.environments.map((e) => {`,\n ` return new ${service.constructName}(e, { config: e.config });`,\n `});`,\n ``,\n `export { app, stacks };`,\n ``,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../../service\";\nimport { ServiceTemplate, ServiceTemplateOptions } from \"../service-template\";\n\nexport class SrcAppTest extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/app.test.ts\",\n contents: [\n `import { Template } from \"aws-cdk-lib/assertions\";`,\n `import { Code, type CodeConfig } from \"aws-cdk-lib/aws-lambda\";`,\n `import { stacks } from \"./app\"`,\n ``,\n `/** Replace volatile CDK asset S3 keys/buckets with static values for snapshot stability. */`,\n `function normalizeTemplateForSnapshot(template: Record<string, unknown>): Record<string, unknown> {`,\n ` const staticBucket = \"mock-assets-bucket\";`,\n ` const staticKey = \"mock-asset-key.zip\";`,\n ` const json = JSON.stringify(template);`,\n ` const normalized = json`,\n ` .replace(/\"S3Key\":\\\\s*\"[^\"]+\\\\.zip\"/g, \\\\\\`\"S3Key\": \"\\${staticKey}\"\\\\\\`)`,\n ` .replace(/\"S3Bucket\":\\\\s*\"[^\"]+\"/g, \\\\\\`\"S3Bucket\": \"\\${staticBucket}\"\\\\\\`);`,\n ` return JSON.parse(normalized) as Record<string, unknown>;`,\n `}`,\n ``,\n `let fromAssetMock: jest.SpyInstance;`,\n ``,\n `beforeAll(() => {`,\n ` fromAssetMock = jest.spyOn(Code, \"fromAsset\").mockReturnValue({`,\n ` isInline: false,`,\n ` bind: (): CodeConfig => ({`,\n ` s3Location: {`,\n ` bucketName: \"mock-assets-bucket\",`,\n ` objectKey: \"mock-asset-key.zip\",`,\n ` },`,\n ` }),`,\n ` bindToResource: () => {`,\n ` return;`,\n ` },`,\n ` } as any);`,\n `});`,\n ``,\n `afterAll(() => {`,\n ` fromAssetMock?.mockRestore();`,\n `});`,\n ``,\n `describe(\"Smoke Test\", () => {`,\n ` it(\"should match previous snapshots\", () => {`,\n ` stacks.forEach((s) => {`,\n ` const template = Template.fromStack(s).toJSON();`,\n ` expect(normalizeTemplateForSnapshot(template)).toMatchSnapshot();`,\n ` });`,\n ` });`,\n `});`,\n ``,\n ],\n });\n }\n}\n","import { SourceCode } from \"projen\";\nimport { OpenHiService } from \"../../service\";\n\nexport class SrcConfig extends SourceCode {\n constructor(service: OpenHiService) {\n super(service.project, \"src/config.ts\");\n\n /**\n * Imports\n */\n this.line(`import { OpenHiConfig } from \"@openhi/config\";`);\n this.line(\"\");\n\n /**\n * Write the config content\n */\n const start = \"export const CONFIG: OpenHiConfig = \";\n const mid = JSON.stringify(service.options?.config, null, 2);\n const end = \" as const;\";\n this.line(`${start}${mid}${end}`);\n }\n}\n","import { OpenHiService } from \"../../../../service\";\nimport {\n ServiceTemplate,\n ServiceTemplateOptions,\n} from \"../../../service-template\";\n\nexport class DataModelsReadMe extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/data/models/README.md\",\n contents: [\n `# ${service.serviceName}: Data Models`,\n ``,\n `This directory contains data model definitions and other related files for the ${service.serviceName} service.`,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../../../service\";\nimport {\n ServiceTemplate,\n ServiceTemplateOptions,\n} from \"../../service-template\";\n\nexport class DataReadMe extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/data/README.md\",\n contents: [\n `# ${service.serviceName}: Data`,\n ``,\n `This directory contains data models and other related files for the ${service.serviceName} service.`,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../../../service\";\nimport {\n ServiceTemplate,\n ServiceTemplateOptions,\n} from \"../../service-template\";\n\nexport class InfrastructureReadMe extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/infrastructure/README.md\",\n contents: [\n `# ${service.serviceName}: Infrastructure`,\n ``,\n `This directory contains infrastructure definitions and other related files for the ${service.serviceName} service.`,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../../../service\";\nimport {\n ServiceTemplate,\n ServiceTemplateOptions,\n} from \"../../service-template\";\n\nexport class IntegrationsReadMe extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/integrations/README.md\",\n contents: [\n `# ${service.serviceName}: Integrations`,\n ``,\n `This directory contains integration definitions and other related files for the ${service.serviceName} service.`,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../../service\";\nimport { ServiceTemplate, ServiceTemplateOptions } from \"../service-template\";\n\nexport class SrcMain extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/main.ts\",\n contents: [`import { app } from \"./app\";`, ``, `app.synth();`, ``],\n });\n }\n}\n","import { OpenHiService } from \"../../service\";\nimport { ServiceTemplate, ServiceTemplateOptions } from \"../service-template\";\n\nexport class SrcReadMe extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/README.md\",\n contents: [\n `# ${service.serviceName}: Service Overview`,\n ``,\n `This directory contains the main entry point for the ${service.serviceName} service.`,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../../../service\";\nimport {\n ServiceTemplate,\n ServiceTemplateOptions,\n} from \"../../service-template\";\n\nexport class WorkflowsReadMe extends ServiceTemplate {\n constructor(\n service: OpenHiService,\n options?: Partial<ServiceTemplateOptions>,\n ) {\n super(service, {\n ...options,\n filePath: \"src/workflows/README.md\",\n contents: [\n `# ${service.serviceName}: Workflows`,\n ``,\n `This directory contains workflow definitions and other related files for the ${service.serviceName} service.`,\n ],\n });\n }\n}\n","import { OpenHiService } from \"../service\";\nimport { SrcApp } from \"./src/app\";\nimport { SrcAppTest } from \"./src/app-test\";\nimport { SrcConfig } from \"./src/config\";\nimport { DataModelsReadMe } from \"./src/data/models/README.md\";\nimport { DataReadMe } from \"./src/data/README.md\";\nimport { InfrastructureReadMe } from \"./src/infrastructure/README.md\";\nimport { IntegrationsReadMe } from \"./src/integrations/README.md\";\nimport { SrcMain } from \"./src/main\";\nimport { SrcReadMe } from \"./src/README.md\";\nimport { WorkflowsReadMe } from \"./src/workflows/README.md\";\n\nexport class GenerateTemplates {\n constructor(private service: OpenHiService) {\n /**\n * Root src templates\n */\n new SrcApp(this.service);\n new SrcAppTest(this.service);\n new SrcConfig(this.service);\n new SrcMain(this.service);\n new SrcReadMe(this.service);\n\n /**\n * Data\n */\n new DataReadMe(this.service);\n new DataModelsReadMe(this.service);\n\n /**\n * Infrastructure\n */\n new InfrastructureReadMe(this.service);\n\n /**\n * Integrations\n */\n new IntegrationsReadMe(this.service);\n\n /**\n * Workflows\n */\n new WorkflowsReadMe(this.service);\n }\n}\n","import {\n AwsDeploymentConfig,\n MonorepoProject,\n} from \"@codedrifters/configulator\";\nimport { OPEN_HI_STAGE } from \"@openhi/config\";\nimport { Component } from \"projen\";\nimport { GitHub, GithubWorkflow } from \"projen/lib/github\";\nimport { JobPermission } from \"projen/lib/github/workflows-model\";\nimport { OpenHi } from \"../openhi\";\nimport type { OpenHiService } from \"../service\";\n\nexport interface AwsTeardownWorkflowOptions {\n /**\n * openhi project\n */\n readonly openhi: OpenHi;\n}\n\nexport class AwsTeardownWorkflow extends Component {\n constructor(\n public rootProject: MonorepoProject,\n options: AwsTeardownWorkflowOptions,\n ) {\n super(rootProject);\n\n const { openhi } = options;\n\n /***************************************************************************\n *\n * Root project check\n *\n * Detect the root project and ensure it's of type MonorepoProject.\n *\n **************************************************************************/\n\n if (!(rootProject instanceof MonorepoProject)) {\n throw new Error(\n \"AwsTeardownWorkflow requires the root project to be a MonorepoProject\",\n );\n }\n\n //this.rootProject = project.root;\n\n /***************************************************************************\n *\n * GitHub Check\n *\n * Make sure github config is active in the project. This is to ensure all\n * workflows will be output properly during synth.\n *\n **************************************************************************/\n\n const github = GitHub.of(this.rootProject);\n\n if (!github) {\n throw new Error(\n \"AwsTeardownWorkflow requires a GitHub component in the root project\",\n );\n }\n\n /***************************************************************************\n *\n * Workflow Destroy Targets\n *\n * Find all the CI targets for the Global project in the DEV stage\n * only. One job per (account, region) teardowns all orphan stacks (Auth,\n * Core, data) in that account/region.\n *\n **************************************************************************/\n\n const devTargetsFor = (service: OpenHiService) =>\n AwsDeploymentConfig.of(service.project)?.awsDeploymentTargets.filter(\n (target) =>\n target.awsStageType === OPEN_HI_STAGE.DEV && target.ciDeployment,\n ) ?? [];\n const awsDestructionTargets = devTargetsFor(openhi.global);\n\n /***************************************************************************\n *\n * Create Workflow\n *\n * Make a new workflow for AWS stack teardown. This runs each night and is\n * also triggered each time a branch is deleted.\n *\n **************************************************************************/\n\n const workflow = new GithubWorkflow(github, \"teardown-dev\");\n workflow.on({\n workflowDispatch: {},\n schedule: [\n {\n cron: \"32 6 * * *\", // Every Sunday at 6:32 AM UTC\n },\n ],\n delete: {\n branches: [\"feature/*\", \"feat/*\", \"fix/*\"],\n },\n /* for debugging \n push: {\n branches: [\"feature/*\"],\n },\n */\n });\n\n awsDestructionTargets.forEach((target) => {\n const {\n awsStageType,\n awsEnvironmentType,\n account,\n region,\n ciDeploymentConfig,\n } = target;\n const { roleArn } = ciDeploymentConfig ?? {};\n\n workflow.addJob(`teardown-${account}-${region}`.toLowerCase(), {\n name: `Teardown Stacks in ${target.account}/${target.region}`,\n //if: \"github.event.ref_type == 'branch'\",\n runsOn: [\"ubuntu-latest\"],\n permissions: {\n contents: JobPermission.READ,\n idToken: JobPermission.WRITE,\n },\n env: {\n REPO: \"${{ github.repository }}\",\n REGIONS: [region].join(\" \"),\n },\n steps: [\n /**\n * Configure AWS creds.\n */\n {\n name: `AWS Creds ${awsStageType}/${awsEnvironmentType}/${account}/${region}`,\n uses: \"aws-actions/configure-aws-credentials@v4\",\n with: {\n \"role-to-assume\": roleArn,\n \"aws-region\": region,\n \"role-duration-seconds\": 900, // 15 minutes\n },\n },\n\n /**\n * Fetch all branch names in the repo\n */\n {\n name: \"Fetch All Branches\",\n id: \"fetch_branches\",\n uses: \"actions/github-script@v7\",\n with: {\n script: [\n \"const all = await github.paginate(github.rest.repos.listBranches, {\",\n \" owner: context.repo.owner,\",\n \" repo: context.repo.repo,\",\n \" per_page: 100\",\n \"});\",\n \"const names = all.map(b => b.name);\",\n \"console.log(`Found branches: ${names}`);\",\n 'core.setOutput(\"json\", JSON.stringify(names));',\n ].join(\"\\n\"),\n },\n },\n\n /**\n * Save branches to a file\n */\n {\n name: \"Save Branches to File\",\n run: [\n 'echo \"Saving branches to file\"',\n \"echo '${{ steps.fetch_branches.outputs.json }}' | jq -r '.[]' | sort -u > branches.txt\",\n 'echo \"Branches:\"',\n \"cat branches.txt\",\n ].join(\"\\n\"),\n },\n\n /**\n * Find all stacks tagged with a stage of dev. for this repo. return\n * tag and resource arn.\n */\n {\n name: \"Find Stacks by Tag\",\n id: \"find_stacks\",\n run: [\n \"set -euo pipefail\",\n \": > candidates.txt # columns: arn region branchTag\",\n\n \"# Build tag filters\",\n 'TAG_FILTERS=( \"Key=openhi:repo-name,Values=$REPO\" )',\n `TAG_FILTERS+=( \"Key=openhi:stage-type,Values=${OPEN_HI_STAGE.DEV}\" )`,\n\n \"for r in $REGIONS; do\",\n ` echo \"Scanning region: $r\"`,\n \" aws resourcegroupstaggingapi get-resources \\\\\",\n ' --region \"$r\" \\\\',\n ' --resource-type-filters \"cloudformation:stack\" \\\\',\n ' --tag-filters \"${TAG_FILTERS[@]}\" \\\\',\n ` | jq -r --arg r \"$r\" '`,\n \" .ResourceTagMappingList[]\",\n \" | . as $res\",\n ' | ($res.Tags[] | select(.Key==\"openhi:branch-name\") | .Value) as $branch',\n ' | [$res.ResourceARN, $r, ($branch // \"\")]',\n \" | @tsv\",\n \" ' >> candidates.txt\",\n \"done\",\n\n \"echo 'Tagged stacks:'\",\n `(echo -e \"ARN\\\\tREGION\\\\tBRANCH\"; cat candidates.txt) | column -t -s $'\\\\t'`,\n ].join(\"\\n\"),\n },\n\n /**\n * Determine which stacks are orphans that no longer have a matching branch.\n * Save those to a file for the next step.\n */\n {\n name: \"Determine Orphan Stacks (No Matching Branch)\",\n run: [\n \"set -euo pipefail\",\n \": > orphans.txt # arn region branch\",\n \"while IFS=$'\\\\t' read -r arn region branch; do\",\n ' [ -z \"$arn\" ] && continue',\n ' if [ -z \"$branch\" ]; then',\n \" # If no Branch tag, treat as not-a-preview; skip (or flip to delete if you want)\",\n \" continue\",\n \" fi\",\n ' if ! grep -Fxq \"$branch\" branches.txt; then',\n ' echo -e \"$arn\\\\t$region\\\\t$branch\" >> orphans.txt',\n \" fi\",\n \"done < candidates.txt\",\n \"\",\n \"if [ -s orphans.txt ]; then\",\n ' echo \"Orphan stacks (no matching branch):\"',\n \" (echo -e \\\"ARN\\\\tREGION\\\\tBRANCH\\\"; cat orphans.txt) | column -t -s $'\\\\t'\",\n \"else\",\n ' echo \"No orphan stacks found.\"',\n \"fi\",\n ].join(\"\\n\"),\n },\n\n /**\n * Delete orphan stacks.\n */\n {\n name: \"Delete Orphan Stacks\",\n if: \"hashFiles('orphans.txt') != ''\",\n run: [\n \"set -euo pipefail\",\n \"while IFS=$'\\\\t' read -r arn region branch; do\",\n ' [ -z \"$arn\" ] && continue',\n \" stack_name=$(cut -d'/' -f2 <<<\\\"$arn\\\")\",\n ' echo \"Deleting $stack_name (branch=$branch) in $region\"',\n ' aws cloudformation delete-stack --region \"$region\" --stack-name \"$stack_name\" || true',\n \"done < orphans.txt\",\n ].join(\"\\n\"),\n },\n ],\n });\n });\n }\n}\n","import { AwsDeployWorkflow, MonorepoProject } from \"@codedrifters/configulator\";\nimport { Component } from \"projen\";\nimport { OpenHi } from \"../openhi\";\n\nexport interface BuildDevelopmentWorkflowOptions {\n /**\n * openhi project\n */\n readonly openhi: OpenHi;\n}\n\nexport class BuildDevelopmentWorkflow extends Component {\n constructor(\n parent: MonorepoProject,\n options: BuildDevelopmentWorkflowOptions,\n ) {\n super(parent, \"dev-workflow\");\n\n const { openhi } = options;\n\n /**\n * Global Service Deploy\n *\n * Deploy the Global service first to configure DNS\n */\n const { awsDeploymentTargets: globalTargets } = new AwsDeployWorkflow(\n openhi.global.project,\n {\n buildWorkflow: parent.buildWorkflow,\n },\n );\n\n /**\n * Auth Service Deploy\n *\n * Deploy the Auth service first (Cognito); data service and other stacks consume auth via SSM.\n */\n const { awsDeploymentTargets: authTargets } = new AwsDeployWorkflow(\n openhi.auth.project,\n {\n buildWorkflow: parent.buildWorkflow,\n deployAfterTargets: [...globalTargets],\n },\n );\n\n /**\n * Data Service Deploy\n *\n * Deploy the Data service (DynamoDB FHIR store, S3) after Global.\n */\n const { awsDeploymentTargets: dataTargets } = new AwsDeployWorkflow(\n openhi.data.project,\n {\n buildWorkflow: parent.buildWorkflow,\n deployAfterTargets: [...globalTargets, ...authTargets],\n },\n );\n\n /**\n * Rest API Service Deploy\n *\n * Deploy the Rest API service after Data (and Global).\n */\n new AwsDeployWorkflow(openhi.restApi.project, {\n buildWorkflow: parent.buildWorkflow,\n deployAfterTargets: [...globalTargets, ...authTargets, ...dataTargets],\n });\n }\n}\n","import { AwsDeployWorkflow, MonorepoProject } from \"@codedrifters/configulator\";\nimport { OPEN_HI_STAGE } from \"@openhi/config\";\nimport { Component } from \"projen\";\nimport { OpenHi } from \"../openhi\";\n\nexport interface BuildStageWorkflowOptions {\n /**\n * openhi project\n */\n readonly openhi: OpenHi;\n}\n\nexport class BuildStageWorkflow extends Component {\n constructor(parent: MonorepoProject, options: BuildStageWorkflowOptions) {\n super(parent, \"stage-workflow\");\n\n const { openhi } = options;\n\n /**\n * Global Service Deploy\n *\n * Deploy the Global service first to configure DNS\n */\n const { awsDeploymentTargets: globalTargets, buildWorkflow } =\n new AwsDeployWorkflow(openhi.global.project, {\n awsStageType: OPEN_HI_STAGE.STAGE,\n buildWorkflowOptions: {\n name: \"deploy-stage\",\n workflowTriggers: {\n push: {\n branches: [\"main\"],\n },\n workflowDispatch: {},\n },\n },\n });\n\n /**\n * Auth Service Deploy\n *\n * Deploy the Auth service first (Cognito); data service and other stacks consume auth via SSM.\n * Auth creates the stage build workflow; data service and REST API services add to it.\n */\n const { awsDeploymentTargets: authTargets } = new AwsDeployWorkflow(\n openhi.auth.project,\n {\n awsStageType: OPEN_HI_STAGE.STAGE,\n buildWorkflow,\n deployAfterTargets: [...globalTargets],\n },\n );\n\n /**\n * Data Service Deploy\n *\n * Deploy the Data service (DynamoDB FHIR store, S3) after Global.\n */\n const { awsDeploymentTargets: dataTargets } = new AwsDeployWorkflow(\n openhi.data.project,\n {\n awsStageType: OPEN_HI_STAGE.STAGE,\n buildWorkflow,\n deployAfterTargets: [...globalTargets, ...authTargets],\n },\n );\n\n /**\n * Rest API Service Deploy\n */\n new AwsDeployWorkflow(openhi.restApi.project, {\n awsStageType: OPEN_HI_STAGE.STAGE,\n buildWorkflow,\n deployAfterTargets: [...globalTargets, ...authTargets, ...dataTargets],\n });\n }\n}\n"],"mappings":"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","names":["import_config","sep","sep","import_config","Component","import_config","AwsDeployWorkflow","Component"]}
|
package/package.json
CHANGED
|
@@ -1,21 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openhi/platform",
|
|
3
|
-
"scripts": {
|
|
4
|
-
"build": "npx projen build",
|
|
5
|
-
"compile": "npx projen compile",
|
|
6
|
-
"default": "npx projen default",
|
|
7
|
-
"eslint": "npx projen eslint",
|
|
8
|
-
"package": "npx projen package",
|
|
9
|
-
"post-compile": "npx projen post-compile",
|
|
10
|
-
"post-upgrade": "npx projen post-upgrade",
|
|
11
|
-
"pre-compile": "npx projen pre-compile",
|
|
12
|
-
"reset": "npx projen reset",
|
|
13
|
-
"test": "npx projen test",
|
|
14
|
-
"test:watch": "npx projen test:watch",
|
|
15
|
-
"upgrade": "npx projen upgrade",
|
|
16
|
-
"watch": "npx projen watch",
|
|
17
|
-
"projen": "npx projen"
|
|
18
|
-
},
|
|
19
3
|
"devDependencies": {
|
|
20
4
|
"@swc/core": "^1.15.11",
|
|
21
5
|
"@swc/jest": "^0.2.39",
|
|
@@ -23,6 +7,7 @@
|
|
|
23
7
|
"@types/node": "^22.19.11",
|
|
24
8
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
25
9
|
"@typescript-eslint/parser": "^8",
|
|
10
|
+
"commit-and-tag-version": "^12",
|
|
26
11
|
"eslint": "^9",
|
|
27
12
|
"eslint-config-prettier": "^10.1.8",
|
|
28
13
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
@@ -31,21 +16,45 @@
|
|
|
31
16
|
"jest": "^30.2.0",
|
|
32
17
|
"jest-junit": "^16",
|
|
33
18
|
"prettier": "^3.8.1",
|
|
19
|
+
"rollup": "^4.57.1",
|
|
20
|
+
"rollup-plugin-dts": "^6.3.0",
|
|
21
|
+
"tsup": "^8.5.1",
|
|
34
22
|
"typescript": "^5.9.3"
|
|
35
23
|
},
|
|
36
24
|
"dependencies": {
|
|
37
25
|
"@codedrifters/configulator": "0.0.101",
|
|
38
|
-
"@openhi/config": "workspace:*",
|
|
39
26
|
"change-case": "^4",
|
|
40
|
-
"constructs": "
|
|
41
|
-
"projen": "
|
|
27
|
+
"constructs": "10.4.5",
|
|
28
|
+
"projen": "0.99.12",
|
|
42
29
|
"ts-deepmerge": "7.0.3",
|
|
43
|
-
"type-fest": "^4"
|
|
30
|
+
"type-fest": "^4",
|
|
31
|
+
"@openhi/config": "0.0.0"
|
|
44
32
|
},
|
|
45
33
|
"main": "lib/index.js",
|
|
46
34
|
"license": "UNLICENSED",
|
|
47
|
-
"
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"version": "0.0.2",
|
|
48
39
|
"types": "lib/index.d.ts",
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
|
|
40
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".",
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "npx projen build",
|
|
43
|
+
"bump": "npx projen bump",
|
|
44
|
+
"compile": "npx projen compile",
|
|
45
|
+
"default": "npx projen default",
|
|
46
|
+
"eslint": "npx projen eslint",
|
|
47
|
+
"package": "npx projen package",
|
|
48
|
+
"post-compile": "npx projen post-compile",
|
|
49
|
+
"post-upgrade": "npx projen post-upgrade",
|
|
50
|
+
"pre-compile": "npx projen pre-compile",
|
|
51
|
+
"release": "npx projen release",
|
|
52
|
+
"reset": "npx projen reset",
|
|
53
|
+
"test": "npx projen test",
|
|
54
|
+
"test:watch": "npx projen test:watch",
|
|
55
|
+
"unbump": "npx projen unbump",
|
|
56
|
+
"upgrade": "npx projen upgrade",
|
|
57
|
+
"watch": "npx projen watch",
|
|
58
|
+
"projen": "npx projen"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/lib/openhi.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OpenHi = void 0;
|
|
4
|
-
const ts_deepmerge_1 = require("ts-deepmerge");
|
|
5
|
-
const service_1 = require("./service");
|
|
6
|
-
const aws_teardown_workflow_1 = require("./workflows/aws-teardown-workflow");
|
|
7
|
-
const build_dev_workflow_1 = require("./workflows/build-dev-workflow");
|
|
8
|
-
const build_stage_workflow_1 = require("./workflows/build-stage-workflow");
|
|
9
|
-
class OpenHi {
|
|
10
|
-
constructor(options = {}) {
|
|
11
|
-
/***************************************************************************
|
|
12
|
-
*
|
|
13
|
-
* Options
|
|
14
|
-
*
|
|
15
|
-
* Combine input options with defaults.
|
|
16
|
-
*
|
|
17
|
-
**************************************************************************/
|
|
18
|
-
this.options = (0, ts_deepmerge_1.merge)({ name: "openhi" }, options);
|
|
19
|
-
this.rootProject = this.options.rootProject;
|
|
20
|
-
this.id = this.options.rootProject?.name ?? "openhi";
|
|
21
|
-
/**
|
|
22
|
-
* In future we would create root project here. For now, require it to be
|
|
23
|
-
* passed in.
|
|
24
|
-
*/
|
|
25
|
-
if (!this.rootProject) {
|
|
26
|
-
throw new Error("OpenHi requires a MonorepoProject to be passed in via the rootProject option");
|
|
27
|
-
}
|
|
28
|
-
const rootProject = this.rootProject;
|
|
29
|
-
/***************************************************************************
|
|
30
|
-
*
|
|
31
|
-
* Global Service
|
|
32
|
-
*
|
|
33
|
-
* Authentication (Cognito user pool, client, domain, KMS). Deployed before
|
|
34
|
-
* Core so that Core can consume auth via SSM parameters.
|
|
35
|
-
*
|
|
36
|
-
**************************************************************************/
|
|
37
|
-
this.global = new service_1.OpenHiService(this, "global", {
|
|
38
|
-
type: service_1.OPEN_HI_SERVICE_TYPE.GLOBAL,
|
|
39
|
-
config: (0, ts_deepmerge_1.merge)(this.options?.defaultConfig ?? {}, this.options?.globalServiceConfig ?? {}),
|
|
40
|
-
});
|
|
41
|
-
/***************************************************************************
|
|
42
|
-
*
|
|
43
|
-
* Auth Service
|
|
44
|
-
*
|
|
45
|
-
* Authentication (Cognito user pool, client, domain, KMS). Deployed before
|
|
46
|
-
* Core so that Core can consume auth via SSM parameters.
|
|
47
|
-
*
|
|
48
|
-
**************************************************************************/
|
|
49
|
-
this.auth = new service_1.OpenHiService(this, "auth", {
|
|
50
|
-
type: service_1.OPEN_HI_SERVICE_TYPE.AUTH,
|
|
51
|
-
config: (0, ts_deepmerge_1.merge)(this.options?.defaultConfig ?? {}, this.options?.authServiceConfig ?? {}),
|
|
52
|
-
});
|
|
53
|
-
/***************************************************************************
|
|
54
|
-
*
|
|
55
|
-
* Rest API service
|
|
56
|
-
*
|
|
57
|
-
* This contains the REST API for the OpenHi platform.
|
|
58
|
-
*
|
|
59
|
-
**************************************************************************/
|
|
60
|
-
this.restApi = new service_1.OpenHiService(this, "rest-api", {
|
|
61
|
-
type: service_1.OPEN_HI_SERVICE_TYPE.REST_API,
|
|
62
|
-
config: (0, ts_deepmerge_1.merge)(this.options?.defaultConfig ?? {}, this.options?.restApiServiceConfig ?? {}),
|
|
63
|
-
});
|
|
64
|
-
/***************************************************************************
|
|
65
|
-
*
|
|
66
|
-
* Core Service
|
|
67
|
-
*
|
|
68
|
-
* This contains resources that are common across multiple enterprise use
|
|
69
|
-
* cases.
|
|
70
|
-
*
|
|
71
|
-
**************************************************************************/
|
|
72
|
-
this.core = new service_1.OpenHiService(this, "core", {
|
|
73
|
-
type: service_1.OPEN_HI_SERVICE_TYPE.CORE,
|
|
74
|
-
config: (0, ts_deepmerge_1.merge)(this.options?.defaultConfig ?? {}, this.options?.coreServiceConfig ?? {}),
|
|
75
|
-
});
|
|
76
|
-
/***************************************************************************
|
|
77
|
-
*
|
|
78
|
-
* Data Service
|
|
79
|
-
*
|
|
80
|
-
* Data storage stack (DynamoDB FHIR store, S3, etc.). Deployed so that
|
|
81
|
-
* REST API and other services can reference the table via cross-stack.
|
|
82
|
-
*
|
|
83
|
-
**************************************************************************/
|
|
84
|
-
this.data = new service_1.OpenHiService(this, "data", {
|
|
85
|
-
type: service_1.OPEN_HI_SERVICE_TYPE.DATA_SERVICE,
|
|
86
|
-
config: (0, ts_deepmerge_1.merge)(this.options?.defaultConfig ?? {}, this.options?.dataServiceConfig ?? {}),
|
|
87
|
-
});
|
|
88
|
-
/***************************************************************************
|
|
89
|
-
*
|
|
90
|
-
* Integrations
|
|
91
|
-
*
|
|
92
|
-
* Various purpose specific integrations.
|
|
93
|
-
*
|
|
94
|
-
**************************************************************************/
|
|
95
|
-
/***************************************************************************
|
|
96
|
-
*
|
|
97
|
-
* Workflows
|
|
98
|
-
*
|
|
99
|
-
* Workflows for each environment.
|
|
100
|
-
*
|
|
101
|
-
**************************************************************************/
|
|
102
|
-
new build_dev_workflow_1.BuildDevelopmentWorkflow(rootProject, { openhi: this });
|
|
103
|
-
new build_stage_workflow_1.BuildStageWorkflow(rootProject, { openhi: this });
|
|
104
|
-
new aws_teardown_workflow_1.AwsTeardownWorkflow(rootProject, { openhi: this });
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
exports.OpenHi = OpenHi;
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmhpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29wZW5oaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwrQ0FBcUM7QUFFckMsdUNBQWdFO0FBQ2hFLDZFQUF3RTtBQUN4RSx1RUFBMEU7QUFDMUUsMkVBQXNFO0FBNER0RSxNQUFhLE1BQU07SUEwQ2pCLFlBQVksVUFBeUIsRUFBRTtRQUNyQzs7Ozs7O29GQU00RTtRQUU1RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsb0JBQUssRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzVDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQztRQUVyRDs7O1dBR0c7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEVBQThFLENBQy9FLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVyQzs7Ozs7OztvRkFPNEU7UUFFNUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUM5QyxJQUFJLEVBQUUsOEJBQW9CLENBQUMsTUFBTTtZQUNqQyxNQUFNLEVBQUUsSUFBQSxvQkFBSyxFQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLEVBQUUsRUFDakMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsSUFBSSxFQUFFLENBQ3hDO1NBQ0YsQ0FBQyxDQUFDO1FBRUg7Ozs7Ozs7b0ZBTzRFO1FBRTVFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSx1QkFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDMUMsSUFBSSxFQUFFLDhCQUFvQixDQUFDLElBQUk7WUFDL0IsTUFBTSxFQUFFLElBQUEsb0JBQUssRUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLEVBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksRUFBRSxDQUN0QztTQUNGLENBQUMsQ0FBQztRQUVIOzs7Ozs7b0ZBTTRFO1FBRTVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx1QkFBYSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDakQsSUFBSSxFQUFFLDhCQUFvQixDQUFDLFFBQVE7WUFDbkMsTUFBTSxFQUFFLElBQUEsb0JBQUssRUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLEVBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLElBQUksRUFBRSxDQUN6QztTQUNGLENBQUMsQ0FBQztRQUVIOzs7Ozs7O29GQU80RTtRQUU1RSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQzFDLElBQUksRUFBRSw4QkFBb0IsQ0FBQyxJQUFJO1lBQy9CLE1BQU0sRUFBRSxJQUFBLG9CQUFLLEVBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLElBQUksRUFBRSxFQUNqQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixJQUFJLEVBQUUsQ0FDdEM7U0FDRixDQUFDLENBQUM7UUFFSDs7Ozs7OztvRkFPNEU7UUFFNUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLHVCQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUMxQyxJQUFJLEVBQUUsOEJBQW9CLENBQUMsWUFBWTtZQUN2QyxNQUFNLEVBQUUsSUFBQSxvQkFBSyxFQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLEVBQUUsRUFDakMsSUFBSSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxFQUFFLENBQ3RDO1NBQ0YsQ0FBQyxDQUFDO1FBRUg7Ozs7OztvRkFNNEU7UUFFNUU7Ozs7OztvRkFNNEU7UUFFNUUsSUFBSSw2Q0FBd0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RCxJQUFJLHlDQUFrQixDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXRELElBQUksMkNBQW1CLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBNUtELHdCQTRLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE1vbm9yZXBvUHJvamVjdCxcbiAgTW9ub3JlcG9Qcm9qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBjb2RlZHJpZnRlcnMvY29uZmlndWxhdG9yXCI7XG5pbXBvcnQgeyBPcGVuSGlDb25maWcgfSBmcm9tIFwiQG9wZW5oaS9jb25maWdcIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcInRzLWRlZXBtZXJnZVwiO1xuaW1wb3J0IHsgU2V0T3B0aW9uYWwgfSBmcm9tIFwidHlwZS1mZXN0XCI7XG5pbXBvcnQgeyBPUEVOX0hJX1NFUlZJQ0VfVFlQRSwgT3BlbkhpU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VcIjtcbmltcG9ydCB7IEF3c1RlYXJkb3duV29ya2Zsb3cgfSBmcm9tIFwiLi93b3JrZmxvd3MvYXdzLXRlYXJkb3duLXdvcmtmbG93XCI7XG5pbXBvcnQgeyBCdWlsZERldmVsb3BtZW50V29ya2Zsb3cgfSBmcm9tIFwiLi93b3JrZmxvd3MvYnVpbGQtZGV2LXdvcmtmbG93XCI7XG5pbXBvcnQgeyBCdWlsZFN0YWdlV29ya2Zsb3cgfSBmcm9tIFwiLi93b3JrZmxvd3MvYnVpbGQtc3RhZ2Utd29ya2Zsb3dcIjtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuSGlPcHRpb25zIHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqXG4gICAqIFJvb3QgUHJvamVjdCBDb25maWd1cmF0aW9uIE9wdGlvbnNcbiAgICpcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgcm9vdCBtb25vcmVwbyBwcm9qZWN0IHRoYXQgY29udGFpbnMgYWxsXG4gICAqIE9wZW5IaSBzZXJ2aWNlcyBhbmQgY29vcmRpbmF0ZSByZWxlYXNlcyBhbmQgYnVpbGRzLlxuICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICByZWFkb25seSByb290UHJvamVjdE9wdGlvbnM/OiBTZXRPcHRpb25hbDxNb25vcmVwb1Byb2plY3RPcHRpb25zLCBcIm5hbWVcIj47XG5cbiAgLyoqXG4gICAqIE1vbm9yZXBvIHJvb3QgcHJvamVjdCwgaWYgdXNpbmcgYW4gZXhpc3RpbmcgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RQcm9qZWN0PzogTW9ub3JlcG9Qcm9qZWN0O1xuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKlxuICAgKiBTZXJ2aWNlIENvbmZpZ3VyYXRpb24gT3B0aW9uc1xuICAgKlxuICAgKiBUaGVzZSBvcHRpb25zIGFyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdmFyaW91cyBzZXJ2aWNlcyB3aXRoaW4gdGhlIE9wZW5IaVxuICAgKiBmcmFtZXdvcmsuIEVhY2ggc2VydmljZSBjYW4gaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHdoaWNoIHdpbGxcbiAgICogYmUgbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgY29uZmlndXJhdGlvbiB1c2VkIGluIGFsbCBzZXJ2aWNlcyB3aXRoIHVuZGVmaW5lZCBjb25maWdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdENvbmZpZz86IE9wZW5IaUNvbmZpZztcblxuICAvKipcbiAgICogR2xvYmFsIFNlcnZpY2UgQ29uZmlnXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxTZXJ2aWNlQ29uZmlnPzogT3BlbkhpQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBdXRoIFNlcnZpY2UgQ29uZmlnXG4gICAqL1xuICByZWFkb25seSBhdXRoU2VydmljZUNvbmZpZz86IE9wZW5IaUNvbmZpZztcblxuICAvKipcbiAgICogUmVzdCBBUEkgU2VydmljZSBDb25maWdcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGlTZXJ2aWNlQ29uZmlnPzogT3BlbkhpQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBDb3JlIFNlcnZpY2UgQ29uZmlnXG4gICAqL1xuICByZWFkb25seSBjb3JlU2VydmljZUNvbmZpZz86IE9wZW5IaUNvbmZpZztcblxuICAvKipcbiAgICogRGF0YSBTZXJ2aWNlIENvbmZpZyAoRHluYW1vREIgRkhJUiBzdG9yZSwgUzMsIGV0Yy4pXG4gICAqL1xuICByZWFkb25seSBkYXRhU2VydmljZUNvbmZpZz86IE9wZW5IaUNvbmZpZztcbn1cblxuZXhwb3J0IGNsYXNzIE9wZW5IaSB7XG4gIC8qKlxuICAgKiBGaW5hbCBvcHRpb25zIHVzZWQgdG8gYnVpbGQgdGhpcyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBvcHRpb25zOiBPcGVuSGlPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBNb25vcmVwbyByb290IHByb2plY3QsIGVpdGhlciBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQgb3IgZ2VuZXJhdGVkIGluXG4gICAqIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9vdFByb2plY3Q/OiBNb25vcmVwb1Byb2plY3Q7XG5cbiAgLyoqXG4gICAqIFRlc3QgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHbG9iYWwgc2VydmljZSAoZGVwbG95ZWQgZmlyc3Q7IENvcmUgYW5kIGRhdGEgc2VydmljZXMgZGVwZW5kIG9uIGl0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnbG9iYWw6IE9wZW5IaVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIEF1dGggc2VydmljZSAoZGVwbG95ZWQgYmVmb3JlIENvcmU7IENvcmUgYW5kIGRhdGEgc2VydmljZXMgZGVwZW5kIG9uIGl0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhdXRoOiBPcGVuSGlTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBSZXN0IEFQSSBzZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaTogT3BlbkhpU2VydmljZTtcblxuICAvKipcbiAgICogQ29yZSBzZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29yZTogT3BlbkhpU2VydmljZTtcblxuICAvKipcbiAgICogRGF0YSBzZXJ2aWNlIChEeW5hbW9EQiBGSElSIHN0b3JlLCBTMywgYW5kIG90aGVyIHBlcnNpc3RlbmNlKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRhOiBPcGVuSGlTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5IaU9wdGlvbnMgPSB7fSkge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIE9wdGlvbnNcbiAgICAgKlxuICAgICAqIENvbWJpbmUgaW5wdXQgb3B0aW9ucyB3aXRoIGRlZmF1bHRzLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5vcHRpb25zID0gbWVyZ2UoeyBuYW1lOiBcIm9wZW5oaVwiIH0sIG9wdGlvbnMpO1xuICAgIHRoaXMucm9vdFByb2plY3QgPSB0aGlzLm9wdGlvbnMucm9vdFByb2plY3Q7XG4gICAgdGhpcy5pZCA9IHRoaXMub3B0aW9ucy5yb290UHJvamVjdD8ubmFtZSA/PyBcIm9wZW5oaVwiO1xuXG4gICAgLyoqXG4gICAgICogSW4gZnV0dXJlIHdlIHdvdWxkIGNyZWF0ZSByb290IHByb2plY3QgaGVyZS4gRm9yIG5vdywgcmVxdWlyZSBpdCB0byBiZVxuICAgICAqIHBhc3NlZCBpbi5cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMucm9vdFByb2plY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJPcGVuSGkgcmVxdWlyZXMgYSBNb25vcmVwb1Byb2plY3QgdG8gYmUgcGFzc2VkIGluIHZpYSB0aGUgcm9vdFByb2plY3Qgb3B0aW9uXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RQcm9qZWN0ID0gdGhpcy5yb290UHJvamVjdDtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIEdsb2JhbCBTZXJ2aWNlXG4gICAgICpcbiAgICAgKiBBdXRoZW50aWNhdGlvbiAoQ29nbml0byB1c2VyIHBvb2wsIGNsaWVudCwgZG9tYWluLCBLTVMpLiBEZXBsb3llZCBiZWZvcmVcbiAgICAgKiBDb3JlIHNvIHRoYXQgQ29yZSBjYW4gY29uc3VtZSBhdXRoIHZpYSBTU00gcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHRoaXMuZ2xvYmFsID0gbmV3IE9wZW5IaVNlcnZpY2UodGhpcywgXCJnbG9iYWxcIiwge1xuICAgICAgdHlwZTogT1BFTl9ISV9TRVJWSUNFX1RZUEUuR0xPQkFMLFxuICAgICAgY29uZmlnOiBtZXJnZShcbiAgICAgICAgdGhpcy5vcHRpb25zPy5kZWZhdWx0Q29uZmlnID8/IHt9LFxuICAgICAgICB0aGlzLm9wdGlvbnM/Lmdsb2JhbFNlcnZpY2VDb25maWcgPz8ge30sXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogQXV0aCBTZXJ2aWNlXG4gICAgICpcbiAgICAgKiBBdXRoZW50aWNhdGlvbiAoQ29nbml0byB1c2VyIHBvb2wsIGNsaWVudCwgZG9tYWluLCBLTVMpLiBEZXBsb3llZCBiZWZvcmVcbiAgICAgKiBDb3JlIHNvIHRoYXQgQ29yZSBjYW4gY29uc3VtZSBhdXRoIHZpYSBTU00gcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHRoaXMuYXV0aCA9IG5ldyBPcGVuSGlTZXJ2aWNlKHRoaXMsIFwiYXV0aFwiLCB7XG4gICAgICB0eXBlOiBPUEVOX0hJX1NFUlZJQ0VfVFlQRS5BVVRILFxuICAgICAgY29uZmlnOiBtZXJnZShcbiAgICAgICAgdGhpcy5vcHRpb25zPy5kZWZhdWx0Q29uZmlnID8/IHt9LFxuICAgICAgICB0aGlzLm9wdGlvbnM/LmF1dGhTZXJ2aWNlQ29uZmlnID8/IHt9LFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIFJlc3QgQVBJIHNlcnZpY2VcbiAgICAgKlxuICAgICAqIFRoaXMgY29udGFpbnMgdGhlIFJFU1QgQVBJIGZvciB0aGUgT3BlbkhpIHBsYXRmb3JtLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5yZXN0QXBpID0gbmV3IE9wZW5IaVNlcnZpY2UodGhpcywgXCJyZXN0LWFwaVwiLCB7XG4gICAgICB0eXBlOiBPUEVOX0hJX1NFUlZJQ0VfVFlQRS5SRVNUX0FQSSxcbiAgICAgIGNvbmZpZzogbWVyZ2UoXG4gICAgICAgIHRoaXMub3B0aW9ucz8uZGVmYXVsdENvbmZpZyA/PyB7fSxcbiAgICAgICAgdGhpcy5vcHRpb25zPy5yZXN0QXBpU2VydmljZUNvbmZpZyA/PyB7fSxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBDb3JlIFNlcnZpY2VcbiAgICAgKlxuICAgICAqIFRoaXMgY29udGFpbnMgcmVzb3VyY2VzIHRoYXQgYXJlIGNvbW1vbiBhY3Jvc3MgbXVsdGlwbGUgZW50ZXJwcmlzZSB1c2VcbiAgICAgKiBjYXNlcy5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHRoaXMuY29yZSA9IG5ldyBPcGVuSGlTZXJ2aWNlKHRoaXMsIFwiY29yZVwiLCB7XG4gICAgICB0eXBlOiBPUEVOX0hJX1NFUlZJQ0VfVFlQRS5DT1JFLFxuICAgICAgY29uZmlnOiBtZXJnZShcbiAgICAgICAgdGhpcy5vcHRpb25zPy5kZWZhdWx0Q29uZmlnID8/IHt9LFxuICAgICAgICB0aGlzLm9wdGlvbnM/LmNvcmVTZXJ2aWNlQ29uZmlnID8/IHt9LFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIERhdGEgU2VydmljZVxuICAgICAqXG4gICAgICogRGF0YSBzdG9yYWdlIHN0YWNrIChEeW5hbW9EQiBGSElSIHN0b3JlLCBTMywgZXRjLikuIERlcGxveWVkIHNvIHRoYXRcbiAgICAgKiBSRVNUIEFQSSBhbmQgb3RoZXIgc2VydmljZXMgY2FuIHJlZmVyZW5jZSB0aGUgdGFibGUgdmlhIGNyb3NzLXN0YWNrLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5kYXRhID0gbmV3IE9wZW5IaVNlcnZpY2UodGhpcywgXCJkYXRhXCIsIHtcbiAgICAgIHR5cGU6IE9QRU5fSElfU0VSVklDRV9UWVBFLkRBVEFfU0VSVklDRSxcbiAgICAgIGNvbmZpZzogbWVyZ2UoXG4gICAgICAgIHRoaXMub3B0aW9ucz8uZGVmYXVsdENvbmZpZyA/PyB7fSxcbiAgICAgICAgdGhpcy5vcHRpb25zPy5kYXRhU2VydmljZUNvbmZpZyA/PyB7fSxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBJbnRlZ3JhdGlvbnNcbiAgICAgKlxuICAgICAqIFZhcmlvdXMgcHVycG9zZSBzcGVjaWZpYyBpbnRlZ3JhdGlvbnMuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBXb3JrZmxvd3NcbiAgICAgKlxuICAgICAqIFdvcmtmbG93cyBmb3IgZWFjaCBlbnZpcm9ubWVudC5cbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIG5ldyBCdWlsZERldmVsb3BtZW50V29ya2Zsb3cocm9vdFByb2plY3QsIHsgb3BlbmhpOiB0aGlzIH0pO1xuICAgIG5ldyBCdWlsZFN0YWdlV29ya2Zsb3cocm9vdFByb2plY3QsIHsgb3BlbmhpOiB0aGlzIH0pO1xuXG4gICAgbmV3IEF3c1RlYXJkb3duV29ya2Zsb3cocm9vdFByb2plY3QsIHsgb3BlbmhpOiB0aGlzIH0pO1xuICB9XG59XG4iXX0=
|
package/lib/service.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { OpenHiConfig } from "@openhi/config";
|
|
2
|
-
import { awscdk } from "projen";
|
|
3
|
-
import { ValueOf } from "type-fest";
|
|
4
|
-
import { OpenHi } from "./openhi";
|
|
5
|
-
export declare const OPEN_HI_SERVICE_TYPE: {
|
|
6
|
-
readonly AUTH: "auth";
|
|
7
|
-
readonly CORE: "core";
|
|
8
|
-
readonly DATA_SERVICE: "data";
|
|
9
|
-
readonly GLOBAL: "global";
|
|
10
|
-
readonly INTEGRATION: "integration";
|
|
11
|
-
readonly REST_API: "rest-api";
|
|
12
|
-
};
|
|
13
|
-
export interface OpenHiServiceOptions {
|
|
14
|
-
/**
|
|
15
|
-
* Configuration for this service.
|
|
16
|
-
*
|
|
17
|
-
* @default uses the global default config.
|
|
18
|
-
*/
|
|
19
|
-
readonly config: OpenHiConfig;
|
|
20
|
-
/**
|
|
21
|
-
* What type of service is this?
|
|
22
|
-
*/
|
|
23
|
-
readonly type: ValueOf<typeof OPEN_HI_SERVICE_TYPE>;
|
|
24
|
-
}
|
|
25
|
-
export declare class OpenHiService {
|
|
26
|
-
openHi: OpenHi;
|
|
27
|
-
id: string;
|
|
28
|
-
options: OpenHiServiceOptions;
|
|
29
|
-
readonly project: awscdk.AwsCdkTypeScriptApp;
|
|
30
|
-
constructor(openHi: OpenHi, id: string, options: OpenHiServiceOptions);
|
|
31
|
-
private addDeploymentTarget;
|
|
32
|
-
get constructName(): string;
|
|
33
|
-
get outDir(): string;
|
|
34
|
-
get serviceName(): string;
|
|
35
|
-
get typeDir(): Array<string>;
|
|
36
|
-
}
|
package/lib/service.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OpenHiService = exports.OPEN_HI_SERVICE_TYPE = void 0;
|
|
4
|
-
const path_1 = require("path");
|
|
5
|
-
const configulator_1 = require("@codedrifters/configulator");
|
|
6
|
-
const config_1 = require("@openhi/config");
|
|
7
|
-
const change_case_1 = require("change-case");
|
|
8
|
-
const projen_1 = require("projen");
|
|
9
|
-
const javascript_1 = require("projen/lib/javascript");
|
|
10
|
-
const generate_templates_1 = require("./templates/generate-templates");
|
|
11
|
-
exports.OPEN_HI_SERVICE_TYPE = {
|
|
12
|
-
AUTH: "auth",
|
|
13
|
-
CORE: "core",
|
|
14
|
-
DATA_SERVICE: "data",
|
|
15
|
-
GLOBAL: "global",
|
|
16
|
-
INTEGRATION: "integration",
|
|
17
|
-
REST_API: "rest-api",
|
|
18
|
-
};
|
|
19
|
-
class OpenHiService {
|
|
20
|
-
constructor(openHi, id, options) {
|
|
21
|
-
/**
|
|
22
|
-
* Build the construct name we expect to use in this service.
|
|
23
|
-
*/
|
|
24
|
-
this.openHi = openHi;
|
|
25
|
-
this.id = id;
|
|
26
|
-
this.options = options;
|
|
27
|
-
this.addDeploymentTarget = (awsStageType, awsEnvironmentType, envConfig) => {
|
|
28
|
-
new configulator_1.AwsDeploymentTarget(this.project, {
|
|
29
|
-
account: envConfig.account,
|
|
30
|
-
region: envConfig.region,
|
|
31
|
-
awsStageType,
|
|
32
|
-
awsEnvironmentType,
|
|
33
|
-
localDeployment: true,
|
|
34
|
-
localDeploymentConfig: {
|
|
35
|
-
stackPattern: `${awsStageType}/${awsEnvironmentType}/*-${envConfig.account}-${envConfig.region}`,
|
|
36
|
-
roleName: "poweruseraccess",
|
|
37
|
-
},
|
|
38
|
-
ciDeployment: true,
|
|
39
|
-
ciDeploymentConfig: {
|
|
40
|
-
roleArn: `arn:aws:iam::${envConfig.account}:role/GitHubOpenHiDeployer`,
|
|
41
|
-
stackPattern: `${awsStageType}/${awsEnvironmentType}/*-${envConfig.account}-${envConfig.region}`,
|
|
42
|
-
},
|
|
43
|
-
branches: awsStageType === config_1.OPEN_HI_STAGE.DEV
|
|
44
|
-
? [
|
|
45
|
-
{
|
|
46
|
-
branch: "feat/*",
|
|
47
|
-
description: [
|
|
48
|
-
"Feature branches for OpenHI (short form).",
|
|
49
|
-
"These branches are used for developing new features.",
|
|
50
|
-
],
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
branch: "feature/*",
|
|
54
|
-
description: [
|
|
55
|
-
"Feature branches for OpenHI.",
|
|
56
|
-
"These branches are used for developing new features.",
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
branch: "fix/*",
|
|
61
|
-
description: [
|
|
62
|
-
"Fix branches for OpenHI.",
|
|
63
|
-
"This branch pattern is used when a developer is working on a fix on the project.",
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
]
|
|
67
|
-
: [
|
|
68
|
-
{
|
|
69
|
-
branch: "main",
|
|
70
|
-
description: [
|
|
71
|
-
"Main branch for OpenHI.",
|
|
72
|
-
"This branch is used for the main branch.",
|
|
73
|
-
],
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
});
|
|
77
|
-
};
|
|
78
|
-
/***************************************************************************
|
|
79
|
-
*
|
|
80
|
-
* Projen based CDK build
|
|
81
|
-
*
|
|
82
|
-
**************************************************************************/
|
|
83
|
-
this.project = new projen_1.awscdk.AwsCdkTypeScriptApp({
|
|
84
|
-
/**
|
|
85
|
-
* Top level project config options
|
|
86
|
-
*/
|
|
87
|
-
defaultReleaseBranch: "main",
|
|
88
|
-
name: this.serviceName,
|
|
89
|
-
outdir: this.outDir,
|
|
90
|
-
parent: this.openHi.rootProject,
|
|
91
|
-
cdkVersion: this.options?.config?.versions?.cdk?.cdkLibVersion ??
|
|
92
|
-
configulator_1.VERSION.AWS_CDK_LIB_VERSION,
|
|
93
|
-
cdkCliVersion: this.options?.config?.versions?.cdk?.cdkCliVersion ??
|
|
94
|
-
configulator_1.VERSION.AWS_CDK_CLI_VERSION,
|
|
95
|
-
/**
|
|
96
|
-
* Packaging options
|
|
97
|
-
*
|
|
98
|
-
* TODO: Figure out license for monorepo vs per package?
|
|
99
|
-
*/
|
|
100
|
-
licensed: false,
|
|
101
|
-
/**
|
|
102
|
-
* Node configs
|
|
103
|
-
*/
|
|
104
|
-
packageManager: javascript_1.NodePackageManager.PNPM,
|
|
105
|
-
/**
|
|
106
|
-
* Turn on prettier formatting
|
|
107
|
-
*/
|
|
108
|
-
prettier: true,
|
|
109
|
-
/**
|
|
110
|
-
* Don't generate sample code.
|
|
111
|
-
*/
|
|
112
|
-
sampleCode: false,
|
|
113
|
-
/**
|
|
114
|
-
* Make sure jest config is stored outside of package.json and use SWC
|
|
115
|
-
* for faster tests.
|
|
116
|
-
*/
|
|
117
|
-
jestOptions: {
|
|
118
|
-
configFilePath: "jest.config.json",
|
|
119
|
-
jestConfig: {
|
|
120
|
-
transform: {
|
|
121
|
-
["^.+\\.[t]sx?$"]: new javascript_1.Transform("@swc/jest"),
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
/**
|
|
126
|
-
* SWC for faster testing
|
|
127
|
-
*/
|
|
128
|
-
devDeps: ["@swc/jest", "@swc/core"],
|
|
129
|
-
/**
|
|
130
|
-
* Don't package test files.
|
|
131
|
-
*/
|
|
132
|
-
npmIgnoreOptions: {
|
|
133
|
-
ignorePatterns: ["*.spec.*", "*.test.*"],
|
|
134
|
-
},
|
|
135
|
-
});
|
|
136
|
-
/**
|
|
137
|
-
* We're using SWC now, remove ts-jest which is included by default.
|
|
138
|
-
*/
|
|
139
|
-
this.project.deps.removeDependency("ts-jest");
|
|
140
|
-
/***************************************************************************
|
|
141
|
-
*
|
|
142
|
-
* Workspace Dependencies
|
|
143
|
-
*
|
|
144
|
-
* - Constructs are used to build out the AWS CDK environments.
|
|
145
|
-
*
|
|
146
|
-
**************************************************************************/
|
|
147
|
-
this.project.addDeps("@openhi/config@workspace:*", "@openhi/constructs@workspace:*");
|
|
148
|
-
/***************************************************************************
|
|
149
|
-
*
|
|
150
|
-
* Turbo Configuration
|
|
151
|
-
*
|
|
152
|
-
* - Activate turborepo for the project.
|
|
153
|
-
*
|
|
154
|
-
**************************************************************************/
|
|
155
|
-
new configulator_1.TurboRepo(this.project);
|
|
156
|
-
/***************************************************************************
|
|
157
|
-
*
|
|
158
|
-
* Define some basic Service Structure
|
|
159
|
-
*
|
|
160
|
-
**************************************************************************/
|
|
161
|
-
new generate_templates_1.GenerateTemplates(this);
|
|
162
|
-
/***************************************************************************
|
|
163
|
-
*
|
|
164
|
-
* Deployment Targets
|
|
165
|
-
*
|
|
166
|
-
**************************************************************************/
|
|
167
|
-
[config_1.OPEN_HI_STAGE.DEV, config_1.OPEN_HI_STAGE.STAGE, config_1.OPEN_HI_STAGE.PROD].forEach((stage) => {
|
|
168
|
-
const targets = this.options?.config?.deploymentTargets?.[stage];
|
|
169
|
-
if (targets?.primary) {
|
|
170
|
-
this.addDeploymentTarget(stage, config_1.OPEN_HI_DEPLOYMENT_TARGET_ROLE.PRIMARY, targets.primary);
|
|
171
|
-
}
|
|
172
|
-
targets?.secondary?.forEach((env) => {
|
|
173
|
-
this.addDeploymentTarget(stage, config_1.OPEN_HI_DEPLOYMENT_TARGET_ROLE.SECONDARY, env);
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
get constructName() {
|
|
178
|
-
return (0, change_case_1.pascalCase)(["open", "hi", this.id, "service"].join("-"));
|
|
179
|
-
}
|
|
180
|
-
get outDir() {
|
|
181
|
-
return [
|
|
182
|
-
(0, change_case_1.paramCase)(this.openHi.id),
|
|
183
|
-
...this.typeDir.map((x) => (0, change_case_1.paramCase)(x)),
|
|
184
|
-
(0, change_case_1.paramCase)(this.id),
|
|
185
|
-
].join(path_1.sep);
|
|
186
|
-
}
|
|
187
|
-
get serviceName() {
|
|
188
|
-
return [(0, change_case_1.paramCase)(this.openHi.id), (0, change_case_1.paramCase)(this.id)].join("-");
|
|
189
|
-
}
|
|
190
|
-
get typeDir() {
|
|
191
|
-
return [];
|
|
192
|
-
/*
|
|
193
|
-
return this.options.type === OPEN_HI_SERVICE_TYPE.AUTH ||
|
|
194
|
-
this.options.type === OPEN_HI_SERVICE_TYPE.CORE ||
|
|
195
|
-
this.options.type === OPEN_HI_SERVICE_TYPE.GLOBAL
|
|
196
|
-
? []
|
|
197
|
-
: this.options.type === OPEN_HI_SERVICE_TYPE.DATA_SERVICE
|
|
198
|
-
? ["data"]
|
|
199
|
-
: ["integration"];*/
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
exports.OpenHiService = OpenHiService;
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUEyQjtBQUMzQiw2REFJb0M7QUFDcEMsMkNBS3dCO0FBQ3hCLDZDQUFvRDtBQUNwRCxtQ0FBZ0M7QUFDaEMsc0RBQXNFO0FBR3RFLHVFQUFtRTtBQUV0RCxRQUFBLG9CQUFvQixHQUFHO0lBQ2xDLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixZQUFZLEVBQUUsTUFBTTtJQUNwQixNQUFNLEVBQUUsUUFBUTtJQUNoQixXQUFXLEVBQUUsYUFBYTtJQUMxQixRQUFRLEVBQUUsVUFBVTtDQUNaLENBQUM7QUFnQlgsTUFBYSxhQUFhO0lBR3hCLFlBQ1MsTUFBYyxFQUNkLEVBQVUsRUFDVixPQUE2QjtRQUVwQzs7V0FFRztRQU5JLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxPQUFFLEdBQUYsRUFBRSxDQUFRO1FBQ1YsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUEwSTlCLHdCQUFtQixHQUFHLENBQzVCLFlBQTJDLEVBQzNDLGtCQUFrRSxFQUNsRSxTQUFrQyxFQUNsQyxFQUFFO1lBQ0YsSUFBSSxrQ0FBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNwQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87Z0JBQzFCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtnQkFDeEIsWUFBWTtnQkFDWixrQkFBa0I7Z0JBQ2xCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixxQkFBcUIsRUFBRTtvQkFDckIsWUFBWSxFQUFFLEdBQUcsWUFBWSxJQUFJLGtCQUFrQixNQUFNLFNBQVMsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtvQkFDaEcsUUFBUSxFQUFFLGlCQUFpQjtpQkFDNUI7Z0JBQ0QsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLGtCQUFrQixFQUFFO29CQUNsQixPQUFP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SUFBQSx1QkFBUyxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxFQUFFLENBQUM7UUFDVjs7Ozs7OztnQ0FPd0I7SUFDMUIsQ0FBQztDQUNGO0FBck9ELHNDQXFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNlcCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBBd3NEZXBsb3ltZW50VGFyZ2V0LFxuICBUdXJib1JlcG8sXG4gIFZFUlNJT04sXG59IGZyb20gXCJAY29kZWRyaWZ0ZXJzL2NvbmZpZ3VsYXRvclwiO1xuaW1wb3J0IHtcbiAgT1BFTl9ISV9ERVBMT1lNRU5UX1RBUkdFVF9ST0xFLFxuICBPUEVOX0hJX1NUQUdFLFxuICBPcGVuSGlDb25maWcsXG4gIE9wZW5IaUVudmlyb25tZW50Q29uZmlnLFxufSBmcm9tIFwiQG9wZW5oaS9jb25maWdcIjtcbmltcG9ydCB7IHBhcmFtQ2FzZSwgcGFzY2FsQ2FzZSB9IGZyb20gXCJjaGFuZ2UtY2FzZVwiO1xuaW1wb3J0IHsgYXdzY2RrIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyLCBUcmFuc2Zvcm0gfSBmcm9tIFwicHJvamVuL2xpYi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBWYWx1ZU9mIH0gZnJvbSBcInR5cGUtZmVzdFwiO1xuaW1wb3J0IHsgT3BlbkhpIH0gZnJvbSBcIi4vb3BlbmhpXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZVRlbXBsYXRlcyB9IGZyb20gXCIuL3RlbXBsYXRlcy9nZW5lcmF0ZS10ZW1wbGF0ZXNcIjtcblxuZXhwb3J0IGNvbnN0IE9QRU5fSElfU0VSVklDRV9UWVBFID0ge1xuICBBVVRIOiBcImF1dGhcIixcbiAgQ09SRTogXCJjb3JlXCIsXG4gIERBVEFfU0VSVklDRTogXCJkYXRhXCIsXG4gIEdMT0JBTDogXCJnbG9iYWxcIixcbiAgSU5URUdSQVRJT046IFwiaW50ZWdyYXRpb25cIixcbiAgUkVTVF9BUEk6IFwicmVzdC1hcGlcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkhpU2VydmljZU9wdGlvbnMge1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1c2VzIHRoZSBnbG9iYWwgZGVmYXVsdCBjb25maWcuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IE9wZW5IaUNvbmZpZztcblxuICAvKipcbiAgICogV2hhdCB0eXBlIG9mIHNlcnZpY2UgaXMgdGhpcz9cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFZhbHVlT2Y8dHlwZW9mIE9QRU5fSElfU0VSVklDRV9UWVBFPjtcbn1cblxuZXhwb3J0IGNsYXNzIE9wZW5IaVNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvamVjdDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wZW5IaTogT3BlbkhpLFxuICAgIHB1YmxpYyBpZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvcHRpb25zOiBPcGVuSGlTZXJ2aWNlT3B0aW9ucyxcbiAgKSB7XG4gICAgLyoqXG4gICAgICogQnVpbGQgdGhlIGNvbnN0cnVjdCBuYW1lIHdlIGV4cGVjdCB0byB1c2UgaW4gdGhpcyBzZXJ2aWNlLlxuICAgICAqL1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogUHJvamVuIGJhc2VkIENESyBidWlsZFxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5wcm9qZWN0ID0gbmV3IGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwKHtcbiAgICAgIC8qKlxuICAgICAgICogVG9wIGxldmVsIHByb2plY3QgY29uZmlnIG9wdGlvbnNcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFJlbGVhc2VCcmFuY2g6IFwibWFpblwiLFxuICAgICAgbmFtZTogdGhpcy5zZXJ2aWNlTmFtZSxcbiAgICAgIG91dGRpcjogdGhpcy5vdXREaXIsXG4gICAgICBwYXJlbnQ6IHRoaXMub3BlbkhpLnJvb3RQcm9qZWN0LFxuICAgICAgY2RrVmVyc2lvbjpcbiAgICAgICAgdGhpcy5vcHRpb25zPy5jb25maWc/LnZlcnNpb25zPy5jZGs/LmNka0xpYlZlcnNpb24gPz9cbiAgICAgICAgVkVSU0lPTi5BV1NfQ0RLX0xJQl9WRVJTSU9OLFxuICAgICAgY2RrQ2xpVmVyc2lvbjpcbiAgICAgICAgdGhpcy5vcHRpb25zPy5jb25maWc/LnZlcnNpb25zPy5jZGs/LmNka0NsaVZlcnNpb24gPz9cbiAgICAgICAgVkVSU0lPTi5BV1NfQ0RLX0NMSV9WRVJTSU9OLFxuXG4gICAgICAvKipcbiAgICAgICAqIFBhY2thZ2luZyBvcHRpb25zXG4gICAgICAgKlxuICAgICAgICogVE9ETzogRmlndXJlIG91dCBsaWNlbnNlIGZvciBtb25vcmVwbyB2cyBwZXIgcGFja2FnZT9cbiAgICAgICAqL1xuICAgICAgbGljZW5zZWQ6IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIE5vZGUgY29uZmlnc1xuICAgICAgICovXG4gICAgICBwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVHVybiBvbiBwcmV0dGllciBmb3JtYXR0aW5nXG4gICAgICAgKi9cbiAgICAgIHByZXR0aWVyOiB0cnVlLFxuXG4gICAgICAvKipcbiAgICAgICAqIERvbid0IGdlbmVyYXRlIHNhbXBsZSBjb2RlLlxuICAgICAgICovXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBNYWtlIHN1cmUgamVzdCBjb25maWcgaXMgc3RvcmVkIG91dHNpZGUgb2YgcGFja2FnZS5qc29uIGFuZCB1c2UgU1dDXG4gICAgICAgKiBmb3IgZmFzdGVyIHRlc3RzLlxuICAgICAgICovXG4gICAgICBqZXN0T3B0aW9uczoge1xuICAgICAgICBjb25maWdGaWxlUGF0aDogXCJqZXN0LmNvbmZpZy5qc29uXCIsXG4gICAgICAgIGplc3RDb25maWc6IHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICAgIFtcIl4uK1xcXFwuW3Rdc3g/JFwiXTogbmV3IFRyYW5zZm9ybShcIkBzd2MvamVzdFwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTV0MgZm9yIGZhc3RlciB0ZXN0aW5nXG4gICAgICAgKi9cbiAgICAgIGRldkRlcHM6IFtcIkBzd2MvamVzdFwiLCBcIkBzd2MvY29yZVwiXSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEb24ndCBwYWNrYWdlIHRlc3QgZmlsZXMuXG4gICAgICAgKi9cbiAgICAgIG5wbUlnbm9yZU9wdGlvbnM6IHtcbiAgICAgICAgaWdub3JlUGF0dGVybnM6IFtcIiouc3BlYy4qXCIsIFwiKi50ZXN0LipcIl0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogV2UncmUgdXNpbmcgU1dDIG5vdywgcmVtb3ZlIHRzLWplc3Qgd2hpY2ggaXMgaW5jbHVkZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICB0aGlzLnByb2plY3QuZGVwcy5yZW1vdmVEZXBlbmRlbmN5KFwidHMtamVzdFwiKTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIFdvcmtzcGFjZSBEZXBlbmRlbmNpZXNcbiAgICAgKlxuICAgICAqIC0gQ29uc3RydWN0cyBhcmUgdXNlZCB0byBidWlsZCBvdXQgdGhlIEFXUyBDREsgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgdGhpcy5wcm9qZWN0LmFkZERlcHMoXG4gICAgICBcIkBvcGVuaGkvY29uZmlnQHdvcmtzcGFjZToqXCIsXG4gICAgICBcIkBvcGVuaGkvY29uc3RydWN0c0B3b3Jrc3BhY2U6KlwiLFxuICAgICk7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBUdXJibyBDb25maWd1cmF0aW9uXG4gICAgICpcbiAgICAgKiAtIEFjdGl2YXRlIHR1cmJvcmVwbyBmb3IgdGhlIHByb2plY3QuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBuZXcgVHVyYm9SZXBvKHRoaXMucHJvamVjdCk7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBEZWZpbmUgc29tZSBiYXNpYyBTZXJ2aWNlIFN0cnVjdHVyZVxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgbmV3IEdlbmVyYXRlVGVtcGxhdGVzKHRoaXMpO1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogRGVwbG95bWVudCBUYXJnZXRzXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBbT1BFTl9ISV9TVEFHRS5ERVYsIE9QRU5fSElfU1RBR0UuU1RBR0UsIE9QRU5fSElfU1RBR0UuUFJPRF0uZm9yRWFjaChcbiAgICAgIChzdGFnZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy5vcHRpb25zPy5jb25maWc/LmRlcGxveW1lbnRUYXJnZXRzPy5bc3RhZ2VdO1xuICAgICAgICBpZiAodGFyZ2V0cz8ucHJpbWFyeSkge1xuICAgICAgICAgIHRoaXMuYWRkRGVwbG95bWVudFRhcmdldChcbiAgICAgICAgICAgIHN0YWdlLFxuICAgICAgICAgICAgT1BFTl9ISV9ERVBMT1lNRU5UX1RBUkdFVF9ST0xFLlBSSU1BUlksXG4gICAgICAgICAgICB0YXJnZXRzLnByaW1hcnksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRzPy5zZWNvbmRhcnk/LmZvckVhY2goKGVudikgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkRGVwbG95bWVudFRhcmdldChcbiAgICAgICAgICAgIHN0YWdlLFxuICAgICAgICAgICAgT1BFTl9ISV9ERVBMT1lNRU5UX1RBUkdFVF9ST0xFLlNFQ09OREFSWSxcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVwbG95bWVudFRhcmdldCA9IChcbiAgICBhd3NTdGFnZVR5cGU6IFZhbHVlT2Y8dHlwZW9mIE9QRU5fSElfU1RBR0U+LFxuICAgIGF3c0Vudmlyb25tZW50VHlwZTogVmFsdWVPZjx0eXBlb2YgT1BFTl9ISV9ERVBMT1lNRU5UX1RBUkdFVF9ST0xFPixcbiAgICBlbnZDb25maWc6IE9wZW5IaUVudmlyb25tZW50Q29uZmlnLFxuICApID0+IHtcbiAgICBuZXcgQXdzRGVwbG95bWVudFRhcmdldCh0aGlzLnByb2plY3QsIHtcbiAgICAgIGFjY291bnQ6IGVudkNvbmZpZy5hY2NvdW50LFxuICAgICAgcmVnaW9uOiBlbnZDb25maWcucmVnaW9uLFxuICAgICAgYXdzU3RhZ2VUeXBlLFxuICAgICAgYXdzRW52aXJvbm1lbnRUeXBlLFxuICAgICAgbG9jYWxEZXBsb3ltZW50OiB0cnVlLFxuICAgICAgbG9jYWxEZXBsb3ltZW50Q29uZmlnOiB7XG4gICAgICAgIHN0YWNrUGF0dGVybjogYCR7YXdzU3RhZ2VUeXBlfS8ke2F3c0Vudmlyb25tZW50VHlwZX0vKi0ke2VudkNvbmZpZy5hY2NvdW50fS0ke2VudkNvbmZpZy5yZWdpb259YCxcbiAgICAgICAgcm9sZU5hbWU6IFwicG93ZXJ1c2VyYWNjZXNzXCIsXG4gICAgICB9LFxuICAgICAgY2lEZXBsb3ltZW50OiB0cnVlLFxuICAgICAgY2lEZXBsb3ltZW50Q29uZmlnOiB7XG4gICAgICAgIHJvbGVBcm46IGBhcm46YXdzOmlhbTo6JHtlbnZDb25maWcuYWNjb3VudH06cm9sZS9HaXRIdWJPcGVuSGlEZXBsb3llcmAsXG4gICAgICAgIHN0YWNrUGF0dGVybjogYCR7YXdzU3RhZ2VUeXBlfS8ke2F3c0Vudmlyb25tZW50VHlwZX0vKi0ke2VudkNvbmZpZy5hY2NvdW50fS0ke2VudkNvbmZpZy5yZWdpb259YCxcbiAgICAgIH0sXG5cbiAgICAgIGJyYW5jaGVzOlxuICAgICAgICBhd3NTdGFnZVR5cGUgPT09IE9QRU5fSElfU1RBR0UuREVWXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBicmFuY2g6IFwiZmVhdC8qXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFtcbiAgICAgICAgICAgICAgICAgIFwiRmVhdHVyZSBicmFuY2hlcyBmb3IgT3BlbkhJIChzaG9ydCBmb3JtKS5cIixcbiAgICAgICAgICAgICAgICAgIFwiVGhlc2UgYnJhbmNoZXMgYXJlIHVzZWQgZm9yIGRldmVsb3BpbmcgbmV3IGZlYXR1cmVzLlwiLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBicmFuY2g6IFwiZmVhdHVyZS8qXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFtcbiAgICAgICAgICAgICAgICAgIFwiRmVhdHVyZSBicmFuY2hlcyBmb3IgT3BlbkhJLlwiLFxuICAgICAgICAgICAgICAgICAgXCJUaGVzZSBicmFuY2hlcyBhcmUgdXNlZCBmb3IgZGV2ZWxvcGluZyBuZXcgZmVhdHVyZXMuXCIsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJyYW5jaDogXCJmaXgvKlwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbXG4gICAgICAgICAgICAgICAgICBcIkZpeCBicmFuY2hlcyBmb3IgT3BlbkhJLlwiLFxuICAgICAgICAgICAgICAgICAgXCJUaGlzIGJyYW5jaCBwYXR0ZXJuIGlzIHVzZWQgd2hlbiBhIGRldmVsb3BlciBpcyB3b3JraW5nIG9uIGEgZml4IG9uIHRoZSBwcm9qZWN0LlwiLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBicmFuY2g6IFwibWFpblwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbXG4gICAgICAgICAgICAgICAgICBcIk1haW4gYnJhbmNoIGZvciBPcGVuSEkuXCIsXG4gICAgICAgICAgICAgICAgICBcIlRoaXMgYnJhbmNoIGlzIHVzZWQgZm9yIHRoZSBtYWluIGJyYW5jaC5cIixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICB9KTtcbiAgfTtcblxuICBnZXQgY29uc3RydWN0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXNjYWxDYXNlKFtcIm9wZW5cIiwgXCJoaVwiLCB0aGlzLmlkLCBcInNlcnZpY2VcIl0uam9pbihcIi1cIikpO1xuICB9XG5cbiAgZ2V0IG91dERpcigpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcGFyYW1DYXNlKHRoaXMub3BlbkhpLmlkKSxcbiAgICAgIC4uLnRoaXMudHlwZURpci5tYXAoKHgpID0+IHBhcmFtQ2FzZSh4KSksXG4gICAgICBwYXJhbUNhc2UodGhpcy5pZCksXG4gICAgXS5qb2luKHNlcCk7XG4gIH1cblxuICBnZXQgc2VydmljZU5hbWUoKSB7XG4gICAgcmV0dXJuIFtwYXJhbUNhc2UodGhpcy5vcGVuSGkuaWQpLCBwYXJhbUNhc2UodGhpcy5pZCldLmpvaW4oXCItXCIpO1xuICB9XG5cbiAgZ2V0IHR5cGVEaXIoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFtdO1xuICAgIC8qXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy50eXBlID09PSBPUEVOX0hJX1NFUlZJQ0VfVFlQRS5BVVRIIHx8XG4gICAgICB0aGlzLm9wdGlvbnMudHlwZSA9PT0gT1BFTl9ISV9TRVJWSUNFX1RZUEUuQ09SRSB8fFxuICAgICAgdGhpcy5vcHRpb25zLnR5cGUgPT09IE9QRU5fSElfU0VSVklDRV9UWVBFLkdMT0JBTFxuICAgICAgPyBbXVxuICAgICAgOiB0aGlzLm9wdGlvbnMudHlwZSA9PT0gT1BFTl9ISV9TRVJWSUNFX1RZUEUuREFUQV9TRVJWSUNFXG4gICAgICAgID8gW1wiZGF0YVwiXVxuICAgICAgICA6IFtcImludGVncmF0aW9uXCJdOyovXG4gIH1cbn1cbiJdfQ==
|