diff --git a/.github/workflows/cloud-deploy-preview.yml b/.github/workflows/cloud-deploy-preview_reusable.yml similarity index 73% rename from .github/workflows/cloud-deploy-preview.yml rename to .github/workflows/cloud-deploy-preview_reusable.yml index a24f9f00d5..e0cb024565 100644 --- a/.github/workflows/cloud-deploy-preview.yml +++ b/.github/workflows/cloud-deploy-preview_reusable.yml @@ -5,6 +5,10 @@ name: "[Cloud] Preview Deploy" on: workflow_call: inputs: + project: + required: true + type: string + description: "The project to deploy" baseRef: required: true type: string @@ -12,7 +16,7 @@ on: defaults: run: - working-directory: ./cloud/infrastructure + working-directory: ./infra jobs: build-and-preview: @@ -24,10 +28,10 @@ jobs: - name: ✋ Set up mutex id: mutex-setup run: | - pushd ../../discrete/Signalco.Discrete.Api.Mutex/node-cli + pushd ../discrete/Signalco.Discrete.Api.Mutex/node-cli npm install npm install -g - npx mutex wait signalcocloudpreview + npx mutex wait signalcoinfrapreview${{ inputs.project }} popd - name: ✨ Setup DotNet @@ -45,7 +49,7 @@ jobs: with: node-version: "20.x" cache: pnpm - cache-dependency-path: ./cloud/infrastructure + cache-dependency-path: ./infra - name: 📦️ Installing dependencies run: pnpm i --frozen-lockfile @@ -63,12 +67,15 @@ jobs: env: BASE_BRANCH: ${{ inputs.baseRef }} + - name: ⚒️ Build Infrastructure + run: pnpm build + - name: ⚡ Preview Deploy Infrastructure uses: pulumi/actions@v4 with: command: preview - stack-name: signalco/cloud-primary/${{ steps.extract_branch.outputs.stack }} - work-dir: ./cloud/infrastructure + stack-name: signalco/${{ inputs.project }}/${{ steps.extract_branch.outputs.stack }} + work-dir: ./infra/apps/${{ inputs.project }} comment-on-pr: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -77,8 +84,8 @@ jobs: - name: ✋ Release mutex if: always() && steps.mutex-setup.outcome == 'success' run: | - pushd ../../discrete/Signalco.Discrete.Api.Mutex/node-cli + pushd ../discrete/Signalco.Discrete.Api.Mutex/node-cli npm install npm install -g - npx mutex release signalcocloudpreview + npx mutex release signalcoinfrapreview${{ inputs.project }} popd diff --git a/.github/workflows/cloud-deploy.yml b/.github/workflows/cloud-deploy.yml index ffbbb13aad..c9d2814dce 100644 --- a/.github/workflows/cloud-deploy.yml +++ b/.github/workflows/cloud-deploy.yml @@ -7,7 +7,7 @@ on: branches: [main, next] paths: - "cloud/**" - - "infrastructure/**" + - "infra/**" - ".github/workflows/cloud-deploy.yml" env: @@ -15,7 +15,7 @@ env: defaults: run: - working-directory: ./cloud/infrastructure + working-directory: ./infra jobs: build-and-deploy: @@ -27,7 +27,7 @@ jobs: - name: ✋ Set up mutex id: mutex-setup run: | - pushd ../../discrete/Signalco.Discrete.Api.Mutex/node-cli + pushd ../discrete/Signalco.Discrete.Api.Mutex/node-cli npm install npm install -g npx mutex wait signalcoclouddeploy @@ -48,7 +48,7 @@ jobs: with: node-version: "20.x" cache: pnpm - cache-dependency-path: ./cloud/infrastructure + cache-dependency-path: ./infra - name: 📦️ Installing dependencies run: pnpm i --frozen-lockfile @@ -61,12 +61,25 @@ jobs: env: BASE_BRANCH: ${{ github.base_ref }} - - name: ⚡ Deploy Infrastructure + - name: ⚒️ Build Infrastructure + run: pnpm build + + - name: ⚡ Deploy signalco Infrastructure uses: pulumi/actions@v4 with: command: up stack-name: signalco/cloud-primary/${{ steps.extract_branch.outputs.branch }} - work-dir: ./cloud/infrastructure + work-dir: ./infra/apps/cloud-primary + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} + + - name: ⚡ Deploy uier Infrastructure + uses: pulumi/actions@v4 + with: + command: up + stack-name: signalco/uier/${{ steps.extract_branch.outputs.branch }} + work-dir: ./infra/apps/uier env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }} @@ -74,7 +87,7 @@ jobs: - name: ✋ Release mutex if: always() && steps.mutex-setup.outcome == 'success' run: | - pushd ../../discrete/Signalco.Discrete.Api.Mutex/node-cli + pushd ../discrete/Signalco.Discrete.Api.Mutex/node-cli npm install npm install -g npx mutex release signalcoclouddeploy diff --git a/.github/workflows/web-nextjs_bundle_analysis.yml b/.github/workflows/web-nextjs_bundle_analysis.yml index af01b4ffbb..c97b378842 100644 --- a/.github/workflows/web-nextjs_bundle_analysis.yml +++ b/.github/workflows/web-nextjs_bundle_analysis.yml @@ -5,11 +5,12 @@ name: '[Web] CI' on: pull_request: paths: - - 'web/**' + - 'web/**' - 'cloud/**' + - 'infra/**' - '.github/workflows/web-nextjs_bundle_analysis.yml' - '.github/workflows/nextjs_bundle_analysis_reusable.yml' - - '.github/workflows/cloud-deploy-preview.yml' + - '.github/workflows/cloud-deploy-preview_reusable.yml' push: branches: - main @@ -17,17 +18,28 @@ on: paths: - 'web/**' - 'cloud/**' + - 'infra/**' - '.github/workflows/web-nextjs_bundle_analysis.yml' - '.github/workflows/nextjs_bundle_analysis_reusable.yml' - - '.github/workflows/cloud-deploy-preview.yml' + - '.github/workflows/cloud-deploy-preview_reusable.yml' workflow_dispatch: jobs: cloud_preview: name: "Cloud (preview)" - uses: ./.github/workflows/cloud-deploy-preview.yml + uses: ./.github/workflows/cloud-deploy-preview_reusable.yml if: success() && github.event_name == 'pull_request' with: + project: "cloud-primary" + baseRef: ${{ github.base_ref }} + secrets: inherit + + uier_infra_preview: + name: "uier infrastructure (preview)" + uses: ./.github/workflows/cloud-deploy-preview_reusable.yml + if: success() && github.event_name == 'pull_request' + with: + project: "uier" baseRef: ${{ github.base_ref }} secrets: inherit @@ -40,7 +52,7 @@ jobs: path: 'web/apps/blog' vercelProjectId: 'prj_VT7qOjkcEvkAsZH7MtSxWcVDWVpr' secrets: inherit - + analyze_app: name: "App" uses: ./.github/workflows/nextjs_bundle_analysis_reusable.yml @@ -60,7 +72,7 @@ jobs: path: 'web/apps/brandgrab' vercelProjectId: 'prj_QHQO9V4WwYqlcpXNufZ4SU3Ryftx' secrets: inherit - + analyze_web: name: "Web" uses: ./.github/workflows/nextjs_bundle_analysis_reusable.yml @@ -70,7 +82,7 @@ jobs: path: 'web/apps/web' vercelProjectId: 'prj_PYE8WwpynTfjD6rVMiCp7sZoCPYw' secrets: inherit - + analyze_slco: name: "slco" uses: ./.github/workflows/nextjs_bundle_analysis_reusable.yml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..b58b603fea --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000..03d9549ea8 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..d4eacc644b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/signalco.iml b/.idea/signalco.iml new file mode 100644 index 0000000000..6f3fd12e3b --- /dev/null +++ b/.idea/signalco.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..35eb1ddfbb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/webResources.xml b/.idea/webResources.xml new file mode 100644 index 0000000000..9cd99dfe71 --- /dev/null +++ b/.idea/webResources.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index dd4d55b54c..66a1cda62e 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,44 @@

- - - - signalco logotype - - + + + + signalco logotype + +

Automate your life.

- Getting Started • - Key Features • - Community • - Contributing • - Development + Getting Started • + Key Features • + Community • + Contributing • + Related • + License • + Sponsors

## Getting Started -Visit [https://www.signalco.io/learn](https://www.signalco.io/learn) to get started with Signalco. +Visit [www.signalco.io/learn](https://www.signalco.io/learn) to get started with Signalco. ## Key Features -- Minimalistic and Beautiful UI -- Smart home -- Internet Of Things -- Advanced automations +- Minimalistic and Beautiful overview of all your services and devices +- Advanced automations simplified +- Integrated with many Internet Of Things (IoT) devices +- Integrated with many online services ## Community _We are setting up community channels for all users... stay tuned._ -The Signalco community of developers can be found on [GitHub Discussions](https://github.com/signalco-io/signalco/discussions), where you can ask questions, voice ideas, and share your projects. +The Signalco community of developers can be found +on [GitHub Discussions](https://github.com/signalco-io/signalco/discussions), where you can ask questions, voice ideas, +and share your projects. -Our [Code of Conduct](https://github.com/signalco-io/signalco/blob/main/CODE_OF_CONDUCT.md) applies to all Signalco community channels. +Our [Code of Conduct](https://github.com/signalco-io/signalco/blob/main/CODE_OF_CONDUCT.md) applies to all Signalco +community channels. ## Contributing @@ -51,11 +56,24 @@ More info on development can be found in [Development](/DEVELOPMENT.md) document ## License -[GNU General Public License v3.0](LICENSE) +Project is licensed under [GNU General Public License v3.0](LICENSE). See [www.signalco.io/oss](https://www.signalco.io/oss) for more info. + +Some parts of this projects are licensed under (MIT license). These licenses are specified in project/package files and are not included in root license specified here [GNU General Public License v3.0](LICENSE). + +Other parts, that don't specify license, are licensed under [GNU General Public License v3.0](LICENSE). + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fsignalco-io%2Fsignalco.svg?type=shield&issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fsignalco-io%2Fsignalco?ref=badge_shield&issueType=license) ## Sponsors ✨ Many thanks to our sponsors! -![Microsoft for Startups](/docs/ms_startups.png) -![JetBrains](/docs/jb_beam.png) +### Current sponsors + +No current sponsors. [Become a sponsor](https://www.signalco.io/sponsor) and get your logo here with a link to your +site. + +#### Previous sponsors that helped us get started + +![Microsoft for Startups](/docs/sponsors/ms_startups.png) +![JetBrains](/docs/sponsors/jb_beam.png) diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md new file mode 100644 index 0000000000..a76a23c8a6 --- /dev/null +++ b/THIRD_PARTY.md @@ -0,0 +1,7 @@ +- [FOSSA](https://fossa.com/) - FOSSA helps you manage your open source dependencies so you can ship more secure and robust code faster. +- [Vercel](https://vercel.com/) - Vercel combines the best developer experience with an obsessive focus on end-user performance. Our platform enables frontend teams to do their best work. +- [GitHub](https://github.com/) - GitHub is where over 65 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and features, power your CI/CD and DevOps workflows, and secure code before you commit it. +- [Microsoft Azure](https://azure.microsoft.com/) - Build, run and manage applications across multiple clouds, on-premises and at the edge, with the tools and frameworks of your choice. +- [PlanetScale](https://planetscale.com/) - PlanetScale is a database-as-a-service built on Vitess, the popular open source sharding system for MySQL. Our platform makes it easy to build, scale, and manage modern applications on MySQL. + +TODO: Populate list with all third party services used by Signalco. diff --git a/cloud/infrastructure/.eslintrc.json b/cloud/infrastructure/.eslintrc.json deleted file mode 100644 index d0c1090578..0000000000 --- a/cloud/infrastructure/.eslintrc.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:import/recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "indent": [ - "error", - 4 - ], - "quotes": [ - "error", - "single" - ], - "comma-dangle": [ - "warn", - { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "always-multiline" - } - ], - "semi": [ - "error", - "always" - ], - "import/no-unresolved": 0, - "import/no-absolute-path": 0 - } -} \ No newline at end of file diff --git a/cloud/infrastructure/.gitignore b/cloud/infrastructure/.gitignore deleted file mode 100644 index c6958891dd..0000000000 --- a/cloud/infrastructure/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin/ -/node_modules/ diff --git a/cloud/infrastructure/.vscode/settings.json b/cloud/infrastructure/.vscode/settings.json deleted file mode 100644 index 00ad71fba1..0000000000 --- a/cloud/infrastructure/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules\\typescript\\lib" -} \ No newline at end of file diff --git a/cloud/infrastructure/grap_next.json b/cloud/infrastructure/grap_next.json deleted file mode 100644 index baf95e87ce..0000000000 --- a/cloud/infrastructure/grap_next.json +++ /dev/null @@ -1,679 +0,0 @@ -strict digraph { - Resource0 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-channelsamsung"]; - Resource0 -> Resource1 [color = "#246C60", label = "value"]; - Resource0 -> Resource2 [color = "#246C60", label = "name"]; - Resource0 -> Resource3 [color = "#246C60", label = "resourceUri"]; - Resource0 -> Resource4 [color = "#246C60", label = "properties"]; - Resource0 -> Resource5 [color = "#246C60", label = "value"]; - Resource0 -> Resource6 [color = "#246C60", label = "name"]; - Resource0 -> Resource7 [color = "#AA6639"]; - Resource8 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-channelslack"]; - Resource8 -> Resource9 [color = "#246C60", label = "serverFarmId"]; - Resource8 -> Resource7 [color = "#AA6639"]; - Resource8 -> Resource10 [color = "#246C60", label = "serverFarmId"]; - Resource11 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-channelphilipshue"]; - Resource11 -> Resource7 [color = "#AA6639"]; - Resource12 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-channelgithubapp"]; - Resource12 -> Resource7 [color = "#AA6639"]; - Resource13 [label="urn:pulumi:next::cloud-primary::azure-native:app:ManagedEnvironment::env-rb"]; - Resource13 -> Resource14 [color = "#246C60", label = "managedEnvironmentId"]; - Resource13 -> Resource7 [color = "#AA6639"]; - Resource15 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-channelirobot"]; - Resource15 -> Resource7 [color = "#AA6639"]; - Resource7 [label="urn:pulumi:next::cloud-primary::pulumi:pulumi:Stack::cloud-primary-next"]; - Resource16 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-cpub"]; - Resource16 -> Resource7 [color = "#AA6639"]; - Resource17 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-channelslack"]; - Resource17 -> Resource18 [color = "#246C60", label = "request"]; - Resource17 -> Resource7 [color = "#AA6639"]; - Resource19 [label="urn:pulumi:next::cloud-primary::azure-native:resources:ResourceGroup::signalco-discrete-next-mutex"]; - Resource19 -> Resource20 [color = "#246C60", label = "resourceGroupName"]; - Resource19 -> Resource21 [color = "#246C60", label = "resourceGroupName"]; - Resource19 -> Resource22 [color = "#246C60", label = "resourceGroupName"]; - Resource19 -> Resource23 [color = "#246C60", label = "resourceGroupName"]; - Resource19 -> Resource24 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource19 -> Resource25 [color = "#246C60", label = "resourceGroupName"]; - Resource19 -> Resource7 [color = "#AA6639"]; - Resource19 -> Resource26 [color = "#246C60", label = "resourceGroupName"]; - Resource19 -> Resource27 [color = "#246C60", label = "resourceGroupName"]; - Resource26 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-mutex"]; - Resource26 -> Resource7 [color = "#AA6639"]; - Resource28 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-pubcpub"]; - Resource28 -> Resource7 [color = "#AA6639"]; - Resource29 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-cpub"]; - Resource29 -> Resource7 [color = "#AA6639"]; - Resource30 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-channelzigbee2mqtt"]; - Resource30 -> Resource7 [color = "#AA6639"]; - Resource31 [label="urn:pulumi:next::cloud-primary::pulumi:providers:command::default_0_8_0"]; - Resource32 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-cpub"]; - Resource32 -> Resource7 [color = "#AA6639"]; - Resource33 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-cint-usageproc"]; - Resource33 -> Resource7 [color = "#AA6639"]; - Resource34 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-intcontactst"]; - Resource34 -> Resource7 [color = "#AA6639"]; - Resource35 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-cint-migration"]; - Resource35 -> Resource7 [color = "#AA6639"]; - Resource36 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-channelirobot"]; - Resource36 -> Resource7 [color = "#AA6639"]; - Resource37 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-rbpub"]; - Resource37 -> Resource38 [color = "#246C60", label = "request"]; - Resource37 -> Resource7 [color = "#AA6639"]; - Resource39 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-intcontactst"]; - Resource39 -> Resource40 [color = "#246C60", label = "serverFarmId"]; - Resource39 -> Resource7 [color = "#AA6639"]; - Resource41 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-channelsamsung"]; - Resource41 -> Resource42 [color = "#246C60", label = "serverFarmId"]; - Resource41 -> Resource0 [color = "#246C60", label = "serverFarmId"]; - Resource41 -> Resource7 [color = "#AA6639"]; - Resource43 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-channelirobot"]; - Resource43 -> Resource7 [color = "#AA6639"]; - Resource44 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-cpub"]; - Resource44 -> Resource16 [color = "#246C60", label = "request"]; - Resource44 -> Resource7 [color = "#AA6639"]; - Resource10 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-channelslack"]; - Resource10 -> Resource7 [color = "#AA6639"]; - Resource45 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-channelzigbee2mqtt"]; - Resource45 -> Resource7 [color = "#AA6639"]; - Resource27 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-mutex"]; - Resource27 -> Resource7 [color = "#AA6639"]; - Resource46 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::ses-next-dkim2"]; - Resource46 -> Resource7 [color = "#AA6639"]; - Resource47 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-rbpub"]; - Resource47 -> Resource7 [color = "#AA6639"]; - Resource48 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-intusageproc"]; - Resource48 -> Resource7 [color = "#AA6639"]; - Resource49 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-intcontactst"]; - Resource49 -> Resource50 [color = "#246C60", label = "properties"]; - Resource49 -> Resource7 [color = "#AA6639"]; - Resource51 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-chsamsung"]; - Resource51 -> Resource2 [color = "#246C60", label = "properties"]; - Resource51 -> Resource7 [color = "#AA6639"]; - Resource52 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-channelgithubapp"]; - Resource52 -> Resource7 [color = "#AA6639"]; - Resource52 -> Resource53 [color = "#246C60", label = "serverFarmId"]; - Resource52 -> Resource54 [color = "#246C60", label = "serverFarmId"]; - Resource55 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-channelgithubapp"]; - Resource55 -> Resource7 [color = "#AA6639"]; - Resource56 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::ses-next-spf"]; - Resource56 -> Resource7 [color = "#AA6639"]; - Resource57 [label="urn:pulumi:next::cloud-primary::azure-native:resources:ResourceGroup::signalco-cloud-next"]; - Resource57 -> Resource58 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource59 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource60 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource61 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource2 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource62 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource63 [color = "#246C60", label = "resourceGroupName, properties"]; - Resource57 -> Resource64 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource65 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource66 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource67 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource68 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource69 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource70 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource71 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource72 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource73 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource74 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource75 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource4 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource76 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource42 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource9 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource77 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource78 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource79 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource80 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource50 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource81 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource82 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource83 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource14 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource84 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource85 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource6 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource86 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource87 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource88 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource89 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource90 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource91 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource92 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource93 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource94 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource95 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource96 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource97 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource98 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource99 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource40 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource100 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource0 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource8 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource11 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource12 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource13 [color = "#246C60", label = "appLogsConfiguration, resourceGroupName"]; - Resource57 -> Resource15 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource28 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource29 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource32 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource36 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource30 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource39 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource41 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource10 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource49 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource51 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource52 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource7 [color = "#AA6639"]; - Resource57 -> Resource101 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource102 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource53 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource103 [color = "#246C60", label = "properties, resourceGroupName"]; - Resource57 -> Resource104 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource105 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource106 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource107 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource108 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource109 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource54 [color = "#246C60", label = "resourceGroupName"]; - Resource57 -> Resource110 [color = "#246C60", label = "resourceGroupName"]; - Resource101 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-intmigration"]; - Resource101 -> Resource81 [color = "#246C60", label = "properties"]; - Resource101 -> Resource7 [color = "#AA6639"]; - Resource111 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-channelzigbee2mqtt"]; - Resource111 -> Resource7 [color = "#AA6639"]; - Resource102 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-channelphilipshue"]; - Resource102 -> Resource7 [color = "#AA6639"]; - Resource53 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-channelgithubapp"]; - Resource53 -> Resource7 [color = "#AA6639"]; - Resource103 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-intmaintenan"]; - Resource103 -> Resource7 [color = "#AA6639"]; - Resource104 [label="urn:pulumi:next::cloud-primary::azure-native:operationalinsights:Workspace::loganalytics-log"]; - Resource104 -> Resource112 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource3 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource113 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource114 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource115 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource116 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource117 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource118 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource119 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource120 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource13 [color = "#246C60", label = "appLogsConfiguration"]; - Resource104 -> Resource34 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource48 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource55 [color = "#246C60", label = "workspaceId"]; - Resource104 -> Resource7 [color = "#AA6639"]; - Resource104 -> Resource121 [color = "#246C60", label = "workspaceId"]; - Resource105 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-inttimeentit"]; - Resource105 -> Resource65 [color = "#246C60", label = "properties"]; - Resource105 -> Resource7 [color = "#AA6639"]; - Resource122 [label="urn:pulumi:next::cloud-primary::aws:ses/mailFrom:MailFrom::ses-next-ses-mail-from"]; - Resource122 -> Resource56 [color = "#246C60", label = "name"]; - Resource122 -> Resource7 [color = "#AA6639"]; - Resource123 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::vercel-ui-docs"]; - Resource123 -> Resource7 [color = "#AA6639"]; - Resource124 [label="urn:pulumi:next::cloud-primary::pulumi:providers:docker::default_4_3_1"]; - Resource125 [label="urn:pulumi:next::cloud-primary::pulumi:pulumi:StackReference::signalco/cloud-primary/next"]; - Resource125 -> Resource61 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource70 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource6 [color = "#246C60", label = "thumbprint, sslState"]; - Resource125 -> Resource86 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource11 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource12 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource29 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource27 [color = "#246C60", label = "sslState, thumbprint"]; - Resource125 -> Resource7 [color = "#AA6639"]; - Resource125 -> Resource109 [color = "#246C60", label = "sslState, thumbprint"]; - Resource106 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-rbpub"]; - Resource106 -> Resource69 [color = "#246C60", label = "serverFarmId"]; - Resource106 -> Resource84 [color = "#246C60", label = "serverFarmId"]; - Resource106 -> Resource7 [color = "#AA6639"]; - Resource107 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-intmaintenan"]; - Resource107 -> Resource126 [color = "#246C60", label = "request"]; - Resource107 -> Resource4 [color = "#246C60", label = "properties"]; - Resource107 -> Resource119 [color = "#246C60", label = "resourceUri"]; - Resource107 -> Resource103 [color = "#246C60", label = "name"]; - Resource107 -> Resource7 [color = "#AA6639"]; - Resource108 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-intmigration"]; - Resource108 -> Resource112 [color = "#246C60", label = "resourceUri"]; - Resource108 -> Resource4 [color = "#246C60", label = "properties"]; - Resource108 -> Resource81 [color = "#246C60", label = "name"]; - Resource108 -> Resource35 [color = "#246C60", label = "request"]; - Resource108 -> Resource7 [color = "#AA6639"]; - Resource109 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-channelslack"]; - Resource109 -> Resource7 [color = "#AA6639"]; - Resource54 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-channelgithubapp"]; - Resource54 -> Resource127 [color = "#246C60", label = "value"]; - Resource54 -> Resource128 [color = "#246C60", label = "value"]; - Resource54 -> Resource4 [color = "#246C60", label = "properties"]; - Resource54 -> Resource99 [color = "#246C60", label = "name"]; - Resource54 -> Resource12 [color = "#246C60", label = "name"]; - Resource54 -> Resource55 [color = "#246C60", label = "resourceUri"]; - Resource54 -> Resource7 [color = "#AA6639"]; - Resource121 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-inttimeentit"]; - Resource121 -> Resource7 [color = "#AA6639"]; - Resource129 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-channelslack"]; - Resource129 -> Resource7 [color = "#AA6639"]; - Resource110 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-channelzigbee2mqtt"]; - Resource110 -> Resource7 [color = "#AA6639"]; - Resource130 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::vercel-brandgrab"]; - Resource130 -> Resource7 [color = "#AA6639"]; - Resource131 [label="urn:pulumi:next::cloud-primary::aws:iam/accessKey:AccessKey::ses-next-ses-access-key"]; - Resource131 -> Resource63 [color = "#246C60", label = "properties"]; - Resource131 -> Resource65 [color = "#246C60", label = "properties"]; - Resource131 -> Resource78 [color = "#246C60", label = "properties"]; - Resource131 -> Resource50 [color = "#246C60", label = "properties"]; - Resource131 -> Resource81 [color = "#246C60", label = "properties"]; - Resource131 -> Resource28 [color = "#246C60", label = "properties"]; - Resource131 -> Resource103 [color = "#246C60", label = "properties"]; - Resource131 -> Resource7 [color = "#AA6639"]; - Resource127 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-channelgithubapp"]; - Resource127 -> Resource7 [color = "#AA6639"]; - Resource127 -> Resource132 [color = "#246C60", label = "request"]; - Resource133 [label="urn:pulumi:next::cloud-primary::aws:ses/domainIdentity:DomainIdentity::ses-next-domainIdentity"]; - Resource133 -> Resource7 [color = "#AA6639"]; - Resource133 -> Resource63 [color = "#246C60", label = "properties"]; - Resource133 -> Resource65 [color = "#246C60", label = "properties"]; - Resource133 -> Resource78 [color = "#246C60", label = "properties"]; - Resource133 -> Resource50 [color = "#246C60", label = "properties"]; - Resource133 -> Resource81 [color = "#246C60", label = "properties"]; - Resource133 -> Resource134 [color = "#246C60", label = "domain"]; - Resource133 -> Resource28 [color = "#246C60", label = "properties"]; - Resource133 -> Resource103 [color = "#246C60", label = "properties"]; - Resource133 -> Resource122 [color = "#246C60", label = "domain, mailFromDomain"]; - Resource58 [label="urn:pulumi:next::cloud-primary::azure-native:keyvault:Secret::secret-kv-Slack--ClientId"]; - Resource58 -> Resource7 [color = "#AA6639"]; - Resource135 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::ses-next-dkim0"]; - Resource135 -> Resource7 [color = "#AA6639"]; - Resource1 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-channelsamsung"]; - Resource1 -> Resource7 [color = "#AA6639"]; - Resource136 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-channelphilipshue"]; - Resource136 -> Resource7 [color = "#AA6639"]; - Resource137 [label="urn:pulumi:next::cloud-primary::pulumi:providers:aws::default_5_42_0"]; - Resource59 [label="urn:pulumi:next::cloud-primary::azure-native:keyvault:Secret::secret-kv-Slack--ClientSecret"]; - Resource59 -> Resource7 [color = "#AA6639"]; - Resource112 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-intmigration"]; - Resource112 -> Resource7 [color = "#AA6639"]; - Resource60 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-channelzigbee2mqtt"]; - Resource60 -> Resource7 [color = "#AA6639"]; - Resource60 -> Resource75 [color = "#246C60", label = "serverFarmId"]; - Resource60 -> Resource110 [color = "#246C60", label = "serverFarmId"]; - Resource61 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-channelzigbee2mqtt"]; - Resource61 -> Resource7 [color = "#AA6639"]; - Resource138 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-channelirobot"]; - Resource138 -> Resource7 [color = "#AA6639"]; - Resource20 [label="urn:pulumi:next::cloud-primary::azure-native:storage:BlobContainer::func-zips-mutexfuncs"]; - Resource20 -> Resource7 [color = "#AA6639"]; - Resource20 -> Resource24 [color = "#246C60", label = "properties"]; - Resource20 -> Resource25 [color = "#246C60", label = "containerName"]; - Resource139 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::ses-next-ses-dmarc"]; - Resource139 -> Resource7 [color = "#AA6639"]; - Resource2 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-channelsamsung"]; - Resource2 -> Resource7 [color = "#AA6639"]; - Resource128 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-channelgithubapp"]; - Resource128 -> Resource7 [color = "#AA6639"]; - Resource62 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-channelslack"]; - Resource62 -> Resource7 [color = "#AA6639"]; - Resource63 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-pubrbpub"]; - Resource63 -> Resource7 [color = "#AA6639"]; - Resource64 [label="urn:pulumi:next::cloud-primary::azure-native:storage:StorageAccount::safuncs"]; - Resource64 -> Resource2 [color = "#246C60", label = "properties"]; - Resource64 -> Resource62 [color = "#246C60", label = "properties"]; - Resource64 -> Resource63 [color = "#246C60", label = "properties"]; - Resource64 -> Resource7 [color = "#AA6639"]; - Resource64 -> Resource65 [color = "#246C60", label = "properties"]; - Resource64 -> Resource66 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource67 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource71 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource77 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource78 [color = "#246C60", label = "properties"]; - Resource64 -> Resource80 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource50 [color = "#246C60", label = "properties"]; - Resource64 -> Resource81 [color = "#246C60", label = "properties"]; - Resource64 -> Resource83 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource85 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource89 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource91 [color = "#246C60", label = "properties"]; - Resource64 -> Resource92 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource95 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource99 [color = "#246C60", label = "properties"]; - Resource64 -> Resource15 [color = "#246C60", label = "properties"]; - Resource64 -> Resource28 [color = "#246C60", label = "properties"]; - Resource64 -> Resource30 [color = "#246C60", label = "properties"]; - Resource64 -> Resource49 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource51 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource101 [color = "#246C60", label = "accountName"]; - Resource64 -> Resource103 [color = "#246C60", label = "properties"]; - Resource64 -> Resource105 [color = "#246C60", label = "accountName"]; - Resource126 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-cint-maintenan"]; - Resource126 -> Resource7 [color = "#AA6639"]; - Resource3 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-channelsamsung"]; - Resource3 -> Resource7 [color = "#AA6639"]; - Resource113 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-channelslack"]; - Resource113 -> Resource7 [color = "#AA6639"]; - Resource140 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::ses-next-ses-mail-from-mx-record"]; - Resource140 -> Resource7 [color = "#AA6639"]; - Resource65 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-inttimeentit"]; - Resource65 -> Resource7 [color = "#AA6639"]; - Resource66 [label="urn:pulumi:next::cloud-primary::azure-native:storage:BlobContainer::func-zips-funcs"]; - Resource66 -> Resource2 [color = "#246C60", label = "properties"]; - Resource66 -> Resource62 [color = "#246C60", label = "properties"]; - Resource66 -> Resource63 [color = "#246C60", label = "properties"]; - Resource66 -> Resource65 [color = "#246C60", label = "properties"]; - Resource66 -> Resource7 [color = "#AA6639"]; - Resource66 -> Resource67 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource71 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource77 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource78 [color = "#246C60", label = "properties"]; - Resource66 -> Resource80 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource50 [color = "#246C60", label = "properties"]; - Resource66 -> Resource81 [color = "#246C60", label = "properties"]; - Resource66 -> Resource83 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource85 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource89 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource91 [color = "#246C60", label = "properties"]; - Resource66 -> Resource92 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource95 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource99 [color = "#246C60", label = "properties"]; - Resource66 -> Resource15 [color = "#246C60", label = "properties"]; - Resource66 -> Resource28 [color = "#246C60", label = "properties"]; - Resource66 -> Resource30 [color = "#246C60", label = "properties"]; - Resource66 -> Resource49 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource51 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource101 [color = "#246C60", label = "containerName"]; - Resource66 -> Resource103 [color = "#246C60", label = "properties"]; - Resource66 -> Resource105 [color = "#246C60", label = "containerName"]; - Resource141 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-channelsamsung"]; - Resource141 -> Resource7 [color = "#AA6639"]; - Resource114 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-channelphilipshue"]; - Resource114 -> Resource7 [color = "#AA6639"]; - Resource142 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-channelphilipshue"]; - Resource142 -> Resource136 [color = "#246C60", label = "request"]; - Resource142 -> Resource7 [color = "#AA6639"]; - Resource67 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-chzigbee2mqtt"]; - Resource67 -> Resource7 [color = "#AA6639"]; - Resource67 -> Resource30 [color = "#246C60", label = "properties"]; - Resource21 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-mutex"]; - Resource21 -> Resource7 [color = "#AA6639"]; - Resource21 -> Resource22 [color = "#246C60", label = "serverFarmId"]; - Resource21 -> Resource26 [color = "#246C60", label = "serverFarmId"]; - Resource73 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-channelphilipshue"]; - Resource73 -> Resource114 [color = "#246C60", label = "resourceUri"]; - Resource73 -> Resource142 [color = "#246C60", label = "value"]; - Resource73 -> Resource7 [color = "#AA6639"]; - Resource73 -> Resource4 [color = "#246C60", label = "properties"]; - Resource73 -> Resource143 [color = "#246C60", label = "value"]; - Resource73 -> Resource91 [color = "#246C60", label = "name"]; - Resource73 -> Resource11 [color = "#246C60", label = "name"]; - Resource115 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-channelirobot"]; - Resource115 -> Resource7 [color = "#AA6639"]; - Resource68 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-cpub"]; - Resource68 -> Resource7 [color = "#AA6639"]; - Resource68 -> Resource74 [color = "#246C60", label = "serverFarmId"]; - Resource68 -> Resource32 [color = "#246C60", label = "serverFarmId"]; - Resource69 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-rbpub"]; - Resource69 -> Resource63 [color = "#246C60", label = "name"]; - Resource69 -> Resource7 [color = "#AA6639"]; - Resource69 -> Resource70 [color = "#246C60", label = "name"]; - Resource69 -> Resource4 [color = "#246C60", label = "properties"]; - Resource69 -> Resource120 [color = "#246C60", label = "resourceUri"]; - Resource69 -> Resource37 [color = "#246C60", label = "value"]; - Resource69 -> Resource47 [color = "#246C60", label = "value"]; - Resource70 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-rbpub"]; - Resource70 -> Resource7 [color = "#AA6639"]; - Resource71 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-cpub"]; - Resource71 -> Resource7 [color = "#AA6639"]; - Resource71 -> Resource28 [color = "#246C60", label = "properties"]; - Resource144 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-cint-timeentit"]; - Resource144 -> Resource7 [color = "#AA6639"]; - Resource72 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-intmaintenan"]; - Resource72 -> Resource7 [color = "#AA6639"]; - Resource72 -> Resource107 [color = "#246C60", label = "serverFarmId"]; - Resource145 [label="urn:pulumi:next::cloud-primary::pulumi:providers:pulumi::default"]; - Resource74 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-cpub"]; - Resource74 -> Resource7 [color = "#AA6639"]; - Resource74 -> Resource4 [color = "#246C60", label = "properties"]; - Resource74 -> Resource117 [color = "#246C60", label = "resourceUri"]; - Resource74 -> Resource146 [color = "#246C60", label = "value"]; - Resource74 -> Resource28 [color = "#246C60", label = "name"]; - Resource74 -> Resource29 [color = "#246C60", label = "name"]; - Resource74 -> Resource44 [color = "#246C60", label = "value"]; - Resource75 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-channelzigbee2mqtt"]; - Resource75 -> Resource61 [color = "#246C60", label = "name"]; - Resource75 -> Resource7 [color = "#AA6639"]; - Resource75 -> Resource4 [color = "#246C60", label = "properties"]; - Resource75 -> Resource118 [color = "#246C60", label = "resourceUri"]; - Resource75 -> Resource147 [color = "#246C60", label = "value"]; - Resource75 -> Resource30 [color = "#246C60", label = "name"]; - Resource75 -> Resource45 [color = "#246C60", label = "value"]; - Resource132 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-channelgithubapp"]; - Resource132 -> Resource7 [color = "#AA6639"]; - Resource116 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-mutex"]; - Resource116 -> Resource7 [color = "#AA6639"]; - Resource4 [label="urn:pulumi:next::cloud-primary::azure-native:keyvault:Vault::vault-kv"]; - Resource4 -> Resource58 [color = "#246C60", label = "vaultName"]; - Resource4 -> Resource59 [color = "#246C60", label = "vaultName"]; - Resource4 -> Resource2 [color = "#246C60", label = "properties"]; - Resource4 -> Resource62 [color = "#246C60", label = "properties"]; - Resource4 -> Resource63 [color = "#246C60", label = "properties"]; - Resource4 -> Resource65 [color = "#246C60", label = "properties"]; - Resource4 -> Resource7 [color = "#AA6639"]; - Resource4 -> Resource78 [color = "#246C60", label = "properties"]; - Resource4 -> Resource50 [color = "#246C60", label = "properties"]; - Resource4 -> Resource81 [color = "#246C60", label = "properties"]; - Resource4 -> Resource90 [color = "#246C60", label = "vaultName"]; - Resource4 -> Resource91 [color = "#246C60", label = "properties"]; - Resource4 -> Resource98 [color = "#246C60", label = "vaultName"]; - Resource4 -> Resource99 [color = "#246C60", label = "properties"]; - Resource4 -> Resource15 [color = "#246C60", label = "properties"]; - Resource4 -> Resource28 [color = "#246C60", label = "properties"]; - Resource4 -> Resource30 [color = "#246C60", label = "properties"]; - Resource4 -> Resource103 [color = "#246C60", label = "properties"]; - Resource78 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-intusageproc"]; - Resource78 -> Resource7 [color = "#AA6639"]; - Resource117 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-cpub"]; - Resource117 -> Resource7 [color = "#AA6639"]; - Resource76 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-intmigration"]; - Resource76 -> Resource7 [color = "#AA6639"]; - Resource76 -> Resource108 [color = "#246C60", label = "serverFarmId"]; - Resource42 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-channelsamsung"]; - Resource42 -> Resource7 [color = "#AA6639"]; - Resource9 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-channelslack"]; - Resource9 -> Resource62 [color = "#246C60", label = "name"]; - Resource9 -> Resource113 [color = "#246C60", label = "resourceUri"]; - Resource9 -> Resource4 [color = "#246C60", label = "properties"]; - Resource9 -> Resource7 [color = "#AA6639"]; - Resource9 -> Resource17 [color = "#246C60", label = "value"]; - Resource9 -> Resource109 [color = "#246C60", label = "name"]; - Resource9 -> Resource129 [color = "#246C60", label = "value"]; - Resource77 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-chphilipshue"]; - Resource77 -> Resource7 [color = "#AA6639"]; - Resource77 -> Resource91 [color = "#246C60", label = "properties"]; - Resource148 [label="urn:pulumi:next::cloud-primary::aws:iam/user:User::ses-next-usr"]; - Resource148 -> Resource7 [color = "#AA6639"]; - Resource148 -> Resource149 [color = "#246C60", label = "user"]; - Resource148 -> Resource131 [color = "#246C60", label = "user"]; - Resource79 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-intusageproc"]; - Resource79 -> Resource4 [color = "#246C60", label = "properties"]; - Resource79 -> Resource78 [color = "#246C60", label = "name"]; - Resource79 -> Resource7 [color = "#AA6639"]; - Resource79 -> Resource33 [color = "#246C60", label = "request"]; - Resource79 -> Resource48 [color = "#246C60", label = "resourceUri"]; - Resource5 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-channelsamsung"]; - Resource5 -> Resource141 [color = "#246C60", label = "request"]; - Resource5 -> Resource7 [color = "#AA6639"]; - Resource150 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::vercel-web"]; - Resource150 -> Resource7 [color = "#AA6639"]; - Resource151 [label="urn:pulumi:next::cloud-primary::pulumi:providers:azure-native::default_2_1_1"]; - Resource80 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-intmaintenan"]; - Resource80 -> Resource7 [color = "#AA6639"]; - Resource80 -> Resource103 [color = "#246C60", label = "properties"]; - Resource22 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-mutex"]; - Resource22 -> Resource116 [color = "#246C60", label = "resourceUri"]; - Resource22 -> Resource7 [color = "#AA6639"]; - Resource22 -> Resource152 [color = "#246C60", label = "value"]; - Resource22 -> Resource24 [color = "#246C60", label = "name"]; - Resource22 -> Resource153 [color = "#246C60", label = "value"]; - Resource22 -> Resource27 [color = "#246C60", label = "name"]; - Resource154 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::vercel-slco"]; - Resource154 -> Resource7 [color = "#AA6639"]; - Resource50 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-intcontactst"]; - Resource50 -> Resource7 [color = "#AA6639"]; - Resource81 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-intmigration"]; - Resource81 -> Resource7 [color = "#AA6639"]; - Resource14 [label="urn:pulumi:next::cloud-primary::azure-native:app:ContainerApp::docker-app-rb"]; - Resource14 -> Resource7 [color = "#AA6639"]; - Resource14 -> Resource90 [color = "#246C60", label = "properties"]; - Resource82 [label="urn:pulumi:next::cloud-primary::azure-native:signalrservice:SignalR::signalr-sr"]; - Resource82 -> Resource2 [color = "#246C60", label = "properties"]; - Resource82 -> Resource62 [color = "#246C60", label = "properties"]; - Resource82 -> Resource63 [color = "#246C60", label = "properties"]; - Resource82 -> Resource65 [color = "#246C60", label = "properties"]; - Resource82 -> Resource78 [color = "#246C60", label = "properties"]; - Resource82 -> Resource50 [color = "#246C60", label = "properties"]; - Resource82 -> Resource81 [color = "#246C60", label = "properties"]; - Resource82 -> Resource7 [color = "#AA6639"]; - Resource82 -> Resource155 [color = "#246C60", label = "request"]; - Resource82 -> Resource91 [color = "#246C60", label = "properties"]; - Resource82 -> Resource99 [color = "#246C60", label = "properties"]; - Resource82 -> Resource15 [color = "#246C60", label = "properties"]; - Resource82 -> Resource28 [color = "#246C60", label = "properties"]; - Resource82 -> Resource30 [color = "#246C60", label = "properties"]; - Resource82 -> Resource103 [color = "#246C60", label = "properties"]; - Resource156 [label="urn:pulumi:next::cloud-primary::pulumi:providers:checkly::default_1_1_4_github_/api.github.com/checkly"]; - Resource155 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-sr"]; - Resource155 -> Resource7 [color = "#AA6639"]; - Resource83 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-chslack"]; - Resource83 -> Resource62 [color = "#246C60", label = "properties"]; - Resource83 -> Resource7 [color = "#AA6639"]; - Resource143 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-channelphilipshue"]; - Resource143 -> Resource7 [color = "#AA6639"]; - Resource23 [label="urn:pulumi:next::cloud-primary::azure-native:storage:StorageAccount::samutexfuncs"]; - Resource23 -> Resource20 [color = "#246C60", label = "accountName"]; - Resource23 -> Resource7 [color = "#AA6639"]; - Resource23 -> Resource24 [color = "#246C60", label = "properties"]; - Resource23 -> Resource25 [color = "#246C60", label = "accountName"]; - Resource157 [label="urn:pulumi:next::cloud-primary::pulumi:providers:cloudflare::default_5_7_0"]; - Resource84 [label="urn:pulumi:next::cloud-primary::azure-native:web:Certificate::func-cert-rbpub"]; - Resource84 -> Resource7 [color = "#AA6639"]; - Resource152 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-mutex"]; - Resource152 -> Resource7 [color = "#AA6639"]; - Resource158 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::vercel-app"]; - Resource158 -> Resource7 [color = "#AA6639"]; - Resource159 [label="urn:pulumi:next::cloud-primary::docker:index/image:Image::docker-image-rb"]; - Resource159 -> Resource14 [color = "#246C60", label = "template"]; - Resource159 -> Resource7 [color = "#AA6639"]; - Resource85 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-intusageproc"]; - Resource85 -> Resource78 [color = "#246C60", label = "properties"]; - Resource85 -> Resource7 [color = "#AA6639"]; - Resource160 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-cint-contactst"]; - Resource160 -> Resource7 [color = "#AA6639"]; - Resource6 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-channelsamsung"]; - Resource6 -> Resource7 [color = "#AA6639"]; - Resource18 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-channelslack"]; - Resource18 -> Resource7 [color = "#AA6639"]; - Resource38 [label="urn:pulumi:next::cloud-primary::checkly:index/check:Check::apicheck-rbpub"]; - Resource38 -> Resource7 [color = "#AA6639"]; - Resource118 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-channelzigbee2mqtt"]; - Resource118 -> Resource7 [color = "#AA6639"]; - Resource147 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-channelzigbee2mqtt"]; - Resource147 -> Resource7 [color = "#AA6639"]; - Resource147 -> Resource111 [color = "#246C60", label = "request"]; - Resource86 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppHostNameBinding::func-hostnamebind-channelirobot"]; - Resource86 -> Resource7 [color = "#AA6639"]; - Resource149 [label="urn:pulumi:next::cloud-primary::aws:iam/userPolicy:UserPolicy::ses-next-ses-policy"]; - Resource149 -> Resource7 [color = "#AA6639"]; - Resource161 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::ses-next-dkim1"]; - Resource161 -> Resource7 [color = "#AA6639"]; - Resource87 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-intusageproc"]; - Resource87 -> Resource79 [color = "#246C60", label = "serverFarmId"]; - Resource87 -> Resource7 [color = "#AA6639"]; - Resource88 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-channelphilipshue"]; - Resource88 -> Resource73 [color = "#246C60", label = "serverFarmId"]; - Resource88 -> Resource7 [color = "#AA6639"]; - Resource88 -> Resource102 [color = "#246C60", label = "serverFarmId"]; - Resource89 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-chgithubapp"]; - Resource89 -> Resource7 [color = "#AA6639"]; - Resource89 -> Resource99 [color = "#246C60", label = "properties"]; - Resource90 [label="urn:pulumi:next::cloud-primary::azure-native:keyvault:Secret::secret-kv-SignalcoAppRemoteBrowserUrl"]; - Resource90 -> Resource7 [color = "#AA6639"]; - Resource91 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-channelphilipshue"]; - Resource91 -> Resource7 [color = "#AA6639"]; - Resource24 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-discretemutex"]; - Resource24 -> Resource7 [color = "#AA6639"]; - Resource92 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-rbpub"]; - Resource92 -> Resource63 [color = "#246C60", label = "properties"]; - Resource92 -> Resource7 [color = "#AA6639"]; - Resource119 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-intmaintenan"]; - Resource119 -> Resource7 [color = "#AA6639"]; - Resource93 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-channelirobot"]; - Resource93 -> Resource7 [color = "#AA6639"]; - Resource93 -> Resource97 [color = "#246C60", label = "serverFarmId"]; - Resource93 -> Resource36 [color = "#246C60", label = "serverFarmId"]; - Resource25 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-mutex"]; - Resource25 -> Resource24 [color = "#246C60", label = "properties"]; - Resource25 -> Resource7 [color = "#AA6639"]; - Resource94 [label="urn:pulumi:next::cloud-primary::azure-native:web:AppServicePlan::func-appplan-inttimeentit"]; - Resource94 -> Resource7 [color = "#AA6639"]; - Resource94 -> Resource100 [color = "#246C60", label = "serverFarmId"]; - Resource162 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-cname-channelirobot"]; - Resource162 -> Resource7 [color = "#AA6639"]; - Resource162 -> Resource43 [color = "#246C60", label = "request"]; - Resource95 [label="urn:pulumi:next::cloud-primary::azure-native:storage:Blob::zip-chirobot"]; - Resource95 -> Resource7 [color = "#AA6639"]; - Resource95 -> Resource15 [color = "#246C60", label = "properties"]; - Resource96 [label="urn:pulumi:next::cloud-primary::azure-native:storage:StorageAccount::sastore"]; - Resource96 -> Resource2 [color = "#246C60", label = "properties"]; - Resource96 -> Resource62 [color = "#246C60", label = "properties"]; - Resource96 -> Resource63 [color = "#246C60", label = "properties"]; - Resource96 -> Resource65 [color = "#246C60", label = "properties"]; - Resource96 -> Resource78 [color = "#246C60", label = "properties"]; - Resource96 -> Resource50 [color = "#246C60", label = "properties"]; - Resource96 -> Resource81 [color = "#246C60", label = "properties"]; - Resource96 -> Resource91 [color = "#246C60", label = "properties"]; - Resource96 -> Resource7 [color = "#AA6639"]; - Resource96 -> Resource99 [color = "#246C60", label = "properties"]; - Resource96 -> Resource15 [color = "#246C60", label = "properties"]; - Resource96 -> Resource28 [color = "#246C60", label = "properties"]; - Resource96 -> Resource30 [color = "#246C60", label = "properties"]; - Resource96 -> Resource103 [color = "#246C60", label = "properties"]; - Resource163 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::vercel-blog"]; - Resource163 -> Resource7 [color = "#AA6639"]; - Resource146 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-cpub"]; - Resource146 -> Resource7 [color = "#AA6639"]; - Resource97 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-channelirobot"]; - Resource97 -> Resource138 [color = "#246C60", label = "value"]; - Resource97 -> Resource115 [color = "#246C60", label = "resourceUri"]; - Resource97 -> Resource4 [color = "#246C60", label = "properties"]; - Resource97 -> Resource86 [color = "#246C60", label = "name"]; - Resource97 -> Resource162 [color = "#246C60", label = "value"]; - Resource97 -> Resource7 [color = "#AA6639"]; - Resource97 -> Resource15 [color = "#246C60", label = "name"]; - Resource98 [label="urn:pulumi:next::cloud-primary::azure-native:keyvault:Secret::secret-kv-Slack--SigningSecret"]; - Resource98 -> Resource7 [color = "#AA6639"]; - Resource99 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebAppApplicationSettings::func-appsettings-channelgithubapp"]; - Resource99 -> Resource7 [color = "#AA6639"]; - Resource40 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-intcontactst"]; - Resource40 -> Resource4 [color = "#246C60", label = "properties"]; - Resource40 -> Resource50 [color = "#246C60", label = "name"]; - Resource40 -> Resource160 [color = "#246C60", label = "request"]; - Resource40 -> Resource7 [color = "#AA6639"]; - Resource40 -> Resource34 [color = "#246C60", label = "resourceUri"]; - Resource153 [label="urn:pulumi:next::cloud-primary::cloudflare:index/record:Record::func-dns-txt-domainverify-mutex"]; - Resource153 -> Resource7 [color = "#AA6639"]; - Resource120 [label="urn:pulumi:next::cloud-primary::azure-native:insights:DiagnosticSetting::logs-diagnosticSetting-rbpub"]; - Resource120 -> Resource7 [color = "#AA6639"]; - Resource100 [label="urn:pulumi:next::cloud-primary::azure-native:web:WebApp::func-inttimeentit"]; - Resource100 -> Resource65 [color = "#246C60", label = "name"]; - Resource100 -> Resource144 [color = "#246C60", label = "request"]; - Resource100 -> Resource4 [color = "#246C60", label = "properties"]; - Resource100 -> Resource7 [color = "#AA6639"]; - Resource100 -> Resource121 [color = "#246C60", label = "resourceUri"]; - Resource134 [label="urn:pulumi:next::cloud-primary::aws:ses/domainDkim:DomainDkim::ses-next-sesDomainDkim"]; - Resource134 -> Resource135 [color = "#246C60", label = "name, value"]; - Resource134 -> Resource161 [color = "#246C60", label = "name, value"]; - Resource134 -> Resource7 [color = "#AA6639"]; - Resource134 -> Resource46 [color = "#246C60", label = "name, value"]; -} diff --git a/cloud/infrastructure/src/Azure/createInternalFunctionAsync.ts b/cloud/infrastructure/src/Azure/createInternalFunctionAsync.ts deleted file mode 100644 index c66a0a0d66..0000000000 --- a/cloud/infrastructure/src/Azure/createInternalFunctionAsync.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { createFunction } from './createFunction'; -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import publishProjectAsync from '../dotnet/publishProjectAsync'; -import { assignFunctionCodeAsync } from './assignFunctionCodeAsync'; -import apiStatusCheck from '../Checkly/apiStatusCheck'; -import { ConfInternalApiCheckInterval } from '../config'; -import { type BlobContainer, type StorageAccount } from '@pulumi/azure-native/storage'; - -const internalFunctionPrefix = 'cint'; - -export default async function createInternalFunctionAsync ( - resourceGroup: ResourceGroup, - name: string, - storageAccount: StorageAccount, - zipsContainer: BlobContainer, - shouldProtect: boolean) { - const shortName = name.substring(0, 9).toLocaleLowerCase(); - const func = createFunction( - resourceGroup, - `int${shortName}`, - shouldProtect, - false); - - const codePath = `../src/Signalco.Func.Internal.${name}`; - const publishResult = await publishProjectAsync(codePath); - - const code = await assignFunctionCodeAsync( - resourceGroup, - storageAccount, - zipsContainer, - `int${shortName}`, - publishResult.releaseDir); - apiStatusCheck(`${internalFunctionPrefix}-${shortName}`, `Internal - ${name}`, func.webApp.hostNames[0], ConfInternalApiCheckInterval); - return { - name, - shortName, - ...func, - ...code, - }; -} diff --git a/cloud/infrastructure/src/apps/createRemoteBrowser.ts b/cloud/infrastructure/src/apps/createRemoteBrowser.ts deleted file mode 100644 index b377c29a6a..0000000000 --- a/cloud/infrastructure/src/apps/createRemoteBrowser.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import { type ContainerRegistryResult } from '../Azure/containerRegistry'; -import createContainerApp from '../Azure/createContainerApp'; -import createManagedEnvironment from '../Azure/createManagedEnvironment'; -import createContainerImage from '../Azure/createContainerImage'; -import type createLogWorkspace from '../Azure/createLogWorkspace'; - -export default function createRemoteBrowser( - resourceGroup: ResourceGroup, - namePrefix: string, - registry: ContainerRegistryResult, - logWorkspace: ReturnType, - shouldProtect: boolean) { - const environment = createManagedEnvironment(resourceGroup, namePrefix, logWorkspace, shouldProtect); - const image = createContainerImage(registry, namePrefix, 'signalco-remote-browser', 'Signalco.Api.RemoteBrowser'); - const app = createContainerApp(resourceGroup, namePrefix, environment.managedEnvironment, registry, image.image, shouldProtect); - - return { - app, - }; -} \ No newline at end of file diff --git a/cloud/infrastructure/tools/restart-functions.js b/cloud/infrastructure/tools/restart-functions.js deleted file mode 100644 index 155e80bc94..0000000000 --- a/cloud/infrastructure/tools/restart-functions.js +++ /dev/null @@ -1,22 +0,0 @@ -const { exec } = require('node:child_process'); - -exec('pulumi stack output --json', (err, stdout, stderr) => { - if (err) { - console.error(err, stderr); - return; - } - - const output = JSON.parse(stdout); - const functionAppNames = output.functionApps; - const resourceGroupName = output.resourceGroupName; - for (const functionName of functionAppNames) { - console.log(`Restarting function: ${functionName}`); - exec(`az functionapp restart --name ${functionName} --resource-group ${resourceGroupName}`, (err, stdout, stderr) => { - if (err) { - console.error('Restarting function failed: ' + functionName, err, stderr); - return; - } - console.log('Restarted function: ' + functionName); - }); - } -}); diff --git a/cloud/infrastructure/tsconfig.json b/cloud/infrastructure/tsconfig.json deleted file mode 100644 index 08ce44ab63..0000000000 --- a/cloud/infrastructure/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "outDir": "bin", - "target": "ESNext", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/docs/jb_beam.png b/docs/sponsors/jb_beam.png similarity index 100% rename from docs/jb_beam.png rename to docs/sponsors/jb_beam.png diff --git a/docs/ms_startups.png b/docs/sponsors/ms_startups.png similarity index 100% rename from docs/ms_startups.png rename to docs/sponsors/ms_startups.png diff --git a/infra/.eslintrc.js b/infra/.eslintrc.js new file mode 100644 index 0000000000..bf41d752d4 --- /dev/null +++ b/infra/.eslintrc.js @@ -0,0 +1,10 @@ +// This configuration only applies to the package manager root. +/** @type {import("eslint").Linter.Config} */ +module.exports = { + ignorePatterns: ["apps/**", "packages/**"], + extends: ["@infra/eslint-config/library.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/infra/.gitignore b/infra/.gitignore new file mode 100644 index 0000000000..96fab4fed3 --- /dev/null +++ b/infra/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# Dependencies +node_modules +.pnp +.pnp.js + +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage + +# Turbo +.turbo + +# Vercel +.vercel + +# Build Outputs +.next/ +out/ +build +dist + + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Misc +.DS_Store +*.pem diff --git a/infra/.idea/infra.iml b/infra/.idea/infra.iml new file mode 100644 index 0000000000..24643cc374 --- /dev/null +++ b/infra/.idea/infra.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/infra/.idea/modules.xml b/infra/.idea/modules.xml new file mode 100644 index 0000000000..a785a5366c --- /dev/null +++ b/infra/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/infra/.npmrc b/infra/.npmrc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/infra/.vscode/settings.json b/infra/.vscode/settings.json new file mode 100644 index 0000000000..44a73ec3a9 --- /dev/null +++ b/infra/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "eslint.workingDirectories": [ + { + "mode": "auto" + } + ] +} diff --git a/infra/README.md b/infra/README.md new file mode 100644 index 0000000000..7a4658aa87 --- /dev/null +++ b/infra/README.md @@ -0,0 +1,81 @@ +# Turborepo starter + +This is an official starter Turborepo. + +## Using this example + +Run the following command: + +```sh +npx create-turbo@latest +``` + +## What's inside? + +This Turborepo includes the following packages/apps: + +### Apps and Packages + +- `docs`: a [Next.js](https://nextjs.org/) app +- `web`: another [Next.js](https://nextjs.org/) app +- `@repo/ui`: a stub React component library shared by both `web` and `docs` applications +- `@repo/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) +- `@repo/typescript-config`: `tsconfig.json`s used throughout the monorepo + +Each package/app is 100% [TypeScript](https://www.typescriptlang.org/). + +### Utilities + +This Turborepo has some additional tools already setup for you: + +- [TypeScript](https://www.typescriptlang.org/) for static type checking +- [ESLint](https://eslint.org/) for code linting +- [Prettier](https://prettier.io) for code formatting + +### Build + +To build all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm build +``` + +### Develop + +To develop all apps and packages, run the following command: + +``` +cd my-turborepo +pnpm dev +``` + +### Remote Caching + +Turborepo can use a technique known as [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) to share cache artifacts across machines, enabling you to share build caches with your team and CI/CD pipelines. + +By default, Turborepo will cache locally. To enable Remote Caching you will need an account with Vercel. If you don't have an account you can [create one](https://vercel.com/signup), then enter the following commands: + +``` +cd my-turborepo +npx turbo login +``` + +This will authenticate the Turborepo CLI with your [Vercel account](https://vercel.com/docs/concepts/personal-accounts/overview). + +Next, you can link your Turborepo to your Remote Cache by running the following command from the root of your Turborepo: + +``` +npx turbo link +``` + +## Useful Links + +Learn more about the power of Turborepo: + +- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks) +- [Caching](https://turbo.build/repo/docs/core-concepts/caching) +- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) +- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering) +- [Configuration Options](https://turbo.build/repo/docs/reference/configuration) +- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference) diff --git a/infra/apps/cloud-primary/.eslintrc.cjs b/infra/apps/cloud-primary/.eslintrc.cjs new file mode 100644 index 0000000000..ac8a0bf66f --- /dev/null +++ b/infra/apps/cloud-primary/.eslintrc.cjs @@ -0,0 +1,9 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["@infra/eslint-config/library.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + }, +}; \ No newline at end of file diff --git a/cloud/infrastructure/Pulumi.next.yaml b/infra/apps/cloud-primary/Pulumi.next.yaml similarity index 100% rename from cloud/infrastructure/Pulumi.next.yaml rename to infra/apps/cloud-primary/Pulumi.next.yaml diff --git a/cloud/infrastructure/Pulumi.production.yaml b/infra/apps/cloud-primary/Pulumi.production.yaml similarity index 100% rename from cloud/infrastructure/Pulumi.production.yaml rename to infra/apps/cloud-primary/Pulumi.production.yaml diff --git a/cloud/infrastructure/Pulumi.shared.yaml b/infra/apps/cloud-primary/Pulumi.shared.yaml similarity index 100% rename from cloud/infrastructure/Pulumi.shared.yaml rename to infra/apps/cloud-primary/Pulumi.shared.yaml diff --git a/cloud/infrastructure/Pulumi.yaml b/infra/apps/cloud-primary/Pulumi.yaml similarity index 100% rename from cloud/infrastructure/Pulumi.yaml rename to infra/apps/cloud-primary/Pulumi.yaml diff --git a/cloud/infrastructure/package.json b/infra/apps/cloud-primary/package.json similarity index 80% rename from cloud/infrastructure/package.json rename to infra/apps/cloud-primary/package.json index e049b82c78..42363c212c 100644 --- a/cloud/infrastructure/package.json +++ b/infra/apps/cloud-primary/package.json @@ -1,11 +1,14 @@ { - "name": "cloud-primary", + "name": "@infra/signalco", "private": true, "license": "../LICENSE", - "main": "src/index.ts", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "type": "module", "scripts": { + "build": "tsc", "lint": "eslint ./src/**/*.ts", - "restart-functions": "node tools/restart-functions.js" + "preview": "pulumi preview" }, "devDependencies": { "@types/node": "20.10.5", @@ -20,6 +23,7 @@ "typescript": "5.3.3" }, "dependencies": { + "@infra/pulumi": "workspace:*", "@checkly/pulumi": "1.1.4", "@pulumi/aws": "6.14.0", "@pulumi/azure-native": "2.22.0", @@ -29,4 +33,4 @@ "@pulumi/pulumi": "3.97.0", "@pulumiverse/vercel": "1.0.1" } -} +} \ No newline at end of file diff --git a/cloud/infrastructure/src/config.ts b/infra/apps/cloud-primary/src/config.ts similarity index 82% rename from cloud/infrastructure/src/config.ts rename to infra/apps/cloud-primary/src/config.ts index ec7e760b03..928b3b9fd7 100644 --- a/cloud/infrastructure/src/config.ts +++ b/infra/apps/cloud-primary/src/config.ts @@ -1,4 +1,4 @@ -import { CheckFrequency } from './Checkly/apiStatusCheck'; +import { CheckFrequency } from '@infra/pulumi/checkly'; // Monitoring intervals export const ConfChannelApiCheckInterval: CheckFrequency = 120; diff --git a/cloud/infrastructure/src/Azure/createChannelFunction.ts b/infra/apps/cloud-primary/src/createChannelFunction.ts similarity index 66% rename from cloud/infrastructure/src/Azure/createChannelFunction.ts rename to infra/apps/cloud-primary/src/createChannelFunction.ts index 4a582f03dc..c2e6567579 100644 --- a/cloud/infrastructure/src/Azure/createChannelFunction.ts +++ b/infra/apps/cloud-primary/src/createChannelFunction.ts @@ -1,19 +1,21 @@ import { type StackReference } from '@pulumi/pulumi'; -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import createPublicFunction from './createPublicFunction'; -import { assignFunctionCodeAsync } from './assignFunctionCodeAsync'; -import apiStatusCheck from '../Checkly/apiStatusCheck'; -import publishProjectAsync from '../dotnet/publishProjectAsync'; -import { ConfChannelApiCheckInterval } from '../config'; -import { type BlobContainer, type StorageAccount } from '@pulumi/azure-native/storage'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { createPublicFunction, assignFunctionCodeAsync } from '@infra/pulumi/azure'; +import { apiStatusCheck } from '@infra/pulumi/checkly'; +import { publishProjectAsync } from '@infra/pulumi/dotnet'; +import { ConfChannelApiCheckInterval } from './config.js'; +import { type BlobContainer, type StorageAccount } from '@pulumi/azure-native/storage/index.js'; -export default async function createChannelFunctionAsync ( - channelName: string, - resourceGroup: ResourceGroup, +export async function createChannelFunction( + channelName: string, + resourceGroup: ResourceGroup, storageAccount: StorageAccount, zipsContainer: BlobContainer, currentStack: StackReference, - protect: boolean) { + protect: boolean): Promise<{ + nameLower: string, + name: string, + } & ReturnType & Awaited>> { const channelNameLower = channelName.toLocaleLowerCase(); const publicFunctionPrefix = 'channel' + channelNameLower; const publicFunctionStoragePrefix = 'ch' + channelNameLower; @@ -29,7 +31,7 @@ export default async function createChannelFunctionAsync ( protect, ); - const codePath = `../src/Signalco.Channel.${channelName}`; + const codePath = `../../../cloud/src/Signalco.Channel.${channelName}`; const publishResult = await publishProjectAsync(codePath); const channelFuncCode = await assignFunctionCodeAsync( diff --git a/infra/apps/cloud-primary/src/createInternalFunctionAsync.ts b/infra/apps/cloud-primary/src/createInternalFunctionAsync.ts new file mode 100644 index 0000000000..8a27e66280 --- /dev/null +++ b/infra/apps/cloud-primary/src/createInternalFunctionAsync.ts @@ -0,0 +1,42 @@ +import { createFunction, assignFunctionCodeAsync } from '@infra/pulumi/azure'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { publishProjectAsync } from '@infra/pulumi/dotnet'; +import { apiStatusCheck } from '@infra/pulumi/checkly'; +import { ConfInternalApiCheckInterval } from './config.js'; +import { type BlobContainer, type StorageAccount } from '@pulumi/azure-native/storage/index.js'; + +const internalFunctionPrefix = 'cint'; + +export async function createInternalFunctionAsync( + resourceGroup: ResourceGroup, + name: string, + storageAccount: StorageAccount, + zipsContainer: BlobContainer, + shouldProtect: boolean): Promise<{ + name: string, + shortName: string, + } & ReturnType & Awaited>> { + const shortName = name.substring(0, 9).toLocaleLowerCase(); + const func = createFunction( + resourceGroup, + `int${shortName}`, + shouldProtect, + false); + + const codePath = `../../../cloud/src/Signalco.Func.Internal.${name}`; + const publishResult = await publishProjectAsync(codePath); + + const code = await assignFunctionCodeAsync( + resourceGroup, + storageAccount, + zipsContainer, + `int${shortName}`, + publishResult.releaseDir); + apiStatusCheck(`${internalFunctionPrefix}-${shortName}`, `Internal - ${name}`, func.webApp.hostNames[0]!, ConfInternalApiCheckInterval); + return { + name, + shortName, + ...func, + ...code, + }; +} diff --git a/infra/apps/cloud-primary/src/createRemoteBrowser.ts b/infra/apps/cloud-primary/src/createRemoteBrowser.ts new file mode 100644 index 0000000000..82db73fbb1 --- /dev/null +++ b/infra/apps/cloud-primary/src/createRemoteBrowser.ts @@ -0,0 +1,18 @@ +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { type ContainerRegistryResult, type createLogWorkspace } from '@infra/pulumi/azure'; +import { createContainerApp, createManagedEnvironment, createContainerImage } from '@infra/pulumi/azure'; + +export function createRemoteBrowser( + resourceGroup: ResourceGroup, + namePrefix: string, + registry: ContainerRegistryResult, + logWorkspace: ReturnType, + shouldProtect: boolean): { app: ReturnType } { + const environment = createManagedEnvironment(resourceGroup, namePrefix, logWorkspace, shouldProtect); + const image = createContainerImage(registry, namePrefix, 'signalco-remote-browser', 'Signalco.Api.RemoteBrowser'); + const app = createContainerApp(resourceGroup, namePrefix, environment.managedEnvironment, registry, image.image, shouldProtect); + + return { + app, + }; +} \ No newline at end of file diff --git a/cloud/infrastructure/src/index.ts b/infra/apps/cloud-primary/src/index.ts similarity index 82% rename from cloud/infrastructure/src/index.ts rename to infra/apps/cloud-primary/src/index.ts index efe87b828b..bd69358ce2 100644 --- a/cloud/infrastructure/src/index.ts +++ b/infra/apps/cloud-primary/src/index.ts @@ -1,28 +1,30 @@ import { Config, getStack, interpolate, StackReference, getProject } from '@pulumi/pulumi'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; -import { createSignalR } from './Azure/createSignalR'; -import { createStorageAccount } from './Azure/createStorageAccount'; -import { createKeyVault } from './Azure/createKeyVault'; -import createPublicFunction from './Azure/createPublicFunction'; -import { webAppIdentity } from './Azure/webAppIdentity'; -import vaultSecret from './Azure/vaultSecret'; -import { assignFunctionCodeAsync } from './Azure/assignFunctionCodeAsync'; -import { assignFunctionSettings } from './Azure/assignFunctionSettings'; -import createSes from './AWS/createSes'; -import createInternalFunctionAsync from './Azure/createInternalFunctionAsync'; -import createChannelFunction from './Azure/createChannelFunction'; -import apiStatusCheck from './Checkly/apiStatusCheck'; -import dnsRecord from './CloudFlare/dnsRecord'; -import publishProjectAsync from './dotnet/publishProjectAsync'; -import { ConfCloudApiCheckInterval, ConfPublicSignalRCheckInterval } from './config'; -import createRemoteBrowser from './apps/createRemoteBrowser'; -import { createContainerRegistry, getContainerRegistry } from './Azure/containerRegistry'; -import createFunctionsStorage from './Azure/createFunctionsStorage'; -import { Dashboard } from '@checkly/pulumi/dashboard'; -import createLogWorkspace from './Azure/createLogWorkspace'; -import createAppInsights from './Azure/createAppInsights'; -import { nextJsApp } from './Vercel/nextJsApp'; -import { vercelApp } from './Vercel/vercelApp'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { + createSignalR, + createStorageAccount, + createKeyVault, + createPublicFunction, + webAppIdentity, + vaultSecret, + assignFunctionCodeAsync, + assignFunctionSettings, + createContainerRegistry, + getContainerRegistry, + createFunctionsStorage, + createLogWorkspace, + createAppInsights, +} from '@infra/pulumi/azure'; +import { createSes } from '@infra/pulumi/aws'; +import { apiStatusCheck } from '@infra/pulumi/checkly'; +import { dnsRecord } from '@infra/pulumi/cloudflare'; +import { publishProjectAsync } from '@infra/pulumi/dotnet'; +import { ConfCloudApiCheckInterval, ConfPublicSignalRCheckInterval } from './config.js'; +import { createRemoteBrowser } from './createRemoteBrowser.js'; +import { Dashboard } from '@checkly/pulumi'; +import { nextJsApp, vercelApp } from '@infra/pulumi/vercel'; +import { createChannelFunction } from './createChannelFunction.js'; +import { createInternalFunctionAsync } from './createInternalFunctionAsync.js'; /* * NOTE: `parent` configuration is currently disabled for all resources because @@ -32,7 +34,7 @@ import { vercelApp } from './Vercel/vercelApp'; * - this doesn't work in CI because az is not installed and authenticated */ -export = async () => { +const up = async () => { const resourceGroupSharedName = 'signalco-shared'; const containerRegistryName = 'signalco'; @@ -46,7 +48,7 @@ export = async () => { createContainerRegistry(resourceGroupShared, containerRegistryName, true); - return { }; + return {}; } else { const shouldProtect = stack === 'production'; const domainName = `${config.require('domain')}`; @@ -84,7 +86,7 @@ export = async () => { api.cors, currentStack, false); - const apiFuncPublish = await publishProjectAsync(['../src/Signalco.Api.Public', api.name].filter(i => i.length).join('.')); + const apiFuncPublish = await publishProjectAsync(['../../../cloud/src/Signalco.Api.Public', api.name].filter(i => i.length).join('.')); const apiFuncCode = await assignFunctionCodeAsync( resourceGroup, funcStorage.storageAccount.storageAccount, @@ -113,14 +115,14 @@ export = async () => { const channelNames = stack === 'production' ? productionChannelNames : [...productionChannelNames, ...nextChannelNames]; - const channelsFuncs = []; + const channelsFunctions = []; for (const channelName of channelNames) { - channelsFuncs.push(await createChannelFunction(channelName, resourceGroup, funcStorage.storageAccount.storageAccount, funcStorage.zipsContainer, currentStack, false)); + channelsFunctions.push(await createChannelFunction(channelName, resourceGroup, funcStorage.storageAccount.storageAccount, funcStorage.zipsContainer, currentStack, false)); } // Generate discrete functions const discreteNames = ['Mutex']; - const discreteFuncs = []; + const discreteFunctions = []; for (const funcName of discreteNames) { const discreteResourceGroup = new ResourceGroup(`signalco-discrete-${stack}-${funcName.toLowerCase()}`); const discreteStorage = createFunctionsStorage(discreteResourceGroup, `${funcName.toLowerCase().substring(0, 5)}funcs`, false); @@ -131,14 +133,14 @@ export = async () => { undefined, currentStack, false); - const funcPublish = await publishProjectAsync(`../../discrete/Signalco.Discrete.Api.${funcName}/cloud`, 7); + const funcPublish = await publishProjectAsync(`../../../discrete/Signalco.Discrete.Api.${funcName}/cloud`, 7); const funcCode = await assignFunctionCodeAsync( discreteResourceGroup, discreteStorage.storageAccount.storageAccount, discreteStorage.zipsContainer, funcName.toLowerCase().substring(0, 5), funcPublish.releaseDir); - discreteFuncs.push({ + discreteFunctions.push({ name: funcName, shortName: funcName.toLowerCase().substring(0, 5), resourceGroup: discreteResourceGroup, @@ -165,7 +167,7 @@ export = async () => { const vault = createKeyVault(resourceGroup, keyvaultPrefix, shouldProtect, [ ...publicFuncs.map(c => webAppIdentity(c.webApp)), ...internalFuncs.map(c => webAppIdentity(c.webApp)), - ...channelsFuncs.map(c => webAppIdentity(c.webApp)), + ...channelsFunctions.map(c => webAppIdentity(c.webApp)), ]); vaultSecret(resourceGroup, vault.keyVault, keyvaultPrefix, 'Slack--SigningSecret', config.requireSecret('secret-slackSigningSecret')); @@ -226,7 +228,7 @@ export = async () => { }); // Populate channel function settings - channelsFuncs.forEach(channel => { + channelsFunctions.forEach(channel => { assignFunctionSettings( resourceGroup, channel.webApp, @@ -241,7 +243,7 @@ export = async () => { }); // Populate discrete function settings - discreteFuncs.forEach(func => { + discreteFunctions.forEach(func => { assignFunctionSettings( func.resourceGroup, func.webApp, @@ -269,7 +271,7 @@ export = async () => { dnsRecord('checkly-public-dashboard', 'status', 'checkly-dashboards.com', 'CNAME', false); dnsRecord('checkly-public-dashboard-txt', '_vercel', 'vc-domain-verify=status.signalco.io,563d86cd3501b049a1ad', 'TXT', false); } - + // Vercel apps nextJsApp('signalco-blog', 'blog'); nextJsApp('signalco-app', 'app'); @@ -295,23 +297,25 @@ export = async () => { signalrUrl: signalr.signalr.hostName, internalFunctionUrls: internalFuncs.map(f => f.webApp.hostNames[0]), publicUrls: publicFuncs.map(c => c.dnsCname.hostname), - channelsUrls: channelsFuncs.map(c => c.dnsCname.hostname), + channelsUrls: channelsFunctions.map(c => c.dnsCname.hostname), appUrls: [ appRb.app.url, ], - discreteUrls: discreteFuncs.map(f => f.webApp.hostNames[0]), + discreteUrls: discreteFunctions.map(f => f.webApp.hostNames[0]), resourceGroupName: resourceGroup.name, functionApps: [ ...internalFuncs.map(c => c.webApp.name), ...publicFuncs.map(c => c.webApp.name), - ...channelsFuncs.map(c => c.webApp.name), - ...discreteFuncs.map(c => c.webApp.name), + ...channelsFunctions.map(c => c.webApp.name), + ...discreteFunctions.map(c => c.webApp.name), ], certs: [ - ...publicFuncs.map(f => ({ fullDomainName: f.fullDomainName, thumbprint: f.cert.thumbprint})), - ...channelsFuncs.map(f => ({ fullDomainName: f.fullDomainName, thumbprint: f.cert.thumbprint})), - ...discreteFuncs.map(f => ({ fullDomainName: f.fullDomainName, thumbprint: f.cert.thumbprint})), + ...publicFuncs.map(f => ({ fullDomainName: f.fullDomainName, thumbprint: f.cert.thumbprint })), + ...channelsFunctions.map(f => ({ fullDomainName: f.fullDomainName, thumbprint: f.cert.thumbprint })), + ...discreteFunctions.map(f => ({ fullDomainName: f.fullDomainName, thumbprint: f.cert.thumbprint })), ], }; } }; + +export default up; diff --git a/infra/apps/cloud-primary/tsconfig.json b/infra/apps/cloud-primary/tsconfig.json new file mode 100644 index 0000000000..c238fdf402 --- /dev/null +++ b/infra/apps/cloud-primary/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@infra/typescript-config/base.json", + "parserOptions": { + "project": "./tsconfig.json" + }, + "compilerOptions": { + "outDir": "dist", + }, + "include": [ + "./src/**/*.ts", + "./.eslintrc.cjs" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/infra/apps/remote-browser/.eslintrc.js b/infra/apps/remote-browser/.eslintrc.js new file mode 100644 index 0000000000..ac8a0bf66f --- /dev/null +++ b/infra/apps/remote-browser/.eslintrc.js @@ -0,0 +1,9 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["@infra/eslint-config/library.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + }, +}; \ No newline at end of file diff --git a/infra/apps/remote-browser/package.json b/infra/apps/remote-browser/package.json new file mode 100644 index 0000000000..0b15339bb3 --- /dev/null +++ b/infra/apps/remote-browser/package.json @@ -0,0 +1,32 @@ +{ + "name": "@infra/remote-browser", + "private": true, + "license": "../LICENSE", + "main": "src/index.ts", + "scripts": { + "lint": "eslint ./src/**/*.ts" + }, + "devDependencies": { + "@infra/pulumi": "workspace:*", + "@types/node": "20.10.5", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", + "eslint": "8.56.0", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-n": "16.4.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "typescript": "5.3.3" + }, + "dependencies": { + "@checkly/pulumi": "1.1.4", + "@pulumi/aws": "6.14.0", + "@pulumi/azure-native": "2.22.0", + "@pulumi/cloudflare": "5.16.0", + "@pulumi/command": "0.9.2", + "@pulumi/docker": "4.5.0", + "@pulumi/pulumi": "3.97.0", + "@pulumiverse/vercel": "1.0.1" + } +} \ No newline at end of file diff --git a/infra/apps/remote-browser/tsconfig.json b/infra/apps/remote-browser/tsconfig.json new file mode 100644 index 0000000000..be630c2b2c --- /dev/null +++ b/infra/apps/remote-browser/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@infra/typescript-config/base.json", + "include": [ + "**/*.ts", + "**/*.tsx", + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/infra/apps/uier/.eslintrc.js b/infra/apps/uier/.eslintrc.js new file mode 100644 index 0000000000..ac8a0bf66f --- /dev/null +++ b/infra/apps/uier/.eslintrc.js @@ -0,0 +1,9 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["@infra/eslint-config/library.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + }, +}; \ No newline at end of file diff --git a/infra/apps/uier/Pulumi.next.yaml b/infra/apps/uier/Pulumi.next.yaml new file mode 100644 index 0000000000..7e76d365fd --- /dev/null +++ b/infra/apps/uier/Pulumi.next.yaml @@ -0,0 +1,4 @@ +config: + vercel:apiToken: + secure: AAABAA4uxruLwvuYUDigNjy8yKK8Q3fYt/nM8JmX+RWMNsAMCiDNTbw8uFgFetLzaM4ZkQyLh/8= + vercel:team: team_Ade0MlfC3211ml3wYJZ4c9hn diff --git a/infra/apps/uier/Pulumi.production.yaml b/infra/apps/uier/Pulumi.production.yaml new file mode 100644 index 0000000000..7ec3d3c9b5 --- /dev/null +++ b/infra/apps/uier/Pulumi.production.yaml @@ -0,0 +1,4 @@ +config: + vercel:apiToken: + secure: AAABAIqY6swLmFBuXsBC1nImEqM4nxOHyxnJn61fsVuM5MrM/gif2yN6U8ZkY5f/lIEQB9H/kSM= + vercel:team: team_Ade0MlfC3211ml3wYJZ4c9hn diff --git a/infra/apps/uier/Pulumi.yaml b/infra/apps/uier/Pulumi.yaml new file mode 100644 index 0000000000..47d6c808b0 --- /dev/null +++ b/infra/apps/uier/Pulumi.yaml @@ -0,0 +1,3 @@ +name: uier +runtime: nodejs +description: uier.io infrastructure diff --git a/infra/apps/uier/package.json b/infra/apps/uier/package.json new file mode 100644 index 0000000000..f76c6ce384 --- /dev/null +++ b/infra/apps/uier/package.json @@ -0,0 +1,36 @@ +{ + "name": "@infra/uier", + "private": true, + "license": "../LICENSE", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "scripts": { + "build": "tsc", + "lint": "eslint ./src/**/*.ts", + "preview": "pulumi preview" + }, + "devDependencies": { + "@infra/pulumi": "workspace:*", + "@types/node": "20.10.5", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", + "eslint": "8.56.0", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-n": "16.4.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "typescript": "5.3.3" + }, + "dependencies": { + "@checkly/pulumi": "1.1.4", + "@pulumi/aws": "6.14.0", + "@pulumi/azure-native": "2.22.0", + "@pulumi/cloudflare": "5.16.0", + "@pulumi/command": "0.9.2", + "@pulumi/docker": "4.5.0", + "@pulumi/pulumi": "3.97.0", + "@pulumiverse/vercel": "1.0.1" + } +} \ No newline at end of file diff --git a/infra/apps/uier/src/index.ts b/infra/apps/uier/src/index.ts new file mode 100644 index 0000000000..a085a0639a --- /dev/null +++ b/infra/apps/uier/src/index.ts @@ -0,0 +1,7 @@ +import { nextJsApp } from '@infra/pulumi/vercel'; + +const up = async () => { + nextJsApp('uier', 'uier'); +}; + +export default up; \ No newline at end of file diff --git a/infra/apps/uier/tsconfig.json b/infra/apps/uier/tsconfig.json new file mode 100644 index 0000000000..c238fdf402 --- /dev/null +++ b/infra/apps/uier/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@infra/typescript-config/base.json", + "parserOptions": { + "project": "./tsconfig.json" + }, + "compilerOptions": { + "outDir": "dist", + }, + "include": [ + "./src/**/*.ts", + "./.eslintrc.cjs" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/infra/package.json b/infra/package.json new file mode 100644 index 0000000000..78332fe9f5 --- /dev/null +++ b/infra/package.json @@ -0,0 +1,20 @@ +{ + "name": "infra", + "private": true, + "scripts": { + "build": "turbo build", + "preview": "turbo preview", + "lint": "turbo lint", + "format": "prettier --write \"**/*.{ts,tsx,md}\"" + }, + "devDependencies": { + "@infra/eslint-config": "workspace:*", + "@infra/typescript-config": "workspace:*", + "prettier": "^3.1.0", + "turbo": "latest" + }, + "packageManager": "pnpm@8.9.0", + "engines": { + "node": ">=18" + } +} diff --git a/infra/packages/eslint-config/README.md b/infra/packages/eslint-config/README.md new file mode 100644 index 0000000000..8b42d901b0 --- /dev/null +++ b/infra/packages/eslint-config/README.md @@ -0,0 +1,3 @@ +# `@turbo/eslint-config` + +Collection of internal eslint configurations. diff --git a/infra/packages/eslint-config/library.js b/infra/packages/eslint-config/library.js new file mode 100644 index 0000000000..6eeae10b3f --- /dev/null +++ b/infra/packages/eslint-config/library.js @@ -0,0 +1,61 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: [ + "eslint:recommended", + "eslint-config-turbo", + "plugin:import/recommended", + "plugin:@typescript-eslint/recommended" + ], + plugins: ["only-warn", "@typescript-eslint"], + env: { + node: true, + }, + settings: { + "import/resolver": { + typescript: { + project + }, + } + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + "dist/", + ], + overrides: [ + { + files: ["*.js?(x)", "*.ts?(x)"], + }, + ], + rules: { + "indent": [ + "error", + 4 + ], + "quotes": [ + "error", + "single" + ], + "comma-dangle": [ + "warn", + { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "always-multiline" + } + ], + "semi": [ + "error", + "always" + ], + "import/no-unresolved": 0, + "import/no-absolute-path": 0 + } +}; diff --git a/infra/packages/eslint-config/package.json b/infra/packages/eslint-config/package.json new file mode 100644 index 0000000000..9b82b6089b --- /dev/null +++ b/infra/packages/eslint-config/package.json @@ -0,0 +1,18 @@ +{ + "name": "@infra/eslint-config", + "version": "0.0.0", + "private": true, + "files": [ + "library.js" + ], + "devDependencies": { + "eslint-config-turbo": "^1.10.12", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-only-warn": "^1.1.0", + "eslint-plugin-import": "2.29.1", + "eslint-import-resolver-typescript": "3.6.1", + "@typescript-eslint/parser": "^6.11.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "typescript": "^5.2.2" + } +} diff --git a/infra/packages/pulumi/.eslintrc.cjs b/infra/packages/pulumi/.eslintrc.cjs new file mode 100644 index 0000000000..ac8a0bf66f --- /dev/null +++ b/infra/packages/pulumi/.eslintrc.cjs @@ -0,0 +1,9 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ["@infra/eslint-config/library.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + }, +}; \ No newline at end of file diff --git a/infra/packages/pulumi/package.json b/infra/packages/pulumi/package.json new file mode 100644 index 0000000000..f48012dbb6 --- /dev/null +++ b/infra/packages/pulumi/package.json @@ -0,0 +1,60 @@ +{ + "name": "@infra/pulumi", + "private": true, + "license": "../LICENSE", + "type": "module", + "scripts": { + "build": "tsc", + "lint": "eslint ./src/**/*.ts" + }, + "exports": { + "./azure": { + "import": "./dist/azure/index.js", + "types": "./dist/azure/index.d.ts" + }, + "./aws": { + "import": "./dist/aws/index.js", + "types": "./dist/aws/index.d.ts" + }, + "./cloudflare": { + "import": "./dist/cloudflare/index.js", + "types": "./dist/cloudflare/index.d.ts" + }, + "./checkly": { + "import": "./dist/checkly/index.js", + "types": "./dist/checkly/index.d.ts" + }, + "./vercel": { + "import": "./dist/vercel/index.js", + "types": "./dist/vercel/index.d.ts" + }, + "./dotnet": { + "import": "./dist/dotnet/index.js", + "types": "./dist/dotnet/index.d.ts" + } + }, + "devDependencies": { + "@infra/typescript-config": "workspace:*", + "@infra/eslint-config": "workspace:*", + "@types/node": "20.10.5", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", + "eslint": "8.56.0", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-n": "16.4.0", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.1.1", + "typescript": "5.3.3" + }, + "dependencies": { + "@checkly/pulumi": "1.1.4", + "@pulumi/aws": "6.14.0", + "@pulumi/azure-native": "2.22.0", + "@pulumi/cloudflare": "5.16.0", + "@pulumi/command": "0.9.2", + "@pulumi/docker": "4.5.0", + "@pulumi/pulumi": "3.97.0", + "@pulumiverse/vercel": "1.0.1" + } +} \ No newline at end of file diff --git a/cloud/infrastructure/src/AWS/createSes.ts b/infra/packages/pulumi/src/aws/createSes.ts similarity index 93% rename from cloud/infrastructure/src/AWS/createSes.ts rename to infra/packages/pulumi/src/aws/createSes.ts index 2031746189..ba09e31e7e 100644 --- a/cloud/infrastructure/src/AWS/createSes.ts +++ b/infra/packages/pulumi/src/aws/createSes.ts @@ -1,9 +1,9 @@ import { Config, interpolate } from '@pulumi/pulumi'; -import { User, AccessKey, UserPolicy } from '@pulumi/aws/iam'; -import { DomainIdentity, MailFrom, DomainDkim } from '@pulumi/aws/ses'; -import dnsRecord from '../CloudFlare/dnsRecord'; +import { User, AccessKey, UserPolicy } from '@pulumi/aws/iam/index.js'; +import { DomainIdentity, MailFrom, DomainDkim } from '@pulumi/aws/ses/index.js'; +import { dnsRecord } from '../cloudflare/dnsRecord.js'; -export default function createSes (prefix: string, subdomain: string) { +export function createSes(prefix: string, subdomain: string) { const config = new Config(); const baseDomain = config.require('domain'); const sesRegion = config.require('ses-region'); diff --git a/infra/packages/pulumi/src/aws/index.ts b/infra/packages/pulumi/src/aws/index.ts new file mode 100644 index 0000000000..1e4bbf290b --- /dev/null +++ b/infra/packages/pulumi/src/aws/index.ts @@ -0,0 +1 @@ +export * from './createSes.js'; \ No newline at end of file diff --git a/cloud/infrastructure/src/Azure/assignCustomDomain.ts b/infra/packages/pulumi/src/azure/assignCustomDomain.ts similarity index 83% rename from cloud/infrastructure/src/Azure/assignCustomDomain.ts rename to infra/packages/pulumi/src/azure/assignCustomDomain.ts index 754a7c6ea0..bd91df12fc 100644 --- a/cloud/infrastructure/src/Azure/assignCustomDomain.ts +++ b/infra/packages/pulumi/src/azure/assignCustomDomain.ts @@ -1,14 +1,14 @@ import { Config, interpolate, type StackReference, Output } from '@pulumi/pulumi'; -import { WebApp, AppServicePlan, WebAppHostNameBinding, Certificate, HostNameType, SslState, CustomHostNameDnsRecordType } from '@pulumi/azure-native/web'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; -import dnsRecord from '../CloudFlare/dnsRecord'; +import { WebApp, AppServicePlan, WebAppHostNameBinding, Certificate, HostNameType, SslState, CustomHostNameDnsRecordType } from '@pulumi/azure-native/web/index.js'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { dnsRecord } from '../cloudflare/dnsRecord.js'; -export function assignCustomDomain ( - resourceGroup: ResourceGroup, - webApp: WebApp, - servicePlan: AppServicePlan, - namePrefix: string, - subDomainName: string, +export function assignCustomDomain( + resourceGroup: ResourceGroup, + webApp: WebApp, + servicePlan: AppServicePlan, + namePrefix: string, + subDomainName: string, currentStack: StackReference, protect: boolean) { const config = new Config(); @@ -19,15 +19,13 @@ export function assignCustomDomain ( `asuid.${fullDomainName}`, interpolate`${webApp.customDomainVerificationId}`, 'TXT', - protect, - webApp); + protect); const cname = dnsRecord( `func-dns-cname-${namePrefix}`, fullDomainName, webApp.defaultHostName, 'CNAME', protect, - webApp, ); const certsOutput = currentStack.getOutput('certs') as Output<{ fullDomainName: string, thumbprint: string }[]>; diff --git a/cloud/infrastructure/src/Azure/assignFunctionCodeAsync.ts b/infra/packages/pulumi/src/azure/assignFunctionCodeAsync.ts similarity index 85% rename from cloud/infrastructure/src/Azure/assignFunctionCodeAsync.ts rename to infra/packages/pulumi/src/azure/assignFunctionCodeAsync.ts index 1d6412bc50..44196852c8 100644 --- a/cloud/infrastructure/src/Azure/assignFunctionCodeAsync.ts +++ b/infra/packages/pulumi/src/azure/assignFunctionCodeAsync.ts @@ -1,8 +1,8 @@ import { type Input, type Resource } from '@pulumi/pulumi'; -import { FileArchive } from '@pulumi/pulumi/asset'; -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import { Blob, type BlobContainer, type StorageAccount } from '@pulumi/azure-native/storage'; -import { signedBlobReadUrl } from './signedBlobReadUrl'; +import { FileArchive } from '@pulumi/pulumi/asset/index.js'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { Blob, type BlobContainer, type StorageAccount } from '@pulumi/azure-native/storage/index.js'; +import { signedBlobReadUrl } from './signedBlobReadUrl.js'; export async function assignFunctionCodeAsync( resourceGroup: ResourceGroup, diff --git a/cloud/infrastructure/src/Azure/assignFunctionSettings.ts b/infra/packages/pulumi/src/azure/assignFunctionSettings.ts similarity index 74% rename from cloud/infrastructure/src/Azure/assignFunctionSettings.ts rename to infra/packages/pulumi/src/azure/assignFunctionSettings.ts index 46de32f7c3..31bde41b51 100644 --- a/cloud/infrastructure/src/Azure/assignFunctionSettings.ts +++ b/infra/packages/pulumi/src/azure/assignFunctionSettings.ts @@ -1,8 +1,8 @@ import { Input } from '@pulumi/pulumi'; -import { type WebApp, WebAppApplicationSettings } from '@pulumi/azure-native/web'; -import { type ResourceGroup } from '@pulumi/azure-native/resources'; +import { type WebApp, WebAppApplicationSettings } from '@pulumi/azure-native/web/index.js'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; -export function assignFunctionSettings (resourceGroup: ResourceGroup, app: WebApp, namePrefix: string, storageConnectionString: Input, codeUrl: Input, appSettings: Input<{ [key: string]: Input; }>, protect: boolean) { +export function assignFunctionSettings(resourceGroup: ResourceGroup, app: WebApp, namePrefix: string, storageConnectionString: Input, codeUrl: Input, appSettings: Input<{ [key: string]: Input; }>, protect: boolean) { const settings = new WebAppApplicationSettings(`func-appsettings-${namePrefix}`, { name: app.name, resourceGroupName: resourceGroup.name, diff --git a/cloud/infrastructure/src/Azure/containerRegistry.ts b/infra/packages/pulumi/src/azure/containerRegistry.ts similarity index 92% rename from cloud/infrastructure/src/Azure/containerRegistry.ts rename to infra/packages/pulumi/src/azure/containerRegistry.ts index c40086acb3..3765761740 100644 --- a/cloud/infrastructure/src/Azure/containerRegistry.ts +++ b/infra/packages/pulumi/src/azure/containerRegistry.ts @@ -1,10 +1,10 @@ -import { Registry, listRegistryCredentialsOutput, getRegistryOutput } from '@pulumi/azure-native/containerregistry'; -import { type ResourceGroup } from '@pulumi/azure-native/resources'; +import { Registry, listRegistryCredentialsOutput, getRegistryOutput } from '@pulumi/azure-native/containerregistry/index.js'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; import { interpolate, type Output } from '@pulumi/pulumi'; export type ContainerRegistryResult = { registry: { - name: Output, + name: Output, loginServer: Output }, credentials: { @@ -28,7 +28,7 @@ export function getContainerRegistry(resourceGroupName: string, name: string): C registry, credentials: { adminUserName: interpolate`${credentials.username}`, - adminPassword: credentials.apply(c => c.passwords![0].value!), + adminPassword: credentials.apply(c => c.passwords![0]!.value!), }, }; } @@ -54,7 +54,7 @@ export function createContainerRegistry(resourceGroup: ResourceGroup, name: stri registry, credentials: { adminUserName: interpolate`${credentials.username}`, - adminPassword: credentials.apply(c => c.passwords![0].value!), + adminPassword: credentials.apply(c => c.passwords![0]!.value!), }, }; } \ No newline at end of file diff --git a/cloud/infrastructure/src/Azure/createAppInsights.ts b/infra/packages/pulumi/src/azure/createAppInsights.ts similarity index 83% rename from cloud/infrastructure/src/Azure/createAppInsights.ts rename to infra/packages/pulumi/src/azure/createAppInsights.ts index a02c9575d1..b73a9ca820 100644 --- a/cloud/infrastructure/src/Azure/createAppInsights.ts +++ b/infra/packages/pulumi/src/azure/createAppInsights.ts @@ -1,8 +1,8 @@ -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import { ComponentCurrentBillingFeature, Component, ApplicationType, type ComponentArgs } from '@pulumi/azure-native/insights'; -import type createLogWorkspace from './createLogWorkspace'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { ComponentCurrentBillingFeature, Component, ApplicationType, type ComponentArgs } from '@pulumi/azure-native/insights/index.js'; +import { createLogWorkspace } from './createLogWorkspace.js'; -export default function createAppInsights( +export function createAppInsights( resourceGroup: ResourceGroup, namePrefix: string, logWorkspace: ReturnType, diff --git a/cloud/infrastructure/src/Azure/createContainerApp.ts b/infra/packages/pulumi/src/azure/createContainerApp.ts similarity index 81% rename from cloud/infrastructure/src/Azure/createContainerApp.ts rename to infra/packages/pulumi/src/azure/createContainerApp.ts index be6509ad96..009d83a3ec 100644 --- a/cloud/infrastructure/src/Azure/createContainerApp.ts +++ b/infra/packages/pulumi/src/azure/createContainerApp.ts @@ -1,10 +1,10 @@ -import { ContainerApp, ManagedEnvironment } from '@pulumi/azure-native/app'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; +import { ContainerApp, ManagedEnvironment } from '@pulumi/azure-native/app/index.js'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; import { Image } from '@pulumi/docker'; import { interpolate } from '@pulumi/pulumi'; -import { type ContainerRegistryResult } from './containerRegistry'; +import { type ContainerRegistryResult } from './containerRegistry.js'; -export default function createContainerApp(resourceGroup: ResourceGroup, namePrefix: string, environment: ManagedEnvironment, registry: ContainerRegistryResult, image: Image, shouldProtect: boolean) { +export function createContainerApp(resourceGroup: ResourceGroup, namePrefix: string, environment: ManagedEnvironment, registry: ContainerRegistryResult, image: Image, shouldProtect: boolean) { const containerApp = new ContainerApp(`docker-app-${namePrefix}`, { resourceGroupName: resourceGroup.name, managedEnvironmentId: environment.id, diff --git a/cloud/infrastructure/src/Azure/createContainerImage.ts b/infra/packages/pulumi/src/azure/createContainerImage.ts similarity index 80% rename from cloud/infrastructure/src/Azure/createContainerImage.ts rename to infra/packages/pulumi/src/azure/createContainerImage.ts index 0dcfb00124..2858aef4df 100644 --- a/cloud/infrastructure/src/Azure/createContainerImage.ts +++ b/infra/packages/pulumi/src/azure/createContainerImage.ts @@ -1,19 +1,19 @@ import { Image } from '@pulumi/docker'; import { getStack, interpolate } from '@pulumi/pulumi'; -import { type ContainerRegistryResult } from './containerRegistry'; -import path = require('node:path'); +import { type ContainerRegistryResult } from './containerRegistry.js'; +import path from 'node:path'; -export default function createContainerImage( +export function createContainerImage( registry: ContainerRegistryResult, namePrefix: string, imageName: string, projectName: string, ) { const stack = getStack(); - const workingDirectory = path.join(process.cwd(), '..', 'src', projectName); + const workingDirectory = path.join(process.cwd(), '..', '..', '..', 'cloud', 'src', projectName); const image = new Image(`docker-image-${namePrefix}`, { imageName: interpolate`${registry.registry.loginServer}/${imageName}:${stack}`, - build: { + build: { context: workingDirectory, platform: 'linux/amd64', }, diff --git a/cloud/infrastructure/src/Azure/createFunction.ts b/infra/packages/pulumi/src/azure/createFunction.ts similarity index 92% rename from cloud/infrastructure/src/Azure/createFunction.ts rename to infra/packages/pulumi/src/azure/createFunction.ts index 892d0c7ccf..fb5fa6d71b 100644 --- a/cloud/infrastructure/src/Azure/createFunction.ts +++ b/infra/packages/pulumi/src/azure/createFunction.ts @@ -1,8 +1,8 @@ -import { WebApp, AppServicePlan, SupportedTlsVersions } from '@pulumi/azure-native/web'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; +import { WebApp, AppServicePlan, SupportedTlsVersions } from '@pulumi/azure-native/web/index.js'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; import { Input, interpolate } from '@pulumi/pulumi'; -export function createFunction ( +export function createFunction( resourceGroup: ResourceGroup, namePrefix: string, protect: boolean, diff --git a/cloud/infrastructure/src/Azure/createFunctionsStorage.ts b/infra/packages/pulumi/src/azure/createFunctionsStorage.ts similarity index 74% rename from cloud/infrastructure/src/Azure/createFunctionsStorage.ts rename to infra/packages/pulumi/src/azure/createFunctionsStorage.ts index b262fcbd1b..11803cd138 100644 --- a/cloud/infrastructure/src/Azure/createFunctionsStorage.ts +++ b/infra/packages/pulumi/src/azure/createFunctionsStorage.ts @@ -1,14 +1,14 @@ -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import { createStorageAccount } from './createStorageAccount'; -import { BlobContainer } from '@pulumi/azure-native/storage'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { createStorageAccount } from './createStorageAccount.js'; +import { BlobContainer } from '@pulumi/azure-native/storage/index.js'; -export default function createFunctionsStorage( +export function createFunctionsStorage( resourceGroup: ResourceGroup, namePrefix: string, protect: boolean, - + ) { - const account = createStorageAccount(resourceGroup, namePrefix, protect, resourceGroup); + const account = createStorageAccount(resourceGroup, namePrefix, protect); // Function code archives will be stored in this container. const codeContainer = new BlobContainer(`func-zips-${namePrefix}`, { diff --git a/cloud/infrastructure/src/Azure/createKeyVault.ts b/infra/packages/pulumi/src/azure/createKeyVault.ts similarity index 92% rename from cloud/infrastructure/src/Azure/createKeyVault.ts rename to infra/packages/pulumi/src/azure/createKeyVault.ts index 1b3c0a12fc..286674b552 100644 --- a/cloud/infrastructure/src/Azure/createKeyVault.ts +++ b/infra/packages/pulumi/src/azure/createKeyVault.ts @@ -1,9 +1,9 @@ import { Output } from '@pulumi/pulumi'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; -import { Vault, SkuFamily, SkuName, KeyPermissions, SecretPermissions } from '@pulumi/azure-native/keyvault'; -import { getClientConfig } from '@pulumi/azure-native/authorization'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { Vault, SkuFamily, SkuName, KeyPermissions, SecretPermissions } from '@pulumi/azure-native/keyvault/index.js'; +import { getClientConfig } from '@pulumi/azure-native/authorization/index.js'; -export function createKeyVault ( +export function createKeyVault( resourceGroup: ResourceGroup, namePrefix: string, protect: boolean, diff --git a/cloud/infrastructure/src/Azure/createLogWorkspace.ts b/infra/packages/pulumi/src/azure/createLogWorkspace.ts similarity index 73% rename from cloud/infrastructure/src/Azure/createLogWorkspace.ts rename to infra/packages/pulumi/src/azure/createLogWorkspace.ts index eb97293625..bffcf64819 100644 --- a/cloud/infrastructure/src/Azure/createLogWorkspace.ts +++ b/infra/packages/pulumi/src/azure/createLogWorkspace.ts @@ -1,7 +1,7 @@ -import { Workspace, getSharedKeysOutput, WorkspaceSkuNameEnum } from '@pulumi/azure-native/operationalinsights'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; +import { Workspace, getSharedKeysOutput, WorkspaceSkuNameEnum } from '@pulumi/azure-native/operationalinsights/index.js'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; -export default function createLogWorkspace(resourceGroup: ResourceGroup, namePrefix: string) { +export function createLogWorkspace(resourceGroup: ResourceGroup, namePrefix: string) { const workspace = new Workspace(`loganalytics-${namePrefix}`, { resourceGroupName: resourceGroup.name, sku: { diff --git a/cloud/infrastructure/src/Azure/createManagedEnvironment.ts b/infra/packages/pulumi/src/azure/createManagedEnvironment.ts similarity index 73% rename from cloud/infrastructure/src/Azure/createManagedEnvironment.ts rename to infra/packages/pulumi/src/azure/createManagedEnvironment.ts index b38f0f1d72..67745bc24d 100644 --- a/cloud/infrastructure/src/Azure/createManagedEnvironment.ts +++ b/infra/packages/pulumi/src/azure/createManagedEnvironment.ts @@ -1,11 +1,11 @@ -import { ManagedEnvironment } from '@pulumi/azure-native/app'; -import { GetSharedKeysResult } from '@pulumi/azure-native/operationalinsights'; -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import type createLogWorkspace from './createLogWorkspace'; +import { ManagedEnvironment } from '@pulumi/azure-native/app/index.js'; +import { GetSharedKeysResult } from '@pulumi/azure-native/operationalinsights/index.js'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { createLogWorkspace } from './createLogWorkspace.js'; -export default function createManagedEnvironments( - resourceGroup: ResourceGroup, - namePrefix: string, +export function createManagedEnvironment( + resourceGroup: ResourceGroup, + namePrefix: string, logWorkspace: ReturnType, shouldProtect: boolean) { const managedEnvironment = new ManagedEnvironment(`env-${namePrefix}`, { diff --git a/cloud/infrastructure/src/Azure/createPublicFunction.ts b/infra/packages/pulumi/src/azure/createPublicFunction.ts similarity index 52% rename from cloud/infrastructure/src/Azure/createPublicFunction.ts rename to infra/packages/pulumi/src/azure/createPublicFunction.ts index 26acee4f4a..184b5633ab 100644 --- a/cloud/infrastructure/src/Azure/createPublicFunction.ts +++ b/infra/packages/pulumi/src/azure/createPublicFunction.ts @@ -1,18 +1,18 @@ -import { ResourceGroup } from '@pulumi/azure-native/resources'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; import { type Input, type StackReference } from '@pulumi/pulumi'; -import { assignCustomDomain } from './assignCustomDomain'; -import { createFunction } from './createFunction'; +import { assignCustomDomain } from './assignCustomDomain.js'; +import { createFunction } from './createFunction.js'; -export default function createPublicFunction ( - resourceGroup: ResourceGroup, - namePrefix: string, - subDomainName: string, - corsDomains: Input[] | undefined, +export function createPublicFunction( + resourceGroup: ResourceGroup, + namePrefix: string, + subDomainName: string, + corsDomains: Input[] | undefined, currentStack: StackReference, protect: boolean) { const pubFunc = createFunction(resourceGroup, namePrefix, protect, true, corsDomains); const domain = assignCustomDomain( - resourceGroup, pubFunc.webApp, pubFunc.servicePlan, namePrefix, subDomainName, + resourceGroup, pubFunc.webApp, pubFunc.servicePlan, namePrefix, subDomainName, currentStack, protect); return { diff --git a/cloud/infrastructure/src/Azure/createSignalR.ts b/infra/packages/pulumi/src/azure/createSignalR.ts similarity index 94% rename from cloud/infrastructure/src/Azure/createSignalR.ts rename to infra/packages/pulumi/src/azure/createSignalR.ts index 8a9d82be50..d715272a99 100644 --- a/cloud/infrastructure/src/Azure/createSignalR.ts +++ b/infra/packages/pulumi/src/azure/createSignalR.ts @@ -1,6 +1,6 @@ import { Input, interpolate } from '@pulumi/pulumi'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; -import { SignalR, listSignalRKeysOutput } from '@pulumi/azure-native/signalrservice'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { SignalR, listSignalRKeysOutput } from '@pulumi/azure-native/signalrservice/index.js'; export function createSignalR(resourceGroup: ResourceGroup, namePrefix: string, cors: Input[], sku: 'free' | 'standard1', protect: boolean) { const signalr = new SignalR('signalr-' + namePrefix, { diff --git a/cloud/infrastructure/src/Azure/createStorageAccount.ts b/infra/packages/pulumi/src/azure/createStorageAccount.ts similarity index 59% rename from cloud/infrastructure/src/Azure/createStorageAccount.ts rename to infra/packages/pulumi/src/azure/createStorageAccount.ts index 797b810264..69d11f8ded 100644 --- a/cloud/infrastructure/src/Azure/createStorageAccount.ts +++ b/infra/packages/pulumi/src/azure/createStorageAccount.ts @@ -1,10 +1,8 @@ -import { Resource } from '@pulumi/pulumi'; -import { StorageAccount, SkuName, Kind, MinimumTlsVersion } from '@pulumi/azure-native/storage'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; +import { StorageAccount, SkuName, Kind, MinimumTlsVersion } from '@pulumi/azure-native/storage/index.js'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { getConnectionString } from './getConnectionString.js'; -import { getConnectionString } from './getConnectionString'; - -export function createStorageAccount (resourceGroup: ResourceGroup, namePrefix: string, protect: boolean, parent?: Resource) { +export function createStorageAccount(resourceGroup: ResourceGroup, namePrefix: string, protect: boolean) { const storageAccount = new StorageAccount(`sa${namePrefix}`, { resourceGroupName: resourceGroup.name, enableHttpsTrafficOnly: true, @@ -15,7 +13,6 @@ export function createStorageAccount (resourceGroup: ResourceGroup, namePrefix: kind: Kind.StorageV2, }, { protect, - // parent: parent ?? resourceGroup }); const connectionString = getConnectionString(resourceGroup, storageAccount); diff --git a/cloud/infrastructure/src/Azure/getConnectionString.ts b/infra/packages/pulumi/src/azure/getConnectionString.ts similarity index 62% rename from cloud/infrastructure/src/Azure/getConnectionString.ts rename to infra/packages/pulumi/src/azure/getConnectionString.ts index 1130f7c240..7b40733d10 100644 --- a/cloud/infrastructure/src/Azure/getConnectionString.ts +++ b/infra/packages/pulumi/src/azure/getConnectionString.ts @@ -1,11 +1,11 @@ import { Output, interpolate } from '@pulumi/pulumi'; -import { listStorageAccountKeysOutput, StorageAccount } from '@pulumi/azure-native/storage'; -import { ResourceGroup } from '@pulumi/azure-native/resources'; +import { listStorageAccountKeysOutput, StorageAccount } from '@pulumi/azure-native/storage/index.js'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; -export function getConnectionString (resourceGroup: ResourceGroup, account: StorageAccount): Output { +export function getConnectionString(resourceGroup: ResourceGroup, account: StorageAccount): Output { // Retrieve the primary storage account key. const storageAccountKeys = listStorageAccountKeysOutput({ resourceGroupName: resourceGroup.name, accountName: account.name }); - const primaryStorageKey = storageAccountKeys.keys[0].value; + const primaryStorageKey = storageAccountKeys.keys[0]!.value; // Build the connection string to the storage account. return interpolate`DefaultEndpointsProtocol=https;AccountName=${account.name};AccountKey=${primaryStorageKey}`; diff --git a/infra/packages/pulumi/src/azure/index.ts b/infra/packages/pulumi/src/azure/index.ts new file mode 100644 index 0000000000..2e5e039a43 --- /dev/null +++ b/infra/packages/pulumi/src/azure/index.ts @@ -0,0 +1,20 @@ +export * from './assignCustomDomain.js'; +export * from './containerRegistry.js'; +export * from './assignFunctionSettings.js'; +export * from './createAppInsights.js'; +export * from './createStorageAccount.js'; +export * from './assignFunctionCodeAsync.js'; +export * from './createKeyVault.js'; +export * from './createSignalR.js'; +export * from './createContainerApp.js'; +export * from './createContainerImage.js'; +export * from './createFunction.js'; +export * from './createFunctionsStorage.js'; +export * from './createKeyVault.js'; +export * from './createLogWorkspace.js'; +export * from './createManagedEnvironment.js'; +export * from './createPublicFunction.js'; +export * from './getConnectionString.js'; +export * from './signedBlobReadUrl.js'; +export * from './vaultSecret.js'; +export * from './webAppIdentity.js'; diff --git a/cloud/infrastructure/src/Azure/signedBlobReadUrl.ts b/infra/packages/pulumi/src/azure/signedBlobReadUrl.ts similarity index 92% rename from cloud/infrastructure/src/Azure/signedBlobReadUrl.ts rename to infra/packages/pulumi/src/azure/signedBlobReadUrl.ts index 9e76c79f96..92cb029718 100644 --- a/cloud/infrastructure/src/Azure/signedBlobReadUrl.ts +++ b/infra/packages/pulumi/src/azure/signedBlobReadUrl.ts @@ -1,10 +1,10 @@ -import { type ResourceGroup } from '@pulumi/azure-native/resources'; -import { type Blob, type BlobContainer, type StorageAccount, SignedResource, Permissions, HttpProtocol, listStorageAccountServiceSASOutput } from '@pulumi/azure-native/storage'; +import { type ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { type Blob, type BlobContainer, type StorageAccount, SignedResource, Permissions, HttpProtocol, listStorageAccountServiceSASOutput } from '@pulumi/azure-native/storage/index.js'; import { interpolate, Output } from '@pulumi/pulumi'; const accessYearsValid = 3; -export function signedBlobReadUrl ( +export function signedBlobReadUrl( blob: Blob, container: BlobContainer, account: StorageAccount, diff --git a/cloud/infrastructure/src/Azure/vaultSecret.ts b/infra/packages/pulumi/src/azure/vaultSecret.ts similarity index 51% rename from cloud/infrastructure/src/Azure/vaultSecret.ts rename to infra/packages/pulumi/src/azure/vaultSecret.ts index 284e32cadc..49250cf43d 100644 --- a/cloud/infrastructure/src/Azure/vaultSecret.ts +++ b/infra/packages/pulumi/src/azure/vaultSecret.ts @@ -1,8 +1,8 @@ -import { ResourceGroup } from '@pulumi/azure-native/resources'; -import { Vault, Secret } from '@pulumi/azure-native/keyvault'; +import { ResourceGroup } from '@pulumi/azure-native/resources/index.js'; +import { Vault, Secret } from '@pulumi/azure-native/keyvault/index.js'; import { Input, Resource } from '@pulumi/pulumi'; -export default function vaultSecret (resourceGroup: ResourceGroup, vault: Vault, namePrefix: string, name: string, value: Input, waitFor?: Input | Input[]>) { +export function vaultSecret(resourceGroup: ResourceGroup, vault: Vault, namePrefix: string, name: string, value: Input, waitFor?: Input | Input[]>) { const secret = new Secret(`secret-${namePrefix}-${name}`, { resourceGroupName: resourceGroup.name, vaultName: vault.name, diff --git a/cloud/infrastructure/src/Azure/webAppIdentity.ts b/infra/packages/pulumi/src/azure/webAppIdentity.ts similarity index 69% rename from cloud/infrastructure/src/Azure/webAppIdentity.ts rename to infra/packages/pulumi/src/azure/webAppIdentity.ts index 7d557aae82..9e16d97956 100644 --- a/cloud/infrastructure/src/Azure/webAppIdentity.ts +++ b/infra/packages/pulumi/src/azure/webAppIdentity.ts @@ -1,7 +1,7 @@ import { interpolate } from '@pulumi/pulumi'; -import { WebApp } from '@pulumi/azure-native/web'; +import { WebApp } from '@pulumi/azure-native/web/index.js'; -export function webAppIdentity (webApp: WebApp) { +export function webAppIdentity(webApp: WebApp) { return webApp.identity.apply(identity => { return { tenantId: interpolate`${identity?.tenantId}`, diff --git a/cloud/infrastructure/src/Checkly/apiStatusCheck.ts b/infra/packages/pulumi/src/checkly/apiStatusCheck.ts similarity index 80% rename from cloud/infrastructure/src/Checkly/apiStatusCheck.ts rename to infra/packages/pulumi/src/checkly/apiStatusCheck.ts index 158cae87d7..54cd106b56 100644 --- a/cloud/infrastructure/src/Checkly/apiStatusCheck.ts +++ b/infra/packages/pulumi/src/checkly/apiStatusCheck.ts @@ -3,7 +3,7 @@ import { Check } from '@checkly/pulumi'; export type CheckFrequency = 15 | 30 | 60 | 120 | 180 | 360 | 720 | 1440; -export default function apiStatusCheck(prefix: string, name: string, domain: Input, frequency: CheckFrequency, route?: string) { +export function apiStatusCheck(prefix: string, name: string, domain: Input, frequency: CheckFrequency, route?: string) { const stack = getStack(); new Check(`apicheck-${prefix}`, { name: `${name}`, diff --git a/infra/packages/pulumi/src/checkly/index.ts b/infra/packages/pulumi/src/checkly/index.ts new file mode 100644 index 0000000000..dbd0a7afe6 --- /dev/null +++ b/infra/packages/pulumi/src/checkly/index.ts @@ -0,0 +1 @@ +export * from './apiStatusCheck.js'; diff --git a/cloud/infrastructure/src/CloudFlare/dnsRecord.ts b/infra/packages/pulumi/src/cloudflare/dnsRecord.ts similarity index 55% rename from cloud/infrastructure/src/CloudFlare/dnsRecord.ts rename to infra/packages/pulumi/src/cloudflare/dnsRecord.ts index cf20dae596..6d477804fb 100644 --- a/cloud/infrastructure/src/CloudFlare/dnsRecord.ts +++ b/infra/packages/pulumi/src/cloudflare/dnsRecord.ts @@ -1,7 +1,7 @@ -import { Config, Input, Resource } from '@pulumi/pulumi'; +import { Config, Input } from '@pulumi/pulumi'; import { Record } from '@pulumi/cloudflare'; -export default function dnsRecord (name: string, dnsName: Input, value: Input, type: 'CNAME' | 'TXT' | 'MX', protect: boolean, parent?: Resource) { +export function dnsRecord(name: string, dnsName: Input, value: Input, type: 'CNAME' | 'TXT' | 'MX', protect: boolean) { const config = new Config(); const zoneId = config.requireSecret('zoneid'); return new Record(name, { @@ -12,6 +12,5 @@ export default function dnsRecord (name: string, dnsName: Input, value: priority: type === 'MX' ? 10 : undefined, }, { protect, - // parent: parent }); } diff --git a/infra/packages/pulumi/src/cloudflare/index.ts b/infra/packages/pulumi/src/cloudflare/index.ts new file mode 100644 index 0000000000..dcb5d09692 --- /dev/null +++ b/infra/packages/pulumi/src/cloudflare/index.ts @@ -0,0 +1 @@ +export * from './dnsRecord.js'; diff --git a/infra/packages/pulumi/src/dotnet/index.ts b/infra/packages/pulumi/src/dotnet/index.ts new file mode 100644 index 0000000000..76a992766a --- /dev/null +++ b/infra/packages/pulumi/src/dotnet/index.ts @@ -0,0 +1 @@ +export * from './publishProjectAsync.js'; diff --git a/cloud/infrastructure/src/dotnet/publishProjectAsync.ts b/infra/packages/pulumi/src/dotnet/publishProjectAsync.ts similarity index 72% rename from cloud/infrastructure/src/dotnet/publishProjectAsync.ts rename to infra/packages/pulumi/src/dotnet/publishProjectAsync.ts index 809f5af6c4..e435a7e868 100644 --- a/cloud/infrastructure/src/dotnet/publishProjectAsync.ts +++ b/infra/packages/pulumi/src/dotnet/publishProjectAsync.ts @@ -1,6 +1,6 @@ -import { run } from '@pulumi/command/local'; +import { run } from '@pulumi/command/local/index.js'; -export default async function publishProjectAsync (codePath: string, dotnet: 7 = 7) { +export async function publishProjectAsync(codePath: string, dotnet: 7 = 7) { await run({ command: 'dotnet clean', dir: codePath, diff --git a/infra/packages/pulumi/src/vercel/index.ts b/infra/packages/pulumi/src/vercel/index.ts new file mode 100644 index 0000000000..80a560eee2 --- /dev/null +++ b/infra/packages/pulumi/src/vercel/index.ts @@ -0,0 +1,2 @@ +export * from './nextJsApp.js'; +export * from './vercelApp.js'; diff --git a/cloud/infrastructure/src/Vercel/nextJsApp.ts b/infra/packages/pulumi/src/vercel/nextJsApp.ts similarity index 74% rename from cloud/infrastructure/src/Vercel/nextJsApp.ts rename to infra/packages/pulumi/src/vercel/nextJsApp.ts index f3f0805add..2da8fb0e3b 100644 --- a/cloud/infrastructure/src/Vercel/nextJsApp.ts +++ b/infra/packages/pulumi/src/vercel/nextJsApp.ts @@ -1,4 +1,4 @@ -import { vercelApp } from './vercelApp'; +import { vercelApp } from './vercelApp.js'; export function nextJsApp(prefix: string, name: string) { vercelApp(prefix, name, { diff --git a/cloud/infrastructure/src/Vercel/vercelApp.ts b/infra/packages/pulumi/src/vercel/vercelApp.ts similarity index 100% rename from cloud/infrastructure/src/Vercel/vercelApp.ts rename to infra/packages/pulumi/src/vercel/vercelApp.ts diff --git a/infra/packages/pulumi/tsconfig.json b/infra/packages/pulumi/tsconfig.json new file mode 100644 index 0000000000..f9914f1a15 --- /dev/null +++ b/infra/packages/pulumi/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@infra/typescript-config/base.json", + "compilerOptions": { + "outDir": "dist", + }, + "include": [ + "./src/**/*.ts", + "./.eslintrc.cjs" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/infra/packages/typescript-config/base.json b/infra/packages/typescript-config/base.json new file mode 100644 index 0000000000..04e471d0e3 --- /dev/null +++ b/infra/packages/typescript-config/base.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "incremental": true, + "isolatedModules": true, + "lib": [ + "ESNext" + ], + "module": "NodeNext", + "moduleDetection": "force", + "moduleResolution": "NodeNext", + "noUncheckedIndexedAccess": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext" + } +} \ No newline at end of file diff --git a/infra/packages/typescript-config/package.json b/infra/packages/typescript-config/package.json new file mode 100644 index 0000000000..7a07828b0d --- /dev/null +++ b/infra/packages/typescript-config/package.json @@ -0,0 +1,9 @@ +{ + "name": "@infra/typescript-config", + "version": "0.0.0", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + } +} diff --git a/cloud/infrastructure/pnpm-lock.yaml b/infra/pnpm-lock.yaml similarity index 71% rename from cloud/infrastructure/pnpm-lock.yaml rename to infra/pnpm-lock.yaml index b7e1762773..1bad48dc2d 100644 --- a/cloud/infrastructure/pnpm-lock.yaml +++ b/infra/pnpm-lock.yaml @@ -4,63 +4,298 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@checkly/pulumi': - specifier: 1.1.4 - version: 1.1.4 - '@pulumi/aws': - specifier: 6.14.0 - version: 6.14.0 - '@pulumi/azure-native': - specifier: 2.22.0 - version: 2.22.0 - '@pulumi/cloudflare': - specifier: 5.16.0 - version: 5.16.0 - '@pulumi/command': - specifier: 0.9.2 - version: 0.9.2 - '@pulumi/docker': - specifier: 4.5.0 - version: 4.5.0 - '@pulumi/pulumi': - specifier: 3.97.0 - version: 3.97.0 - '@pulumiverse/vercel': - specifier: 1.0.1 - version: 1.0.1 - -devDependencies: - '@types/node': - specifier: 20.10.5 - version: 20.10.5 - '@typescript-eslint/eslint-plugin': - specifier: 6.15.0 - version: 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: 6.15.0 - version: 6.15.0(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: 8.56.0 - version: 8.56.0 - eslint-config-standard: - specifier: 17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.4.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) - eslint-plugin-import: - specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.15.0)(eslint@8.56.0) - eslint-plugin-n: - specifier: 16.4.0 - version: 16.4.0(eslint@8.56.0) - eslint-plugin-node: - specifier: 11.1.0 - version: 11.1.0(eslint@8.56.0) - eslint-plugin-promise: - specifier: 6.1.1 - version: 6.1.1(eslint@8.56.0) - typescript: - specifier: 5.3.3 - version: 5.3.3 +importers: + + .: + devDependencies: + '@infra/eslint-config': + specifier: workspace:* + version: link:packages/eslint-config + '@infra/typescript-config': + specifier: workspace:* + version: link:packages/typescript-config + prettier: + specifier: ^3.1.0 + version: 3.1.0 + turbo: + specifier: latest + version: 1.11.2 + + apps/cloud-primary: + dependencies: + '@checkly/pulumi': + specifier: 1.1.4 + version: 1.1.4 + '@infra/pulumi': + specifier: workspace:* + version: link:../../packages/pulumi + '@pulumi/aws': + specifier: 6.14.0 + version: 6.14.0 + '@pulumi/azure-native': + specifier: 2.22.0 + version: 2.22.0 + '@pulumi/cloudflare': + specifier: 5.16.0 + version: 5.16.0 + '@pulumi/command': + specifier: 0.9.2 + version: 0.9.2 + '@pulumi/docker': + specifier: 4.5.0 + version: 4.5.0 + '@pulumi/pulumi': + specifier: 3.97.0 + version: 3.97.0 + '@pulumiverse/vercel': + specifier: 1.0.1 + version: 1.0.1 + devDependencies: + '@types/node': + specifier: 20.10.5 + version: 20.10.5 + '@typescript-eslint/eslint-plugin': + specifier: 6.15.0 + version: 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: 6.15.0 + version: 6.15.0(eslint@8.56.0)(typescript@5.3.3) + eslint: + specifier: 8.56.0 + version: 8.56.0 + eslint-config-standard: + specifier: 17.1.0 + version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.4.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.15.0)(eslint@8.56.0) + eslint-plugin-n: + specifier: 16.4.0 + version: 16.4.0(eslint@8.56.0) + eslint-plugin-node: + specifier: 11.1.0 + version: 11.1.0(eslint@8.56.0) + eslint-plugin-promise: + specifier: 6.1.1 + version: 6.1.1(eslint@8.56.0) + typescript: + specifier: 5.3.3 + version: 5.3.3 + + apps/remote-browser: + dependencies: + '@checkly/pulumi': + specifier: 1.1.4 + version: 1.1.4 + '@pulumi/aws': + specifier: 6.14.0 + version: 6.14.0 + '@pulumi/azure-native': + specifier: 2.22.0 + version: 2.22.0 + '@pulumi/cloudflare': + specifier: 5.16.0 + version: 5.16.0 + '@pulumi/command': + specifier: 0.9.2 + version: 0.9.2 + '@pulumi/docker': + specifier: 4.5.0 + version: 4.5.0 + '@pulumi/pulumi': + specifier: 3.97.0 + version: 3.97.0 + '@pulumiverse/vercel': + specifier: 1.0.1 + version: 1.0.1 + devDependencies: + '@infra/pulumi': + specifier: workspace:* + version: link:../../packages/pulumi + '@types/node': + specifier: 20.10.5 + version: 20.10.5 + '@typescript-eslint/eslint-plugin': + specifier: 6.14.0 + version: 6.14.0(@typescript-eslint/parser@6.14.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: 6.14.0 + version: 6.14.0(eslint@8.56.0)(typescript@5.3.3) + eslint: + specifier: 8.56.0 + version: 8.56.0 + eslint-config-standard: + specifier: 17.1.0 + version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.4.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.14.0)(eslint@8.56.0) + eslint-plugin-n: + specifier: 16.4.0 + version: 16.4.0(eslint@8.56.0) + eslint-plugin-node: + specifier: 11.1.0 + version: 11.1.0(eslint@8.56.0) + eslint-plugin-promise: + specifier: 6.1.1 + version: 6.1.1(eslint@8.56.0) + typescript: + specifier: 5.3.3 + version: 5.3.3 + + apps/uier: + dependencies: + '@checkly/pulumi': + specifier: 1.1.4 + version: 1.1.4 + '@pulumi/aws': + specifier: 6.14.0 + version: 6.14.0 + '@pulumi/azure-native': + specifier: 2.22.0 + version: 2.22.0 + '@pulumi/cloudflare': + specifier: 5.16.0 + version: 5.16.0 + '@pulumi/command': + specifier: 0.9.2 + version: 0.9.2 + '@pulumi/docker': + specifier: 4.5.0 + version: 4.5.0 + '@pulumi/pulumi': + specifier: 3.97.0 + version: 3.97.0 + '@pulumiverse/vercel': + specifier: 1.0.1 + version: 1.0.1 + devDependencies: + '@infra/pulumi': + specifier: workspace:* + version: link:../../packages/pulumi + '@types/node': + specifier: 20.10.5 + version: 20.10.5 + '@typescript-eslint/eslint-plugin': + specifier: 6.14.0 + version: 6.14.0(@typescript-eslint/parser@6.14.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: 6.14.0 + version: 6.14.0(eslint@8.56.0)(typescript@5.3.3) + eslint: + specifier: 8.56.0 + version: 8.56.0 + eslint-config-standard: + specifier: 17.1.0 + version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.4.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.14.0)(eslint@8.56.0) + eslint-plugin-n: + specifier: 16.4.0 + version: 16.4.0(eslint@8.56.0) + eslint-plugin-node: + specifier: 11.1.0 + version: 11.1.0(eslint@8.56.0) + eslint-plugin-promise: + specifier: 6.1.1 + version: 6.1.1(eslint@8.56.0) + typescript: + specifier: 5.3.3 + version: 5.3.3 + + packages/eslint-config: + devDependencies: + '@typescript-eslint/eslint-plugin': + specifier: ^6.11.0 + version: 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^6.11.0 + version: 6.15.0(eslint@8.56.0)(typescript@5.3.3) + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.56.0) + eslint-config-turbo: + specifier: ^1.10.12 + version: 1.10.12(eslint@8.56.0) + eslint-import-resolver-typescript: + specifier: 3.6.1 + version: 3.6.1(@typescript-eslint/parser@6.15.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-only-warn: + specifier: ^1.1.0 + version: 1.1.0 + typescript: + specifier: ^5.2.2 + version: 5.3.3 + + packages/pulumi: + dependencies: + '@checkly/pulumi': + specifier: 1.1.4 + version: 1.1.4 + '@pulumi/aws': + specifier: 6.14.0 + version: 6.14.0 + '@pulumi/azure-native': + specifier: 2.22.0 + version: 2.22.0 + '@pulumi/cloudflare': + specifier: 5.16.0 + version: 5.16.0 + '@pulumi/command': + specifier: 0.9.2 + version: 0.9.2 + '@pulumi/docker': + specifier: 4.5.0 + version: 4.5.0 + '@pulumi/pulumi': + specifier: 3.97.0 + version: 3.97.0 + '@pulumiverse/vercel': + specifier: 1.0.1 + version: 1.0.1 + devDependencies: + '@infra/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@infra/typescript-config': + specifier: workspace:* + version: link:../typescript-config + '@types/node': + specifier: 20.10.5 + version: 20.10.5 + '@typescript-eslint/eslint-plugin': + specifier: 6.14.0 + version: 6.14.0(@typescript-eslint/parser@6.14.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: 6.14.0 + version: 6.14.0(eslint@8.56.0)(typescript@5.3.3) + eslint: + specifier: 8.56.0 + version: 8.56.0 + eslint-config-standard: + specifier: 17.1.0 + version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.4.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.14.0)(eslint@8.56.0) + eslint-plugin-n: + specifier: 16.4.0 + version: 16.4.0(eslint@8.56.0) + eslint-plugin-node: + specifier: 11.1.0 + version: 11.1.0(eslint@8.56.0) + eslint-plugin-promise: + specifier: 6.1.1 + version: 6.1.1(eslint@8.56.0) + typescript: + specifier: 5.3.3 + version: 5.3.3 + + packages/typescript-config: {} packages: @@ -88,8 +323,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -100,8 +335,8 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 + globals: 13.23.0 + ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -130,7 +365,7 @@ packages: dependencies: lodash.camelcase: 4.3.0 long: 5.2.3 - protobufjs: 7.2.4 + protobufjs: 7.2.5 yargs: 17.7.2 dev: false @@ -185,67 +420,67 @@ packages: engines: {node: '>=14'} deprecated: Please use @opentelemetry/api >= 1.3.0 dependencies: - '@opentelemetry/api': 1.4.1 + '@opentelemetry/api': 1.7.0 dev: false - /@opentelemetry/api@1.4.1: - resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} + /@opentelemetry/api@1.7.0: + resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} engines: {node: '>=8.0.0'} dev: false - /@opentelemetry/context-async-hooks@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-PmwAanPNWCyS9JYFzhzVzHgviLhc0UHjOwdth+hp3HgQQ9XZZNE635P8JhAUHZmbghW9/qQFafRWOS4VN9VVnQ==} + /@opentelemetry/context-async-hooks@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-0i1ECOc9daKK3rjUgDDXf0GDD5XfCou5lXnt2DALIc2qKoruPPcesobNKE54laSVUWnC3jX26RzuOa31g0V32A==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' + '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.4.1 + '@opentelemetry/api': 1.7.0 dev: false - /@opentelemetry/core@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-4DWYNb3dLs2mSCGl65jY3aEgbvPWSHVQV/dmDWiYeWUrMakZQFcymqZOSUNZO0uDrEJoxMu8O5tZktX6UKFwag==} + /@opentelemetry/core@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-w42AukJh3TP8R0IZZOVJVM/kMWu8g+lm4LzT70WtuKqhwq7KVhcDzZZuZinWZa6TtQCl7Smt2wolEYzpHabOgw==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' + '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/semantic-conventions': 1.12.0 + '@opentelemetry/api': 1.7.0 + '@opentelemetry/semantic-conventions': 1.19.0 dev: false - /@opentelemetry/exporter-zipkin@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-HJ4ww7OjVIV4x5ZGgY+h+D1JS0GsCtnHuqZUVHl7EFFQxMGpbQcf5eISRtwqgQwlQKh2iqrEbiHdDyzbgA/7XQ==} + /@opentelemetry/exporter-zipkin@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-TY1fy4JiOBN5a8T9fknqTMcz0DXIeFBr6sklaLCgwtj+G699a5R4CekNwpeM7DHSwC44UMX7gljO2I6dYsTS3A==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/core': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/resources': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-trace-base': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/semantic-conventions': 1.12.0 + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/semantic-conventions': 1.19.0 dev: false - /@opentelemetry/instrumentation-grpc@0.32.0(@opentelemetry/api@1.4.1): + /@opentelemetry/instrumentation-grpc@0.32.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-Az6wdkPx/Mi26lT9LKFV6GhCA9prwQFPz5eCNSExTnSP49YhQ7XCjzPd2POPeLKt84ICitrBMdE1mj0zbPdLAQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@opentelemetry/api': 1.4.1 + '@opentelemetry/api': 1.7.0 '@opentelemetry/api-metrics': 0.32.0 - '@opentelemetry/instrumentation': 0.32.0(@opentelemetry/api@1.4.1) + '@opentelemetry/instrumentation': 0.32.0(@opentelemetry/api@1.7.0) '@opentelemetry/semantic-conventions': 1.6.0 transitivePeerDependencies: - supports-color dev: false - /@opentelemetry/instrumentation@0.32.0(@opentelemetry/api@1.4.1): + /@opentelemetry/instrumentation@0.32.0(@opentelemetry/api@1.7.0): resolution: {integrity: sha512-y6ADjHpkUz/v1nkyyYjsQa/zorhX+0qVGpFvXMcbjU4sHnBnC02c6wcc93sIgZfiQClIWo45TGku1KQxJ5UUbQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@opentelemetry/api': 1.4.1 + '@opentelemetry/api': 1.7.0 '@opentelemetry/api-metrics': 0.32.0 require-in-the-middle: 5.2.0 semver: 7.5.4 @@ -254,66 +489,66 @@ packages: - supports-color dev: false - /@opentelemetry/propagator-b3@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-WFcn98075QPc2zE1obhKydJHUehI5/HuLoelPEVwATj+487hjCwjHj9r2fgmQkWpvuNSB7CJaA0ys6qqq1N6lg==} + /@opentelemetry/propagator-b3@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-v7y5IBOKBm0vP3yf0DHzlw4L2gL6tZ0KeeMTaxfO5IuomMffDbrGWcvYFp0Dt4LdZctTSK523rVLBB9FBHBciQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' + '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/core': 1.12.0(@opentelemetry/api@1.4.1) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/propagator-jaeger@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-ugtWF7GC6X5RIJ0+iMwW2iVAGNs206CAeq8XQ8OkJRg+v0lp4H0/i+gJ4hubTT8NIL5a3IxtIrAENPLIGdLucQ==} + /@opentelemetry/propagator-jaeger@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-dedkOoTzKg+nYoLWCMp0Im+wo+XkTRW6aXhi8VQRtMW/9SNJGOllCJSu8llToLxMDF0+6zu7OCrKkevAof2tew==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' + '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/core': 1.12.0(@opentelemetry/api@1.4.1) + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) dev: false - /@opentelemetry/resources@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-gunMKXG0hJrR0LXrqh7BVbziA/+iJBL3ZbXCXO64uY+SrExkwoyJkpiq9l5ismkGF/A20mDEV7tGwh+KyPw00Q==} + /@opentelemetry/resources@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-RgxvKuuMOf7nctOeOvpDjt2BpZvZGr9Y0vf7eGtY5XYZPkh2p7e2qub1S2IArdBMf9kEbz0SfycqCviOu9isqg==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' + '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/core': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/semantic-conventions': 1.12.0 + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/semantic-conventions': 1.19.0 dev: false - /@opentelemetry/sdk-trace-base@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-pfCOB3tNDlYVoWuz4D7Ji+Jmy9MHnATWHVpkERdCEiwUGEZ+4IvNPXUcPc37wJVmMpjGLeaWgPPrie0KIpWf1A==} + /@opentelemetry/sdk-trace-base@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-+IRvUm+huJn2KqfFW3yW/cjvRwJ8Q7FzYHoUNx5Fr0Lws0LxjMJG1uVB8HDpLwm7mg5XXH2M5MF+0jj5cM8BpQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' + '@opentelemetry/api': '>=1.0.0 <1.8.0' dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/core': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/resources': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/semantic-conventions': 1.12.0 + '@opentelemetry/api': 1.7.0 + '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/semantic-conventions': 1.19.0 dev: false - /@opentelemetry/sdk-trace-node@1.12.0(@opentelemetry/api@1.4.1): - resolution: {integrity: sha512-PxpDemnNZLLeFNLAu95/K3QubjlaScXVjVQPlwPui65VRxIvxGVysnN7DFfsref+qoh1hI6nlrYSij43vxdm2w==} + /@opentelemetry/sdk-trace-node@1.19.0(@opentelemetry/api@1.7.0): + resolution: {integrity: sha512-TCiEq/cUjM15RFqBRwWomTVbOqzndWL4ILa7ZCu0zbjU1/XY6AgHkgrgAc7vGP6TjRqH4Xryuglol8tcIfbBUQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.5.0' - dependencies: - '@opentelemetry/api': 1.4.1 - '@opentelemetry/context-async-hooks': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/core': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/propagator-b3': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/propagator-jaeger': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-trace-base': 1.12.0(@opentelemetry/api@1.4.1) + '@opentelemetry/api': '>=1.0.0 <1.8.0' + dependencies: + '@opentelemetry/api': 1.7.0 + '@opentelemetry/context-async-hooks': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/propagator-b3': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/propagator-jaeger': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) semver: 7.5.4 dev: false - /@opentelemetry/semantic-conventions@1.12.0: - resolution: {integrity: sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA==} + /@opentelemetry/semantic-conventions@1.19.0: + resolution: {integrity: sha512-14jRpC8f5c0gPSwoZ7SbEJni1PqI+AhAE8m1bMz6v+RPM4OlP1PT2UHBJj5Qh/ALLPjhVU/aZUK3YyjTUqqQVg==} engines: {node: '>=14'} dev: false @@ -417,14 +652,14 @@ packages: dependencies: '@grpc/grpc-js': 1.9.6 '@logdna/tail-file': 2.2.0 - '@opentelemetry/api': 1.4.1 - '@opentelemetry/exporter-zipkin': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/instrumentation': 0.32.0(@opentelemetry/api@1.4.1) - '@opentelemetry/instrumentation-grpc': 0.32.0(@opentelemetry/api@1.4.1) - '@opentelemetry/resources': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-trace-base': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/sdk-trace-node': 1.12.0(@opentelemetry/api@1.4.1) - '@opentelemetry/semantic-conventions': 1.12.0 + '@opentelemetry/api': 1.7.0 + '@opentelemetry/exporter-zipkin': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/instrumentation': 0.32.0(@opentelemetry/api@1.7.0) + '@opentelemetry/instrumentation-grpc': 0.32.0(@opentelemetry/api@1.7.0) + '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/sdk-trace-node': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/semantic-conventions': 1.19.0 '@pulumi/query': 0.3.0 '@types/google-protobuf': 3.15.12 execa: 5.1.1 @@ -478,6 +713,35 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true + /@typescript-eslint/eslint-plugin@6.14.0(@typescript-eslint/parser@6.14.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.14.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.14.0 + '@typescript-eslint/type-utils': 6.14.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.14.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.14.0 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/eslint-plugin@6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -489,7 +753,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.15.0(eslint@8.56.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 6.15.0 '@typescript-eslint/type-utils': 6.15.0(eslint@8.56.0)(typescript@5.3.3) @@ -498,10 +762,31 @@ packages: debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.3.3) + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.14.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.14.0 + '@typescript-eslint/types': 6.14.0 + '@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.14.0 + debug: 4.3.4 + eslint: 8.56.0 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -528,6 +813,14 @@ packages: - supports-color dev: true + /@typescript-eslint/scope-manager@6.14.0: + resolution: {integrity: sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.14.0 + '@typescript-eslint/visitor-keys': 6.14.0 + dev: true + /@typescript-eslint/scope-manager@6.15.0: resolution: {integrity: sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -536,6 +829,26 @@ packages: '@typescript-eslint/visitor-keys': 6.15.0 dev: true + /@typescript-eslint/type-utils@6.14.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.14.0(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/type-utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -550,17 +863,43 @@ packages: '@typescript-eslint/utils': 6.15.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 - ts-api-utils: 1.0.1(typescript@5.3.3) + ts-api-utils: 1.0.2(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/types@6.14.0: + resolution: {integrity: sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/types@6.15.0: resolution: {integrity: sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/typescript-estree@6.14.0(typescript@5.3.3): + resolution: {integrity: sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.14.0 + '@typescript-eslint/visitor-keys': 6.14.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@6.15.0(typescript@5.3.3): resolution: {integrity: sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==} engines: {node: ^16.0.0 || >=18.0.0} @@ -576,12 +915,31 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.3.3) + ts-api-utils: 1.0.2(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/utils@6.14.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.14.0 + '@typescript-eslint/types': 6.14.0 + '@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -601,6 +959,14 @@ packages: - typescript dev: true + /@typescript-eslint/visitor-keys@6.14.0: + resolution: {integrity: sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.14.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@typescript-eslint/visitor-keys@6.15.0: resolution: {integrity: sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==} engines: {node: ^16.0.0 || >=18.0.0} @@ -613,16 +979,16 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /acorn-jsx@5.3.2(acorn@8.9.0): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.9.0 + acorn: 8.10.0 dev: true - /acorn@8.9.0: - resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -667,7 +1033,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 get-intrinsic: 1.2.2 is-string: 1.0.7 @@ -683,9 +1049,9 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 - es-shim-unscopables: 1.0.0 + es-shim-unscopables: 1.0.2 get-intrinsic: 1.2.2 dev: true @@ -694,9 +1060,9 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 - es-shim-unscopables: 1.0.0 + es-shim-unscopables: 1.0.2 dev: true /array.prototype.flatmap@1.3.2: @@ -704,17 +1070,17 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 - es-shim-unscopables: 1.0.0 + es-shim-unscopables: 1.0.2 dev: true - /array.prototype.reduce@1.0.5: - resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} + /array.prototype.reduce@1.0.6: + resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 @@ -726,7 +1092,7 @@ packages: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 @@ -838,7 +1204,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.3 + ms: 2.1.2 dev: true /debug@4.3.4: @@ -867,13 +1233,14 @@ packages: dependencies: get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - has-property-descriptors: 1.0.0 + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 /dezalgo@1.0.4: @@ -909,10 +1276,23 @@ packages: esutils: 2.0.3 dev: true + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /es-abstract@1.22.3: resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} engines: {node: '>= 0.4'} @@ -921,18 +1301,18 @@ packages: arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 call-bind: 1.0.5 - es-set-tostringtag: 2.0.1 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - internal-slot: 1.0.5 + internal-slot: 1.0.6 is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 @@ -961,18 +1341,18 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: false - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.2 - has: 1.0.3 has-tostringtag: 1.0.0 + hasown: 2.0.0 - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -1002,6 +1382,15 @@ packages: eslint: 8.56.0 dev: true + /eslint-config-prettier@9.0.0(eslint@8.56.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.4.0)(eslint-plugin-promise@6.1.1)(eslint@8.56.0): resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} engines: {node: '>=12.0.0'} @@ -1017,6 +1406,15 @@ packages: eslint-plugin-promise: 6.1.1(eslint@8.56.0) dev: true + /eslint-config-turbo@1.10.12(eslint@8.56.0): + resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} + peerDependencies: + eslint: '>6.6.0' + dependencies: + eslint: 8.56.0 + eslint-plugin-turbo: 1.10.12(eslint@8.56.0) + dev: true + /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: @@ -1027,6 +1425,88 @@ packages: - supports-color dev: true + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.15.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.56.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + fast-glob: 3.3.1 + get-tsconfig: 4.7.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.14.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.14.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.15.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.15.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + transitivePeerDependencies: + - supports-color + dev: true + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -1056,6 +1536,35 @@ packages: - supports-color dev: true + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.15.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.15.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-es-x@7.5.0(eslint@8.56.0): resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1063,7 +1572,7 @@ packages: eslint: '>=8' dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.10.0 eslint: 8.56.0 eslint-compat-utils: 0.1.2(eslint@8.56.0) dev: true @@ -1079,6 +1588,76 @@ packages: regexpp: 3.2.0 dev: true + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.14.0)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.14.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.14.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.15.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.15.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.15.0)(eslint@8.56.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} @@ -1124,8 +1703,8 @@ packages: builtins: 5.0.1 eslint: 8.56.0 eslint-plugin-es-x: 7.5.0(eslint@8.56.0) - get-tsconfig: 4.7.0 - ignore: 5.2.4 + get-tsconfig: 4.7.2 + ignore: 5.3.0 is-builtin-module: 3.2.1 is-core-module: 2.13.1 minimatch: 3.1.2 @@ -1142,12 +1721,17 @@ packages: eslint: 8.56.0 eslint-plugin-es: 3.0.1(eslint@8.56.0) eslint-utils: 2.1.0 - ignore: 5.2.4 + ignore: 5.3.0 minimatch: 3.1.2 - resolve: 1.22.2 + resolve: 1.22.8 semver: 6.3.1 dev: true + /eslint-plugin-only-warn@1.1.0: + resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} + engines: {node: '>=6'} + dev: true + /eslint-plugin-promise@6.1.1(eslint@8.56.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1157,6 +1741,15 @@ packages: eslint: 8.56.0 dev: true + /eslint-plugin-turbo@1.10.12(eslint@8.56.0): + resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} + peerDependencies: + eslint: '>6.6.0' + dependencies: + dotenv: 16.0.3 + eslint: 8.56.0 + dev: true + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1188,7 +1781,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.56.0 '@humanwhocodes/config-array': 0.11.13 @@ -1210,9 +1803,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.23.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -1233,8 +1826,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 dev: true @@ -1287,8 +1880,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1370,7 +1963,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 @@ -1402,8 +1995,8 @@ packages: call-bind: 1.0.5 get-intrinsic: 1.2.2 - /get-tsconfig@4.7.0: - resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -1432,8 +2025,8 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -1443,7 +2036,7 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -1451,8 +2044,8 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 + fast-glob: 3.3.1 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -1468,7 +2061,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: false /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -1482,8 +2074,8 @@ packages: engines: {node: '>=8'} dev: true - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: get-intrinsic: 1.2.2 @@ -1501,12 +2093,6 @@ packages: dependencies: has-symbols: 1.0.3 - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.2 - /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} @@ -1529,8 +2115,8 @@ packages: engines: {node: '>=10.17.0'} dev: false - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} dev: true @@ -1561,12 +2147,12 @@ packages: engines: {node: '>=10'} dev: false - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.2 - has: 1.0.3 + hasown: 2.0.0 side-channel: 1.0.4 /is-array-buffer@3.0.2: @@ -1821,10 +2407,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -1871,7 +2453,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -1880,17 +2462,17 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 dev: true - /object.getownpropertydescriptors@2.1.6: - resolution: {integrity: sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==} + /object.getownpropertydescriptors@2.1.7: + resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} engines: {node: '>= 0.8'} dependencies: - array.prototype.reduce: 1.0.5 + array.prototype.reduce: 1.0.6 call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 safe-array-concat: 1.0.1 dev: false @@ -1899,7 +2481,7 @@ packages: resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 get-intrinsic: 1.2.2 dev: true @@ -1909,7 +2491,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 dev: true @@ -2015,8 +2597,14 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /protobufjs@7.2.4: - resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -2076,7 +2664,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 set-function-name: 2.0.1 /regexpp@3.2.0: @@ -2114,15 +2702,6 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -2189,7 +2768,7 @@ packages: define-data-property: 1.1.1 get-intrinsic: 1.2.2 gopd: 1.0.1 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} @@ -2197,7 +2776,7 @@ packages: dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -2245,7 +2824,7 @@ packages: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: false /spdx-exceptions@2.3.0: @@ -2256,11 +2835,11 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: false - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: false /sprintf-js@1.0.3: @@ -2281,21 +2860,21 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.5 - define-properties: 1.2.0 + define-properties: 1.2.1 es-abstract: 1.22.3 /strip-ansi@6.0.1: @@ -2330,6 +2909,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -2341,8 +2925,8 @@ packages: is-number: 7.0.0 dev: true - /ts-api-utils@1.0.1(typescript@5.3.3): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + /ts-api-utils@1.0.2(typescript@5.3.3): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' @@ -2374,6 +2958,66 @@ packages: strip-bom: 3.0.0 dev: true + /turbo-darwin-64@1.11.2: + resolution: {integrity: sha512-toFmRG/adriZY3hOps7nYCfqHAS+Ci6xqgX3fbo82kkLpC6OBzcXnleSwuPqjHVAaRNhVoB83L5njcE9Qwi2og==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-darwin-arm64@1.11.2: + resolution: {integrity: sha512-FCsEDZ8BUSFYEOSC3rrARQrj7x2VOrmVcfrMUIhexTxproRh4QyMxLfr6LALk4ymx6jbDCxWa6Szal8ckldFbA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-64@1.11.2: + resolution: {integrity: sha512-Vzda/o/QyEske5CxLf0wcu7UUS+7zB90GgHZV4tyN+WZtoouTvbwuvZ3V6b5Wgd3OJ/JwWR0CXDK7Sf4VEMr7A==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-linux-arm64@1.11.2: + resolution: {integrity: sha512-bRLwovQRz0yxDZrM4tQEAYV0fBHEaTzUF0JZ8RG1UmZt/CqtpnUrJpYb1VK8hj1z46z9YehARpYCwQ2K0qU4yw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-64@1.11.2: + resolution: {integrity: sha512-LgTWqkHAKgyVuLYcEPxZVGPInTjjeCnN5KQMdJ4uQZ+xMDROvMFS2rM93iQl4ieDJgidwHCxxCxaU9u8c3d/Kg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-arm64@1.11.2: + resolution: {integrity: sha512-829aVBU7IX0c/B4G7g1VI8KniAGutHhIupkYMgF6xPkYVev2G3MYe6DMS/vsLt9GGM9ulDtdWxWrH5P2ngK8IQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo@1.11.2: + resolution: {integrity: sha512-jPC7LVQJzebs5gWf8FmEvsvXGNyKbN+O9qpvv98xpNaM59aS0/Irhd0H0KbcqnXfsz7ETlzOC3R+xFWthC4Z8A==} + hasBin: true + optionalDependencies: + turbo-darwin-64: 1.11.2 + turbo-darwin-arm64: 1.11.2 + turbo-linux-64: 1.11.2 + turbo-linux-arm64: 1.11.2 + turbo-windows-64: 1.11.2 + turbo-windows-arm64: 1.11.2 + dev: true + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2457,7 +3101,7 @@ packages: /util-promisify@2.1.0: resolution: {integrity: sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==} dependencies: - object.getownpropertydescriptors: 2.1.6 + object.getownpropertydescriptors: 2.1.7 dev: false /validate-npm-package-license@3.0.4: diff --git a/infra/pnpm-workspace.yaml b/infra/pnpm-workspace.yaml new file mode 100644 index 0000000000..3ff5faaaf5 --- /dev/null +++ b/infra/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - "apps/*" + - "packages/*" diff --git a/infra/tsconfig.json b/infra/tsconfig.json new file mode 100644 index 0000000000..5d19674cd3 --- /dev/null +++ b/infra/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@infra/typescript-config/base.json" +} diff --git a/infra/turbo.json b/infra/turbo.json new file mode 100644 index 0000000000..2961406b66 --- /dev/null +++ b/infra/turbo.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://turbo.build/schema.json", + "globalDependencies": [ + "**/.env.*local" + ], + "pipeline": { + "build": { + "dependsOn": [ + "^build" + ] + }, + "lint": { + "dependsOn": [ + "^lint" + ] + }, + "preview": { + "dependsOn": [ + "build" + ] + }, + "deploy": { + "dependsOn": [ + "build" + ] + } + } +} diff --git a/web/.idea/modules.xml b/web/.idea/modules.xml new file mode 100644 index 0000000000..f589ca37d2 --- /dev/null +++ b/web/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/web/.idea/web.iml b/web/.idea/web.iml new file mode 100644 index 0000000000..24643cc374 --- /dev/null +++ b/web/.idea/web.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/web/apps/development/package.json b/web/apps/development/package.json deleted file mode 100644 index 0d4b81b472..0000000000 --- a/web/apps/development/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "development", - "private": true, - "homepage": "https://www.signalco.dev/", - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite --open" - }, - "dependencies": { - "@signalco/ui": "workspace:*", - "@signalco/ui-primitives": "workspace:*", - "@signalco/tailwindcss-config-signalco": "workspace:*", - "react": "18.2.0", - "react-dom": "18.2.0", - "tailwindcss": "3.3.7", - "tailwindcss-animate": "1.0.7" - }, - "devDependencies": { - "@types/react": "18.2.45", - "@types/react-dom": "18.2.18", - "@vitejs/plugin-react-swc": "3.5.0", - "typescript": "5.3.3", - "vite": "5.0.10" - } -} \ No newline at end of file