套装来源
此软件包从 ES 模块创建源包, 兼容 Endo 应用、Agoric合同和SwingSet wats.
将输入到 program.js 从命令行中,使用
bundle-source 工具:
> yarn bundle-source --cache-json bundles program.js program
在方案方面采取同样的行动:
import 'ses';
import bundleSource from '@endo/bundle-source';
import url from 'url';
const sourceBundleURL = new URL('program.js', import.meta.url);
const sourceBundlePath = url.fileURLToPath(sourceBundleURL);
const sourceBundleP = bundleSource(sourceBundlePath);
...为了得到一个承诺 一个源捆, 在阅读后解决
命名源并将其捆绑成可加载的表单,如所示
编辑 moduleFormat 见下文.
产生的捆绑适合与 @endo/import-bundle。 。 。 .
默认格式为捆绑为"endoZipBase64".
条件
介绍的节点.js 条件。 。 。 .
这个 --condition编号 :-C 选项相应影响 bundle-source 模块
决议.
“浏览器”条件还意味着选择 browser
替换条目 main 内 package.json,如果不是被明确的
exports。 。 。 .
“开发”条件还意味着捆绑可以导入
devDependencies 从包含输入模块的包中取出.
注释 Elision
这个 --elide-comments编号 :-e 选项,带有默认格式“endoZipBase64”或
通过“endoScript”来明确格式 --format编号 :-f 导致捆绑者空出
注释的内部,但不影响行或行号位置
剩余源代码.
这可以减少捆绑的大小,而不会对调试经验造成伤害
其他转变.
注释删除保留 /*! slashasterbang / 评论和联合来文文件评论
与 @preserve, (中文(简体) ), @copyright, (中文(简体) ), @license prasma 或 Internet 浏览器
@cc_on 破烂.
评论删除并不完全删除评论. 开始或结束的语法仍然保留.
类型 :
带有此选项的脚本模块 .ts, (中文(简体) ), .mts,以及 .cts 扩展
不属于 a 的软件包 node_modules 目录自动
通过类型去除而转换为 JavaScript
amaro,则TypeScript 解析器节点.js使用
用于类型剥离.
这将不对作为原件发布的软件包起作用
类型脚本源, 符合 node --experimental-strip-types。 。 。 .
对于 TypeScript 模块,此功能也不会正常
运行时间影响语法, (中文(简体) ),
例如 enum。 。 。 .
这也不支持导入 a .ts 使用相应的文件
虚构、生成的模块 .js 扩展名.
结合
--allowImportingTsExtensions。 。 。 .
原始地图
默认 moduleFormat “endo ZipBase64”的组合器可以生成
源地图,但不包含在捆绑中.
使用 cacheSourceMaps 选项,将源地图转换成每个用户每个主机
缓存.
这个 @endo/import-bundle 工具可以添加这些生成的引用
解开捆绑时提供合适的源地图
computeSourceMapLocation 权力,就像由
@endo/import-bundle/source-map-node.js。 。 。 .
import 'ses';
import { importBundle } from '@endo/import-bundle';
import { computeSourceMapLocation } from '@endo/import-bundle/source-map-node.js';
await importBundle(
bundle,
{ endowments: { console } },
{ computeSourceMapLocation },
);
使用 @endo/cli 找到您的缓存.
> yarn add -D @endo/cli
> yarn endo where cache
使用 XDG_CACHE_HOME 覆盖默认位置的环境变量
一般的缓存.
缓存将进入 endo/source-map 财务报告和审定财务报表 endo/source-map-track。 。 。 .
前者是每个捆绑的SHA-512上键入的内容地址存储
模块文件.
后者是SHA-512上按键的地址存储器
模块源的限定路径,表示已知的最后捆绑散列.
捆绑者使用跟踪器确保缓存只包含一个源
映射每个物理模块.
收集源头地图的源头尚不够聪明
不存在.
moduleFormat 解释
获取导出
最原始的 moduleFormat 是“快递”.
它生成一个完成值( 上次评价的表达式) 的脚本
是接受可选的函数 sourceUrlPrefix。 。 。 .
cosnt { source } = await bundleSource('program.js', { format: 'getExport' });
const exports = eval(source)();
以“ GetExport” 格式的捆绑可以导入主机模块
逻辑范围通用JS require 函数.
使用硬化的 Java 脚本可以赋予 Compartment。 。 。 .
const compartment = new Compartment({
globals: { require },
__options__: true, // until SES and XS implementations converge
});
const exports = compartment.evaluate(source)();
[尖叫声] “ GetExport” 格式以前使用过 滚动 并用
@endo/compartment-mapper/functor.js从第四版开始@endo/bundle-source。 。 。 . 见 嵌入式评价 下面是兼容性说明.
嵌入式评价
这在逻辑上与"GetExport"格式相似,只是代码
可能还取决于 nestedEvaluate(src) 要使用的函数
在与母函数相同的上下文中评价子模块.
这种格式的优点是有助于保存文件名 如果有任何堆积痕迹,则捆绑.
“ 取消评价” 捆绑的完成值是接受
页:1 sourceUrlPrefix 用于捆绑中的每个模块,这些模块将显示在堆栈中
跟踪并协助调试者找到匹配的源文件.
cosnt { source } = await bundleSource('program.js', { format: 'nestedEvaluate' });
const compartment = new Compartment({
globals: {
require,
nestedEvaluate: source => compartment.evaluate(source),
},
__options__: true, // until SES and XS implementations converge
});
const exports = compartment.evaluate(source)('bundled-sources/.../');
在无 nextedEvaluate 函数在词典范围内,捆绑将
使用该 eval 函数.
[尖叫声] “取消评价”格式以前使用过 滚动 并用
@endo/compartment-mapper/functor.js从第四版开始@endo/bundle-source。 。 。 . 他们的行为并不相同.
- 第3版使用与Node.js 18不同的heuristics来推断是否 模块采用共同JS格式或无害环境管理格式。 4版没有猜测, 但依赖
"type": "module"指令在package.json以显示 (单位:千美元).js扩展意味着无害环境管理格式,或尊重明确的.cjs财务报告和审定财务报表.mjs扩展.- 支持版本 3 现场直播 约束 第4版没有.
- 版本 3 可以导入任何通过行走父目录可以发现的软件包 直到依赖或依赖在
node_modules目录. 第4版要求依赖包明确注明依赖性 内package.json。 。 。 .- 第3版和第4版生成不同的文本. 对案文的任何处理,如果对案文的确切外形敏感,则 文本很脆弱,甚至可能在小版本和补丁版本之间断开.
- 第4版使已经由"endoZipBase64"格式支持的旗帜 普遍适用于所有格式,包括
dev, (中文(简体) ),elideComments, (中文(简体) ),noTransforms,以及conditions。 。 。 .
内地脚本模块格式
这个 ses shim使用"endoScript"格式生成其发行捆绑,
适合在网页中插入 <script> 标签.
对于此格式,请提取 source 从生成的 JSON 信封和位置
放在你嵌入网页的文件里,一个Agoric
埃瓦尔核心 脚本,或评价
任何接受脚本的地方.
const { source } = await bundleSource('program.js', { format: 'endoScript' });
const compartment = new Compartment();
compartment.evaluate(source);
与“出口”和“取消评估”不同 dev 选项到 bundleSource 实值
任何捆绑的进口商品 devDependencies。 。 。 .
“ endoScript” 格式不支持导入带有 CommonJS 的主机模块
require。 。 。 .
内地ZipBase64
远藤 (zip, base64) 捆绑是一个具有属性的天体:
moduleFormat是"endoZipBase64"。 .endoZipBase64是一个以 Base64 编码的zip 文件.endoZipBase64Sha512如果存在的话,是SHA-512compartment-map.json文件在endoZipBase64存档 . 如果compartment-map.json包括每个单元的SHA-512,这是 足以作为捆绑的应用程序的散列,以检查其完整性 无论程序是否从 存档 .
要检查 JSON 文件的捆绑内容 :
jq -r .endoZipBase64 | base64 -d | xxd | less
要提取内容:
jq -r .endoZipBase64 | base64 -d > bundle.zip
unzip bundle.zip -d bundle
在拉链文件中 compartment-map.json 表达整个联系
捆绑的程序,始于其输入模块,并明确标记“退出”
模块(必须配置的主机模块).
车厢图然后标出所有车厢和每个车厢
区间,指定将在区间中评估的每个模块.
这些指示了模块物理文本归档中的路径.
这个 parser 说明如何 importBundle 或等同的相位图
公用事业将解释模块的物理文本.
为了避免训练大型依赖和缓慢的汇编步骤,模块 在一个捆绑中,目前是预编译的,所以您不是找到源文本,而是 将找到JSON记录 描述模块的束缚和行为, 包括与源码相类似但并不相同的代码.
捆绑可能有这些 parser 属性 :
- "pre-mjs-json":预编无害环境管理
- "前Cjs-json":被预编为"共同JS"
- “json”:生JSON(导出相应值为
default(中文(简体) ) - “文本”:UTF-8编码文本(导出相应的字符串为
default(中文(简体) ) - “字节”:一个octets序列(导出相应的 Uint8Array 为
default(中文(简体) )
一个JSON pre-mjs-json 模块将具有对象的所有属性
生成方式 StaticModuleRecord 从 @endo/static-module-record不过
特别是:
__syncModuleProgram__: 由无害环境管理转换而来的编码 来源于一个区块可以评估和约束其他无害环境管理的程序 此外,还实行了某些审查-回避改革.
因此,为了提取源-类似程序进行视觉检查:
jq -r .__syncModuleProgram__ module.js > module.source.js