@atlaspack/core 2.16.2-canary.48 → 2.16.2-canary.481

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 (380) hide show
  1. package/CHANGELOG.md +1324 -0
  2. package/dist/AssetGraph.js +523 -0
  3. package/dist/Atlaspack.js +701 -0
  4. package/dist/AtlaspackConfig.js +324 -0
  5. package/dist/AtlaspackConfig.schema.js +117 -0
  6. package/dist/BundleGraph.js +1906 -0
  7. package/dist/CommittedAsset.js +142 -0
  8. package/dist/Dependency.js +125 -0
  9. package/dist/Environment.js +132 -0
  10. package/dist/EnvironmentManager.js +108 -0
  11. package/dist/IdentifierRegistry.js +38 -0
  12. package/dist/InternalConfig.js +37 -0
  13. package/dist/PackagerRunner.js +470 -0
  14. package/dist/ReporterRunner.js +151 -0
  15. package/dist/RequestTracker.js +1297 -0
  16. package/dist/SymbolPropagation.js +624 -0
  17. package/dist/TargetDescriptor.schema.js +146 -0
  18. package/dist/Transformation.js +514 -0
  19. package/dist/UncommittedAsset.js +310 -0
  20. package/dist/Validation.js +196 -0
  21. package/dist/applyRuntimes.js +384 -0
  22. package/dist/assetUtils.js +169 -0
  23. package/dist/atlaspack-v3/AtlaspackV3.js +83 -0
  24. package/dist/atlaspack-v3/NapiWorkerPool.js +114 -0
  25. package/dist/atlaspack-v3/fs.js +53 -0
  26. package/dist/atlaspack-v3/index.js +25 -0
  27. package/dist/atlaspack-v3/jsCallable.js +16 -0
  28. package/dist/atlaspack-v3/worker/compat/asset-symbols.js +190 -0
  29. package/dist/atlaspack-v3/worker/compat/bitflags.js +98 -0
  30. package/dist/atlaspack-v3/worker/compat/dependency.js +43 -0
  31. package/dist/atlaspack-v3/worker/compat/environment.js +57 -0
  32. package/dist/atlaspack-v3/worker/compat/index.js +24 -0
  33. package/dist/atlaspack-v3/worker/compat/mutable-asset.js +152 -0
  34. package/dist/atlaspack-v3/worker/compat/plugin-config.js +64 -0
  35. package/dist/atlaspack-v3/worker/compat/plugin-options.js +137 -0
  36. package/dist/atlaspack-v3/worker/compat/plugin-tracer.js +10 -0
  37. package/dist/atlaspack-v3/worker/compat/target.js +14 -0
  38. package/dist/atlaspack-v3/worker/side-effect-detector.js +243 -0
  39. package/dist/atlaspack-v3/worker/worker.js +398 -0
  40. package/dist/constants.js +17 -0
  41. package/dist/dumpGraphToGraphViz.js +281 -0
  42. package/dist/index.js +62 -0
  43. package/dist/loadAtlaspackPlugin.js +128 -0
  44. package/dist/loadDotEnv.js +41 -0
  45. package/dist/projectPath.js +83 -0
  46. package/dist/public/Asset.js +279 -0
  47. package/dist/public/Bundle.js +224 -0
  48. package/dist/public/BundleGraph.js +371 -0
  49. package/dist/public/BundleGroup.js +53 -0
  50. package/dist/public/Config.js +286 -0
  51. package/dist/public/Dependency.js +138 -0
  52. package/dist/public/Environment.js +278 -0
  53. package/dist/public/MutableBundleGraph.js +277 -0
  54. package/dist/public/PluginOptions.js +80 -0
  55. package/dist/public/Symbols.js +248 -0
  56. package/dist/public/Target.js +69 -0
  57. package/dist/registerCoreWithSerializer.js +38 -0
  58. package/dist/requests/AssetGraphRequest.js +430 -0
  59. package/dist/requests/AssetGraphRequestRust.js +471 -0
  60. package/dist/requests/AssetRequest.js +130 -0
  61. package/dist/requests/AtlaspackBuildRequest.js +98 -0
  62. package/dist/requests/AtlaspackConfigRequest.js +493 -0
  63. package/dist/requests/BundleGraphRequest.js +381 -0
  64. package/dist/requests/BundleGraphRequestRust.js +324 -0
  65. package/dist/requests/BundleGraphRequestUtils.js +262 -0
  66. package/dist/requests/ConfigRequest.js +246 -0
  67. package/dist/requests/DevDepRequest.js +204 -0
  68. package/dist/requests/EntryRequest.js +314 -0
  69. package/dist/requests/PackageRequest.js +89 -0
  70. package/dist/requests/PathRequest.js +349 -0
  71. package/dist/requests/TargetRequest.js +1316 -0
  72. package/dist/requests/ValidationRequest.js +49 -0
  73. package/dist/requests/WriteBundleRequest.js +522 -0
  74. package/dist/requests/WriteBundlesRequest.js +190 -0
  75. package/dist/requests/asset-graph-diff.js +128 -0
  76. package/dist/requests/asset-graph-dot.js +131 -0
  77. package/dist/resolveOptions.js +267 -0
  78. package/dist/rustWorkerThreadDylibHack.js +19 -0
  79. package/dist/serializerCore.browser.js +43 -0
  80. package/dist/summarizeRequest.js +39 -0
  81. package/dist/types.js +31 -0
  82. package/dist/utils.js +172 -0
  83. package/dist/worker.js +123 -0
  84. package/lib/AssetGraph.js +53 -15
  85. package/lib/Atlaspack.js +140 -56
  86. package/lib/AtlaspackConfig.js +17 -6
  87. package/lib/AtlaspackConfig.schema.js +16 -5
  88. package/lib/BundleGraph.js +390 -43
  89. package/lib/CommittedAsset.js +8 -2
  90. package/lib/Dependency.js +9 -3
  91. package/lib/Environment.js +16 -10
  92. package/lib/EnvironmentManager.js +143 -0
  93. package/lib/IdentifierRegistry.js +2 -4
  94. package/lib/InternalConfig.js +3 -2
  95. package/lib/PackagerRunner.js +46 -82
  96. package/lib/ReporterRunner.js +8 -12
  97. package/lib/RequestTracker.js +191 -152
  98. package/lib/SymbolPropagation.js +52 -29
  99. package/lib/TargetDescriptor.schema.js +10 -1
  100. package/lib/Transformation.js +68 -19
  101. package/lib/UncommittedAsset.js +17 -24
  102. package/lib/Validation.js +20 -5
  103. package/lib/applyRuntimes.js +98 -7
  104. package/lib/assetUtils.js +16 -6
  105. package/lib/atlaspack-v3/AtlaspackV3.js +58 -15
  106. package/lib/atlaspack-v3/NapiWorkerPool.js +63 -2
  107. package/lib/atlaspack-v3/fs.js +4 -1
  108. package/lib/atlaspack-v3/index.js +28 -1
  109. package/lib/atlaspack-v3/jsCallable.js +0 -2
  110. package/lib/atlaspack-v3/worker/compat/asset-symbols.js +7 -4
  111. package/lib/atlaspack-v3/worker/compat/bitflags.js +31 -25
  112. package/lib/atlaspack-v3/worker/compat/dependency.js +4 -1
  113. package/lib/atlaspack-v3/worker/compat/environment.js +10 -7
  114. package/lib/atlaspack-v3/worker/compat/index.js +0 -11
  115. package/lib/atlaspack-v3/worker/compat/mutable-asset.js +16 -11
  116. package/lib/atlaspack-v3/worker/compat/plugin-config.js +14 -35
  117. package/lib/atlaspack-v3/worker/compat/plugin-options.js +16 -2
  118. package/lib/atlaspack-v3/worker/compat/plugin-tracer.js +3 -0
  119. package/lib/atlaspack-v3/worker/compat/target.js +2 -0
  120. package/lib/atlaspack-v3/worker/index.js +3 -0
  121. package/lib/atlaspack-v3/worker/side-effect-detector.js +214 -0
  122. package/lib/atlaspack-v3/worker/worker.js +231 -79
  123. package/lib/constants.js +0 -1
  124. package/lib/dumpGraphToGraphViz.js +72 -17
  125. package/lib/index.js +46 -3
  126. package/lib/loadAtlaspackPlugin.js +2 -3
  127. package/lib/loadDotEnv.js +5 -2
  128. package/lib/projectPath.js +6 -1
  129. package/lib/public/Asset.js +22 -12
  130. package/lib/public/Bundle.js +16 -18
  131. package/lib/public/BundleGraph.js +27 -25
  132. package/lib/public/BundleGroup.js +5 -6
  133. package/lib/public/Config.js +118 -18
  134. package/lib/public/Dependency.js +9 -7
  135. package/lib/public/Environment.js +13 -8
  136. package/lib/public/MutableBundleGraph.js +56 -15
  137. package/lib/public/PluginOptions.js +2 -2
  138. package/lib/public/Symbols.js +12 -12
  139. package/lib/public/Target.js +8 -7
  140. package/lib/registerCoreWithSerializer.js +7 -4
  141. package/lib/requests/AssetGraphRequest.js +61 -40
  142. package/lib/requests/AssetGraphRequestRust.js +314 -82
  143. package/lib/requests/AssetRequest.js +24 -7
  144. package/lib/requests/AtlaspackBuildRequest.js +53 -7
  145. package/lib/requests/AtlaspackConfigRequest.js +29 -19
  146. package/lib/requests/BundleGraphRequest.js +61 -130
  147. package/lib/requests/BundleGraphRequestRust.js +381 -0
  148. package/lib/requests/BundleGraphRequestUtils.js +280 -0
  149. package/lib/requests/ConfigRequest.js +55 -7
  150. package/lib/requests/DevDepRequest.js +32 -6
  151. package/lib/requests/EntryRequest.js +4 -3
  152. package/lib/requests/PackageRequest.js +56 -12
  153. package/lib/requests/PathRequest.js +26 -6
  154. package/lib/requests/TargetRequest.js +129 -60
  155. package/lib/requests/ValidationRequest.js +6 -2
  156. package/lib/requests/WriteBundleRequest.js +329 -20
  157. package/lib/requests/WriteBundlesRequest.js +64 -10
  158. package/lib/requests/asset-graph-diff.js +13 -8
  159. package/lib/requests/asset-graph-dot.js +2 -8
  160. package/lib/resolveOptions.js +37 -14
  161. package/lib/rustWorkerThreadDylibHack.js +0 -1
  162. package/lib/serializerCore.browser.js +1 -2
  163. package/lib/summarizeRequest.js +1 -1
  164. package/lib/types/AssetGraph.d.ts +55 -0
  165. package/lib/types/Atlaspack.d.ts +52 -0
  166. package/lib/types/AtlaspackConfig.d.ts +65 -0
  167. package/lib/types/AtlaspackConfig.schema.d.ts +53 -0
  168. package/lib/types/BundleGraph.d.ts +232 -0
  169. package/lib/types/CommittedAsset.d.ts +23 -0
  170. package/lib/types/Dependency.d.ts +44 -0
  171. package/lib/types/Environment.d.ts +11 -0
  172. package/lib/types/EnvironmentManager.d.ts +37 -0
  173. package/lib/types/IdentifierRegistry.d.ts +6 -0
  174. package/lib/types/InternalConfig.d.ts +23 -0
  175. package/lib/types/PackagerRunner.d.ts +85 -0
  176. package/lib/types/ReporterRunner.d.ts +25 -0
  177. package/lib/types/RequestTracker.d.ts +385 -0
  178. package/lib/types/SymbolPropagation.d.ts +11 -0
  179. package/lib/types/TargetDescriptor.schema.d.ts +5 -0
  180. package/lib/types/Transformation.d.ts +72 -0
  181. package/lib/types/UncommittedAsset.d.ts +61 -0
  182. package/lib/types/Validation.d.ts +37 -0
  183. package/lib/types/applyRuntimes.d.ts +25 -0
  184. package/lib/types/assetUtils.d.ts +42 -0
  185. package/lib/types/atlaspack-v3/AtlaspackV3.d.ts +35 -0
  186. package/lib/types/atlaspack-v3/NapiWorkerPool.d.ts +13 -0
  187. package/lib/types/atlaspack-v3/fs.d.ts +13 -0
  188. package/lib/types/atlaspack-v3/index.d.ts +6 -0
  189. package/lib/types/atlaspack-v3/jsCallable.d.ts +1 -0
  190. package/lib/types/atlaspack-v3/worker/compat/asset-symbols.d.ts +51 -0
  191. package/lib/types/atlaspack-v3/worker/compat/bitflags.d.ts +14 -0
  192. package/lib/types/atlaspack-v3/worker/compat/dependency.d.ts +25 -0
  193. package/lib/types/atlaspack-v3/worker/compat/environment.d.ts +27 -0
  194. package/{src/atlaspack-v3/worker/compat/index.js → lib/types/atlaspack-v3/worker/compat/index.d.ts} +0 -2
  195. package/lib/types/atlaspack-v3/worker/compat/mutable-asset.d.ts +49 -0
  196. package/lib/types/atlaspack-v3/worker/compat/plugin-config.d.ts +29 -0
  197. package/lib/types/atlaspack-v3/worker/compat/plugin-options.d.ts +23 -0
  198. package/lib/types/atlaspack-v3/worker/compat/plugin-tracer.d.ts +5 -0
  199. package/lib/types/atlaspack-v3/worker/compat/target.d.ts +11 -0
  200. package/lib/types/atlaspack-v3/worker/side-effect-detector.d.ts +76 -0
  201. package/lib/types/atlaspack-v3/worker/worker.d.ts +81 -0
  202. package/lib/types/constants.d.ts +13 -0
  203. package/lib/types/dumpGraphToGraphViz.d.ts +10 -0
  204. package/lib/types/index.d.ts +8 -0
  205. package/lib/types/loadAtlaspackPlugin.d.ts +8 -0
  206. package/lib/types/loadDotEnv.d.ts +3 -0
  207. package/lib/types/projectPath.d.ts +19 -0
  208. package/lib/types/public/Asset.d.ts +74 -0
  209. package/lib/types/public/Bundle.d.ts +45 -0
  210. package/lib/types/public/BundleGraph.d.ts +72 -0
  211. package/lib/types/public/BundleGroup.d.ts +12 -0
  212. package/lib/types/public/Config.d.ts +75 -0
  213. package/lib/types/public/Dependency.d.ts +32 -0
  214. package/lib/types/public/Environment.d.ts +34 -0
  215. package/lib/types/public/MutableBundleGraph.d.ts +26 -0
  216. package/lib/types/public/PluginOptions.d.ts +25 -0
  217. package/lib/types/public/Symbols.d.ts +81 -0
  218. package/lib/types/public/Target.d.ts +16 -0
  219. package/lib/types/registerCoreWithSerializer.d.ts +2 -0
  220. package/lib/types/requests/AssetGraphRequest.d.ts +76 -0
  221. package/lib/types/requests/AssetGraphRequestRust.d.ts +21 -0
  222. package/lib/types/requests/AssetRequest.d.ts +16 -0
  223. package/lib/types/requests/AtlaspackBuildRequest.d.ts +33 -0
  224. package/lib/types/requests/AtlaspackConfigRequest.d.ts +45 -0
  225. package/lib/types/requests/BundleGraphRequest.d.ts +28 -0
  226. package/lib/types/requests/BundleGraphRequestRust.d.ts +34 -0
  227. package/lib/types/requests/BundleGraphRequestUtils.d.ts +38 -0
  228. package/lib/types/requests/ConfigRequest.d.ts +67 -0
  229. package/lib/types/requests/DevDepRequest.d.ts +30 -0
  230. package/lib/types/requests/EntryRequest.d.ts +36 -0
  231. package/lib/types/requests/PackageRequest.d.ts +27 -0
  232. package/lib/types/requests/PathRequest.d.ts +48 -0
  233. package/lib/types/requests/TargetRequest.d.ts +48 -0
  234. package/lib/types/requests/ValidationRequest.d.ts +20 -0
  235. package/lib/types/requests/WriteBundleRequest.d.ts +80 -0
  236. package/lib/types/requests/WriteBundlesRequest.d.ts +32 -0
  237. package/lib/types/requests/asset-graph-diff.d.ts +1 -0
  238. package/lib/types/requests/asset-graph-dot.d.ts +9 -0
  239. package/lib/types/resolveOptions.d.ts +3 -0
  240. package/lib/types/rustWorkerThreadDylibHack.d.ts +9 -0
  241. package/lib/types/serializerCore.browser.d.ts +3 -0
  242. package/lib/types/summarizeRequest.d.ts +10 -0
  243. package/lib/types/types.d.ts +496 -0
  244. package/lib/types/utils.d.ts +23 -0
  245. package/lib/types/worker.d.ts +44 -0
  246. package/lib/types.js +8 -1
  247. package/lib/utils.js +18 -3
  248. package/lib/worker.js +32 -15
  249. package/package.json +26 -36
  250. package/src/{AssetGraph.js → AssetGraph.ts} +87 -51
  251. package/src/{Atlaspack.js → Atlaspack.ts} +181 -72
  252. package/src/{AtlaspackConfig.schema.js → AtlaspackConfig.schema.ts} +25 -19
  253. package/src/{AtlaspackConfig.js → AtlaspackConfig.ts} +78 -54
  254. package/src/{BundleGraph.js → BundleGraph.ts} +575 -145
  255. package/src/{CommittedAsset.js → CommittedAsset.ts} +15 -13
  256. package/src/{Dependency.js → Dependency.ts} +59 -42
  257. package/src/{Environment.js → Environment.ts} +24 -15
  258. package/src/EnvironmentManager.ts +154 -0
  259. package/src/{IdentifierRegistry.js → IdentifierRegistry.ts} +1 -4
  260. package/src/{InternalConfig.js → InternalConfig.ts} +22 -23
  261. package/src/{PackagerRunner.js → PackagerRunner.ts} +114 -159
  262. package/src/{ReporterRunner.js → ReporterRunner.ts} +13 -18
  263. package/src/{RequestTracker.js → RequestTracker.ts} +444 -355
  264. package/src/{SymbolPropagation.js → SymbolPropagation.ts} +178 -61
  265. package/src/{TargetDescriptor.schema.js → TargetDescriptor.schema.ts} +10 -1
  266. package/src/{Transformation.js → Transformation.ts} +110 -65
  267. package/src/{UncommittedAsset.js → UncommittedAsset.ts} +45 -49
  268. package/src/{Validation.js → Validation.ts} +32 -17
  269. package/src/{applyRuntimes.js → applyRuntimes.ts} +135 -26
  270. package/src/{assetUtils.js → assetUtils.ts} +49 -36
  271. package/src/atlaspack-v3/AtlaspackV3.ts +183 -0
  272. package/src/atlaspack-v3/NapiWorkerPool.ts +129 -0
  273. package/src/atlaspack-v3/{fs.js → fs.ts} +8 -4
  274. package/src/atlaspack-v3/{index.js → index.ts} +3 -4
  275. package/src/atlaspack-v3/jsCallable.ts +14 -0
  276. package/src/atlaspack-v3/worker/compat/{asset-symbols.js → asset-symbols.ts} +40 -30
  277. package/src/atlaspack-v3/worker/compat/bitflags.ts +102 -0
  278. package/src/atlaspack-v3/worker/compat/{dependency.js → dependency.ts} +13 -13
  279. package/src/atlaspack-v3/worker/compat/{environment.js → environment.ts} +13 -9
  280. package/src/atlaspack-v3/worker/compat/index.ts +8 -0
  281. package/src/atlaspack-v3/worker/compat/{mutable-asset.js → mutable-asset.ts} +21 -20
  282. package/src/atlaspack-v3/worker/compat/{plugin-config.js → plugin-config.ts} +25 -56
  283. package/src/atlaspack-v3/worker/compat/{plugin-options.js → plugin-options.ts} +19 -5
  284. package/src/atlaspack-v3/worker/compat/{plugin-tracer.js → plugin-tracer.ts} +2 -2
  285. package/src/atlaspack-v3/worker/compat/{target.js → target.ts} +3 -4
  286. package/src/atlaspack-v3/worker/index.js +2 -1
  287. package/src/atlaspack-v3/worker/side-effect-detector.ts +298 -0
  288. package/src/atlaspack-v3/worker/worker.ts +548 -0
  289. package/src/{constants.js → constants.ts} +0 -3
  290. package/src/{dumpGraphToGraphViz.js → dumpGraphToGraphViz.ts} +73 -28
  291. package/src/index.ts +18 -0
  292. package/src/{loadAtlaspackPlugin.js → loadAtlaspackPlugin.ts} +8 -9
  293. package/src/{loadDotEnv.js → loadDotEnv.ts} +2 -2
  294. package/src/{projectPath.js → projectPath.ts} +20 -9
  295. package/src/public/{Asset.js → Asset.ts} +41 -28
  296. package/src/public/{Bundle.js → Bundle.ts} +28 -29
  297. package/src/public/{BundleGraph.js → BundleGraph.ts} +103 -68
  298. package/src/public/{BundleGroup.js → BundleGroup.ts} +7 -10
  299. package/src/public/{Config.js → Config.ts} +171 -33
  300. package/src/public/{Dependency.js → Dependency.ts} +20 -17
  301. package/src/public/{Environment.js → Environment.ts} +28 -17
  302. package/src/public/{MutableBundleGraph.js → MutableBundleGraph.ts} +55 -24
  303. package/src/public/{PluginOptions.js → PluginOptions.ts} +6 -6
  304. package/src/public/{Symbols.js → Symbols.ts} +75 -36
  305. package/src/public/{Target.js → Target.ts} +10 -8
  306. package/src/{registerCoreWithSerializer.js → registerCoreWithSerializer.ts} +9 -7
  307. package/src/requests/{AssetGraphRequest.js → AssetGraphRequest.ts} +117 -90
  308. package/src/requests/AssetGraphRequestRust.ts +557 -0
  309. package/src/requests/{AssetRequest.js → AssetRequest.ts} +24 -18
  310. package/src/requests/AtlaspackBuildRequest.ts +168 -0
  311. package/src/requests/{AtlaspackConfigRequest.js → AtlaspackConfigRequest.ts} +72 -58
  312. package/src/requests/{BundleGraphRequest.js → BundleGraphRequest.ts} +119 -199
  313. package/src/requests/BundleGraphRequestRust.ts +470 -0
  314. package/src/requests/BundleGraphRequestUtils.ts +323 -0
  315. package/src/requests/{ConfigRequest.js → ConfigRequest.ts} +110 -50
  316. package/src/requests/{DevDepRequest.js → DevDepRequest.ts} +60 -35
  317. package/src/requests/{EntryRequest.js → EntryRequest.ts} +36 -31
  318. package/src/requests/{PackageRequest.js → PackageRequest.ts} +52 -25
  319. package/src/requests/{PathRequest.js → PathRequest.ts} +47 -37
  320. package/src/requests/{TargetRequest.js → TargetRequest.ts} +265 -179
  321. package/src/requests/{ValidationRequest.js → ValidationRequest.ts} +18 -17
  322. package/src/requests/WriteBundleRequest.ts +734 -0
  323. package/src/requests/{WriteBundlesRequest.js → WriteBundlesRequest.ts} +134 -50
  324. package/src/requests/{asset-graph-diff.js → asset-graph-diff.ts} +25 -21
  325. package/src/requests/{asset-graph-dot.js → asset-graph-dot.ts} +8 -12
  326. package/src/{resolveOptions.js → resolveOptions.ts} +57 -27
  327. package/src/{rustWorkerThreadDylibHack.js → rustWorkerThreadDylibHack.ts} +1 -4
  328. package/src/{serializerCore.browser.js → serializerCore.browser.ts} +2 -3
  329. package/src/{summarizeRequest.js → summarizeRequest.ts} +17 -5
  330. package/src/types.ts +651 -0
  331. package/src/{utils.js → utils.ts} +52 -21
  332. package/src/{worker.js → worker.ts} +50 -42
  333. package/test/{AssetGraph.test.js → AssetGraph.test.ts} +5 -8
  334. package/test/{Atlaspack.test.js → Atlaspack.test.ts} +5 -10
  335. package/test/{AtlaspackConfig.test.js → AtlaspackConfig.test.ts} +0 -5
  336. package/test/{AtlaspackConfigRequest.test.js → AtlaspackConfigRequest.test.ts} +76 -16
  337. package/test/{BundleGraph.test.js → BundleGraph.test.ts} +8 -13
  338. package/test/{Dependency.test.js → Dependency.test.ts} +2 -3
  339. package/test/{EntryRequest.test.js → EntryRequest.test.ts} +1 -6
  340. package/test/Environment.test.ts +153 -0
  341. package/test/EnvironmentManager.test.ts +188 -0
  342. package/test/{IdentifierRegistry.test.js → IdentifierRegistry.test.ts} +2 -4
  343. package/test/{InternalAsset.test.js → InternalAsset.test.ts} +2 -7
  344. package/test/PackagerRunner.test.ts +0 -0
  345. package/test/{PublicAsset.test.js → PublicAsset.test.ts} +2 -7
  346. package/test/{PublicBundle.test.js → PublicBundle.test.ts} +1 -2
  347. package/test/{PublicDependency.test.js → PublicDependency.test.ts} +0 -2
  348. package/test/PublicEnvironment.test.ts +49 -0
  349. package/test/{PublicMutableBundleGraph.test.js → PublicMutableBundleGraph.test.ts} +6 -11
  350. package/test/{RequestTracker.test.js → RequestTracker.test.ts} +136 -58
  351. package/test/{SymbolPropagation.test.js → SymbolPropagation.test.ts} +124 -74
  352. package/test/{TargetRequest.test.js → TargetRequest.test.ts} +91 -92
  353. package/test/fixtures/config-with-reporters/.parcelrc +7 -0
  354. package/test/fixtures/custom-targets/package.json +6 -0
  355. package/test/public/Config.test.ts +104 -0
  356. package/test/requests/AssetGraphRequestRust.test.ts +443 -0
  357. package/test/requests/{ConfigRequest.test.js → ConfigRequest.test.ts} +202 -13
  358. package/test/requests/{DevDepRequest.test.js → DevDepRequest.test.ts} +0 -2
  359. package/test/requests/WriteBundleRequest.test.ts +602 -0
  360. package/test/{test-utils.js → test-utils.ts} +3 -4
  361. package/test/{utils.test.js → utils.test.ts} +1 -3
  362. package/tsconfig.json +60 -0
  363. package/tsconfig.tsbuildinfo +1 -0
  364. package/index.d.ts +0 -30
  365. package/lib/atlaspack-v3/worker/compat/plugin-logger.js +0 -29
  366. package/src/atlaspack-v3/AtlaspackV3.js +0 -87
  367. package/src/atlaspack-v3/NapiWorkerPool.js +0 -53
  368. package/src/atlaspack-v3/jsCallable.js +0 -18
  369. package/src/atlaspack-v3/worker/compat/bitflags.js +0 -100
  370. package/src/atlaspack-v3/worker/compat/plugin-logger.js +0 -47
  371. package/src/atlaspack-v3/worker/worker.js +0 -369
  372. package/src/index.js +0 -13
  373. package/src/requests/AssetGraphRequestRust.js +0 -263
  374. package/src/requests/AtlaspackBuildRequest.js +0 -111
  375. package/src/requests/WriteBundleRequest.js +0 -369
  376. package/src/types.js +0 -600
  377. package/test/Environment.test.js +0 -119
  378. package/test/PackagerRunner.test.js +0 -27
  379. package/test/PublicEnvironment.test.js +0 -27
  380. package/test/requests/AssetGraphRequestRust.test.js +0 -411
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.AtlaspackWorker = void 0;
7
+ var _sideEffectDetector = require("./side-effect-detector");
7
8
  function _assert() {
8
9
  const data = _interopRequireDefault(require("assert"));
9
10
  _assert = function () {
@@ -39,6 +40,13 @@ function _worker_threads() {
39
40
  };
40
41
  return data;
41
42
  }
43
+ function _logger() {
44
+ const data = _interopRequireWildcard(require("@atlaspack/logger"));
45
+ _logger = function () {
46
+ return data;
47
+ };
48
+ return data;
49
+ }
42
50
  function _module() {
43
51
  const data = _interopRequireWildcard(require("module"));
44
52
  _module = function () {
@@ -48,36 +56,74 @@ function _module() {
48
56
  }
49
57
  var _jsCallable = require("../jsCallable");
50
58
  var _compat = require("./compat");
51
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
52
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
53
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
60
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
61
+ /* eslint-disable import/first */
62
+
63
+ // Install side effect detection patches BEFORE importing any modules that use fs
64
+ const sideEffectDetector = new _sideEffectDetector.SideEffectDetector();
65
+ sideEffectDetector.install();
66
+
67
+ // @ts-expect-error TS2305
68
+
54
69
  const CONFIG = Symbol.for('parcel-plugin-config');
55
70
  class AtlaspackWorker {
56
71
  #resolvers;
57
72
  #transformers;
58
73
  #fs;
74
+ #packageManager;
75
+ #options;
76
+ #sideEffectDetector;
59
77
  constructor() {
60
78
  this.#resolvers = new Map();
61
79
  this.#transformers = new Map();
62
80
  this.#fs = new (_fs().NodeFS)();
81
+ this.#packageManager = new (_packageManager().NodePackageManager)(this.#fs, '/');
82
+ this.#sideEffectDetector = sideEffectDetector; // Use the global detector that was installed before imports
83
+ }
84
+ clearState() {
85
+ this.#resolvers.clear();
86
+ this.#transformers.clear();
87
+ this.#options = undefined;
63
88
  }
64
89
  loadPlugin = (0, _jsCallable.jsCallable)(async ({
65
90
  kind,
66
91
  specifier,
67
- resolveFrom
92
+ resolveFrom,
93
+ options
68
94
  }) => {
69
- let customRequire = _module().createRequire(resolveFrom);
70
- let resolvedPath = customRequire.resolve(specifier);
71
- // $FlowFixMe
72
- let resolvedModule = await import(resolvedPath);
95
+ // Use packageManager.require() instead of dynamic import() to support TypeScript plugins
96
+ let resolvedModule = await this.#packageManager.require(specifier, resolveFrom, {
97
+ shouldAutoInstall: false
98
+ });
73
99
  let instance = undefined;
74
- if (resolvedModule.default && resolvedModule.default[CONFIG]) {
100
+ // Check for CommonJS export (module.exports = new Plugin(...))
101
+ if (resolvedModule[CONFIG]) {
102
+ instance = resolvedModule[CONFIG];
103
+ } else if (resolvedModule.default && resolvedModule.default[CONFIG]) {
104
+ // ESM default export
75
105
  instance = resolvedModule.default[CONFIG];
76
106
  } else if (resolvedModule.default && resolvedModule.default.default && resolvedModule.default.default[CONFIG]) {
107
+ // Double-wrapped default export
77
108
  instance = resolvedModule.default.default[CONFIG];
78
109
  } else {
79
110
  throw new Error(`Plugin could not be resolved\n\t${kind}\n\t${resolveFrom}\n\t${specifier}`);
80
111
  }
112
+ if (this.#options == null) {
113
+ this.#options = {
114
+ ...options,
115
+ inputFS: this.#fs,
116
+ outputFS: this.#fs,
117
+ packageManager: this.#packageManager,
118
+ shouldAutoInstall: false
119
+ };
120
+ }
121
+
122
+ // Set feature flags in the worker process
123
+ let featureFlagsModule = await this.#packageManager.require('@atlaspack/feature-flags', __filename, {
124
+ shouldAutoInstall: false
125
+ });
126
+ featureFlagsModule.setFeatureFlags(options.featureFlags);
81
127
  switch (kind) {
82
128
  case 'resolver':
83
129
  this.#resolvers.set(specifier, {
@@ -85,55 +131,45 @@ class AtlaspackWorker {
85
131
  });
86
132
  break;
87
133
  case 'transformer':
88
- this.#transformers.set(specifier, {
89
- transformer: instance
90
- });
91
- break;
134
+ {
135
+ return this.initializeTransformer(instance, specifier);
136
+ }
92
137
  }
93
138
  });
94
139
  runResolverResolve = (0, _jsCallable.jsCallable)(async ({
95
140
  key,
96
141
  dependency: napiDependency,
97
142
  specifier,
98
- pipeline,
99
- pluginOptions
143
+ pipeline
100
144
  }) => {
101
145
  const state = this.#resolvers.get(key);
102
146
  if (!state) {
103
147
  throw new Error(`Resolver not found: ${key}`);
104
148
  }
105
- let packageManager = state.packageManager;
106
- if (!packageManager) {
107
- packageManager = new (_packageManager().NodePackageManager)(this.#fs, pluginOptions.projectRoot);
108
- state.packageManager = packageManager;
109
- }
110
149
  const env = new _compat.Environment(napiDependency.env);
111
150
  const dependency = new _compat.Dependency(napiDependency, env);
112
151
  const defaultOptions = {
113
- logger: new _compat.PluginLogger(),
152
+ logger: new (_logger().PluginLogger)({
153
+ origin: key
154
+ }),
114
155
  tracer: new _compat.PluginTracer(),
115
- options: new _compat.PluginOptions({
116
- ...pluginOptions,
117
- packageManager,
118
- shouldAutoInstall: false,
119
- inputFS: this.#fs,
120
- outputFS: this.#fs
121
- })
156
+ options: new _compat.PluginOptions(this.options)
122
157
  };
123
158
  if (!('config' in state)) {
124
159
  var _state$resolver$loadC, _state$resolver;
160
+ // @ts-expect-error TS2345
125
161
  state.config = await ((_state$resolver$loadC = (_state$resolver = state.resolver).loadConfig) === null || _state$resolver$loadC === void 0 ? void 0 : _state$resolver$loadC.call(_state$resolver, {
126
162
  config: new _compat.PluginConfig({
127
- env,
163
+ env: napiDependency.env,
164
+ plugin: key,
128
165
  isSource: true,
129
- searchPath: specifier,
130
- projectRoot: pluginOptions.projectRoot,
131
- fs: this.#fs,
132
- packageManager
133
- }),
166
+ searchPath: 'index'
167
+ }, this.options),
134
168
  ...defaultOptions
135
169
  }));
136
170
  }
171
+
172
+ // @ts-expect-error TS2345
137
173
  const result = await state.resolver.resolve({
138
174
  specifier,
139
175
  dependency,
@@ -157,14 +193,25 @@ class AtlaspackWorker {
157
193
  }
158
194
  };
159
195
  }
196
+ // A resolver may return a result without filePath to indicate it didn't
197
+ // resolve the dependency (equivalent to returning null). The JS-side
198
+ // PathRequest treats this as "try the next resolver".
199
+ if (!result.filePath) {
200
+ return {
201
+ invalidations: [],
202
+ resolution: {
203
+ type: 'unresolved'
204
+ }
205
+ };
206
+ }
160
207
  return {
161
208
  invalidations: [],
162
209
  resolution: {
163
210
  type: 'resolved',
164
- filePath: result.filePath || '',
211
+ filePath: result.filePath,
165
212
  canDefer: result.canDefer || false,
166
- sideEffects: result.sideEffects || false,
167
- code: result.code || undefined,
213
+ sideEffects: result.sideEffects ?? true,
214
+ code: result.code ?? undefined,
168
215
  meta: result.meta || undefined,
169
216
  pipeline: result.pipeline || undefined,
170
217
  priority: _compat.dependencyPriorityMap.intoNullable(result.priority),
@@ -174,52 +221,60 @@ class AtlaspackWorker {
174
221
  });
175
222
  runTransformerTransform = (0, _jsCallable.jsCallable)(async ({
176
223
  key,
177
- env: napiEnv,
178
- options,
179
224
  asset: innerAsset
180
225
  }, contents, map) => {
181
- var _transformer$loadConf;
182
- const state = this.#transformers.get(key);
183
- if (!state) {
226
+ const instance = this.#transformers.get(key);
227
+ if (!instance) {
184
228
  throw new Error(`Transformer not found: ${key}`);
185
229
  }
186
- let packageManager = state.packageManager;
187
- if (!packageManager) {
188
- packageManager = new (_packageManager().NodePackageManager)(this.#fs, options.projectRoot);
189
- state.packageManager = packageManager;
190
- }
191
- const transformer = state.transformer;
230
+ let {
231
+ transformer,
232
+ config,
233
+ allowedEnv = new Set()
234
+ } = instance;
235
+ let cacheBailouts = [];
192
236
  const resolveFunc = (from, to) => {
193
237
  let customRequire = _module().createRequire(from);
194
238
  let resolvedPath = customRequire.resolve(to);
239
+ // Tranformer not cacheable due to use of the resolve function
240
+
241
+ cacheBailouts.push(`resolve(${from}, ${to})`);
195
242
  return Promise.resolve(resolvedPath);
196
243
  };
197
- const env = new _compat.Environment(napiEnv);
198
- const mutableAsset = new _compat.MutableAsset(innerAsset, contents, env, this.#fs, map, options.projectRoot);
244
+ const env = new _compat.Environment(innerAsset.env);
245
+ let mutableAsset = new _compat.MutableAsset(innerAsset,
246
+ // @ts-expect-error TS2345
247
+ contents, env, this.#fs, map, this.options.projectRoot);
248
+ const pluginOptions = new _compat.PluginOptions(this.options);
199
249
  const defaultOptions = {
200
- logger: new _compat.PluginLogger(),
250
+ logger: new (_logger().PluginLogger)({
251
+ origin: key
252
+ }),
201
253
  tracer: new _compat.PluginTracer(),
202
- options: new _compat.PluginOptions({
203
- ...options,
204
- packageManager,
205
- shouldAutoInstall: false,
206
- inputFS: this.#fs,
207
- outputFS: this.#fs
208
- })
254
+ options: pluginOptions
209
255
  };
210
- const config = await ((_transformer$loadConf = transformer.loadConfig) === null || _transformer$loadConf === void 0 ? void 0 : _transformer$loadConf.call(transformer, {
211
- config: new _compat.PluginConfig({
212
- env,
213
- isSource: true,
214
- searchPath: innerAsset.filePath,
215
- projectRoot: options.projectRoot,
216
- fs: this.#fs,
217
- packageManager
218
- }),
219
- ...defaultOptions
220
- }));
256
+ if (transformer.loadConfig) {
257
+ if (config != null) {
258
+ throw new Error(`Transformer (${key}) should not implement 'setup' and 'loadConfig'`);
259
+ }
260
+ // @ts-expect-error TS2345
261
+ config = await transformer.loadConfig({
262
+ config: new _compat.PluginConfig({
263
+ plugin: key,
264
+ isSource: innerAsset.isSource,
265
+ searchPath: innerAsset.filePath,
266
+ env
267
+ }, this.options),
268
+ ...defaultOptions
269
+ });
270
+
271
+ // Transformer uses the deprecated loadConfig API, so mark as not
272
+ // cachable
273
+ cacheBailouts.push(`Transformer.loadConfig`);
274
+ }
221
275
  if (transformer.parse) {
222
276
  const ast = await transformer.parse({
277
+ // @ts-expect-error TS2322
223
278
  asset: mutableAsset,
224
279
  config,
225
280
  resolve: resolveFunc,
@@ -228,18 +283,37 @@ class AtlaspackWorker {
228
283
  if (ast) {
229
284
  mutableAsset.setAST(ast);
230
285
  }
286
+ cacheBailouts.push(`Transformer.parse`);
231
287
  }
232
- const result = await state.transformer.transform({
288
+ const [result, sideEffects] = await this.#sideEffectDetector.monitorSideEffects(key, () => transformer.transform({
289
+ // @ts-expect-error TS2322
233
290
  asset: mutableAsset,
234
291
  config,
235
292
  resolve: resolveFunc,
236
293
  ...defaultOptions
237
- });
294
+ }));
295
+ if (sideEffects.envUsage.didEnumerate) {
296
+ cacheBailouts.push(`Env access: enumeration of process.env`);
297
+ }
298
+ for (let variable of sideEffects.envUsage.vars) {
299
+ if (variable in allowedEnv) {
300
+ continue;
301
+ }
302
+ cacheBailouts.push(`Env access: ${variable}`);
303
+ }
304
+ for (let {
305
+ method,
306
+ path
307
+ } of sideEffects.fsUsage) {
308
+ cacheBailouts.push(`FS usage: ${method}(${path})`);
309
+ }
310
+ (0, _assert().default)(result.length === 1, '[V3] Unimplemented: Multiple asset return from Node transformer');
311
+ (0, _assert().default)(result[0] === mutableAsset, '[V3] Unimplemented: New asset returned from Node transformer');
238
312
  if (transformer.generate) {
239
313
  const ast = await mutableAsset.getAST();
240
314
  if (ast) {
241
- // $FlowFixMe "Cannot call `transformer.generate` because undefined [1] is not a function." 🤷‍♀️
242
315
  const output = await transformer.generate({
316
+ // @ts-expect-error TS2322
243
317
  asset: mutableAsset,
244
318
  ast,
245
319
  ...defaultOptions
@@ -249,6 +323,7 @@ class AtlaspackWorker {
249
323
  } else if (output.content instanceof Buffer) {
250
324
  mutableAsset.setBuffer(output.content);
251
325
  } else {
326
+ // @ts-expect-error TS2345
252
327
  mutableAsset.setStream(output.content);
253
328
  }
254
329
  if (output.map) {
@@ -256,8 +331,17 @@ class AtlaspackWorker {
256
331
  }
257
332
  }
258
333
  }
259
- (0, _assert().default)(result.length === 1, '[V3] Unimplemented: Multiple asset return from Node transformer');
260
- (0, _assert().default)(result[0] === mutableAsset, '[V3] Unimplemented: New asset returned from Node transformer');
334
+ let assetBuffer = await mutableAsset.getBuffer();
335
+
336
+ // If the asset has no code, we set the buffer to null, which we can
337
+ // detect in Rust, to avoid passing back an empty buffer, which we can't.
338
+ if (assetBuffer.length === 0) {
339
+ assetBuffer = null;
340
+ }
341
+ if (pluginOptions.used) {
342
+ // Plugin options accessed, so not cachable
343
+ cacheBailouts.push(`Plugin options accessed`);
344
+ }
261
345
  return [{
262
346
  id: mutableAsset.id,
263
347
  bundleBehavior: _compat.bundleBehaviorMap.intoNullable(mutableAsset.bundleBehavior),
@@ -273,16 +357,84 @@ class AtlaspackWorker {
273
357
  symbols: mutableAsset.symbols.intoNapi(),
274
358
  type: mutableAsset.type,
275
359
  uniqueKey: mutableAsset.uniqueKey
276
- }, await mutableAsset.getBuffer(),
360
+ }, assetBuffer,
277
361
  // Only send back the map if it has changed
278
362
  mutableAsset.isMapDirty ?
279
- // $FlowFixMe A dirty map means this will be valid
280
- JSON.stringify((await mutableAsset.getMap()).toVLQ()) : ''];
363
+ // @ts-expect-error TS2533
364
+ JSON.stringify((await mutableAsset.getMap()).toVLQ()) : '',
365
+ // Limit to first 10 bailouts
366
+ cacheBailouts.slice(0, 10)];
281
367
  });
368
+ get options() {
369
+ if (this.#options == null) {
370
+ throw new Error('Plugin options have not been initialized');
371
+ }
372
+ return this.#options;
373
+ }
374
+ async initializeTransformer(instance, specifier) {
375
+ let transformer = instance;
376
+ let setup, config, allowedEnv;
377
+ let packageManager = new (_packageManager().NodePackageManager)(this.#fs, this.options.projectRoot);
378
+ if (transformer.setup) {
379
+ var _setupResult$env;
380
+ let setupResult = await transformer.setup({
381
+ logger: new (_logger().PluginLogger)({
382
+ origin: specifier
383
+ }),
384
+ options: new _compat.PluginOptions({
385
+ ...this.options,
386
+ shouldAutoInstall: false,
387
+ inputFS: this.#fs,
388
+ outputFS: this.#fs,
389
+ packageManager
390
+ }),
391
+ config: new _compat.PluginConfig({
392
+ plugin: specifier,
393
+ searchPath: 'index',
394
+ // Consider project setup config as source
395
+ isSource: true
396
+ }, this.options)
397
+ });
398
+ config = setupResult === null || setupResult === void 0 ? void 0 : setupResult.config;
399
+ allowedEnv = Object.fromEntries((setupResult === null || setupResult === void 0 || (_setupResult$env = setupResult.env) === null || _setupResult$env === void 0 ? void 0 : _setupResult$env.map(env => [env, process.env[env]])) || []);
400
+
401
+ // Always add the following env vars to the cache key
402
+ allowedEnv['NODE_ENV'] = process.env['NODE_ENV'];
403
+ setup = {
404
+ conditions: setupResult === null || setupResult === void 0 ? void 0 : setupResult.conditions,
405
+ config,
406
+ env: allowedEnv,
407
+ disableCache: setupResult === null || setupResult === void 0 ? void 0 : setupResult.disableCache
408
+ };
409
+ }
410
+ this.#transformers.set(specifier, {
411
+ transformer,
412
+ config,
413
+ packageManager,
414
+ allowedEnv
415
+ });
416
+ return setup;
417
+ }
282
418
  }
283
419
 
284
- // Create napi worker and send it back to main thread
420
+ // Forward all logger events from this worker thread to the main thread so
421
+ // they are re-emitted into the main-thread logger and reach reporters.
285
422
  exports.AtlaspackWorker = AtlaspackWorker;
423
+ _logger().default.onLog(event => {
424
+ _worker_threads().parentPort === null || _worker_threads().parentPort === void 0 || _worker_threads().parentPort.postMessage({
425
+ type: 'logEvent',
426
+ event
427
+ });
428
+ });
429
+
430
+ // Create napi worker and send it back to main thread
286
431
  const worker = new AtlaspackWorker();
287
432
  const napiWorker = napi().newNodejsWorker(worker);
288
- _worker_threads().parentPort === null || _worker_threads().parentPort === void 0 || _worker_threads().parentPort.postMessage(napiWorker);
433
+ _worker_threads().parentPort === null || _worker_threads().parentPort === void 0 || _worker_threads().parentPort.postMessage(napiWorker);
434
+ _worker_threads().parentPort === null || _worker_threads().parentPort === void 0 || _worker_threads().parentPort.setMaxListeners(_worker_threads().parentPort.getMaxListeners() + 1);
435
+ _worker_threads().parentPort === null || _worker_threads().parentPort === void 0 || _worker_threads().parentPort.addListener('message', message => {
436
+ if (message === 'clearState') {
437
+ worker.clearState();
438
+ _worker_threads().parentPort === null || _worker_threads().parentPort === void 0 || _worker_threads().parentPort.postMessage('stateCleared');
439
+ }
440
+ });
package/lib/constants.js CHANGED
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.VALID = exports.STARTUP = exports.OPTION_CHANGE = exports.INITIAL_BUILD = exports.HASH_REF_REGEX = exports.HASH_REF_PREFIX = exports.HASH_REF_HASH_LEN = exports.FILE_UPDATE = exports.FILE_DELETE = exports.FILE_CREATE = exports.ERROR = exports.ENV_CHANGE = exports.ATLASPACK_VERSION = void 0;
7
7
  var _package = require("../package.json");
8
- // $FlowFixMe
9
8
  const ATLASPACK_VERSION = exports.ATLASPACK_VERSION = _package.version;
10
9
  const HASH_REF_PREFIX = exports.HASH_REF_PREFIX = 'HASH_REF_';
11
10
  const HASH_REF_HASH_LEN = exports.HASH_REF_HASH_LEN = 16;