Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
import { type AxiosInstance } from 'axios';
|
|
import { type StubbedRegistryPackage } from 'test/integration/metadata/suites/application/utils/build-npm-registry-package.util';
|
|
import { getAppProviderByClassName } from 'test/integration/utils/get-app-provider-by-class-name.util';
|
|
|
|
import { type SecureHttpClientService } from 'src/engine/core-modules/secure-http-client/secure-http-client.service';
|
|
import { type TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
|
|
|
|
export type NpmRegistryStub = {
|
|
requestedUrls: string[];
|
|
restore: () => void;
|
|
};
|
|
|
|
// Serves a single package from the running server's registry client, so an
|
|
// install never reaches npm. Requests to any other host fall through to the
|
|
// real client, leaving unrelated outbound traffic untouched.
|
|
export const stubNpmRegistry = (
|
|
registryPackage: StubbedRegistryPackage,
|
|
): NpmRegistryStub => {
|
|
const secureHttpClientService =
|
|
getAppProviderByClassName<SecureHttpClientService>(
|
|
'SecureHttpClientService',
|
|
);
|
|
const registryBaseUrl = getAppProviderByClassName<TwentyConfigService>(
|
|
'TwentyConfigService',
|
|
)
|
|
.get('APP_REGISTRY_URL')
|
|
.replace(/\/$/, '');
|
|
|
|
const requestedUrls: string[] = [];
|
|
const realGetHttpClient = secureHttpClientService.getHttpClient.bind(
|
|
secureHttpClientService,
|
|
);
|
|
|
|
const spy = jest
|
|
.spyOn(secureHttpClientService, 'getHttpClient')
|
|
.mockImplementation((config, context) => {
|
|
const client = realGetHttpClient(config, context);
|
|
const realGet = client.get.bind(client);
|
|
|
|
client.get = (async (url: string, requestConfig?: unknown) => {
|
|
if (typeof url !== 'string' || !url.startsWith(registryBaseUrl)) {
|
|
return realGet(url, requestConfig);
|
|
}
|
|
|
|
requestedUrls.push(url);
|
|
|
|
if (url === registryPackage.tarballUrl) {
|
|
return { data: registryPackage.tarballBuffer };
|
|
}
|
|
|
|
return { data: registryPackage.metadata };
|
|
}) as AxiosInstance['get'];
|
|
|
|
return client;
|
|
});
|
|
|
|
return {
|
|
requestedUrls,
|
|
restore: () => spy.mockRestore(),
|
|
};
|
|
};
|