Pass all the geomerty into XAtlas-Three (UV unwrapping library). This will generate a "UV2" attribute on the geometry.
Render the geomerties vericies in the UV2 space. Create two textures (resolution being the lightmap resolution), using the gl_FragColor to encode world position and the normal. This is packing Vec3 data into a texture using the RGB channel.
Visual reference: Using these textures as the lightmap (using UV2).
These two texture are effectivly a 2D array of World Position & Normals covering the entire geomerty.
Itterate through each World Position & Normal. Cast rays at each position to calculate incoming light.
Visual reference: Creating arrows for each world positon & the normal
The Three Mesh BVH library helps improve the performance of raycasting, it also allows raycasting on the GPU (this is super fast).
Using A LOT of copy & pasted code from Three GPU Pathtracer to generate light