{"_id":"mosaic","_rev":"76-04e831cbb498c61c71e18416fc6b24af","name":"mosaic","description":"A JavaScript library for progressive enhancing HTML","dist-tags":{"latest":"1.1.0"},"versions":{"0.1.0":{"name":"mosaic","description":"a client for managing components","version":"0.1.0","preferGlobal":true,"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.1.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n<http://g.tbcdn.cn/mo/bricks/:namespace/:name/:version/:file>\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n<http://g.tbcdn.cn/mo/mosaics/:name/:version/:file>\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n    - README.md\n    - index.js\n    - index.css\n    - ...\n  - breadcrumbs\n    - README.md\n    - index.js\n    - index.css\n    - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n    - ceiling\n      - template.vm\n      - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.0","dist":{"shasum":"a48ab604adb837f81558643f2e078e7033b37f4c","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.0.tgz","integrity":"sha512-ezvSJZJDEMyQhKbv4Z5nMg1SQkAmaIuGAl90Z1D2w0jEvfNw8JMnAICyF2E9Q64D46dcHDVTaIju4MOZGUENmw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBMUdR5oqybb4Yl/RdIvEOR4CXmHjqGf0jHYvy7PKYhwAiBggGvNuqXGfWMMqm3W5xFBj60CjUEbS6TiB1S0U32X2Q=="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.2":{"name":"mosaic","description":"a client for managing components","version":"0.1.2","preferGlobal":true,"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.1.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.2","dist":{"shasum":"c935aa8d64ce7ffbf2240f1a33300741af35cc37","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.2.tgz","integrity":"sha512-/S00oWWzOzJuy4gK5PRMRdnL//Bi0A6s7gkS1okyGHitxFBZ9tuCx75cuPOmLqO+eUw5/eHQpwHhNu5PsCcTbQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZafg1BSVyghjCDmOGc1I3RLX5rlaXPGylDhYcR37eFAIgB5doYpA+3u59QKnK5K5JODIx1XPK/Q1clVXp5L0atw8="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.3":{"name":"mosaic","description":"a client for managing components","version":"0.1.3","preferGlobal":true,"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.1.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.3","dist":{"shasum":"e95cf24815008d9d2288212dae7326ba9e9ce517","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.3.tgz","integrity":"sha512-xQbl4/SI6d+vZsQZxj768ra1JPHm7ySovhlwPlA+HU7qqpJm+YoabzKPJ79HFolMPatWNKJXuyJWjMyU9OH0pA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/KxilbpQRvSz98C09TEYPiAIyCm4g75o0URV5IBJb4gIgAf368YStHljBtMI4vlYQYSqowFqEoktJu6/Lz2iQAy0="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.4":{"name":"mosaic","description":"a client for managing components","version":"0.1.4","preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mosaic-readme":"0.0.1"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.4","dist":{"shasum":"97a7b343602827b66ec830ff00b993270432f2de","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.4.tgz","integrity":"sha512-8MAM7KtnOvYMQV+98kllgHsw/L2+Ksa3vz4XtZFEj1fPk6oxtoCyxk824zcrvzkym6ln/tRNXX43t/t/THgkiw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHzfLfGARgeL013aFiTdB3ZNyRYvB6wJLO4dWYVUo4Q1AiEA1XBAOiilp7eLw5DnKgcmc66aymiAcIdqYDMwria47oA="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.5":{"name":"mosaic","description":"a client for managing components","version":"0.1.5","preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mosaic-readme":"0.0.1"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.5","dist":{"shasum":"b107ce29d962c14c0c54aa28cffc2bdd23e34c82","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.5.tgz","integrity":"sha512-ETgLt1NdnvVVy5UPFxeEESHzX3nqrnPM+1m9PgN74tU7a6Fl4IR94JGCy8RvLR9gvz7cwaZgUQ2F6bPz4aLyQw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1ZMT9xF8qi18sVoxRB1TfQJEfyZR5843Wbayp8hwY5AIhAIBLhyyS46Zkin4+Xf7OvJZrdAGqBHFzqng8UzwXLYqd"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.6":{"name":"mosaic","description":"a client for managing components","version":"0.1.6","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mosaic-readme":"0.0.1"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.6","dist":{"shasum":"da3082eecc1847d8588b91fac26a1ebb8ee3f2c2","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.6.tgz","integrity":"sha512-K9Rj9KSycuOqkaxHZaLskhQIow5vkawC1QCB4P9PinaM1oXEBzTvPKjh1QeC49aZBva6deb9CvY+o2rz4mmXRA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFlpJrN9wIQpwmAPkQG5TGEQsN2lxJD4Rnm1roVtM7x+AiBXYkDVoIhgYBDOnD8DI4BoALvGgdlRULf+CvlJLVb4zw=="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.7":{"name":"mosaic","description":"a client for managing components","version":"0.1.7","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mosaic-readme":"0.0.1"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.7","dist":{"shasum":"0301423c97e2eb2e7fbd0a378979bb33d053752c","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.7.tgz","integrity":"sha512-+gvQFAVw07LTsQAzmYPFru6RfbOJm7mqTte6NddecXkQR3EpyC+juERCAULAJNK/DlABOOes2PvFy5dOWY9Lvg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCE5cvKo+Yx0q1CeYcIiNoOmgu7GFq+bNzQZ8AtnjwdcQIhAJefsrGX4YY1SB114CqZD5DgkM8WzK36zdNsL1Y8Iymt"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.8":{"name":"mosaic","description":"a client for managing components","version":"0.1.8","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mosaic-readme":"0.0.1"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.8","dist":{"shasum":"a35eed81cd2d1d4d70ad6e07ee4459d48f2adb13","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.8.tgz","integrity":"sha512-MFqz6fiUBytYqhFLKvC/3vFU6Zt8F9HQWVYIiXjqPwPabQMDVLlk4IrpROd+flPOMCJUBDwlaVBEERpXFhW63w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCA+/Pr5L1Z1CwYI5/+ODxF3nrMA5GCXVgNVMbxcqUUSQIhAJlAkORk7qEwDeEU71jYCcWa07xnKmtI6V9/H8GV5Y+P"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.9":{"name":"mosaic","description":"a client for managing components","version":"0.1.9","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"0.0.1"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n- mosaics\n  - wangwang\n    - 0.1.0\n      - index.js\n      - ...\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n- mosaics\n  - dropdown\n      - README.md\n      - index.js\n      - index.css\n      - ...\n  - breadcrumbs\n      - README.md\n      - index.js\n      - index.css\n      - ...\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n- public\n  - mux.lego\n     - ceiling\n         - template.vm\n         - index.js\n- views\n  - index.vm\n- server.js\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.9","dist":{"shasum":"a5629caf008b72fb58cb470943f64a5238f4bf27","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.9.tgz","integrity":"sha512-1ESkbgXsFHjHsSuRCwvXUIKtzlFEiTLldjIPR8m15Ed/Wi1jIQu15Ls98T9vH0w4gzYbijFtKzI5KlInUXaqEg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDkUpQHE+qwQD6pFfKxVNd3m0MGcm4LEtGzehkJSIIyYAiEAqdSsyEO/0U9skCnzDG5wV4B/WCI1ZFv3iWBjWBYK2hc="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.10":{"name":"mosaic","description":"a client for managing components","version":"0.1.10","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"0.0.2"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.10","dist":{"shasum":"c2e1ca4e4cb5db9918b405daa8c96537103c61e6","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.10.tgz","integrity":"sha512-Keh/uHwK/vJr/iIRPs3c7iJGzzawf6bvo1NiraPq34JtQlxTep5o9ng466ItXtrb5UHzm69Jiopj0p9XtaLKpA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGRVI+a3olMeOAxbt1osBtK/XftRnn/PJqWNh7y8x7KEAiEAm0Y5fcksRokuxZj0yUdD8fygvm1ly/rx8wPVJplurVA="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.11":{"name":"mosaic","description":"a client for managing components","version":"0.1.11","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"0.0.2","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.11","dist":{"shasum":"3b7d8f928e50218e2f8f3993cd832ac5c2a2ceb9","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.11.tgz","integrity":"sha512-CSkMQc7rGygV8HGnpmsjEkU6JJQC0PtHLdvXT4Jlf0KpeXUCvy5I8J0tNbTPKDhk0+x8QM45cDBd9YAp+KkOWw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfRv3IJHyr9EU3gAB9ArEZxmAikyTCHCO4qFz4QnMZjgIhAIGGB4E4hw6YM48+Rfn+KFjjVYLN/z6zot5+KIFpYso2"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.12":{"name":"mosaic","description":"a client for managing components","version":"0.1.12","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"0.0.2","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.12","dist":{"shasum":"50be63ae820121a4e52aecf8047c9d02d3856365","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.12.tgz","integrity":"sha512-j/rE2E/zNFJk7hO61/EqWmJXWqac+ovMViAe23KQ9gDxgqgX2Zh7yzK2RkyfvRjYn2oADFiHG0hscF9ioEex0g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB++6ieNMXD7qZ03YMGVqyAnYNTkqfD4ExuBqXroh9wFAiEAvAJ1OXVJKbYgr4H/PXZD/6Nru0SIIIZ8DQNvmTA15Ig="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.13":{"name":"mosaic","description":"a client for managing components","version":"0.1.13","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"0.0.2","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.13","dist":{"shasum":"a148eef4899711b94ebbde027e080d3b1d9f892d","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.13.tgz","integrity":"sha512-jORumY6Um3SbBchqWWWhtG4FdG7MGy/TE72Bc95HA3Lb3RLl5HDTCzwtqB2kbuReyUdscTG0XGIkKTHYoTYxjw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCHE45uwUj+ngF4FnK1R/PnE+xXOdoASMb6bGiAyXL7VgIgbXsgEjGyUSQ/aucPt2+Zdx8wqMagDIlUzWTdbHsddTY="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.1.14":{"name":"mosaic","description":"a client for managing components","version":"0.1.14","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"0.0.2","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.1.14","dist":{"shasum":"38a2a25fbeab753be81eb0a0fc632384d7a228cd","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.1.14.tgz","integrity":"sha512-bEWPLXsjk8U66JOslOyPqqU4CDdcWUK7jnjXTwLH6oDXXA5d4dJzy8LFHzpHRpFAnc115zkxCowT0lbx9Jzbgg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBYFI1kt9rsfbfYkTNJheuAB9SbXRWYHsIhcS1GWAQfAAiEAwQsYAxUG7rdCrB1LlFOwlcippy5aQkH3uf8Hperqtjo="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.2.0":{"name":"mosaic","description":"a client for managing components","version":"0.2.0","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"*","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.2.0","dist":{"shasum":"afba83ed30bc635898349bd6a9bab4f2500c544c","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.2.0.tgz","integrity":"sha512-nQS0jwv3ZEqCWJriRW3PkO2o+y17ZZpl1d2TJPXOsTs0p4I41hryLLQoTcqx4qGqGB2Rvm+o8uWzbLBIO+eMJA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCg1Y7YQuoDlQyNOCA/nfdcNie08DsAmXmlVLa0IP3l4wIhALma+HPN+FPbvsW/OZ2Oeme4XE9uLUSWZdRaEWuEkmNj"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.2.1":{"name":"mosaic","description":"a client for managing components","version":"0.2.1","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.21.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"*","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.2.1","dist":{"shasum":"1b348e9eb807f7b4211fbff3b610cd0afd3656ce","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.2.1.tgz","integrity":"sha512-arC75waA6CUYQu+FG46BKnvxpUB8Z8S0OsuNt868DgfX9iAyz/KtmOs2EOB0qZjguy0UxxUqNhLsCZuaDNmC8Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDENjQ5MPq/PC5y7vgZvArOM5nShSATPtX/9zN/4zy5CAiBvCvdPa9gdvwLHGNOchtIshswrIhGNV93StlBH0TUpig=="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.2.2":{"name":"mosaic","description":"a client for managing components","version":"0.2.2","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","request":"2.27.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"*","cheerio":"~0.12.1","q":"~0.9.6"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","_id":"mosaic@0.2.2","dist":{"shasum":"d2e993f84b60b3a3e511d01fab321661b84b9bd1","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.2.2.tgz","integrity":"sha512-uerYVtOL5jSahXjxiAePgfFBxg4Gx/um/zn2w7w7+JEwRSfj86cNb0bgt8dKHkOkb+rhdDlEIMIfEXPL1t5bvA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCl/CNomow99ZGQ3lBYejVRu8ze687GudGyhyEA6IMtswIhAMn2HeiI0x/sDcbSsRreMmTnESwk4z/6Q24OTuomlMTJ"}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.3.0":{"name":"mosaic","description":"a client for managing components","version":"0.3.0","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"*","cheerio":"~0.12.1","q":"~0.9.6","superagent":"~0.15.4","cookiejar":"~1.3.0"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dotnil/mosaic/issues"},"_id":"mosaic@0.3.0","dist":{"shasum":"67b402d2d8444995f18f542d4d4fdab960c39c70","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.3.0.tgz","integrity":"sha512-4mUD8xLvyaa6980lOvUgQO60TWzmW71WSlWEsu7oGxh9LTVz7NLpkBf8jEbOc6yukY8otz/IY/q2HcbkoWZUZA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCb3aIVQVi6kACTHyPO4OiJCT1FIz2Mj+/BSiNq0Got8wIgf/ET/Eu0fLfOzBWYf23vlsLcDsQSJTlQU+4WQDxwyaE="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.3.1":{"name":"mosaic","description":"a client for managing components","version":"0.3.1","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"*","cheerio":"~0.12.1","q":"~0.9.6","superagent":"~0.15.4","cookiejar":"~1.3.0"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic","mosaic-info":"bin/mosaic-info","mosaic-install":"bin/mosaic-install","mosaic-publish":"bin/mosaic-publish","mosaic-server":"bin/mosaic-server"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dotnil/mosaic/issues"},"_id":"mosaic@0.3.1","dist":{"shasum":"23b676a52d616a0608c99f7fb3340b0b6afa2691","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.3.1.tgz","integrity":"sha512-1+/ipjOg1VdKud5t6SfC5GkuPRTQHG4Kqbk1+oEQzG1pteZnyFhf0bDxs25LWIOBiMM1IZ82xhzwNRsWF04cYg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAUhm0IUu3xhN1yy1EzEj3TcrVIrGkw2QyXn+NSsYKWkAiEAjzXrwCmn+s70H9WLjSS2SI/Lfv7b42qUTXXq+sl6TRg="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.3.2":{"name":"mosaic","description":"a client for managing components","version":"0.3.2","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fstream":"0.1.x","fstream-npm":"0.1.x","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","marked":"~0.2.9","mkpath":"0.1.0","mosaic-readme":"*","cheerio":"~0.12.1","q":"~0.9.6","superagent":"~0.15.4","cookiejar":"~1.3.0"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dotnil/mosaic/issues"},"homepage":"https://github.com/dotnil/mosaic","_id":"mosaic@0.3.2","dist":{"shasum":"0ee7a16436cf56f3ede1806b2b66b47ed1827488","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.3.2.tgz","integrity":"sha512-SYKMrDHFBLDlJWo78LTmSM0W8VUoPgOdosAfJb7m++7O1Lp0HYXNfLYN92u+SOFNmRYRVKHHcB9mKryMI/4lIA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJ++BSGUAS4lLswxT0w+nAji1olHlV4XoeyCXXGRaviQIhAJPq7eSyGtEf4etyyRJCUTDBt7dsluMRUxeGoUlbmR5Z"}]},"_from":".","_npmVersion":"1.3.14","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"0.3.3":{"name":"mosaic","description":"a client for managing components","version":"0.3.3","author":{"name":"Chen Yicai","email":"yicai.cyj@taobao.com"},"contributors":[{"name":"Deng Ruoqi","email":"ruoqi.drq@taobao.com"},{"name":"Ye Hao","email":"lingzheng.yh@taobao.com"}],"preferGlobal":true,"repository":{"type":"git","url":"git@github.com:dotnil/mosaic.git"},"scripts":{"test":"mocha"},"dependencies":{"tar":"0.1.x","semver":"1.1.x","commander":"1.3.x","win-fork":"1.0.0","fs.extra":"1.2.x","debug":"~0.7.2","express":"~3.3.3","velocityjs":"~0.3.13","jade":"~0.32.0","q":"~0.9.6","superagent":"~0.15.4","mosaic-readme":"~0.1.0"},"devDependencies":{"mocha":"1.8.x","should":"~1.2.2"},"bin":{"mo":"bin/mosaic","mosaic":"bin/mosaic"},"readme":"# Mosaic\n\n马赛克（Mosaic）是所有以 Brix 组件形式编写的组件的管理工具，将业务中的各个区块以组件形式管理起来。\n马赛克希望可以成为 BPM 工具的替代，后者依赖 NPM，不易扩展。\n\n在你使用本工具之前，请先阅读 [Brix 相关文档](http://thx.github.io/brix)。\n\n## 安装\n\n马赛克采用 Node.js 开发，通过 NPM 方式发布。所以使用马赛克，你需要安装：\n\n- Node.js\n- NPM\n\n然后在终端执行：\n\n```\nnpm install mosaic -g\n```\n\n装好之后，就可以使用 mosaic 命令了，还可以使用 mo 简写喔\n\n```\nmosaic help\nmo help\n```\n\n## 用法\n\n马赛克工具包含如下功能：\n\n- 发布组件\n- 下载组件\n- 开发核心组件\n- 开发乐高项目\n\n所有功能都以子命令的形式提供，类似 git、brew 等工具：\n\n- mo publish\n- mo install\n- mo server\n- mo lego\n\n### 发布组件\n\n在组件目录执行：\n\n```\nmo publish\n```\n\n即可。如果不想 cd 来 cd 去，也可以指定一下组件相对当前目录的路径：\n\n```\nmo publish mux.tanx/dropdown\n```\n\n发布后，将可在 <http://brix.alibaba-inc.com> 看到所有发布的组件，自然也包括你刚发布的这个。\n同时也可以在那找到你的组件在 CDN 的地址，通常为：\n\n    http://g.tbcdn.cn/mo/:namespace/:name/:version/:file\n\n如果是 Brix 核心组件，则命名空间为 mosaics ，路径为：\n\n    http://g.tbcdn.cn/mo/mosaics/:name/:version/:file\n\n如何在自己项目中使用这些外部组件（核心组件、或者其他业务组件），请看 <http://thx.github.io/brix>。\n\n### 下载组件\n\n可以下载仓库中的组件到本地，通常这是不必要的，除非你需要将某些组件改头换面到自己业务的命名空间下。\n\n```\nmo install mosaics/wangwang/0.1.0\nmo install mosaics/wangwang\n```\n\n均可。不指定版本的话，则默认下载最新的。将会下载组件包，并解压至当前目录，结构为：\n\n```\nmosaics\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n### 开发 Brix 核心组件\n\nBrix 核心组件的命名空间为 mosaics，所有代码都在 <https://github.com/mosaics>，相应的，\n我们要求核心组件开发者在本机也将组件目录组织为：\n\n```\nmosaics\n├── dropdown\n│   ├── README.md\n│   ├── demo\n│   │   └── wangwang.inc\n│   ├── index.css\n│   └── index.js\n├── toc\n│   ├── README.md\n│   ├── index.js\n│   └── package.json\n└── wangwang\n    ├── README.md\n    ├── index.js\n    └── package.json\n```\n\n然后，在 mosaics 目录下执行：\n\n```\nmo server\n```\n\n接着，访问 <http://127.0.0.1:5000/dropdown> 即可预览自己所要开发的组件了。预览的内容根据\nREADME.md 的内容自动产生，具体写法可以参考\n[mosaics/wangwang](https://github.com/mosaics/wangwang) 示例。\n\n### 开发基于乐高平台的页面\n\n使用如下命令启动服务：\n\n```\nmo lego\n```\n\n要求目录组织如下：\n\n```\n.\n├── public\n│   └── mux.lego\n│       └── ceiling\n│           ├── index.js\n│           └── package.json\n├── views\n│   └── index.vm\n└── server.js\n```\n\n## 实现\n\n[isaacs](http://github.com/isaacs) 大牛对 Node 社区影响深远，要做包管理工具，\n完全跟他做的 NPM 不沾边是不实际的。在本项目中，依赖的与 NPM 相关的包有：\n\n - tar\n - semver\n - fstream\n - fstream-npm\n\n### tar\n\n[tar](https://github.com/isaacs/node-tar) 是 NPM 中使用的打包库，作用很简单，就是\n`tar foo.tar foo`，封装了各个平台的兼容性，提供了统一的接口：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(fstream.Writer('package.tar'))\n  .on('close', function() {\n    fs.existsSync('package.tar')\n    // ==> true\n  })\n```\n\n要打包（tar）一个组件目录，只需将其作为输入流，输送（pipe）到 `tar.Pack()`，再输送到输出流即可。\n还可以中间加一个压缩步骤：\n\n```js\nfstream\n  .Reader('path/to/package')\n  .pipe(tar.Pack())\n  .pipe(zlib.Gunzip()) // Node 自带\n  .pipe(fstream.Writer('package.tgz'))\n```\n\n### fstream\n\nfstream 自然不得不提，不清楚 Node 里是什么时候开始有这种流的设计，我还搞不太懂，\n只能参考例子凑合着用，在 Node 里，我们可以如此打包、压缩单个文件：\n\n```js\nfs.createReadStream('db-backup.sql')\n  .pipe(tar.pack())\n  .pipe(zlib.Gunzip())\n  .pipe(fs.createWriteStream('db-backup.tgz'))\n```\n\n但是 `fs.createReadStream` 不支持从目录读取，因此大神 isaacs 封装了 fstream，方便操作。\n\n在 fstream 的基础上，他又搞了 fstream-ignore 和 fstream-npm\n\n### fstream-npm\n\n简单说，这个库的作用就是以一个目录为输入流，根据其中的三个文件内容，忽略掉此目录中的一些文件。\n这个忽略的功能，自然是依靠 fstream-ignore 实现的。这三个文件是：\n\n - [.npmignore](https://npmjs.org/doc/developers.html#Keeping-files-out-of-your-package)\n - [.gitignore](https://help.github.com/articles/ignoring-files)\n - [package.json](https://npmjs.org/doc/json.html)\n\n前两个不言自明，在 fstream-ignore 中已实现，fstream-npm 扩展了第三个，即允许用户在\npackage.json 中使用 `files` 属性显示指明所包含的文件，类似：\n\n```json\n{\n  \"files\": [\"index.js\", \"mosaic.js\"]\n}\n```\n\n### semver\n\n语义化版本，去年就广而告之了，从[官网](http://semver.org)做了摘要，翻译如下：\n\n首先，你要声明一个公共 API。可以由文档和代码本身的约束组成。无论如何，首要的是这个 API 要清晰并且准确。\n一旦确认了你的公共 API，你就要通过版本号中的特定上升来说明 API 的改变。设想一种版本格式为 X.Y.Z ，\n主版本号.次版本号.补丁版本号。不影响 API 的修复版本，上升补丁版本号；向后兼容的 API 增加、修改，\n上升次版本号；向后不兼容的 API 修改，则增加主版本号。\n\n详细的规则，和两个版本号的比较，semver.org 都有，isaacs 在 Node 中实现了这一逻辑，\n并在 [node-semver](https://github.com/isaacs/node-semver) 的 README 中描述了其 API，\n和版本号比较的逻辑。\n\n\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dotnil/mosaic/issues"},"homepage":"https://github.com/dotnil/mosaic","_id":"mosaic@0.3.3","dist":{"shasum":"942e4216337043498e8323e6314b9e2f0d49da4b","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-0.3.3.tgz","integrity":"sha512-B8vK0XCM047RFr4M3xHI5VcIJRGGGpkI86nVMjVlue8gP9rInnj983CH1mFj6kkpjsIKZoSiRu/Fo5208vQWKw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCaNTlojctz15cSnxV1JJZdc0MEbJoN9RKvkFzYzSJNqwIhAN6vTy03v2BGEJI39ifqCFxAahmg0AyN/C/Wj5cWEJej"}]},"_from":".","_npmVersion":"1.3.14","_npmUser":{"name":"dotnil","email":"jakeplus@gmail.com"},"maintainers":[{"name":"dotnil","email":"jakeplus@gmail.com"}],"directories":{}},"1.0.0":{"name":"mosaic","type":"module","version":"1.0.0","description":"Mosaic is a node command line utility made primarily for transforming and combining HTML assets.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":[],"author":{"name":"defx"},"license":"ISC","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic#readme","dependencies":{"chokidar":"^3.4.3","deepmerge":"^4.2.2","express":"^4.17.1","fs":"0.0.1-security","glob":"^7.1.6","glob-promise":"^3.4.0","path":"^0.12.7"},"bin":{"mosaic":"index.js"},"devDependencies":{},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"gitHead":"7708a29e6f522806e4a55a1a11a3784fd12694d4","_id":"mosaic@1.0.0","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-VpxCn0iyLhuHkJHmg7nLaLlkCMEd+yAmZtuoosNKHmmE4/l+BHMyvdncl36Q5bBrmJHGz2FHyv6QmsvSwOU4Eg==","shasum":"7b15da3570e8e447091202e4d6d6c83138c57ad0","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.0.tgz","fileCount":5,"unpackedSize":5918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyfcWCRA9TVsSAnZWagAA+H0QAJYIMXOY+kf4YS1+lwQ6\n0LWrq5wGVEi1lPuSIBSnU/w+4aeidzWrAS8ueZF8+9mqWMo9h8Fnpwukc6F+\ng+Preo6pvtHqWqLXg5jhW/4XlS2tr2JwHV5zNxvBe0nwQZVPO1hfAaiyC5SQ\nZvQ1gFB9NFfnYKEy9npTTRNAI87YO17DIuBo97fgqaPsU2uEMjgnTej5K4ow\nqJxx/9qdjJyaHny5Bkn0TBY+oOIb2j50OvDWJc0HdyLl4KItMxgSNIZ87VDp\nj6TNHr9LWciIwfvWJZMOZrB5JfFjXCpZVE3hFWxxfIKfxWbJE9wzE7N9mb7g\nNqHF6pZ6qXDm5t297xLzyeLrBQ4rqUBpl/VIJyjZmBril5Mz0UKwkmrOtunp\nMB+kiC/id07+fJUr7qoDfDOOyMgGrngt1CMg8IS3aaRbTTtRPs6iXR/Rg66L\nel7ladC6PHNAkHBVUIhTsP9n2W2MaCDwD+4KvmyplUWfdJAkeRorJXHKjSGM\nvBKunNCUWVbXgjDS+ipyeSySBmsmoCI/385qOZc8ql20kIb9lZSd/qF+9PaP\nXIWrQisl0h3LF16EdvkB5ZlU3JWnfzQUytS1Sp/XTSSEP9WVAL89O8lG7mik\nvn3bwpEH2RaCYyiciMjcDa3xFwaoTbrU2tMQw40WqXHpFEnaQrFeVytP103f\nfyPF\r\n=w4hp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSbk5TrOTo6T6g2tqVQ/eUwa1Tal3Hoz2ey6eDMCaUrwIhANYwz8/aYIjxLgGQ19dU8rAfB0WzZFEhhiDLjx0ICJxS"}]},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"},{"name":"mihairo","email":"mihai.roshca@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.0_1607071509826_0.7357798964125488"},"_hasShrinkwrap":false},"1.0.1":{"name":"mosaic","type":"module","version":"1.0.1","description":"Mosaic is a node command line utility made primarily for transforming and combining HTML assets.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":[],"author":{"name":"defx"},"license":"ISC","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic#readme","dependencies":{"chokidar":"^3.4.3","express":"^4.17.1","fs":"0.0.1-security","fs-extra":"^9.1.0","glob":"^7.1.6","glob-promise":"^3.4.0","lodash.debounce":"^4.0.8","path":"^0.12.7","ws":"^7.4.2"},"bin":{"mosaic":"cli.js"},"devDependencies":{},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"gitHead":"ec149dc5a6e7e3fb85ff67731175c85926da4410","_id":"mosaic@1.0.1","_nodeVersion":"14.15.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-0G7xYh7EU/37APumPS63rCm33nTqqWMEaRRFbBbDKXPLLn5MxoiHVB1QlCzsJfpYCJZv/JKF2xhgGBmZBvOIOw==","shasum":"3af08b6765454adc12ca6eee6b38949399452449","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.1.tgz","fileCount":59,"unpackedSize":1359622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgP5+xCRA9TVsSAnZWagAAAHoP/0FPXEq5y81PECRNr81a\nV/CQhd5PT+z/rufG3x2JrWQntBdb3+SjJm5IjEAx1KPvoZGy5Lu2t3QeNE6s\ncbFt3OcvuhSiZeqwMEGCTCBjH2pJQnwdeDPKj50myu+8S97jTke+6dzDqLv1\nUm5tFm279v58PlxAyq4lfoDQ5qCAbpVwMcXqb6oBUXM0Zw+QpJoxMOLCJr+z\nEQcivGrC6Q3AwFOIp/kyJLhA4oLSIBMWXjvZzHj463su9pkzXW3WYINU2w9C\nuhunLFmJB7t6iro6JySq4igH1736e2bbQRI/q/RfXcWVN5QvK+4xUKIaimtf\ngivmufEjeW4KyHMzYQF2HNnkcsZQ54qzVuEkEF7GPqq4LGim3l3cga4qXBeZ\nRTVPYQIl3xVIf1VJ/snE/fLNdaabaEX+yzcU4tU9pGtjpZST+MXvN9HonjBP\n+yYRWhCAdKjlD4pO9B/DeXycGwL4Q8SCDlrItDvaEfZq8rjtUhpL5kdw7O8s\ntDmZJf94d45mOcnyqlJwkYqE7aMO9De8ck+kcU7p+tMys0nslWKoexLbqLrV\nrii2xfg2vFQH4e1yswrIst+OVLZe94XZLsH+Oa+dV/1je8bTHRx7NZOhF/ub\n8PfhwuHK8axynoF9XVJWKeKEBBx4ds1+q1WSfJkWL141APHs+Ifwk4tTHv36\nbm7V\r\n=CNUa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmjjhSeLw3BzvwWEBgss2b/XVTM6iHW56TWHBGNmROrwIgIP5bjIUHFn8hcjyCXU9ZR++TVjXEOYQI3xCluac8K/w="}]},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.1_1614782385121_0.3909909052971632"},"_hasShrinkwrap":false},"1.0.2":{"name":"mosaic","type":"module","version":"1.0.2","description":"Mosaic is a node command line utility made primarily for transforming and combining HTML assets.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":[],"author":{"name":"defx"},"license":"ISC","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic#readme","dependencies":{"chokidar":"^3.4.3","express":"^4.17.1","fs":"0.0.1-security","fs-extra":"^9.1.0","glob":"^7.1.6","glob-promise":"^3.4.0","lodash.debounce":"^4.0.8","path":"^0.12.7","ws":"^7.4.2"},"bin":{"mosaic":"cli.js"},"devDependencies":{},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"gitHead":"ba040e63cec9a0839890bdf2dbeb2533777b760b","_id":"mosaic@1.0.2","_nodeVersion":"14.15.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-IwjzvDUGhF4JK7zQwlowQkf2WME3DcVAbgHh+AoXs45X+Vyg4MM0QTsELrIqIp2pnxuTqJatnz1T3CH4vC5fTQ==","shasum":"5f05cded3ffacdf8303aaec0b12edfbb56c05a3d","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.2.tgz","fileCount":59,"unpackedSize":1359632,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgP8xYCRA9TVsSAnZWagAAUDUP/jM7dPOn7Fya+3RNduM+\nrOZ9MAbw8uU/Y84KOYmWHDhSrFubtPy9BhddE3SprmydNy9Q3O8fxyy2o0/4\nxSxzVTFqDIu62vuJrpqNW8BfBBOFOwTqOk7nH6kh+DCFYdHUrPh3TSjydhgf\nPq7A1PKjsIKQqGn4n3bD5O/l0L3zkosJIF4xLV7K3v/YzESFXWdzu7vLBVfA\npr2f0JmCxHN+LHhcXBF7XkPF50HihVQXA88mKEuOLqbKQwXoNz1OXfN4HsOG\nr24ei9hAkrre1mExV96gGGM/bf9ob/5xm8PU3GOScDiGHvCdxU4Y539SvHW7\nStMo9JnUYq+nTh77V1Yd2dwt1QsfI5o4jwsMLGhn0mN4VJFHdqrft7r/yLvU\noJX6wg01Oq2vTqr42CMRukR9651eHLLmr/KPr6i4Tuix/iwHrNCamRWnVtWl\n1CU4w6cy4a4y2k163y0rgjIa4GzUyhTTg58t8ATPLqhdABlfl/OQETc2ZSnP\nfD+J6RPPQjkoCG9cvlIT5UCQC8nuKU9uAghxjRKQJfD6X4nPG6Fs2VRcFnV3\ngBefCDLivSy/K/vXhhkAX7lmayWJwg6Hp6tnfzDVtbnsL1hhFxCW98wz6DPC\n0c9mkPvC+Uvrk5tWqmXp9xmIE4WnI0FPvcQSySVTJutDeqsAwmezLaCOjIWA\njcvT\r\n=7332\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8wuUHj1V9lVLd2f5YTGampzA3Miq/U/LpN2+0DFFxPAIgUzRKQLprUwSX0RL+JOEfZZZgjPAIGJDx5Uf0YwRBkS0="}]},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.2_1614793815994_0.6522944621921098"},"_hasShrinkwrap":false},"1.0.3":{"name":"mosaic","type":"module","version":"1.0.3","description":"Mosaic is a node command line utility made primarily for transforming and combining HTML assets.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":[],"author":{"name":"defx"},"license":"ISC","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic#readme","dependencies":{"chokidar":"^3.4.3","express":"^4.17.1","fs":"0.0.1-security","fs-extra":"^9.1.0","glob":"^7.1.6","glob-promise":"^3.4.0","lodash.debounce":"^4.0.8","path":"^0.12.7","ws":"^7.4.2"},"bin":{"mosaic":"cli.js"},"devDependencies":{},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"gitHead":"cc4120150fc0b16348a6b449e54f92ed2bba58d2","_id":"mosaic@1.0.3","_nodeVersion":"14.15.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-rUQw4wP34r/abFvlniFS3JmrK2bmdntFWxlk5z8497oMe/+IfldBx9Er3mqpiKXZQjQd5Emw3RXENTQasBlTYQ==","shasum":"3681e219b66318d66eb7e1820936f911bb1941db","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.3.tgz","fileCount":59,"unpackedSize":1359667,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgP+0LCRA9TVsSAnZWagAARU4QAKLDPUfzxhQ6fqyNa9Kl\n1qkBUCODcCmD5vv6EOAIaJLdBpFW8S6ItHU/SVRllqsMDq0V8T+naPTizRc/\nyaNkMYyYlmUp+yjIST13osX5WY8XdBtwV8l0L1oHjFqf0+CXk1P1iPLKtYCp\n3lqMfNDRU5bxCXxEOcA5U9juuF93nT1WSV+JE0EsszGD5Il064IsWDNLAX1W\noRKauRe1V0EwuIP7DUYJ0gFJ6z7a3TwT43llwOoPCSobPnE64+Hd/mMrgQPh\nz+36aEGzZt3OlpISByAHdgcC0zVuq0KitW4tUGGgA+88hDRnnxsufsaDUWju\nk47ZWWh0TDMPez/492IUSI0tkY/svsp9SEZ7ou3vsxsRbvyqJWkiqfWWJtjK\n+dTpC0jnn+NBdX/AK3z13Bv2lrxMSpBTGQgpy3Q8g5aIEG5gW16RkcDR3bz8\n4R33ixW6QEhr0FXFOzvSatnkbGSIPfkyrS6721rabw+sz7DMVod7DgWLpKT2\nfCr5t06KhdEeoOX2dZWqmZTw/nYB+IXHAf0ZhJdRC8IponTqavU8cQB5SWBl\nYGD6071nLNRhjcJB+oIcl1lk9qVpipMJWnEQwVCuUwEQehtpCjgGqLGkD/XE\nQ6P6l8p9Bg9M0ARyb81M2am8OhhlaBbe2kiALo9YTn3oJ6V3ndI8QTsItrHS\nUWNo\r\n=5oqA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCx0fpm48OTX4rYX05KPisaOeGFzZ3H/HMw/7+frW8EegIgUw3u7BTfp9GQ1VMk4wvF5ER3JPJCJyqqfN7Vual/fLQ="}]},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.3_1614802187334_0.4949535161865757"},"_hasShrinkwrap":false},"1.0.4":{"name":"mosaic","version":"1.0.4","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"cc4120150fc0b16348a6b449e54f92ed2bba58d2","_id":"mosaic@1.0.4","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-P4t8FljILM27UYahoSYZOUeA95hzLJsyYA6HzG3kZdOTuOtzIDh6nzecXxeW4wcE9HdvZQ+uuMtavpdTyt5byQ==","shasum":"d93c5816df744b03f7e8a4e6e71525a7ab2339f3","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.4.tgz","fileCount":31,"unpackedSize":101922,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIByFK8uDwvEMHmhGerQ/fnAVFrWx+j3NPDaAO0vvoY2rAiEAm6cQLR3ofAmuIcxWl2cCH1oE3b/aliDtqzqngSnYQdc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiRZh1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpgBA/+M75eksxMyukFxiGo36MCS5FA//4Ez3rOyvKW8fF+U8BO7C68\r\ndNTMN3PaSVPr3U0KALYNt4NwO3X3R9znFEajxoBEnh110mUQtSt71M7ieJmk\r\ntgR3bwlrw245dQVNm8S01o8VmZUtHx4O00Be5mOq6s9t0Hjt/FRqCuaYJqL6\r\nOkR54svFPVaKYZ9MMbilgKKecNLXXapiAzL6sX7KEoWyFyV6vDAtGbZYSDvo\r\nkcJNOxTlY5zsSkEsSTb1ykcFtBgTblD5M6OpLQ+OpZ0XaoUYx6uGb8Q4brkM\r\nBQzASPd9jZDfpI/dEPV4SYR04BgVzTdxGLYpDqDJubmEWMCBrBv87OcjPdLk\r\nurCb5p59M1UBJYmiw0uK9HNchebTFJ3TR2HU1Jv16nPiPtNqhHK/uqaH1sG+\r\nEWtwVYW2i6coTMBQYin/InE1+tBtnGdGdP8dpMe/L8O/aNpfV9rYZx19Cnkq\r\nmS0J7799wAj63WVkVCopT61zy86/zGeODKC9ql13jFaywTvXkjHRIzTBktB7\r\ni2sVx9SlEAXYeH1rrEOW2HFuf9MjHIVzBVn71rdCc6DJQj2cf1hmEoVVHuWZ\r\nRIqQl4/TrMVA8AA6lS39YcNEXckwox+OxfqSW53AjoK/x2Nm7CAMcwAbgQjx\r\ndIcuNl+dYB3UfX4VMuNAVrhZnQlj7pO/fQc=\r\n=3hBq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.4_1648728181822_0.42810404108909483"},"_hasShrinkwrap":false},"1.0.5":{"name":"mosaic","version":"1.0.5","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"92a32d0ef0a8c56a18deaf2dc638a585b989f760","_id":"mosaic@1.0.5","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-srMe8Emo8vhNQcSc4gNKHAzHe4cCfvaguPwUVMl4rxdye+obN5G/gsx1BYSdSdgUMuWam9+HPWMkCJ1TCUK1FA==","shasum":"2c175fae8809189cd67fcd92064ed4c7e2d74d58","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.5.tgz","fileCount":31,"unpackedSize":98461,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDKJkLB09lHjtpI7/5AnfcUUPC54yLJ0IQqAfzxKTzH7AiEAkd23lrWqW5MOop0bWzhWdhwHcOP2LuMMpyfZv69JRlw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiRa8gACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrtvw//bawH4cRf9rJLeEFwIXudFQowjYWHin6byXE/v9cIdvNV5S1F\r\n0JkAB8xvh9HKB+p3sgetkkBxtMs0aB8SGCl8uObs3/Mz16AJyovnaSen5Z/Q\r\nPJylQV5JCF2qlcm5KzbtNYnskHrA5Rsnsws36+BDL+4iFiNN/3i+MaJMrdQc\r\neAJAH7KFT7a3ehKyMXHdRSmiddrXCV63+q6z15s18owvV8LvUWNrpjGyxKP8\r\nYSobvkjjRkTZ3/uRWWquOJmBR/Keh0IS1aMZgTcUnh7u6RrpatwNyPk5EMit\r\ni/5Hp1Dqe6Bo4sbnQUCQX7v2SPs3AUXMzLc+OFh7cetCLP9gr+vA5XwRBJAe\r\nnyBn61mc2i96xhcDmtzL+huzdgxW9at85oBxZneeWYU03bNe8UdfP+K2EAFK\r\nVfbRdx8rksGUK1hqwA8AJYYRz/o5izv9ggIlVwPTvEuJ7fJIl7vTDfhFWDs2\r\nUADohum8sLRytTx9acZXnhq5pmk+uN9juShquQK1DMhKnwWAJCzHrPaPUlvu\r\nzjXY3ByBvNCDq/P9tFCd21eZrb1MCKq/hEC8qU1xuapd/bSLurHv2eW2duvc\r\ncmaGvTbc1PTU2W6X18B5I7qIXTQCx9jWrvBlID92ifYnbgUx8xh86jfcHUAM\r\nJqKlqeg60I2M2NccyLEeMXg87A0LNv09FnE=\r\n=zQgF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.5_1648733984594_0.10558558667275353"},"_hasShrinkwrap":false},"1.0.6":{"name":"mosaic","version":"1.0.6","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"10cdb14ab687b2465a1a41eb41376a80b1f3e881","_id":"mosaic@1.0.6","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-SyFB5cYI6XgeNqQuPXlpvbQeQytGFBvu+l3Is3UL8+aW++H/oXoXZFTLWK9XmIE6Bvj2QTmwxn5BmOk3YfMHWQ==","shasum":"5504e2a2ce5313b4871d808f61755efb8c0f65cc","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.6.tgz","fileCount":31,"unpackedSize":98254,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnuKvc55TQ40X73gY7Ih9THXLQq5ELhc1ObwNbw/R5YQIgWiIwKOFyoi4ktK54AwtfPaazws2PSSAQYoTAXpmvtSQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiRtcMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr6Cg/8Dou668SJXSiGtmMNxJL9YnxVAhQq45sH1wn3Gc8jf3odlJDc\r\nKzhVjt7d8NK297D32pJB+keeTzbBnjg31HqDSf1jB3mPWboulEuQjjuHSkMY\r\n9omvIA/yRt3QiSgkbamg8A+s/vBfnFNnn7e/vP+IBllpXEuSq33aIc3t5jDU\r\nnQK7VPbXG2rkDeVb3QW8IezjIz7pC2Hp6JZ7+s53bc94Ot1YZpssmT17RrcA\r\nh3v2uwPVJDq7zeVpbM7JfRdWzNl84L4CVP0+kbBFxXRsMMEn7aihSW/MaaaZ\r\n1BEyKUCcT+vrluPV+A8U7HM/WDnomOgX66AcCC3zxurLHls82fLeMyUHrs8l\r\n4OgfjY6mHH1sxTHDp7Or/ZONb4qJ6yTGQrHu/s05AW8+E3SIdhZMs9tXPjb8\r\nO1XiawY/Nm2YzyklWM4elNXNpk9FYRplu5BA00IK4Jz++Zfr74CcIrZvZY2H\r\n2zPkNWhS+X2jekgQiRK7fjgzYoGVNEkbTVqf97LBMpkpkx9NX7s9lsqgb/LG\r\n+QUaNVkSBg9/WWxGNgPBA54JwfJSgx8mOuLBJoMgWeuuX0elrAoPyUvHOOJ5\r\nAi3yvhjZyqL88rmslhoSRTPp6bqg1vI1sxwJR4g0xYNOAIczrGnCBC6HJ/cJ\r\ne7g+048lNI5VSxGQrf6sJQA3AALhUFCadek=\r\n=MKtU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.6_1648809740491_0.35505340343856884"},"_hasShrinkwrap":false},"1.0.7":{"name":"mosaic","version":"1.0.7","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"5cdd58e2a96d443107822f4bad29834998e8a477","_id":"mosaic@1.0.7","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-jgU6zrdFTc8C47/Mb0uVJYhBOB4XgspgjWWlm3dYDXL/mTkmxIij8m+QcfLdsE8TJJtng4zIzawCovPllmimqQ==","shasum":"83aa77039751410201dce8c33187e3f8c80f5993","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.7.tgz","fileCount":31,"unpackedSize":97754,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGOXEOhwfm7rVhC2RUHpPZ/9K2UbQYgtzTBMDLPY8lvbAiEA6Yju/8VRgY6i/Hs5n4XAUeWjaTO2gfxh2MxDCnTG1oY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiRukiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqwRAAlzI1gRCqGTpm27y0q63ZVy8dd1K03BAquGVMLcYJLEjmDFQj\r\nWSBwEq69xaXMPbJmLK4zyNIQVhS62u9uoPU+GpoZFxy9AILVKkdBFsV+XP6Z\r\nMQ3bX1sr9+T227hp0Gan6MNlzlO6lFA6zzV+jA4QNc5rcZIOLp0fbDS6UCL9\r\nD9DMr6gu1++Pou3GoRD8TtD18VoUFSNu1S7cYlMAM8v3WRd81vTG/KelL9Zx\r\n0lYP8SPKQRrCeYKx96ioJhMvpXMOAN98iKZ7q+qetya99VNrWUpTYCIl/98Y\r\nMPqD9GMYDKu6I6bB2C0jqEBmua2NWwkRP/XV+4mV8cePsyQbjiURCZ2iIXIZ\r\n+XeObT9G8WQBrnlU4kI8E/D8Gv83Jl3eOluug84QHWm4rZbN54+LORT729iF\r\nBImLm0xLbkiN2fQD084psHmsK7rIn4JrmSo4QE4Rqjp3DHEdnEl/Wl+3iNdO\r\nslMpAyZ+WkfAVE9hhPRWtQmNfMYIBhqjQxOPvFds0oyF1cfVitOSHi8rybTc\r\n5bZp3LxBmSfVYwbq97QKx+m1QZQIcT+mlLPo5cFOBA7jEwm7YPpa3yPUzfoG\r\nee0igsf8g3VSnk67ny7p9tH3WokKeEXb/U4gUaSyX695orB5d4M8IlGun45K\r\nvSsFAD+bjBQWVdA9aTw1Z+APt4mEtIGezKY=\r\n=8GoK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.7_1648814370417_0.054444885233303486"},"_hasShrinkwrap":false},"1.0.8":{"name":"mosaic","version":"1.0.8","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"398f30270809d62ab0ccd381c32ee218a31e92c0","_id":"mosaic@1.0.8","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-aTo7i48eddDF8nkbojvfKe/9Rsq+PlOriPWnV38O2GzvnnSbbNjfDErwqGXapyC0i/kdLJXRYRef/s14MHxMiA==","shasum":"22bda2b0c7a5ef8a9b5d694a957a1124edddaec1","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.8.tgz","fileCount":31,"unpackedSize":97384,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGp/yeLNsESMFDL0/ksR3mER5oe0dzv30FlnLjmswR/dAiEAiBhbGUbYRnjHb1GsMal7GpvpHdd/ULX7HCxibBQS3AA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiRxb6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmov4Q/+I3wCUkwg1V0it034+7QDSZbLXVfDXTg9l+E6jC804u1LXled\r\nTFveOV86G941Feh3UitsoLbeFRhsFU/SJ+O3XTeTzJbLL7RVLwlwCNP5KIAh\r\nfi54GZ3CrBP8yGEJfdcuKVz7qzAEnnXpLEnZ+30TDKsNu1/nmYAF6hyYrqkA\r\nnXcRTkDc3Rjd8T/lsZ92zTPrJQnu30tCEE5vbtPm3qRcPS3LxjuSVSv13Mp3\r\nB2T4oIhC03fzMtzI8qz6ojmNBxBXRw0vG7Q9e5aRXvQyb4CxxTWQ0HI4vRPY\r\n84q0wr09rxUPckbsKViKv7C+t1Lw+DlxC/hwivKBtrxrwRUYhx+ArclrgdJU\r\nw5oMOZZLw0vemy3n/sxAiCfnaJ7Gw3fnJnqepuXBi2vK9JJjfvHKKkYAjAVs\r\nQZUh78q3LctfgE/edsqXm5NE3oJaLWXcggh+RB/SLetlh+gHTuEScVQkMmDq\r\nQp2QkW2/ucgwbp+EAIBHTFqtStBAhm+PQ/oOnuebRHifp+9xHs5JqrUajRC3\r\nz7sNA/udNIOPCC02/EQJf2lKNF2H1U+B43sH/CrorgIwJpZEzn46DHE9KjX1\r\nqFYUzNaue0Xjp1/7qxmevQCSjBsVzUAYTuk3NyBiEKkCyi7Py4oCsancaDyc\r\nzfOJDhAhOZJGzI+Ag9v2ngy+RsTH4gt8Eno=\r\n=LnGp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.8_1648826105963_0.12268960070875279"},"_hasShrinkwrap":false},"1.0.9":{"name":"mosaic","version":"1.0.9","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"2400da8dd6e45988c0df580c17d0e3d4c17c94ec","_id":"mosaic@1.0.9","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-p5V3HI3gh5+B57RGrZgygZZNXolGGyc9M5k8J3EV7wPxpCvtyAfnXZdpaGPeujhLMQt9/2YAzuoLyTHEaMo9XA==","shasum":"78ef8e0a80252c25d16b7b4433cd0dc0c0fc9fa7","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.9.tgz","fileCount":31,"unpackedSize":97685,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA/vGDHCAZvNm7V2cfx+8Exv2AM41nJZA9B8RpAPtq9tAiEA6tM0M5yf6GGWLmvlbS6ojhac9EAJ/Fq+UMyb2p2rn+4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVFTcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr/CBAAjifbOlRqrHrLAD4citozlW6wR00uVW9c0v56xc1FWbwjqU2k\r\no+e0/72Z12ZQW90zgtPpeNDeoYZoP0q0tOUKx+gj/fCgzPHfsouzrYGbMvkp\r\ngyeb8D+N+b15DBFP9/2bih5KvBZidTmfCcRCGrj4G2ieuFMzfWH6RiDArWAZ\r\nfixk3zkEZMSC+MV01J2f0I493pgRW5Ap0C+ZSTiWqaVnkOYGc3YojhRwS8xm\r\n36UcAq36eMIWbRk3xUxb1u3k8BMKdg78GVcD0hRg7Dpuvw3P9CXHbRMgxpfX\r\nsgS0n8BHNWQcsb5bX3UqBpjT9xEC25kk746xGzl2pov055nyvmX3LMpc2a8q\r\nRCiTnwmlAIvMSeIFbNOW8BnwaH97pRrmhPOVZRgFUtr6NRCIWTDNMq5PUGMD\r\nNN8ENaWUpO3aEQAxyarMQkR4RhGMV9Zc1PmHGNFHtpHs5AHB4hIQF+pRyUkg\r\n50cAvPOVXTR7pRuH3nwV0dpIZJJxaV38jn7kFEngMpV/+jcE3Qkx5WsN7Su+\r\nOzmqYxeLhZxNGEkqwXyIG93TA1UjunyxXGhXd+wjmNdf+asnGEOiKo5AQQA0\r\nuLsdYmuYX7r9btbKxC8lG/fkoZJEiN/JcjlcjqJNjqRUC5x8YFFGyqWg7BKG\r\nEvgPq1EiSznwGD3doiPZORvTyNRDC7M/xeg=\r\n=kJSE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.9_1649693916710_0.36310503448800824"},"_hasShrinkwrap":false},"1.0.10":{"name":"mosaic","version":"1.0.10","description":"The Web UI Framework","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","types":"types/index.d.ts","directories":{"test":"test"},"scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","build":"rm -rf dist && rollup -c && npm run size","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","coveralls":"cat ./coverage/lcov-report/lcov.info | coveralls","prepublishOnly":"npm t && npm run build","release":"npm t && standard-version"},"repository":{"type":"git","url":"git+https://github.com/defx/mosaic.git"},"keywords":["simple","declarative","dom","ui","user interface","web components","framework"],"author":{"name":"Matt Donkin"},"license":"MIT","bugs":{"url":"https://github.com/defx/mosaic/issues"},"homepage":"https://github.com/defx/mosaic","devDependencies":{"coveralls":"^3.1.0","mocha-express":"^0.1.2","rollup":"^2.26.4","rollup-plugin-terser":"^7.0.1","standard-version":"^9.1.1"},"gitHead":"e2acf622a7d02f714d25e587f8b3d28672662c59","_id":"mosaic@1.0.10","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-SznJd2dvs3cO9B+PTFzza5yHcpz3tSzv4ArPPA3k9gO1LyCRdAozu3ynuQFXWXzl2YFCnfKvfjrpPDXF64vroA==","shasum":"2d913fe4cc600436d306f6ec62547cb7150830cf","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.10.tgz","fileCount":31,"unpackedSize":97950,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFS5buwqifjdnhe2Pz83b7JN9XglwbIzvkAQ5FkU5LldAiAnq8uWLpJm1TPUz2qRoeg23ZtUi7fXeTtBfTHutkTHxw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVGlNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwlQ//U4ZAa1NgivAVhMnVw07/DMQV1SrG3MvEH7C5zgZpiuNiCBTQ\r\nzXplNP142+Pfa7yl5cdYqdXq8NCZK2vDjbKdCB5J4VYSjCRGVykGmw0oUF5Q\r\nb7jVvTl+ycQMcUy73rFit30U9CtSe4HmaVQByW0KxM7Z/rDsEbfVByaZjCY/\r\nJFFtatL3qKE44QQ6yiYj0vnhRHvAAtnD4K0Y6lFVB1OWzhZC+KxtzhRLozYH\r\nCGOMF1NpEy4uzxnOgX3lhIQAO7c3vm7+93ok0g4h9jhQ5/xDSgAdge3u6gXE\r\n2bRa+cx8W0tIz1MuqOi4LSeHECLx3279qFnYlBBFnQXpvdLZ2Kgh0nd0Vvky\r\n8ninbOw9UFSb/WimvZz0Rk1Qt2MD1vCy82qs2JxGLbxBBKAUBUiBJFOhoZHA\r\nNjjQHiYfSEuIcQxhAdn6omMw94+zjzgYGzH0fgHePWn/K0PVWLgRuSRjaKee\r\neP5rBOu8BBjPf0M6+hErGFxIWvpRHlX42wOtc49t3QCWD1B1hU8K+D7lQBXF\r\njZNdxgazY5boQ7A1DRG5Yc4nyj4kDg+GQ8xf2IAaYB9PdGpX84Sjcb934ojL\r\nOJ+ZZx18HpuU7GptswKvVhRXIe9+8LCACSDWoBuwnbYay9xvpmFO861hCx9b\r\nT6xX9s9C1TTkZZzWRjfxPDtuNYFGFsKSvS0=\r\n=itFS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.10_1649699149662_0.946123733492283"},"_hasShrinkwrap":false},"1.0.11":{"name":"mosaic","type":"module","version":"1.0.11","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node server.js"},"keywords":[],"author":"","license":"MIT","dependencies":{"chokidar":"^3.5.3","express":"^4.17.3","fs-extra":"^10.0.1","glob":"^7.2.0","glob-promise":"^4.2.2","html-minifier-terser":"^7.0.0-alpha.2","http-proxy-middleware":"^2.0.5","postcss":"^8.4.14","postcss-import":"^14.1.0"},"bin":{"mosaic":"index.js"},"gitHead":"4b85814f739ab0b31648d46d0cbbeb4530a87973","_id":"mosaic@1.0.11","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-SR3pUhdV8vzgzzQLpkCWlsi2S3gbosEHNe3JC+2cQh4slP+DN8QmethG5/ot1/TcPT/EclraVWm6idrF63fm6A==","shasum":"a2309a06e0db40aae366caefea77dede792f2ee3","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.11.tgz","fileCount":10,"unpackedSize":14281,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFyef/fkHm40MkfJeh25fEz4c6h8/YKAw/yoKHWE5PecAiEAtOqPiRky/GiH8tcO2PuuGd2tt9+4VP0BNNoS6COLCUg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivgSzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7zw//ZnPnKnVQZ0QsJK2LYE8vDUko8Ei4ToVEQPVtap1dFxzLg62x\r\nEYeUehY72IkgiLHMq42C44pIjf99LRW9QT3OI9WwWAI5Y5y9zyhnkW6dYjk8\r\nO+PYjVXHq3nbXtAQeem+vSLZc8dTEvppESKNlPC5E2/DFAhMZLQOGCwpCnBb\r\nht69PrRlShl6swtIGcwdtJxydJnaBubH20tGo3DHvpVsTizsYzrx3AjAN757\r\nfIOnF/P9nk3yQfNWLokFsvbHWMbxJif7iis9ySAlzFzv0d9lsYCcubUL9lwF\r\nQ+5FV5JnWSiwObhPuUYSOPykx2WUNhueaLRolae62aodyDTW6sYQSknl1xqA\r\nQXiQW58HvtG/dAZPeJhmXz1qIIyHgyjIHF4SHRAzc8x5u2lwmyjKhxrvo/7G\r\n9axu0t6RljLBH9ox3AoW6RS1DENTPJMBUiM/pdo1znZ+Tf3qqtN1Iq+CgKtB\r\n7Yu6GKpsMOGVV8LUhLHk6QHkizNIwMIZHU2NpYy2vAUZlO/7IVAkNFJzQl/Z\r\nKWMKLwZrXmDlJQfdgq7RgrZAzA8hqgZrGEMJeMjRCvEMzVzgrH92GFutbcAK\r\n93GVRbO2fwVu433FEp7k4yImAVO9B8aFe1ORjmS2lMkM5p6+BxfChwx4bS0Q\r\nZEnEqyXGmvDbctPY9Ri047lT1lPQhXCh0Pc=\r\n=lUY0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.11_1656620211153_0.24916931852131796"},"_hasShrinkwrap":false},"1.0.12":{"name":"mosaic","type":"module","version":"1.0.12","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node server.js"},"keywords":[],"author":"","license":"MIT","dependencies":{"chokidar":"^3.5.3","express":"^4.17.3","fs-extra":"^10.0.1","glob":"^7.2.0","glob-promise":"^4.2.2","html-minifier-terser":"^7.0.0-alpha.2","http-proxy-middleware":"^2.0.5","postcss":"^8.4.14","postcss-import":"^14.1.0"},"bin":{"mosaic":"index.js"},"gitHead":"4b85814f739ab0b31648d46d0cbbeb4530a87973","_id":"mosaic@1.0.12","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-85fA/Etg6O6juAgGmtgcfFvINFxayUlRmnNoLV3n8u5jdd0Y89wNbeALokCjut3q5xe/5E12pOCdWISxgDlUBQ==","shasum":"8c0f22dce5bf7907601c29c02610393265617711","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.12.tgz","fileCount":10,"unpackedSize":14300,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHc2Q8ZeAuclnMaoYIhG52QRmVyFAwD/Hr4vSZ1GjBceAiBfwbIkCzy+He2EVS6s2ZH1oahc7JI8qmuSodrX3LiJzA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivgccACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqAEQ/+MYoBjhaa1EZk7pmktJvivkglQTIvFIzACpvRVgT16g6CxvMu\r\nUwoj672LSXWD7+2lRxC/wAqAkrz/LN4jIdMl84eX733n2JLs2Vtip6LPmzHU\r\nCWEwLHBax/3fBEk+zVrVw3VOaBfyo1tNwgllclf6yE3RX5ICtADrVWC+slwO\r\nNiKxM+M7eFqIoU7LxRRjVlg60zYnCt0/lU7igPhhNy6wYsPv1fbEQD9RhLpe\r\n7YYybIAyYV0KXH5tCwjtVvmeb0qj3bBTpULHITnJ5YAKb1bR1hCv+67eFfDB\r\nyy7DR4e3lZ9yF7A5DRVzIgT93It6p5FHMkgaoQabH8eLpr9YaUFnccJr14B+\r\nE14YcUFtelYwBqrTbxSV/sOv12l6tHtKrykbPMNzFulIgv8ocKDiaIe6SL8n\r\no+Rnmkj/eXdRcg2iPAFGx+EHl+EdKZ5m7+pqQVH+S/hMStRVcL4Hnl2vpiss\r\nrZyjhCoSQSoTL1idRmrCX3ZtQAVThnxRCEsduwFTewBBrnzVqQh31BwcfGnu\r\n5zyoGNVIUWVHnBFf++ISYr829F/Z/KErd2olmh6cKT5shVP5sPkDBF0SzSd3\r\nvCo8eeaadHRcCttJvPhkuvJhTnW2hEWlM2loVkWAKVhvibpn26MjpkA1wU7D\r\nk1q5d9t8Y9jfJLZqsdSxlU5SBtofTaW5TWU=\r\n=qyOD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.12_1656620828013_0.6674258655724714"},"_hasShrinkwrap":false},"1.0.13":{"name":"mosaic","type":"module","version":"1.0.13","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"node src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.13","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-qLpswzLfKrfo5S4F0kWjAB6zu0Pd/tm6Q8ksqXvVpyW6cELOoznWUyT11KuYJ1/eU6a4+bew0Z/7A+QMFCOUYA==","shasum":"f3dc9fe52d9e75f366a45b60f24a58f9cd9e1aac","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.13.tgz","fileCount":8,"unpackedSize":8137,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFnxqc9dskY1lGXbdWmzgaRAGCLeKKxQTHIBGSKNaSfgIhAKD5Ca5XK6s0ZPGj3RqJQD99ViXIRxfq3Wjb00FGAOgh"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt/aKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp3zA//SGJXJXPjujNvAY82YWL8uYMZx7+rVSElSoqitacgeKC43RCF\r\nKeoW8YKSdPcfSkJh7OtKCGGdgjmKOwY4kZJRAg/CCvYCNBU5pSLPpwM1F+8X\r\noJ/s0jtMZSHY1muG0bmQlab1aAEA8WklgkoUFValkTtw/lN88HN3jeNLemnl\r\nq/0ezQOIE9JkEnAsWr5+gnBa4A8DR+gy/w4JzHMgeiSpW+B/5rKTMBvaij+F\r\nuj8njuGzdmRqHfBk6uL5Po13TQ8NvEjtxE6UaHlkewhwckxtz/CvYC8Ep5vW\r\nf3TSIrPbvb1gfaooW1StwdPiX/kFkvH5rl2SZl0E1l/KM07fnNDO7p6993TH\r\nXB+L7KgcRl8xP3UbRFAAfiFglt10ip5SPVpvM0+lgkZclWL6sZHDROoS8eyL\r\nU3nFtBjhdV2QgaNwUgtN+h8OjVDXETYEkOKUMSCkGu802Jf8g3oiVhJM65jA\r\n/sR0WJjMMFD1P2VvfWSd9kC44wX2pVMRw7ugt+P5t8cy5ty5AVC532kwlu/4\r\n6HLqRBnTVNEZVvU/boPhZYYYfMannZB+IQjH3pDLG/fv6am4mX/phAG67d1K\r\nWKNyuIbUnhJm98nmmBKfMHGMeabAw36jiK4jya7m2b1d7SATc4qUumtutwpt\r\nAgkYTEqm7mUeMVZR+QTyJ5ZUe58z3GK/mYY=\r\n=ObKW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.13_1673000586708_0.6477452328080033"},"_hasShrinkwrap":false},"1.0.14":{"name":"mosaic","type":"module","version":"1.0.14","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"node src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.14","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-GEKNoHH3GZKhg0KYlSXQ2vqEuJdCtoC86XJvXe3D4OJW0nq+vuuqna61BhQiWU/7IZWMogDRShHkMSvWB681Uw==","shasum":"f414c4b3a71646f5363065e1bc7a921241e75882","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.14.tgz","fileCount":8,"unpackedSize":7549,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG6NusYDzRcAF25WPIYRiaWqCqwEWPFfDe2xh5b0hAh+AiAq1kXJk0zvHkbcxmf0lCmPPus2ddfcicBwrAZBN4Xm5g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt/dJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrA7RAAl/3Fnzaz5lf/Q10OD3PuQY04MotLc7gGXpk5iifC0sZoJLBx\r\nDaHOtCFBHelNz//n2hTloz26JVZBirwI+vYMU6vImrgfkUrqtEWsMVo4rwWg\r\nt0yajO5faXkGSVf3QAUFFUAlr+lUN1TjXRmQnlp3d39SeakgMvpgNRSERVrF\r\nH/6dJpPjd73ot9W+n0iYn3r4Os8fVBF/l1Xl5k7Oiwb2gEShfyQkpRx2mAw1\r\npVE6GGCq83luAQw2Mlia1rHxS4PS/LsNbfRqv5jCdjP0hUg0Z+2MK3+AyNc5\r\nK4VTE8rqjvggJwEhxxE4Ek0JHc9PRZrFQkbJaffY2+j82Cxo3kfZu7Wu/KAw\r\nDBynT9ulW0LWsUiFLYFdFAFad7qycBMgSsRb5+XpOj4U8h3JmyKk04pPT33D\r\nEt8pSHlyTBh4KFOE+R3eHmsXlmLHR9iDpoyCm55kY65jfy1a0oU5hvHo4xpw\r\nUM6dLutif5COgjbgEpF0Oqas+UKV5jPdv/4QJSeCCs4waIVOjkwY5yS4rVBA\r\n8C/vc2Ko89I5khD3pAiFypTJ0oI5ct2vDAtO0/9hjLnlUS9/n/boZReyGPrk\r\nragVzMHCTZxSycc7yB1TkmzmR6M7sX82lrfK3z3+iONdiRSU2jEsVv0vV9kb\r\n0zyxlI7o+Qmi37kCw36ABiZ8dncKeNqnggc=\r\n=rJxC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.14_1673000777236_0.25793670891690446"},"_hasShrinkwrap":false},"1.0.15":{"name":"mosaic","type":"module","version":"1.0.15","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"node src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.15","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-eHe2KlNu05MLCae1P4tiij+F69oK2QvEqAsk1DsfnRFLOLcOpO294IPWtBHQTL2QxdTP8+dEjWXyiALfCBsOGA==","shasum":"964f5250454cf1a8e85c16ac1f58fb3d314bd7a8","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.15.tgz","fileCount":8,"unpackedSize":7666,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAbRA9DXPtDI273syCm8W+YLgU/Jkr+vM6co44OZWr9KAiEAr6UwiR5XumIEQEPry5srjOn/Ia6zYUnCfyXNWMWrgvs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt/kSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoh6Q//fbHHlAHMRDkfvvLXR6DswW8Fve2E2g5h2OPUQZij7zIyhJKt\r\nYVa89+mP29jyawBFnvsIf9l9NPEKEj+fsyzFA5lD8sRUrf8ySkfb2u99lWmX\r\nCVO93pA0QavE8Koro0Dsblrbm1TUkhdSJjqVprCdLgLgkeK1N9A06KBxFzz/\r\nfXF3a9Wbr9HBv0xRiSlR2LOvzylkQIfBjYYSLfIntpGuJcycARFmtkxI2I2Z\r\nmNuAlX57vYA2pEuMjHk2Uo2ty4y+5Lyyn8GdkgMZAjh/TZtP2CI8GjNUli4D\r\n9YMrPAgoAkYeUWJTlusq8en11TjtnW0ENCr77M8m49Vncw7vrLw5m571J24w\r\nJzcLbRNjNH2qMszD5jLHGgpw9ncTFmogxQTon1oYVjXKswErfZHP6vvTHSMS\r\n+ZOGo2FPymlxDYhGbfEGmNAr2YwApsIS0tGZ5xKqlgVmi009C2uFIpHrZv3B\r\nbHpBRQCA0gtjKjX5K8L3JWGsBP4BB6VZNzTjb6guZ5jdv45x5fIFiHanY+J5\r\nzLs7Mgjts/O4kGESuBIbxwVecDuP0b7TAyO98kjhRf8+/QI2Zg9wWPDZy+il\r\nKcxUboNev1XMrHBiq4Q+pYh4W0AkA+9XtxwVoFrW57f2LF3iqNCVkXu07QB0\r\nVY+KOErP8Y9nodGtBrNzpfYeBvA+HfhZdcQ=\r\n=NwhL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.15_1673001234117_0.3728105626119733"},"_hasShrinkwrap":false},"1.0.16":{"name":"mosaic","type":"module","version":"1.0.16","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"node src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.16","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-Eg8wbgotGPHSJdTamJSrE07LU1SU3xvPElPjrNF/E40wK6w9VzCrH9JQAEPITRUz0ukkbEYliZ4fqJoFHwVDJQ==","shasum":"001b69fa6cf0f86573d806a1acfd52453be8c999","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.16.tgz","fileCount":8,"unpackedSize":7687,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjUfHJ99S/vU9kTXozP6T0at63g/5WfF2d8Kudz3utdAIgYBYwDk78LM3ybfBHuaXaoQvLd/0Z2Rxdh2kQYidG7kc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt/y3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBgA//fD9p+XroV5JfySP+EiL4yIDfbReYwVgx+z0BPggVNWaF7GLk\r\nKuF+TGUEwgUCbZ2JaE4vsL9MrSYTSn+b3sdo6LOK5qE7jmmU2XdlTgnIKVwg\r\neebvnWNEviHYGTBa/LFjAvCXLnsckiuf/Gu//haxxC5xKet+j0GvI84kXgnp\r\n0Pa1/krusECKvzpA6uesL2ub8sMXVbPC/7WN7+qc2UsStbbPR0zNpsIBZZxX\r\nZTet83KMkJct5J3q3LJqdvqv1mqNZ8OlS/WEnq+wNRZtEEjnya4ZJuLhNnX5\r\nVZeW5gG5iXvqRjAaEVHjYLr29+n7uxQ6V3Wri9gB47cOTWm3FLwwueIHgKzo\r\ni/OK4ZUrkefalyFff60nETqqPgzbhUY09ri0LjAnMDD9o3Lo3K+/a02726O2\r\n0W6ZzF8ZkHSiO3B9PyLLE5FaK0UJU4nYVXxTEuoqJn0RbqC22m2mkGt8Vk5Q\r\nqYFNOPVrifuE35AHTjX38HZQXc5aaKl1mBt6uGuwRgvVnqrbUrHMuDUX8PW9\r\nZy83N0wEDO8Q+/kaWRIMBWIYdMV7gsxyMYjcvD5GYa6/G5B8Yycj+mSMJWTp\r\nW03YyZ/w2jf4O3MpwetM4zDoRrhID3VMTolo2DSAPAyB7PUKUCLV8onf/Fb5\r\nxiKAGwOZosSdoqND68IDEspQXA0SG/dXeEM=\r\n=DVLB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.16_1673002166912_0.020714096605671584"},"_hasShrinkwrap":false},"1.0.17":{"name":"mosaic","type":"module","version":"1.0.17","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"node src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.17","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-tHIb8ZwlcaSwrZug4alKSPfcKR3JSHT+nXOds3t9QlO3Y1U4q2hjj24QtMWpy04Grk2VtaTJzTzKc5WfPKc5oA==","shasum":"ef6c42cca93473465509b1f2e2d2f9d4cba936f4","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.17.tgz","fileCount":6,"unpackedSize":4203,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBShAaO/9k31ELzSDqcWx2iDL7lk4tmClnl36TBIQpUHAiEA/jhW3RCQnPaswn5erO7LYQHd0Mbz2U/QQeUE0RhTvEs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt/7SACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9oA//R91xUkXHle+sJPvLLhdD8rv95JPkv+43t44SkSLiiPdTa8we\r\nN6/+GI4HMiE+DtrHw5pxxM7FcCaEp7vuQwJErRa7MIzbG0Fzpw5oUxeeRog5\r\nnXhldd8jY8QDyY1rB2QJVhqY0Qv6lSKtqap7Y4IMvJMuNVyZIcLw2NMh8e85\r\n2dqpOabqNW/WY7vqyT8ORFMH+SV62fQCqz1JbfpvkTcqo8lUaBUJ/+cKZJ2a\r\nJvvgZRWpJWpWwFXC6GJXWqVCS+cX/zSpc/0oQmq4UfEJBIIjKnjXutRKEkCQ\r\nOcA2kpSykFwMvY1L7vUCxMJq9Ywh+UmzfX6xDKx/+ipNp30iDTAOgsLfjESw\r\nrkByugU60dRB8RkpWLoxMli4uesb9OyAIiKlgxqrwGQAzpaFHJAiXLtrUOWp\r\nX/X5xIQCLFNF14+7j4VV3cqYjNSSf2eJv+GfNHRGCylE2Qc0QdWRJ6OaHU47\r\n9ho5717nQeqiVpUqPwXjp5tmBNQ+V2a/vX0v/QZPeaIyZB8F9RfAfG/OFby7\r\nBJ18eabnqOT1TLqWkHnHxU8EovHu1y1fl6OsdA5fhYVpewbfPrnkv38fsPHW\r\n3eoxQCZ0zEA2Ne6CBMmw33OPZZzE/guPxVCsJpIxZs/qksQxW5TziSdyG9gB\r\n1cVcjHWzQaZqDmO/Lbio9TeVxDN16+5kJAQ=\r\n=U2DB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.17_1673002706009_0.4301797210178282"},"_hasShrinkwrap":false},"1.0.18":{"name":"mosaic","type":"module","version":"1.0.18","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.18","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-3IEmf9i6gS1U8f4XZfhxi0AFWQkI8ZbHRg2BKFrRJbFE5TwC2kiSH0GQB/cpcwJSsoFxSOVX04i5oBRZ4j60Cw==","shasum":"e7bc71a73d1ff7b4b3a5d6816e0772676ae4bb00","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.18.tgz","fileCount":6,"unpackedSize":4200,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICsJOOCGgwk34111CBNbNGVql6TQDcHBsEsFs0vezXJwAiAlgr/4J6vAQuXe0g2a8anzjxRKrwwPu2OxDJaIMdVXog=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt/+LACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqAAw//basPCuQE8vbDeLCpQeBDE7EBmteLegrxF/qmeQwtVIFjdnfU\r\ncXti928MrZEVkiO9yviVil1pHNrSkqYJ4YoQHdGe2dUA0w3ecj/fGCFL73Tf\r\nlxPexBbNosY/3n4BcE4D05HUzAwBqGyfxsGPA1CgeTofI1cnBcM5cvNwhwOB\r\no509oV+hK2R6rJNpXiTS/heMki5a6xCMl4n8T0kfHqz5R10iNB/m8TW6MOqO\r\npfG61K4gPXOAa9OZ3lHtWYfnlpLmGLDhqM8efVCB2Fo8EwIGAFOqShNiWIjb\r\nFPZRjV+GKBGeo4u7chHYb5139W8IJYXiu+SukRxRtPyJmr7z2+T56YkpNPIR\r\nfyv/vUBdXE0eJWeujAioH3SNW04nRQtQmTuN2bjz2eUQimexIGQ9zTJk0KyE\r\nOnhbxwtxFDsuJ2uEkqf6t8+uRW6NYOF7mZmtNWu7p2pZQjnxvgCK8VAhEOwQ\r\nFnaliuTG7M4fHejtTPpw3cF2UaRkajCEu0bUXvxzM0S45oFjIlhBySp8xsSS\r\nDMXhcd1f6RCNWncpWVKbYDhW1LTDAVnV0WBenkHQ4fyonIryOMrP5KCNBqxn\r\n1sSYdFDFZ8zICDoqN5V8fkMQU5aMLED+uaeKcpGDpU/WWjF0MnpIW1l9EuoA\r\nC2UCH9hsOsEtPtWiWh26H/sJH6GIRPzZ49w=\r\n=eUEz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.18_1673002891250_0.9815658394963525"},"_hasShrinkwrap":false},"1.0.19":{"name":"mosaic","type":"module","version":"1.0.19","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.1","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.19","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-VqD+ywdntqBJ2Xq2i1stiuimogCqqKFHxpUsrVf+qfN6bwa2IewFMuLTHmxPOWqD+43XnAzB2aAjVQrFxP9IKQ==","shasum":"f4f5eb4530bb2d0e011a7c9af7463cbe2dec6827","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.19.tgz","fileCount":6,"unpackedSize":4607,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAdx28qPMMwnmz6TDN6RDih8nLne/6vH+PK/s83+eUZdAiEAo8AT6BufqhxBx/sFfL0VB3O78EaYZrzAG22xhRsP/Vk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuAAMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoMeQ/5AabdXnchXh1NMAWPbH4LpEvdUA/cseXu/kD2GKzhfGKIWZYI\r\nMF/IVIgbzwyCeAWbkLvr6kLN4fcdXt7lJTXcCdE5P3OpEHWS4A6I1uqlR3h3\r\nEHia/Gj/WUlmpEX3w2o2rLaqr9QHMThlKgwU/g4t8/9v8ZE5Nz7PFdRWU3LD\r\nRPOtHA8zhPO3IJCf95hD7SXUk2wPzMooN7g5tdAjaGJDCaXzm/x3hHeY8O5f\r\n5XQXkBmFbykJHeZrweccWcRYremsUSXKqtDP12QoNkBXqNClsUL/eww8KJzx\r\ngCqswW8B+Mzmadi+bYdDlPf+uizlExghGt4CyxqkRrO1Vi/YS04KVlYf5iA3\r\nkKhRAKygonqN3PbpusCsMAJLU7HQFOCFgJjmlrklyUR5AK42nlKsYSrpExCf\r\n9H/uvqBxiDZtOjRSDWeERLQYFbXwG6Ciz/04abc65hKRuZibMs4CpTrChzbn\r\n1/LiYZYW9XFVYdWPPjSwSuBteNYw18DXfpFQKh9qqEWrbr1q58znY4ue+wvz\r\nY//Go+E1q0gwNt3wWDiIsrTx/cnOu26LSicjqhjRgFWRdBSv1t/lBEbKPYhb\r\n0t04WXw1dQUI8sBScGIKPq+b9nmUlAD4mNhLcFTWCCspBljzmN7ch/Pcq/E6\r\nD7AnRJZtcXW6jHtpJyjGsdaQvo8T4rXKgYs=\r\n=QYb+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.19_1673003020429_0.18852202428911546"},"_hasShrinkwrap":false},"1.0.20":{"name":"mosaic","type":"module","version":"1.0.20","description":"🚧 This library is currently under construction and not ready for public use 🚧","main":"src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":[],"author":{"name":"defx"},"license":"MIT","dependencies":{"customelementincludes":"^1.0.2","express":"^4.18.2","fs-extra":"^11.1.0","globby":"^13.1.3","highlight.js":"^11.7.0","markdown-it":"^13.0.1","nodemon":"^2.0.20"},"bin":{"mosaic":"src/index.js"},"gitHead":"9929dcb28c87f5a4b39a95aeee2f7f31dc9e09cb","_id":"mosaic@1.0.20","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-jCNcRccoxsN6hCSGOv6gcyhexK1U/UKVK+ksie7bj5Z5O8kSEOED4LmFBr+t19UQYAD0nGZl73owhVv/oDNzFw==","shasum":"8ad38040126c17899f12f02c61e89662203a5afe","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.0.20.tgz","fileCount":6,"unpackedSize":4607,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOOIXtOf2dZCMuwkRN8RIyK0k+VesFgiN6+8MpAst+JAIgFjci1jg0qGS0wB2Gn5zen7iu2XdTn6etuW4nUYJHeoE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuADuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq5bw//fPyBEm6WC5iVBe/gnYG+SvRCJxJfj5oRoKwWn8y/WrIvRR99\r\nQS7+CmoD+Xo8zbnf8IBzwQ909qw4lOIygcvfcRShOywI9yhUc9xJ782vSrLo\r\nLoNTHEiXdVp91M3FLosaofnMl8/d0Hg/+SXj2+wxuLJSfOAARwDWUgORhGnq\r\neCMZ8po7mldSsh78McfGUU9XDH2trSDK+sJklr1S99V6Zlnnp3kodUgqXKPx\r\nrNX+QABnS8+lXw9hmGYKH/qmCMjMzXB11czMN0CUeWCocRsscI6cKpXC/Svm\r\nDPPs0Zu5ePw++sNYvSC//HVXk1tylnliSULivQDuVzHuan80JSb7vLXSpWoz\r\nhax6ScspVp/pm3VWCjngJZWvVzY3nrE0tBNMAjWye4r4+PiEEUlOqZvOxSz0\r\n5WMwkXXmkVJOQDwVJyQ3UwUIBlv6eSY2gscwCGniO2e8snLT0Wrpgmpt11fz\r\nAVkHzjLvObyZWiFL+dJkPHOvNEbpVXo/06dRagZ6Zg4rMQmdXGhY65EP0+28\r\nLG9glXFobGu/F0h58JwvYgXhF0X4BD1dLLGQhTTG9VVi/YQ+XvQQ4yfrei5X\r\ng32ak88lM4oPU3FTZxXV0H/lPTmQ1LEHj1HnPWa3f7QuKLdX3hdHR5Qu0z7k\r\nx69h57kTWzXEpClDud/8rRZhm/Td/zWaDnk=\r\n=nrVx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"directories":{},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.0.20_1673003246630_0.5990037446971599"},"_hasShrinkwrap":false},"1.1.0":{"name":"mosaic","type":"module","version":"1.1.0","description":"A JavaScript library for progressive enhancing HTML","main":"dist/mosaic.min.js","browser":"dist/mosaic.min.js","unpkg":"dist/mosaic.min.js","module":"src/index.js","scripts":{"test":"mocha-express --coverage","test:watch":"mocha-express --watch","size":"gzip -c9 ./dist/mosaic.min.js | wc -c","build":"rm -rf dist && rollup -c && npm run size","prepublish":"npm run build"},"keywords":[],"author":"","license":"MIT","directories":{"test":"test"},"devDependencies":{"mocha-express":"^0.1.2","rollup":"^2.79.1","rollup-plugin-terser":"^7.0.2"},"gitHead":"fb9667eb8019bbd390565fc529c8170dbe7e1aa3","_id":"mosaic@1.1.0","_nodeVersion":"16.14.2","_npmVersion":"9.6.6","dist":{"integrity":"sha512-4NPMyHQMAOfqr83aBhq/XpKXWgICeB1LzA3qHTYGr+GNw3chigB4yzHb137984TdlXhYgvx9X/2RRKM0bUM9XA==","shasum":"74af16ee51d13ea5fbc342efde80f50c1c138307","tarball":"https://registry.npmjs.org/mosaic/-/mosaic-1.1.0.tgz","fileCount":19,"unpackedSize":38397,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDC/ckSxXXsll6mIm78ykz4lrmms2MbkX84R0wFu2F//QIhAOfBgUUddTs+y0ocikfIGB0buy3NLfH83NegGyuoucUh"}]},"_npmUser":{"name":"defx","email":"mdonkin83@gmail.com"},"maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mosaic_1.1.0_1687266971228_0.2790538517941352"},"_hasShrinkwrap":false}},"readme":"# Mosaic\n\n## Codify UI behaviour with declarative configuration\n\n🚧 Please kindly note that this project is a work in progress 🚧\n\n[![npm](https://shields.io/npm/v/mosaic)](https://www.npmjs.com/package/mosaic)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/mosaic/dist/mosaic.min.js?compression=gzip&label=gzip)](https://unpkg.com/mosaic/dist/mosaic.min.js)\n\nMosaic's declarative configuration enables common UI behaviours to be reused effectively between different projects, ensuring a high level of performance and accessibility, whilst allowing developers to concentrate on the things that are particular to their specific business and project requirements: the markup and styles.\n\n## Example\n\nThe following configuration implements the Accordion pattern:\n\n```js\nlet counter = 0\n\nexport const Accordion = () => {\n  const id = counter++\n  return {\n    state: {\n      openPanel: 0,\n    },\n    action: {\n      togglePanel: (state, { index }) => ({\n        ...state,\n        openPanel: state.openPanel === index ? -1 : index,\n      }),\n    },\n    elements: [\n      {\n        select: \"button[accordion-toggle]\",\n        attribute: (state, i) => ({\n          id: `trigger_${id}_${i}`,\n          ariaControls: `panel_${id}_${i}`,\n          ariaExpanded: state.openPanel === i,\n        }),\n        on: {\n          click: \"togglePanel\",\n        },\n      },\n      {\n        select: \"[accordion-panel]\",\n        attribute: (state, i) => ({\n          id: `panel_${id}_${i}`,\n          ariaLabelledby: `trigger_${id}_${i}`,\n          hidden: state.openPanel !== i,\n        }),\n      },\n    ],\n  }\n}\n```\n\n## Install\n\n### cdn\n\n```js\nimport { define } from \"https://unpkg.com/mosaic\"\n```\n\n### npm\n\n```sh\n> npm i mosaic\n```\n\n## Usage\n","maintainers":[{"name":"defx","email":"mdonkin83@gmail.com"}],"time":{"modified":"2023-06-20T13:16:11.469Z","created":"2013-07-10T05:06:08.699Z","0.1.0":"2013-07-10T05:06:18.276Z","0.1.2":"2013-07-10T08:13:38.004Z","0.1.3":"2013-07-10T09:58:58.592Z","0.1.4":"2013-07-15T11:50:29.484Z","0.1.5":"2013-07-19T08:14:04.631Z","0.1.6":"2013-07-22T07:17:14.863Z","0.1.7":"2013-07-23T01:51:47.274Z","0.1.8":"2013-07-23T02:57:28.579Z","0.1.9":"2013-07-23T03:34:25.728Z","0.1.10":"2013-07-25T08:20:42.201Z","0.1.11":"2013-08-07T09:47:08.818Z","0.1.12":"2013-08-15T03:27:53.019Z","0.1.13":"2013-08-15T12:32:22.849Z","0.1.14":"2013-08-16T02:20:26.708Z","0.2.0":"2013-08-16T03:02:32.167Z","0.2.1":"2013-08-16T05:04:02.951Z","0.2.2":"2013-08-21T07:01:50.782Z","0.3.0":"2013-09-26T12:14:25.670Z","0.3.1":"2013-09-27T01:33:33.665Z","0.3.2":"2013-12-17T11:19:13.434Z","0.3.3":"2014-01-03T03:14:40.573Z","1.0.0":"2020-12-04T08:45:09.947Z","1.0.1":"2021-03-03T14:39:45.361Z","1.0.2":"2021-03-03T17:50:16.227Z","1.0.3":"2021-03-03T20:09:47.581Z","1.0.4":"2022-03-31T12:03:01.965Z","1.0.5":"2022-03-31T13:39:44.732Z","1.0.6":"2022-04-01T10:42:20.842Z","1.0.7":"2022-04-01T11:59:30.569Z","1.0.8":"2022-04-01T15:15:06.247Z","1.0.9":"2022-04-11T16:18:36.872Z","1.0.10":"2022-04-11T17:45:49.827Z","1.0.11":"2022-06-30T20:16:51.427Z","1.0.12":"2022-06-30T20:27:08.175Z","1.0.13":"2023-01-06T10:23:06.875Z","1.0.14":"2023-01-06T10:26:17.429Z","1.0.15":"2023-01-06T10:33:54.278Z","1.0.16":"2023-01-06T10:49:27.062Z","1.0.17":"2023-01-06T10:58:26.187Z","1.0.18":"2023-01-06T11:01:31.401Z","1.0.19":"2023-01-06T11:03:40.547Z","1.0.20":"2023-01-06T11:07:26.814Z","1.1.0":"2023-06-20T13:16:11.370Z"},"keywords":[],"license":"MIT","readmeFilename":"README.md"}