alphavalid-sdk 0.0.24 → 0.1.0
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.
- package/README.md +73 -107
- package/bin/alphavalid.js +39 -0
- package/dist/__vite-browser-external-C7ivxuo1.mjs +18 -0
- package/dist/alphavalid.es.js +6542 -4887
- package/dist/alphavalid.umd.js +271 -223
- package/dist/core/camera.d.ts.map +1 -1
- package/dist/core/feedback.d.ts +102 -1
- package/dist/core/feedback.d.ts.map +1 -1
- package/dist/index.d.ts +100 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/setupModels-RA6BN3uf.mjs +19 -0
- package/dist/setupModels.d.ts +2 -0
- package/dist/setupModels.d.ts.map +1 -0
- package/dist/types/sdk.d.ts +358 -83
- package/dist/types/sdk.d.ts.map +1 -1
- package/dist/ui/baseStyles.d.ts +2 -0
- package/dist/ui/baseStyles.d.ts.map +1 -0
- package/dist/ui/captureButtonCoxinha.d.ts +13 -0
- package/dist/ui/captureButtonCoxinha.d.ts.map +1 -0
- package/dist/ui/containerStyles.d.ts +1 -0
- package/dist/ui/containerStyles.d.ts.map +1 -0
- package/dist/ui/loader.d.ts +15 -0
- package/dist/ui/loader.d.ts.map +1 -0
- package/dist/ui/overlay.d.ts +186 -1
- package/dist/ui/overlay.d.ts.map +1 -1
- package/dist/ui/overlayCoxinhaMobile.d.ts +10 -0
- package/dist/ui/overlayCoxinhaMobile.d.ts.map +1 -0
- package/dist/ui/userPreviewCoxinha.d.ts +20 -0
- package/dist/ui/userPreviewCoxinha.d.ts.map +1 -0
- package/dist/utils/canvas.d.ts +27 -0
- package/dist/utils/canvas.d.ts.map +1 -0
- package/dist/vision/faceDetector.d.ts.map +1 -1
- package/package.json +9 -2
- package/scripts/copy-models.cjs +17 -62
package/dist/ui/overlay.d.ts
CHANGED
|
@@ -12,7 +12,96 @@ export interface OverlayRenderInput {
|
|
|
12
12
|
height: number;
|
|
13
13
|
};
|
|
14
14
|
valid: boolean;
|
|
15
|
-
/** Optional:
|
|
15
|
+
/** Optional: current challenge direction for overlays that support it (e.g. Coxinha zoom hole). */
|
|
16
|
+
challenge?: {
|
|
17
|
+
direction?: 'left' | 'right' | 'up' | 'down' | 'zoomIn' | 'zoomOut';
|
|
18
|
+
};
|
|
19
|
+
/** Optional: structured debug info to be printed in an on-screen panel. */
|
|
20
|
+
debug?: {
|
|
21
|
+
status?: string;
|
|
22
|
+
ready?: boolean;
|
|
23
|
+
feedbackCode?: string;
|
|
24
|
+
challenge?: string;
|
|
25
|
+
faces?: number;
|
|
26
|
+
eyeL?: number;
|
|
27
|
+
eyeR?: number;
|
|
28
|
+
/** Total de piscadas detectadas desde que a câmera iniciou (start()). */
|
|
29
|
+
blinkCount?: number;
|
|
30
|
+
/** True quando ambos olhos estão abaixo do limiar de "fechado" (momento atual). */
|
|
31
|
+
blinkClosedNow?: boolean;
|
|
32
|
+
/** Limiar utilizado para considerar olho "fechado". */
|
|
33
|
+
blinkClosedThreshold?: number;
|
|
34
|
+
/** 0..1: progresso de hold do challenge atual (usado por overlays como o Coxinha). */
|
|
35
|
+
challengeHoldProgress?: number;
|
|
36
|
+
mouthAvg?: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
} | null;
|
|
40
|
+
jawMid?: {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
} | null;
|
|
44
|
+
faceH?: number | null;
|
|
45
|
+
mouthVsJawMidRaw?: number | null;
|
|
46
|
+
mouthVsJawMidClamped?: number | null;
|
|
47
|
+
/** Ratio de sorriso detectado (0..1) */
|
|
48
|
+
mouthSmileRatio?: number;
|
|
49
|
+
/** Ponto base da "queijo" (smile calibration) */
|
|
50
|
+
cheeseBaseline?: number;
|
|
51
|
+
/** Ponto alvo da "queijo" (smile calibration) */
|
|
52
|
+
cheeseTarget?: number;
|
|
53
|
+
/** Optional: allow hiding some debug rows without disabling the whole panel. */
|
|
54
|
+
debugDraw?: {
|
|
55
|
+
cheese?: boolean;
|
|
56
|
+
};
|
|
57
|
+
currentStep?: string | null;
|
|
58
|
+
stepPassed?: boolean;
|
|
59
|
+
/** Distâncias boca->olho (esquerdo/direito) e diferença média (debug opcional). */
|
|
60
|
+
jawEyeDistL?: number;
|
|
61
|
+
jawEyeDistR?: number;
|
|
62
|
+
jawEyeDistDiff?: number;
|
|
63
|
+
jawEyeDiffTol?: number;
|
|
64
|
+
/** Campo extra para flags customizadas vindas do debug do SDK. */
|
|
65
|
+
extra?: any;
|
|
66
|
+
/**
|
|
67
|
+
* Objeto de debug detalhado para todos os valores de boca (mouth)
|
|
68
|
+
*/
|
|
69
|
+
mouthDebug?: {
|
|
70
|
+
mouthPoints?: any;
|
|
71
|
+
mouthLeft?: any;
|
|
72
|
+
mouthRight?: any;
|
|
73
|
+
mouthUpper?: any;
|
|
74
|
+
mouthLower?: any;
|
|
75
|
+
mouthOpenPx?: number;
|
|
76
|
+
mouthOpenNorm?: number;
|
|
77
|
+
mouthJawLeftDist?: number;
|
|
78
|
+
mouthJawRightDist?: number;
|
|
79
|
+
mouthSmileRatio?: number;
|
|
80
|
+
mouthWidthRatio?: number;
|
|
81
|
+
mouthAvg?: any;
|
|
82
|
+
mouthVsJawMidRaw?: number;
|
|
83
|
+
mouthVsJawMidClamped?: number;
|
|
84
|
+
cheeseBaseline?: number;
|
|
85
|
+
cheeseTarget?: number;
|
|
86
|
+
mouthOpenRatio?: number;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
/** Optional: visual hint for challenges (e.g. arrow directions). */
|
|
90
|
+
hint?: {
|
|
91
|
+
type: 'arrow';
|
|
92
|
+
direction: 'left' | 'right' | 'up' | 'down';
|
|
93
|
+
intensity?: number;
|
|
94
|
+
label?: string;
|
|
95
|
+
} | {
|
|
96
|
+
type: 'pulse';
|
|
97
|
+
label?: string;
|
|
98
|
+
intensity?: number;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Optional: debug landmark points (normalized [0..1] *in video space*).
|
|
102
|
+
* IMPORTANT: when the <video> is rendered with object-fit: cover, the displayed region is cropped.
|
|
103
|
+
* The overlay must map video-space coordinates to container-space coordinates.
|
|
104
|
+
*/
|
|
16
105
|
landmarks?: {
|
|
17
106
|
leftEye?: Array<{
|
|
18
107
|
x: number;
|
|
@@ -30,6 +119,102 @@ export interface OverlayRenderInput {
|
|
|
30
119
|
x: number;
|
|
31
120
|
y: number;
|
|
32
121
|
};
|
|
122
|
+
/** Optional: nose tip (normalized video space) */
|
|
123
|
+
noseTip?: {
|
|
124
|
+
x: number;
|
|
125
|
+
y: number;
|
|
126
|
+
};
|
|
127
|
+
/** Optional: nose ridge/base points (normalized video space) */
|
|
128
|
+
nosePoints?: Array<{
|
|
129
|
+
x: number;
|
|
130
|
+
y: number;
|
|
131
|
+
}>;
|
|
132
|
+
/** Optional: outer mouth points (normalized video space) */
|
|
133
|
+
mouthPoints?: Array<{
|
|
134
|
+
x: number;
|
|
135
|
+
y: number;
|
|
136
|
+
}>;
|
|
137
|
+
/** Optional: mouth corners (normalized video space) */
|
|
138
|
+
mouthLeft?: {
|
|
139
|
+
x: number;
|
|
140
|
+
y: number;
|
|
141
|
+
};
|
|
142
|
+
mouthRight?: {
|
|
143
|
+
x: number;
|
|
144
|
+
y: number;
|
|
145
|
+
};
|
|
146
|
+
/** Optional: jawline polyline points (normalized video space) */
|
|
147
|
+
jawPoints?: Array<{
|
|
148
|
+
x: number;
|
|
149
|
+
y: number;
|
|
150
|
+
}>;
|
|
151
|
+
/** Optional: jaw side points (normalized video space) */
|
|
152
|
+
jawLeft?: {
|
|
153
|
+
x: number;
|
|
154
|
+
y: number;
|
|
155
|
+
};
|
|
156
|
+
jawRight?: {
|
|
157
|
+
x: number;
|
|
158
|
+
y: number;
|
|
159
|
+
};
|
|
160
|
+
/** Optional: jaw center (normalized video space) */
|
|
161
|
+
jawCenter?: {
|
|
162
|
+
x: number;
|
|
163
|
+
y: number;
|
|
164
|
+
};
|
|
165
|
+
/** Optional: distances (mouth corner to jaw side), normalized by eye distance */
|
|
166
|
+
mouthJawLeftDist?: number;
|
|
167
|
+
mouthJawRightDist?: number;
|
|
168
|
+
/** Pontos centrais do lábio superior (51) e inferior (57) (normalized video space). */
|
|
169
|
+
mouthUpper?: {
|
|
170
|
+
x: number;
|
|
171
|
+
y: number;
|
|
172
|
+
};
|
|
173
|
+
mouthLower?: {
|
|
174
|
+
x: number;
|
|
175
|
+
y: number;
|
|
176
|
+
};
|
|
177
|
+
/** Distância vertical absoluta (px) e normalizada por eyeDist entre lábio superior e inferior. */
|
|
178
|
+
mouthOpenPx?: number;
|
|
179
|
+
mouthOpenNorm?: number;
|
|
180
|
+
jawTopL?: {
|
|
181
|
+
x: number;
|
|
182
|
+
y: number;
|
|
183
|
+
};
|
|
184
|
+
jawTopR?: {
|
|
185
|
+
x: number;
|
|
186
|
+
y: number;
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Optional: provide the underlying <video> element so the overlay can compensate object-fit cropping.
|
|
191
|
+
* If omitted, overlay assumes video fills container 1:1 (may be wrong on cover/contain).
|
|
192
|
+
*/
|
|
193
|
+
video?: HTMLVideoElement;
|
|
194
|
+
/** Optional: override objectFit; if omitted we read computedStyle(video).objectFit (fallback: 'cover'). */
|
|
195
|
+
videoObjectFit?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';
|
|
196
|
+
/**
|
|
197
|
+
* If true, overlay will mirror X coordinates (use when the underlying <video> preview is mirrored).
|
|
198
|
+
* Default: auto-detect from computedStyle(video).transform.
|
|
199
|
+
*/
|
|
200
|
+
mirrored?: boolean;
|
|
201
|
+
/** If provided, draw a small analog-style axis widget showing face direction. */
|
|
202
|
+
poseVector?: {
|
|
203
|
+
/** -1..1: negative=left, positive=right (already in preview semantics if you want). */
|
|
204
|
+
x: number;
|
|
205
|
+
/** -1..1: negative=up, positive=down. */
|
|
206
|
+
y: number;
|
|
207
|
+
/** Optional: label shown under the widget (e.g. 'yawProxy' / 'center'). */
|
|
208
|
+
label?: string;
|
|
209
|
+
};
|
|
210
|
+
/** Fine-grained overlay debug toggles (allows the demo/app to enable only what it needs). */
|
|
211
|
+
landmarkDraw?: {
|
|
212
|
+
eyes?: boolean;
|
|
213
|
+
mouth?: boolean;
|
|
214
|
+
nose?: boolean;
|
|
215
|
+
jaw?: boolean;
|
|
216
|
+
mouthJaw?: boolean;
|
|
217
|
+
cheese?: boolean;
|
|
33
218
|
};
|
|
34
219
|
}
|
|
35
220
|
export declare function createOverlay(container: HTMLElement, guideCircleRatio?: number): OverlayHandle;
|
package/dist/ui/overlay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/ui/overlay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/ui/overlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { OverlayHandle } from './overlay';
|
|
2
|
+
/**
|
|
3
|
+
* Overlay "Coxinha Mobile" (inverted teardrop):
|
|
4
|
+
* - Máscara em formato de gota invertida, topo e base arredondados
|
|
5
|
+
* - Linhas guias centralizadas (vertical e horizontal)
|
|
6
|
+
* - Fundo glassmorphism
|
|
7
|
+
* - Pronto para integração com landmarks para checagem de alinhamento
|
|
8
|
+
*/
|
|
9
|
+
export declare function createOverlayCoxinhaMobile(container: HTMLElement): OverlayHandle;
|
|
10
|
+
//# sourceMappingURL=overlayCoxinhaMobile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlayCoxinhaMobile.d.ts","sourceRoot":"","sources":["../../src/ui/overlayCoxinhaMobile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgD,MAAM,WAAW,CAAC;AA0BxF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,WAAW,GAAG,aAAa,CA8oBhF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AlphaValidStartOptions } from '../types/sdk';
|
|
2
|
+
export type UserPreviewUiHandle = {
|
|
3
|
+
show: (srcUrl: string, metaText?: string) => void;
|
|
4
|
+
hide: () => void;
|
|
5
|
+
dispose: () => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function createUserPreviewCoxinhaUi(params: {
|
|
8
|
+
container: HTMLElement;
|
|
9
|
+
labels?: {
|
|
10
|
+
ok?: string;
|
|
11
|
+
retake?: string;
|
|
12
|
+
};
|
|
13
|
+
onOk: () => void;
|
|
14
|
+
onRetake: () => void;
|
|
15
|
+
}): UserPreviewUiHandle;
|
|
16
|
+
export declare function labelsFromStartOptions(options: AlphaValidStartOptions): {
|
|
17
|
+
ok: string | undefined;
|
|
18
|
+
retake: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=userPreviewCoxinha.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userPreviewCoxinha.d.ts","sourceRoot":"","sources":["../../src/ui/userPreviewCoxinha.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAOF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,SAAS,EAAE,WAAW,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,GAAG,mBAAmB,CA8GtB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB;;YAGpB,MAAM,GAAG,SAAS;EAEnE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare function clamp(v: number, a: number, b: number): number;
|
|
2
|
+
export declare function clamp01(v: number): number;
|
|
3
|
+
export declare function resizeToContainer(canvas: HTMLCanvasElement, container: HTMLElement, ctx?: CanvasRenderingContext2D): {
|
|
4
|
+
w: number;
|
|
5
|
+
h: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function getVideoToContainerMapper(w: number, h: number, video?: HTMLVideoElement, objectFit?: string, mirrored?: boolean): {
|
|
8
|
+
mapPt: (p: {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
}) => {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
};
|
|
15
|
+
mapRect: (r: {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
}) => {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=canvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../src/utils/canvas.ts"],"names":[],"mappings":"AAGA,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAGD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,wBAAwB;;;EAalH;AAGD,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,CAAC,EAAE,gBAAgB,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO;eAKH;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;;;;iBACtB;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;;;;;EAwCzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"faceDetector.d.ts","sourceRoot":"","sources":["../../src/vision/faceDetector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,cAAc,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvG;AA+BD,wBAAgB,kBAAkB,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"faceDetector.d.ts","sourceRoot":"","sources":["../../src/vision/faceDetector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,cAAc,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvG;AA+BD,wBAAgB,kBAAkB,IAAI,YAAY,CAsOjD"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alphavalid-sdk",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "SDK de validação facial e liveness",
|
|
5
5
|
"main": "dist/alphavalid.umd.js",
|
|
6
6
|
"module": "dist/alphavalid.es.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"alphavalid-sdk": "bin/alphavalid.js"
|
|
10
|
+
},
|
|
8
11
|
"files": [
|
|
9
12
|
"dist",
|
|
10
13
|
"models",
|
|
@@ -19,7 +22,11 @@
|
|
|
19
22
|
"types": "tsc -p tsconfig.json",
|
|
20
23
|
"build:all": "rm -rf dist && npm run build && npm run types",
|
|
21
24
|
"test:local": "vite preview",
|
|
22
|
-
"copy-models": "node ./scripts/copy-models.cjs"
|
|
25
|
+
"copy-models": "node ./scripts/copy-models.cjs",
|
|
26
|
+
"copy-models:demo": "node ./scripts/copy-models.cjs ./demo/public/alphavalid-models",
|
|
27
|
+
"demo:install": "cd demo && npm i",
|
|
28
|
+
"demo:dev": "cd demo && npm run dev",
|
|
29
|
+
"demo:preview": "cd demo && npm run preview"
|
|
23
30
|
},
|
|
24
31
|
"dependencies": {
|
|
25
32
|
"face-api.js": "^0.22.2"
|
package/scripts/copy-models.cjs
CHANGED
|
@@ -7,70 +7,25 @@
|
|
|
7
7
|
const fs = require('fs');
|
|
8
8
|
const path = require('path');
|
|
9
9
|
|
|
10
|
-
function
|
|
11
|
-
fs.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const destPath = path.join(dest, entry.name);
|
|
15
|
-
if (entry.isDirectory()) {
|
|
16
|
-
copyDir(srcPath, destPath);
|
|
17
|
-
} else {
|
|
18
|
-
fs.copyFileSync(srcPath, destPath);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
10
|
+
function detectProjectType() {
|
|
11
|
+
if (fs.existsSync('angular.json')) return 'angular';
|
|
12
|
+
if (fs.existsSync('vite.config.js') || fs.existsSync('vite.config.ts') || fs.existsSync('index.html') || fs.existsSync('public')) return 'vite';
|
|
13
|
+
return 'unknown';
|
|
21
14
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
for (const file of candidates) {
|
|
30
|
-
const manifestPath = path.join(destDir, file);
|
|
31
|
-
if (!fs.existsSync(manifestPath)) continue;
|
|
32
|
-
|
|
33
|
-
const raw = fs.readFileSync(manifestPath, 'utf8');
|
|
34
|
-
let patched = raw;
|
|
35
|
-
|
|
36
|
-
patched = patched.replaceAll('tiny_face_detector_model-shard1"', 'tiny_face_detector_model-shard1.bin"');
|
|
37
|
-
patched = patched.replaceAll('face_landmark_68_tiny_model-shard1"', 'face_landmark_68_tiny_model-shard1.bin"');
|
|
38
|
-
|
|
39
|
-
if (patched !== raw) fs.writeFileSync(manifestPath, patched);
|
|
40
|
-
}
|
|
15
|
+
function getTargetDir() {
|
|
16
|
+
const type = detectProjectType();
|
|
17
|
+
if (type === 'angular') return path.join('src', 'assets', 'alphavalid-models');
|
|
18
|
+
if (type === 'vite') return path.join('public', 'alphavalid-models');
|
|
19
|
+
return path.join('alphavalid-models');
|
|
41
20
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
['face_landmark_68_tiny_model-shard1', 'face_landmark_68_tiny_model-shard1.bin']
|
|
47
|
-
];
|
|
48
|
-
|
|
49
|
-
for (const [from, to] of renames) {
|
|
50
|
-
const oldShard = path.join(destDir, from);
|
|
51
|
-
const binShard = path.join(destDir, to);
|
|
52
|
-
if (fs.existsSync(oldShard) && !fs.existsSync(binShard)) {
|
|
53
|
-
fs.renameSync(oldShard, binShard);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const destArg = process.argv[2];
|
|
59
|
-
if (!destArg) {
|
|
60
|
-
console.error('Missing destination path. Example: node copy-models.cjs ./src/assets/alphavalid-models');
|
|
21
|
+
const src = path.join(__dirname, '../models');
|
|
22
|
+
const dest = path.resolve(process.cwd(), getTargetDir());
|
|
23
|
+
if (!fs.existsSync(src)) {
|
|
24
|
+
console.error('[AlphaValid] Pasta de models não encontrada:', src);
|
|
61
25
|
process.exit(1);
|
|
62
26
|
}
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
if (!fs.existsSync(srcModels)) {
|
|
67
|
-
console.error('models/ folder not found in package.');
|
|
68
|
-
process.exit(1);
|
|
27
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
28
|
+
for (const file of fs.readdirSync(src)) {
|
|
29
|
+
fs.copyFileSync(path.join(src, file), path.join(dest, file));
|
|
69
30
|
}
|
|
70
|
-
|
|
71
|
-
const dest = path.resolve(process.cwd(), destArg);
|
|
72
|
-
copyDir(srcModels, dest);
|
|
73
|
-
ensureBinShard(dest);
|
|
74
|
-
patchManifest(dest);
|
|
75
|
-
|
|
76
|
-
console.log(`[alphavalid-sdk] Models copied to: ${dest}`);
|
|
31
|
+
console.log(`[AlphaValid] Models copiados para ${dest}`);
|