Skip to content

Commit a003f82

Browse files
committed
fix(vitest-certa-bridge): address arch review findings
Fixes all 21 findings from the architectural review of PR #9094. API surface (A/B): - Remove "import" ESM condition from ./electron subpath (points to CJS build to avoid __dirname/require() breakage; kept for Vite resolution) - Gate ./callbackRegistry subpath to public-only barrel (new callbackRegistryPublic.ts re-exports only registerBackendCallback + getCallbacksRegisteredOnBackend) - Mark executeRegisteredCallback/clearCallbacks/dispatchCallback @internal - Mark BridgeRequest/BridgeResponse @internal; remove from root barrel - Add @beta TSDoc tags to all public API symbols - Fix CertaBackendCallback type: unknown (subsumes Promise<unknown>) - Add GrepMode = "include" | "exclude" type; replace invertGrep: boolean - Mark RendererTestResults/RendererHarnessOptions @internal; remove from electron/index.ts public barrel Concurrency (C): - C1: Replace shared mutable results[] in runner.ts with Promise.all/flat - C2: Initialize backendReady = Promise.resolve() (not undefined) - C3/D7/E7: Normalize backendInitModule resolution in session.ts - C4: Use Symbol.for("@itwin/vitest-certa-bridge/callbacks") registry key - C5: Guard render-process-gone handler with testResultsReceived flag - C6: Surface backend init errors via console.error instead of swallowing Error signaling (D): - D1/E2: afterAll catch increments failed count + pushes to errors - D2: Wrap setup file require in try/catch with early IPC send on failure - D3: Add res.ok guard before res.json() in injected bridge script - D4: Write crash result JSON on render-process-gone before process.exit - D5: Fix isSilentTimeout false-positive: require skipped === 0 - D6: Count unhandled rejections; surface in shard summary Design patterns (E): - E1: Replace invertGrep: boolean with grepMode: GrepMode everywhere - E3: Extract dispatchCallback() shared helper (deduplicates token validation across HTTP middleware and Electron IPC handler) - E4: Extract shared loadEnv utility with dotenv-expand v5/v9 compat - E5: Memoize bridge transport detection in client.ts - E6: Move legacyGetTokenCallbackName comment; keep local to certaBackend Scope (F): - F6: Remove stale @itwin/certa devDependency from core/electron Additional fixes found during CI: - Restore "getToken" legacy callback registration in full-stack-tests/core and ecschema-rpc-interface backends for @itwin/oidc-signin-tool compat - Keep "import" condition on ./electron subpath (Vite needs it to resolve the package; point it at CJS to preserve __dirname/require() at runtime) - rush update after adding new source files to vitest-certa-bridge
1 parent 80d3721 commit a003f82

33 files changed

Lines changed: 295 additions & 427 deletions

common/api/core-backend.api.md

Lines changed: 7 additions & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ import { DrawingProps } from '@itwin/core-common';
7575
import { EcefLocation } from '@itwin/core-common';
7676
import { EcefLocationProps } from '@itwin/core-common';
7777
import { ECSchemaProps } from '@itwin/core-common';
78-
import { ECSpecVersion } from '@itwin/ecschema-metadata';
7978
import { ECSqlReader } from '@itwin/core-common';
8079
import { ECSqlReaderBase } from '@itwin/core-common';
8180
import { ECSqlValueType } from '@itwin/core-common';
@@ -431,7 +430,6 @@ export interface AvailableCoordinateReferenceSystemProps {
431430
deprecated: boolean;
432431
description: string;
433432
name: string;
434-
unit?: string;
435433
}
436434

437435
// @beta (undocumented)
@@ -734,25 +732,6 @@ export class BriefcaseManager {
734732
static storeSchemasForSemanticRebase<T extends LocalFileName[] | string[]>(db: BriefcaseDb, txnId: string, schemaFileNames: T): void;
735733
}
736734

737-
// @beta
738-
export interface BulkDeleteElementsArgs {
739-
skipFKConstraintValidations?: boolean;
740-
}
741-
742-
// @beta
743-
export interface BulkDeleteElementsResult {
744-
failedIds: Id64Set;
745-
sqlDeleteStatus: DbResult;
746-
status: BulkDeleteElementsStatus;
747-
}
748-
749-
// @beta
750-
export enum BulkDeleteElementsStatus {
751-
DeletionFailed = 2,
752-
PartialSuccess = 1,
753-
Success = 0
754-
}
755-
756735
// @public
757736
export abstract class Callout extends DetailingSymbol {
758737
constructor(props: CalloutProps, iModel: IModelDb);
@@ -878,14 +857,6 @@ export class CategorySelector extends DefinitionElement {
878857
}
879858

880859
// @beta
881-
export interface ChangeCache extends Disposable {
882-
all(): IterableIterator<ChangeInstance>;
883-
count(): number;
884-
get(key: string): ChangeInstance | undefined;
885-
set(key: string, value: ChangeInstance): void;
886-
}
887-
888-
// @beta @deprecated
889860
export interface ChangedECInstance {
890861
// (undocumented)
891862
$meta?: ChangeMetaData;
@@ -927,12 +898,6 @@ export interface ChangeFormatArgs {
927898
includeTableName?: true;
928899
}
929900

930-
// @beta
931-
export interface ChangeInstance {
932-
$meta: ChangeMeta;
933-
[key: string]: any;
934-
}
935-
936901
// @beta
937902
export interface ChangeInstanceKey {
938903
changeType: "inserted" | "updated" | "deleted";
@@ -941,19 +906,6 @@ export interface ChangeInstanceKey {
941906
}
942907

943908
// @beta
944-
export interface ChangeMeta {
945-
changeFetchedPropNames: string[];
946-
changeIndexes: number[];
947-
instanceKey: string;
948-
isIndirectChange: boolean;
949-
op: SqliteChangeOp;
950-
propFilter: PropertyFilter;
951-
rowOptions?: RowFormatOptions;
952-
stage: SqliteValueStage;
953-
tables: string[];
954-
}
955-
956-
// @beta @deprecated
957909
export interface ChangeMetaData {
958910
changeIndexes: number[];
959911
classFullName?: string;
@@ -969,7 +921,7 @@ export interface ChangesetArg extends IModelIdArg {
969921
readonly changeset: ChangesetIndexOrId;
970922
}
971923

972-
// @beta @deprecated
924+
// @beta
973925
export class ChangesetECAdaptor implements Disposable {
974926
[Symbol.dispose](): void;
975927
constructor(reader: SqliteChangesetReader, disableMetaData?: boolean);
@@ -1007,58 +959,6 @@ export interface ChangesetRangeArg extends IModelIdArg {
1007959
readonly range?: ChangesetRange;
1008960
}
1009961

1010-
// @beta
1011-
export class ChangesetReader implements Disposable, ChangeSource {
1012-
[Symbol.dispose](): void;
1013-
clearClassNameFilters(): void;
1014-
clearOpCodeFilters(): void;
1015-
clearTableNameFilters(): void;
1016-
close(): void;
1017-
readonly db: AnyDb;
1018-
deleted?: ChangeInstance;
1019-
inserted?: ChangeInstance;
1020-
get isECTable(): boolean;
1021-
get isIndirectChange(): boolean;
1022-
get op(): SqliteChangeOp;
1023-
static openFile(args: {
1024-
readonly fileName: string;
1025-
} & ChangesetReaderArgs): ChangesetReader;
1026-
static openGroup(args: {
1027-
readonly changesetFiles: string[];
1028-
} & ChangesetReaderArgs): ChangesetReader;
1029-
static openInMemoryChanges(args: Omit<ChangesetReaderArgs, "db"> & {
1030-
db: IModelDb;
1031-
}): ChangesetReader;
1032-
static openLocalChanges(args: Omit<ChangesetReaderArgs, "db"> & {
1033-
db: IModelDb;
1034-
includeInMemoryChanges?: boolean;
1035-
}): ChangesetReader;
1036-
static openTxn(args: Omit<ChangesetReaderArgs, "db"> & {
1037-
db: IModelDb;
1038-
txnId: Id64String;
1039-
}): ChangesetReader;
1040-
setClassNameFilters(classNames: Set<string>): void;
1041-
setOpCodeFilters(ops: Set<SqliteChangeOp>): void;
1042-
setTableNameFilters(tableNames: Set<string>): void;
1043-
step(): boolean;
1044-
get tableName(): string;
1045-
}
1046-
1047-
// @beta
1048-
export interface ChangesetReaderArgs {
1049-
readonly db: AnyDb;
1050-
readonly invert?: boolean;
1051-
readonly propFilter?: PropertyFilter;
1052-
readonly rowOptions?: RowFormatOptions;
1053-
}
1054-
1055-
// @beta
1056-
export interface ChangeSource {
1057-
readonly deleted?: ChangeInstance;
1058-
readonly inserted?: ChangeInstance;
1059-
readonly op: SqliteChangeOp;
1060-
}
1061-
1062962
// @beta
1063963
export interface ChangeSummary {
1064964
// (undocumented)
@@ -1093,12 +993,6 @@ export class ChangeSummaryManager {
1093993
static queryInstanceChange(iModel: BriefcaseDb, instanceChangeId: Id64String): InstanceChange;
1094994
}
1095995

1096-
// @beta (undocumented)
1097-
export namespace ChangeUnifierCache {
1098-
export function createInMemoryCache(): ChangeCache;
1099-
export function createSqliteBackedCache(bufferedReadInstanceSizeInBytes?: number): ChangeCache;
1100-
}
1101-
1102996
// @beta
1103997
export interface ChannelControl {
1104998
// @internal (undocumented)
@@ -2353,15 +2247,15 @@ export abstract class DriverBundleElement extends InformationContentElement {
23532247
static get className(): string;
23542248
}
23552249

2356-
// @beta @deprecated
2250+
// @beta
23572251
export interface ECChangeUnifierCache extends Disposable {
23582252
all(): IterableIterator<ChangedECInstance>;
23592253
count(): number;
23602254
get(key: string): ChangedECInstance | undefined;
23612255
set(key: string, value: ChangedECInstance): void;
23622256
}
23632257

2364-
// @beta @deprecated (undocumented)
2258+
// @beta (undocumented)
23652259
export namespace ECChangeUnifierCache {
23662260
export function createInMemoryCache(): ECChangeUnifierCache;
23672261
export function createSqliteBackedCache(db: AnyDb, bufferedReadInstanceSizeInBytes?: number): ECChangeUnifierCache;
@@ -2716,7 +2610,6 @@ export class EditTxn {
27162610
deleteAspect(aspectInstanceIds: Id64Arg): void;
27172611
deleteDefinitionElements(definitionElementIds: Id64Array): Id64Set;
27182612
deleteElement(ids: Id64Arg): void;
2719-
deleteElements(ids: Id64Array, deleteOptions?: BulkDeleteElementsArgs): BulkDeleteElementsResult;
27202613
deleteFileProperty(prop: FilePropertyProps): void;
27212614
deleteModel(ids: Id64Arg): void;
27222615
deleteRelationship(props: RelationshipProps): void;
@@ -2792,10 +2685,6 @@ class Element_2 extends Entity {
27922685
// @beta
27932686
protected static onBeforeOutputsHandledArg(arg: OnElementDependencyArg): void;
27942687
// @beta
2795-
protected static onBulkChildDeleted(arg: OnBulkChildDeletedBatchArg): void;
2796-
// @beta
2797-
protected static onBulkDeleted(arg: OnBulkDeletedBatchArg): void;
2798-
// @beta
27992688
protected static onChildAdd(_arg: OnChildElementPropsArg): void;
28002689
// @beta
28012690
protected static onChildAdded(arg: OnChildElementIdArg): void;
@@ -3814,12 +3703,8 @@ export function getAvailableCoordinateReferenceSystems(args: GetAvailableCoordin
38143703
export interface GetAvailableCoordinateReferenceSystemsArgs {
38153704
extent?: Range2dProps;
38163705
includeWorld?: boolean;
3817-
unit?: string;
38183706
}
38193707

3820-
// @beta
3821-
export function getAvailableCRSUnits(): string[];
3822-
38233708
// @beta
38243709
export interface GetWorkspaceContainerArgs extends WorkspaceContainerProps {
38253710
accessToken: AccessToken;
@@ -4029,8 +3914,6 @@ export abstract class IModelDb extends IModel {
40293914
exportSchema(args: ExportSchemaArgs): void;
40303915
// @beta
40313916
exportSchemas(outputDirectory: LocalFileName): void;
4032-
// @beta
4033-
exportSchemaXmlString(schemaName: string, ecSpecVersion?: ECSpecVersion): string | undefined;
40343917
static findByFilename(fileName: LocalFileName): IModelDb | undefined;
40353918
static findByKey(key: string): IModelDb;
40363919
// @deprecated (undocumented)
@@ -5292,8 +5175,6 @@ export class Model extends Entity {
52925175
// (undocumented)
52935176
readonly name: string;
52945177
// @beta
5295-
protected static onBulkModelEvents(arg: OnBulkModelEventsArg): void;
5296-
// @beta
52975178
protected static onDelete(arg: OnModelIdArg): void;
52985179
// @beta
52995180
protected static onDeleted(arg: OnModelIdArg): void;
@@ -5437,43 +5318,6 @@ export interface OnAspectPropsArg extends OnAspectArg {
54375318
props: Readonly<ElementAspectProps>;
54385319
}
54395320

5440-
// @beta
5441-
export interface OnBulkChildDeleteArg {
5442-
childId: Id64String;
5443-
parentId: Id64String;
5444-
}
5445-
5446-
// @beta
5447-
export interface OnBulkChildDeletedBatchArg {
5448-
elements: OnBulkChildDeleteArg[];
5449-
iModel: IModelDb;
5450-
}
5451-
5452-
// @beta
5453-
export interface OnBulkDeleteArg {
5454-
federationGuid?: GuidString;
5455-
id: Id64String;
5456-
model: Id64String;
5457-
subModelId?: Id64String;
5458-
}
5459-
5460-
// @beta
5461-
export interface OnBulkDeletedBatchArg {
5462-
elements: OnBulkDeleteArg[];
5463-
iModel: IModelDb;
5464-
}
5465-
5466-
// @beta
5467-
export interface OnBulkDeletedElementsArg extends OnModelIdArg {
5468-
elementIds: Id64String[];
5469-
}
5470-
5471-
// @beta
5472-
export interface OnBulkModelEventsArg extends OnModelArg {
5473-
deletedElementsByModel?: OnBulkDeletedElementsArg[];
5474-
deletedModelIds?: Id64String[];
5475-
}
5476-
54775321
// @beta
54785322
export interface OnChildElementArg extends OnElementArg {
54795323
// (undocumented)
@@ -5575,15 +5419,6 @@ export class OrthographicViewDefinition extends SpatialViewDefinition {
55755419
export function parseTextAnnotationData(json: string | undefined): VersionedJSON<TextAnnotationProps> | undefined;
55765420

55775421
// @beta
5578-
export class PartialChangeUnifier implements Disposable {
5579-
[Symbol.dispose](): void;
5580-
constructor(_cache?: ChangeCache);
5581-
appendFrom(source: ChangeSource): void;
5582-
get instanceCount(): number;
5583-
get instances(): IterableIterator<ChangeInstance>;
5584-
}
5585-
5586-
// @beta @deprecated
55875422
export class PartialECChangeUnifier implements Disposable {
55885423
[Symbol.dispose](): void;
55895424
constructor(_db: AnyDb, _cache?: ECChangeUnifierCache);
@@ -5770,13 +5605,6 @@ export interface ProjectInformationRecordCreateArgs extends ProjectInformation {
57705605
parentSubjectId: Id64String;
57715606
}
57725607

5773-
// @beta
5774-
export enum PropertyFilter {
5775-
All = 0,
5776-
BisCoreElement = 1,
5777-
InstanceKey = 2
5778-
}
5779-
57805608
// @public @preview
57815609
export type PropertyHandler = (name: string, property: Property) => void;
57825610

@@ -5884,7 +5712,6 @@ export type QueryWorkspaceResourcesCallback = (resources: Iterable<{
58845712

58855713
// @alpha
58865714
export interface RebaseHandler {
5887-
dispose?(): void;
58885715
recompute(txn: TxnProps): Promise<void>;
58895716
shouldReinstate(txn: TxnProps): boolean;
58905717
}
@@ -5898,7 +5725,6 @@ export class RebaseManager {
58985725
handler: (args: RebaseChangesetConflictArgs) => DbConflictResolution | undefined;
58995726
}): void;
59005727
canAbort(): boolean;
5901-
dispose(): void;
59025728
inProgress(): boolean;
59035729
get isAborting(): boolean;
59045730
get isMerging(): boolean;
@@ -6138,13 +5964,6 @@ export class RoleModel extends Model {
61385964
static get className(): string;
61395965
}
61405966

6141-
// @beta
6142-
export interface RowFormatOptions {
6143-
abbreviateBlobs?: boolean;
6144-
classIdsToClassNames?: boolean;
6145-
useJsName?: boolean;
6146-
}
6147-
61485967
// @public
61495968
export class RpcTrace {
61505969
static get currentActivity(): RpcActivity | undefined;
@@ -6839,9 +6658,7 @@ export class SpatialViewDefinition extends ViewDefinition3d {
68396658
// @deprecated (undocumented)
68406659
static insertWithCamera(iModelDb: IModelDb, definitionModelId: Id64String, name: string, modelSelectorId: Id64String, categorySelectorId: Id64String, displayStyleId: Id64String, range: Range3d, standardView?: StandardViewIndex, cameraAngle?: number): Id64String;
68416660
loadModelSelector(): ModelSelector;
6842-
modelSelector: RelatedElementProps;
6843-
get modelSelectorId(): Id64String;
6844-
set modelSelectorId(id: Id64String);
6661+
modelSelectorId: Id64String;
68456662
// @beta (undocumented)
68466663
static readonly requiredReferenceKeys: ReadonlyArray<string>;
68476664
// @alpha (undocumented)
@@ -7796,9 +7613,7 @@ export class ViewAttachmentLabel extends DetailingSymbol {
77967613
// @public @preview
77977614
export abstract class ViewDefinition extends DefinitionElement {
77987615
protected constructor(props: ViewDefinitionProps, iModel: IModelDb);
7799-
categorySelector: RelatedElementProps;
7800-
get categorySelectorId(): Id64String;
7801-
set categorySelectorId(id: Id64String);
7616+
categorySelectorId: Id64String;
78027617
// (undocumented)
78037618
static get className(): string;
78047619
// (undocumented)
@@ -7809,9 +7624,7 @@ export abstract class ViewDefinition extends DefinitionElement {
78097624
// @beta
78107625
static deserialize(props: DeserializeEntityArgs): ViewDefinitionProps;
78117626
abstract get details(): ViewDetails;
7812-
displayStyle: RelatedElementProps;
7813-
get displayStyleId(): Id64String;
7814-
set displayStyleId(id: Id64String);
7627+
displayStyleId: Id64String;
78157628
getAuxiliaryCoordinateSystemId(): Id64String;
78167629
isDrawingView(): this is DrawingViewDefinition;
78177630
isSpatialView(): this is SpatialViewDefinition;
@@ -7836,9 +7649,7 @@ export abstract class ViewDefinition extends DefinitionElement {
78367649
export class ViewDefinition2d extends ViewDefinition {
78377650
protected constructor(props: ViewDefinition2dProps, iModel: IModelDb);
78387651
angle: Angle;
7839-
baseModel: RelatedElementProps;
7840-
get baseModelId(): Id64String;
7841-
set baseModelId(id: Id64String);
7652+
baseModelId: Id64String;
78427653
// (undocumented)
78437654
static get className(): string;
78447655
// (undocumented)

common/api/core-bentley.api.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1831,9 +1831,6 @@ export function using<T extends IDisposable, TResult>(resources: T | T[], func:
18311831
// @public
18321832
export function utf8ToString(utf8: Uint8Array): string | undefined;
18331833

1834-
// @beta
1835-
export function wrapTimerCallback(timerPromises: Set<Promise<void>>, callback: () => Promise<void>): Promise<void>;
1836-
18371834
// @public
18381835
export class YieldManager {
18391836
constructor(options?: YieldManagerOptions);

0 commit comments

Comments
 (0)