diff --git a/.github/workflows/pr-deploy.yml b/.github/workflows/pr-deploy.yml new file mode 100644 index 000000000..a5bd6b48d --- /dev/null +++ b/.github/workflows/pr-deploy.yml @@ -0,0 +1,37 @@ +name: 'Deploy PR build' +on: + pull_request: + branches: + - main + +permissions: write-all +jobs: + aquire-token: + if: contains(github.event.pull_request.labels.*.name, 'QA Required') + runs-on: ubuntu-latest + steps: + - name: 'Login to Azure' + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + allow-no-subscriptions: true + + - name: 'Obtain token for upload' + shell: bash + run: echo "FUSION_TOKEN=$(az account get-access-token --resource '${{ secrets.AZURE_RESOURCE_ID }}' | jq '.accessToken')" >> $GITHUB_ENV + + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Required to fetch range + + - name: Install Dependencies + run: npm i -g pnpm typescript && pnpm i + + - name: Build monorepo + run: pnpm ci:build + + - name: 'Deploy affected apps to Fusion' + shell: bash + run: npx turbo run pr:deploy --since origin/main -- --token ${{ env.FUSION_TOKEN }} --pr ${{ github.event.number }} diff --git a/apps/handover/package.json b/apps/handover/package.json index 9551ad827..042625953 100644 --- a/apps/handover/package.json +++ b/apps/handover/package.json @@ -7,7 +7,8 @@ "scripts": { "dev": "fusion-framework-cli app dev", "build": "tsc -b -f", - "shipit": "npx ts-node --esm ../../cli/src/main.ts release" + "shipit": "npx ts-node --esm ../../cli/src/main.ts release", + "pr:deploy": "npx ts-node --esm ../../github-action/src/releasePr.ts release" }, "dependencies": { "@cc-components/handoverapp": "workspace:^", diff --git a/apps/workorder/package.json b/apps/workorder/package.json index 6a3b331fb..2334bc5e0 100644 --- a/apps/workorder/package.json +++ b/apps/workorder/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "fusion-framework-cli app dev", "build": "tsc -b -f", - "shipit": "npx ts-node --esm ../../cli/src/main.ts release" + "shipit": "npx ts-node --esm ../../cli/src/main.ts release", + "pr:deploy": "npx ts-node --esm ../../github-action/src/releasePr.ts release" }, "dependencies": { "@cc-components/shared": "workspace:^", diff --git a/apps/workorder/src/main.tsx b/apps/workorder/src/main.tsx index 3c56e1dd5..6a3bf8d7c 100644 --- a/apps/workorder/src/main.tsx +++ b/apps/workorder/src/main.tsx @@ -12,4 +12,5 @@ const WorkorderApp = () => { }; export const render = createRender(WorkorderApp, configure, 'Workorder'); + export default render; diff --git a/cli/package.json b/cli/package.json index 6f2034020..982c133e4 100644 --- a/cli/package.json +++ b/cli/package.json @@ -11,6 +11,7 @@ "build": "tsc -b -f" }, "dependencies": { + "@actions/http-client": "^2.1.1", "adm-zip": "^0.5.10", "commander": "^10.0.1", "open": "^9.1.0", diff --git a/cli/src/commands/releasePr.ts b/cli/src/commands/releasePr.ts new file mode 100644 index 000000000..74760f9e7 --- /dev/null +++ b/cli/src/commands/releasePr.ts @@ -0,0 +1,58 @@ +import { zipBundle } from './zip-bundle.js'; +import { makeManifest } from './make-app-manifest.js'; +import { FusionEnvironment, deployApp } from '../utils/deployApp.js'; +import { logBundleSize } from '../utils/logBundleSize.js'; +import { bundleApp } from '../utils/bundleApp.js'; +import { compileApp } from '../utils/compile.js'; +import ora from 'ora'; +import { downloadCIBundle } from './download_zip_bundle.js'; +import { parsePackageJson } from '../utils/parsePackageJson.js'; +import { chdir, cwd } from 'process'; +import { execSync } from 'child_process'; + +export async function releasePr() { + compileApp(); + + await ensureProjectBuilds(); + + //Vite build + await prepareBundle('ci'); + + // Create manifest + makeManifest('./package.json'); + + //Log bundle size + logBundleSize(); + + //zip bundle + zipBundle(); + + //upload to fdev + await deployApp('ci'); +} + +async function prepareBundle(env: FusionEnvironment) { + const { name } = parsePackageJson(); + if (!name) { + throw new Error('Missing name in package.json'); + } + switch (env) { + case 'ci': + case 'fqa': + return bundleApp(); + + case 'fprd': + console.log('Download ci bundle'); + return downloadCIBundle(name); + } +} + +async function ensureProjectBuilds() { + const spinner = ora('Building project').start(); + const appDir = cwd(); + const rootDir = '../../'; + chdir(rootDir); + execSync(`pnpm ci:build`); + chdir(appDir); + spinner.stop(); +} diff --git a/github-action/package.json b/github-action/package.json new file mode 100644 index 000000000..7035f6801 --- /dev/null +++ b/github-action/package.json @@ -0,0 +1,19 @@ +{ + "name": "github-action", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@actions/core": "^1.10.0", + "@actions/github": "^5.1.1", + "adm-zip": "^0.5.10", + "commander": "11.0.0" + } +} diff --git a/github-action/src/parsePackageJson.ts b/github-action/src/parsePackageJson.ts new file mode 100644 index 000000000..daaa73604 --- /dev/null +++ b/github-action/src/parsePackageJson.ts @@ -0,0 +1,12 @@ +import fs from 'fs'; + +export type PackageJson = { + name?: string; + version?: string; + type?: 'module' | 'commonjs'; +} & Record; + +export function parsePackageJson(path: string = './package.json'): PackageJson { + const blob = fs.readFileSync(path); + return JSON.parse(blob.toString('utf-8')); +} diff --git a/github-action/src/releasePr.ts b/github-action/src/releasePr.ts new file mode 100644 index 000000000..88ff2f4f0 --- /dev/null +++ b/github-action/src/releasePr.ts @@ -0,0 +1,185 @@ +#!/usr/bin/env node + +import { Command } from 'commander'; +import fs from 'fs'; +import { execSync } from 'child_process'; +import { parsePackageJson } from './parsePackageJson.js'; +import { resolve } from 'path'; +import AdmZip from 'adm-zip'; +import { HttpClient } from '@actions/http-client'; +import { OutgoingHttpHeaders } from 'http'; +import { Readable } from 'stream'; +import { notice, setSecret } from '@actions/core'; + +const program = new Command(); + +program.name('Release'); + +program + .command('release') + .option('-T, --token ', 'change the working directory') + .option('-pr --pr ', 'Pr number') + .action(async (args) => { + if (!args.token) { + throw new Error('Missing az token'); + } + setSecret(args.token); + release(args.token, args.pr); + }); + +await program.parseAsync(); + +export async function release(token: string, prNumber: string) { + // Vite build + notice('bundling application'); + prepareBundle(); + + // Create manifest + notice('making manifest'); + makeManifest('./package.json'); + + // zip bundle + notice('zipping bundle'); + const zipped = zipBundle(); + + const r = parsePackageJson(); + if (!r.name) { + throw new Error( + `No name in package json, cannot deploy unknown app at path ${process.cwd()}` + ); + } + + await uploadBundle(token, r.name, zipped, prNumber); +} + +async function uploadBundle( + token: string, + appKey: string, + zipped: AdmZip, + prNumber: string +) { + const client = new HttpClient(); + + const headers: OutgoingHttpHeaders = { + ['Authorization']: `Bearer ${token}`, + ['Content-Type']: 'application/zip', + ['Content-Disposition']: 'attachment; filename=bundle.zip', + }; + + const stream = Readable.from(zipped.toBuffer()); + + const r = await client.sendStream( + 'POST', + `https://fusion-s-portal-ci.azurewebsites.net/api/apps/${appKey}/versions`, + stream, + headers + ); + + notice(`bundle uploaded with status code ${r.message.statusCode}`); + if (r.message.statusCode !== 200) { + throw new Error('Bundle failed to upload, fatal error'); + } + + /** Publish bundle */ + const publishResponse = await client.post( + `https://fusion-s-portal-ci.azurewebsites.net/api/apps/${appKey}/publish`, + '', + headers + ); + if (publishResponse.message.statusCode !== 200) { + throw new Error(JSON.stringify(publishResponse.message)); + } + + await patchWithPrNumber(prNumber, token, appKey); +} + +function prepareBundle() { + const { name } = parsePackageJson(); + if (!name) { + throw new Error('Missing name in package.json'); + } + execSync('npx vite build --logLevel silent', { stdio: 'inherit' }); +} + +export function makeManifest(path: string) { + const { version, name, ...maybe } = parsePackageJson(path); + if (!version || !name) { + throw new Error('Name or version missing in package.json'); + } + const { major, minor, patch } = splitVersions(version); + + /** Some app-manifests have custom short and displaynames */ + const shortName = maybe?.['shortName'] ?? name; + const displayName = maybe?.['displayName'] ?? name[0].toUpperCase() + name.slice(1); + + const manifest = { + name: displayName, + shortName: shortName, + key: name, + version: { + major: major, + minor: minor, + patch: patch, + }, + }; + + const data = JSON.stringify(manifest, null, 2); + + fs.writeFileSync('./dist/app-manifest.json', data); +} + +function splitVersions(version: string) { + const [major, minor, patch] = version.split('.'); + return { + major, + minor, + patch, + }; +} + +export function zipBundle() { + const appManifestPath = resolve('./dist/app-manifest.json'); + const bundlePath = resolve('./dist/app-bundle.js'); + + var zip = new AdmZip(); + + //TODO: scan files in package.json + zip.addLocalFile(appManifestPath); + zip.addLocalFile(bundlePath); + + zip.writeZip('./dist/bundle.zip'); + return zip; +} + +async function patchWithPrNumber(prNumber: string, token: string, appKey: string) { + const client = new HttpClient(); + + const headers: OutgoingHttpHeaders = { + ['Authorization']: `Bearer ${token}`, + ['Content-Type']: 'application/json', + }; + + //Download current config + const res = await client.get( + `https://fusion-s-portal-ci.azurewebsites.net/api/apps/${appKey}/config`, + headers + ); + if (res.message.statusCode !== 200) { + throw new Error('Failed to fetch client config'); + } + const config = JSON.parse(await res.readBody()); + config.environment = { ...config.environment, pr: prNumber }; + //append pr + + //patch + const patchResponse = await client.put( + `https://fusion-s-portal-ci.azurewebsites.net/api/apps/${appKey}/config`, + JSON.stringify(config), + headers + ); + if (patchResponse.message.statusCode !== 200) { + throw new Error( + `Failed to patch client config with pr number, ${await patchResponse.readBody()}` + ); + } +} diff --git a/github-action/tsconfig.json b/github-action/tsconfig.json new file mode 100644 index 000000000..6a04efda8 --- /dev/null +++ b/github-action/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "rootDir": ".", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ESNext", + "module": "ESNext", + "lib": ["ES2022", "dom"], + "skipLibCheck": true, + "resolveJsonModule": true, + "skipDefaultLibCheck": true, + "allowSyntheticDefaultImports": true, + "outDir": "script" + }, + "exclude": ["node_modules"] +} diff --git a/libs/handoverapp/src/lib/config/frameworkConfig.ts b/libs/handoverapp/src/lib/config/frameworkConfig.ts index 6e11979c3..3907bd9d4 100644 --- a/libs/handoverapp/src/lib/config/frameworkConfig.ts +++ b/libs/handoverapp/src/lib/config/frameworkConfig.ts @@ -23,6 +23,11 @@ export const configure = async (config: IAppConfigurator, c: ComponentRenderArgs const envConfig: HandoverEnvConfig = c.env.config?.environment as HandoverEnvConfig; + if (envConfig.pr) { + console.log(`Lets fucking go pr#${envConfig.pr}`); + console.log(`https://github.com/equinor/cc-components/pull/${envConfig.pr}`); + } + if (!envConfig.uri) { throw new Error('Failed to load environemnt config for workorder'); } @@ -37,4 +42,5 @@ export const configure = async (config: IAppConfigurator, c: ComponentRenderArgs type HandoverEnvConfig = { uri: string; defaultScopes: string[]; + pr?: string; }; diff --git a/libs/handoverapp/src/lib/config/gardenConfig.ts b/libs/handoverapp/src/lib/config/gardenConfig.ts index 64eaf7d1f..845d6c32a 100644 --- a/libs/handoverapp/src/lib/config/gardenConfig.ts +++ b/libs/handoverapp/src/lib/config/gardenConfig.ts @@ -34,7 +34,7 @@ export const useGardenConfig = ( customHeaderView: GardenHeader, }, visuals: { - rowHeight: 30, + rowHeight: 31, }, }; }; diff --git a/libs/handoversidesheet/package.json b/libs/handoversidesheet/package.json index 9c0446f7a..567166b78 100644 --- a/libs/handoversidesheet/package.json +++ b/libs/handoversidesheet/package.json @@ -12,5 +12,8 @@ "@cc-components/handovershared": "workspace:^", "@cc-components/shared": "workspace:^", "@cc-components/sharedcomponents": "workspace:^" + }, + "devDependencies": { + "@types/styled-components": "5.1.26" } } diff --git a/libs/handoversidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts b/libs/handoversidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts index b629f0706..cd02a865e 100644 --- a/libs/handoversidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts +++ b/libs/handoversidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts @@ -1,13 +1,13 @@ -import { Tabs } from '@equinor/eds-core-react'; +import { TabListProps, Tabs } from '@equinor/eds-core-react'; import { tokens } from '@equinor/eds-tokens'; import styled from 'styled-components'; -export const StyledTabListWrapper = styled.div` +export const StyledTabListWrapper: any = styled.div` overflow: hidden; width: 100%; background-color: ${tokens.colors.ui.background__light.hex}; `; -export const StyledTabsList = styled(Tabs.List)` +export const StyledTabsList: any = styled(Tabs.List)` overflow: auto; ::-webkit-scrollbar { width: 0; diff --git a/libs/loopsidesheet/package.json b/libs/loopsidesheet/package.json index 716c3ab6c..e2e459c2c 100644 --- a/libs/loopsidesheet/package.json +++ b/libs/loopsidesheet/package.json @@ -12,5 +12,8 @@ "@cc-components/loopshared": "workspace:^", "@cc-components/shared": "workspace:^", "@cc-components/sharedcomponents": "workspace:^" + }, + "devDependencies": { + "@types/styled-components": "5.1.26" } } diff --git a/libs/loopsidesheet/src/lib/ui-sidesheet/LoopSidesheet.tsx b/libs/loopsidesheet/src/lib/ui-sidesheet/LoopSidesheet.tsx index 69aa3c4b7..70b5705dc 100644 --- a/libs/loopsidesheet/src/lib/ui-sidesheet/LoopSidesheet.tsx +++ b/libs/loopsidesheet/src/lib/ui-sidesheet/LoopSidesheet.tsx @@ -3,7 +3,7 @@ import { createWidget } from '@equinor/workspace-sidesheet'; import { useState } from 'react'; import { DetailsTab } from './DetailsTab'; -import { Tabs } from '@equinor/eds-core-react'; +import { TabListProps, Tabs } from '@equinor/eds-core-react'; import styled from 'styled-components'; import { tokens } from '@equinor/eds-tokens'; import { useGetWorkorders } from '../utils-sidesheet'; @@ -25,12 +25,12 @@ import { useQuery } from '@tanstack/react-query'; import { LinkCell, useContextId, useHttpClient } from '@cc-components/shared'; import { SidesheetSkeleton } from '@cc-components/sharedcomponents'; -export const StyledTabListWrapper = styled.div` +export const StyledTabListWrapper: (props: any) => JSX.Element = styled.div` overflow: hidden; width: 100%; background-color: ${tokens.colors.ui.background__light.hex}; `; -export const StyledTabsList = styled(Tabs.List)` +export const StyledTabsList: (props: TabListProps) => JSX.Element = styled(Tabs.List)` overflow: auto; ::-webkit-scrollbar { width: 0; diff --git a/libs/mechanicalcompletionsidesheet/package.json b/libs/mechanicalcompletionsidesheet/package.json index 59e68339c..ae83bd5dc 100644 --- a/libs/mechanicalcompletionsidesheet/package.json +++ b/libs/mechanicalcompletionsidesheet/package.json @@ -11,5 +11,8 @@ "dependencies": { "@cc-components/mechanicalcompletionshared": "workspace:^", "@cc-components/shared": "workspace:^" + }, + "devDependencies": { + "@types/styled-components": "5.1.26" } } diff --git a/libs/punchsidesheet/package.json b/libs/punchsidesheet/package.json index 8ce1bd39b..b1a8226f1 100644 --- a/libs/punchsidesheet/package.json +++ b/libs/punchsidesheet/package.json @@ -12,5 +12,8 @@ "@cc-components/punchshared": "workspace:^", "@cc-components/shared": "workspace:^", "@cc-components/sharedcomponents": "workspace:^" + }, + "devDependencies": { + "@types/styled-components": "5.1.26" } } diff --git a/libs/punchsidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts b/libs/punchsidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts index a119400e6..dc8b0730f 100644 --- a/libs/punchsidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts +++ b/libs/punchsidesheet/src/lib/ui-sidesheet/sidesheet.styles.ts @@ -2,13 +2,13 @@ import { Tabs } from '@equinor/eds-core-react'; import { tokens } from '@equinor/eds-tokens'; import styled from 'styled-components'; -export const StyledTabListWrapper = styled.div` +export const StyledTabListWrapper: any = styled.div` overflow: hidden; width: 100%; background-color: ${tokens.colors.ui.background__light.hex}; `; -export const StyledTabsList = styled(Tabs.List)` +export const StyledTabsList: any = styled(Tabs.List)` overflow: auto; ::-webkit-scrollbar { width: 0; @@ -18,12 +18,12 @@ export const StyledTabsList = styled(Tabs.List)` scroll-behavior: smooth; `; -export const StyledTextBlock = styled.div` - max-width: 960px; +export const StyledTextBlock: any = styled.div` + max-width: 960px; - pre { - white-space: pre-wrap; - line-height: 1.5em; - font-family: Equinor; - } + pre { + white-space: pre-wrap; + line-height: 1.5em; + font-family: Equinor; + } `; diff --git a/libs/shared/src/packages/fusion-framework/createRender.tsx b/libs/shared/src/packages/fusion-framework/createRender.tsx index b6ae19cbb..a8b02c613 100644 --- a/libs/shared/src/packages/fusion-framework/createRender.tsx +++ b/libs/shared/src/packages/fusion-framework/createRender.tsx @@ -6,6 +6,8 @@ import { import { createRoot } from 'react-dom/client'; import { ApplicationInsights } from '@microsoft/applicationinsights-web'; +import { useState } from 'react'; +import { Button } from '@equinor/eds-core-react'; /** * Facades the fusion-framework render setup, used in all apps @@ -44,6 +46,13 @@ export function createRender( } })(); + const possiblePrNumber = (args.env.config?.environment as any)?.pr; + + if (possiblePrNumber) { + console.log(`creating pr ${possiblePrNumber}`); + createPrLabel(possiblePrNumber, el); + } + /** Create root from provided element */ const root = createRoot(el); @@ -63,3 +72,47 @@ export function createRender( }; }; } + +function createPrLabel(prNumber: string, el: HTMLElement): VoidFunction { + const child = document.createElement('div'); + child.id = '123'; + document.body.appendChild(child); + + const root = createRoot(child); + + root.render(); + + return () => { + root.unmount(); + child.remove(); + }; +} + +function PRLabel({ prNumber }: { prNumber: string }) { + const [isOpen, setIsOpen] = useState(true); + if (!isOpen) return null; + return ( +
+ + PR: #{prNumber} + + +
+ ); +} diff --git a/libs/swcrsidesheet/package.json b/libs/swcrsidesheet/package.json index 7c399e430..7d22bde7c 100644 --- a/libs/swcrsidesheet/package.json +++ b/libs/swcrsidesheet/package.json @@ -11,5 +11,8 @@ "dependencies": { "@cc-components/shared": "workspace:^", "@cc-components/swcrshared": "workspace:^" + }, + "devDependencies": { + "@types/styled-components": "5.1.26" } } diff --git a/libs/workordersidesheet/package.json b/libs/workordersidesheet/package.json index 4811b4354..872974a3f 100644 --- a/libs/workordersidesheet/package.json +++ b/libs/workordersidesheet/package.json @@ -10,7 +10,10 @@ }, "dependencies": { "@cc-components/shared": "workspace:^", - "@cc-components/workordershared": "workspace:^", - "@cc-components/sharedcomponents": "workspace:^" + "@cc-components/sharedcomponents": "workspace:^", + "@cc-components/workordershared": "workspace:^" + }, + "devDependencies": { + "@types/styled-components": "5.1.26" } } diff --git a/libs/workordersidesheet/src/lib/ui-sidesheet/WorkorderSidesheet.tsx b/libs/workordersidesheet/src/lib/ui-sidesheet/WorkorderSidesheet.tsx index 9be7ca693..2a7d16bc3 100644 --- a/libs/workordersidesheet/src/lib/ui-sidesheet/WorkorderSidesheet.tsx +++ b/libs/workordersidesheet/src/lib/ui-sidesheet/WorkorderSidesheet.tsx @@ -19,7 +19,7 @@ import { getMatStatusColorByStatus, getMccrStatusColorByStatus, } from '@cc-components/workordershared'; -import { Tabs } from '@equinor/eds-core-react'; +import { TabListProps, Tabs } from '@equinor/eds-core-react'; import { tokens } from '@equinor/eds-tokens'; import { createWidget } from '@equinor/workspace-sidesheet'; import { useQuery } from '@tanstack/react-query'; @@ -28,12 +28,12 @@ import styled from 'styled-components'; import { useMaterial, useMccr } from '../utils-sidesheet'; import { DetailsTab } from './DetailsTab'; -export const StyledTabListWrapper = styled.div` +export const StyledTabListWrapper: (props: any) => JSX.Element = styled.div` overflow: hidden; width: 100%; background-color: ${tokens.colors.ui.background__light.hex}; `; -export const StyledTabsList = styled(Tabs.List)` +export const StyledTabsList: (props: TabListProps) => JSX.Element = styled(Tabs.List)` overflow: auto; ::-webkit-scrollbar { width: 0; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fd451c39..b72b0b97f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -335,6 +335,9 @@ importers: cli: dependencies: + '@actions/http-client': + specifier: ^2.1.1 + version: 2.1.1 adm-zip: specifier: ^0.5.10 version: 0.5.10 @@ -361,6 +364,21 @@ importers: specifier: ^2.4.4 version: 2.4.4 + github-action: + dependencies: + '@actions/core': + specifier: ^1.10.0 + version: 1.10.0 + '@actions/github': + specifier: ^5.1.1 + version: 5.1.1 + adm-zip: + specifier: ^0.5.10 + version: 0.5.10 + commander: + specifier: 11.0.0 + version: 11.0.0 + libs/handoverapp: dependencies: '@cc-components/handovershared': @@ -393,6 +411,10 @@ importers: '@cc-components/sharedcomponents': specifier: workspace:^ version: link:../sharedcomponents + devDependencies: + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 libs/loopapp: dependencies: @@ -426,6 +448,10 @@ importers: '@cc-components/sharedcomponents': specifier: workspace:^ version: link:../sharedcomponents + devDependencies: + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 libs/mechanicalcompletionapp: dependencies: @@ -453,6 +479,10 @@ importers: '@cc-components/shared': specifier: workspace:^ version: link:../shared + devDependencies: + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 libs/plugins: {} @@ -497,6 +527,10 @@ importers: '@cc-components/sharedcomponents': specifier: workspace:^ version: link:../sharedcomponents + devDependencies: + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 libs/scopechangerequestapp: dependencies: @@ -569,6 +603,10 @@ importers: '@cc-components/swcrshared': specifier: workspace:^ version: link:../swcrshared + devDependencies: + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 libs/workorderapp: dependencies: @@ -602,6 +640,10 @@ importers: '@cc-components/workordershared': specifier: workspace:^ version: link:../workordershared + devDependencies: + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 reports/JCA-reports/jcainstallation: dependencies: @@ -731,6 +773,30 @@ importers: packages: + /@actions/core@1.10.0: + resolution: {integrity: sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==} + dependencies: + '@actions/http-client': 2.1.1 + uuid: 8.3.2 + dev: false + + /@actions/github@5.1.1: + resolution: {integrity: sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==} + dependencies: + '@actions/http-client': 2.1.1 + '@octokit/core': 3.6.0 + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + transitivePeerDependencies: + - encoding + dev: false + + /@actions/http-client@2.1.1: + resolution: {integrity: sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==} + dependencies: + tunnel: 0.0.6 + dev: false + /@ag-grid-community/client-side-row-model@28.1.1: resolution: {integrity: sha512-5lzXsdNzMQjRWYTI9VLn9KjhSyTc6TPBf63CoBWsBxxG5pSRbtKCVsx512SDxiRYZsrf/B/zImVyvHCoTBZ+Dg==} dependencies: @@ -5864,6 +5930,94 @@ packages: svgmoji: 3.2.0 dev: false + /@octokit/auth-token@2.5.0: + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + dependencies: + '@octokit/types': 6.41.0 + dev: false + + /@octokit/core@3.6.0: + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + dependencies: + '@octokit/auth-token': 2.5.0 + '@octokit/graphql': 4.8.0 + '@octokit/request': 5.6.3 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/endpoint@6.0.12: + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + dependencies: + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: false + + /@octokit/graphql@4.8.0: + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + dependencies: + '@octokit/request': 5.6.3 + '@octokit/types': 6.41.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/openapi-types@12.11.0: + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + dev: false + + /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} + peerDependencies: + '@octokit/core': '>=2' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + dev: false + + /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 3.6.0 + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + dev: false + + /@octokit/request-error@2.1.0: + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + dependencies: + '@octokit/types': 6.41.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: false + + /@octokit/request@5.6.3: + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + dependencies: + '@octokit/endpoint': 6.0.12 + '@octokit/request-error': 2.1.0 + '@octokit/types': 6.41.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.9 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/types@6.41.0: + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + dependencies: + '@octokit/openapi-types': 12.11.0 + dev: false + /@parcel/watcher@2.0.4: resolution: {integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==} engines: {node: '>= 10.0.0'} @@ -11263,6 +11417,10 @@ packages: safe-buffer: 5.1.2 dev: true + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: false + /better-opn@2.1.1: resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} engines: {node: '>8.0.0'} @@ -12098,6 +12256,11 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + dev: false + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -12827,6 +12990,10 @@ packages: engines: {node: '>= 0.8'} dev: true + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: false + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -15708,7 +15875,6 @@ packages: /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - dev: true /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -17829,7 +17995,6 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 - dev: true /node-gyp-build@4.6.0: resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} @@ -21986,7 +22151,6 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true /tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} @@ -22156,6 +22320,11 @@ packages: resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} dev: true + /tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: false + /turbo-darwin-64@1.9.1: resolution: {integrity: sha512-IX/Ph4CO80lFKd9pPx3BWpN2dynt6mcUFifyuHUNVkOP1Usza/G9YuZnKQFG6wUwKJbx40morFLjk1TTeLe04w==} cpu: [x64] @@ -22522,6 +22691,10 @@ packages: unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -23117,7 +23290,6 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} @@ -23284,7 +23456,6 @@ packages: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 51219c235..c79cab7e8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,4 @@ packages: - 'apps/*' - 'reports/**' - 'cli' + - 'github-action' diff --git a/turbo.json b/turbo.json index 16e16f180..453c4e25e 100644 --- a/turbo.json +++ b/turbo.json @@ -10,6 +10,9 @@ }, "shipit": { "dependsOn": ["build"] + }, + "pr:deploy": { + "dependsOn": [] } } }