From 8d6ec2a92b10da840ef36f97c832342cfa4e19b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Sat, 7 Mar 2026 11:12:11 +0100 Subject: [PATCH] Fix CI: lint, formatting, test, CodeQL, and generated types ordering - Sort CSS properties alphabetically in StyledPublishMethodLabel - Fix prettier formatting in app-register.ts and server test/service files - Update test assertion for twenty-app- prefix normalization - Remove unused ApplicationExceptionCode import in test - Use replaceAll instead of replace for URL encoding (CodeQL) - Correct alphabetical ordering in generated GraphQL types Made-with: Cursor --- .../src/utils/__tests__/app-template.spec.ts | 2 +- .../src/generated-metadata/graphql.ts | 12 +++++----- .../tabs/SettingsApplicationsDeveloperTab.tsx | 2 +- .../src/cli/commands/app/app-register.ts | 12 +++------- ...assert-valid-npm-package-name.util.spec.ts | 15 ++++++------ ...plication-npm-registration.service.spec.ts | 23 ++++--------------- .../application-npm-registration.service.ts | 21 +++++------------ 7 files changed, 29 insertions(+), 58 deletions(-) diff --git a/packages/create-twenty-app/src/utils/__tests__/app-template.spec.ts b/packages/create-twenty-app/src/utils/__tests__/app-template.spec.ts index ff63b45a0fe..f629fb145b7 100644 --- a/packages/create-twenty-app/src/utils/__tests__/app-template.spec.ts +++ b/packages/create-twenty-app/src/utils/__tests__/app-template.spec.ts @@ -99,7 +99,7 @@ describe('copyBaseApplicationProject', () => { expect(await fs.pathExists(packageJsonPath)).toBe(true); const packageJson = await fs.readJson(packageJsonPath); - expect(packageJson.name).toBe('my-test-app'); + expect(packageJson.name).toBe('twenty-app-my-test-app'); expect(packageJson.version).toBe('0.1.0'); expect(packageJson.devDependencies['twenty-sdk']).toBe( createTwentyAppPackageJson.version, diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 2f2f8c791c8..f19785caa8c 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -2458,6 +2458,7 @@ export type Mutation = { initiateOTPProvisioningForAuthenticatedUser: InitiateTwoFactorAuthenticationProvisioning; installApplication: Scalars['Boolean']; installMarketplaceApp: Scalars['Boolean']; + registerNpmPackage: ApplicationRegistration; removeQueryFromEventStream: Scalars['Boolean']; removeRoleFromAgent: Scalars['Boolean']; renewApplicationToken: ApplicationTokenPair; @@ -2537,7 +2538,6 @@ export type Mutation = { verifyEmailAndGetLoginToken: VerifyEmailAndGetLoginToken; verifyEmailAndGetWorkspaceAgnosticToken: AvailableWorkspacesAndAccessTokens; verifyEmailingDomain: EmailingDomain; - registerNpmPackage: ApplicationRegistration; verifyTwoFactorAuthenticationMethodForAuthenticatedUser: VerifyTwoFactorAuthenticationMethod; }; @@ -3058,6 +3058,11 @@ export type MutationInstallMarketplaceAppArgs = { }; +export type MutationRegisterNpmPackageArgs = { + packageName: Scalars['String']; +}; + + export type MutationRemoveQueryFromEventStreamArgs = { input: RemoveQueryFromEventStreamInput; }; @@ -3481,11 +3486,6 @@ export type MutationVerifyEmailingDomainArgs = { }; -export type MutationRegisterNpmPackageArgs = { - packageName: Scalars['String']; -}; - - export type MutationVerifyTwoFactorAuthenticationMethodForAuthenticatedUserArgs = { otp: Scalars['String']; }; diff --git a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx index daeb17c15b0..e70c1313124 100644 --- a/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx +++ b/packages/twenty-front/src/pages/settings/applications/tabs/SettingsApplicationsDeveloperTab.tsx @@ -28,8 +28,8 @@ const StyledButtonContainer = styled.div` `; const StyledPublishMethodLabel = styled.div` - font-size: ${themeCssVariables.font.size.sm}; color: ${themeCssVariables.font.color.light}; + font-size: ${themeCssVariables.font.size.sm}; margin-bottom: ${themeCssVariables.spacing[2]}; margin-top: ${themeCssVariables.spacing[4]}; `; diff --git a/packages/twenty-sdk/src/cli/commands/app/app-register.ts b/packages/twenty-sdk/src/cli/commands/app/app-register.ts index 3ae2e479fff..223b3a64467 100644 --- a/packages/twenty-sdk/src/cli/commands/app/app-register.ts +++ b/packages/twenty-sdk/src/cli/commands/app/app-register.ts @@ -31,20 +31,14 @@ export class AppRegisterCommand { console.log(chalk.green('Package registered successfully!')); console.log(chalk.gray(` Name: ${result.data.name}`)); - console.log( - chalk.gray(` ID: ${result.data.universalIdentifier}`), - ); + console.log(chalk.gray(` ID: ${result.data.universalIdentifier}`)); if (result.data.isProvenanceVerified) { - console.log( - chalk.green(' Provenance: Verified'), - ); + console.log(chalk.green(' Provenance: Verified')); if (result.data.provenanceRepositoryUrl) { console.log( - chalk.gray( - ` Repository: ${result.data.provenanceRepositoryUrl}`, - ), + chalk.gray(` Repository: ${result.data.provenanceRepositoryUrl}`), ); } } else { diff --git a/packages/twenty-server/src/engine/core-modules/application/application-package/utils/__tests__/assert-valid-npm-package-name.util.spec.ts b/packages/twenty-server/src/engine/core-modules/application/application-package/utils/__tests__/assert-valid-npm-package-name.util.spec.ts index a5656d03ebb..85d65dbb37d 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-package/utils/__tests__/assert-valid-npm-package-name.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-package/utils/__tests__/assert-valid-npm-package-name.util.spec.ts @@ -1,12 +1,11 @@ -import { - ApplicationException, - ApplicationExceptionCode, -} from 'src/engine/core-modules/application/application.exception'; +import { ApplicationException } from 'src/engine/core-modules/application/application.exception'; import { assertValidNpmPackageName } from 'src/engine/core-modules/application/application-package/utils/assert-valid-npm-package-name.util'; describe('assertValidNpmPackageName', () => { it('should accept valid twenty-app- prefixed names', () => { - expect(() => assertValidNpmPackageName('twenty-app-my-cool-app')).not.toThrow(); + expect(() => + assertValidNpmPackageName('twenty-app-my-cool-app'), + ).not.toThrow(); expect(() => assertValidNpmPackageName('twenty-app-hello')).not.toThrow(); }); @@ -23,9 +22,9 @@ describe('assertValidNpmPackageName', () => { }); it('should reject scoped packages without twenty-app- prefix', () => { - expect(() => - assertValidNpmPackageName('@myorg/my-cool-app'), - ).toThrow(ApplicationException); + expect(() => assertValidNpmPackageName('@myorg/my-cool-app')).toThrow( + ApplicationException, + ); }); it('should reject invalid npm package names', () => { diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/__tests__/application-npm-registration.service.spec.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/__tests__/application-npm-registration.service.spec.ts index d02aba4482e..da53bf82da7 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-registration/__tests__/application-npm-registration.service.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/__tests__/application-npm-registration.service.spec.ts @@ -10,9 +10,7 @@ import { ApplicationRegistrationService } from 'src/engine/core-modules/applicat import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; import { type UserEntity } from 'src/engine/core-modules/user/user.entity'; -const createMockUser = ( - overrides: Partial = {}, -): UserEntity => +const createMockUser = (overrides: Partial = {}): UserEntity => ({ id: 'user-123', email: 'dev@example.com', @@ -59,9 +57,7 @@ describe('ApplicationNpmRegistrationService', () => { }).compile(); service = module.get(ApplicationNpmRegistrationService); - applicationRegistrationService = module.get( - ApplicationRegistrationService, - ); + applicationRegistrationService = module.get(ApplicationRegistrationService); applicationPackageFetcherService = module.get( ApplicationPackageFetcherService, ); @@ -101,11 +97,7 @@ describe('ApplicationNpmRegistrationService', () => { }); await expect( - service.registerNpmPackage( - 'twenty-app-test', - user, - 'workspace-1', - ), + service.registerNpmPackage('twenty-app-test', user, 'workspace-1'), ).rejects.toThrow(ApplicationRegistrationException); }); @@ -203,19 +195,14 @@ describe('ApplicationNpmRegistrationService', () => { {} as any, ); - await service.registerNpmPackage( - 'twenty-app-test', - user, - 'workspace-1', - ); + await service.registerNpmPackage('twenty-app-test', user, 'workspace-1'); expect( applicationRegistrationService.upsertFromNpmRegistration, ).toHaveBeenCalledWith( expect.objectContaining({ isProvenanceVerified: true, - provenanceRepositoryUrl: - 'https://github.com/user/twenty-app-test', + provenanceRepositoryUrl: 'https://github.com/user/twenty-app-test', provenanceVerifiedAt: expect.any(Date), }), ); diff --git a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-npm-registration.service.ts b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-npm-registration.service.ts index f52c30d0157..051c2e982c2 100644 --- a/packages/twenty-server/src/engine/core-modules/application/application-registration/application-npm-registration.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/application-registration/application-npm-registration.service.ts @@ -17,10 +17,7 @@ type NpmPackument = { name: string; 'dist-tags': Record; maintainers: Array<{ name: string; email: string }>; - versions: Record< - string, - { dist?: { tarball?: string; integrity?: string } } - >; + versions: Record; }; export type ProvenanceMetadata = { @@ -30,9 +27,7 @@ export type ProvenanceMetadata = { @Injectable() export class ApplicationNpmRegistrationService { - private readonly logger = new Logger( - ApplicationNpmRegistrationService.name, - ); + private readonly logger = new Logger(ApplicationNpmRegistrationService.name); constructor( private readonly twentyConfigService: TwentyConfigService, @@ -55,7 +50,7 @@ export class ApplicationNpmRegistrationService { } const { data } = await axios.get( - `${registryUrl}/${encodeURIComponent(packageName).replace('%40', '@')}`, + `${registryUrl}/${encodeURIComponent(packageName).replaceAll('%40', '@')}`, { headers, timeout: 15_000 }, ); @@ -142,10 +137,8 @@ export class ApplicationNpmRegistrationService { ownerWorkspaceId: workspaceId, createdByUserId: user.id, latestAvailableVersion: latestVersion ?? null, - isProvenanceVerified: - provenanceMetadata?.hasProvenance ?? false, - provenanceRepositoryUrl: - provenanceMetadata?.repositoryUrl ?? null, + isProvenanceVerified: provenanceMetadata?.hasProvenance ?? false, + provenanceRepositoryUrl: provenanceMetadata?.repositoryUrl ?? null, provenanceVerifiedAt: provenanceMetadata?.hasProvenance ? new Date() : null, @@ -176,9 +169,7 @@ export class ApplicationNpmRegistrationService { } for (const attestation of data.attestations) { - if ( - attestation.predicateType !== 'https://slsa.dev/provenance/v1' - ) { + if (attestation.predicateType !== 'https://slsa.dev/provenance/v1') { continue; }