@lampdotdev/lamp 0.0.0-stage → 0.36.2-nightly.16

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 (470) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +397 -2
  3. package/Resources/Devices/roku.json +410 -0
  4. package/Resources/Devices/xbox-one.json +367 -0
  5. package/Resources/GameKit/NOTICE.md +63 -0
  6. package/Resources/GameKit/apple/LampPage.swift +1813 -0
  7. package/Resources/GameKit/apple/LampPlayer.swift +46 -0
  8. package/Resources/GameKit/apple/LampWebApp.swift +63 -0
  9. package/Resources/GameKit/apple/LampWebGame.swift +87 -0
  10. package/Resources/GameKit/apple/Native.swift +12 -0
  11. package/Resources/GameKit/build.sh +55 -0
  12. package/Resources/GameKit/lamp_game.h +116 -0
  13. package/Resources/GameKit/lamp_host.h +19 -0
  14. package/Resources/GameKit/lamp_kit.cpp +61 -0
  15. package/Resources/GameKit/lamp_sound.cpp +455 -0
  16. package/Resources/GameKit/lamp_xbox.cpp +374 -0
  17. package/Resources/GameKit/libraries/HandmadeMath.h +3940 -0
  18. package/Resources/GameKit/libraries/cgltf.h +7240 -0
  19. package/Resources/GameKit/libraries/dr_mp3.h +5430 -0
  20. package/Resources/GameKit/libraries/dr_wav.h +9209 -0
  21. package/Resources/GameKit/libraries/sokol_debugtext.h +4754 -0
  22. package/Resources/GameKit/libraries/sokol_gfx.h +29558 -0
  23. package/Resources/GameKit/libraries/sokol_gl.h +4538 -0
  24. package/Resources/GameKit/libraries/sokol_log.h +335 -0
  25. package/Resources/GameKit/libraries/sokol_shape.h +1531 -0
  26. package/Resources/GameKit/libraries/stb_image.h +7988 -0
  27. package/Resources/GameKit/libraries/stb_vorbis.c +5584 -0
  28. package/Resources/GameKit/page/lamp-live.js +672 -0
  29. package/Resources/GameKit/scaffold/Game/game.cpp +142 -0
  30. package/Resources/GameKit/scaffold/Game/scene.glsl +49 -0
  31. package/Resources/GameKit/scaffold-web/Web/game.js +31 -0
  32. package/Resources/GameKit/scaffold-web/Web/index.html +13 -0
  33. package/Resources/GameKit/scaffold-web/Web/making.js +33 -0
  34. package/Resources/GameKit/scaffold-web/Web/world.js +33 -0
  35. package/Resources/GameKit/web/lamp-game.js +3042 -0
  36. package/Resources/GameKit/web/lamp-phaser.js +128 -0
  37. package/Resources/WebHost/App.exe +0 -0
  38. package/Resources/WebHost/Microsoft.Web.WebView2.Core.dll +0 -0
  39. package/Resources/WebHost/WebView2-LICENSE.txt +27 -0
  40. package/Resources/WebHost/lamp_controllers.h +1506 -0
  41. package/Resources/WebHost/lamp_web_host.cpp +1173 -0
  42. package/Resources/WebLibraries/earlier.txt +318 -0
  43. package/Resources/WebLibraries/phaser/LICENSE.md +20 -0
  44. package/Resources/WebLibraries/phaser/NOTICE.md +2 -0
  45. package/Resources/WebLibraries/phaser/phaser.esm.min.js +1 -0
  46. package/Resources/WebLibraries/qrcode/LICENSE +21 -0
  47. package/Resources/WebLibraries/qrcode/NOTICE.md +4 -0
  48. package/Resources/WebLibraries/qrcode/qrcode.js +2297 -0
  49. package/Resources/WebLibraries/rapier/LICENSE +201 -0
  50. package/Resources/WebLibraries/rapier/NOTICE.md +3 -0
  51. package/Resources/WebLibraries/rapier/rapier.js +2 -0
  52. package/Resources/WebLibraries/three/LICENSE +21 -0
  53. package/Resources/WebLibraries/three/NOTICE.md +4 -0
  54. package/Resources/WebLibraries/three/addons/animation/AnimationClipCreator.js +168 -0
  55. package/Resources/WebLibraries/three/addons/animation/CCDIKSolver.js +607 -0
  56. package/Resources/WebLibraries/three/addons/controls/ArcballControls.js +3543 -0
  57. package/Resources/WebLibraries/three/addons/controls/DragControls.js +452 -0
  58. package/Resources/WebLibraries/three/addons/controls/FirstPersonControls.js +512 -0
  59. package/Resources/WebLibraries/three/addons/controls/FlyControls.js +384 -0
  60. package/Resources/WebLibraries/three/addons/controls/MapControls.js +116 -0
  61. package/Resources/WebLibraries/three/addons/controls/OrbitControls.js +1985 -0
  62. package/Resources/WebLibraries/three/addons/controls/PointerLockControls.js +264 -0
  63. package/Resources/WebLibraries/three/addons/controls/TrackballControls.js +1106 -0
  64. package/Resources/WebLibraries/three/addons/controls/TransformControls.js +2003 -0
  65. package/Resources/WebLibraries/three/addons/curves/CurveExtras.js +694 -0
  66. package/Resources/WebLibraries/three/addons/curves/NURBSCurve.js +169 -0
  67. package/Resources/WebLibraries/three/addons/curves/NURBSSurface.js +98 -0
  68. package/Resources/WebLibraries/three/addons/curves/NURBSUtils.js +532 -0
  69. package/Resources/WebLibraries/three/addons/curves/NURBSVolume.js +82 -0
  70. package/Resources/WebLibraries/three/addons/effects/AnaglyphEffect.js +274 -0
  71. package/Resources/WebLibraries/three/addons/effects/AsciiEffect.js +323 -0
  72. package/Resources/WebLibraries/three/addons/effects/OutlineEffect.js +489 -0
  73. package/Resources/WebLibraries/three/addons/effects/ParallaxBarrierEffect.js +155 -0
  74. package/Resources/WebLibraries/three/addons/effects/StereoEffect.js +91 -0
  75. package/Resources/WebLibraries/three/addons/environments/ColorEnvironment.js +59 -0
  76. package/Resources/WebLibraries/three/addons/environments/DebugEnvironment.js +102 -0
  77. package/Resources/WebLibraries/three/addons/environments/RoomEnvironment.js +185 -0
  78. package/Resources/WebLibraries/three/addons/geometries/BoxLineGeometry.js +92 -0
  79. package/Resources/WebLibraries/three/addons/geometries/ConvexGeometry.js +72 -0
  80. package/Resources/WebLibraries/three/addons/geometries/DecalGeometry.js +420 -0
  81. package/Resources/WebLibraries/three/addons/geometries/LoftGeometry.js +355 -0
  82. package/Resources/WebLibraries/three/addons/geometries/ParametricFunctions.js +100 -0
  83. package/Resources/WebLibraries/three/addons/geometries/ParametricGeometry.js +172 -0
  84. package/Resources/WebLibraries/three/addons/geometries/RoundedBoxGeometry.js +216 -0
  85. package/Resources/WebLibraries/three/addons/geometries/TeapotGeometry.js +689 -0
  86. package/Resources/WebLibraries/three/addons/geometries/TextGeometry.js +102 -0
  87. package/Resources/WebLibraries/three/addons/helpers/AnimationPathHelper.js +302 -0
  88. package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelper.js +166 -0
  89. package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelperWebGL.js +221 -0
  90. package/Resources/WebLibraries/three/addons/helpers/LightProbeHelper.js +166 -0
  91. package/Resources/WebLibraries/three/addons/helpers/LightProbeHelperGPU.js +102 -0
  92. package/Resources/WebLibraries/three/addons/helpers/OctreeHelper.js +109 -0
  93. package/Resources/WebLibraries/three/addons/helpers/PositionalAudioHelper.js +169 -0
  94. package/Resources/WebLibraries/three/addons/helpers/RapierHelper.js +59 -0
  95. package/Resources/WebLibraries/three/addons/helpers/RectAreaLightHelper.js +118 -0
  96. package/Resources/WebLibraries/three/addons/helpers/TextureHelper.js +265 -0
  97. package/Resources/WebLibraries/three/addons/helpers/TextureHelperGPU.js +214 -0
  98. package/Resources/WebLibraries/three/addons/helpers/VertexNormalsHelper.js +155 -0
  99. package/Resources/WebLibraries/three/addons/helpers/VertexTangentsHelper.js +133 -0
  100. package/Resources/WebLibraries/three/addons/helpers/ViewHelper.js +529 -0
  101. package/Resources/WebLibraries/three/addons/interactive/HTMLMesh.js +617 -0
  102. package/Resources/WebLibraries/three/addons/interactive/InteractiveGroup.js +224 -0
  103. package/Resources/WebLibraries/three/addons/interactive/SelectionBox.js +324 -0
  104. package/Resources/WebLibraries/three/addons/interactive/SelectionHelper.js +150 -0
  105. package/Resources/WebLibraries/three/addons/libs/fflate.module.js +2699 -0
  106. package/Resources/WebLibraries/three/addons/libs/lil-gui.module.min.js +8 -0
  107. package/Resources/WebLibraries/three/addons/libs/meshopt_decoder.module.js +196 -0
  108. package/Resources/WebLibraries/three/addons/libs/potpack.module.js +125 -0
  109. package/Resources/WebLibraries/three/addons/libs/stats.module.js +167 -0
  110. package/Resources/WebLibraries/three/addons/libs/tween.module.js +876 -0
  111. package/Resources/WebLibraries/three/addons/lighting/ClusteredLighting.js +153 -0
  112. package/Resources/WebLibraries/three/addons/lighting/DynamicLighting.js +82 -0
  113. package/Resources/WebLibraries/three/addons/lighting/LightMapper.js +295 -0
  114. package/Resources/WebLibraries/three/addons/lighting/LightProbeGrid.js +923 -0
  115. package/Resources/WebLibraries/three/addons/lighting/LightProbeGridUtils.js +107 -0
  116. package/Resources/WebLibraries/three/addons/lighting/LightProbeGridWebGL.js +846 -0
  117. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIConeTracer.js +243 -0
  118. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIIrradiance.js +43 -0
  119. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGINode.js +617 -0
  120. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGISceneCollector.js +793 -0
  121. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIVolume.js +1440 -0
  122. package/Resources/WebLibraries/three/addons/lights/LightProbeGenerator.js +337 -0
  123. package/Resources/WebLibraries/three/addons/lights/RectAreaLightTexturesLib.js +127 -0
  124. package/Resources/WebLibraries/three/addons/lights/RectAreaLightUniformsLib.js +40 -0
  125. package/Resources/WebLibraries/three/addons/lights/SunLight.js +100 -0
  126. package/Resources/WebLibraries/three/addons/lights/SunLightNode.js +56 -0
  127. package/Resources/WebLibraries/three/addons/lights/SunLightShadow.js +319 -0
  128. package/Resources/WebLibraries/three/addons/lights/SunShadowNode.js +312 -0
  129. package/Resources/WebLibraries/three/addons/lines/Line2.js +56 -0
  130. package/Resources/WebLibraries/three/addons/lines/LineGeometry.js +157 -0
  131. package/Resources/WebLibraries/three/addons/lines/LineMaterial.js +742 -0
  132. package/Resources/WebLibraries/three/addons/lines/LineSegments2.js +434 -0
  133. package/Resources/WebLibraries/three/addons/lines/LineSegmentsGeometry.js +298 -0
  134. package/Resources/WebLibraries/three/addons/lines/Wireframe.js +108 -0
  135. package/Resources/WebLibraries/three/addons/lines/WireframeGeometry2.js +49 -0
  136. package/Resources/WebLibraries/three/addons/lines/webgpu/Line2.js +46 -0
  137. package/Resources/WebLibraries/three/addons/lines/webgpu/LineSegments2.js +419 -0
  138. package/Resources/WebLibraries/three/addons/lines/webgpu/Wireframe.js +86 -0
  139. package/Resources/WebLibraries/three/addons/loaders/EXRLoader.js +3411 -0
  140. package/Resources/WebLibraries/three/addons/loaders/FBXLoader.js +4660 -0
  141. package/Resources/WebLibraries/three/addons/loaders/FontLoader.js +262 -0
  142. package/Resources/WebLibraries/three/addons/loaders/GLTFLoader.js +5006 -0
  143. package/Resources/WebLibraries/three/addons/loaders/HDRLoader.js +463 -0
  144. package/Resources/WebLibraries/three/addons/loaders/MTLLoader.js +601 -0
  145. package/Resources/WebLibraries/three/addons/loaders/OBJLoader.js +961 -0
  146. package/Resources/WebLibraries/three/addons/loaders/PLYLoader.js +992 -0
  147. package/Resources/WebLibraries/three/addons/loaders/RGBELoader.js +18 -0
  148. package/Resources/WebLibraries/three/addons/loaders/STLLoader.js +423 -0
  149. package/Resources/WebLibraries/three/addons/loaders/SVGLoader.js +3297 -0
  150. package/Resources/WebLibraries/three/addons/loaders/TGALoader.js +539 -0
  151. package/Resources/WebLibraries/three/addons/loaders/UltraHDRLoader.js +757 -0
  152. package/Resources/WebLibraries/three/addons/math/Capsule.js +159 -0
  153. package/Resources/WebLibraries/three/addons/math/ColorConverter.js +62 -0
  154. package/Resources/WebLibraries/three/addons/math/ColorSpaces.js +147 -0
  155. package/Resources/WebLibraries/three/addons/math/ConvexHull.js +1695 -0
  156. package/Resources/WebLibraries/three/addons/math/ImprovedNoise.js +88 -0
  157. package/Resources/WebLibraries/three/addons/math/Lut.js +317 -0
  158. package/Resources/WebLibraries/three/addons/math/MeshSurfaceSampler.js +315 -0
  159. package/Resources/WebLibraries/three/addons/math/OBB.js +535 -0
  160. package/Resources/WebLibraries/three/addons/math/Octree.js +825 -0
  161. package/Resources/WebLibraries/three/addons/math/SimplexNoise.js +470 -0
  162. package/Resources/WebLibraries/three/addons/misc/ConvexObjectBreaker.js +539 -0
  163. package/Resources/WebLibraries/three/addons/misc/GPUComputationRenderer.js +508 -0
  164. package/Resources/WebLibraries/three/addons/misc/Gyroscope.js +78 -0
  165. package/Resources/WebLibraries/three/addons/misc/MorphAnimMesh.js +119 -0
  166. package/Resources/WebLibraries/three/addons/misc/MorphBlendMesh.js +425 -0
  167. package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMap.js +370 -0
  168. package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMapGPU.js +322 -0
  169. package/Resources/WebLibraries/three/addons/misc/RollerCoaster.js +661 -0
  170. package/Resources/WebLibraries/three/addons/misc/Sculptor.js +1679 -0
  171. package/Resources/WebLibraries/three/addons/misc/SculptorMesh.js +1504 -0
  172. package/Resources/WebLibraries/three/addons/misc/SculptorTools.js +1180 -0
  173. package/Resources/WebLibraries/three/addons/misc/SculptorUtils.js +345 -0
  174. package/Resources/WebLibraries/three/addons/misc/TileCreasedNormalsPlugin.js +270 -0
  175. package/Resources/WebLibraries/three/addons/misc/TubePainter.js +611 -0
  176. package/Resources/WebLibraries/three/addons/misc/Volume.js +520 -0
  177. package/Resources/WebLibraries/three/addons/misc/VolumeSlice.js +275 -0
  178. package/Resources/WebLibraries/three/addons/modifiers/CurveModifier.js +374 -0
  179. package/Resources/WebLibraries/three/addons/modifiers/CurveModifierGPU.js +256 -0
  180. package/Resources/WebLibraries/three/addons/modifiers/EdgeSplitModifier.js +299 -0
  181. package/Resources/WebLibraries/three/addons/modifiers/TessellateModifier.js +340 -0
  182. package/Resources/WebLibraries/three/addons/objects/GroundedSkybox.js +69 -0
  183. package/Resources/WebLibraries/three/addons/objects/Lensflare.js +489 -0
  184. package/Resources/WebLibraries/three/addons/objects/LensflareMesh.js +376 -0
  185. package/Resources/WebLibraries/three/addons/objects/MarchingCubes.js +1261 -0
  186. package/Resources/WebLibraries/three/addons/objects/Reflector.js +390 -0
  187. package/Resources/WebLibraries/three/addons/objects/ReflectorForSSRPass.js +393 -0
  188. package/Resources/WebLibraries/three/addons/objects/Refractor.js +389 -0
  189. package/Resources/WebLibraries/three/addons/objects/ShadowMesh.js +130 -0
  190. package/Resources/WebLibraries/three/addons/objects/Sky.js +342 -0
  191. package/Resources/WebLibraries/three/addons/objects/SkyMesh.js +403 -0
  192. package/Resources/WebLibraries/three/addons/objects/Water.js +374 -0
  193. package/Resources/WebLibraries/three/addons/objects/Water2.js +403 -0
  194. package/Resources/WebLibraries/three/addons/objects/Water2Mesh.js +199 -0
  195. package/Resources/WebLibraries/three/addons/objects/WaterMesh.js +194 -0
  196. package/Resources/WebLibraries/three/addons/postprocessing/AfterimagePass.js +187 -0
  197. package/Resources/WebLibraries/three/addons/postprocessing/BloomPass.js +274 -0
  198. package/Resources/WebLibraries/three/addons/postprocessing/BokehPass.js +218 -0
  199. package/Resources/WebLibraries/three/addons/postprocessing/ClearPass.js +97 -0
  200. package/Resources/WebLibraries/three/addons/postprocessing/CubeTexturePass.js +146 -0
  201. package/Resources/WebLibraries/three/addons/postprocessing/DotScreenPass.js +114 -0
  202. package/Resources/WebLibraries/three/addons/postprocessing/EffectComposer.js +365 -0
  203. package/Resources/WebLibraries/three/addons/postprocessing/FXAAPass.js +40 -0
  204. package/Resources/WebLibraries/three/addons/postprocessing/FilmPass.js +113 -0
  205. package/Resources/WebLibraries/three/addons/postprocessing/GTAOPass.js +735 -0
  206. package/Resources/WebLibraries/three/addons/postprocessing/GlitchPass.js +177 -0
  207. package/Resources/WebLibraries/three/addons/postprocessing/HalftonePass.js +134 -0
  208. package/Resources/WebLibraries/three/addons/postprocessing/LUTPass.js +138 -0
  209. package/Resources/WebLibraries/three/addons/postprocessing/MaskPass.js +195 -0
  210. package/Resources/WebLibraries/three/addons/postprocessing/OutlinePass.js +776 -0
  211. package/Resources/WebLibraries/three/addons/postprocessing/OutputPass.js +148 -0
  212. package/Resources/WebLibraries/three/addons/postprocessing/Pass.js +191 -0
  213. package/Resources/WebLibraries/three/addons/postprocessing/RenderPass.js +193 -0
  214. package/Resources/WebLibraries/three/addons/postprocessing/RenderPixelatedPass.js +314 -0
  215. package/Resources/WebLibraries/three/addons/postprocessing/RenderTransitionPass.js +267 -0
  216. package/Resources/WebLibraries/three/addons/postprocessing/SAOPass.js +407 -0
  217. package/Resources/WebLibraries/three/addons/postprocessing/SMAAPass.js +230 -0
  218. package/Resources/WebLibraries/three/addons/postprocessing/SSAARenderPass.js +313 -0
  219. package/Resources/WebLibraries/three/addons/postprocessing/SSAOPass.js +527 -0
  220. package/Resources/WebLibraries/three/addons/postprocessing/SSRPass.js +858 -0
  221. package/Resources/WebLibraries/three/addons/postprocessing/SavePass.js +132 -0
  222. package/Resources/WebLibraries/three/addons/postprocessing/ShaderPass.js +135 -0
  223. package/Resources/WebLibraries/three/addons/postprocessing/TAARenderPass.js +243 -0
  224. package/Resources/WebLibraries/three/addons/postprocessing/TexturePass.js +131 -0
  225. package/Resources/WebLibraries/three/addons/postprocessing/UnrealBloomPass.js +541 -0
  226. package/Resources/WebLibraries/three/addons/shaders/ACESFilmicToneMappingShader.js +96 -0
  227. package/Resources/WebLibraries/three/addons/shaders/AfterimageShader.js +63 -0
  228. package/Resources/WebLibraries/three/addons/shaders/BasicShader.js +36 -0
  229. package/Resources/WebLibraries/three/addons/shaders/BleachBypassShader.js +68 -0
  230. package/Resources/WebLibraries/three/addons/shaders/BlendShader.js +56 -0
  231. package/Resources/WebLibraries/three/addons/shaders/BokehShader.js +151 -0
  232. package/Resources/WebLibraries/three/addons/shaders/BokehShader2.js +404 -0
  233. package/Resources/WebLibraries/three/addons/shaders/BrightnessContrastShader.js +62 -0
  234. package/Resources/WebLibraries/three/addons/shaders/ColorCorrectionShader.js +59 -0
  235. package/Resources/WebLibraries/three/addons/shaders/ColorifyShader.js +57 -0
  236. package/Resources/WebLibraries/three/addons/shaders/ConvolutionShader.js +74 -0
  237. package/Resources/WebLibraries/three/addons/shaders/CopyShader.js +52 -0
  238. package/Resources/WebLibraries/three/addons/shaders/DOFMipMapShader.js +63 -0
  239. package/Resources/WebLibraries/three/addons/shaders/DepthLimitedBlurShader.js +183 -0
  240. package/Resources/WebLibraries/three/addons/shaders/DigitalGlitch.js +104 -0
  241. package/Resources/WebLibraries/three/addons/shaders/DotScreenShader.js +75 -0
  242. package/Resources/WebLibraries/three/addons/shaders/ExposureShader.js +51 -0
  243. package/Resources/WebLibraries/three/addons/shaders/FXAAShader.js +298 -0
  244. package/Resources/WebLibraries/three/addons/shaders/FilmShader.js +73 -0
  245. package/Resources/WebLibraries/three/addons/shaders/FocusShader.js +94 -0
  246. package/Resources/WebLibraries/three/addons/shaders/FreiChenShader.js +103 -0
  247. package/Resources/WebLibraries/three/addons/shaders/GTAOShader.js +437 -0
  248. package/Resources/WebLibraries/three/addons/shaders/GammaCorrectionShader.js +52 -0
  249. package/Resources/WebLibraries/three/addons/shaders/HalftoneShader.js +332 -0
  250. package/Resources/WebLibraries/three/addons/shaders/HorizontalBlurShader.js +68 -0
  251. package/Resources/WebLibraries/three/addons/shaders/HorizontalTiltShiftShader.js +70 -0
  252. package/Resources/WebLibraries/three/addons/shaders/HueSaturationShader.js +74 -0
  253. package/Resources/WebLibraries/three/addons/shaders/KaleidoShader.js +65 -0
  254. package/Resources/WebLibraries/three/addons/shaders/LuminosityHighPassShader.js +68 -0
  255. package/Resources/WebLibraries/three/addons/shaders/LuminosityShader.js +54 -0
  256. package/Resources/WebLibraries/three/addons/shaders/MirrorShader.js +62 -0
  257. package/Resources/WebLibraries/three/addons/shaders/NormalMapShader.js +60 -0
  258. package/Resources/WebLibraries/three/addons/shaders/OutputShader.js +103 -0
  259. package/Resources/WebLibraries/three/addons/shaders/PoissonDenoiseShader.js +230 -0
  260. package/Resources/WebLibraries/three/addons/shaders/RGBShiftShader.js +61 -0
  261. package/Resources/WebLibraries/three/addons/shaders/SAOShader.js +201 -0
  262. package/Resources/WebLibraries/three/addons/shaders/SMAAShader.js +489 -0
  263. package/Resources/WebLibraries/three/addons/shaders/SSAOShader.js +331 -0
  264. package/Resources/WebLibraries/three/addons/shaders/SSRShader.js +396 -0
  265. package/Resources/WebLibraries/three/addons/shaders/SepiaShader.js +57 -0
  266. package/Resources/WebLibraries/three/addons/shaders/SobelOperatorShader.js +98 -0
  267. package/Resources/WebLibraries/three/addons/shaders/SubsurfaceScatteringShader.js +95 -0
  268. package/Resources/WebLibraries/three/addons/shaders/TechnicolorShader.js +51 -0
  269. package/Resources/WebLibraries/three/addons/shaders/ToonShader.js +349 -0
  270. package/Resources/WebLibraries/three/addons/shaders/TriangleBlurShader.js +79 -0
  271. package/Resources/WebLibraries/three/addons/shaders/UnpackDepthRGBAShader.js +60 -0
  272. package/Resources/WebLibraries/three/addons/shaders/VelocityShader.js +137 -0
  273. package/Resources/WebLibraries/three/addons/shaders/VerticalBlurShader.js +66 -0
  274. package/Resources/WebLibraries/three/addons/shaders/VerticalTiltShiftShader.js +70 -0
  275. package/Resources/WebLibraries/three/addons/shaders/VignetteShader.js +56 -0
  276. package/Resources/WebLibraries/three/addons/shaders/VolumeShader.js +285 -0
  277. package/Resources/WebLibraries/three/addons/shaders/WaterRefractionShader.js +106 -0
  278. package/Resources/WebLibraries/three/addons/textures/FlakesTexture.js +54 -0
  279. package/Resources/WebLibraries/three/addons/tsl/WebGLNodesHandler.js +607 -0
  280. package/Resources/WebLibraries/three/addons/tsl/display/AfterImageNode.js +256 -0
  281. package/Resources/WebLibraries/three/addons/tsl/display/AnaglyphPassNode.js +550 -0
  282. package/Resources/WebLibraries/three/addons/tsl/display/BilateralBlurNode.js +377 -0
  283. package/Resources/WebLibraries/three/addons/tsl/display/BleachBypass.js +33 -0
  284. package/Resources/WebLibraries/three/addons/tsl/display/BloomNode.js +599 -0
  285. package/Resources/WebLibraries/three/addons/tsl/display/CRT.js +150 -0
  286. package/Resources/WebLibraries/three/addons/tsl/display/ChromaticAberrationNode.js +163 -0
  287. package/Resources/WebLibraries/three/addons/tsl/display/DenoiseNode.js +354 -0
  288. package/Resources/WebLibraries/three/addons/tsl/display/DepthOfFieldNode.js +572 -0
  289. package/Resources/WebLibraries/three/addons/tsl/display/DotScreenNode.js +104 -0
  290. package/Resources/WebLibraries/three/addons/tsl/display/FSR1Node.js +481 -0
  291. package/Resources/WebLibraries/three/addons/tsl/display/FXAANode.js +357 -0
  292. package/Resources/WebLibraries/three/addons/tsl/display/FilmNode.js +101 -0
  293. package/Resources/WebLibraries/three/addons/tsl/display/GTAONode.js +727 -0
  294. package/Resources/WebLibraries/three/addons/tsl/display/GaussianBlurNode.js +412 -0
  295. package/Resources/WebLibraries/three/addons/tsl/display/GodraysNode.js +604 -0
  296. package/Resources/WebLibraries/three/addons/tsl/display/ImportanceSampledEnvironment.js +564 -0
  297. package/Resources/WebLibraries/three/addons/tsl/display/LensflareNode.js +282 -0
  298. package/Resources/WebLibraries/three/addons/tsl/display/Lut3DNode.js +109 -0
  299. package/Resources/WebLibraries/three/addons/tsl/display/MotionBlur.js +33 -0
  300. package/Resources/WebLibraries/three/addons/tsl/display/OITPassNode.js +341 -0
  301. package/Resources/WebLibraries/three/addons/tsl/display/OutlineNode.js +916 -0
  302. package/Resources/WebLibraries/three/addons/tsl/display/ParallaxBarrierPassNode.js +90 -0
  303. package/Resources/WebLibraries/three/addons/tsl/display/PixelationPassNode.js +227 -0
  304. package/Resources/WebLibraries/three/addons/tsl/display/RGBShiftNode.js +96 -0
  305. package/Resources/WebLibraries/three/addons/tsl/display/RecurrentDenoiseNode.js +812 -0
  306. package/Resources/WebLibraries/three/addons/tsl/display/RetroPassNode.js +263 -0
  307. package/Resources/WebLibraries/three/addons/tsl/display/SMAANode.js +729 -0
  308. package/Resources/WebLibraries/three/addons/tsl/display/SSAAPassNode.js +344 -0
  309. package/Resources/WebLibraries/three/addons/tsl/display/SSAONode.js +422 -0
  310. package/Resources/WebLibraries/three/addons/tsl/display/SSGINode.js +698 -0
  311. package/Resources/WebLibraries/three/addons/tsl/display/SSRNode.js +1430 -0
  312. package/Resources/WebLibraries/three/addons/tsl/display/SSSNode.js +479 -0
  313. package/Resources/WebLibraries/three/addons/tsl/display/Sepia.js +24 -0
  314. package/Resources/WebLibraries/three/addons/tsl/display/Shape.js +29 -0
  315. package/Resources/WebLibraries/three/addons/tsl/display/SharpenNode.js +284 -0
  316. package/Resources/WebLibraries/three/addons/tsl/display/SobelOperatorNode.js +168 -0
  317. package/Resources/WebLibraries/three/addons/tsl/display/StereoCompositePassNode.js +190 -0
  318. package/Resources/WebLibraries/three/addons/tsl/display/StereoPassNode.js +117 -0
  319. package/Resources/WebLibraries/three/addons/tsl/display/TAAUNode.js +700 -0
  320. package/Resources/WebLibraries/three/addons/tsl/display/TRAANode.js +609 -0
  321. package/Resources/WebLibraries/three/addons/tsl/display/TemporalReprojectNode.js +1024 -0
  322. package/Resources/WebLibraries/three/addons/tsl/display/TransitionNode.js +141 -0
  323. package/Resources/WebLibraries/three/addons/tsl/display/boxBlur.js +65 -0
  324. package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlend.js +80 -0
  325. package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlur.js +63 -0
  326. package/Resources/WebLibraries/three/addons/tsl/display/hashBlur.js +55 -0
  327. package/Resources/WebLibraries/three/addons/tsl/display/lensDirt.js +30 -0
  328. package/Resources/WebLibraries/three/addons/tsl/display/radialBlur.js +68 -0
  329. package/Resources/WebLibraries/three/addons/tsl/lighting/ClusteredLightsNode.js +994 -0
  330. package/Resources/WebLibraries/three/addons/tsl/lighting/DynamicLightsNode.js +201 -0
  331. package/Resources/WebLibraries/three/addons/tsl/lighting/LightProbeGridNode.js +183 -0
  332. package/Resources/WebLibraries/three/addons/tsl/lighting/data/AmbientLightDataNode.js +67 -0
  333. package/Resources/WebLibraries/three/addons/tsl/lighting/data/DirectionalLightDataNode.js +117 -0
  334. package/Resources/WebLibraries/three/addons/tsl/lighting/data/HemisphereLightDataNode.js +105 -0
  335. package/Resources/WebLibraries/three/addons/tsl/lighting/data/PointLightDataNode.js +140 -0
  336. package/Resources/WebLibraries/three/addons/tsl/lighting/data/SpotLightDataNode.js +167 -0
  337. package/Resources/WebLibraries/three/addons/tsl/math/Bayer.js +84 -0
  338. package/Resources/WebLibraries/three/addons/tsl/math/curlNoise.js +107 -0
  339. package/Resources/WebLibraries/three/addons/tsl/math/voronoiNoise.js +112 -0
  340. package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNode.js +542 -0
  341. package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNodeHelper.js +212 -0
  342. package/Resources/WebLibraries/three/addons/tsl/utils/GroundedSkybox.js +62 -0
  343. package/Resources/WebLibraries/three/addons/tsl/utils/RNoise.js +51 -0
  344. package/Resources/WebLibraries/three/addons/tsl/utils/Raymarching.js +70 -0
  345. package/Resources/WebLibraries/three/addons/tsl/utils/SoftParticles.js +53 -0
  346. package/Resources/WebLibraries/three/addons/tsl/utils/SpecularHelpers.js +302 -0
  347. package/Resources/WebLibraries/three/addons/tsl/utils/TAAUtils.js +184 -0
  348. package/Resources/WebLibraries/three/addons/utils/BufferGeometryUtils.js +1523 -0
  349. package/Resources/WebLibraries/three/addons/utils/CameraUtils.js +82 -0
  350. package/Resources/WebLibraries/three/addons/utils/ColorUtils.js +76 -0
  351. package/Resources/WebLibraries/three/addons/utils/GaussianSplatUtils.js +229 -0
  352. package/Resources/WebLibraries/three/addons/utils/GeometryCompressionUtils.js +547 -0
  353. package/Resources/WebLibraries/three/addons/utils/GeometryUtils.js +226 -0
  354. package/Resources/WebLibraries/three/addons/utils/LDrawUtils.js +211 -0
  355. package/Resources/WebLibraries/three/addons/utils/SceneOptimizer.js +459 -0
  356. package/Resources/WebLibraries/three/addons/utils/SceneUtils.js +363 -0
  357. package/Resources/WebLibraries/three/addons/utils/ShadowMapViewer.js +244 -0
  358. package/Resources/WebLibraries/three/addons/utils/ShadowMapViewerGPU.js +233 -0
  359. package/Resources/WebLibraries/three/addons/utils/SkeletonUtils.js +496 -0
  360. package/Resources/WebLibraries/three/addons/utils/SortUtils.js +175 -0
  361. package/Resources/WebLibraries/three/addons/utils/UVsDebug.js +173 -0
  362. package/Resources/WebLibraries/three/addons/utils/WebGLTextureUtils.js +115 -0
  363. package/Resources/WebLibraries/three/addons/utils/WebGPUTextureUtils.js +81 -0
  364. package/Resources/WebLibraries/three/addons/utils/WorkerPool.js +167 -0
  365. package/Resources/WebLibraries/three/addons/utils/unwrapUVs.js +865 -0
  366. package/Resources/WebLibraries/three/three.core.js +61162 -0
  367. package/Resources/WebLibraries/three/three.module.js +19537 -0
  368. package/Resources/WebLibraries/three/three.tsl.js +41903 -0
  369. package/Resources/WebLibraries/three/three.webgpu.js +53714 -0
  370. package/Resources/share-rules.json +64 -0
  371. package/Resources/skills/2d-game/SKILL.md +305 -0
  372. package/Resources/skills/3d-game/SKILL.md +274 -0
  373. package/Resources/skills/accounts/SKILL.md +41 -0
  374. package/Resources/skills/android-design/SKILL.md +159 -0
  375. package/Resources/skills/app-ai/SKILL.md +154 -0
  376. package/Resources/skills/app-intents/SKILL.md +31 -0
  377. package/Resources/skills/app-kinds/SKILL.md +122 -0
  378. package/Resources/skills/apple-watch/SKILL.md +43 -0
  379. package/Resources/skills/assets/SKILL.md +183 -0
  380. package/Resources/skills/building-blocks/SKILL.md +97 -0
  381. package/Resources/skills/device-control/SKILL.md +56 -0
  382. package/Resources/skills/device-integrations/SKILL.md +278 -0
  383. package/Resources/skills/finder-files/SKILL.md +19 -0
  384. package/Resources/skills/game/SKILL.md +416 -0
  385. package/Resources/skills/game-3d/SKILL.md +12 -0
  386. package/Resources/skills/game-art/SKILL.md +11 -0
  387. package/Resources/skills/game-feel/SKILL.md +13 -0
  388. package/Resources/skills/game-levels/SKILL.md +12 -0
  389. package/Resources/skills/game-live/SKILL.md +12 -0
  390. package/Resources/skills/game-physics/SKILL.md +13 -0
  391. package/Resources/skills/game-playtest/SKILL.md +26 -0
  392. package/Resources/skills/game-ui/SKILL.md +278 -0
  393. package/Resources/skills/github-projects/SKILL.md +62 -0
  394. package/Resources/skills/icloud-sync/SKILL.md +30 -0
  395. package/Resources/skills/iphone-hardware/SKILL.md +57 -0
  396. package/Resources/skills/iphone-widgets/SKILL.md +53 -0
  397. package/Resources/skills/lg-developer-mode/SKILL.md +152 -0
  398. package/Resources/skills/mac-widgets/SKILL.md +60 -0
  399. package/Resources/skills/maps/SKILL.md +8 -0
  400. package/Resources/skills/menu-bar/SKILL.md +36 -0
  401. package/Resources/skills/more-apps/SKILL.md +53 -0
  402. package/Resources/skills/phone-controllers/SKILL.md +79 -0
  403. package/Resources/skills/phone-pages/SKILL.md +173 -0
  404. package/Resources/skills/roku-developer-mode/SKILL.md +106 -0
  405. package/Resources/skills/scene-3d/SKILL.md +27 -0
  406. package/Resources/skills/scripting/SKILL.md +17 -0
  407. package/Resources/skills/share-extension/SKILL.md +22 -0
  408. package/Resources/skills/tv-design/SKILL.md +72 -0
  409. package/Resources/skills/web-app/SKILL.md +170 -0
  410. package/Resources/skills/web-game/SKILL.md +95 -0
  411. package/Resources/skills/web-or-native/SKILL.md +108 -0
  412. package/Resources/skills/wish-links/SKILL.md +156 -0
  413. package/THIRD_PARTY_NOTICES.md +170 -0
  414. package/cli/ai.mjs +237 -0
  415. package/cli/android.mjs +941 -0
  416. package/cli/app-ai.mjs +473 -0
  417. package/cli/browser.mjs +284 -0
  418. package/cli/calls.mjs +594 -0
  419. package/cli/dev.mjs +820 -0
  420. package/cli/devices.mjs +984 -0
  421. package/cli/lamp.mjs +1326 -0
  422. package/cli/lampapp.mjs +332 -0
  423. package/cli/lamps/android-host/LampPageGateway.kt +345 -0
  424. package/cli/lamps/android-host/app/build.gradle.kts +40 -0
  425. package/cli/lamps/android-host/build.gradle.kts +4 -0
  426. package/cli/lamps/android-host/game/AndroidManifest.xml +33 -0
  427. package/cli/lamps/android-host/game/MainActivity.kt +173 -0
  428. package/cli/lamps/android-host/gradle/libs.versions.toml +39 -0
  429. package/cli/lamps/android-host/gradle.properties +8 -0
  430. package/cli/lamps/android-host/page/AndroidManifest.xml +35 -0
  431. package/cli/lamps/android-host/page/MainActivity.kt +193 -0
  432. package/cli/lamps/android-host/settings.gradle.kts +30 -0
  433. package/cli/lamps/android-host/tools.json +43 -0
  434. package/cli/lamps/lamp-controllers.js +2 -0
  435. package/cli/lamps/lamp-for-games.js +6922 -0
  436. package/cli/lamps/lamp.js +7082 -0
  437. package/cli/lamps/mac-starter/.lamp/meta.json +1 -0
  438. package/cli/lamps/mac-starter/APP.md +12 -0
  439. package/cli/lamps/mac-starter/Package.swift +8 -0
  440. package/cli/lamps/mac-starter/Sources/App.swift +11 -0
  441. package/cli/lamps/mac-starter/Sources/ContentView.swift +17 -0
  442. package/cli/lamps/mac-starter/Sources/LampSupport.swift +18215 -0
  443. package/cli/lamps/mac-starter/build.sh +336 -0
  444. package/cli/lamps/mac-starter/gitignore +3 -0
  445. package/cli/lamps/mac-starter/lamp-starter.json +6 -0
  446. package/cli/lamps/web-starter/APP.md +8 -0
  447. package/cli/lamps/web-starter/app.js +1 -0
  448. package/cli/lamps/web-starter/index.html +17 -0
  449. package/cli/lamps/web-starter/lamp-starter.json +5 -0
  450. package/cli/lamps/web-starter/lamp.js +7082 -0
  451. package/cli/lamps/web-starter/style.css +25 -0
  452. package/cli/link.mjs +202 -0
  453. package/cli/local-ai.mjs +193 -0
  454. package/cli/mac.mjs +621 -0
  455. package/cli/mdns.mjs +205 -0
  456. package/cli/msix.mjs +413 -0
  457. package/cli/network.mjs +209 -0
  458. package/cli/openrouter.mjs +133 -0
  459. package/cli/outside.mjs +203 -0
  460. package/cli/page.js +317 -0
  461. package/cli/place.mjs +298 -0
  462. package/cli/png.mjs +184 -0
  463. package/cli/share.mjs +270 -0
  464. package/cli/skill/SKILL.md +280 -0
  465. package/cli/skills.mjs +71 -0
  466. package/cli/state.mjs +176 -0
  467. package/cli/update.mjs +162 -0
  468. package/package.json +20 -4
  469. package/site/lib/quota.js +59 -0
  470. package/site/lib/shared-wishes.js +1727 -0
@@ -0,0 +1,332 @@
1
+ // A Lamp app file (`.lampapp`, what Lamp's Share… makes and a lamp.dev link carries): a zip of the app's own files and
2
+ // lamp-app.json, which says what it is, with none of Lamp's own files in it (the Mac that opens it writes its own).
3
+ // Unpacked into a folder lamp runs; Lamp's app reads the same file with its review and checks (`Sharing.open`).
4
+
5
+ import { randomUUID } from "node:crypto";
6
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
7
+ import { basename, dirname, join, resolve, sep } from "node:path";
8
+ import { inflateRawSync } from "node:zlib";
9
+ import { Problem, RESOURCES, manifestOf, projectOf, stateOf } from "./state.mjs";
10
+ import { LIMITS, nameOf, zipOf } from "./share.mjs";
11
+
12
+ // What a Lamp app file may hold, written once in Resources/share-rules.json, which Lamp's app reads too (`ShareRules`):
13
+ // the sizes another Lamp opens, the names a license goes by, and the shapes of keys a shared file never carries.
14
+ const RULES = JSON.parse(readFileSync(join(RESOURCES, "share-rules.json"), "utf8"));
15
+ export const MAX_FILES = RULES.limits.files, MAX_UNPACKED = RULES.limits.unpackedBytes, MAX_ARCHIVE = RULES.limits.archiveBytes;
16
+
17
+ /**
18
+ * The files of a zip, by path: each a regular file's bytes, in the folder it names. A path that leaves the folder, a
19
+ * link, or a file packed some way other than stored or deflated isn't taken; nor is a zip bigger than a Lamp app file
20
+ * is let be, unpacked or not.
21
+ */
22
+ export function unzipped(zip) {
23
+ if (zip.length > MAX_ARCHIVE) throw new Problem("it's bigger than a Lamp app file is let be");
24
+ let end = -1;
25
+ for (let at = zip.length - 22; at >= Math.max(0, zip.length - 22 - 0xffff); at--) if (zip.readUInt32LE(at) === 0x06054b50) { end = at; break; }
26
+ if (end < 0) throw new Problem("it isn't a Lamp app file: it isn't a zip");
27
+ const count = zip.readUInt16LE(end + 10);
28
+ let at = zip.readUInt32LE(end + 16), total = 0;
29
+ if (count > MAX_FILES) throw new Problem(`it holds more than a Lamp app would (over ${MAX_FILES} files)`);
30
+ const files = new Map();
31
+ for (let n = 0; n < count; n++) {
32
+ if (zip.readUInt32LE(at) !== 0x02014b50) throw new Problem("it isn't a Lamp app file: its zip can't be read");
33
+ const method = zip.readUInt16LE(at + 10), packed = zip.readUInt32LE(at + 20), size = zip.readUInt32LE(at + 24);
34
+ const nameLength = zip.readUInt16LE(at + 28), extra = zip.readUInt16LE(at + 30), comment = zip.readUInt16LE(at + 32);
35
+ const unix = zip.readUInt32LE(at + 38) >>> 16, local = zip.readUInt32LE(at + 42);
36
+ const name = zip.toString("utf8", at + 46, at + 46 + nameLength);
37
+ at += 46 + nameLength + extra + comment;
38
+ // A folder is made with its files, and a Mac's own records (__MACOSX, .DS_Store) aren't the app's.
39
+ if (name.endsWith("/") || name.startsWith("__MACOSX/") || basename(name) === ".DS_Store") continue;
40
+ const parts = name.split("/");
41
+ if (name.startsWith("/") || name.includes("\\") || parts.some((part) => part === ".." || part === "" || part === ".")) throw new Problem(`it names a file outside its folder (${name})`);
42
+ if ((unix & 0o170000) === 0o120000) continue;
43
+ total += size;
44
+ if (total > MAX_UNPACKED) throw new Problem("it holds more than a Lamp app would (over 256 MB unpacked)");
45
+ const start = local + 30 + zip.readUInt16LE(local + 26) + zip.readUInt16LE(local + 28), data = zip.subarray(start, start + packed);
46
+ const bytes = method === 0 ? Buffer.from(data) : method === 8 ? inflateRawSync(data, { maxOutputLength: size + 1 }) : null;
47
+ if (!bytes || bytes.length !== size) throw new Problem(`it holds a file lamp can't unpack (${name})`);
48
+ files.set(name, bytes);
49
+ }
50
+ return files;
51
+ }
52
+
53
+ /**
54
+ * Unpacks a Lamp app file into `folder` (a new folder beside the file, named for it, when none is given), and answers
55
+ * what the folder is to lamp. The folder must be new or empty: nothing of anyone's is written over. A file of a kind
56
+ * lamp doesn't run is unpacked all the same, with the reason, so it can be opened in Lamp's app.
57
+ */
58
+ export function unpack(file, folder = null) {
59
+ const path = resolve(file);
60
+ let zip;
61
+ try { zip = readFileSync(path); } catch { throw new Problem(`${path} can't be read`); }
62
+ const files = unzipped(zip);
63
+ // A file Lamp made holds its app at its top, or (from some Macs) inside one folder.
64
+ const tops = new Set([...files.keys()].map((name) => name.split("/")[0]));
65
+ const inner = !files.has("lamp-app.json") && tops.size === 1 && files.has(`${[...tops][0]}/lamp-app.json`) ? `${[...tops][0]}/` : "";
66
+ if (!files.has(`${inner}lamp-app.json`)) throw new Problem("it isn't a Lamp app file: it has no lamp-app.json");
67
+ const target = resolve(folder ?? join(dirname(path), basename(path).replace(/\.lampapp$/i, "")));
68
+ if (existsSync(target) && readdirSync(target).length) throw new Problem(`${target} already has things in it`);
69
+ for (const [name, bytes] of files) {
70
+ if (!name.startsWith(inner)) continue;
71
+ const out = join(target, ...name.slice(inner.length).split("/"));
72
+ if (!out.startsWith(target + sep)) continue;
73
+ mkdirSync(dirname(out), { recursive: true });
74
+ writeFileSync(out, bytes);
75
+ }
76
+ const manifest = manifestOf(target);
77
+ let project = null, refused = null;
78
+ try { project = projectOf(target); } catch (error) { if (!(error instanceof Problem)) throw error; refused = error.message; }
79
+ return { folder: target, name: typeof manifest?.name === "string" ? manifest.name : basename(target), project, refused };
80
+ }
81
+
82
+ // MARK: Making one
83
+
84
+ // Lamp's own files beside a page, by their path in the page: the Mac that opens the file writes its own
85
+ // (`GameFiles.isLamps`, `ScreenFiles.isLamps`).
86
+ const GAME_LAMPS = (path) => ["lamp-game.js", "lamp.js", "lamp-controllers.js", "lamp-phaser.js", "lamp-device.js", "lamp-build.js"].includes(path)
87
+ || path.startsWith("phaser/") || path.startsWith("three/");
88
+ const SCREEN_LAMPS = (path) => path === "lamp.js";
89
+ // Lamp's own record of an app, beside a page at a folder's top that has no `.lamp-wish/` (a page lamp made): it goes as
90
+ // itself, never in the page. Anything else there, an Assets/ or an icon.png included, is the page's.
91
+ const WISH_FILES = new Set(["APP.md", "about.json", "icon.json", "icon-glass.json", "icon-art.png", "credits.json", "lamp-app.json", "capabilities.json"]);
92
+ // The hidden files at a page's top that a web server reads, which go with a site (`ScreenFiles.servedHidden`).
93
+ const SERVED_HIDDEN = new Set([".nojekyll", ".well-known"]);
94
+ // The Mac app's own Swift beside Lamp's (`Template`'s support files), which stays behind.
95
+ const SWIFT_LAMPS = new Set(["LampSupport.swift", "LampScene.swift", "LampWidgetSupport.swift", "LampShareSupport.swift"]);
96
+
97
+ // Shapes of keys and tokens whoever's they are (`ShareCheck.tokenShapes`).
98
+ const TOKEN_SHAPES = RULES.tokenShapes.map((shape) => new RegExp(shape.pattern));
99
+
100
+ /** A license text by its name (`Credits.isLicenceFile`): LICENSE, LICENCE, COPYING, NOTICE or UNLICENSE, never code. */
101
+ export function isLicenceFile(path) {
102
+ if (typeof path !== "string" || !path || path.startsWith("/") || path.split("/").some((part) => !part || part === ".." || part === ".")) return false;
103
+ const name = path.split("/").pop(), dot = name.lastIndexOf("."), ext = dot > 0 ? name.slice(dot + 1).toLowerCase() : "";
104
+ const rules = RULES.licenseFiles;
105
+ return rules.startsWith.some((start) => name.toUpperCase().startsWith(start))
106
+ && ext.length <= rules.longestExtension && /^[a-z0-9]*$/.test(ext) && !rules.neverExtensions.includes(ext);
107
+ }
108
+
109
+ /**
110
+ * Whether a license expression gives no license (`ShareCheck.licence` is `.none`): nothing said, or an expression that
111
+ * isn't one (SPDX ids joined by AND, OR and WITH, in brackets as needed). Any id, known or not, is a license its
112
+ * author chose.
113
+ */
114
+ export function noLicense(expression) {
115
+ const text = String(expression ?? "").trim();
116
+ if (!text) return true;
117
+ const tokens = text.match(/[()]|[^\s()]+/g) ?? [];
118
+ let at = 0;
119
+ const word = (token) => token?.toUpperCase();
120
+ const term = () => {
121
+ const token = tokens[at++];
122
+ if (token === undefined) return false;
123
+ if (token === "(") { if (!or() || tokens[at] !== ")") return false; at++; }
124
+ else if (["AND", "OR", "WITH", ")"].includes(word(token))) return false;
125
+ // An exception only loosens a license: the license itself is what's read.
126
+ while (word(tokens[at]) === "WITH") { at++; const exception = tokens[at++]; if (exception === undefined || exception === "(" || exception === ")") return false; }
127
+ return true;
128
+ };
129
+ const and = () => { if (!term()) return false; while (word(tokens[at]) === "AND") { at++; if (!term()) return false; } return true; };
130
+ const or = () => { if (!and()) return false; while (word(tokens[at]) === "OR") { at++; if (!and()) return false; } return true; };
131
+ return !(or() && at === tokens.length);
132
+ }
133
+
134
+ /**
135
+ * What an app declares, as Lamp reads it (`Template.Capabilities.checked`): only what passes each field's check, and
136
+ * null where nothing does, so a file carries nothing Lamp wouldn't write into an app's Info.plist.
137
+ */
138
+ export function checkedCapabilities(said) {
139
+ if (!said || typeof said !== "object" || Array.isArray(said)) return null;
140
+ const list = (value) => (Array.isArray(value) ? value.filter((item) => typeof item === "string") : []);
141
+ const modes = ["audio", "location", "fetch", "processing", "remote-notification", "bluetooth-central", "bluetooth-peripheral", "external-accessory", "nearby-interaction", "voip"];
142
+ const kinds = [];
143
+ for (const entry of list(said.opens)) {
144
+ let name = entry.trim().toLowerCase();
145
+ if (name.startsWith(".") && name.length > 1) name = name.slice(1);
146
+ const plain = /^[a-z0-9]{1,16}$/.test(name), identifier = name.includes(".") && /^[a-z0-9][a-z0-9.-]{2,80}$/.test(name);
147
+ if ((plain || identifier) && !kinds.includes(name) && kinds.length < 40) kinds.push(name);
148
+ }
149
+ const reason = typeof said.localNetwork === "string" ? said.localNetwork.trim() : "";
150
+ const checked = {
151
+ ...Object.fromEntries(["healthkit", "nfc", "siri", "background", "icloud", "weather", "homekit", "timeSensitive", "game"].filter((key) => said[key] === true).map((key) => [key, true])),
152
+ backgroundModes: list(said.backgroundModes).filter((mode) => modes.includes(mode)),
153
+ bonjourServices: list(said.bonjourServices).filter((service) => /^_[A-Za-z0-9-]{1,15}\._(tcp|udp)$/.test(service)),
154
+ backgroundTasks: list(said.backgroundTasks).filter((task) => /^[A-Za-z0-9._-]+$/.test(task)),
155
+ opens: kinds,
156
+ ...(reason && [...reason].length <= 150 && /^[\p{L}\p{N} .,;:!?'’()–-]+$/u.test(reason) ? { localNetwork: reason } : {}),
157
+ };
158
+ for (const key of ["backgroundModes", "bonjourServices", "backgroundTasks", "opens"]) if (!checked[key].length) delete checked[key];
159
+ return Object.keys(checked).length ? checked : null;
160
+ }
161
+
162
+ /**
163
+ * What's new in each release, for the app's What's New in the copies made from it (`WishReleases.forApp`): those Lamp's
164
+ * app recorded for a folder it made, those a file brought it, and those a file lamp unpacked brought (its releases.json),
165
+ * newest first, each once, checked as the site checks them.
166
+ */
167
+ function releasesOf(app) {
168
+ const read = (path) => { try { const list = JSON.parse(readFileSync(path, "utf8")); return Array.isArray(list) ? list : []; } catch { return []; } };
169
+ const tidy = (line) => String(line).split(/\s+/).join(" ").replace(/^[•\-*· ]+|[•\-*· ]+$/g, "").slice(0, LIMITS.releaseLine);
170
+ const seen = new Set(), soon = Date.now() + 86_400_000;
171
+ return [...read(join(app, ".lamp", "releases.json")), ...read(join(app, ".lamp", "releases-received.json")), ...read(join(app, "releases.json"))]
172
+ .map((entry) => ({ date: new Date(entry?.date), lines: (Array.isArray(entry?.lines) ? entry.lines : []).flatMap((line) => String(line).split(/\r?\n/)).map(tidy).filter(Boolean).slice(0, LIMITS.releaseLines) }))
173
+ .filter((entry) => entry.lines.length && !Number.isNaN(entry.date.getTime()) && entry.date.getTime() <= soon)
174
+ .sort((a, b) => b.date - a.date)
175
+ .filter((entry) => { const key = `${entry.date.getTime()} ${entry.lines.join("\n")}`; return !seen.has(key) && seen.add(key); })
176
+ .slice(0, LIMITS.releases)
177
+ .map((entry) => ({ date: entry.date.toISOString().replace(/\.\d+Z$/, "Z"), lines: entry.lines }));
178
+ }
179
+
180
+ /** Every regular file under `dir`, by its path from `dir` (`prefix` before it), none hidden unless `hidden` lets it, no link followed. */
181
+ function filesUnder(dir, prefix = "", { hidden = () => false, skip = () => false } = {}) {
182
+ const found = [];
183
+ let entries;
184
+ try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return found; }
185
+ for (const entry of entries) {
186
+ const path = prefix + entry.name;
187
+ if ((entry.name.startsWith(".") && !hidden(path)) || skip(path)) continue;
188
+ if (entry.isDirectory()) found.push(...filesUnder(join(dir, entry.name), path + "/", { hidden: () => false, skip }));
189
+ else if (entry.isFile()) found.push(path);
190
+ }
191
+ return found;
192
+ }
193
+
194
+ /**
195
+ * Which app this is, the same in every file made from it (`Sharing.identity`): Lamp's app's for a folder it made,
196
+ * else the one lamp keeps for the folder, else the one the folder came with in its lamp-app.json, kept from then on.
197
+ */
198
+ function identityOf(folder) {
199
+ const uuid = (text) => /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(String(text ?? "").trim()) ? String(text).trim().toUpperCase() : null;
200
+ const read = (path) => { try { return uuid(readFileSync(path, "utf8")); } catch { return null; } };
201
+ const kept = join(stateOf(folder), "share-id");
202
+ const known = read(join(folder, ".lamp", "share-id")) ?? read(kept);
203
+ if (known) return known;
204
+ const id = uuid(manifestOf(folder)?.app) ?? randomUUID().toUpperCase();
205
+ mkdirSync(stateOf(folder), { recursive: true });
206
+ writeFileSync(kept, id);
207
+ return id;
208
+ }
209
+
210
+ /**
211
+ * The app in the folder as a Lamp app file (`Sharing.export`), as bytes, with its name: its own files as its kind
212
+ * travels (a page's in Web/, a Mac app's Swift in Sources/ and its widget's and share extension's), Assets/, APP.md and
213
+ * what it declares, its credits with this app added to the chain it came by, each license they name, its icon's design,
214
+ * and lamp-app.json, which says what it is. Never Lamp's own files, which the Mac that opens it writes, nor anything
215
+ * hidden. Refused when a license its credits name is gone, when something in it is shaped like a key, or when it's
216
+ * more than another Lamp opens. Work its credits give no license for goes only with `anyway`: its author may not want
217
+ * it passed on.
218
+ */
219
+ export function exportApp(given, { anyway = false } = {}) {
220
+ const project = projectOf(given), folder = project.folder, manifest = manifestOf(folder);
221
+ // Where the app's own record is (its credits, licenses, notes, files and the Swift beside its page): the folder, or
222
+ // for a site laid out as Lamp puts one on GitHub, `.lamp-wish/` beside the page (`StaticSite.layOut`).
223
+ const wishFolder = existsSync(join(folder, ".lamp-wish", "lamp-app.json")), app = wishFolder ? join(folder, ".lamp-wish") : folder;
224
+ const credits = (() => { try { return JSON.parse(readFileSync(join(app, "credits.json"), "utf8")); } catch { return {}; } })();
225
+ const upstream = Array.isArray(credits?.upstream) ? credits.upstream.filter((source) => source && typeof source.name === "string") : [];
226
+ const terms = (source) => [source.licenseFile, ...(Array.isArray(source.noticeFiles) ? source.noticeFiles : [])].filter((path) => typeof path === "string");
227
+ const name = String((typeof manifest?.name === "string" && manifest.name.trim()) || (project.kind === "page" ? nameOf(project) : basename(folder))).replace(/[\r\n/:]+/g, " ").trim().slice(0, 60) || "App";
228
+ for (const source of upstream) {
229
+ const gone = terms(source).find((path) => !existsSync(join(app, path)));
230
+ if (gone) throw new Problem(`${name} can't be shared: the license of ${source.name} is missing from it. Put ${gone} back.`);
231
+ }
232
+ const unlicensed = upstream.filter((source) => noLicense(source.license));
233
+ if (unlicensed.length && !anyway) {
234
+ throw new Problem(`${name} uses work that came with no license (${unlicensed.map((source) => source.author ? `${source.name} by ${source.author}` : source.name).join(", ")}). Ask the person whether they're comfortable sharing it; --anyway shares it all the same.`);
235
+ }
236
+
237
+ const files = new Map(), from = (path) => readFileSync(join(app, path));
238
+ let kind, site = false, flags = {};
239
+ if (project.kind === "page") {
240
+ kind = typeof manifest?.platform === "string" ? manifest.platform : project.game ? "game" : "web-app";
241
+ const lamps = kind === "game" ? GAME_LAMPS : SCREEN_LAMPS;
242
+ // A page in Web/ goes as it is; a page at the folder's top (a plain site, or a page lamp made) is a site, whose
243
+ // page is Web/ in the file and whose own files beside it go as themselves.
244
+ // A site stays one at every export, whether its page is at the folder's top or (unpacked) in Web/.
245
+ site = kind === "web-app" && (manifest?.site === true || !project.lamps);
246
+ for (const path of filesUnder(project.root, "", { hidden: (path) => site && SERVED_HIDDEN.has(path), skip: (path) => path === "node_modules" || (!project.lamps && (wishFolder ? path === ".lamp-wish" || path === "LAMP-LICENSE.txt" : WISH_FILES.has(path))) })) {
247
+ if (!lamps(path)) files.set(`Web/${path}`, readFileSync(join(project.root, path)));
248
+ }
249
+ if (project.lamps || wishFolder) {
250
+ // The Swift beside the page that answers its calls of the device, and a game's phone page.
251
+ for (const path of filesUnder(join(app, "Sources"), "Sources/")) if (path.endsWith(".swift") && (kind === "game" ? path === "Sources/Native.swift" : !["Sources/LampSupport.swift", "Sources/LampPage.swift", "Sources/LampControllerKit.swift", "Sources/LampScreen.swift", "Sources/LampWebApp.swift"].includes(path))) files.set(path, from(path));
252
+ if (kind === "game") for (const path of [...filesUnder(join(app, "Phone"), "Phone/"), ...filesUnder(join(app, "src"), "src/")]) files.set(path, from(path));
253
+ }
254
+ } else {
255
+ kind = "mac";
256
+ for (const path of filesUnder(join(folder, "Sources"), "Sources/")) if (path.endsWith(".swift") && !SWIFT_LAMPS.has(basename(path))) files.set(path, from(path));
257
+ for (const [extra, flag] of [["Widget", "widget"], ["Share", "share"]]) {
258
+ const code = filesUnder(join(folder, extra), `${extra}/`).filter((path) => path.endsWith(".swift") && !SWIFT_LAMPS.has(basename(path)));
259
+ for (const path of code) files.set(path, from(path));
260
+ flags[flag] = code.length > 0;
261
+ }
262
+ flags.scene = [...files.keys()].some((path) => path.startsWith("Sources/") && /^\s*(@\w+\s+)?import\s+RealityKit\b/m.test(files.get(path).toString("utf8")));
263
+ }
264
+ if (![...files.keys()].some((path) => path.startsWith("Sources/") || path.startsWith("Web/"))) throw new Problem(`${name} has no code in it to share`);
265
+ // Code that isn't text can't be read by Lamp's checks on the way in, and Lamp never writes any.
266
+ for (const [path, bytes] of files) if (path.endsWith(".swift") && bytes.includes(0)) throw new Problem(`${name} can't be shared: ${path} isn't plain text`);
267
+
268
+ // The app's own files, capped so a file stays small enough to send (`Sharing.maxAttachedBytes`).
269
+ let attached = 0;
270
+ // A page at the folder's top with no `.lamp-wish/` keeps an Assets/ there as its own: it went with the page.
271
+ for (const path of project.kind === "page" && !project.lamps && !wishFolder ? [] : filesUnder(join(app, "Assets"), "Assets/")) {
272
+ attached += statSync(join(app, path)).size;
273
+ if (attached > MAX_ARCHIVE - 8 * 1024 * 1024) throw new Problem(`${name} is too big to share: its pictures and other files come to over ${Math.floor((MAX_ARCHIVE - 8 * 1024 * 1024) / 1_000_000)} MB`);
274
+ files.set(path, from(path));
275
+ }
276
+ if (existsSync(join(app, "APP.md"))) files.set("APP.md", from("APP.md"));
277
+ // What the app declares; the Lamp that opens the file checks each of it again as it reads it.
278
+ let declares = false;
279
+ try {
280
+ const checked = checkedCapabilities(JSON.parse(readFileSync(join(app, "capabilities.json"), "utf8")));
281
+ if (checked) { files.set("capabilities.json", Buffer.from(JSON.stringify(sortedKeys(checked), null, 2))); declares = true; }
282
+ } catch {}
283
+ // Its icon's design, and the artwork drawn for it where the folder keeps it at its top (a file Lamp made does).
284
+ // icon.png at the top of a page lamp made is the page's, which went with it.
285
+ for (const icon of ["icon.json", "icon-glass.json", "icon-art.png", "icon.png"]) {
286
+ if (icon === "icon.png" && project.kind === "page" && !project.lamps && !wishFolder) continue;
287
+ if (existsSync(join(app, icon))) files.set(icon, from(icon));
288
+ }
289
+ const releases = releasesOf(app);
290
+ if (releases.length) files.set("releases.json", Buffer.from(JSON.stringify(releases, null, 2)));
291
+
292
+ // Whoever opens the file is remixing this app: it's added to the chain its credits carry, as one link if it's
293
+ // already the last (`Credits.remixed`).
294
+ const me = { name, wish: identityOf(folder) }, chain = Array.isArray(credits?.remixOf) ? credits.remixOf.filter((link) => link && typeof link.name === "string") : [];
295
+ const last = chain.at(-1);
296
+ if (last && (last.wish ? last.wish === me.wish : !last.starter && last.name === me.name)) chain[chain.length - 1] = { ...last, ...me, url: last.url, commit: last.commit };
297
+ else chain.push(me);
298
+ const carried = { remixOf: chain.slice(0, 32).map((link) => Object.fromEntries(Object.entries(link).filter(([, value]) => value != null))), upstream: upstream.slice(0, 32) };
299
+ if (Array.isArray(credits?.generated) && credits.generated.length) carried.generated = credits.generated.filter((entry) => typeof entry?.file === "string" && existsSync(join(app, entry.file)));
300
+ files.set("credits.json", Buffer.from(JSON.stringify(sortedKeys(carried), null, 2)));
301
+ // Each license and notice the credits name goes with the work it covers.
302
+ for (const source of upstream) for (const path of terms(source)) if (isLicenceFile(path) && !files.has(path)) files.set(path, from(path));
303
+
304
+ let description = null;
305
+ try { const said = JSON.parse(readFileSync(join(app, "about.json"), "utf8")).description; if (typeof said === "string" && said.trim() && !/[\r\n]/.test(said.trim())) description = said.trim(); } catch {}
306
+ // The number a Lamp that opens it reads it by (`Sharing.format`): a web app or screen 12, a game 11, a Mac app by what it has.
307
+ const format = kind === "web-app" || kind === "screen" ? 12 : kind === "game" ? 11 : flags.scene ? 8 : flags.share ? 7 : declares ? 4 : flags.widget ? 3 : 2;
308
+ files.set("lamp-app.json", Buffer.from(JSON.stringify(sortedKeys({
309
+ app: me.wish, ...(description ? { description } : {}), exportedAt: new Date().toISOString().replace(/\.\d+Z$/, "Z"),
310
+ format, name, platform: kind, ...(site ? { site: true } : {}),
311
+ }), null, 2)));
312
+
313
+ // Nothing of the person's goes with it: the app's own token and anything shaped like a key.
314
+ const known = [join(folder, ".lamp", "token"), join(stateOf(folder), "app-token")].map((path) => { try { return readFileSync(path, "utf8").trim(); } catch { return ""; } }).filter((value) => value.length >= 16);
315
+ const leaks = [...files].filter(([, bytes]) => { const text = bytes.toString("utf8"); return known.some((value) => text.includes(value)) || TOKEN_SHAPES.some((shape) => shape.test(text)); }).map(([path]) => path).sort();
316
+ if (leaks.length) throw new Problem(`${name} can't be shared: it holds a key or a password, in ${leaks[0]}${leaks.length > 1 ? ` and ${leaks.length - 1} more` : ""}. Take it out and keep it out of the code.`);
317
+
318
+ // Counted as another Lamp counts it on the way in: files and the folders they're in, and bytes unpacked.
319
+ const folders = new Set([...files.keys()].flatMap((path) => path.split("/").slice(0, -1).map((_, n, parts) => parts.slice(0, n + 1).join("/"))));
320
+ if (files.size + folders.size > MAX_FILES) throw new Problem(`${name} has too many files to share`);
321
+ if ([...files.values()].reduce((sum, bytes) => sum + bytes.length, 0) > MAX_UNPACKED) throw new Problem(`${name} is too big to share`);
322
+ const bytes = zipOf([...files].sort(([a], [b]) => a.localeCompare(b)));
323
+ if (bytes.length > MAX_ARCHIVE) throw new Problem(`${name} is too big to share`);
324
+ return { name, kind, bytes, files: files.size };
325
+ }
326
+
327
+ /** An object with its keys in order, at every level, as Lamp's own encoder writes its files. */
328
+ function sortedKeys(value) {
329
+ if (Array.isArray(value)) return value.map(sortedKeys);
330
+ if (!value || typeof value !== "object") return value;
331
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortedKeys(value[key])]));
332
+ }