@baas-id/react 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/LICENSE.md +176 -0
  2. package/README.md +171 -0
  3. package/THIRD_PARTY_NOTICES.md +44 -0
  4. package/dist/esm/baas-id-react.css +1 -0
  5. package/dist/esm/chunks/ContinueFlow-YFSpSOio.js +7500 -0
  6. package/dist/esm/continue.js +10 -0
  7. package/dist/esm/index.js +218 -0
  8. package/dist/esm/preview.js +368 -0
  9. package/dist/esm/workers/detector.worker-DtuL8TFY.js +22435 -0
  10. package/dist/types/continue.d.ts +3 -0
  11. package/dist/types/index.d.ts +19 -0
  12. package/dist/types/preview.d.ts +5 -0
  13. package/dist/types/react/DocumentCapture.d.ts +27 -0
  14. package/dist/types/react/FaceCapture.d.ts +19 -0
  15. package/dist/types/react/capture/ProximityMeter.d.ts +9 -0
  16. package/dist/types/react/capture/TurnGauge.d.ts +12 -0
  17. package/dist/types/react/capture/YawDial.d.ts +6 -0
  18. package/dist/types/react/capture/api.d.ts +50 -0
  19. package/dist/types/react/capture/attestation.d.ts +32 -0
  20. package/dist/types/react/capture/binding.d.ts +51 -0
  21. package/dist/types/react/capture/camera.d.ts +4 -0
  22. package/dist/types/react/capture/chrome.d.ts +24 -0
  23. package/dist/types/react/capture/demo.d.ts +2 -0
  24. package/dist/types/react/capture/errors.d.ts +18 -0
  25. package/dist/types/react/capture/frames.d.ts +18 -0
  26. package/dist/types/react/capture/index.d.ts +15 -0
  27. package/dist/types/react/capture/integrity.d.ts +32 -0
  28. package/dist/types/react/capture/keyframes.d.ts +19 -0
  29. package/dist/types/react/capture/overlays.d.ts +10 -0
  30. package/dist/types/react/capture/run.d.ts +14 -0
  31. package/dist/types/react/capture/useCaptureRun.d.ts +4 -0
  32. package/dist/types/react/document/CardFrame.d.ts +10 -0
  33. package/dist/types/react/document/DocumentParts.d.ts +49 -0
  34. package/dist/types/react/document/advisory.d.ts +47 -0
  35. package/dist/types/react/document/bestFrames.d.ts +18 -0
  36. package/dist/types/react/document/cues.d.ts +28 -0
  37. package/dist/types/react/document/flow.d.ts +52 -0
  38. package/dist/types/react/document/gate.d.ts +114 -0
  39. package/dist/types/react/document/latch.d.ts +25 -0
  40. package/dist/types/react/document/mrz.d.ts +29 -0
  41. package/dist/types/react/document/overlay.d.ts +52 -0
  42. package/dist/types/react/document/quad.d.ts +5 -0
  43. package/dist/types/react/document/resolution.d.ts +42 -0
  44. package/dist/types/react/document/review.d.ts +50 -0
  45. package/dist/types/react/document/sideCheck.d.ts +32 -0
  46. package/dist/types/react/document/telemetry.d.ts +14 -0
  47. package/dist/types/react/document/track.d.ts +36 -0
  48. package/dist/types/react/document/useDocumentCapture.d.ts +78 -0
  49. package/dist/types/react/face/FaceGuide.d.ts +22 -0
  50. package/dist/types/react/face/FaceParts.d.ts +15 -0
  51. package/dist/types/react/face/faceMesh.d.ts +68 -0
  52. package/dist/types/react/face/faceRegion.d.ts +16 -0
  53. package/dist/types/react/face/faceView.d.ts +21 -0
  54. package/dist/types/react/face/meshBench.d.ts +7 -0
  55. package/dist/types/react/face/meshCanvas.d.ts +20 -0
  56. package/dist/types/react/face/qualityGate.d.ts +59 -0
  57. package/dist/types/react/face/runLiveness.d.ts +37 -0
  58. package/dist/types/react/face/scanState.d.ts +40 -0
  59. package/dist/types/react/face/upload.d.ts +14 -0
  60. package/dist/types/react/face/useFaceCapture.d.ts +45 -0
  61. package/dist/types/react/flows/ConsentStep.d.ts +8 -0
  62. package/dist/types/react/flows/EnrollmentFlow.d.ts +2 -0
  63. package/dist/types/react/flows/FlowResult.d.ts +13 -0
  64. package/dist/types/react/flows/FlowShell.d.ts +48 -0
  65. package/dist/types/react/flows/IdentifyFlow.d.ts +2 -0
  66. package/dist/types/react/flows/ReverificationFlow.d.ts +2 -0
  67. package/dist/types/react/flows/SignInFlow.d.ts +2 -0
  68. package/dist/types/react/flows/StepIntro.d.ts +10 -0
  69. package/dist/types/react/flows/VerificationFlow.d.ts +4 -0
  70. package/dist/types/react/flows/experience.d.ts +35 -0
  71. package/dist/types/react/flows/failureDetail.d.ts +12 -0
  72. package/dist/types/react/flows/index.d.ts +6 -0
  73. package/dist/types/react/flows/session.d.ts +5 -0
  74. package/dist/types/react/flows/state.d.ts +106 -0
  75. package/dist/types/react/flows/types.d.ts +255 -0
  76. package/dist/types/react/flows/useFlowSession.d.ts +21 -0
  77. package/dist/types/react/flows.d.ts +1 -0
  78. package/dist/types/react/handoff/ContinueFlow.d.ts +28 -0
  79. package/dist/types/react/handoff/ContinueOnPhone.d.ts +60 -0
  80. package/dist/types/react/handoff/api.d.ts +41 -0
  81. package/dist/types/react/handoff/qr.d.ts +9 -0
  82. package/dist/types/react/hooks.d.ts +7 -0
  83. package/dist/types/react/i18n/en.d.ts +3 -0
  84. package/dist/types/react/i18n/es-419.d.ts +3 -0
  85. package/dist/types/react/i18n/index.d.ts +10 -0
  86. package/dist/types/react/i18n/types.d.ts +250 -0
  87. package/dist/types/react/icons.d.ts +25 -0
  88. package/dist/types/react/liveness/challenges.d.ts +26 -0
  89. package/dist/types/react/liveness/framing.d.ts +33 -0
  90. package/dist/types/react/liveness/index.d.ts +8 -0
  91. package/dist/types/react/liveness/nod.d.ts +4 -0
  92. package/dist/types/react/liveness/scoring.d.ts +29 -0
  93. package/dist/types/react/liveness/script.d.ts +7 -0
  94. package/dist/types/react/liveness/signals.d.ts +38 -0
  95. package/dist/types/react/liveness/timing.d.ts +20 -0
  96. package/dist/types/react/liveness/turn.d.ts +18 -0
  97. package/dist/types/react/preview/FlowPreview.d.ts +34 -0
  98. package/dist/types/react/preview/contrast.d.ts +17 -0
  99. package/dist/types/react/preview/specimen.d.ts +35 -0
  100. package/dist/types/react/styles/index.d.ts +0 -0
  101. package/dist/types/react/telemetry/bus.d.ts +13 -0
  102. package/dist/types/react/telemetry/device.d.ts +66 -0
  103. package/dist/types/react/telemetry/reporter.d.ts +27 -0
  104. package/dist/types/react/theme/appearance.d.ts +22 -0
  105. package/dist/types/react/version.d.ts +1 -0
  106. package/dist/types/react/vision/authenticity.d.ts +43 -0
  107. package/dist/types/react/vision/authenticityPixels.d.ts +6 -0
  108. package/dist/types/react/vision/authenticitySpecular.d.ts +2 -0
  109. package/dist/types/react/vision/cardCorners.d.ts +21 -0
  110. package/dist/types/react/vision/cardDetector.d.ts +15 -0
  111. package/dist/types/react/vision/cornerGeometry.d.ts +10 -0
  112. package/dist/types/react/vision/cornerImage.d.ts +34 -0
  113. package/dist/types/react/vision/cornerLines.d.ts +12 -0
  114. package/dist/types/react/vision/cornerScore.d.ts +17 -0
  115. package/dist/types/react/vision/corners.d.ts +60 -0
  116. package/dist/types/react/vision/detector.worker.d.ts +1 -0
  117. package/dist/types/react/vision/document.d.ts +13 -0
  118. package/dist/types/react/vision/engine.d.ts +5 -0
  119. package/dist/types/react/vision/face.d.ts +17 -0
  120. package/dist/types/react/vision/index.d.ts +7 -0
  121. package/dist/types/react/vision/modelCache.d.ts +16 -0
  122. package/dist/types/react/vision/modelsCdn.d.ts +4 -0
  123. package/dist/types/react/vision/quality.d.ts +10 -0
  124. package/dist/types/react/vision/sideClassifier.d.ts +4 -0
  125. package/dist/types/react/vision/tinyCore.d.ts +21 -0
  126. package/dist/types/react/vision/tinyDetector.d.ts +36 -0
  127. package/dist/types/react/vision/types.d.ts +62 -0
  128. package/dist/types/react/vision/warp.d.ts +18 -0
  129. package/package.json +104 -0
@@ -0,0 +1,22 @@
1
+ import type { CSSProperties } from "react";
2
+ export type ColorKey = "primary" | "positive" | "caution" | "danger" | "surface" | "text" | "overlay";
3
+ export type SafeFont = "inherit" | "system" | "humanist" | "geometric" | "grotesque" | "rounded" | "serif";
4
+ export interface Appearance {
5
+ colors?: Partial<Record<ColorKey, string>>;
6
+ radius?: number;
7
+ font?: SafeFont;
8
+ hostFont?: string;
9
+ logoUrl?: string;
10
+ scan?: {
11
+ accent?: string;
12
+ mesh?: string;
13
+ };
14
+ lowLightFill?: boolean;
15
+ }
16
+ export declare const FONT_STACKS: Record<SafeFont, string>;
17
+ export declare const SDK_DEFAULTS: Record<string, string>;
18
+ export declare function appearanceGroups(a: Appearance | null | undefined): Array<Record<string, string>>;
19
+ export declare function hostSet(name: string, computed: string | null | undefined): boolean;
20
+ export declare function appearanceStyle(a: Appearance | null | undefined, read?: (name: string) => string | null | undefined, force?: boolean): CSSProperties;
21
+ export declare function safeLogoUrl(a: Appearance | null | undefined): string | null;
22
+ export declare function normalizeAppearance(raw: unknown): Appearance | undefined;
@@ -0,0 +1 @@
1
+ export declare const SDK_VERSION = "0.2.2";
@@ -0,0 +1,43 @@
1
+ export { specularSignature } from "./authenticitySpecular";
2
+ export { MOIRE_ADVISORY_MIN, PRINT_TEXTURE_MIN, chromaResidualLevel, gridPeriodicity, printTexture } from "./authenticityPixels";
3
+ export interface PixelData {
4
+ data: ArrayLike<number>;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ export type CardBox = {
9
+ left: number;
10
+ top: number;
11
+ right: number;
12
+ bottom: number;
13
+ };
14
+ export type CropSample = PixelData & {
15
+ box?: CardBox;
16
+ };
17
+ export interface SpecularSignature {
18
+ gloss: number;
19
+ static: number;
20
+ frames: number;
21
+ }
22
+ export type CardOutline = {
23
+ kind: "box";
24
+ box: CardBox;
25
+ } | {
26
+ kind: "mask";
27
+ mask: PixelData;
28
+ };
29
+ export declare const SPECULAR_MIN_FRAMES = 6;
30
+ export declare const SPECULAR_WINDOW = 8;
31
+ export declare const GLOSS_MIN = 0.12;
32
+ export declare const STATIC_SCREEN_MIN = 0.85;
33
+ export declare const GRID_SCREEN_MIN = 0.45;
34
+ export declare const CORNER_SQUARE_MAX = 0.02;
35
+ export declare const clamp01: (x: number) => number;
36
+ export declare function lumaOf(p: PixelData): Float32Array;
37
+ export declare function cornerRadius(outline: CardOutline | null | undefined): number | null;
38
+ export declare const SPECULAR_SAMPLE: {
39
+ readonly width: 160;
40
+ readonly height: 100;
41
+ };
42
+ export declare function specularSample(crop: HTMLCanvasElement, box?: CardBox): CropSample;
43
+ export declare function nativeWindow(crop: HTMLCanvasElement, maxSide?: number): PixelData;
@@ -0,0 +1,6 @@
1
+ import { type PixelData } from "./authenticity";
2
+ export declare function gridPeriodicity(crop: PixelData, maxSide?: number): number;
3
+ export declare const PRINT_TEXTURE_MIN = 0.5;
4
+ export declare const MOIRE_ADVISORY_MIN = 0.55;
5
+ export declare function printTexture(crop: PixelData): number;
6
+ export declare function chromaResidualLevel(crop: PixelData): number;
@@ -0,0 +1,2 @@
1
+ import { type CropSample, type SpecularSignature } from "./authenticity";
2
+ export declare function specularSignature(cropSeries: readonly CropSample[]): SpecularSignature;
@@ -0,0 +1,21 @@
1
+ import type { CardDetection } from "./types";
2
+ import { type Box, type CornerResult, type Quad } from "./corners";
3
+ export declare const FOCAL_PRIOR = 0.72;
4
+ export type RegionReader = (sx: number, sy: number, sw: number, sh: number, w: number, h: number) => {
5
+ data: Uint8ClampedArray;
6
+ width: number;
7
+ height: number;
8
+ } | null;
9
+ export interface FrameCorners extends Omit<CornerResult, "quad"> {
10
+ quad: Quad | null;
11
+ ms?: number;
12
+ }
13
+ export declare function frameCorners(read: RegionReader, W: number, H: number, ks: number, b: Box, hint?: Quad | null): FrameCorners;
14
+ export declare function confirmsCard(c: Pick<CornerResult, "quad" | "support" | "confidence"> | null | undefined): boolean;
15
+ export declare const WEAK_CONFIRM = 0.45;
16
+ export declare function withCorners(det: CardDetection, read: RegionReader, W: number, H: number, ks: number, hint?: Quad | null): CardDetection;
17
+ export declare function canvasReader(source: CanvasImageSource, scratch: {
18
+ width: number;
19
+ height: number;
20
+ getContext(id: "2d", o?: object): unknown;
21
+ }): RegionReader;
@@ -0,0 +1,15 @@
1
+ import type { GraphModel, Tensor } from "@tensorflow/tfjs";
2
+ import type { CardDetection } from "./types";
3
+ type TF = typeof import("@tensorflow/tfjs");
4
+ export declare const CARD_SCORE_MIN = 0.6;
5
+ export declare const CARD_SCORE_FLOOR = 0.35;
6
+ export declare const CARD_CLASS_ID = 1;
7
+ export declare const DETECT_LONG_SIDE = 384;
8
+ export declare function detectSize(w: number, h: number, long?: number): {
9
+ w: number;
10
+ h: number;
11
+ };
12
+ export declare function detectWith(tf: TF, model: GraphModel, source: Parameters<TF["browser"]["fromPixels"]>[0], w0: number, h0: number): Promise<CardDetection>;
13
+ export declare function warmWith(tf: TF, model: GraphModel, h: number, w: number): Promise<void>;
14
+ export declare function pickCard(list: Tensor[], w: number, h: number): Promise<CardDetection>;
15
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { Pt, Quad } from "./corners";
2
+ export declare const area: (q: Quad) => number;
3
+ export declare function convex(q: Quad): boolean;
4
+ export declare const dist: (a: Pt, b: Pt) => number;
5
+ export declare function squareToQuad(q: Quad): number[];
6
+ export declare function pose(q: Quad, focal: number, cx: number, cy: number): {
7
+ aspect: number;
8
+ tilt: number;
9
+ };
10
+ export declare function canonical(q: Quad, focal: number, cx: number, cy: number): Quad;
@@ -0,0 +1,34 @@
1
+ import type { Gray } from "./corners";
2
+ export declare function grayOf(p: {
3
+ data: ArrayLike<number>;
4
+ width: number;
5
+ height: number;
6
+ }): Gray;
7
+ export interface Planes {
8
+ planes: Float32Array[];
9
+ width: number;
10
+ height: number;
11
+ }
12
+ export declare function planesOf(p: {
13
+ data: ArrayLike<number>;
14
+ width: number;
15
+ height: number;
16
+ }): Planes;
17
+ export interface Grad {
18
+ gx: Float32Array;
19
+ gy: Float32Array;
20
+ mag: Float32Array;
21
+ W: number;
22
+ H: number;
23
+ }
24
+ export declare function sobel(img: Gray | Planes): Grad;
25
+ export declare function quantile(mag: Float32Array, p: number): number;
26
+ export interface Edges {
27
+ x: Float32Array;
28
+ y: Float32Array;
29
+ nx: Float32Array;
30
+ ny: Float32Array;
31
+ m: Float32Array;
32
+ n: number;
33
+ }
34
+ export declare function thinEdges(G: Grad, t: number): Edges;
@@ -0,0 +1,12 @@
1
+ import type { Edges } from "./cornerImage";
2
+ import type { Box, Pt } from "./corners";
3
+ export interface Line {
4
+ nx: number;
5
+ ny: number;
6
+ c: number;
7
+ w: number;
8
+ }
9
+ export declare const PAIR_MAX_ANGLE: number, CROSS_MIN_ANGLE: number;
10
+ export declare function hough(E: Edges, W: number, H: number, cap: number, box: Box): Line[];
11
+ export declare function meet(a: Line, b: Line): Pt | null;
12
+ export declare function lineAngle(a: Line, b: Line): number;
@@ -0,0 +1,17 @@
1
+ import type { Edges, Grad } from "./cornerImage";
2
+ import { type Line } from "./cornerLines";
3
+ import { type Box, type CornerResult, type Quad } from "./corners";
4
+ export interface Scored {
5
+ quad: Quad;
6
+ support: [number, number, number, number];
7
+ contrast: number;
8
+ aspect: number;
9
+ tilt: number;
10
+ score: number;
11
+ }
12
+ export declare function score(G: Grad, q: Quad, box: Box, t: number, focal: number, cx: number, cy: number, W: number, H: number): Scored | null;
13
+ export declare function expandOut(G: Grad, s: Scored, lines: Line[], box: Box, t: number, focal: number, cx: number, cy: number, W: number, H: number): Scored;
14
+ export declare function polish(E: Edges, q: Quad, band: number): Quad | null;
15
+ export declare function result(s: Scored, via: "edges" | "hint"): CornerResult;
16
+ export declare const TRY_TOP = 5;
17
+ export declare function acceptable(s: Scored, trust?: boolean): boolean;
@@ -0,0 +1,60 @@
1
+ import { type Planes } from "./cornerImage";
2
+ export { type Planes, grayOf, planesOf } from "./cornerImage";
3
+ export { area, canonical, convex, pose, squareToQuad } from "./cornerGeometry";
4
+ export type Pt = {
5
+ x: number;
6
+ y: number;
7
+ };
8
+ export type Quad = [Pt, Pt, Pt, Pt];
9
+ export type Box = {
10
+ left: number;
11
+ top: number;
12
+ right: number;
13
+ bottom: number;
14
+ };
15
+ export interface Gray {
16
+ data: Float32Array;
17
+ width: number;
18
+ height: number;
19
+ }
20
+ export declare const ID1_ASPECT: number;
21
+ export declare const CROP_PAD = 0.15;
22
+ export declare const CROP_LONG = 320;
23
+ export declare const TILT_MAX = 65;
24
+ export declare const LOCK_SUPPORT = 0.6;
25
+ export declare const LOW_CONTRAST = 3.2;
26
+ export declare const aspectTolerance: (tilt: number) => number;
27
+ export type CornerReason = "small" | "no_edges" | "low_contrast" | "implausible";
28
+ export interface CornerResult {
29
+ quad: Quad | null;
30
+ support: [number, number, number, number];
31
+ locks: [boolean, boolean, boolean, boolean];
32
+ confidence: number;
33
+ tilt: number;
34
+ aspect: number;
35
+ contrast: number;
36
+ reason: CornerReason | null;
37
+ via: "edges" | "hint" | "model" | null;
38
+ }
39
+ export interface CornerOptions {
40
+ focal?: number;
41
+ cx?: number;
42
+ cy?: number;
43
+ hint?: Quad | null;
44
+ trustHint?: boolean;
45
+ debug?: Record<string, unknown>;
46
+ }
47
+ export declare const noCorners: (reason: CornerReason) => CornerResult;
48
+ export declare function findCorners(g: Gray | Planes, box: Box, opts?: CornerOptions): CornerResult;
49
+ export declare const BORDER_LOW = 4;
50
+ export declare const toCrop: (q: Quad, x0: number, y0: number, k: number) => Quad;
51
+ export declare const toFrame: (q: Quad, x0: number, y0: number, k: number) => Quad;
52
+ export declare function cropWindow(b: Box, W: number, H: number, pad?: number, long?: number): {
53
+ x0: number;
54
+ y0: number;
55
+ x1: number;
56
+ y1: number;
57
+ k: number;
58
+ w: number;
59
+ h: number;
60
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { DocumentEngine, ProgressFn } from "./types";
2
+ export { DETECT_LONG_SIDE, detectSize } from "./cardDetector";
3
+ export declare function guessLiveShape(portrait: boolean): {
4
+ w: number;
5
+ h: number;
6
+ };
7
+ export type DetectorChoice = "tiny" | "legacy";
8
+ export declare const DEFAULT_DETECTOR: DetectorChoice;
9
+ export declare const loadDocumentEngine: (modelsUrl: string, onProgress?: ProgressFn, detector?: DetectorChoice) => Promise<DocumentEngine>;
10
+ export declare function preload(modelsUrl: string, options?: {
11
+ onProgress?: ProgressFn;
12
+ detector?: DetectorChoice;
13
+ }): Promise<boolean>;
@@ -0,0 +1,5 @@
1
+ import type { EngineProgress, ProgressFn } from "./types";
2
+ export type TF = typeof import("@tensorflow/tfjs");
3
+ export declare function tfjs(): Promise<TF>;
4
+ export declare const READY: EngineProgress;
5
+ export declare function sharedLoader<T>(build: (url: string, onProgress: ProgressFn) => Promise<T>, name?: string): (key: string, onProgress?: ProgressFn) => Promise<T>;
@@ -0,0 +1,17 @@
1
+ import type { FaceEngine, ProgressFn } from "./types";
2
+ import type { FaceSignals } from "../liveness";
3
+ type Oval = {
4
+ cx: number;
5
+ cy: number;
6
+ rx: number;
7
+ ry: number;
8
+ };
9
+ export interface FaceDetection {
10
+ topLeft: [number, number];
11
+ bottomRight: [number, number];
12
+ landmarks: Array<[number, number]>;
13
+ }
14
+ export declare function signalsFromDetection(f: FaceDetection | null, W: number, H: number, brightness: number, oval: Oval): FaceSignals;
15
+ export declare function ovalContainment(pts: Array<[number, number]>, oval: Oval): number;
16
+ export declare const loadFaceEngine: (modelsUrl: string, onProgress?: ProgressFn) => Promise<FaceEngine>;
17
+ export {};
@@ -0,0 +1,7 @@
1
+ export type { CardDetection, SideResult, CropQuality, FaceCentering, DocumentEngine, FaceEngine, EngineProgress, ProgressFn, } from "./types";
2
+ export { loadDocumentEngine, preload, DEFAULT_DETECTOR, type DetectorChoice } from "./document";
3
+ export { DEFAULT_MODELS_URL, MODELS_VERSION, modelsUrlOf } from "./modelsCdn";
4
+ export { cachedModelFetch, MODEL_CACHE, DETECTOR_FOLDERS, SIDE_FOLDERS } from "./modelCache";
5
+ export { loadFaceEngine } from "./face";
6
+ export { cropQuality, cropCanvas } from "./quality";
7
+ export { specularSignature, gridPeriodicity, cornerRadius, type PixelData, type CropSample, type CardOutline, type SpecularSignature, } from "./authenticity";
@@ -0,0 +1,16 @@
1
+ export declare const MODEL_CACHE = "baas-id-models-v1";
2
+ export declare const DETECTOR_FOLDERS: readonly ["card-detector-q", "card-detector"];
3
+ export declare const SIDE_FOLDERS: readonly ["side-classifier-q", "side-classifier"];
4
+ export declare function modelUrls(base: string, folders: readonly string[]): string[];
5
+ export declare function fnv1a(s: string): string;
6
+ type CacheLike = Pick<Cache, "match" | "put" | "keys" | "delete">;
7
+ type Caches = {
8
+ open(name: string): Promise<CacheLike>;
9
+ };
10
+ export declare function cachedModelFetch(cachesImpl?: Caches | undefined, fetchImpl?: typeof fetch): typeof fetch;
11
+ export declare const versionedKey: (url: string, v: string) => string;
12
+ export declare function loadFirst<T>(urls: readonly string[], load: (url: string) => Promise<T>): Promise<{
13
+ model: T;
14
+ url: string;
15
+ }>;
16
+ export {};
@@ -0,0 +1,4 @@
1
+ export declare const MODELS_VERSION = "v-94761a7cf143";
2
+ export declare const MODELS_CDN = "https://baaslatam.com/sdk-models";
3
+ export declare const DEFAULT_MODELS_URL = "https://baaslatam.com/sdk-models/v-94761a7cf143";
4
+ export declare const modelsUrlOf: (url?: string | null) => string;
@@ -0,0 +1,10 @@
1
+ import type { CropQuality } from "./types";
2
+ export declare function cropQuality(crop: HTMLCanvasElement): CropQuality;
3
+ export declare function lightingOf(brightness: number): "good" | "too_dark" | "too_bright";
4
+ export declare function frameLuma(video: HTMLVideoElement): number;
5
+ export declare function cropCanvas(source: HTMLCanvasElement, box: {
6
+ left: number;
7
+ top: number;
8
+ right: number;
9
+ bottom: number;
10
+ }): HTMLCanvasElement;
@@ -0,0 +1,4 @@
1
+ import type { LayersModel } from "@tensorflow/tfjs";
2
+ type TF = typeof import("@tensorflow/tfjs");
3
+ export declare function classifyWith(tf: TF, model: LayersModel, source: Parameters<TF["browser"]["fromPixels"]>[0]): Promise<number>;
4
+ export {};
@@ -0,0 +1,21 @@
1
+ import type { TF } from "./engine";
2
+ export declare const TINY_OUTPUTS: string[];
3
+ export declare const TINY_SIZE = 224;
4
+ export interface TinyPhases {
5
+ import?: number;
6
+ backend: number;
7
+ fetch: number;
8
+ compile: number;
9
+ firstRun: number;
10
+ parallel: boolean;
11
+ where: "worker" | "main";
12
+ backendName: string;
13
+ }
14
+ export interface TinyCore {
15
+ run(pixels: Parameters<TF["browser"]["fromPixels"]>[0]): Promise<{
16
+ hm: Float32Array;
17
+ side: Float32Array;
18
+ }>;
19
+ phases: TinyPhases;
20
+ }
21
+ export declare function loadTinyCore(tf: TF, urls: string[], where: "worker" | "main", blank: () => Parameters<TF["browser"]["fromPixels"]>[0], onProgress?: (f: number) => void, backends?: string[]): Promise<TinyCore>;
@@ -0,0 +1,36 @@
1
+ import { type Quad } from "./corners";
2
+ import type { CardDetection, DocumentEngine, ProgressFn } from "./types";
3
+ export declare const TINY_FOLDERS: readonly ["card-tinydet-r4"];
4
+ export declare const TINY_INPUT = 224;
5
+ export declare const TINY_GRID = 28;
6
+ export declare const FOUND_PEAK = 0.03;
7
+ export declare const LOCK_PEAK = 0.05;
8
+ export declare const MIN_AREA_FRAC = 0.02;
9
+ export declare const EDGE_PRESENT = 0.25;
10
+ export interface Letterbox {
11
+ scale: number;
12
+ padX: number;
13
+ padY: number;
14
+ }
15
+ export declare function letterbox(w: number, h: number, S?: number): Letterbox;
16
+ export interface CornerPeak {
17
+ x: number;
18
+ y: number;
19
+ conf: number;
20
+ }
21
+ export declare function decodeHeatmaps(hm: ArrayLike<number>, G?: number): CornerPeak[];
22
+ export declare function frontProbability(logits: ArrayLike<number>): number;
23
+ export interface TinyReading {
24
+ quad: Quad;
25
+ conf: [number, number, number, number];
26
+ pFront: number;
27
+ found: boolean;
28
+ present: boolean;
29
+ }
30
+ export declare function readTiny(hm: ArrayLike<number>, sideLogits: ArrayLike<number>, w: number, h: number): TinyReading;
31
+ export declare function plausible(q: Quad, w: number, h: number): boolean;
32
+ export declare function tinyDetection(r: TinyReading, w: number, h: number, ms?: number): CardDetection;
33
+ export declare function rectifyCanvas(crop: HTMLCanvasElement, quad: Quad, margin: number, maxLong: number): HTMLCanvasElement;
34
+ export declare function buildTinyEngine(modelsUrl: string, onProgress: ProgressFn, opts?: {
35
+ worker?: boolean;
36
+ }): Promise<DocumentEngine>;
@@ -0,0 +1,62 @@
1
+ import type { FaceSignals } from "../liveness";
2
+ import type { EngineStage } from "../i18n";
3
+ import type { FrameCorners } from "./cardCorners";
4
+ import type { Quad } from "./corners";
5
+ export interface CardDetection {
6
+ found: boolean;
7
+ confidence: number;
8
+ box?: {
9
+ left: number;
10
+ top: number;
11
+ right: number;
12
+ bottom: number;
13
+ };
14
+ weak?: boolean;
15
+ corners?: FrameCorners;
16
+ }
17
+ export interface SideResult {
18
+ isFront: boolean;
19
+ confidence: number;
20
+ }
21
+ export interface CropQuality {
22
+ blurScore: number;
23
+ isBlurred: boolean;
24
+ glareRatio: number;
25
+ hasGlare: boolean;
26
+ brightness: number;
27
+ lighting: "good" | "too_dark" | "too_bright";
28
+ }
29
+ export interface FaceCentering {
30
+ found: boolean;
31
+ fill: number;
32
+ brightness: number;
33
+ lighting: "good" | "too_dark" | "too_bright";
34
+ }
35
+ export interface DocumentEngine {
36
+ backend: string;
37
+ phases?: Record<string, number | boolean | string>;
38
+ warm(w: number, h: number): Promise<void>;
39
+ detectCard(source: HTMLCanvasElement | HTMLVideoElement, srcW?: number, srcH?: number, opts?: DetectOptions): Promise<CardDetection>;
40
+ rectify(crop: HTMLCanvasElement, quad: Quad, margin: number, maxLong: number): Promise<HTMLCanvasElement>;
41
+ classifySide(crop: HTMLCanvasElement): Promise<SideResult>;
42
+ }
43
+ export interface DetectOptions {
44
+ corners?: {
45
+ ks: number;
46
+ hint?: Quad | null;
47
+ };
48
+ }
49
+ export interface FaceEngine {
50
+ signals(video: HTMLVideoElement, oval: {
51
+ cx: number;
52
+ cy: number;
53
+ rx: number;
54
+ ry: number;
55
+ }): Promise<FaceSignals>;
56
+ }
57
+ export interface EngineProgress {
58
+ fraction: number;
59
+ stage: EngineStage;
60
+ determinate: boolean;
61
+ }
62
+ export type ProgressFn = (p: EngineProgress) => void;
@@ -0,0 +1,18 @@
1
+ import { type Quad } from "./corners";
2
+ export declare const ID1_ASPECT: number;
3
+ export interface Rgba {
4
+ data: Uint8ClampedArray;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ export interface RgbaOut {
9
+ data: Uint8ClampedArray<ArrayBuffer>;
10
+ width: number;
11
+ height: number;
12
+ }
13
+ export declare function rectifiedSize(q: Quad, margin: number, maxLong: number): {
14
+ w: number;
15
+ h: number;
16
+ cardW: number;
17
+ };
18
+ export declare function warpCard(src: Rgba, q: Quad, outW: number, outH: number, margin: number): RgbaOut;
package/package.json ADDED
@@ -0,0 +1,104 @@
1
+ {
2
+ "name": "@baas-id/react",
3
+ "version": "0.2.2",
4
+ "description": "BaaS identity verification for React: guided ID and face capture with on-device quality gating, server-side verdicts, phone handoff. Requires a BaaS account.",
5
+ "license": "SEE LICENSE IN LICENSE.md",
6
+ "author": "BaaS, S.A.",
7
+ "contributors": [
8
+ {
9
+ "name": "Reporting Pal",
10
+ "email": "support@reporting-pal.com"
11
+ }
12
+ ],
13
+ "homepage": "https://baaslatam.com/desarrolladores",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://baaslatam.com/desarrolladores"
17
+ },
18
+ "bugs": {
19
+ "url": "https://baaslatam.com/desarrolladores",
20
+ "email": "support@reporting-pal.com"
21
+ },
22
+ "keywords": [
23
+ "identity verification",
24
+ "kyc",
25
+ "idv",
26
+ "liveness",
27
+ "face match",
28
+ "document capture",
29
+ "onboarding",
30
+ "react",
31
+ "baas"
32
+ ],
33
+ "type": "module",
34
+ "main": "./dist/esm/index.js",
35
+ "module": "./dist/esm/index.js",
36
+ "types": "./dist/types/index.d.ts",
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/types/index.d.ts",
40
+ "import": "./dist/esm/index.js",
41
+ "default": "./dist/esm/index.js"
42
+ },
43
+ "./preview": {
44
+ "types": "./dist/types/preview.d.ts",
45
+ "import": "./dist/esm/preview.js",
46
+ "default": "./dist/esm/preview.js"
47
+ },
48
+ "./continue": {
49
+ "types": "./dist/types/continue.d.ts",
50
+ "import": "./dist/esm/continue.js",
51
+ "default": "./dist/esm/continue.js"
52
+ },
53
+ "./styles.css": "./dist/esm/baas-id-react.css",
54
+ "./package.json": "./package.json"
55
+ },
56
+ "sideEffects": [
57
+ "**/*.css",
58
+ "./dist/esm/index.js",
59
+ "./dist/esm/preview.js",
60
+ "./dist/esm/continue.js",
61
+ "./src/react/styles/index.ts"
62
+ ],
63
+ "files": [
64
+ "dist/esm",
65
+ "dist/types",
66
+ "README.md",
67
+ "LICENSE.md",
68
+ "THIRD_PARTY_NOTICES.md"
69
+ ],
70
+ "engines": {
71
+ "node": ">=18"
72
+ },
73
+ "scripts": {
74
+ "build": "node scripts/build.mjs",
75
+ "prepack": "node scripts/build.mjs",
76
+ "models:version": "node scripts/models-version.mjs",
77
+ "bench": "vite",
78
+ "bench:build": "vite build",
79
+ "typecheck": "tsc --noEmit",
80
+ "test": "vitest run"
81
+ },
82
+ "dependencies": {
83
+ "@tensorflow/tfjs": "^4.22.0",
84
+ "@tensorflow-models/blazeface": "^0.1.0"
85
+ },
86
+ "peerDependencies": {
87
+ "react": ">=18",
88
+ "react-dom": ">=18"
89
+ },
90
+ "devDependencies": {
91
+ "@types/react": "^18.3.31",
92
+ "@types/react-dom": "^18.3.7",
93
+ "@vitejs/plugin-react": "^4.7.0",
94
+ "jsdom": "^25.0.1",
95
+ "react-dom": "^18.3.1",
96
+ "typescript": "^5.9.3",
97
+ "vite": "^5.4.21",
98
+ "vitest": "^2.1.9"
99
+ },
100
+ "publishConfig": {
101
+ "access": "public",
102
+ "provenance": true
103
+ }
104
+ }