Face Name Detection of THREE.Mesh

I have a Cube, Prism, Square-Pyramid, Cylinder, Hemisphere, etc. And I want them to have different number of logical faces and face names.

Cube: 6 faces ( Front, Right, Left, Back, Top, Bottom )
Prism: 5 faces ( Front, Right, Left, Back, Bottom )
Square-Pyramid: 5 faces ( Front, Right, Left, Back, Bottom )
Cylinder: 3 faces ( Top, Curve, Bottom )
Hemisphere: 2 faces ( Curve, Bottom )

And each of them can be rotated multiple times using quaternion. Even after rotation, when a face of any shape is hit by Raycaster, I want to get the real mesh face name. How can I achived this?

Keeping this in mind that, a single logical face (curve) can be formed by multiple (more than 50 triangular faces). And hardcoding these value is not a good approach for every shapes I have. I want a generic solution for any shapes that I have now, and any shapes that may come up in future.

Thanks in advance for helping me out.

Look at source of box: src/geometries/BoxGeometry.js

buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px
buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx
buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py
buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny
buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz
buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz

We have 6 sides. Raycast return faceindex. If we know that faceindex 0-1 is front, 2-3 is back then we have solution.

CylinderGeometry.js make curve into generateTorso() and top bottom in generateCap()
by knowing that with parametres CylinderGeometry(1,1,1,32,1) faceInex 0-150 is curve then we have solution.