mirror of https://github.com/vladmandic/human
add typedocs and types
parent
01990ad117
commit
6eb04b75e6
|
@ -38,6 +38,7 @@
|
||||||
"import/extensions": "off",
|
"import/extensions": "off",
|
||||||
"import/no-absolute-path": "off",
|
"import/no-absolute-path": "off",
|
||||||
"import/no-extraneous-dependencies": "off",
|
"import/no-extraneous-dependencies": "off",
|
||||||
|
"import/no-named-as-default": "off",
|
||||||
"import/no-unresolved": "off",
|
"import/no-unresolved": "off",
|
||||||
"import/prefer-default-export": "off",
|
"import/prefer-default-export": "off",
|
||||||
"lines-between-class-members": "off",
|
"lines-between-class-members": "off",
|
||||||
|
|
|
@ -9,6 +9,12 @@ Repository: **<git+https://github.com/vladmandic/human.git>**
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### **HEAD -> main** 2021/03/13 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
|
### **origin/main** 2021/03/13 mandic00@live.com
|
||||||
|
|
||||||
|
|
||||||
### **1.1.2** 2021/03/12 mandic00@live.com
|
### **1.1.2** 2021/03/12 mandic00@live.com
|
||||||
|
|
||||||
- distance based on minkowski space and limited euclidean space
|
- distance based on minkowski space and limited euclidean space
|
||||||
|
|
1
TODO.md
1
TODO.md
|
@ -23,7 +23,6 @@
|
||||||
|
|
||||||
## WiP Items
|
## WiP Items
|
||||||
|
|
||||||
- face.tensor should return image in correct aspect ratio
|
|
||||||
- box sizing on mobile
|
- box sizing on mobile
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -36,6 +36,7 @@
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"simple-git": "^2.36.2",
|
"simple-git": "^2.36.2",
|
||||||
"tslib": "^2.1.0",
|
"tslib": "^2.1.0",
|
||||||
|
"typedoc": "^0.20.30",
|
||||||
"typescript": "^4.2.3"
|
"typescript": "^4.2.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -928,6 +929,15 @@
|
||||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/at-least-node": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/balanced-match": {
|
"node_modules/balanced-match": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
|
@ -2112,6 +2122,27 @@
|
||||||
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
|
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/handlebars": {
|
||||||
|
"version": "4.7.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
|
||||||
|
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"minimist": "^1.2.5",
|
||||||
|
"neo-async": "^2.6.0",
|
||||||
|
"source-map": "^0.6.1",
|
||||||
|
"wordwrap": "^1.0.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"handlebars": "bin/handlebars"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.7"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"uglify-js": "^3.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has": {
|
"node_modules/has": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||||
|
@ -2274,6 +2305,15 @@
|
||||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/interpret": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-arrayish": {
|
"node_modules/is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
|
@ -2596,6 +2636,24 @@
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/lunr": {
|
||||||
|
"version": "2.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
|
||||||
|
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/marked": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"marked": "bin/marked"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 8.16.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/merge2": {
|
"node_modules/merge2": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||||
|
@ -2732,6 +2790,12 @@
|
||||||
"ms": "^2.1.1"
|
"ms": "^2.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/neo-async": {
|
||||||
|
"version": "2.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
||||||
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/node-fetch": {
|
"node_modules/node-fetch": {
|
||||||
"version": "2.6.1",
|
"version": "2.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
|
@ -2961,6 +3025,30 @@
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/onigasm": {
|
||||||
|
"version": "2.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
|
||||||
|
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"lru-cache": "^5.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/onigasm/node_modules/lru-cache": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"yallist": "^3.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/onigasm/node_modules/yallist": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/optionator": {
|
"node_modules/optionator": {
|
||||||
"version": "0.9.1",
|
"version": "0.9.1",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
||||||
|
@ -3281,6 +3369,18 @@
|
||||||
"node": ">=8.10.0"
|
"node": ">=8.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rechoir": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
||||||
|
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"resolve": "^1.1.6"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/regenerator-runtime": {
|
"node_modules/regenerator-runtime": {
|
||||||
"version": "0.13.7",
|
"version": "0.13.7",
|
||||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
||||||
|
@ -3452,6 +3552,33 @@
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/shelljs": {
|
||||||
|
"version": "0.8.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
|
||||||
|
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"glob": "^7.0.0",
|
||||||
|
"interpret": "^1.0.0",
|
||||||
|
"rechoir": "^0.6.2"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"shjs": "bin/shjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/shiki": {
|
||||||
|
"version": "0.9.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz",
|
||||||
|
"integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"onigasm": "^2.2.5",
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/signal-exit": {
|
"node_modules/signal-exit": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
||||||
|
@ -3846,6 +3973,88 @@
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/typedoc": {
|
||||||
|
"version": "0.20.30",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.30.tgz",
|
||||||
|
"integrity": "sha512-A4L6JDShPFwZDt9qp7FBsEpW7C6rA5fRv6ywgBuxGxZnT2wuF5afbWzmrwqHR3Xw38V1H2L4v/VJ0S/llBwV6Q==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"colors": "^1.4.0",
|
||||||
|
"fs-extra": "^9.1.0",
|
||||||
|
"handlebars": "^4.7.7",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"lunr": "^2.3.9",
|
||||||
|
"marked": "^2.0.1",
|
||||||
|
"minimatch": "^3.0.0",
|
||||||
|
"progress": "^2.0.3",
|
||||||
|
"shelljs": "^0.8.4",
|
||||||
|
"shiki": "^0.9.2",
|
||||||
|
"typedoc-default-themes": "^0.12.8"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"typedoc": "bin/typedoc"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.8.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"typescript": "3.9.x || 4.0.x || 4.1.x || 4.2.x"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typedoc-default-themes": {
|
||||||
|
"version": "0.12.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.8.tgz",
|
||||||
|
"integrity": "sha512-tyjyDTKy/JLnBSwvhoqd99VIjrP33SdOtwcMD32b+OqnrjZWe8HmZECbfBoacqoxjHd58gfeNw6wA7uvqWFa4w==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typedoc/node_modules/colors": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.1.90"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typedoc/node_modules/fs-extra": {
|
||||||
|
"version": "9.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||||
|
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"jsonfile": "^6.0.1",
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typedoc/node_modules/jsonfile": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"graceful-fs": "^4.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typedoc/node_modules/universalify": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/typescript": {
|
"node_modules/typescript": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
|
||||||
|
@ -3859,6 +4068,19 @@
|
||||||
"node": ">=4.2.0"
|
"node": ">=4.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/uglify-js": {
|
||||||
|
"version": "3.13.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.1.tgz",
|
||||||
|
"integrity": "sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"bin": {
|
||||||
|
"uglifyjs": "bin/uglifyjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/unbox-primitive": {
|
"node_modules/unbox-primitive": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
|
||||||
|
@ -3951,6 +4173,12 @@
|
||||||
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
|
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/vscode-textmate": {
|
||||||
|
"version": "5.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
|
||||||
|
"integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/vscode-uri": {
|
"node_modules/vscode-uri": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
|
||||||
|
@ -4006,6 +4234,12 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/wordwrap": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/wrap-ansi": {
|
"node_modules/wrap-ansi": {
|
||||||
"version": "7.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
|
@ -4820,6 +5054,12 @@
|
||||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"at-least-node": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"balanced-match": {
|
"balanced-match": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
|
@ -5755,6 +5995,19 @@
|
||||||
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
|
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"handlebars": {
|
||||||
|
"version": "4.7.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
|
||||||
|
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"minimist": "^1.2.5",
|
||||||
|
"neo-async": "^2.6.0",
|
||||||
|
"source-map": "^0.6.1",
|
||||||
|
"uglify-js": "^3.1.4",
|
||||||
|
"wordwrap": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"has": {
|
"has": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||||
|
@ -5883,6 +6136,12 @@
|
||||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"interpret": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"is-arrayish": {
|
"is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
|
@ -6121,6 +6380,18 @@
|
||||||
"yallist": "^4.0.0"
|
"yallist": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lunr": {
|
||||||
|
"version": "2.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
|
||||||
|
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"marked": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"merge2": {
|
"merge2": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||||
|
@ -6237,6 +6508,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"neo-async": {
|
||||||
|
"version": "2.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
|
||||||
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node-fetch": {
|
"node-fetch": {
|
||||||
"version": "2.6.1",
|
"version": "2.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
|
@ -6421,6 +6698,32 @@
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"onigasm": {
|
||||||
|
"version": "2.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
|
||||||
|
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lru-cache": "^5.1.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"lru-cache": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"yallist": "^3.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yallist": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"optionator": {
|
"optionator": {
|
||||||
"version": "0.9.1",
|
"version": "0.9.1",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
||||||
|
@ -6656,6 +6959,15 @@
|
||||||
"picomatch": "^2.2.1"
|
"picomatch": "^2.2.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rechoir": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
||||||
|
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"resolve": "^1.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"regenerator-runtime": {
|
"regenerator-runtime": {
|
||||||
"version": "0.13.7",
|
"version": "0.13.7",
|
||||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
||||||
|
@ -6773,6 +7085,27 @@
|
||||||
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"shelljs": {
|
||||||
|
"version": "0.8.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
|
||||||
|
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.0.0",
|
||||||
|
"interpret": "^1.0.0",
|
||||||
|
"rechoir": "^0.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shiki": {
|
||||||
|
"version": "0.9.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz",
|
||||||
|
"integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"onigasm": "^2.2.5",
|
||||||
|
"vscode-textmate": "^5.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"signal-exit": {
|
"signal-exit": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
||||||
|
@ -7095,12 +7428,80 @@
|
||||||
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
|
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"typedoc": {
|
||||||
|
"version": "0.20.30",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.30.tgz",
|
||||||
|
"integrity": "sha512-A4L6JDShPFwZDt9qp7FBsEpW7C6rA5fRv6ywgBuxGxZnT2wuF5afbWzmrwqHR3Xw38V1H2L4v/VJ0S/llBwV6Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"colors": "^1.4.0",
|
||||||
|
"fs-extra": "^9.1.0",
|
||||||
|
"handlebars": "^4.7.7",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"lunr": "^2.3.9",
|
||||||
|
"marked": "^2.0.1",
|
||||||
|
"minimatch": "^3.0.0",
|
||||||
|
"progress": "^2.0.3",
|
||||||
|
"shelljs": "^0.8.4",
|
||||||
|
"shiki": "^0.9.2",
|
||||||
|
"typedoc-default-themes": "^0.12.8"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"colors": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"fs-extra": {
|
||||||
|
"version": "9.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||||
|
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"jsonfile": "^6.0.1",
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jsonfile": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "^4.1.6",
|
||||||
|
"universalify": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"universalify": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"typedoc-default-themes": {
|
||||||
|
"version": "0.12.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.8.tgz",
|
||||||
|
"integrity": "sha512-tyjyDTKy/JLnBSwvhoqd99VIjrP33SdOtwcMD32b+OqnrjZWe8HmZECbfBoacqoxjHd58gfeNw6wA7uvqWFa4w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"typescript": {
|
"typescript": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
|
||||||
"integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
|
"integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"uglify-js": {
|
||||||
|
"version": "3.13.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.1.tgz",
|
||||||
|
"integrity": "sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"unbox-primitive": {
|
"unbox-primitive": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
|
||||||
|
@ -7187,6 +7588,12 @@
|
||||||
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
|
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"vscode-textmate": {
|
||||||
|
"version": "5.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
|
||||||
|
"integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"vscode-uri": {
|
"vscode-uri": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
|
||||||
|
@ -7230,6 +7637,12 @@
|
||||||
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
|
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"wordwrap": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"wrap-ansi": {
|
"wrap-ansi": {
|
||||||
"version": "7.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
"main": "dist/human.node.js",
|
"main": "dist/human.node.js",
|
||||||
"module": "dist/human.esm.js",
|
"module": "dist/human.esm.js",
|
||||||
"browser": "dist/human.esm.js",
|
"browser": "dist/human.esm.js",
|
||||||
"types": "types/human.d.ts",
|
"types": "types/src/human.d.ts",
|
||||||
"author": "Vladimir Mandic <mandic00@live.com>",
|
"author": "Vladimir Mandic <mandic00@live.com>",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/vladmandic/human/issues"
|
"url": "https://github.com/vladmandic/human/issues"
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught --no-deprecation demo/node.js",
|
"start": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught --no-deprecation demo/node.js",
|
||||||
"dev": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/serve.js",
|
"dev": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/serve.js",
|
||||||
"build": "rimraf dist/* && rimraf types/* && node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/build.js && node server/changelog.js",
|
"build": "rimraf dist/* types/* typedoc/* && node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/build.js",
|
||||||
"lint": "eslint src server demo",
|
"lint": "eslint src server demo",
|
||||||
"test": "npm run lint && npm run start"
|
"test": "npm run lint && npm run start"
|
||||||
},
|
},
|
||||||
|
@ -71,6 +71,7 @@
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"simple-git": "^2.36.2",
|
"simple-git": "^2.36.2",
|
||||||
"tslib": "^2.1.0",
|
"tslib": "^2.1.0",
|
||||||
|
"typedoc": "^0.20.30",
|
||||||
"typescript": "^4.2.3"
|
"typescript": "^4.2.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
#!/usr/bin/env -S node --trace-warnings
|
#!/usr/bin/env -S node --trace-warnings
|
||||||
|
|
||||||
|
const ts = require('typescript');
|
||||||
const log = require('@vladmandic/pilogger');
|
const log = require('@vladmandic/pilogger');
|
||||||
const esbuild = require('esbuild');
|
const esbuild = require('esbuild');
|
||||||
const ts = require('typescript');
|
const TypeDoc = require('typedoc');
|
||||||
|
const changelog = require('./changelog');
|
||||||
|
|
||||||
// keeps esbuild service instance cached
|
// keeps esbuild service instance cached
|
||||||
let busy = false;
|
let busy = false;
|
||||||
|
let td = null;
|
||||||
const banner = { js: `
|
const banner = { js: `
|
||||||
/*
|
/*
|
||||||
Human library
|
Human library
|
||||||
|
@ -172,7 +175,7 @@ async function getStats(json) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// rebuild typings
|
// rebuild typings
|
||||||
function compile(entryPoint, options) {
|
async function compile(entryPoint, options) {
|
||||||
log.info('Compile typings:', entryPoint);
|
log.info('Compile typings:', entryPoint);
|
||||||
const program = ts.createProgram(entryPoint, options);
|
const program = ts.createProgram(entryPoint, options);
|
||||||
const emit = program.emit();
|
const emit = program.emit();
|
||||||
|
@ -192,6 +195,18 @@ function compile(entryPoint, options) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function typedoc(entryPoint) {
|
||||||
|
log.info('Generate TypeDocs:', entryPoint);
|
||||||
|
if (!td) {
|
||||||
|
td = new TypeDoc.Application();
|
||||||
|
td.options.addReader(new TypeDoc.TSConfigReader());
|
||||||
|
td.bootstrap({ entryPoints: entryPoint });
|
||||||
|
}
|
||||||
|
const project = td.convert();
|
||||||
|
const result = project ? await td.generateDocs(project, 'typedoc') : null;
|
||||||
|
if (result) log.warn('TypeDoc:', result);
|
||||||
|
}
|
||||||
|
|
||||||
// rebuild on file change
|
// rebuild on file change
|
||||||
async function build(f, msg, dev = false) {
|
async function build(f, msg, dev = false) {
|
||||||
if (busy) {
|
if (busy) {
|
||||||
|
@ -217,8 +232,12 @@ async function build(f, msg, dev = false) {
|
||||||
log.state(`Build for: ${targetGroupName} type: ${targetName}:`, stats);
|
log.state(`Build for: ${targetGroupName} type: ${targetName}:`, stats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// generate typings
|
if (!dev) {
|
||||||
compile(targets.browserBundle.esm.entryPoints, tsconfig);
|
// generate typings & typedoc only when run as explict build
|
||||||
|
await compile(targets.browserBundle.esm.entryPoints, tsconfig);
|
||||||
|
await changelog.update('../CHANGELOG.md');
|
||||||
|
await typedoc(targets.browserBundle.esm.entryPoints);
|
||||||
|
}
|
||||||
if (require.main === module) process.exit(0);
|
if (require.main === module) process.exit(0);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// catch errors and print where it occured
|
// catch errors and print where it occured
|
||||||
|
|
|
@ -45,15 +45,11 @@ async function update(f) {
|
||||||
|
|
||||||
const name = path.join(__dirname, f);
|
const name = path.join(__dirname, f);
|
||||||
fs.writeFileSync(name, text);
|
fs.writeFileSync(name, text);
|
||||||
logger.state('Change log updated:', name);
|
logger.info('Update Change log:', [name]);
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.update = update;
|
if (require.main === module) {
|
||||||
|
update('../CHANGELOG.md');
|
||||||
try {
|
} else {
|
||||||
if (require.main === module) {
|
exports.update = update;
|
||||||
update('../CHANGELOG.md');
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
//
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ const options = {
|
||||||
httpsPort: 10031,
|
httpsPort: 10031,
|
||||||
insecureHTTPParser: false,
|
insecureHTTPParser: false,
|
||||||
minElapsed: 2,
|
minElapsed: 2,
|
||||||
monitor: ['package.json', 'config.js', 'demo', 'src'],
|
monitor: ['package.json', 'config.ts', 'demo', 'src'],
|
||||||
};
|
};
|
||||||
|
|
||||||
// just some predefined mime types
|
// just some predefined mime types
|
||||||
|
|
|
@ -13,9 +13,9 @@ export class MediaPipeFaceMesh {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
async estimateFaces(input, config) {
|
async estimateFaces(input, config): Promise<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }[]> {
|
||||||
const predictions = await this.facePipeline.predict(input, config);
|
const predictions = await this.facePipeline.predict(input, config);
|
||||||
const results: Array<{}> = [];
|
const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];
|
||||||
for (const prediction of (predictions || [])) {
|
for (const prediction of (predictions || [])) {
|
||||||
if (prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing
|
if (prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing
|
||||||
const mesh = prediction.coords ? prediction.coords.arraySync() : [];
|
const mesh = prediction.coords ? prediction.coords.arraySync() : [];
|
||||||
|
|
32
src/draw.ts
32
src/draw.ts
|
@ -2,22 +2,22 @@ import config from '../config';
|
||||||
import { TRI468 as triangulation } from './blazeface/coords';
|
import { TRI468 as triangulation } from './blazeface/coords';
|
||||||
|
|
||||||
export const options = {
|
export const options = {
|
||||||
color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
|
color: <string>'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
|
||||||
labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel
|
labelColor: <string>'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel
|
||||||
shadowColor: 'black',
|
shadowColor: <string>'black',
|
||||||
font: 'small-caps 16px "Segoe UI"',
|
font: <string>'small-caps 16px "Segoe UI"',
|
||||||
lineHeight: 20,
|
lineHeight: <number>20,
|
||||||
lineWidth: 6,
|
lineWidth: <number>6,
|
||||||
pointSize: 2,
|
pointSize: <number>2,
|
||||||
roundRect: 28,
|
roundRect: <number>28,
|
||||||
drawPoints: false,
|
drawPoints: <Boolean>false,
|
||||||
drawLabels: true,
|
drawLabels: <Boolean>true,
|
||||||
drawBoxes: true,
|
drawBoxes: <Boolean>true,
|
||||||
drawPolygons: true,
|
drawPolygons: <Boolean>true,
|
||||||
fillPolygons: false,
|
fillPolygons: <Boolean>false,
|
||||||
useDepth: true,
|
useDepth: <Boolean>true,
|
||||||
useCurves: false,
|
useCurves: <Boolean>false,
|
||||||
bufferedOutput: false,
|
bufferedOutput: <Boolean>false,
|
||||||
};
|
};
|
||||||
|
|
||||||
function point(ctx, x, y, z = null) {
|
function point(ctx, x, y, z = null) {
|
||||||
|
|
172
src/human.ts
172
src/human.ts
|
@ -24,6 +24,48 @@ const now = () => {
|
||||||
return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());
|
return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Tensor = {};
|
||||||
|
type Model = {};
|
||||||
|
export type Result = {
|
||||||
|
face: Array<{
|
||||||
|
confidence: Number,
|
||||||
|
boxConfidence: Number,
|
||||||
|
faceConfidence: Number,
|
||||||
|
box: [Number, Number, Number, Number],
|
||||||
|
mesh: Array<[Number, Number, Number]>
|
||||||
|
meshRaw: Array<[Number, Number, Number]>
|
||||||
|
boxRaw: [Number, Number, Number, Number],
|
||||||
|
annotations: any,
|
||||||
|
age: Number,
|
||||||
|
gender: String,
|
||||||
|
genderConfidence: Number,
|
||||||
|
emotion: String,
|
||||||
|
embedding: any,
|
||||||
|
iris: Number,
|
||||||
|
angle: { roll: Number | null, yaw: Number | null, pitch: Number | null },
|
||||||
|
}>,
|
||||||
|
body: Array<{
|
||||||
|
id: Number,
|
||||||
|
part: String,
|
||||||
|
position: { x: Number, y: Number, z: Number },
|
||||||
|
score: Number,
|
||||||
|
presence: Number }>,
|
||||||
|
hand: Array<{
|
||||||
|
confidence: Number,
|
||||||
|
box: any,
|
||||||
|
landmarks: any,
|
||||||
|
annotations: any,
|
||||||
|
}>,
|
||||||
|
gesture: Array<{
|
||||||
|
part: String,
|
||||||
|
gesture: String,
|
||||||
|
}>,
|
||||||
|
performance: { any },
|
||||||
|
canvas: OffscreenCanvas | HTMLCanvasElement,
|
||||||
|
}
|
||||||
|
|
||||||
|
export type { default as Config } from '../config';
|
||||||
|
|
||||||
// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides
|
// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides
|
||||||
function mergeDeep(...objects) {
|
function mergeDeep(...objects) {
|
||||||
const isObject = (obj) => obj && typeof obj === 'object';
|
const isObject = (obj) => obj && typeof obj === 'object';
|
||||||
|
@ -39,25 +81,25 @@ function mergeDeep(...objects) {
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
class Human {
|
export class Human {
|
||||||
version: string;
|
version: String;
|
||||||
config: typeof config.default;
|
config: typeof config.default;
|
||||||
state: string;
|
state: String;
|
||||||
image: { tensor: typeof tf.Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
|
image: { tensor: Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
|
||||||
// classes
|
// classes
|
||||||
tf: typeof tf;
|
tf: typeof tf;
|
||||||
draw: typeof draw;
|
draw: { options?: typeof draw.options, gesture: Function, face: Function, body: Function, hand: Function, canvas: Function, all: Function };
|
||||||
// models
|
// models
|
||||||
models: {
|
models: {
|
||||||
face,
|
face: facemesh.MediaPipeFaceMesh | null,
|
||||||
posenet,
|
posenet: posenet.PoseNet | null,
|
||||||
blazepose,
|
blazepose: Model | null,
|
||||||
handpose,
|
handpose: handpose.HandPose | null,
|
||||||
iris,
|
iris: Model | null,
|
||||||
age,
|
age: Model | null,
|
||||||
gender,
|
gender: Model | null,
|
||||||
emotion,
|
emotion: Model | null,
|
||||||
embedding,
|
embedding: Model | null,
|
||||||
};
|
};
|
||||||
classes: {
|
classes: {
|
||||||
facemesh: typeof facemesh;
|
facemesh: typeof facemesh;
|
||||||
|
@ -67,13 +109,13 @@ class Human {
|
||||||
body: typeof posenet | typeof blazepose;
|
body: typeof posenet | typeof blazepose;
|
||||||
hand: typeof handpose;
|
hand: typeof handpose;
|
||||||
};
|
};
|
||||||
sysinfo: { platform: string, agent: string };
|
sysinfo: { platform: String, agent: String };
|
||||||
#package: any;
|
#package: any;
|
||||||
#perf: any;
|
#perf: any;
|
||||||
#numTensors: number;
|
#numTensors: number;
|
||||||
#analyzeMemoryLeaks: boolean;
|
#analyzeMemoryLeaks: Boolean;
|
||||||
#checkSanity: boolean;
|
#checkSanity: Boolean;
|
||||||
#firstRun: boolean;
|
#firstRun: Boolean;
|
||||||
// definition end
|
// definition end
|
||||||
|
|
||||||
constructor(userConfig = {}) {
|
constructor(userConfig = {}) {
|
||||||
|
@ -102,7 +144,7 @@ class Human {
|
||||||
};
|
};
|
||||||
// export access to image processing
|
// export access to image processing
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
this.image = (input: tf.Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas) => image.process(input, this.config);
|
this.image = (input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas) => image.process(input, this.config);
|
||||||
// export raw access to underlying models
|
// export raw access to underlying models
|
||||||
this.classes = {
|
this.classes = {
|
||||||
facemesh,
|
facemesh,
|
||||||
|
@ -122,6 +164,7 @@ class Human {
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper function: measure tensor leak
|
// helper function: measure tensor leak
|
||||||
|
/** @hidden */
|
||||||
#analyze = (...msg) => {
|
#analyze = (...msg) => {
|
||||||
if (!this.#analyzeMemoryLeaks) return;
|
if (!this.#analyzeMemoryLeaks) return;
|
||||||
const current = this.tf.engine().state.numTensors;
|
const current = this.tf.engine().state.numTensors;
|
||||||
|
@ -132,12 +175,11 @@ class Human {
|
||||||
}
|
}
|
||||||
|
|
||||||
// quick sanity check on inputs
|
// quick sanity check on inputs
|
||||||
#sanity = (input): null | string => {
|
/** @hidden */
|
||||||
|
#sanity = (input): null | String => {
|
||||||
if (!this.#checkSanity) return null;
|
if (!this.#checkSanity) return null;
|
||||||
if (!input) return 'input is not defined';
|
if (!input) return 'input is not defined';
|
||||||
if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) {
|
if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';
|
||||||
return 'input must be a tensor';
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
this.tf.getBackend();
|
this.tf.getBackend();
|
||||||
} catch {
|
} catch {
|
||||||
|
@ -146,18 +188,18 @@ class Human {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
simmilarity(embedding1: Array<number>, embedding2: Array<number>): number {
|
simmilarity(embedding1: Array<Number>, embedding2: Array<Number>): Number {
|
||||||
if (this.config.face.embedding.enabled) return embedding.simmilarity(embedding1, embedding2);
|
if (this.config.face.embedding.enabled) return embedding.simmilarity(embedding1, embedding2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
enhance(input: typeof tf.Tensor): typeof tf.Tensor | null {
|
enhance(input: Tensor): Tensor | null {
|
||||||
if (this.config.face.embedding.enabled) return embedding.enhance(input);
|
if (this.config.face.embedding.enabled) return embedding.enhance(input);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// preload models, not explicitly required as it's done automatically on first use
|
// preload models, not explicitly required as it's done automatically on first use
|
||||||
async load(userConfig = null) {
|
async load(userConfig: Object = {}) {
|
||||||
this.state = 'load';
|
this.state = 'load';
|
||||||
const timeStamp = now();
|
const timeStamp = now();
|
||||||
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
||||||
|
@ -215,6 +257,7 @@ class Human {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if backend needs initialization if it changed
|
// check if backend needs initialization if it changed
|
||||||
|
/** @hidden */
|
||||||
#checkBackend = async (force = false) => {
|
#checkBackend = async (force = false) => {
|
||||||
if (this.config.backend && (this.config.backend !== '') && force || (this.tf.getBackend() !== this.config.backend)) {
|
if (this.config.backend && (this.config.backend !== '') && force || (this.tf.getBackend() !== this.config.backend)) {
|
||||||
const timeStamp = now();
|
const timeStamp = now();
|
||||||
|
@ -267,7 +310,8 @@ class Human {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#calculateFaceAngle = (mesh): { roll: number | null, yaw: number | null, pitch: number | null } => {
|
/** @hidden */
|
||||||
|
#calculateFaceAngle = (mesh): { roll: Number | null, yaw: Number | null, pitch: Number | null } => {
|
||||||
if (!mesh || mesh.length < 300) return { roll: null, yaw: null, pitch: null };
|
if (!mesh || mesh.length < 300) return { roll: null, yaw: null, pitch: null };
|
||||||
const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);
|
const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);
|
||||||
// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
|
// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
|
||||||
|
@ -285,6 +329,7 @@ class Human {
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hidden */
|
||||||
#detectFace = async (input): Promise<any> => {
|
#detectFace = async (input): Promise<any> => {
|
||||||
// run facemesh, includes blazeface and iris
|
// run facemesh, includes blazeface and iris
|
||||||
// eslint-disable-next-line no-async-promise-executor
|
// eslint-disable-next-line no-async-promise-executor
|
||||||
|
@ -294,27 +339,29 @@ class Human {
|
||||||
let emotionRes;
|
let emotionRes;
|
||||||
let embeddingRes;
|
let embeddingRes;
|
||||||
const faceRes: Array<{
|
const faceRes: Array<{
|
||||||
confidence: number,
|
confidence: Number,
|
||||||
boxConfidence: number,
|
boxConfidence: Number,
|
||||||
faceConfidence: number,
|
faceConfidence: Number,
|
||||||
box: [number, number, number, number],
|
box: [Number, Number, Number, Number],
|
||||||
mesh: Array<[number, number, number]>
|
mesh: Array<[Number, Number, Number]>
|
||||||
meshRaw: Array<[number, number, number]>
|
meshRaw: Array<[Number, Number, Number]>
|
||||||
boxRaw: [number, number, number, number],
|
boxRaw: [Number, Number, Number, Number],
|
||||||
annotations: any,
|
annotations: any,
|
||||||
age: number,
|
age: Number,
|
||||||
gender: string,
|
gender: String,
|
||||||
genderConfidence: number,
|
genderConfidence: Number,
|
||||||
emotion: string,
|
emotion: String,
|
||||||
embedding: any,
|
embedding: any,
|
||||||
iris: number,
|
iris: Number,
|
||||||
angle: { roll: number | null, yaw: number | null, pitch: number | null },
|
angle: { roll: Number | null, yaw: Number | null, pitch: Number | null },
|
||||||
|
tensor: Tensor,
|
||||||
}> = [];
|
}> = [];
|
||||||
|
|
||||||
this.state = 'run:face';
|
this.state = 'run:face';
|
||||||
timeStamp = now();
|
timeStamp = now();
|
||||||
const faces = await this.models.face?.estimateFaces(input, this.config);
|
const faces = await this.models.face?.estimateFaces(input, this.config);
|
||||||
this.#perf.face = Math.trunc(now() - timeStamp);
|
this.#perf.face = Math.trunc(now() - timeStamp);
|
||||||
|
if (!faces) return [];
|
||||||
for (const face of faces) {
|
for (const face of faces) {
|
||||||
this.#analyze('Get Face');
|
this.#analyze('Get Face');
|
||||||
|
|
||||||
|
@ -418,45 +465,7 @@ class Human {
|
||||||
}
|
}
|
||||||
|
|
||||||
// main detect function
|
// main detect function
|
||||||
async detect(input, userConfig = {}): Promise<{
|
async detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig: Object = {}): Promise<Result | { error: String }> {
|
||||||
face: Array<{
|
|
||||||
confidence: number,
|
|
||||||
boxConfidence: number,
|
|
||||||
faceConfidence: number,
|
|
||||||
box: [number, number, number, number],
|
|
||||||
mesh: Array<[number, number, number]>
|
|
||||||
meshRaw: Array<[number, number, number]>
|
|
||||||
boxRaw: [number, number, number, number],
|
|
||||||
annotations: any,
|
|
||||||
age: number,
|
|
||||||
gender: string,
|
|
||||||
genderConfidence: number,
|
|
||||||
emotion: string,
|
|
||||||
embedding: any,
|
|
||||||
iris: number,
|
|
||||||
angle: { roll: number | null, yaw: number | null, pitch: number | null },
|
|
||||||
}>,
|
|
||||||
body: Array<{
|
|
||||||
id: number,
|
|
||||||
part: string,
|
|
||||||
position: { x: number, y: number, z: number },
|
|
||||||
score: number,
|
|
||||||
presence: number }>,
|
|
||||||
hand: Array<{
|
|
||||||
confidence: number,
|
|
||||||
box: any,
|
|
||||||
landmarks: any,
|
|
||||||
annotations: any,
|
|
||||||
}>,
|
|
||||||
gesture: Array<{
|
|
||||||
part: string,
|
|
||||||
gesture: string,
|
|
||||||
}>,
|
|
||||||
performance: { any },
|
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement
|
|
||||||
} | { error: string }> {
|
|
||||||
// end definition
|
|
||||||
|
|
||||||
// detection happens inside a promise
|
// detection happens inside a promise
|
||||||
return new Promise(async (resolve) => {
|
return new Promise(async (resolve) => {
|
||||||
this.state = 'config';
|
this.state = 'config';
|
||||||
|
@ -562,6 +571,7 @@ class Human {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hidden */
|
||||||
#warmupBitmap = async () => {
|
#warmupBitmap = async () => {
|
||||||
const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());
|
const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());
|
||||||
let blob;
|
let blob;
|
||||||
|
@ -579,6 +589,7 @@ class Human {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @hidden */
|
||||||
#warmupCanvas = async () => new Promise((resolve) => {
|
#warmupCanvas = async () => new Promise((resolve) => {
|
||||||
let src;
|
let src;
|
||||||
let size = 0;
|
let size = 0;
|
||||||
|
@ -611,6 +622,7 @@ class Human {
|
||||||
else resolve(null);
|
else resolve(null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/** @hidden */
|
||||||
#warmupNode = async () => {
|
#warmupNode = async () => {
|
||||||
const atob = (str) => Buffer.from(str, 'base64');
|
const atob = (str) => Buffer.from(str, 'base64');
|
||||||
const img = this.config.warmup === 'face' ? atob(sample.face) : atob(sample.body);
|
const img = this.config.warmup === 'face' ? atob(sample.face) : atob(sample.body);
|
||||||
|
@ -624,7 +636,7 @@ class Human {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
async warmup(userConfig): Promise<{ face, body, hand, gesture, performance, canvas } | { error }> {
|
async warmup(userConfig: Object = {}): Promise<Result | { error }> {
|
||||||
const t0 = now();
|
const t0 = now();
|
||||||
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
||||||
const video = this.config.videoOptimized;
|
const video = this.config.videoOptimized;
|
||||||
|
|
|
@ -22,4 +22,19 @@
|
||||||
},
|
},
|
||||||
"formatCodeOptions": { "indentSize": 2, "tabSize": 2 },
|
"formatCodeOptions": { "indentSize": 2, "tabSize": 2 },
|
||||||
"include": ["src/*", "src/***/*", "demo/*"],
|
"include": ["src/*", "src/***/*", "demo/*"],
|
||||||
|
"typedocOptions": {
|
||||||
|
"excludePrivate": true,
|
||||||
|
"excludeExternals": true,
|
||||||
|
"excludeProtected": true,
|
||||||
|
"excludeInternal": true,
|
||||||
|
"disableSources": true,
|
||||||
|
"gitRevision": "main",
|
||||||
|
"hideGenerator": "true",
|
||||||
|
"theme": "default",
|
||||||
|
"readme": "none",
|
||||||
|
"out": "typedoc",
|
||||||
|
"entryPoints": "src/human.ts",
|
||||||
|
"logLevel": "Error",
|
||||||
|
"logger": "none"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 9.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Binary file not shown.
After Width: | Height: | Size: 480 B |
Binary file not shown.
After Width: | Height: | Size: 855 B |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,7 +0,0 @@
|
||||||
export declare class MediaPipeFaceMesh {
|
|
||||||
facePipeline: any;
|
|
||||||
config: any;
|
|
||||||
constructor(blazeFace: any, blazeMeshModel: any, irisModel: any, config: any);
|
|
||||||
estimateFaces(input: any, config: any): Promise<{}[]>;
|
|
||||||
}
|
|
||||||
export declare function load(config: any): Promise<MediaPipeFaceMesh>;
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
declare const _default: {
|
||||||
|
backend: string;
|
||||||
|
wasmPath: string;
|
||||||
|
debug: boolean;
|
||||||
|
async: boolean;
|
||||||
|
profile: boolean;
|
||||||
|
deallocate: boolean;
|
||||||
|
scoped: boolean;
|
||||||
|
videoOptimized: boolean;
|
||||||
|
warmup: string;
|
||||||
|
filter: {
|
||||||
|
enabled: boolean;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
return: boolean;
|
||||||
|
brightness: number;
|
||||||
|
contrast: number;
|
||||||
|
sharpness: number;
|
||||||
|
blur: number;
|
||||||
|
saturation: number;
|
||||||
|
hue: number;
|
||||||
|
negative: boolean;
|
||||||
|
sepia: boolean;
|
||||||
|
vintage: boolean;
|
||||||
|
kodachrome: boolean;
|
||||||
|
technicolor: boolean;
|
||||||
|
polaroid: boolean;
|
||||||
|
pixelate: number;
|
||||||
|
};
|
||||||
|
gesture: {
|
||||||
|
enabled: boolean;
|
||||||
|
};
|
||||||
|
face: {
|
||||||
|
enabled: boolean;
|
||||||
|
detector: {
|
||||||
|
modelPath: string;
|
||||||
|
rotation: boolean;
|
||||||
|
maxFaces: number;
|
||||||
|
skipFrames: number;
|
||||||
|
skipInitial: boolean;
|
||||||
|
minConfidence: number;
|
||||||
|
iouThreshold: number;
|
||||||
|
scoreThreshold: number;
|
||||||
|
return: boolean;
|
||||||
|
};
|
||||||
|
mesh: {
|
||||||
|
enabled: boolean;
|
||||||
|
modelPath: string;
|
||||||
|
};
|
||||||
|
iris: {
|
||||||
|
enabled: boolean;
|
||||||
|
modelPath: string;
|
||||||
|
};
|
||||||
|
age: {
|
||||||
|
enabled: boolean;
|
||||||
|
modelPath: string;
|
||||||
|
skipFrames: number;
|
||||||
|
};
|
||||||
|
gender: {
|
||||||
|
enabled: boolean;
|
||||||
|
minConfidence: number;
|
||||||
|
modelPath: string;
|
||||||
|
skipFrames: number;
|
||||||
|
};
|
||||||
|
emotion: {
|
||||||
|
enabled: boolean;
|
||||||
|
minConfidence: number;
|
||||||
|
skipFrames: number;
|
||||||
|
modelPath: string;
|
||||||
|
};
|
||||||
|
embedding: {
|
||||||
|
enabled: boolean;
|
||||||
|
modelPath: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
body: {
|
||||||
|
enabled: boolean;
|
||||||
|
modelPath: string;
|
||||||
|
maxDetections: number;
|
||||||
|
scoreThreshold: number;
|
||||||
|
nmsRadius: number;
|
||||||
|
};
|
||||||
|
hand: {
|
||||||
|
enabled: boolean;
|
||||||
|
rotation: boolean;
|
||||||
|
skipFrames: number;
|
||||||
|
skipInitial: boolean;
|
||||||
|
minConfidence: number;
|
||||||
|
iouThreshold: number;
|
||||||
|
scoreThreshold: number;
|
||||||
|
maxHands: number;
|
||||||
|
landmarks: boolean;
|
||||||
|
detector: {
|
||||||
|
modelPath: string;
|
||||||
|
};
|
||||||
|
skeleton: {
|
||||||
|
modelPath: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export default _default;
|
|
@ -1,119 +0,0 @@
|
||||||
import * as tf from '../dist/tfjs.esm.js';
|
|
||||||
import * as facemesh from './blazeface/facemesh';
|
|
||||||
import * as age from './age/age';
|
|
||||||
import * as gender from './gender/gender';
|
|
||||||
import * as emotion from './emotion/emotion';
|
|
||||||
import * as posenet from './posenet/posenet';
|
|
||||||
import * as handpose from './handpose/handpose';
|
|
||||||
import * as blazepose from './blazepose/blazepose';
|
|
||||||
import * as config from '../config';
|
|
||||||
import * as draw from './draw';
|
|
||||||
declare class Human {
|
|
||||||
#private;
|
|
||||||
version: string;
|
|
||||||
config: typeof config.default;
|
|
||||||
state: string;
|
|
||||||
image: {
|
|
||||||
tensor: typeof tf.Tensor;
|
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement;
|
|
||||||
};
|
|
||||||
tf: typeof tf;
|
|
||||||
draw: typeof draw;
|
|
||||||
models: {
|
|
||||||
face: any;
|
|
||||||
posenet: any;
|
|
||||||
blazepose: any;
|
|
||||||
handpose: any;
|
|
||||||
iris: any;
|
|
||||||
age: any;
|
|
||||||
gender: any;
|
|
||||||
emotion: any;
|
|
||||||
embedding: any;
|
|
||||||
};
|
|
||||||
classes: {
|
|
||||||
facemesh: typeof facemesh;
|
|
||||||
age: typeof age;
|
|
||||||
gender: typeof gender;
|
|
||||||
emotion: typeof emotion;
|
|
||||||
body: typeof posenet | typeof blazepose;
|
|
||||||
hand: typeof handpose;
|
|
||||||
};
|
|
||||||
sysinfo: {
|
|
||||||
platform: string;
|
|
||||||
agent: string;
|
|
||||||
};
|
|
||||||
constructor(userConfig?: {});
|
|
||||||
profileData(): {
|
|
||||||
newBytes: any;
|
|
||||||
newTensors: any;
|
|
||||||
peakBytes: any;
|
|
||||||
numKernelOps: any;
|
|
||||||
timeKernelOps: any;
|
|
||||||
slowestKernelOps: any;
|
|
||||||
largestKernelOps: any;
|
|
||||||
} | {};
|
|
||||||
simmilarity(embedding1: Array<number>, embedding2: Array<number>): number;
|
|
||||||
enhance(input: typeof tf.Tensor): typeof tf.Tensor | null;
|
|
||||||
load(userConfig?: null): Promise<void>;
|
|
||||||
detect(input: any, userConfig?: {}): Promise<{
|
|
||||||
face: Array<{
|
|
||||||
confidence: number;
|
|
||||||
boxConfidence: number;
|
|
||||||
faceConfidence: number;
|
|
||||||
box: [number, number, number, number];
|
|
||||||
mesh: Array<[number, number, number]>;
|
|
||||||
meshRaw: Array<[number, number, number]>;
|
|
||||||
boxRaw: [number, number, number, number];
|
|
||||||
annotations: any;
|
|
||||||
age: number;
|
|
||||||
gender: string;
|
|
||||||
genderConfidence: number;
|
|
||||||
emotion: string;
|
|
||||||
embedding: any;
|
|
||||||
iris: number;
|
|
||||||
angle: {
|
|
||||||
roll: number | null;
|
|
||||||
yaw: number | null;
|
|
||||||
pitch: number | null;
|
|
||||||
};
|
|
||||||
}>;
|
|
||||||
body: Array<{
|
|
||||||
id: number;
|
|
||||||
part: string;
|
|
||||||
position: {
|
|
||||||
x: number;
|
|
||||||
y: number;
|
|
||||||
z: number;
|
|
||||||
};
|
|
||||||
score: number;
|
|
||||||
presence: number;
|
|
||||||
}>;
|
|
||||||
hand: Array<{
|
|
||||||
confidence: number;
|
|
||||||
box: any;
|
|
||||||
landmarks: any;
|
|
||||||
annotations: any;
|
|
||||||
}>;
|
|
||||||
gesture: Array<{
|
|
||||||
part: string;
|
|
||||||
gesture: string;
|
|
||||||
}>;
|
|
||||||
performance: {
|
|
||||||
any: any;
|
|
||||||
};
|
|
||||||
canvas: OffscreenCanvas | HTMLCanvasElement;
|
|
||||||
} | {
|
|
||||||
error: string;
|
|
||||||
}>;
|
|
||||||
warmup(userConfig: any): Promise<{
|
|
||||||
face: any;
|
|
||||||
body: any;
|
|
||||||
hand: any;
|
|
||||||
gesture: any;
|
|
||||||
performance: any;
|
|
||||||
canvas: any;
|
|
||||||
} | {
|
|
||||||
error: any;
|
|
||||||
}>;
|
|
||||||
}
|
|
||||||
export { Human as default };
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
export declare class MediaPipeFaceMesh {
|
||||||
|
facePipeline: any;
|
||||||
|
config: any;
|
||||||
|
constructor(blazeFace: any, blazeMeshModel: any, irisModel: any, config: any);
|
||||||
|
estimateFaces(input: any, config: any): Promise<{
|
||||||
|
confidence: any;
|
||||||
|
boxConfidence: any;
|
||||||
|
faceConfidence: any;
|
||||||
|
box: any;
|
||||||
|
mesh: any;
|
||||||
|
boxRaw: any;
|
||||||
|
meshRaw: any;
|
||||||
|
annotations: any;
|
||||||
|
image: any;
|
||||||
|
}[]>;
|
||||||
|
}
|
||||||
|
export declare function load(config: any): Promise<MediaPipeFaceMesh>;
|
|
@ -7,14 +7,14 @@ export declare const options: {
|
||||||
lineWidth: number;
|
lineWidth: number;
|
||||||
pointSize: number;
|
pointSize: number;
|
||||||
roundRect: number;
|
roundRect: number;
|
||||||
drawPoints: boolean;
|
drawPoints: Boolean;
|
||||||
drawLabels: boolean;
|
drawLabels: Boolean;
|
||||||
drawBoxes: boolean;
|
drawBoxes: Boolean;
|
||||||
drawPolygons: boolean;
|
drawPolygons: Boolean;
|
||||||
fillPolygons: boolean;
|
fillPolygons: Boolean;
|
||||||
useDepth: boolean;
|
useDepth: Boolean;
|
||||||
useCurves: boolean;
|
useCurves: Boolean;
|
||||||
bufferedOutput: boolean;
|
bufferedOutput: Boolean;
|
||||||
};
|
};
|
||||||
export declare function gesture(inCanvas: any, result: any): Promise<void>;
|
export declare function gesture(inCanvas: any, result: any): Promise<void>;
|
||||||
export declare function face(inCanvas: any, result: any): Promise<void>;
|
export declare function face(inCanvas: any, result: any): Promise<void>;
|
|
@ -0,0 +1,124 @@
|
||||||
|
import * as tf from '../dist/tfjs.esm.js';
|
||||||
|
import * as facemesh from './blazeface/facemesh';
|
||||||
|
import * as age from './age/age';
|
||||||
|
import * as gender from './gender/gender';
|
||||||
|
import * as emotion from './emotion/emotion';
|
||||||
|
import * as posenet from './posenet/posenet';
|
||||||
|
import * as handpose from './handpose/handpose';
|
||||||
|
import * as blazepose from './blazepose/blazepose';
|
||||||
|
import * as config from '../config';
|
||||||
|
import * as draw from './draw';
|
||||||
|
declare type Tensor = {};
|
||||||
|
declare type Model = {};
|
||||||
|
export declare type Result = {
|
||||||
|
face: Array<{
|
||||||
|
confidence: Number;
|
||||||
|
boxConfidence: Number;
|
||||||
|
faceConfidence: Number;
|
||||||
|
box: [Number, Number, Number, Number];
|
||||||
|
mesh: Array<[Number, Number, Number]>;
|
||||||
|
meshRaw: Array<[Number, Number, Number]>;
|
||||||
|
boxRaw: [Number, Number, Number, Number];
|
||||||
|
annotations: any;
|
||||||
|
age: Number;
|
||||||
|
gender: String;
|
||||||
|
genderConfidence: Number;
|
||||||
|
emotion: String;
|
||||||
|
embedding: any;
|
||||||
|
iris: Number;
|
||||||
|
angle: {
|
||||||
|
roll: Number | null;
|
||||||
|
yaw: Number | null;
|
||||||
|
pitch: Number | null;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
body: Array<{
|
||||||
|
id: Number;
|
||||||
|
part: String;
|
||||||
|
position: {
|
||||||
|
x: Number;
|
||||||
|
y: Number;
|
||||||
|
z: Number;
|
||||||
|
};
|
||||||
|
score: Number;
|
||||||
|
presence: Number;
|
||||||
|
}>;
|
||||||
|
hand: Array<{
|
||||||
|
confidence: Number;
|
||||||
|
box: any;
|
||||||
|
landmarks: any;
|
||||||
|
annotations: any;
|
||||||
|
}>;
|
||||||
|
gesture: Array<{
|
||||||
|
part: String;
|
||||||
|
gesture: String;
|
||||||
|
}>;
|
||||||
|
performance: {
|
||||||
|
any: any;
|
||||||
|
};
|
||||||
|
canvas: OffscreenCanvas | HTMLCanvasElement;
|
||||||
|
};
|
||||||
|
export type { default as Config } from '../config';
|
||||||
|
export declare class Human {
|
||||||
|
#private;
|
||||||
|
version: String;
|
||||||
|
config: typeof config.default;
|
||||||
|
state: String;
|
||||||
|
image: {
|
||||||
|
tensor: Tensor;
|
||||||
|
canvas: OffscreenCanvas | HTMLCanvasElement;
|
||||||
|
};
|
||||||
|
tf: typeof tf;
|
||||||
|
draw: {
|
||||||
|
options?: typeof draw.options;
|
||||||
|
gesture: Function;
|
||||||
|
face: Function;
|
||||||
|
body: Function;
|
||||||
|
hand: Function;
|
||||||
|
canvas: Function;
|
||||||
|
all: Function;
|
||||||
|
};
|
||||||
|
models: {
|
||||||
|
face: facemesh.MediaPipeFaceMesh | null;
|
||||||
|
posenet: posenet.PoseNet | null;
|
||||||
|
blazepose: Model | null;
|
||||||
|
handpose: handpose.HandPose | null;
|
||||||
|
iris: Model | null;
|
||||||
|
age: Model | null;
|
||||||
|
gender: Model | null;
|
||||||
|
emotion: Model | null;
|
||||||
|
embedding: Model | null;
|
||||||
|
};
|
||||||
|
classes: {
|
||||||
|
facemesh: typeof facemesh;
|
||||||
|
age: typeof age;
|
||||||
|
gender: typeof gender;
|
||||||
|
emotion: typeof emotion;
|
||||||
|
body: typeof posenet | typeof blazepose;
|
||||||
|
hand: typeof handpose;
|
||||||
|
};
|
||||||
|
sysinfo: {
|
||||||
|
platform: String;
|
||||||
|
agent: String;
|
||||||
|
};
|
||||||
|
constructor(userConfig?: {});
|
||||||
|
profileData(): {
|
||||||
|
newBytes: any;
|
||||||
|
newTensors: any;
|
||||||
|
peakBytes: any;
|
||||||
|
numKernelOps: any;
|
||||||
|
timeKernelOps: any;
|
||||||
|
slowestKernelOps: any;
|
||||||
|
largestKernelOps: any;
|
||||||
|
} | {};
|
||||||
|
simmilarity(embedding1: Array<Number>, embedding2: Array<Number>): Number;
|
||||||
|
enhance(input: Tensor): Tensor | null;
|
||||||
|
load(userConfig?: Object): Promise<void>;
|
||||||
|
detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig?: Object): Promise<Result | {
|
||||||
|
error: String;
|
||||||
|
}>;
|
||||||
|
warmup(userConfig?: Object): Promise<Result | {
|
||||||
|
error: any;
|
||||||
|
}>;
|
||||||
|
}
|
||||||
|
export { Human as default };
|
2
wiki
2
wiki
|
@ -1 +1 @@
|
||||||
Subproject commit 4c5d355a1d413c54f7f8ff2fa8bb39c535cc58b4
|
Subproject commit 17f65ba8169f07140d23ea7b31f9c22b13b83642
|
Loading…
Reference in New Issue