{"_id":"@fly/fly","_rev":"324-f58184ead0f7804014769c50b484865c","name":"@fly/fly","time":{"modified":"2023-01-29T18:32:49.883Z","created":"2018-01-22T18:50:31.738Z","0.4.0":"2018-01-22T18:50:31.738Z","0.4.1":"2018-01-22T21:50:47.531Z","0.4.2":"2018-01-23T20:19:10.662Z","0.4.3":"2018-01-24T14:58:50.322Z","0.4.4":"2018-01-24T17:01:47.552Z","0.5.0":"2018-01-25T15:12:22.441Z","0.5.2":"2018-01-25T21:27:57.507Z","0.5.3":"2018-01-25T21:53:18.097Z","0.5.4":"2018-01-25T22:04:06.193Z","0.5.5":"2018-01-25T22:49:45.641Z","0.5.6":"2018-01-26T02:00:24.513Z","0.5.7":"2018-01-26T13:51:17.230Z","0.5.8":"2018-01-26T16:15:40.445Z","0.5.9-0":"2018-01-27T15:36:40.626Z","0.6.0":"2018-01-28T20:58:32.112Z","0.6.1":"2018-01-30T15:15:48.215Z","0.6.2":"2018-01-30T20:26:50.140Z","0.7.0":"2018-01-30T23:35:24.963Z","0.7.1":"2018-01-31T17:02:57.462Z","0.8.0":"2018-01-31T17:13:49.592Z","0.8.1":"2018-01-31T20:29:48.100Z","0.9.0":"2018-01-31T22:18:14.310Z","0.9.1":"2018-02-01T01:27:11.985Z","0.9.2":"2018-02-01T14:55:34.314Z","0.9.3":"2018-02-01T17:19:21.860Z","0.10.0":"2018-02-02T00:10:53.328Z","0.10.1":"2018-02-02T14:58:08.865Z","0.10.2":"2018-02-02T18:26:04.793Z","0.11.0":"2018-02-03T17:55:07.182Z","0.12.0":"2018-02-03T20:16:13.473Z","0.13.0":"2018-02-03T22:40:30.034Z","0.14.0":"2018-02-04T23:45:55.465Z","0.14.2":"2018-02-05T18:48:11.268Z","0.14.3":"2018-02-06T15:37:04.088Z","0.14.4":"2018-02-06T18:40:50.072Z","0.15.0-0":"2018-02-07T16:01:33.147Z","0.14.5":"2018-02-07T16:13:14.973Z","0.15.0-1":"2018-02-07T17:24:43.305Z","0.15.0-2":"2018-02-07T21:12:30.895Z","0.15.0":"2018-02-08T00:08:15.943Z","0.15.2":"2018-02-08T20:53:45.826Z","0.16.0":"2018-02-09T00:14:35.772Z","0.16.1":"2018-02-09T22:39:13.020Z","0.16.2":"2018-02-13T21:44:17.992Z","0.16.3":"2018-02-14T18:00:38.773Z","0.16.4":"2018-02-14T18:18:46.760Z","0.16.5":"2018-02-14T21:52:51.186Z","0.16.6":"2018-02-14T22:36:39.876Z","0.16.7-0":"2018-02-16T18:04:18.347Z","0.16.7-1":"2018-02-16T19:10:46.016Z","0.16.7-2":"2018-02-16T19:12:41.452Z","0.16.7-3":"2018-02-16T19:46:22.202Z","0.16.7-4":"2018-02-16T21:05:39.893Z","0.16.7-5":"2018-02-20T19:35:00.803Z","0.16.7-6":"2018-02-20T21:17:02.749Z","0.17.0-0":"2018-02-21T21:19:49.057Z","0.17.0-1":"2018-02-22T01:58:55.210Z","0.17.0-2":"2018-02-22T02:21:00.516Z","0.17.0-3":"2018-02-22T14:39:25.299Z","0.17.0-4":"2018-02-22T20:45:59.311Z","0.17.0":"2018-02-23T12:56:02.698Z","0.17.1":"2018-02-24T12:39:53.643Z","0.18.0-0":"2018-02-24T13:02:08.948Z","0.18.0-1":"2018-02-24T15:56:50.669Z","0.18.0":"2018-02-25T18:29:53.704Z","0.18.1":"2018-02-25T19:08:34.312Z","0.19.0":"2018-02-27T14:54:00.523Z","0.19.1":"2018-02-27T19:46:15.353Z","0.19.2":"2018-02-27T20:27:04.839Z","0.19.3-0":"2018-02-28T17:05:25.560Z","0.19.3-1":"2018-02-28T17:15:02.708Z","0.19.3-2":"2018-02-28T17:18:36.939Z","0.20.0":"2018-02-28T18:55:41.761Z","0.20.1":"2018-02-28T20:58:27.977Z","0.20.2":"2018-02-28T23:14:47.885Z","0.21.0":"2018-03-03T13:24:48.995Z","0.22.0-0":"2018-03-04T20:07:10.806Z","0.22.0":"2018-03-04T20:56:27.620Z","0.23.0":"2018-03-08T14:40:28.390Z","0.24.0-0":"2018-03-08T18:57:43.328Z","0.24.0":"2018-03-08T20:21:23.360Z","0.24.1":"2018-03-08T21:47:40.956Z","0.25.0":"2018-03-13T16:29:36.536Z","0.26.1":"2018-03-15T15:19:59.711Z","0.26.2":"2018-03-16T15:44:40.118Z","0.24.2":"2018-03-17T00:07:28.085Z","0.26.3-0":"2018-03-17T20:55:45.513Z","0.26.3":"2018-03-19T11:28:27.355Z","0.26.4-0":"2018-03-19T21:43:00.193Z","0.26.4-1":"2018-03-20T16:38:04.274Z","0.26.4":"2018-03-20T20:41:46.416Z","0.26.5-0":"2018-03-21T14:36:10.048Z","0.27.0-0":"2018-03-21T21:03:17.909Z","0.26.5":"2018-03-22T16:30:37.858Z","0.26.6":"2018-03-23T11:25:06.454Z","0.27.0-1":"2018-03-26T14:09:43.778Z","0.27.0-2":"2018-03-27T18:06:13.587Z","0.27.0-3":"2018-03-28T16:29:41.932Z","0.27.0-4":"2018-03-30T14:00:45.998Z","0.27.0-5":"2018-03-30T14:07:07.148Z","0.27.0-6":"2018-03-30T14:31:23.022Z","0.27.0-7":"2018-03-30T15:20:20.597Z","0.26.7-0":"2018-03-31T21:46:25.882Z","0.27.0-8":"2018-04-02T03:24:44.843Z","0.26.7-fix-hangups.0":"2018-04-02T18:45:16.958Z","0.26.7-fix-hangups.2":"2018-04-03T13:07:55.505Z","0.27.0-9":"2018-04-03T14:31:50.960Z","0.27.0-10":"2018-04-03T18:06:23.680Z","0.27.0-11":"2018-04-04T13:00:33.775Z","0.27.0-12":"2018-04-04T14:34:10.924Z","0.27.0-13":"2018-04-05T01:06:21.358Z","0.27.0":"2018-04-05T18:23:23.208Z","0.27.1":"2018-04-06T00:31:33.405Z","0.27.2":"2018-04-06T15:00:36.950Z","0.28.0":"2018-04-09T13:14:28.582Z","0.28.1":"2018-04-10T13:18:08.522Z","0.28.2":"2018-04-12T13:59:25.422Z","0.28.3":"2018-04-12T22:44:26.646Z","0.28.4":"2018-04-13T18:58:29.717Z","0.29.0-1":"2018-04-20T13:43:05.770Z","0.29.0-2":"2018-04-20T16:19:27.801Z","0.29.0-3":"2018-04-20T17:34:12.350Z","0.29.0-4":"2018-04-20T19:01:03.920Z","0.29.0-5":"2018-04-21T03:22:09.754Z","0.29.0":"2018-04-30T21:07:24.316Z","0.29.1":"2018-05-01T15:06:30.263Z","0.29.2":"2018-05-01T18:15:04.246Z","0.30.0-0":"2018-05-04T17:52:48.247Z","0.30.0":"2018-05-04T18:09:30.417Z","0.31.0":"2018-05-09T18:19:07.410Z","0.32.0":"2018-05-21T14:21:39.063Z","0.33.0":"2018-05-24T19:36:41.712Z","0.33.1-0":"2018-05-24T19:41:32.566Z","0.33.1-1":"2018-05-24T19:53:30.397Z","0.33.1":"2018-05-24T19:58:54.067Z","0.33.2":"2018-06-05T04:00:03.898Z","0.33.3-0":"2018-06-07T19:14:49.866Z","0.33.3-1":"2018-06-08T02:15:05.798Z","0.33.3":"2018-06-09T14:52:37.697Z","0.33.4":"2018-06-13T19:38:26.159Z","0.34.0-0":"2018-06-15T20:12:20.404Z","0.34.0-1":"2018-06-27T16:26:14.090Z","0.34.0-2":"2018-06-27T16:54:42.061Z","0.34.0-3":"2018-06-29T12:10:53.730Z","0.34.0-4":"2018-06-29T13:12:32.353Z","0.34.0-5":"2018-06-29T17:22:38.376Z","0.34.0":"2018-07-02T12:51:36.597Z","0.35.0":"2018-07-03T17:06:18.119Z","0.36.0-0":"2018-07-07T16:19:33.610Z","0.35.1-0":"2018-07-08T15:55:23.868Z","0.36.0":"2018-07-09T15:06:45.637Z","0.36.1":"2018-07-09T18:31:30.160Z","0.36.2":"2018-07-09T22:01:02.264Z","0.37.0-0":"2018-07-09T23:38:54.257Z","0.37.0-1":"2018-07-10T15:51:10.207Z","0.37.0-2":"2018-07-10T16:19:30.919Z","0.37.0-3":"2018-07-10T17:26:50.546Z","0.36.3-streams-self-clean.0":"2018-07-11T01:40:26.110Z","0.36.3-streams-self-clean.1":"2018-07-11T02:02:35.937Z","0.36.3-streams-self-clean.2":"2018-07-11T02:07:33.379Z","0.36.3-streams-self-clean.3":"2018-07-11T02:12:08.522Z","0.36.3-streams-self-clean.4":"2018-07-11T02:18:07.445Z","0.36.3-streams-self-clean.5":"2018-07-11T14:33:47.176Z","0.36.3-streams-self-clean.6":"2018-07-11T14:36:00.036Z","0.37.0":"2018-07-11T18:49:44.504Z","0.37.1-0":"2018-07-12T19:50:08.668Z","0.37.1-1":"2018-07-13T16:34:22.482Z","0.38.0-0":"2018-07-19T03:23:11.765Z","0.38.0":"2018-07-20T15:55:04.441Z","0.38.1":"2018-07-20T16:34:06.276Z","0.39.0-0":"2018-08-03T21:20:51.033Z","0.39.0":"2018-08-16T20:41:58.757Z","0.40.0-caching.0":"2018-08-18T14:22:15.850Z","0.40.0-caching.1":"2018-08-18T17:24:38.572Z","0.40.0-caching.2":"2018-08-18T22:13:51.773Z","0.40.0-caching.3":"2018-08-22T00:39:16.943Z","0.40.0-caching.4":"2018-08-22T13:23:53.017Z","0.40.0-caching.5":"2018-08-22T13:56:52.641Z","0.40.0-caching.6":"2018-08-22T14:26:46.006Z","0.40.0-caching.7":"2018-08-22T15:21:12.782Z","0.40.0-caching.9":"2018-08-27T16:43:12.836Z","0.40.0-caching.10":"2018-08-27T22:14:05.194Z","0.40.0-caching.11":"2018-08-27T23:02:56.392Z","0.40.0-caching.12":"2018-08-28T14:22:07.744Z","0.40.0-caching.13":"2018-08-28T18:51:36.269Z","0.40.0":"2018-08-28T20:48:19.051Z","0.40.1-0":"2018-08-31T19:19:57.688Z","0.41.0":"2018-09-11T19:36:36.089Z","0.42.0-pre.1":"2018-09-11T21:06:12.356Z","0.42.0-pre.2":"2018-09-11T21:14:03.199Z","0.42.0-pre.3":"2018-09-11T21:28:02.931Z","0.42.0-pre.4":"2018-09-12T20:15:39.865Z","0.42.0-pre.6":"2018-09-12T20:41:42.696Z","0.42.0-pre.7":"2018-09-12T20:48:08.677Z","0.42.0-pre.8":"2018-09-12T21:32:34.404Z","0.42.0-pre.9":"2018-09-19T15:34:49.498Z","0.42.0":"2018-09-19T15:45:45.050Z","0.42.1-pre.0":"2018-09-19T22:35:37.867Z","0.42.2-pre.0":"2018-09-20T16:39:17.574Z","0.42.2":"2018-09-20T16:48:44.095Z","0.42.4-pre.0":"2018-10-23T16:32:01.389Z","0.43.1":"2018-10-23T16:37:40.551Z","0.42.4-pre.1":"2018-10-23T17:03:01.625Z","0.44.0-pre.1":"2018-10-30T15:07:37.457Z","0.44.0":"2018-10-30T16:01:42.988Z","0.44.1":"2018-11-02T15:32:14.050Z","0.44.2":"2018-11-06T00:56:16.005Z","0.44.4":"2018-12-13T22:42:12.780Z","0.44.5":"2018-12-14T19:32:39.814Z","0.44.6":"2018-12-15T14:38:18.697Z","0.44.7":"2018-12-16T18:10:24.566Z","0.44.8":"2018-12-17T16:36:01.348Z","0.44.9-pre.0":"2018-12-19T15:37:48.703Z","0.44.9-pre.1":"2018-12-20T23:22:38.522Z","0.44.9-pre.2":"2018-12-21T00:35:28.603Z","0.44.9":"2019-01-16T22:16:24.723Z","0.44.10-pre.0":"2019-02-05T15:08:10.829Z","0.44.10-pre.1":"2019-02-05T23:09:01.528Z","0.44.10-pre.2":"2019-02-05T23:18:25.023Z","0.44.10-pre.4":"2019-02-06T13:49:33.762Z","0.44.10-pre.5":"2019-02-06T15:27:01.729Z","0.44.10-pre.6":"2019-02-06T15:42:39.883Z","0.44.10-pre.7":"2019-02-06T16:01:35.988Z","0.44.10-pre.8":"2019-02-07T20:37:04.533Z","0.44.10-pre.9":"2019-02-07T21:46:56.147Z","0.44.10-pre.10":"2019-02-11T17:06:24.709Z","0.44.10-pre.11":"2019-02-24T18:31:23.479Z","0.45.0-pre.0":"2019-02-26T20:31:18.019Z","0.45.0":"2019-02-26T22:56:42.744Z","0.44.10-pre.12":"2019-02-28T21:16:48.136Z","0.45.1":"2019-03-04T16:46:18.581Z","0.45.2":"2019-03-04T17:20:47.508Z","0.46.0-pre.0":"2019-03-07T18:10:29.924Z","0.46.0":"2019-03-07T21:48:20.336Z","0.46.1-pre.0":"2019-03-11T17:38:04.154Z","0.46.1":"2019-03-11T19:47:19.986Z","0.47.1":"2019-03-13T18:53:44.329Z","0.48.0-pre.0":"2019-03-22T21:48:11.734Z","0.48.0-pre.1":"2019-03-22T22:12:43.248Z","0.48.0-pre.2":"2019-03-29T18:27:12.938Z","0.48.0-pre.4":"2019-04-01T20:51:11.648Z","0.48.0":"2019-04-02T19:10:32.069Z","0.48.2":"2019-04-02T21:03:03.817Z","0.49.0-pre.0":"2019-04-04T20:25:15.919Z","0.49.0-pre.1":"2019-04-04T20:33:39.210Z","0.49.0":"2019-04-04T21:05:03.771Z","0.49.1":"2019-04-04T21:31:48.225Z","0.49.2":"2019-04-09T19:29:24.749Z","0.50.0":"2019-04-10T15:08:52.612Z","0.50.1-pre.0":"2019-04-11T21:10:48.934Z","0.50.2-pre.2":"2019-04-12T00:02:11.824Z","0.51.0":"2019-04-12T18:39:17.238Z","0.51.1":"2019-04-12T20:23:44.398Z","0.51.2":"2019-04-18T20:53:53.406Z","0.52.0-pre.0":"2019-04-19T21:25:50.676Z","0.52.0-pre.1":"2019-04-22T17:04:57.342Z","0.52.0":"2019-04-22T20:16:15.506Z","0.52.1-pre.0":"2019-05-06T21:09:12.431Z","0.53.0-pre.0":"2019-05-07T16:47:56.189Z","0.53.0-pre.1":"2019-05-10T16:01:44.810Z","0.53.0-pre.2":"2019-05-10T20:29:00.484Z","0.53.0":"2019-05-15T16:37:14.487Z","0.53.1-pre.0":"2019-05-16T14:02:30.986Z","0.53.1":"2019-05-16T14:23:38.672Z","0.54.0-pre.0":"2019-05-16T21:22:45.352Z","0.54.0-pre.1":"2019-05-21T19:14:53.120Z","0.54.0":"2019-05-21T19:48:59.511Z","0.54.1-api-v2.0":"2019-06-26T22:22:06.337Z","0.54.1-pre.0":"2019-07-22T23:38:46.725Z","0.54.1":"2019-07-25T15:15:10.801Z","0.54.2":"2019-07-25T15:15:39.314Z","0.54.3":"2019-09-30T15:00:13.502Z","0.54.4":"2019-10-15T17:38:00.085Z","0.54.5":"2019-11-13T15:28:42.707Z","0.55.0-pre.0":"2019-11-21T20:56:21.536Z","0.55.0-pre.1":"2020-02-10T17:11:51.384Z","0.55.0":"2020-04-14T20:54:36.949Z","0.55.1":"2020-04-15T18:02:48.563Z","0.55.2":"2020-04-15T20:06:53.083Z","0.55.3":"2020-06-12T01:34:25.293Z","0.55.4":"2020-06-30T22:03:16.107Z","0.55.7":"2020-09-03T00:05:52.966Z","0.55.8-pre.0":"2020-09-03T17:26:57.291Z","0.55.8-pre.1":"2020-09-09T16:30:02.168Z","0.56.0":"2020-09-09T17:10:18.704Z","0.56.1":"2020-10-16T20:02:28.682Z","0.56.2":"2020-10-16T20:43:35.016Z"},"maintainers":[{"name":"jeromegn","email":"jeromegn@gmail.com"},{"name":"michaeldwan","email":"m@dwan.io"},{"name":"mrkurt","email":"mrkurt@gmail.com"}],"dist-tags":{"latest":"0.56.2","pre":"0.55.8-pre.1","api":"0.54.1-api-v2.0"},"versions":{"0.4.1":{"name":"@fly/fly","version":"0.4.1","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"ISC","devDependencies":{"@types/chai":"^4.0.8","@types/generic-pool":"^3.1.0","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","findhit-proxywrap":"^0.3.12","generic-pool":"^3.2.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^0.1.3","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"bf36d488f744a66e58f7cb11d12b5ba0eb38b0e7","_id":"@fly/fly@0.4.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-4bQjG3hwzrEKxmtZlY0VRJtcDBV0pCtAf9RX/mesd3Zo1Gv1pWrskXw4SlP0zDmSBTaJbClOA83Ow7qet6k4QA==","shasum":"cc9ace3da89955ab384e7f7abc5c7bb2780506de","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.4.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICb6KyA3pjxfz++18kiAiwT1fmP6zmL1BOcGewzKjOOnAiAl49YSi8aqHrZfH2jTS/sbLDrWI52iJ3eykAk0kBGBPw=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.4.1.tgz_1516657846324_0.10043822461739182"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.4.2":{"name":"@fly/fly","version":"0.4.2","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"ISC","devDependencies":{"@types/chai":"^4.0.8","@types/generic-pool":"^3.1.0","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","findhit-proxywrap":"^0.3.12","generic-pool":"^3.2.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^0.1.3","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"2efac2c099df6cf6caa35100cc0c79ebe184093b","_id":"@fly/fly@0.4.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-qxSnXrPSH2YDgw+KwmTnDP1I68haJTizmg+QVfw8nYQ7It1y98U/Zda0e0/LnLu1pNqZnKC+AuoZWfCXzawWIw==","shasum":"8fc1381a6159b24bc119cee500104be98048ad31","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.4.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB/AEyJdZ7gRDR8lnQSu2i0vNubaMQeVKHGepkmt1bYFAiEAoTW8FzUQJ6l/ozcdLMyc2gkx/+NfXoeVyw42PGiA+gw="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.4.2.tgz_1516738749499_0.3970588657539338"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.4.3":{"name":"@fly/fly","version":"0.4.3","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"ISC","devDependencies":{"@types/chai":"^4.0.8","@types/generic-pool":"^3.1.0","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","generic-pool":"^3.2.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^0.1.4","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"6edd6e80d37ddead16242efb9b1cf58b632194a2","_id":"@fly/fly@0.4.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-zP4lT6o+LOg6rY6hHnri8W72bW6Rtt1kV3vn7m+34sdzKXU55LiTkQXqW+K5H10N46ZDHKjKvVmAnRp9hxjOVg==","shasum":"32f0aa8988b45ef54c4e4ed41c0cbb273aa9e31d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.4.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIANbyuqbjY6/KVY7Xex3yTZb2WQViReIThOsUpOgauz9AiBKnofW/SlV+Wl4JjnQxMGWkJ9X87GPRCUia9AtdU/Tjg=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.4.3.tgz_1516805930238_0.9249298558570445"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.0":{"name":"@fly/fly","version":"0.5.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"ISC","devDependencies":{"@types/chai":"^4.0.8","@types/generic-pool":"^3.1.0","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","generic-pool":"^3.2.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"b3de2e5ffbb5bd7803c3d2f85822587b1fdcd4ad","_id":"@fly/fly@0.5.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Ujqoxf8PhrxYrE6bhJppgXIR3iPSc2HQ0eDRqdGDAXoH0DNN1Y9Erw3KC9DL0m7A0JovahwCs76xfDt6mhzONg==","shasum":"39c97a65ec56eace894708585649b2b7aaf4e74c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFB0eV3D4EyoxO1XiqAPkML2bF9FyPQa6dF5DX81L+TlAiEA4YFt7jG/PHb9qTefiERzapyyetUmmmYJrntHaQFwBvA="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.0.tgz_1516893140547_0.669408802408725"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.2":{"name":"@fly/fly","version":"0.5.2","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"567dfd7a921f53908ff84d1605d5f58321660229","_id":"@fly/fly@0.5.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-HM9fMERItZQClJKLPqfN4EnTGOdFNzVphkUPymBt4+uzBWLhyRpJAg5o9r9G/sA9eOhoEGcQumRgRr3qn4tQ4Q==","shasum":"a3d10295f3b403683573c49b51e4ac79d531846c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCk+G8ECpnSn/1ZzMugW/7LiysCcmHIDmeGprmHSqZ3/wIhAM/VdxF0uT6bpcI/JAPt+ApjnLPz06WYgN56ARgyWSla"}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.2.tgz_1516915677315_0.18969576084055007"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.3":{"name":"@fly/fly","version":"0.5.3","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"17d8a0d8fb5a5b09d4f0b9435fcd84e729c8cf29","_id":"@fly/fly@0.5.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-6ZvvfaT3lcQympY9xCJM0OBagzC832wOkBt2I6b4JtUlrMgo8gaRc+q5ZsWGI9+ptDKjSRWdSQC1+JaYySGsoA==","shasum":"098443ba14ac27f55ece3d42241fa4f0bdd03fcd","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAhzHDKvaKsyK62a51fInacWWfA4R2CETXJ4tMw3abzFAiBDNpTBgs0N+b+J65BXM7ZMiBJNkfcmDukp7p5LepU2UQ=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.3.tgz_1516917197076_0.08937086840160191"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.4":{"name":"@fly/fly","version":"0.5.4","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"483609125e00a9b2c9b710c3ea2a09bbbf13d247","_id":"@fly/fly@0.5.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-hZCGyAI/ec7jedQTNcu01UJD08ntdZSakQduXDhPC3syb1E2UTC+gCUTkDPsDYkivdsu0cA+OUjL1NyWx3BVyg==","shasum":"3da2f4b925895ea32b17205e1f78b5449d6b0fb2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICrRveNowKv661AUTl3gVfU08h8NlUNdWszoOac/I4YQAiEAp83Xrmq5oeCYE91X08zTM/0bSnt2nQCUeJdH2qaZ1k8="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.4.tgz_1516917846081_0.1422834440600127"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.5":{"name":"@fly/fly","version":"0.5.5","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"25d2ad20aeb1147e91f2b260b077d9bef7424bfc","_id":"@fly/fly@0.5.5","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Wa2EWJTqOrjEs2A3YDSXhttPafgXXoFeSjVIrhoqXInSuOWiW5khfQozUfXK/d1iCblDuTPj4PxvTdQa9katmQ==","shasum":"d8c637d140f00837575739ccce4a525e375da2bb","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH3sweODQcXZ8BRJ4bJwSeAukNrqPiBeE79hC9Tjh9ATAiEAqzoAzLbOL9QOwK2iHdwtzEOhEtcGoUM1B1RX3X+lUIg="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.5.tgz_1516920584525_0.2999144841451198"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.6":{"name":"@fly/fly","version":"0.5.6","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"46ca938850c321876ce16c09d845d8d195ff605f","_id":"@fly/fly@0.5.6","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-/7Bw4MHTgqVBH395M3Ud7G77Z4Nb+KiurINRDdkPYKcGi13fH9ITEXeKLQLIF7GxrTmeo1FRgT9lokohvpQI+A==","shasum":"514116a9077239a90ca856a7a18325e2162305e3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDV+Eq1zp1zjPNpozT+tCJ8zAJVzjIvSFTsyespZHh74wIhAJ8/vh41xtfE6MkvTwqy7uYkkfWcZHSX+qmppQHSOfIK"}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.6.tgz_1516932024443_0.11276365001685917"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.7":{"name":"@fly/fly","version":"0.5.7","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^0.1.5","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"24fd9cdac91c2a5deb671bce54e18a122796da01","_id":"@fly/fly@0.5.7","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-5DBBSrnZOLPb+cykBS01091lDuifLNKDUHYhFAHAhqkdNcgBRDRj7mPZed1KUQ3mJV/NAZEOJsIYYWZFu1LauQ==","shasum":"c6cc8f958562565edf338237a258bcb72aa1deb8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqjPLrCnlqsNhRkjqlGNSXRXVMMs0Dhu4FKZdwEYElsQIgR9aiP4KwaUSsi7PnjzIhkvJZCJPGBBlvaoroRYOi/nI="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.7.tgz_1516974676156_0.7192003922536969"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.8":{"name":"@fly/fly","version":"0.5.8","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^0.1.5","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"d4b7c855e082c9dfa61bf62992aa5e4af3f0ce83","_id":"@fly/fly@0.5.8","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-fCv5OycR5TdBN1z/RXtJ9iEMzKYpp86kliyDaXp4fR1PiIO0El3C87HVIYXcPsQnCn//QGRtknocAws7yBAiBA==","shasum":"8cf31b91646a9e8cd45874ba637ed030f3b16cf1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.8.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHOt+/1mBiX6DaH2bscY1adkkwhQ5PSotf1Cn5mzWWerAiEAtSgXFt3Idwv4M3lujVrijbztY+9qg1kewEI/wfXt6cM="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.8.tgz_1516983340331_0.5354894804768264"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.5.9-0":{"name":"@fly/fly","version":"0.5.9-0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"ce19a73ced62af6535e5d7c718d1597eed522a7c","_id":"@fly/fly@0.5.9-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-A/ydDFUTv9XYP41f4F8eHfY0AWIw+WrL3ZVq1G4lFk8anElBVqYmv7vEeF5oBTRXEKCcp80Xgb4biIhdDmPqtQ==","shasum":"f5cf8556e631cf8b30564b647b56ed1d65c131bc","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.5.9-0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEPiU8nCe2TrfU6xe6TPGgo9eanXQ+pfmRP99Ka68/EEAiBWtRC54dPp+e6rOEHPzlNBMp07comMssVO32TsmXjwSg=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.5.9-0.tgz_1517067400546_0.5052145589143038"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.6.0":{"name":"@fly/fly","version":"0.6.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"4798abd1214cfae63b65654682a2abb57f6297f1","_id":"@fly/fly@0.6.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-C61F7GCX5MrdfwePlUDKDRW7eSfngFV3HjQBN24iN5QiKwpK/Gn699cH8Cs38x3FdApkfVr2XGG9HnmwtsMVEw==","shasum":"a03a89c479725040fcecce69993837069981c9f8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.6.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCl4wgoGZu3XgzNlBGL89DyIsdyGMgNbDlTgkrIHMre1QIgCVzEMhyafhKODXY+Qch6WjfPKs7/2q6Vk5kTeQj5NPk="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.6.0.tgz_1517173110918_0.8007282421458513"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.6.1":{"name":"@fly/fly","version":"0.6.1","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"ec9c49312dbaf2dbe516d599b149ccb36178a123","_id":"@fly/fly@0.6.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-mI4YgcLRroMQqLPIPko0fgmenrAld1YmHwpoqw3OXJ39nBAV1SH6ejoAghUedPV4EMiWnfK+afkEG/sFbIc/tQ==","shasum":"9a54b1698bedb5932b423528d2df92a5e557e19a","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.6.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDanjPVrDHA1sq5In3DqZTW2HDZ9GM+TXgxrQrPhn619gIge/P543OVJcfNDjr3bgnHZ6n24q7ecH6H3j4BUjvifp0="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.6.1.tgz_1517325346820_0.0398219283670187"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.6.2":{"name":"@fly/fly","version":"0.6.2","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"a5e691ed6ea6a2188df45e0fb5b999dfcdbb3b5a","_id":"@fly/fly@0.6.2","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-glO8nkUTaIq2NtRa3g6pLk8Q0jSg2+mYSBQh37USxCTojEmToPMXI5S8ZL1KBd8kqlHwoTWydtAEFhiiSTBScA==","shasum":"aa573b19d51ed6d01d9b7b85cb25d16da9d124b3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.6.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICEyqkzwMOHd2f/FpiptxfxREkFdmnoVDE3MPbMjjrQZAiB0iJ069lbAh4SGEwbghStofN/2n22Q6wq2ZtuBBeNvGQ=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.6.2.tgz_1517344010009_0.011116005014628172"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.7.0":{"name":"@fly/fly","version":"0.7.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"c40b11289ef496ecac84092d99303282ce79d956","_id":"@fly/fly@0.7.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-TUmjClo5O9bra8KaQqHBkt2auBaVMFWB8BfS4D8+4C2f04V4LYgSoy97lVCS2F/9tAMREN5+56BMmluNYvunrw==","shasum":"24eb68b27a34929d00514911c05e8c9f5fcfad82","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.7.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICzwFdsoCgjrJV+jUx9WNpXhI+4n+cLIkNocFNkXJWUKAiEAhMwkZw1TPshmBzqiTcl+VztNqN4BbEjQDIUIwGzfjTM="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.7.0.tgz_1517355323716_0.9324008389376104"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.7.1":{"name":"@fly/fly","version":"0.7.1","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build:live":"npm run build -- -w","build":"tsc","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"bin/fly"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","commander":"^2.13.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"d39b8a462cf510ef99dac1b36f36d6872039f4ab","_id":"@fly/fly@0.7.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-KaFq+FpMJJ3g+gk1L6XtGi74gOGhY2ub66/TPk0dr112LgyDH5u6d+PvkvM7KxF3RJd/WSlflrEj9KGk8XE0ZQ==","shasum":"be6680c9952f022ffc94c24ea32cbdab063e2e28","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.7.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBhxEDGQpH+eRsNpS7vmxM9IbM1TYKkV/9o7XyHuT+FyAiEA0wflhKqR0SVW5PpoO8fV1h6sxVnzZ3fULh4A9Ompe10="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.7.1.tgz_1517418175576_0.30841960990801454"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.8.1":{"name":"@fly/fly","version":"0.8.1","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"def3fb1e623762d0aa6aa2c182769db970221add","_id":"@fly/fly@0.8.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-rl9aEa9iRB2fy6dcT6eOmYku2Ch3icdry1h8366nyoQRfX95pysQbTwVnjmxeX4xrFsuGEbsCcgpGlhonwZW7A==","shasum":"3091bfe12a23af85095df84fe70e5b242c3c9eb2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.8.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYGGjxDlalE85TBH5nZw/no3X4JaE3E1AHe2ovkkl0WAIgWMiRCqAgwsRug9FjZq9dL4X7fUDzBoSKAm0RSVWQuQ4="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.8.1.tgz_1517430586204_0.6826959550380707"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.9.0":{"name":"@fly/fly","version":"0.9.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"ada55d7389e77cf073a0adfc0a9434c30bde9498","_id":"@fly/fly@0.9.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-hvzVzqZYy8BvIj7mdAZoCIjyb9PSlYOgpm4kDMus/aB/SPUtyjCt+yo7C9xQVhXLWP7Q+9mU4Q/tBdBpV/K6iA==","shasum":"28513860ebe5932e2017dd900af7c6b92bf82496","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.9.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH1rfTBHA3hfREwgXrhLwnPYJs6+reRLtGL7avXTp8LiAiAnokUzZaut30aljTvqWfBOkR5/tlqyFLaZMEQYh7TnJg=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.9.0.tgz_1517437093187_0.2834424264729023"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.9.1":{"name":"@fly/fly","version":"0.9.1","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"9e6279b0b6207c703222c25222ebd7c2f696264f","_id":"@fly/fly@0.9.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-ErlBHtK4DL/aAClJux0Rg3tgEqrbxZKZsIPLmEweeeBLtT/e99uP2zaciE/MpHDiBJloP2f0wrjBp7WatXWOcg==","shasum":"52d59fa2bee0d90ccd05c30aef0191baf2452cc4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.9.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBlcQNRw2o1ZcJ+8Sl9tfHhyP7UCfgKwapd9K+nLWJIIAiEAjKRfNxvdy8svaYeZAT3Jb09tSUM4/WqW+TmsnRFgRIg="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.9.1.tgz_1517448430541_0.6412231947761029"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.9.2":{"name":"@fly/fly","version":"0.9.2","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"83d273a6cf0dc71864735c7e0302f88e73e7286a","_id":"@fly/fly@0.9.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-rr65DZeEgwlfAAqNlGRRBow/dsQ/FZNItIM0K3vp4SxE/SbVGsJjh3FXGKBK/1mMjB5WQKVtpujouawNHY4xrg==","shasum":"cffca0774bff7347cbc7c9b62b7acfcd17739953","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.9.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEXAxhUxIE7VFgfRxx7TdCeQ6ZS0RSm80CtjgW0q3mwaAiA3+JQkEghoZ9/60nK4Wi9GjLRd95ybLgGw5vfDOGNDxA=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.9.2.tgz_1517496933055_0.8450920067261904"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.9.3":{"name":"@fly/fly","version":"0.9.3","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"f546da15952c55800bdebbc26a405205545f0e32","_id":"@fly/fly@0.9.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-02XrGAkyZdxgPaRwidJyPo1+XOTLNfW7Y8TPlQtrNKdwF8lrDu4Y/XhldHgpJKfWM4EVtSzIyvw6Cy/ZJbds8Q==","shasum":"6869651812aea714381634c2fe1ef81e3d6da6e8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.9.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCrLsDa5ADbdbyEcOY7+xTz9s4s/QA8UcuE6kQMqBQH/QIhAI1OUzivD/3VgBdPkd/UySW/Xk3khIs/YMp8gHihqRq/"}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.9.3.tgz_1517505559428_0.5541252815164626"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.10.0":{"name":"@fly/fly","version":"0.10.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"4dd8162475c53975cf1840934dafa760bc3ad07b","_id":"@fly/fly@0.10.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-NjNi7wQg9il/yb4AjWmgz4euiyXGt9pFg0OR/B0Q1Y6X2nUoXwkqXRDuyH1+THUc9muUGi4LUJZlUu5Y3aic5A==","shasum":"2362f733e2bc258806b4580dfd5c6a09daa48c31","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.10.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRJaJHmqscRLQt1n3JR/kDXjEjgS5373OXQDax+15MWwIhAJUDhMBNhqOgdrUJEAqRYW0o5oBUbz/TwZ7rtv7xnBCE"}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.10.0.tgz_1517530252424_0.5259033157490194"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.10.1":{"name":"@fly/fly","version":"0.10.1","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"69349fd12f1ba8283d8c5f5cf75fb98ad4f44ed9","_id":"@fly/fly@0.10.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-E2FQTiQ/BtWg2ShspZqG/wM6d/GtRn51V9xLNF2D/nWUSE4QmR+fS4/QxIWUGrHfXYxHn25oG32pG/5G5OsjQg==","shasum":"cbaf4b73d308df66ca260adf6b595129f4f45daf","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.10.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOtysH9woOGu3+dddBHU3IiDn/FBwHUyo8TSz1rExTNQIhAMJCOl1fSYTy1lxnHnwDppmqMOZ0UEELCkuYb+SeyBt3"}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.10.1.tgz_1517583487152_0.968431806191802"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.10.2":{"name":"@fly/fly","version":"0.10.2","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#fix-linux","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"89a38e8c129b6e889b6df1f42089d78db216bae1","_id":"@fly/fly@0.10.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-y6ZbQdTIL989ZLRm4q+c2WscBD3WCSQV94F1ey6BV8sQQw9Q/kvGVMni9UvdYUccVSb6jpAkhica1HvR7m4QMg==","shasum":"b642b24f766cfa0addac344f509166506634b220","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.10.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDrewivRqMxQGDLunJlWXyBD7CNuCyupL0IWM8682L6XQIgecIBgjBGyxWnjyRExKmwCGl3Cbykuw+wV1h21JyUc0o="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.10.2.tgz_1517595963541_0.4368455852381885"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.11.0":{"name":"@fly/fly","version":"0.11.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2","ws":"^4.0.0"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"c9b695ccd4915f54ea2419a67fbe3300f25fa53f","_id":"@fly/fly@0.11.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-5aINvNhaV797RykjLPmFfFW7y5RWvDuSZjZbgm+pEwjiNlyfTWEyO3xrwK6NkJhOXb7kzLn9etw1LfMGHSyG6A==","shasum":"eaad04215203f6f9dd16fbd446a47ba1a2792d1d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.11.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICE6UkvenTIwOvxEYt1nHOqO4uIIHM+3YSsQfIu93OCMAiEA2mn0ivNSeP0QTcY1DvDGMsuGYEECjHtQcE+7A5u9cro="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.11.0.tgz_1517680506035_0.4353255145251751"},"deprecated":"this version has been deprecated","directories":{}},"0.14.0":{"name":"@fly/fly","version":"0.14.0","description":"Basic engine running fly.io edge apps","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"e24f2f7eb572e59918a2a961b46780b63c056361","_id":"@fly/fly@0.14.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-MPX4DhhPVHhIqmJx+8zgzxgJanrbWIVIxXtVR16DgiXB9IH3CtDiI3yfKE0e9y/xYlqI+BDEQjVJeGJrVnYzEw==","shasum":"ea95d1f2d93b3d4d9dad7d1e17e734d048f0bd79","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.14.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAfkR6+qY05cfMd/DUqosIsTXmk74W92MLyD5d1OPGs6AiEA2K5JEkuxXTYM/5E1H4mS9ktB7zkQ9/prOZ0BqO9CmBo="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.14.0.tgz_1517787954255_0.9565295707434416"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.14.2":{"name":"@fly/fly","version":"0.14.2","description":"[![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"b256ff4389c0d7bdf92e44292b3baca2c7edf344","_id":"@fly/fly@0.14.2","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-bZkT0+yAVNxrug9eTZ8FnxdBsWiXmlb34FJNr4cV25uf+a8iKyRlyehbmTnzfYC/bCXO660idToRqUGwuHIJtw==","shasum":"f1fb4a05fe772f299e6a846616ae0f55d05c9e3c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.14.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJh2la5rlikiuu6KJ8gRRnw4W/jZVR1DCVHdiRk6pXjAIhAIXlfhTx/KJqsYWrJT5PEAP1gphxSuXbkbuN34mQpNLg"}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.14.2.tgz_1517856489948_0.7282939427532256"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.14.3":{"name":"@fly/fly","version":"0.14.3","description":"[![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"ceea98084bf52459f16ca4d69e32c42c6c45dce0","_id":"@fly/fly@0.14.3","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-gd4MzV5OZhoK30nUHPXjObiSWDeQBJJNLUSo1FLVo4bmi+5a1UkUNL0YpUsRWnhntvJ8tPC3BQ50FpywT+klow==","shasum":"7aa7236d7a2d9bd52829caf54221342f996f1dce","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.14.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFwPxlWo6Czzj5bmSiJjLfoyTf+WvdYaYq4Sx8MFAOyfAiBqKybLPepmMP9j8d5MB+u9N7ODpXjmdzfGjzqfHsTvnA=="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.14.3.tgz_1517931422825_0.38557538227178156"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.14.4":{"name":"@fly/fly","version":"0.14.4","description":"[![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"4395d4238b85e7d6c2503765f3ceb26e200adf5b","_id":"@fly/fly@0.14.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-gaPrJcj2i53TvY4Jy30e/C1gYMV1zIExE2AKX7yQjYwp2hy5L+VE5hTD4Uq/uAHoTD7BbS83uW576uCxVcrFxQ==","shasum":"eae4644f83566f9385e387309b7a616cb44908fe","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.14.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVDUZA2RTYifz1kzsuPqZxKOTG3dO6UJj9cXsNBYLmfwIgSP5SiUYUmfDKSH6PMLB/38RZN2xhIr0L7Pj9CTGzIbc="}]},"maintainers":[{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"support@fly.io","name":"flysupport"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly-0.14.4.tgz_1517942448864_0.8228564278688282"},"directories":{},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.15.0-0":{"name":"@fly/fly","version":"0.15.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"8db1e3f70aa3430f1f00d31850a399c99306de7d","_id":"@fly/fly@0.15.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-b+wp3wyawNm3Z9T+I9LTc6NoA+xzeFLGJx5YZBf3Sn5BNEJt/z67Y1kOH8PuaOmynJGbBoLSA0gPvZMrVdi7cA==","shasum":"ceed62ca06d13bcb105174b222d41be3d73401e5","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.15.0-0.tgz","fileCount":169,"unpackedSize":501811,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFlhSuIeATyUPYP4b6wVmAnO3GxNANEWCvSGeyLBoS4BAiBVA7aEeBFjOjjVw248ykqJn/a4pJ6Uo1tnSMjNy+q+5A=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.15.0-0_1518019292160_0.5516991927258523"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.14.5":{"name":"@fly/fly","version":"0.14.5","description":"[![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"7b3bc8ee9316867acd6d8e3ea3a0a490248a3df3","_id":"@fly/fly@0.14.5","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-VQ6AvuziXjO+yCdwrucVijQkmvf5eIbSw/4jn85cN8rQmlO5bicdtQlIltaCRgRHeepD0h8S6VzQHfANMuH+ew==","shasum":"06416c3b24cd31c291254319647562b5d2c98bd0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.14.5.tgz","fileCount":133,"unpackedSize":433652,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCsSnIPWhKB/gUsK1nV71wiczON1gXN9XN33Vfwtos7GQIgHmddjkrOzvY8fjb8DlJyzpD1gW1455Cmk1tVSlKTfrI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.14.5_1518019993865_0.08752016774766735"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.15.0-1":{"name":"@fly/fly","version":"0.15.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"20137c3f60e5de267ea81aa85feeaaeec4c7f9d1","_id":"@fly/fly@0.15.0-1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-bAMK/zBbkpanBqdwTmfgb85iEXFiuAmage2CcymGgos7U1D1azeBKbgvDFJVc5v9ucfgDtKWEus7DdVcYbRDqA==","shasum":"1f48c445ea48c69948cf7f021c7dbdc73704af15","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.15.0-1.tgz","fileCount":169,"unpackedSize":503758,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEAT95HnnT82aOcV9Qf7g49rlOyclXBC7DbAA0P5C5GIAiBtxG6FNzb4RgJATvdgBLlOrGZtkFL//F5MGNTRKrAr1w=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.15.0-1_1518024282307_0.3413001470778656"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.15.0-2":{"name":"@fly/fly","version":"0.15.0-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#update-ts-definitions","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\n// index.js\n\naddEventListener(\"fetch\", function(event) {\n  const res = new Response(\"Hello! We support whirled peas.\", { status: 200 })\n  event.respondWith(res)\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"322f1b175f9198f28dee5ad79a7e2d92eddea508","_id":"@fly/fly@0.15.0-2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-IcVGyUKhotHQPg/H+XTT4YMFRdpnhzuPX0Spd6bGJkq7475NOK4CPPU7XAEBr+EeWPiLZvFCmR7RzKaixrxpiw==","shasum":"95f1bc822c47d09420ec15b94f41cea1d1636130","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.15.0-2.tgz","fileCount":170,"unpackedSize":507582,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCuSvrYdXirG0F2dGogxo1zCpXlNJ6vrXMFO3cWMhY+lgIgZ3zWflqG39G+3HyJc2ULmYYJAV46BNg5b64oowq/8Gg="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.15.0-2_1518037949941_0.5238458157509218"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.15.2":{"name":"@fly/fly","version":"0.15.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","get-stream":"^3.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#master","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"3d91450d4838c9d28ed4b2e3291eb8f02cfe8a81","_id":"@fly/fly@0.15.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-1qtB8TTVtW+nMUCTQ4Twb7shviiJOq3JLTPMnZuKaOJs8gd4cMpaAHfQk/Q3VCsQijbEUN9az8noNEJXoS7XuA==","shasum":"f3368db0573a39a860f63c26d5daeb33cad919ff","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.15.2.tgz","fileCount":171,"unpackedSize":511579,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBeDzC0c2t5OkHtrsnLcXAyIwSYesM6PCttsj4wqd+hKAiAFiQfjyTuzlcd9pLWz5yO7CK1Q1n1Du3KF68MiVzhYvQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.15.2_1518123224789_0.16121082447754298"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.0":{"name":"@fly/fly","version":"0.16.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.6.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"86c520a594ef2f716ecdad70cb6ab9fe089b54f2","_id":"@fly/fly@0.16.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-iYYh2Tv4nbmqQV3oOYSh2d1AUX/D/4eNF2YIH5ugL/F7R56ztZwvXLoAyYVL4foJN+idjp8Q8IY5Vfs5IVf28Q==","shasum":"c4c26b52486215bb7ec5ca66b0033aa8d2425f2d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.0.tgz","fileCount":174,"unpackedSize":512005,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKYBA+qKvCdgO3FcqA5nbeZK2b8AAuwWbzpG8dsS4ieQIhAJoE79GEJZR8Ry1lYSKmcoyQ1UkGJ/VAAbX+gDK+PrUg"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.0_1518135274877_0.2128889907673921"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.1":{"name":"@fly/fly","version":"0.16.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.1"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"38dd48464148cd70b2c2772dc27624e50bfb1606","_id":"@fly/fly@0.16.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-vw6uWTCyB4hMkd58I73Y/APs3rHRP4yVu51oohGRQQg6Ldhu0UStIUL9hLXR4MsIRIUmuTv2XHhLPZgyf+RWnA==","shasum":"e5c0fa6366e1da331f6d1c7033f77a54f097d49c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.1.tgz","fileCount":174,"unpackedSize":513919,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICZ0aGFkAYpnrSFrNzLg36rEoyAJtQRJV3ShJaeCePGYAiAJ33ojYgqe9g8n1CYevTG+ob1ybmkwrZcm+MaBMcCfbA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.1_1518215951953_0.942376613417115"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.4":{"name":"@fly/fly","version":"0.16.4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.1"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","whatwg-url":"^6.4.0","http-cache-semantics":"^3.8.1","spark-md5":"^3.0.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"83a4897f759e5ffe8789c1162430de923695b9ee","_id":"@fly/fly@0.16.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Zx/0X1+4+b9plbwgNzqLNJ+yH10IY6sxbpojei8FCxbVnOOGlNBmAwwYkPbYPQEm8OsezR5uXjO8njEV7g2zsg==","shasum":"d1686dcc7513f1249dd0aa3d959aad2950d84715","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.4.tgz","fileCount":175,"unpackedSize":520311,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8R96yF4gGv9IQUiukBp2FPcQywGGW01bZDR/n9rTEWQIhAK5o41DPUdrRVGBmlqAvmFfoI+Tbz6T6DgqWDx0e19BP"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.4_1518632325454_0.6166562611998054"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.5":{"name":"@fly/fly","version":"0.16.5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.1"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","whatwg-url":"^6.4.0","http-cache-semantics":"^3.8.1","spark-md5":"^3.0.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"69eb71c3f8bf9fc9d5cf90b6f2f2fbd469f444ca","_id":"@fly/fly@0.16.5","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"matahwoosh","email":"mbyczkowski@gmail.com"},"dist":{"integrity":"sha512-wf51et8Ltv1BtAvCn/+FjiWw2AmaNjZftivq6RQBFLLIa6otbuk420EE8kcV98Q1X7YSjGvu5SU+eZ9xX5yCOQ==","shasum":"0246eae35e54a60fc5800730fffc291838a440be","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.5.tgz","fileCount":113,"unpackedSize":353610,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJir/r7W6gv6z2xJ371c81HEeUOTp0XX+dJqSYYsuZngIgOLsSsToUtNiLUK1ANhNW8t27H6HlYHrKgr+w0QQW0mY="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.5_1518645171127_0.15112665512826418"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.6":{"name":"@fly/fly","version":"0.16.6","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.1"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","whatwg-url":"^6.4.0","http-cache-semantics":"^3.8.1","spark-md5":"^3.0.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"55d99af0ac7f048cd79d27ee19129ebace857cc6","_id":"@fly/fly@0.16.6","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-9WbLjLuz8/KlrgpvaUY6Z2OtET1SxOolzZ7+OMZlTaa7bnbZHnVsCl/6J6wZxV2cjEchB3TiJwm78RFXO9Pldg==","shasum":"096464fa6c746b5a3b483a1ea7e49e6f46453c9f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.6.tgz","fileCount":177,"unpackedSize":531411,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIECKWHqc4Qe61EEl5penZdfyfbOVvEUGc3eZbNTyxnswAiAq09QqzFt8vzGaywEVf5mq6RihUlLQvx8S28O50XJKng=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.6_1518647798876_0.11643756822031959"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.7-2":{"name":"@fly/fly","version":"0.16.7-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.1"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#master","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"29c51a12cb96762e6fe6396b37ce48430f8818a1","_id":"@fly/fly@0.16.7-2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-aSq3EO8dckLyJnn8Mmp/cWedduuDtylMgQAJVFCxKRnvouNi6xb2lkosN2+Ad3PXB+ZhJ29b4+ghTwLtulcsxQ==","shasum":"69bd5e9f0fce802672347cacf5382a1c4a0fb696","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.7-2.tgz","fileCount":115,"unpackedSize":374349,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC7bIOOkhqppuOfa2BDvznKEXuN4jejSWANJeml99vxbAiEAnv+PGy4dxnpE8cSH0s191S/acYZKVVzzbTNmhZTZvOU="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.7-2_1518808361349_0.3281549539794122"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.7-3":{"name":"@fly/fly","version":"0.16.7-3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.1"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"33e32c06c0cf85e3a6aa7d0a9a4e9c3721af692b","_id":"@fly/fly@0.16.7-3","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-ZnFd8a6qiEpyfODyjkJBPCSkJeHoG4UjriiA0WPfSNXKwsMIwsPC/G27HBuODPtE+oTBMWJznbgISm/55/NrvA==","shasum":"cfc109e2284c90cc60b7d819287b61d0f059ebe3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.7-3.tgz","fileCount":115,"unpackedSize":374438,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEjOkpdRviNZjawjQMRyxRI0/RHHaLpL9JzaZ7Tnx29gAiA301Au8M606Z4zK4+RE9R0tweSIY1lmegM8ZN2TMMkRQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.7-3_1518810382057_0.28209199336283275"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.7-4":{"name":"@fly/fly","version":"0.16.7-4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.10.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"f05ce637be3467df4a2ce38e9c4ae52381dff88a","_id":"@fly/fly@0.16.7-4","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-AiNk8opRqL2d0lYNhGIo4q9lad28Kf4AfiLkOdN3nFGZQjfvSFkWnQZK8MGOrfan7C+roVAWX3BTtmeUTlCHDw==","shasum":"70afecc78b7051d6ee36d1f46bbcf19e18903705","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.7-4.tgz","fileCount":115,"unpackedSize":374555,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCTzdyVVuOjYuih2fegls+GZxVGyHgjqbxYDT03CI2rwAIgZ1zOgIlQw6sFJ29/xaPNtsTVz6JpA5vEGMVuRvxzmRI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.7-4_1518815139751_0.37131180709761913"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.7-5":{"name":"@fly/fly","version":"0.16.7-5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"1b3d8daf824cc73938496ea85ab9a43abf4d7d57","_id":"@fly/fly@0.16.7-5","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-wKcebah0KkRegUSFa2tv5MfCRTSiecvsYjjV+CfHknHFBNmQ2GCP9F7KJVhUNNjDxn3tnShqaKrf6WdsTjw0AQ==","shasum":"4cbefdcb2d5def6a6f344ce08c209096e904fa91","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.7-5.tgz","fileCount":121,"unpackedSize":394975,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE8iFzXiYOzStGwG6vWzIoCczvz3Zxm1cuJVIN5hbIAmAiEAzIyJFmEb1Wev9LbiIZm1gZlujZYB+r4KazvFnAsPu5w="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.7-5_1519155300438_0.4872558168196546"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.16.7-6":{"name":"@fly/fly","version":"0.16.7-6","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#master","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"c09b5aa14eab768db6a4cb61ecaea6f037c302b8","_id":"@fly/fly@0.16.7-6","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-VaajPaxrG1UQKMw3OyuW86n8tJgrB2eDv4ONNINnsyojBkc4hQad+smucJXP6Mm8nxELztObaML6F7ogyCgzrQ==","shasum":"3ffbe2737445258fbabe64e6884740ac1d56994b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.16.7-6.tgz","fileCount":121,"unpackedSize":395120,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEDbpbq4mHeh3A5ZE/FgwinF2h5KW6E0cZ+Jd8bZYax6AiEAoTb3ruifha1ID9K7CTOuRgiqZDC3gtu5V9WQAghpRXg="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.16.7-6_1519161422486_0.3735900940982648"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.0-0":{"name":"@fly/fly","version":"0.17.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#824c4e554aa9b9b84a918fd414358ae1b401b372","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"b2ee3e2506df148bc56f82350cb4a389b7a0ca46","_id":"@fly/fly@0.17.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-pjkCWJxhOkXmT2wSa53T1be0Qb91aNqXMTbq3XaZ7EeYRg8yATDpOxVY4C/uh/vfd9/fysiQ/oysjqKu7dxW2Q==","shasum":"0c9ca483c0bdab47c5cefee07167b762d33eb33d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.0-0.tgz","fileCount":123,"unpackedSize":395327,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFqcL4xol6y843kBKqenuXdpYY+hcbOtW+oWB3i+UGQiAiAlv0RkV/4FnHtkhAfFuGXm5VVadyt5Och0JhEfOG7jMw=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.0-0_1519247988856_0.4671902351214223"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.0-1":{"name":"@fly/fly","version":"0.17.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#bea207f7506b29d178a7fc22d10d7d6a1d4447a7","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"d48fb0a0e5e89f26828453920d73b3900798e53c","_id":"@fly/fly@0.17.0-1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-h27+JbbBKiLQVB7eAqPY32IR5+3SwA8kh6yWwn5eoZVULmhJwZUzg00nWGQ0Dchf0O+59CVqao3VoGDOMsSs6g==","shasum":"beed8c7e4fcdacd1a7408653e5bb9fc4c9209b90","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.0-1.tgz","fileCount":123,"unpackedSize":394574,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEVsDPx4eDtMbdz6fCuqRcJ4Lb4oCef8sG7dtOmyDB3aAiEApacdkjDNFj0haq+nvuxpY/s4OQpq5psOBY7JNXUo9AM="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.0-1_1519264735136_0.804333137492087"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.0-2":{"name":"@fly/fly","version":"0.17.0-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#bea207f7506b29d178a7fc22d10d7d6a1d4447a7","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"11f782050c9374bd2e8fb4fb80d001bceeb0bbea","_id":"@fly/fly@0.17.0-2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-9qQuc1cMc2MQjHaZ4u+gcA8XcRfs8iWOjFoRix2JU66PcvEBAb43nfkDUc74Y7eDYPHJZpvApHghsR+o3XJRzw==","shasum":"54079861f9a86e7bc85373d1bca8b2e6d64b67e2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.0-2.tgz","fileCount":123,"unpackedSize":394069,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZa1KFVNWPyw7oYonGOdlEA7ozHsuaRhoa5UjjO33i8AIhAKYuQ0nFTVO/SB88Pv2LIrZwL8VgSXpkHDLpKCJxcYwa"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.0-2_1519266060360_0.014857099864603374"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.0-3":{"name":"@fly/fly","version":"0.17.0-3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#bea207f7506b29d178a7fc22d10d7d6a1d4447a7","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"57564b4369a9a209c8c0cad515cb5d0e8cb12f1d","_id":"@fly/fly@0.17.0-3","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-WL1CoRNtd12ZQErtfctQPrgBaX6jj1WNyxfjhN5UL5v6jY2laNwP/ZIPmgHuA8AytwddHfy2YSKQB5xvx/pZpg==","shasum":"08e7553183c6fe695fcce2bc2cc50663b0571d3a","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.0-3.tgz","fileCount":123,"unpackedSize":394621,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHayPsXYmf8dGHMvCUET7HnMnSZPvaEDWck7d19MuLxFAiAjDhfahL+/OCxVa4jH+NEk5P6EpmT+j4XrC8CH5fFglQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.0-3_1519310365240_0.4093972631678884"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.0-4":{"name":"@fly/fly","version":"0.17.0-4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#bea207f7506b29d178a7fc22d10d7d6a1d4447a7","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"f5f541f976b5077329bc8a5cf4c99c7435cb1fb3","_id":"@fly/fly@0.17.0-4","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-HWKVPzsN8HHJ9sU6gqrOFq7OSxCKEiPI2mk0woSGgKiUYTPx/u1/Nf36idYGcJ9F+xKA04gksUjFfp4CPIRa0Q==","shasum":"f66dbd15f8090fd93a8d1433d2a2f962c64b06a8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.0-4.tgz","fileCount":123,"unpackedSize":395472,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJP2isffUQpC6f9Go1lbXoSK/IdSIyeQah0EUliD04lwIhAJu20/C8MM/jLyf8/SuVR0sS/kOUNqVIIVhbdjczey1C"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.0-4_1519332359203_0.7153466071001502"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.0":{"name":"@fly/fly","version":"0.17.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.1","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"269fedf8de0ccd6badc73fa7081b1524fb8217a6","_id":"@fly/fly@0.17.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Pi2jdtLBQmkatl9vWCAOQcy9UrlESbTTxpKYhJ5aHrRMUKfaNd2TbS5jRyzV2+7jORw+l34VqaQHH0wFNLykiQ==","shasum":"0f7e4a22159a4a1dba9fb49baaca3ddaa3ad1a35","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.0.tgz","fileCount":127,"unpackedSize":413209,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAMqyVv25JYzCscPp4Rn7gNNhSMWrOqV9gNDr5CdRhI4AiEA3NvYLqrn15gXq3k0Pk1Csb//cjqtYimPOj96r8N2BkA="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.0_1519390562048_0.22332340035501352"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.17.1":{"name":"@fly/fly","version":"0.17.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.1","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"97a9706e595414f2348317784f1848af59966f49","_id":"@fly/fly@0.17.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-+VamOxYNG/lv05yawYNJrV/zFKFJ6bMcV0KaAMssQeyg3BVez9L1TVD9FqapwNDUP4Tudk4HaLR2Jm4TSPcY1Q==","shasum":"df5f7aeb51630c6e21409a92bd83c09dfd229fe9","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.17.1.tgz","fileCount":129,"unpackedSize":428282,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB4u8kplnesh5RyTH0KXvIqudhpvuqNiRgzg12Zzieq3AiEAhDUWCz0oVhYr2FWEga4+jn6yMaHf1PlvjYLsvrHDt8s="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.17.1_1519475993561_0.8744204034727132"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.18.0-0":{"name":"@fly/fly","version":"0.18.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.1","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"572def41ba7d0aaa6c55096bf626de3ea5687577","_id":"@fly/fly@0.18.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Ss4Fi/G8IzBppmY/iFIAMM1LaSl2/ZAg5Bz4TbuTPD2FOeO/mA5b02cwRCxd6WK7YnSxRikuSySYdnZ6mS6e3w==","shasum":"93a9161926840dfa81894e021eea64f5a5031997","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.18.0-0.tgz","fileCount":130,"unpackedSize":429457,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC4/7fVFTWOH6LgnAk3rIT0RLyleQ4wbex0f/E+uq2aUgIgak4JdXyglEaQpHu7Ei7L449dJiyx58vk8cdqM1yJX58="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.18.0-0_1519477328871_0.8260940429416259"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.18.0-1":{"name":"@fly/fly","version":"0.18.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.1","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"1b995de32e90d7d7e6279a4b36117311a5b5850c","_id":"@fly/fly@0.18.0-1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-f6nd5xUsO5iSt3DbMAcZucSI6+F8ZHahj1Fx+xYvFhDvKkmjeIA8FU9T0BCwFWXjtPwcbIyYJRsou4HefobjTw==","shasum":"1df30e1cb3765e604bfee3a61c4e3bac23fa215b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.18.0-1.tgz","fileCount":132,"unpackedSize":441565,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDu1JQrF0Vr08r7lsqmeV30yqdaXJ997tX+V/VkEKbhbQIgQhNCWn2flJk4w0wiSfdxTYl5YRLAtB7fm/ROMX3yOu0="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.18.0-1_1519487810571_0.6532083066838101"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.18.0":{"name":"@fly/fly","version":"0.18.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.1","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"4c337d9320697844042d89a37765203e68805835","_id":"@fly/fly@0.18.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-xT1y3RTmHh7TCgeTaPo0GWBl4s6VyEi+5zWnk+2xZ8qV7154j+KiFH5ZqXrQqyP0SGR/f1qJstXYJJDA249dMg==","shasum":"f2c32fc3c93e131a805b7f6997e7f7a59d3ba7df","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.18.0.tgz","fileCount":132,"unpackedSize":440293,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDW9EiCuzLBQxQHCdxR6NNG7TqTC1PsMU1qnjGq3jS5GwIge37IMc6W/5IMpr2/z6liNfKyxXpzjtP1fdumw4bLipc="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.18.0_1519583393519_0.2195767852845334"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.18.1":{"name":"@fly/fly","version":"0.18.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"mocha","coverage":"nyc npm test","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.1","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.1.8","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"be8c3c65394e70f5ed6be2219599a6d0b3521285","_id":"@fly/fly@0.18.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-npTphf4B8zx2JKofJBCxCs17w/iytmUxfXcBYz0/Mw/N2aF1Nnxufh9/RN9xLKYLdpc1baHtFOCScyb61cU0fQ==","shasum":"f625afc6ee94db49d55367b441fd7ae48e1fb2d3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.18.1.tgz","fileCount":132,"unpackedSize":440975,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKE4vryXM7/dZSySZDN18luL6eIUh3wyECPX6fZC9g4gIgXpt4k0+w+4ylkYfZORPLiwv7eax/0mJdvwyi2iQb0vo="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.18.1_1519585714262_0.7925658738433494"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.19.0":{"name":"@fly/fly","version":"0.19.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"node ./lib/cmd/index.js test v8env_test/**/*.spec.js && mocha","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","coveralls":"^3.0.0","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.2.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"3044d6a8bbbd74d41eccd00dbffc695ec88b66fd","_id":"@fly/fly@0.19.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-JvfrOyUQytc/dUziE1nK9DYG8nUsYdk9fhtn6cDGVkC2IOLoeuL6bEnggtbMZutYSuA7b6Klk2EnIvFuihhfYg==","shasum":"cf592c9c32b7c8945d8a5eda8bfbe0c90fb415aa","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.19.0.tgz","fileCount":140,"unpackedSize":485412,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEUKjFDnfLSDqmsGnbcn4HwaV3dlzI6DbU0Ckew9a2h9AiBhLloBVDRy4yoxrEPVVTzbthqflr50Si3sMSsteu1eew=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.19.0_1519743240409_0.346392764509202"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.19.1":{"name":"@fly/fly","version":"0.19.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"node ./lib/cmd/index.js test v8env_test/**/*.spec.js && mocha","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","coveralls":"^3.0.0","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.2.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"260fac8910aecf7f5dfaf70c94b3f20d77af32aa","_id":"@fly/fly@0.19.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-OVjGEtAFolSufWGcgWepdEEpO8BYsBW0F1W2Wn5zyglTVrsq8NMliSe8srVB1C2NPXehQ1kBVIQmEjJu/GAEZg==","shasum":"eb7d4b30a844ec7317ac26cb5ab7a9ca514aa0b9","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.19.1.tgz","fileCount":140,"unpackedSize":486609,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnCEhJUXqCDgr6aqW2s9rvJzSC9SrH4ARnjCslS9yEVQIgBW1uXqbQFRYwkiKim7eIe8bZAyWjrYjzUGxzUaxKW9c="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.19.1_1519760775069_0.3379304570065129"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.19.2":{"name":"@fly/fly","version":"0.19.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./bin/fly server ./apps/getting-started","test":"node ./lib/cmd/index.js test v8env_test/**/*.spec.js && mocha","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"tsc","build:live":"npm run build -- -w","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublish":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","coveralls":"^3.0.0","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","buffer":"^5.0.8","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","readable-stream":"^2.3.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","uglifyjs-webpack-plugin":"^1.2.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","webpack":"^3.11.0","whatwg-url":"^6.4.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"f00423eedf4c21476a5261ef8d8c2177afadf620","_id":"@fly/fly@0.19.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-oZOfOiliCdN0vzYtQs2WiWA+zWAOT/oUO71NG/v2zOutrIuG3SkcmTq5y2FqnNuqlf/+wg+wqt+wuPDkwg5RFg==","shasum":"e6ec02eef9a16a22813a6b8563e5bed9613fde1f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.19.2.tgz","fileCount":140,"unpackedSize":486695,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCedT0qxD79Tc0/ZT/sWUPl2klbBBk+hC19rLauLqFvJAIhALBEmgUH+45Jh4RBIEBXPbCeIWatWhYQdZt0KxoyRQ1T"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.19.2_1519763224726_0.7498611891192117"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.19.3-2":{"name":"@fly/fly","version":"0.19.3-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","concurrently":"^3.5.1","coveralls":"^3.0.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","uglifyjs-webpack-plugin":"^1.2.2","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","src/spec/**/*","**/*.js"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Coverage Status](https://coveralls.io/repos/github/superfly/fly/badge.svg?branch=master)](https://coveralls.io/github/superfly/fly?branch=master) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp_id: my-app-id\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app_id` - the fly.io app id, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"f59595ef20d2d93560b516b837edc53c419ca4c6","_id":"@fly/fly@0.19.3-2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-0NYf7y5n6itv8g2zGtgL7/AEGJLBLzeNTBzp7/UUjU3Kd7hsJq0IcOt0kyU+I6BBB0HswldfbHZzdTozRs+Ing==","shasum":"6233d1de1270a1cc11cdd3f7722ae9978b35d5ed","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.19.3-2.tgz","fileCount":93,"unpackedSize":3681980,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFAI7JTWlHRoW7s7yumf4xnJldi+KpyXtk0pBMP3DRKlAiAU4UnZf6kzqwyCGfiG2PmXc+5Al+PU680kuZFVxTbz7A=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.19.3-2_1519838316655_0.2425072804815227"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.20.2":{"name":"@fly/fly","version":"0.20.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","concurrently":"^3.5.1","coveralls":"^3.0.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","uglifyjs-webpack-plugin":"^1.2.2","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js"],"reporter":["text"],"all":true},"gitHead":"218456a1cf0c383695fbe3e101ca8ec55f74de68","_id":"@fly/fly@0.20.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-q6nC8eBuXXfqPBX/09l1h61X+Zq5/dCiREUMnYzM2G09nVKD6KAh8sy4eBo26STKmjv1HpDfRof5olWIxAwoWw==","shasum":"0783c664f6eb575c0d390d200c1f7e33f56674cc","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.20.2.tgz","fileCount":93,"unpackedSize":4257204,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKQShjCft3z6XtuM70AbjY7gw2tqY/LzObtjw02Q7bUgIhAOFUjZHdEmBAJO+cVNjHTk6iE4rDhTsXeMO08mAtfKJj"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.20.2_1519859687640_0.9717358938056644"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.21.0":{"name":"@fly/fly","version":"0.21.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","concurrently":"^3.5.1","coveralls":"^3.0.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"4145f85753759513ec77227ada742a8345b598ce","_id":"@fly/fly@0.21.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-f/3Y5+hCTw8agfRZmY+LVS98JIEgEuGbBkws6jpslpI2hNJExJu7gc5lcU7kQasfsBmJ5zmG2/7eTeBYnSCIlA==","shasum":"66a5bdab46d6dbc4b723379c9f8b09471f4a71e0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.21.0.tgz","fileCount":108,"unpackedSize":3701873,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICEuLBUEDwAoLfnHQQEErqGHsB/pCeTdO3O0ww7G6mc+AiEAjujUOgBiSmuvQ2cpE/CxLKraJT/XqjykLEMAS8/3/dY="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.21.0_1520083488835_0.034578215138707735"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.22.0-0":{"name":"@fly/fly","version":"0.22.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","concurrently":"^3.5.1","coveralls":"^3.0.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Coverage Status](https://coveralls.io/repos/github/superfly/fly/badge.svg?branch=master)](https://coveralls.io/github/superfly/fly?branch=master) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp: my-app-name\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"6bdec31c46b084acf85505aa487dba4d931df77d","_id":"@fly/fly@0.22.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-KSnuyKonUkDrMwr/owrYBvmyFTW5NLvdGPFUcKaxmellmPNN+0dcY81QY58JWcDT49Q6UIla8n/edlLQHp4fwg==","shasum":"1f88716b74fe417b9faa4a0a4f4513684edc017e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.22.0-0.tgz","fileCount":108,"unpackedSize":3705669,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHvp+rY2DB5dUanh6dA2yChRV2UIuvjAHMlYRPvZfIQAIgIt6mBudtBSoDBXBWYkA2/XfxCW5zehvkZWYVcW4ackE="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.22.0-0_1520194030654_0.7677149058046833"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.22.0":{"name":"@fly/fly","version":"0.22.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","babel-eslint":"^8.2.1","chai":"^4.1.2","concurrently":"^3.5.1","coveralls":"^3.0.0","cookie":"^0.3.1","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","debug":"^3.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.17.1","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","source-map":"^0.6.1","spark-md5":"^3.0.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"16dc23edc3b983a61a1dd3d79eb2794c7402d40a","_id":"@fly/fly@0.22.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-hL5aMR1xWmrWuE473TsGibQyZv69onRXlgveyvD/a8QOaI0vGJtN9WFNpDKu0Z9gbXcg03XFmvU4Rk8AqZ0EjA==","shasum":"9d7ff94495fd035724505d824dd5b3d9c0b55773","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.22.0.tgz","fileCount":108,"unpackedSize":3705777,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLFUnT90jP5h119Mdp4rM9whCJ5pvGdmtFeFWaaJ6StQIgJAVzo26Bt370aWwtAKf4ZsjOzMOWqT8H/+AlKBatWrE="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.22.0_1520196987426_0.5857986786067142"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.23.0":{"name":"@fly/fly","version":"0.23.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.17.1","bugsnag":"^2.0.1","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"85f222846d937e1617b8773187fc0472d5268c00","_id":"@fly/fly@0.23.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-BqtxDc6vuGgP/+m9rgjFTAtHtaNRArhqTtdiNGPeFWmc+tUcpTDoQEPTuhRwDielkVrjULPzoCHpfXhRHT7YBg==","shasum":"55eeca8487ea8160b9ff5561b4a65b35d670decc","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.23.0.tgz","fileCount":99,"unpackedSize":3668205,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGeaL878l5RWReaiSV9mFpifNR4vHbzu0EW9wLKn9FcwIhAMHN/dvFIlZwJamlkOSacxY98gSg7als/ffrPwEeRkr4"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.23.0_1520520028256_0.6656882345741972"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.24.0-0":{"name":"@fly/fly","version":"0.24.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.1.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly)(https://coveralls.io/github/superfly/fly?branch=master) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\napp: my-app-name\nconfig:\n  foo: bar\n```\n\n#### App configuration\n\nLocated in your `.fly.yml` file.\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n\n#### Server configuration\n\nUsing environment variables:\n\n- `port` (`FLY_PORT` or `PORT`) - is either a number or a string, it can refer to unix socket (default: `3000`)\n- `log_level` (`FLY_LOG_LEVEL` or `LOG_LEVEL`) - is how much logs we'll show you, can be `info`, `debug`, `warn`, `error` (default: `debug` in development, `info` everywhere else)\n- `env` (`FLY_ENV` or `NODE_ENV`) - current deployment environment: `development`, `test` or `production` (default: `development`)","readmeFilename":"README.md","gitHead":"63961e180f3006e78dc458eed0e47d88ec866836","_id":"@fly/fly@0.24.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-M6omHGEov8BYyNFA+nxGOQuGtyp1b4JvYiLc0TRI0qZxMmtAcZCaD7juegSEczmXVbiLyW3Pq4bxpfnslq952A==","shasum":"0173aa1c57e011eec948df9135394d2e15a17b99","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.24.0-0.tgz","fileCount":103,"unpackedSize":3686389,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICm1i7XjzsCh8nGKRfd8lGFJ5InhLTHQp+lVgVEvSf5UAiBVtVqxpQJ5QlM1vmzGoKkyiPSwD1S5TKjxvPNydmoohQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.24.0-0_1520535463117_0.7893437338646265"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.24.0":{"name":"@fly/fly","version":"0.24.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.1.0","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"7d52402bba0576eceb443ff4a8da0f750c645629","_id":"@fly/fly@0.24.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-eIYniF0OeJ/+eQ0DtXKpcTNQadLW92t2/81sv8wz+Loiu1q3lKdR8j0LnK7bFHCyay5lmDHxgYgcJHqHnOf5Kg==","shasum":"b1c0687eb034e1351acd1a08dbc6540f03503c34","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.24.0.tgz","fileCount":103,"unpackedSize":3686650,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCaSiyXBwlmZZOiWApnQh/Uik0M0zW+RhFs360r8KG60gIgcOsBBRlZXR2L/2hqMcxMf9ZgL5VXeB0ZWazr+1O9wug="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.24.0_1520540483145_0.47567978495107255"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.24.1":{"name":"@fly/fly","version":"0.24.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"3e5c139a59db7d4b24e04882a7a587403b672b3f","_id":"@fly/fly@0.24.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-/DPic9LT22QJ9zkT1s7ktou7U2I+GVkiyt0Vcbh/NLw1YRQbOaII7SvTuSySkBEbeYtL4Kns3ejWlYw9jnmLfA==","shasum":"472006c8f5c9d100ca5f277bc34c6bd814648bf9","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.24.1.tgz","fileCount":103,"unpackedSize":3686874,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFlK6C7Ry7vvJHczyAM49bUiohf0AvohsLGziCrFqYm6AiEAiU/zag+ksqeXY7IfcTGoGp/+ITDkzTqU1qD9zdpdn7o="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.24.1_1520545660791_0.22710015641874293"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.25.0":{"name":"@fly/fly","version":"0.25.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.0.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"d2fd2be7e16b9207a5f9038cbb9cb854b8b79f76","_id":"@fly/fly@0.25.0","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-qZfogg01aPOrniw7nzYlP7U9TgBlQNGldzWeRK3UXJHuhNmjeAsCRj8rScFPHAiXZgJAHo6WEWLtVa7Rnd0CCA==","shasum":"33ecd8120a4aa78a04c8b8d6800caea9c6f93eaa","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.25.0.tgz","fileCount":103,"unpackedSize":3676261,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHtZe3xc6piTEltkP/gDoud1ZaY7SWr9+/ZU47LyUYvpAiBaoWd9zugsbWv1sVBvpULP6cgGMRbJcqG732xN1BcKoQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.25.0_1520958576357_0.22998080263205267"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.1":{"name":"@fly/fly","version":"0.26.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.0.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"1dd54fa85a511f0dd3ab315735c8907d0e96b247","_id":"@fly/fly@0.26.1","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-8lJ0igM6KCqLOSbUjtc99o8HJQy0sd4fiLss3U/p/jRnACTg0Laak4hZTrBzgP0aKGf42lYlXfI40ltCIPHD4w==","shasum":"9c12f62d35e596a7d713b9e0cc8cd0da0537dd28","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.1.tgz","fileCount":129,"unpackedSize":4293484,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAhY4uzxsH9yVFKGhQFk/2j3vjM/755DYKPiFF+cDDn1AiEA6jbekzyiyZFixWBg4yoX5u4RTClGS7/JwKCqp+stzys="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.1_1521127199575_0.3205304827479081"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.2":{"name":"@fly/fly","version":"0.26.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.0.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"f2971eed3f620aa00a55ac3373680aa0896498b6","_id":"@fly/fly@0.26.2","_npmVersion":"5.7.1","_nodeVersion":"8.10.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-QRHjpvKEbW8Og6P6LZwBG6Y1lpK8l2ylUtQwdKfya9Djb1BXOuSLYxkR2bj7/vdAJrjTgLvSV8FujNIIGruvbA==","shasum":"cf802bebd4376cb130676662b1bb324fed089fe8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.2.tgz","fileCount":130,"unpackedSize":4295448,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCh+HZcG9pTcUA9I2aGN3i6mRCJbQWwJM1HO5FozVR5IwIhAMF/HWGmIgFZ/SuMxD0HVhZgJXAkbxCzdEeorg70zXBE"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.2_1521215079940_0.7010798495982722"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.24.2":{"name":"@fly/fly","version":"0.24.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["lib/","dist/","v8env/testing"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2","whatwg-url":"^6.4.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commander":"^2.13.0","commandpost":"^1.3.0","findhit-proxywrap":"^0.3.12","fs-extra":"^5.0.0","glob":"^7.1.2","import-cwd":"^2.1.0","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.0.2","js-yaml":"^3.10.0","memory-fs":"^0.4.1","mksuid":"0.0.3","mocha":"^4.0.1","multiparty":"^4.1.3","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"433e13c4606e0cf247e4985173cbae5fadb37e53","_id":"@fly/fly@0.24.2","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-xtTvhUjHHCntv8SWvVmFG9rsH9KEzXFB/cFVP51/NlVOLmHnhlqeAAPoHNeoWU4QXv5o1YvfT9V5GI/QDPmyDw==","shasum":"b0ad6481ca090714e93d0e5ac645f3354e0ef6f2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.24.2.tgz","fileCount":113,"unpackedSize":3715855,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzmO46UE8OVbsoU+CEoYnIRRHon8kDFl06+4epHPKAewIhAKFPw0bp6Nt8YreokpHVmBs79+E/1/d5CqUgpDd+FKTA"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.24.2_1521245247917_0.47524691515996675"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.3-0":{"name":"@fly/fly","version":"0.26.3-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#master","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nBasic engine running fly.io edge apps\n\n## Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfile:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"4d47fa57ade44b0d55d360f0bec59c838ab657f2","_id":"@fly/fly@0.26.3-0","_npmVersion":"5.7.1","_nodeVersion":"8.10.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-JKAFJaCDQpiFGIRPoB6pfij1m3VnZE3AwcRR3Pi5QWLq1zmU2TPTt75FcINMEZrKzE5p/oNrgiLX+3IlmxDSKA==","shasum":"522a55790ceced3ab65d16540ce3c8bfcd4e3530","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.3-0.tgz","fileCount":134,"unpackedSize":4062855,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDpgavNI5IgHW9f+D0x8Ui5cIiNvEDsTxUW5RcCemnj3AiBH4DpTM3HrqOE2iTW7rWx6HRkNzafDtPIDZpA04thUFQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.3-0_1521320145365_0.7672467795502405"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.3":{"name":"@fly/fly","version":"0.26.3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.3.1","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"36ffed6cc896e0323d4d79341388d74bff0b5e1c","_id":"@fly/fly@0.26.3","_npmVersion":"5.7.1","_nodeVersion":"8.10.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-n5aEQCNdj8kUTxvHuis/iYucapyDmOpBtkvVciSsgQ7QNCY8lKNP2nM00BGYBmQf761hjauP/pBWNc1wfQJXRw==","shasum":"db210c0db4f837a4106cfe653de86b9845e6a3bc","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.3.tgz","fileCount":108,"unpackedSize":3451217,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkNuCQ3H4geDftxbCZynOmQFebPsghYGbIJsTpGx+YggIhAIYU5riWfEYIFOhZtG8uCAcCOIW0fYJXmjZVVs+KJ5JK"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.3_1521458907166_0.8538021106766183"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.4-0":{"name":"@fly/fly","version":"0.26.4-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.3.1","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"2d68739f492e423130f1f8ca7fe0bf071996d679","_id":"@fly/fly@0.26.4-0","_npmVersion":"5.7.1","_nodeVersion":"8.10.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-mFB7w+07HmGK/v6MerCb7cPNrziFQpLZkoLOSy+lEB3WFVx2Xeadm5QStOSyBCOS2WFU7OuaDlWGZXXOU9Ijmg==","shasum":"149b4c95e8516bc9ed1f0fe11340a23a0cccbe66","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.4-0.tgz","fileCount":108,"unpackedSize":3453082,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBYJHxl+6QI1G+EbROYzDAUrHnKFCzrzIYhUXEpwp0gCAiAoSli124X9xpjjk7E+14aDl+QdRi4zr6saj4s3y6Y+yQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.4-0_1521495780089_0.5726185564835473"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.4-1":{"name":"@fly/fly","version":"0.26.4-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.4.1","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"8264e84cb6c2c84f559053e9f49853b2edd37454","_id":"@fly/fly@0.26.4-1","_npmVersion":"5.7.1","_nodeVersion":"8.10.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Er8cKiS/0GZoKASkkTklOFzVmdvItuTP4PbWjTFJ2hn8Ed8iztL2k9DNqGfy4qP0RMcEtFshzTpos4uNNQu9pQ==","shasum":"3a26544c636f2137df5c475ead4d0098a692dfab","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.4-1.tgz","fileCount":108,"unpackedSize":3458015,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDUHU7hU4DokJST8jywsmaOVrF+sM/3HuUJJswkVrvaYAiEAjALUNrkX+fNNRP1ArJblIjmfdqrzjeWXVFEBYyxGw+Y="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.4-1_1521563884059_0.5804313771626437"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.4":{"name":"@fly/fly","version":"0.26.4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.4.1","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"8175a5cee68eb4f3a6254e6127adc57eb1bd8b1d","_id":"@fly/fly@0.26.4","_npmVersion":"5.7.1","_nodeVersion":"8.10.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-NT1IDSC0EqbGUHUm0jWsIRTZWxr3JnAU84+NQ7Oi+0CyQEr2JwE1rIG4T7fiJUZ/uR8gPZSh1zcPa0evFMo9bQ==","shasum":"c09bb73e89d463e806aff05994f0731419e52d7f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.4.tgz","fileCount":108,"unpackedSize":3457995,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB3/dt+A5asaNqBsDNZXM1c2sES1ysnr648kYQmbdT9lAiBQVz3KI9+BB/fb+PKkwPqLONr/noKWZav2FWroBkNudw=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.4_1521578505859_0.5348436204970035"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.5-0":{"name":"@fly/fly","version":"0.26.5-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.4.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"b53150bb452a1dec042b3b9e3b898b5828a19bca","_id":"@fly/fly@0.26.5-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-YAhBtZEcSI7P08P2RMR5I55hDf6QboOACbKRnp/4pEj53I+eE35a9w8+H4P6aKbHmppYCRpcR6HMdnOendEcJQ==","shasum":"c3490373efc5dafbfd2629461252f0439ddf4bb3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.5-0.tgz","fileCount":108,"unpackedSize":3458324,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGjZrypsSw79DJH2x+d5qPTWV2rg8bdplhxOffcIjYupAiAVoEoC3fnsOD9hUdJBA7N5KPXyTxCzyi5QRI8Smn82xw=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.5-0_1521642969897_0.392326144370283"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-0":{"name":"@fly/fly","version":"0.27.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.4.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"64b2f61cda5de593859970f5fc5da95acb3aaf26","_id":"@fly/fly@0.27.0-0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-+7stx4nGqCuJACVeJEhClWwru4fBbF7lub1e0qfgbJFxEvOoxmtbgFFUQmZtQeR8VV4VAVeZ+ano8iDhRJODKA==","shasum":"84a68bc43bcbc0d93a9dc744eff324225fa52564","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-0.tgz","fileCount":112,"unpackedSize":2153031,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID2Jch+9tlM2G+G9QyPh7GTMRMCp6ZW2hkB/cd1CyMn8AiADV6t+BkHs2i7LcfhVVoggtW8fHd/fzIPaqszf7MPFKQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mbyczkowski@gmail.com","name":"matahwoosh"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-0_1521666197719_0.4423087003525197"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.5":{"name":"@fly/fly","version":"0.26.5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.4.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"046574f602f1a8c2037ed610b7950f16cde42b4c","_id":"@fly/fly@0.26.5","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Vt966JltQ3FmddieEvQVFYhWXOU48evReHRKqt7wbICxt80r5QGR8xkztUsXWkPLYjHp7eawzU3RRMVTgBpsVQ==","shasum":"b08b2b4e50a276a82f6cb992789b6b8b6797aa19","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.5.tgz","fileCount":112,"unpackedSize":3467803,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZki/c0GDoBofVJ7bJHpdInAA3HMJRX1PMpRXS1QUadgIhAO+j7eoac8e+MLBZZ+fageWZ/BZy0d7cvqvmRa2recY+"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.5_1521736237586_0.8537541643698312"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.6":{"name":"@fly/fly","version":"0.26.6","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.4.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"c834a5a6f0d1007518acfffca5d4bd5937001d61","_id":"@fly/fly@0.26.6","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-0JQQxD3O3hNSVZxsE+h3s4Vpuo7CnVU9y9qUFzl+fj/scGy88zURA50Q2Plnve4amGC3+hZY5ezi092HmK5dLA==","shasum":"2b11f5d445b807ac5d08d4e0f0774bc216b66f84","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.6.tgz","fileCount":112,"unpackedSize":3468067,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEaVLl2IOy7Eu6Vo+f3hlcFZu4EN2rOr/+CPZwnlB9ZHAiEA8PoFX82yJsEcEf/ZxTHQ8x4OW3SlhiC1Epe7hUuz4Y8="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.6_1521804305653_0.8525633795726504"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-1":{"name":"@fly/fly","version":"0.27.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#master","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"6eadd1bf033eb91c0c2e0a90aa7570d0a5f72dc3","_id":"@fly/fly@0.27.0-1","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-s8A+cmm/LqVT+gDLkqTvRuYeNeRuOHjPfDj8O7ZK9wbjGKXNpByPl/i4GIYlDJMwoNWWZye07eN7fBCFS1q98g==","shasum":"61eb5b9efe8c3fbdf2add8d369d3695d66bc44cd","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-1.tgz","fileCount":114,"unpackedSize":2079858,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCh4Kk4hO/3glAshLYjLEefnsRyStuA9Qf0WTZ3Y3KwwQIhAOcFySget4fruRqjbn4PZUpJl9d8sZJ3f04KwRHzfq9T"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-1_1522073383016_0.35793913360664953"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-2":{"name":"@fly/fly","version":"0.27.0-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.0","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"c0736ed1c64625b08fb5c636fdb759f293620a51","_id":"@fly/fly@0.27.0-2","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-ec2Pv9ONLvWzdj/+WgINcP3nRH/MhP7+7o1kito8/nZjrn3ZTQosdWfjrDON7Bh+qx2cK8FWqzYoD/mlyGUhAg==","shasum":"c15759df0289f1399cfe585f4acd5862d64e7ec9","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-2.tgz","fileCount":114,"unpackedSize":2079946,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC6y+9bjV3y2H6j/rgvHZWURgNuw+tA2WVPGVr9CLoskAiEAlhw5zNcG7gij7kmXmAm3FNYSRZz0YAM6WQJWOTe5vtw="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-2_1522173973360_0.6288284689879957"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-3":{"name":"@fly/fly","version":"0.27.0-3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","doc/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typedoc-plugin-external-module-name":"github:superfly/typedoc-plugin-external-module-name","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.0","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"3c96f5f4eafe33f77f9282f222505d81ff55cd75","_id":"@fly/fly@0.27.0-3","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-SKvmHMsYBb3gcTy47jaBt1PVkzjLEgjIJqVEgtXMCOnZBJDJsdIBnBR4AFl01jXW6HygeNYz6+n8CzsiSf3EYg==","shasum":"a08bf865abad5bbfdb041126a114b93ab6923c2d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-3.tgz","fileCount":114,"unpackedSize":2076750,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEDPjk6UhADCS+tpn6ouPeuLR4mSlS/MSSn6ZKQ3+G3TAiEAytGPWc53F3mPZGjxmRn/5BkNBV/ttpgu+FadUkeVQPo="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-3_1522254581753_0.5240941324290944"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-4":{"name":"@fly/fly","version":"0.27.0-4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.0","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"0c9ff49065321e47891e0b29dd5611cb9d9e5fe5","_id":"@fly/fly@0.27.0-4","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-1gtsxffZy/nU4MV8MnE9Kn199P1Cd9D0cux/QwbQ82bBZsOVw/YfKeartxDEqzvA/1J95fvyooOw08qItG9ozQ==","shasum":"724433308b4981ba7ef5b35f98a9b5bc1f1d1b50","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-4.tgz","fileCount":115,"unpackedSize":2180501,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICLm7rcPqE4xc4ofySzQNRqzEEog8C80cDp5EwmNYXPnAiAB2vwLE4Epp8Nifb/owLZjZvKMZk07xCCSfzqnhHH6lg=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-4_1522418445768_0.26954708427178353"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-5":{"name":"@fly/fly","version":"0.27.0-5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.0","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"c3c2cd824be75158c855b0e93927934dc4357a45","_id":"@fly/fly@0.27.0-5","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-2bGYMlSJANt/VJV6+7TP/Bt5omMXCo5vBdpH9U/9rhUD6XNqx70lTqueZJCnvpu1QM2BV5Wklnm+K7vwGUvaGQ==","shasum":"c3a73361dbfa7e1770583c6043d1b9cfceb12c20","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-5.tgz","fileCount":115,"unpackedSize":2180562,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBmse8IDKWMKBHQLeuXNMwmh3QBk3aQfAQGiFNBVOjrHAiEA4Bm4MFqEnUgfbvqJhCawhvSDOe7R4PkeiHe2u9JHO7k="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-5_1522418827038_0.6605773922708329"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-6":{"name":"@fly/fly","version":"0.27.0-6","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.0","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"004c534547b751922c8366cb4db5ada305b54cd1","_id":"@fly/fly@0.27.0-6","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-FD+A+jgEoS3xqnqLNMZuTD/CuLV+FeVh5SKB5V1uHBaeCQHLKEwwAEoJ12SCESspgY2AKYTeL8OkawB1CFdczQ==","shasum":"b0f1a74d63df4277bcde783a51c0cd7b3eb2c1d1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-6.tgz","fileCount":115,"unpackedSize":2182002,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC961Lc7IRiHKoY7i/vKJEsY8Nm/uSijq8PDA5i9LCjDAiEA0g5dFcbHN25h1kN8WbWxDHlI4iIEbPVXR8CdzKGybhg="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-6_1522420282860_0.385536968326889"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-7":{"name":"@fly/fly","version":"0.27.0-7","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.0","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"d6f6416349bcf5c82e96ddf146716168ead70ccf","_id":"@fly/fly@0.27.0-7","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-gPrdxJWurrTmUbGZom60kNa6cUmqlRxdZ/61i5YLGfUcEMn88zAqXxBm2gknTF15sTtiKvgc52aW5fjyH/0WnQ==","shasum":"f5b01c8f92fc655277b9ac5d82d95c6fb6899bcf","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-7.tgz","fileCount":115,"unpackedSize":2182654,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDaZWTZWgz8OyK+PF+Nd3ZShASY0Nx+LSjyrqbgEwKuuAiBKh4hZPwXdbpnT3e+/6kfsB3kYbFN0GyPGX9tbWEaZDA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-7_1522423220467_0.45997950011775757"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.7-0":{"name":"@fly/fly","version":"0.26.7-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.4.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"d18252200f3076b18c45cb3f4031fe6610afc455","_id":"@fly/fly@0.26.7-0","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Sg9ohBwVgmlXKWeFdXOSTu/JW8v7NygBODYnQPdPEbTNpaJhhRyCJ7aeUuqjlyi/m4+P9oBkkaMullalJ3R7ag==","shasum":"058a9d6299cffe9634033e3b5823676bbffaf407","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.7-0.tgz","fileCount":115,"unpackedSize":3553774,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHIIR0ZfT4pM6xARYMfjVBmG9pPM3LXkVFsYklvYWf2VAiEA7nlLClETc4dQ56GSSJage8WXShF3mT4KbrNibHXMj3U="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.7-0_1522532785734_0.5919897217256382"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-8":{"name":"@fly/fly","version":"0.27.0-8","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#thread-log","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"ad74da059e5623b497f7c06bb2850818ed0fb9b3","_id":"@fly/fly@0.27.0-8","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-5dQr8YHn6YtCGKZQYV/NrCcI8LEFoIguOrTU9ohBWUEyr84NAlGYw0NDVMN46LIBCijhaE85Ayi9t3eE4yfNJA==","shasum":"ea2f78bb0fbd59dcfb4d91c8c536099a651ff9e6","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-8.tgz","fileCount":115,"unpackedSize":2180942,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGAu6B5NZpE5POpQ7dzr1k05SCMXX4ap6t6nJ9c1LseAAiEAyhrVy4mtYHYRpX1Tx6Gsp6ZQ4lExjzG98EPaiIRf/OE="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-8_1522639484671_0.4347825075901781"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.7-fix-hangups.0":{"name":"@fly/fly","version":"0.26.7-fix-hangups.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#mutex-test","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"85d8b47f63ec6e8d79dc041f25501a9cd8ee41a4","_id":"@fly/fly@0.26.7-fix-hangups.0","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Ddxa2Us0cj9IAn428+BXDpvlVm+XQvTbC6Kbgj8sRhmyFGyaQ42ciutgCV646GDxYqEGbtmrVy6SXlsRnsojbQ==","shasum":"05cd851e15e5b23585b91c74ac5493dad84d9f94","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.7-fix-hangups.0.tgz","fileCount":115,"unpackedSize":3550966,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF0CeWPGeV6W450e1qYhynJpHGCVXeOeT/QWhwkPtr54AiALnqJGcOO/qT665wD/4RmrJsD20yC4tyJRoHL7iz0c2Q=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.7-fix-hangups.0_1522694716734_0.3427050365646309"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.26.7-fix-hangups.2":{"name":"@fly/fly","version":"0.26.7-fix-hangups.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","text-encoding":"^0.6.4","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#libuv-tweak","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","spark-md5":"^3.0.0","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"f62afbfa5d6b54b1b0e79c63ca65e2df40cb416d","_id":"@fly/fly@0.26.7-fix-hangups.2","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-at3KFIwR7k67opn8L2h2bCz303bHD80IQONWTd1dL5jwK0zqCE2mqWecUhWhx9LJMWZH2c3AiOpPgUnKi+mUZA==","shasum":"0ac708605f6af3bc084577fb8f3c7b3702ac7c69","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.26.7-fix-hangups.2.tgz","fileCount":115,"unpackedSize":3551297,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD34vRozlSvRNLDrJ4yCMUNB4zPpiBkTMlIe0cHKG4+BQIhAIxX6jTiIfb6KSIq5ANBwhVWc8cue3W+JllU2Wvyx+PB"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.26.7-fix-hangups.2_1522760875385_0.5061418992539171"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-9":{"name":"@fly/fly","version":"0.27.0-9","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#libuv-tweak","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"b868a62f10cf2529657ec463872ae15d9bb4eed1","_id":"@fly/fly@0.27.0-9","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-xE+bFQnReKPA6c0fYJpwAWww0KVq+mTsS3hPFcUKb3VakML6JAUMIA8noQ8ruZ4jF3LkJNjcv/brI/HZMz/MYA==","shasum":"3802977147e95d3fa258d228a8e46732e798a55b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-9.tgz","fileCount":115,"unpackedSize":2181059,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCb5fVIWLprGajuVNirPlADDvkBnX9KuhxlFH4BMYC5QAIgKHtnel/Y68wh46AnGemmjhIZdk1gB53MMN5F+EIsIFs="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-9_1522765910417_0.552893802874703"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-10":{"name":"@fly/fly","version":"0.27.0-10","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#libuv-log","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"3b8a564253f8552acd6ccfcc6c18f734cfaf3623","_id":"@fly/fly@0.27.0-10","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-9MXF0gRYNrqiDgcOGGmkGtT3YaCX6WIDi7GyxLavGMX9Rt4XXGnS9s24Jnfue1CCzmlXA3D5i1/PyG0sy+vmLg==","shasum":"f734f9050b85e75d1a92538be5d9c1193fe055c2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-10.tgz","fileCount":115,"unpackedSize":2181177,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4HNJrmQI31KDuqyAZFd05yOxBY7rfyG52xt3v/zEmQAIhAKsOmSSGbN/qg3P0ALCFfEEGtQSSNugQviup35K42Bk0"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-10_1522778783547_0.8725299802620943"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-11":{"name":"@fly/fly","version":"0.27.0-11","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#libuv-log","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"77d2a2d20531d1033c0b53a73a1e60baa3d59773","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","_id":"@fly/fly@0.27.0-11","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-ofEQ2BfDvIzIzfkdsUIoW/IybRLkaSJq2UK5lXYgu+oSNTqG5N+jDBSrxRlq9+iBy+LQDizmNR2YpG3VCliNjA==","shasum":"88af5a649f4afb892dbde7be392732809640fc57","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-11.tgz","fileCount":115,"unpackedSize":2181297,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAy6CzHurN8kwPcmdfxxOY9kY9dNAxPbQR7HLF7vNEdJAiEAnwEL3iraZg/yteSxtNQVksvxupmLoh/pdR0ZIRfs90c="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-11_1522846833530_0.6295515146180433"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-12":{"name":"@fly/fly","version":"0.27.0-12","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:superfly/isolated-vm#libuv-log","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"648714d47a19db6015fae994c88530d29c8bec77","_id":"@fly/fly@0.27.0-12","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-uHrtZ3vdTxpMvoJObhHUyVxqKgsvbuo4tQc3eROhL93ai52s9f0AP2W2linCSkNrDQfyz3rSu6+3PrOTDys/rw==","shasum":"668b8e74df34ae14014458ad830a55ab924bf2c4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-12.tgz","fileCount":115,"unpackedSize":2181417,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvaed9N9KhiEFysyRRWbS689UltzpaQ0laUoc06biaJgIhAJCYecbleH0qqWhJQri16fnf25A/uzer5f96f5UHNSke"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-12_1522852450600_0.6946238771225794"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0-13":{"name":"@fly/fly","version":"0.27.0-13","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","devDependencies":{"@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/concat-stream":"^1.6.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"^0.11.1","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","concat-stream":"^1.6.2","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"github:laverdet/isolated-vm#master","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `Stream`).\n\nYou can [use it locally](#hello-world-) for development and testing, and [deploy it to the Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is alos supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config in your like:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n","readmeFilename":"README.md","gitHead":"891a97b7558e710a4fd149ee9076a270c43c8fa2","_id":"@fly/fly@0.27.0-13","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-QPDTqhTD7oS2o9nOsAhO22U/ZuxMkFd6EgGnj/yNTP57+MIVl7R4EOSExSFmFFNt9NUVtxBsubReLwLTH6Bpag==","shasum":"9be758634ca682897b4a343d2389021c16b39144","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0-13.tgz","fileCount":115,"unpackedSize":2181534,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9wL47/g/4A2wkLdsUE4HWcICywhb5TRUIYYO6Iur1OwIgBYQZV6g7t2RWvW7dS9B1PEu5El0CPE3LYD9wWSPXq+k="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0-13_1522890381208_0.4879453629844024"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.0":{"name":"@fly/fly","version":"0.27.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.1","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"d8e1cda211243a5d479d8941914ea2ff97367e14","_id":"@fly/fly@0.27.0","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-yh8s+xa+J6JJA3K7VpD8FjUXvfW5ZMjn56Hj9DjxQAd836ukf3oAeu4p0Wz5DYruZR1HXubfntxWuuxzaAtOaA==","shasum":"41fc88b2cd7a06a3e766f36d70be4f3e39bb2bc6","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.0.tgz","fileCount":147,"unpackedSize":2754003,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRqt9Ap4N0RFHDq30xiKXDbbu2cUmf4twfveYECkAiFgIhAI24CCmXB0cU2V7QERWkW+SUaAGVscdqlzHw5g+dw/Dk"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.0_1522952603048_0.942948206245223"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.27.2":{"name":"@fly/fly","version":"0.27.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"cc8e1b41ccf0a334e23246457ffa527627cfab87","_id":"@fly/fly@0.27.2","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-cRjOOXaOw7bgkycIFj8Gdjzs/nK/zXwU+qIQXqO3/341wh6cNRaz79x0lfV6LcpNQqaJMej2m7OkNNHjwfLclQ==","shasum":"814664bd7bfe2e8e5a13a99e562f0ae6a55ac730","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.27.2.tgz","fileCount":147,"unpackedSize":2755851,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBL8u6PU58FueKbwfmswrPM9SkoQhY2kaXpK8faU+P8cAiEA3jnX7qxs+c1Jh+VHA2JuAw20YQdDtXbhgwvq20TssDM="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.27.2_1523026836774_0.7354573419380201"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.28.0":{"name":"@fly/fly","version":"0.28.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"3132473d38ca5fe1c7a4dc06ec9ffa05349c485a","_id":"@fly/fly@0.28.0","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-8uHJEZDpxhrlhlAX8DX18xLDZ8B3vqGBnAWrKyY0ULmIkSNNF9dCY0HfZLY3agSl5mrVjZGguRsVKLfPbeNN2g==","shasum":"9c122dd4d1ecdb57c2a990a711257234047bde80","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.28.0.tgz","fileCount":158,"unpackedSize":2800019,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGkylfB2iq8zX09vB9TEaUw9U88r081tEov/wfU6tmU1AiEAgEp4Vwuq94Pu4FhEkrJLdiBruxfYcIuRmBmPEh+LMsI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.28.0_1523279668351_0.46522917034203415"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.28.1":{"name":"@fly/fly","version":"0.28.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"fafc55a66cd0cb188d7f2bf66094776ac3ac7172","_id":"@fly/fly@0.28.1","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-h4dJGkEAK/pibd8zZLhVo85ybDyyZ1tmPYK58lscyXCxPBIagt939BA5td47mhCZUS6nf7UiBSdgsoGEhTaw8Q==","shasum":"756d85265f0a06a22301cec86e52b5e010bf153f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.28.1.tgz","fileCount":158,"unpackedSize":2807002,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEcJuC5W7MScwl/CCoukeeEJlLKd9tUI9aBlCXh5flWSAiEA3rXkDU6p2hGJjWAV255ZcVvEOcWEjxeRYlIzMzkzOVg="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.28.1_1523366288347_0.8816693747235034"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.28.2":{"name":"@fly/fly","version":"0.28.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"5382440b071fb5f04758c7f23537a5a96cb57767","_id":"@fly/fly@0.28.2","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-69tplKaRisrSlgtiKspYfIdymHAHOz4kq5gT1q0thYivkqB2amcAbTq6n14Z/6MMxbwmp72bbHsG0Z2ddSImmQ==","shasum":"75458d52c6fcd33cc34e8d02c2507cb237f3c766","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.28.2.tgz","fileCount":154,"unpackedSize":2900905,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEseTRQ1KLons4tYpACvpIHnd4Wdwj5Qim88zdbyNROQIhAMMHUxQygWf7oI55Q/Mj27tzFIEoG+otQTDfxlZVHVED"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.28.2_1523541565294_0.44174797191890325"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.28.3":{"name":"@fly/fly","version":"0.28.3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.0","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"0e994fa138f45f6e281a30fd6167b27e394100b9","_id":"@fly/fly@0.28.3","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-5pUXtxBhg0sxomJFDImwVYiabzr/FfE6GGuUjOyk3mwjy61+DENZQxD5Jj+2jmAHNlRm6ATUpyJWs9E0GEFl0Q==","shasum":"89eea4675c7a658736b030b9b4af0e256714e669","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.28.3.tgz","fileCount":154,"unpackedSize":2921261,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE0YFfQ4CPSSUVlTKzUOr3KvUsQa6r0XBN6XxQ8+M9YaAiEAsousQD6YWQraEtBEjGGKOsrD8OAH+OtjPosyN0R3PVA="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.28.3_1523573066499_0.060149509481524754"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.28.4":{"name":"@fly/fly","version":"0.28.4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env/testing","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env\" \"tsc -w --pretty\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","pako":"^1.0.6","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"db1ce2cde05692698980578efe3334bf94dd0161","_id":"@fly/fly@0.28.4","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-YtIIKlK3+QzKkba4I239VKeyYxt2446S11LvIhSTEZPRH3/J6RbI1wFbxjh5M90d20irJB8en6jDMhaRZhFNZg==","shasum":"a1bb767b0ba8f698cf301588ac20914c9a7b9a03","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.28.4.tgz","fileCount":163,"unpackedSize":2962169,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAgsPj46xWzjENit5nkRJw/sRdK3BC+s71xDZcRfLFbFAiAnuP7Is3tQeztaWtLbmlyJWECqFB+g5XruCZxoRT/CLg=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.28.4_1523645909554_0.7233504976003842"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.29.0-1":{"name":"@fly/fly","version":"0.29.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"dfc9a104896ec58d4533ad355d21f81db3f6acf9","_id":"@fly/fly@0.29.0-1","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-LyxqIrLsMRcIv+cBRfuZSWT3GR7HYrryvmuvOYhFj5guje6039oZKW5YapXozVddWjz+MMSiMVlEnqvOx+KmaQ==","shasum":"56e15319e2e39723ec9a1638c66254dd7ffce000","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.29.0-1.tgz","fileCount":217,"unpackedSize":3083849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa2e5qCRA9TVsSAnZWagAAmAoQAKHIOUiLT8D+efa0CJYW\nWs1RUZUdhgHwnzkqC12+ey79j5libyvuSnEIBtOHbGbwywY++OhNPlTKqY5j\nGgMZrMsU+kcW+KBsPWUQijeXqf+ooDwZ5+JcXKAPWGjVXxtmdSSsC7ioCdC2\n3XeGKuP2p34jUguzm6X6KC15Rgv8MHb6jMhm1wcCZjzZ391ua/4x9WwIXe40\n5tl0boEI21OvK8clz5PaLruIY2+PEBKQAYnmTbu6Ajw9ChOlzpc1sbQ1TLtS\n7cH73yyeWjWx6GbRilZWi+0QuQ/+BtzjnA2tImere4fHKgNiSiDg3etom5J9\n2/hTaT23MXVIxfTD8GcUUTkzdbLhyKJ1+QJKV2yoFJFsbFQybqAB6EMfaKbx\n9JHRYQ6O3sGtQ2dle2xVc7V/M+4lGXW/HBXcG2r7+Z1+8cWtl3BWMjgEz7FD\nIRF7hXW6z2/DJuPUfuKA4d6XP/KLzGNMFY39+Ms2UtcZUGZeWb+biTj24zDc\nHFjDS3HXGl0WM1w9lgXBbhRHHbcO24nPFFdtR20z6CvBPWCI2ZCYIGe8r35B\ncrmZ4WHclsemi0A0Cu5mJ4jlFvozi+hmCjH4ORX87OZ/gHH8utZ2CrDRXZs1\nLJE+ojyBUv9LsqJANe7IbS9o0Xf7NOyXcgmW4At2CnMnKual51bd49pxtCg5\nhlcc\r\n=094k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDd8XvE/ZFF+3Gpi314FuNtdIeTZcn7brd8BBJ2FczA9AiBjuP8qBcKjGmrjCXWzPHV8Xzp3inpwccQWL5W50icM8A=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.29.0-1_1524231785619_0.9555179716962883"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.29.0-2":{"name":"@fly/fly","version":"0.29.0-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"7f6df331da7d70e8c43996980c7ff6cb000e907d","_id":"@fly/fly@0.29.0-2","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-DW+yBOGsl1wPe6l6J6toiy+jYtla/5QYCucJ8FPz5CFB5wQ7u6SoaLnHOpLvQNxoB+Ken+P0xFhnD3zqeWy7YA==","shasum":"049bcefe35fdb2bde499731f96e340c7ff1c4316","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.29.0-2.tgz","fileCount":217,"unpackedSize":3083499,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa2hMQCRA9TVsSAnZWagAAh0IQAKUQGCCzdZqpfToA75iG\n9t/JQt5PaSwjHqdnjUXvELNCy5H8s2SPn/FmhEvQpL1DVH/KNlEfYZXniJuo\nrDCKIEKyp9YsmmSe0QYQSl2m3tVwJTXha64PV3pipYYTQNWmu+HcUUihaClk\nV5dny+4b6Tl+pPh1IoTUVYj7IeHzz1x8AlH3MuF39h3iO2+yYcUfS+vQ8lLH\nI2CtrAWMIUG5mF1B54qkx/4LqaJds5NSmrzTxKb3H7RJd2VjTKCP+WzfABqn\nyjUnRf4cf1Pmuxtzjj+8qjdM/Le/uL7+SqmMVx31JolrORQWwBWURdmDdTCD\nF00iwxtvp4aYEntyXUHC1sIUrCmOMIQxP+d8ybTTpv248y0+IP1VYDk6DA/n\n3tOCZaNy0BzY55Xww7AEBgJmzNfjIe9DM6VVeW9WXgs0OBy7ZnvtTOBz8l4Y\ngWgpEzG/AzyMjOmiROpyU7qIbTZNyC93rLqyIBRkvSAIkOakVRMbzgDIMK35\nJIaEDWbbZovDsU9ydv9AXLYozRMhkwKOwGyV0rbbyQvhH3jvBdL2fX1D+eCO\nfUz9v9vxn3i10adkfZztNcMHOubVHAWQHs1s6cdI/hOjrTwlyXtDcfE3IwBU\nFLTX1Pw7OOmYmfy8pis9nCOOtXEeGCxp9mV5onLX5jl91XmOCsD8A1KihpSl\njbvR\r\n=LRQG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBcvmoSv893MKhGfFxMF/Uk5XLezt08tCbHPe4QOvmoDAiBD0g5rtttEwl9HiCDC23Pm633bpgJgv2YSnl6tMIx0Ow=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.29.0-2_1524241167577_0.6656158231709051"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.29.0-3":{"name":"@fly/fly","version":"0.29.0-3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"08a7c623adfea4d821b2fe2afe96a351cedf63d9","_id":"@fly/fly@0.29.0-3","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-TLMDZ2z2kqZ+nJZ7k3baoI9FDoBDcYBq8Wsgkv93BV1Qmav/av9Yosua+L6os78PSMM190U0EMhy3WanuoEvNg==","shasum":"3a305bfdcded60a4ce86c01340ecef9f94b6abb6","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.29.0-3.tgz","fileCount":218,"unpackedSize":3096696,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa2iSUCRA9TVsSAnZWagAAGBMP/3yAQPG+CGmr9Iq589pE\n7q3VTqPQ+iwrfIJG+d843L4W30nIN48VukZD/yRf3kAWBfQk7fslXw1bhZ0Z\nuv1UNkfgWBOimHwgB8ak7UhOMyBcse9QMQIZSwSm1iRtD+1anJeydbMIv11X\n+V/hKbxSYYr+9b57eqHHzBc5CRx3n3/tTb8UUCFoWlMdAHSf8QTVRwLlIn8l\niv3/2AC7CZ468jIW5pNiVYguL9CzjSRiZeTe3LuBVUmGM4Ipzq/x0DPMNmIy\nCxGY+Wlwgvp/IqEKVb09BDk5F1s5D9mEcsJsWL2gg83OFAJuXWcSglyGtftt\n0DDhuweP6j+2A3Ygi04hDFqi4YrbTyoxzXXnWHYVVlORC4SsGbF64+k2F9cp\n95vWwp15PSl20pfFXgmV9GBy/PwZWmPT6Q41Zfp74vewLgwoi3wyoQQd4GHz\nRrOJhX+ErDW6sMlFHN9gOrwZJbovP3mWt9XpP5FPy5Pw6/GzBeYLiFVBwpU2\nj6z/Ci2xj1sZo2PJjcrv/Q+yGhGQQuWoCOekkgKV0CuGTlYV9063NKUQjvPe\nRjwga8DqNmDuiVlZQW7x97MsxZ/oUyaRWcnOfb6VwRYrcykEJoOxn7PH25Ii\nRL2EYP1de1JO738kS3OPttjL2MwxPx7yRG3YIOHitYPw+Dq/zuQty7LNIQE7\negLN\r\n=Tb0k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAXwzR6WZeorPyDfj9zEauJeX2ZCIP/jEd8tpbo4SuDTAiEAh1JGFRzQzMWrFkWecEJrJ5fx2hvMQsP/DU1Hn0EvmHU="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.29.0-3_1524245651468_0.22995527041249697"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.29.0-4":{"name":"@fly/fly","version":"0.29.0-4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"56aad1e7ed0d162f06313f6adac3c337554cf1d8","_id":"@fly/fly@0.29.0-4","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-buVjRnB5wHgChJjddwR6vJ9r08dRIzR4ZMkRHxIPLhNFAOBihGTgg8SiZm2497IuRh6t0FLLzcVy+FfylGwF0g==","shasum":"f6bc9bf8fcad601c38ca870c871b1e432c4c31b0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.29.0-4.tgz","fileCount":218,"unpackedSize":3096862,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa2jjwCRA9TVsSAnZWagAAnaMP/1Q7OB2EdSDhbQPjny6y\nwty72r2zpSWsQAIkoh2poLGEr7kNCaKMVJMp32tqdcyLbn0rOp5gbx27tBPr\nTaCFrGM+BA8zilod7zszyxKcPGBDZT71Csxx2ZdKTWo8x4Il10k/yeB3A7LK\nIopkoyqJjBblhUh/hS/kyVJ/KjvkERZrFTwgOl1yO24RvIkEqs6tBY59gdOE\nyHP0nHmpoucsZbO/499fI/MNjsLImN98KP+zs0rEeaQhdDqpupYyGpsV/TSx\nJNxihJnNZ0pdBJU8r5c2Ld/3rA4paXgb4wOV9HPK5cCbew2RUR7dPqZZJA7c\ntKpz99MaWKg1HGgS7u9EOGJEviZwqQdvoe3Wq9OgVUrL4NHDXPvF+xMBD8ew\nGZ96i3Ff6kCPOn0n01cRBbVLs60Qk+iDjYc5Bs66dLBBdD/UEI9ZB5mstNQy\nHF8hIYSoylZnkiuKtcmXdLI+0D/TDb8JX1Ly3IuFL9h0iQXFH/TovPoXMKRz\n/QFTvVTMcDcDEmw3KCzuXDjS5J3sbC60en/YkEFJxV3qZcYqLhmuSIeUpgLm\nln6EuCFqJhHqWHu4d21Is1WKBXB9taKl7wWL1I3bqhPA5vNPThhqUoie1VtK\nIK03ddNlQqv3BhxQZrbJzX3M9MgbXmDF7m3M3AtbLJ82lgYDc83bNJLClIE6\nxvq8\r\n=EjCt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAf5Wk7LYEknRdtdfOcy2wpgu3NwRVVRtkJuKnaV334vAiBH9SZzRvQhje669VJ3tBt5rvT6mGc6R+OEKpf+rYpF6w=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.29.0-4_1524250863790_0.23541606724132458"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.29.0-5":{"name":"@fly/fly","version":"0.29.0-5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"b590469551334e7e412cfb3f3a9373bc9cab5d13","_id":"@fly/fly@0.29.0-5","_npmVersion":"5.7.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-WvIuVB09beTaHWVvynUYsa2ilw5BeIIdJMxIW7PkpwkuK8KnCtQpa4eoFTKxn3Lqz1Dg3rDVd0L8kttHRqXb5A==","shasum":"0615f40d17403b700d0ca886eb6e9ff14a80de04","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.29.0-5.tgz","fileCount":221,"unpackedSize":3062510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa2q5jCRA9TVsSAnZWagAAXCMQAJfWdsFsazP04ZpNKUVZ\nvpEYYrrBs8nbDQQMWGVw/bvGcFVLv78oz0sGuu/QmDMop38ywy8Wg/LcgKvr\n5+/3oqqmH75oWbxNTqiu+IfcSSmzZ7NtylA1jGA0r+eee80TeCX6/7l5Xrog\nGnyc9ol1DSNjk/2r1oqnPFG7zjayJrWBlyN/RWP2qDUtfmfkQAGrdYP7ojqA\nMqbZPueS9OPfb3IN4zQTtnwrtbFp0QaaafQzHvMpMa2Xrqx1mI1gpjdkS1DC\nRpoYJD6X/iJbWx9JGXrKFbtw+aqaSBBsMDT2TcK8xnxyJ3vMWPSfIv28PNdy\nqXKPLhkxUlxqU3flpR2oDTmEz2PX7RKDVExlXmZwPHG7KFpvlDmmMe82l7vI\nER7+Ppczf/1ZfQpQfeshs4B4J12KugBd+XcBwP5Vrqm04FKdAx8wQfR8G2BO\nkhiiqhpYy928iAu6065cgrm/p+G7tAlFNB7Ny8KemaP344iuMO1lVgziNrro\n0eW2Pzo6R4ZGDid4PwVLASfycZs+fnQWkc/gVIlT0RwNvsBoBXy+Gkms7aaW\n2Uf8d1AfUMSqIjWDgVHScXd+A/Lu6hScRFYyvGlC8j/S2a0rFKFyeWbEB1A6\nD6vKwkpgrzCDkS8KelWW6yI1D6bRCMhhV6wCpTo/gdQzh03J/CSvJIhtOWsj\nxcsA\r\n=x0PU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEe3h8k5SsJZr2t8cdbI7aD71wLorgHF8s62erTq3lsGAiAu2rLVnZDkrIOtNjZ+qZ5FnlVhCxoN8T0P4yLEcq1cVg=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.29.0-5_1524280929549_0.4312819852882257"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.29.2":{"name":"@fly/fly","version":"0.29.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"tsc","build:v8env":"tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"bff322d7c86413c8d7e04e4b68b435ae5830457f","_id":"@fly/fly@0.29.2","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-BEV1tkS/2ScmXvzsodmUJ1TE59jkRhKgH3t7IHi0CFWY+CMiiHKSDFlqDtNq+MZfCP0BOww5qJX1h3wXcMHe6g==","shasum":"7917b1eb2667696d0fd66b40c1dbb09fc11c7362","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.29.2.tgz","fileCount":201,"unpackedSize":3048537,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa6K6pCRA9TVsSAnZWagAAKMEP/3Qw5Qg223Ar9HfUN/9D\nsgBrBy7vsfIjFy8ak8XtErpcFCI1PW9rJRUdCuXY/22K+WC7PuaQQG4FE+r5\nVa9i5gQ3wM8GF8o/UZP7Qu0jDBK9hRcI8mz6YJtql8rc4jsl0bvlwEw6Jqze\n28to8vdla0A3LysVBTL4pH8FsEZWWVDbJrnBiN0jgIqPD+kC4nVP3UzD21sW\nHZlgC58olqhF0An8SrwRGVsLmUyxvfoeCy8bQ/E+28dplN+i1elhcyXboTmv\nUOTmGb1iFGAB8hiIcKRUvWJxT2OLtgb6yYnvqfetADSEOy3dwmi2PwA1TwpE\nbeNw6CBxWM9TSOtNmBvnJsVoWxySgvjGI7lHoIrjwQiFBUk4PMpMGbvoBzQZ\nYwH5QBcmeCU9yWqcYaYI9nqMiXnId4vze62WiIeihrg2XJZIXqIF/u38Xbqr\n7M0ACJ4RYpv2FoylB9Tf1S2CERjRr6+7C1ASY4pIObF77VkC3pi4dWNuhkWJ\nwry3hz7MjtovyW/7ZTFFVPkDd+/sOH73jbKTPzEr9VYSBp5CcYS/vUvvUEwT\ntUJrnemuTAyVHT+t6Gp1mSvv4Uq3DdeEOedpw9F/FoyMYXiMZIjUqt9HpiQq\nSEmfxffjVvPOJgcIMldejTQuUNynK+6zOdo9adZIoddo8+j7ugrHpIBqg39y\nGFWm\r\n=JyVC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFvTC92HOWTCALPKByTKp+2N1TrGnD2Js0Ik7P7k9oZ2AiAbYub8nMXdbHBVrJQclRBTnxJE9YgF2ioaeXx1Ih5AGA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.29.2_1525198504096_0.6902523862515668"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.30.0-0":{"name":"@fly/fly","version":"0.30.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"bcd584fbfe1bdd45740a428c1858c243e773d051","_id":"@fly/fly@0.30.0-0","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-WBEK7aUEabBf13EuNlxOMl8h7y99xDPUgfk+G96YHesNbPdvWaZ2VVSKj8HhhnuEThTN3aFL4O13tn5SP+YWXw==","shasum":"ea376431bd63bcc70535e79ed248cb7b77230cd3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.30.0-0.tgz","fileCount":201,"unpackedSize":3052042,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa7J3xCRA9TVsSAnZWagAAA6sP/3RGUSmVixA41Lx7e50T\njipXMkvu0Ey1c9rdgrsUDFj7ii76qtg8QA+fOWHod80ZKjEI5F7ey1puefth\n/LjMsKH7nJfcmhaju2PxlLvJWDvwKiCPAJsHZFCE+BD1TKFwsRiOjxMql1mX\n09Omu72LQQ6kuNghhL6R/BaDGIlZuPB2bMxjPb6V1bFSZmxhk5qKGHpu7TE2\nNhUAQIJXnfSWVGWVZK7+hlNOocYMzZ98OhFzYrE50vgVtiKs+GChA4N9xtY1\n+37eMLJD4EOmnjW6lq+Jbny1rhF6Wlm2hJ5lmZK1kG1Sux8rD2IiMXVO/PWG\n9EPjeNN6a+woXMKD3yRVK/z+0qkgkmk8XE1XpxkZUpPqOCfbfCD70c+0jy1v\ng8Vyk5kFGPjoH19oTlCOYc6udrYsPUmdqFq7OaVQp3WCshQAU5I5CQZvqqz9\n991Lb9OrP9B53SR1yMkGAGG0DgDWh9vXrpWOlNyRCfw7DlDEOkEZplg3NY9f\n6aboK7KXXnEMCX6q5uiYMdIw1INnnZ1/9SXWLf7stwOO8IWq2tu5m+nI+m5f\n9QyGRm6oJ/qnQpeUb5cmfGY1T7kPxaJT2L/0/vabHiDkESdVbvT5f2sUBBy4\n3pIFIfeQVmq9KDZxPy4nVlowSu2FwkNbRjEhDJqVClThj3RRSo74u3D7yvmc\nIA2y\r\n=Mxq/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDdaJSEWd9tqHz8tWi0Pq68KfwHib046PyBepSLGWqYtAiAPRdyzirqVHOoU7k2ElLs3qkUjnqX3Z3rFtpErnf7jLA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.30.0-0_1525456368099_0.6190123828715188"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.30.0":{"name":"@fly/fly","version":"0.30.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"aa5eca9055e9adfc0aa1912ccc089b6e3ecd02ce","_id":"@fly/fly@0.30.0","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-mcNfe4try+hYEHJJnFfaF1a1PY7qS+5sO/ZRkAGHM7awSuItGR1OXfPinr/6lzfL926D9vE/wYDGJzNlfVyRtg==","shasum":"8aa762165ccc789bcafe26cb01f716175024a8b7","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.30.0.tgz","fileCount":201,"unpackedSize":3052397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa7KHbCRA9TVsSAnZWagAAP84QAJ7I9Tm1GewaN5RicWnb\nMfUNz/lQcGN810yj14VohVOWTvsCKiKNp+k5YJnPzssk+G1UlOeo2VmDTo3J\n7FKjClksGTfgu8NhRrEJcPHxfxakmUSo7ay52oS6hOycSmn1tQnc12OJENqM\nBjLa3H0dtAKxjK6X4n+oPzPsWie2PgzKr/n+LGhx/KMh10pxFdyTRcJCuqVm\nGcrt6eScgrGbW5/J7DROUmLNW9NPIWYV/4tyA3rVSQ68Q4fBe3pMy10kOGKf\n1h/4owk3roXOcwokO3YrcG4UTQKjnWp4QJEVpYlG2g9HiqwBq7upD311FiBK\n9HqSijm+H40Q/mw1oBt/eWcoLuvpYirXcoGxut1R5bk8YnY0dTDbE1w4/9ny\n5CuZaBhdjrEgpHm61moQDPbNz+gXx4bv5LPYtJevxGI5E05eag9xx1Ijp9uz\nAYGTfnNiMelccgMBR9NRIxB/cUeg0r3Vptiy+psjPid/Yn85Z68MBmkqEhKp\nKhT1nAEy7IYCjmzuoG9eWv/tw9EV3Yl8LoUyX/4wxjt47VrqFsMY/xs1JoRD\nKTeUkspz1u5Bbrvp9dpFzaSrgWmVJe9NDRhRIr3la98F0GwikubFWHhSSy+R\nIz4fd76AbwifnU3VQ4N3j2AUaAlP42VbRXJ+ChzZcQjUXiRJNvmYvj0rZFvX\n9oQ+\r\n=0DX3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBJUogK33/8qkcVz3I5v5tAK+mVP9vHxchwQuO+D81bMAiA+PLFNfO8ODizlqEUeA3inFh54VKJXIRz4s2bcfv8y2g=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.30.0_1525457370189_0.42449743964476294"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.31.0":{"name":"@fly/fly","version":"0.31.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"be9d7b630a23ccc49ca78078a18ee5a11ac015f9","_id":"@fly/fly@0.31.0","_npmVersion":"5.7.1","_nodeVersion":"8.9.4","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-eQkzxXlTuOeIJcAhZzmmQdyZqnQZdNfV2rCRLDYYhcRBJjkhhcCP2HHWk3X3RKelUXXnxQbFUZnOW8/GBy+orQ==","shasum":"306068a77ecda8d462bfa45df110c529a8918c31","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.31.0.tgz","fileCount":201,"unpackedSize":3053723,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8zucCRA9TVsSAnZWagAAkGkP/3zKq5wc04sBPWH3bybE\nggjqlLnB8g7L6yJkokvzQx4IYIXkKrT7Eilqumflh2BbhfFlYZY5Xj+MWMKh\nP6UMob/PdB5VP5S5mnzljXWigAN+l4UquaLP/6LO83fNCvjs85NGrK4FuxBc\nvfmWH3QQ7DRX1n7Qw0Ap2Zm8cnmGUciAN2S1k75XGAbk5Uhv3f+0etLDwy5D\n1SaoVV58PPQNZOQK2MUyQ1VXd4ASO85kfUrlnbmDyx5fgzgt65HJppEtTnyx\n3DRK3sXle3dtQtwYQ8ugi5tF7LyUp8qAEAKt8QDnMID08z9wMnIeavi7hrIz\nrnc82vgT4ZsFzPgpCf0NpxMD7183tA31U+L+O9UCXJJHTlnGrf8ktd51RP3/\ndh+WCcxuIoOB6XpvPRJdTg0apwHgCGxt7PuZKF3jQHDBl3HIM7cOqQ8qcXwq\nN3BXsHNJ08MzmtVo/j9KbjOGr7sLE2BDuE8TT+LYubHM1AhHYgJOnsYFG19i\nOf/tEmbFhkST1KG6xvay0VchlSVhw2xfaPyKKDWmxepZcZPOfL4FpqMcVJAJ\nLqAmH7zy+4iMAOAcQuaKptphWEeyiOuGC8+C+URLHhdExVFpUn/QGooJiPAB\nM6hDwA4HSD2kGCX6UaeIlgX6UqJebURFzwhW2jyiOWqDsWORK8xxdB/HWaoz\n42xR\r\n=wI1I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCoQ25MFrYU2tueodL0ZaGK7XqloTIkuePjItRUqfr5ygIhAMswLRsFjMQ1wP7uieNbD+ao3gIMnaXDTxlNilyXhY4A"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.31.0_1525889947145_0.17692030982902462"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.32.0":{"name":"@fly/fly","version":"0.32.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <8.11"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nyc":"^11.3.0","replay":"file:./vendor/replay","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"^1.5.2","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.0","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"^1.2.6","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"8b7037de4b3f92e2931e98237cec60eeabf191fe","_id":"@fly/fly@0.32.0","_npmVersion":"6.0.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-W0iJbXSEZReFtmBzZf66pG9t3YVukuTSaYJkSHz7jo2iO9rDzAOi9m23ZyEVLeY8Uxj1jTRFbpoBsRBiVj6MLA==","shasum":"7e0302d9d0c066bb866ab805f7df3a67941a8597","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.32.0.tgz","fileCount":207,"unpackedSize":3057948,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbAtXzCRA9TVsSAnZWagAAXuUQAJmxUXeDPUtiB6fRUg4Q\n5tnqktvG4Y+f4VDTLbRIINaoWo79OKCHrmgJmXP8Qekn6+sJ1/PX2ZiLgwCK\nvm3MfwjvKAsuRwc0eSzRwCMRFDs756SHZcs8kYO03QDj3y/lmc8NvBTtcTEH\npt9vgQ0aT8OHcbg5CFDXCxltOBc7DT01MCdaYOw+P1Dm6XxAAtJ2gh/mJ9zb\nd2xdC+7GSR1ty3Wcab/8NhVPijQJEVVJUYRhO8dd4YgVR986ER9QlPjT8KKc\nbxGcVqUTS3hg/TILajsLTe2FnF6krOB0Y9oR8c8d6vsFJqiUeYkztvZQZCtz\nGdUJjwKeMQw6seANXsbgaSyR90u1lfmhfyAQ5N4kNqPzwedS8sDZTb1b5/0u\nDLAztNw1atL5uRKkJ0fIS/MtXxSGng96BmNEIQwBgMyjxVnX5CWbx6BsMz9G\nkk841p7dvYmnL41Cwmn7rj6FSUeVidqm52SR4ZIaknqGZEgWJbvaqGF055+y\nSHbnQ+93kvFAOTIl0vYElmNiSyOkYKkhDdDJcNzX2CjBawRh2knmdk3sGf8b\nPtcMrIgQp57ch/KUE4EXBCXon4IMbhN512os7LfaYlpH9ejIB1xqufcgyFL0\nAR8GJ0TCPnjgoMcyL1iFKewzlY3rUKaRj7GwmKGuWUp8djFOVGKnxHLsQMYQ\nQwRI\r\n=xF4H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9stVHrW2kcy1i0sDuJlT5H1AftymmqXEfwjTGC/ds5wIgX+T+Nizoxm0XxuEK6EOMocVAndkLsdPf6ghLZRPvXlA="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.32.0_1526912498968_0.026549050693566167"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.1-0":{"name":"@fly/fly","version":"0.33.1-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","winston-syslog":"file:./vendor/winston-syslog","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"c84c94d68b29a0b0d08af71c80810a03a59568f5","_id":"@fly/fly@0.33.1-0","_npmVersion":"6.0.1","_nodeVersion":"10.1.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-3fXAsM+lrVD0aGMoZufKnLZvQb00jDbBMyCGnjlPI+nk2x3w2jwsAFIby8BxYDzOibHXTB36aqoJzaUyVu1EcA==","shasum":"ef14dff631895cca836a2a972fc1063e4ae4adeb","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.1-0.tgz","fileCount":217,"unpackedSize":3115385,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBxVtCRA9TVsSAnZWagAAOFAQAKBZ88EmZTljIQlm03kv\neLwukzdd7L43jSetV9bLW/tMgEFZ1KRK6NrIybV5G/d/qGsvvHM+qbKqoXpr\nnmfEvQu7e1ffltKAZz+v9Vg/vXgr0sXFxBZ0A0ZIDfbLNeygQdMu1JYwNucp\nQ5jiAWphucdXZiHeouMJeE7hWqNzU+Ctn0wQyiHi3oMzCS4h1RMCTmck5Wzj\nAfNEyl/QHHlVbDfD1QtdZqurs/LZJOMet+93o7V1zdcaDWoyTMy/bMee/XvC\n8lGFp1D04MMOb+MuMSY8sf0cS70JM1r2IhRo1hK4KgrBGm8zZY2ARAEYuEwD\nJQ2BWd5t32Mkr4SvaPTbJEfRAT3/xQR0AI4nqZrhkGvBnbyQ39g/ESyUoJEI\nGsm/jceQN5rjWqA1KJZEN3T4q0OFAXa05gg695qP3BbNWeNIkmuktm2SJ4NT\nz2AM4gzcc6BP/L4frBxsA+HP7CXNIycflWljv+B5l0GUmUfDJo/dr3o36fWv\n4vOp0U8LT9+R9E16dcPq6YwtSeRhUA5qpQNx42GRPQrm/mnEaVicEND7XgtK\nEZ2rz+G/N8ECwL1wx/Wxqke5E/bbyG7z7DzjXc26td5OLBaIFpRIeJH0kFl4\nhJD5NQQftiwqgPsxv9LSbPjm9cAlV0S2mQSSEXTOcW2eGmYej5kyN7UX4CXX\nJCFh\r\n=EX6w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICai4fWbvAU6OEcRVWa0nsMSpFZLBrt7tzLCkH9186BsAiEA7lLUBuFUHaIH0/hh8Gc2IYfxF8akhDbn83apfTt1nbk="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.1-0_1527190892435_0.9291606858137882"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.1-1":{"name":"@fly/fly","version":"0.33.1-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these our fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"f5cbf1bfdfa2fae717588f5f6d0dcb551a239920","_id":"@fly/fly@0.33.1-1","_npmVersion":"6.0.1","_nodeVersion":"10.1.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-6c1qLVQB3fgZl6Ti/bTFLY4pD9IZBTn0E+ukNdVEj+slI7QVlFKJN6nsa0+8nnS9xomhpM4qjYO7W7SDrhk7Zw==","shasum":"16465dfc9aabeeb3a7baf917b649a9ca6a70f016","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.1-1.tgz","fileCount":217,"unpackedSize":3115523,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBxg6CRA9TVsSAnZWagAA9+4P/R6aphs3Y2gW7KR8kHGi\nL1RhnDOcxrHjxIsODTyFkANsXu/frbcPMVmMEvTKeUklmwzXMxRI3s5a8bmZ\nISdln7cQvVRlCm6Yo2hmLiWmV5UubXKRtVKbCAjEOoGZekuJxEG90aMBVRMc\nci0Acoh1Jhw2AnZotZR/+QhGeV9LReRZyau9qNHxkHkYoA8pMxHw8f3LUivu\ncQpdbiFyQvIDQdf6f1ZUNBL2qzxxnrikkpAzSnHPTSSFl1QI2w3y7eT3elYG\nQMSI4eH3fmKSq+h+psZqOmvbtQzh1axgBz9azUR3cQ34EKdFtpy6pS8sMBBj\nl+CEDEd/lRNWKVvhnHTINhcOECoEmPhTXeLZPsFgB5bZDs5L48z3DPtdESPk\np6gT4Q8qZaegCU2L3N/UvSPXUf6qtsf0HMDZ1UvnTPNcxVBU1gEsKG5DHHQz\nB0tLLLmwOCoWf4jb1qImVwndpqIftHdDLXuWk4LK6iqrS24w2qrO+Ier4k43\nkGyKNB0Qk92DBO3ktTfXfXFfy7siNTc8iz76TNK/kpaUlftDBWTfn+dkE5SL\ngUhTgy6bE4yVrNQt/ygSKYWWxv2Tx0e5QSqf4UUjy+ZH36yJE9AlqrDqHrqk\na5V9DyMnm5e9xpsQTuzo95VNAya+1C0gHGSX+OYbvhDXU2YklXAH0iRn6ktW\nnir1\r\n=dV8n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDR6txUxVnulmtKgtCISBNVhtAGGZbwbEhg1umFVj8GVAIhALXc6UeNme8MoBPV8Gw49kcY1TJZr6UDESe/i47HnUQI"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.1-1_1527191610178_0.8112665293853187"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.1":{"name":"@fly/fly","version":"0.33.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"04f3d6844177dd07f7f68298c9f87a71a7f0e731","_id":"@fly/fly@0.33.1","_npmVersion":"6.0.1","_nodeVersion":"10.1.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-grOCJSSqSGGMVf0UeJ6Q+Gdb5ZNxZdEsy9lAOPBPe6pX4A02cERlnyUEKoiYTbNhy+eRXQa2lfVbqgf6xppqzw==","shasum":"891a71025cd12346e46d64118b774ec1f44a0d36","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.1.tgz","fileCount":217,"unpackedSize":3115632,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBxl/CRA9TVsSAnZWagAAB78P/Rvg5S397Gfwwk/d6TbA\nnh1pgeSHm6MJwU9Rs6p6aawgCqEyNYA8VT/4m1P+1jfHrEadUvGeE0CwoUFi\n5KynF+hLhkA1ivlOLEmd3w/HI7g5moxsBvlciYdz2TbuWBaO2sAhzexx+0Z2\nHJJhh+XUFIfEYMAiCwlQ97nAN7kwD+EehQ94TNXVLmAmwkL4spPwy8JWrB4L\nKpcegk9+L2KTNAcBYShgAvFe1uzW81PKW4sYqQYwf7EdU5tO+eMBBfw5mpIr\n18dXygj2/fOUQz/s2we7fiRtc6DOSsGyHCAW/ZNluC/ba07Z+s3fKlwhjlmf\n0f3MzprnO03HKFUT+ELCTo1PaDYIg3KOGDk2mKqNS6goQr1bg+/MH1nUZtAI\nJ8jk+AJy7NVY+n8kx5jLbIeFFVwYpLebYZTLJR/5uCWWEFsr7ioZOOoPzJbH\neNtWnlOv02U/j931V7LXrKbfzGixiF6QFbAKQ4Dkjc/nAzKEZ1lerpO0+wwk\nAN/9X5b2QWQY24PUCqpj8+CGJ5hlYEYQo0DXeFTsM+R4lwRAcsvVA4+2OgxD\nX8zqSsq2qdKRg/YZmcQxgApDC62R2TcG1yUXnDZnlSgqPcEQ7uxKOKBwpEmp\nkDMaHzTSEqxy0QK7PxWFFMuywzOwcjRibf5ntg8f2hQXr7+8URWp7B9FRShx\nSMqm\r\n=7Ulk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBkBcxe5SRRsHvkSxy8/HjrHnVBL3ycBUUfaOzKoiXlrAiEAn6AaBA2HZNyQjWPDVkjy8/T3sJWFbLxsNMr2ItvOLX4="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.1_1527191933732_0.6377406644909533"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.2":{"name":"@fly/fly","version":"0.33.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["apps/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./bin/fly server ./apps/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build && npm run doc:v8env","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.7.2","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"179a1cf11d2c72cab68082e992d512ea2b085707","_id":"@fly/fly@0.33.2","_npmVersion":"6.1.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-47sQOECXiAD8mSWXVv8sfr1DiEmNYIVg1psz+f91TLykbXOaWzxGV9dLIikSH2CdnIBooA/6rt9Vix9Il4058g==","shasum":"920a2b32183f045c42ff994263b00252f0eff2d2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.2.tgz","fileCount":220,"unpackedSize":3122713,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFgrFCRA9TVsSAnZWagAAC2cP/1LhdKSkD9+pdl7W5zS0\nys1fnAwrWILqJbBxvBs8ObQB/X9K6sxJCn8mi4NZzDIbu/wkQjt+KK4S2rOA\noQvvS54N4a0aSXgsSKN5Jrs2ZLla5ynZ5lrXgEIq2WUCM8ihGNRpFn2owJUk\nGeoKpB78/KTmjdk9gY2HQJbbS/8PLwFG8fIa45TIKD3GSAdRfbmgRUb6ObRw\nnlapr/k/xK4l0cgtmyuyGo67OszD3gGBFNGL+UIWc2k4BkViauNuCG2VYJiU\nDSf1MEuvmBPpslWl0T4nqvCqJh5oa29ThvsK5MUBu+vCr0I19mmJjbN5cYe2\nd4z4VCyozMtba/b6745hZzOoxk5mXeg0brQLljCgO4MfS8V9PBuS0cqLPsl9\n44zriv/p8AYQio7lMGE1z+KrX+OdgoovCF+h1ct0YpAIiF7ntpWKyYee8hG3\n24t8leoWwrtetEOfGwkg51LGHT1gvtTd/JPV+4mrIf8bi/mjs1PbpNRaEMgR\nWc/OltIZkAFn9w72z3R8YIU+vwSFUuZOJ+lYQB0OvuoeR4+Vtx5rsuPZQSej\ne7+me99iDdOs/eklVeXPPJCaEWzx/b+7+w3J+3bjXBwoO3ZHcEmHk1YwImbx\nKhwLRsZK/LuWQiIybfXXeQuEM4D+Rg2YusMq6YmrSYpFwFq5FynBEq9TGlXR\nUDob\r\n=SJE1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSIkPy3d5Vt4arOLRo9p/+MgQNLbB8ROvvan3LSpOtogIhAPfRT8o88Tmhm5/t5naI2TeWyBIi+aKQ3sFE61DGcbYJ"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.2_1528171203740_0.23648185620436846"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.3-0":{"name":"@fly/fly","version":"0.33.3-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"e3de5cac16e4182cd1d961b271ea58aef96ba5b4","_id":"@fly/fly@0.33.3-0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-NIY5G97HhEhqj7EjWE6l426osk2GXe65G+xX93/VMeRA7d+8OjSSwhj6WuBpP6l7qfWnGRAy6cEw+iRHSEvFJQ==","shasum":"0ca2e3e7b8fee5200eaccad18e72bdf459c36a07","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.3-0.tgz","fileCount":306,"unpackedSize":12824240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGYQqCRA9TVsSAnZWagAAgV0P/RS9+mBCoAiZbEaHMjas\nIKda+OMg/lLMne9UA1tTEyroPrrNQetjo1MmeqCad2hbJa9DqYJDR6o9QdY5\nyBTwdqq12oj1WJpX1vhBP4Op18IWAuUecn5Q5ueRRd+PiduzMWiBoBKlSZmo\nry/4GUP/08hrbKSCRO7ywH246UMAwCv+sJRQqm8eF2ZtI+jxecy949H0c/Cc\n/eOrwni7M44QOubz90E08QFEBWIV6qqcvjNeviX1f2RRPt3pPY+ZLdukVmpO\nTZhK6PazPcnGO9IxsxrUdyTIXE6WYc/iTpBkFtlnmQb9sQL2tVu1bEWgV+42\nbFrX76MeszI/OQSnYdDq9//gxWoy9kajf5Lc1ga8wDFRrnYnsAw8v7EeVBCX\n8xNLCgcV4/qSc0EuMVRppLkuqGyozGyxNBxdLhnqVXdDUhhsTIOxBWeAXH5l\nqdhF1K3nkVrhYYYpsrElZAqVsia5eaeSq9N4XAWM5a00V/SVqu3GiEhjknXO\nFVLoSZUHPA5LKMmH6Zf8kF5yVXiQb+kRh4AdAKNBzQtVQtTPNODFHSmU0mKg\nsoVaHM7ibQJfeaYZsjwrb7wVp0Zdh5+fE/oHrzZMV8Sh7xvE50vR4FrJOgGM\nEMM8lxWEss9aZzc+tjlGxhsBdNmR1ich7pwFXyJCyXt04Nmm+gT6UznQz9Kf\nX/ce\r\n=6/tZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJlPM84zwtkehpjx/sRpbpHPAGl8T50R0ttHSc4W8GBgIgEeV6dhr6tN7div0YhizniVTWczDF/IFcUvQECqm2wP0="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.3-0_1528398889670_0.5557220465990318"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.3-1":{"name":"@fly/fly","version":"0.33.3-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"be0d478885a26a6794702ab195c3e9397184cd03","_id":"@fly/fly@0.33.3-1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-UFqfg+UxOu8s+Lksjh0E7ci0dWZBwiuUu2/7IyvR0nbGbEI3kZD+epxJeJF5/uoJPNEG2gTzYGXEUJ3yqXPy/g==","shasum":"ec95d8d628a3f5b0a57890fc41b4157be9f3cb54","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.3-1.tgz","fileCount":306,"unpackedSize":12824451,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGeaqCRA9TVsSAnZWagAATg4QAIgfeyOjHd2RM7XpDUMW\nYUm0whGkbzW9VCzqV4yZpGsyqkishLdZtlQU4P4G2H0BwdVcdk2jEPdy/+xs\nForH70fmfX1FsPP3uqxuxoDUyhP49inBiv/MfCbaBiDeee+yacjFqm+K1VqV\nJY97dkTBi09JH4aXUrLTpARQgPkn12GCFuZ+GXkStsd2sAiJRYLpCsOUffTJ\n1c05QQ5Ff8j3qyyG7DyxJMHofbnaAbabTIbnCQUm74moXl1Yl7ZUsI75l7pZ\nRosT/t2bTjtkbhizbZNEZOmuujgV47NHuDgyeC7eQ2VuDVOGzVqh4yVmchDJ\nNU24E30+MWC+GJ54p8iE6pKWNkSnVVdHa5of6rUeTOfUjGYkY/flig68l8GJ\na+jR+Hsgq9qWH1xuimeYeDA+DltAo6zF+kEziWVDs1Nz2ZE5ZIlisKsEmkFI\n+aqicWmYw37+raTSl3ROUdWrMmIOzK9ctLNK3WYDnjAmN51LZfpiJl0lSiB+\ncO0QMnqKpIrTPTe/N+VIyuoS/dtj9B0lqXpX4D72Z3FwGvPIB1fTxLGlPBbB\nt+/NV/u2jYen17RfwoULg0mI/LIvNHO+czcj9Ib3cln8Vkmc549ppL/Y4Gus\nfIKbwWK716kff2rxJZV3uCBdnrjlRGs663v19pi9udpib+f4TZ5C1LerCJr9\n0DPt\r\n=PxiD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB2GOcnWlkyL4nCvP60kgTN6TNUA7UE9B5tvOSXf3ZQWAiEAoLONBSyOU6uEHu2f7QRpiLG6Dg5JMgv1/KrO02mKBYU="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.3-1_1528424105632_0.7860660679566582"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.3":{"name":"@fly/fly","version":"0.33.3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table2":"^0.2.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"6b69c0ffdb21ea8b95e02381e290bc9501db195a","_id":"@fly/fly@0.33.3","_npmVersion":"6.0.1","_nodeVersion":"10.1.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-fDGAmhgFoyXJLhQpXbJKo8BXp1jcyDh4ZfTtYh4f4UVmCcStE8XSq30I+youQikRfu9hN8ComVllaGEPmSApHw==","shasum":"064bf05b8ae94570c039f1140b67ff860aee980c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.3.tgz","fileCount":306,"unpackedSize":12824560,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbG+m3CRA9TVsSAnZWagAA1xsP/12i3BLzQeIf6asSfaLN\n/Vr2KN0/qJq92SNrj2olfoTGOTgnw2nRFd9Of1BA9oR9PR8+LpKQWLpd/NpQ\n3j5nSuwa5Qxf4eCq9ktJD1ZTb56z+ayREBKk2Ay2eKmoDDrAawFdIYuZkKNN\nr3LpzgsA798rbNxKzEJL9Pk5Su7gxGW8XOdIFfERVguFDhFj/x8HdXVfvYbh\nZfwex5cvhEpsD7Mkvqo3C7qQUDzD0FVf2W2F8MTFIQfCwR5RXxvNEpRwlnEo\nAOmfOQK+1QdSwAk9cvyyU0OR0abCHV9+z0qAQ4H85UINWIlhbvR9DMDQwAQ6\nVSRNW9dMPVwFm6qIgNdxx3N8FajqWX2CEpjUL+taPGOON/bilCZQHPxwJFhQ\n+VwAOzLZTotXxiQUCuhD4n5n1HgY5NCmSOihKQpEcj8ZibzZmoC1i3sGMCB4\nAKES3HGw/r6FHSgalURgFsuKgI4HKxGee+IgBW6GKGfzwvvrmelHND6nlsdy\nR/71tgiG2TkWbtLN+qlMtMUUNU1YuUApIw4rHUJAHzYfKXY4l/w3sjPekvFb\nuIoTOzwFxq3mM+vGHMoMX2dyLxGyER4BLlhwQs2VJbVu0UIGh7C5NpRJeyGy\n0WQVPGZQJgvpPS2T5DVvADlOfTmmkRLoHFd3spISK+jK6WcpUrrnL7tghopd\n1Vcf\r\n=hQpO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA75tZ0n1U+6vFbFo38zeYZEx7Tl9RrdcnZCUjPahs6nAiA6UNeJPaByHZSqIAb2bAIVLn+pkuK1HNwATB66w9iwqA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.3_1528555957510_0.15166309610394824"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.33.4":{"name":"@fly/fly","version":"0.33.4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table3":"^0.5.0","commandpost":"^1.3.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0","cycle":"~1.0.3","glossy":"0.x.x"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"514b0f1e1589843c8eb86b93f056181aaf2360c0","_id":"@fly/fly@0.33.4","_npmVersion":"6.1.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-8Wg7qJMPttq+z8ZFnKjN7jsKuRkA1893PVHlGiGnINJhrCPb4KDGveX2NwHCA2BCELaoLiNl2MOL6QTpmsJcwQ==","shasum":"49ac46906f312c6cfb8adb5000dc3c7b37298841","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.33.4.tgz","fileCount":242,"unpackedSize":3112039,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIXK0CRA9TVsSAnZWagAAY28P/RoRPrkEKHJCTKbgGzkC\nIxhMhk+yiGhLQJYlyoNMvB8Yu8BwiSTkPdIBODlQUWxBAxx2fOWqiwqr6Q4X\nd5gr4oiEb+Jt5fXasuY1hVabxb3MwXtnhp5Q5rqafUVlwp5mS3dddAzcQmWC\nm6jXhBgWWIKhhr1C4JYvAfS+3q5RI2VCJCyqmlFOtzLxAJaWGstiNGC7o8A/\nq/L71jiH3Ng9PBDEyQyJJdbrkcw3fWPqS12/V24GNKGS5qD5ZeLqE0wOQKfj\nyInKB/d4uz4vWBkpllGm1CZCjYPRdDrnQqww8bR+rsTIBkr02snjHjjYRZ1F\nNmBzssbUFqKyiPe0jfmmcZLA3l/ldOTZUOMGDSw2Ct8F/bLJysukSjhfFWgQ\nqicFxub/lmpFOa57rnIWDsyoOpvD6Djy+MlUzlUIDWQ9aOZNimQv0Z/DP6it\n5Ox+UyrCMsJrHxAjvMJ1XfXsGIUQf74w5MlYji0eq/SovtFyWLtdMClfZuy/\nxdQQEiHyCuOZ6EZdtcslG543F2kU7QYTN2iVlqzvyQxtgYtTOaAv0YVogcnC\niEaTSmDdylG/5XtRgCYvGSHI4fBGBaPJ4kbi7r0LLtPPcxD3pxvM1wjVz4kR\nHXL/Mw25b5fXXIO1ZinOTIZApTG05J1oJ1+EIxRjHnSrLPzUYISMgM5frR/o\nCx0k\r\n=31iR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCIQwvPIoSq3UPkv4IwcdlmHJW0KeFNQ3hys2eVGNW9EQIhAJcbiMBRIj1KHD4JDPlmKGpGsK21YGl1oNhVu922dYaV"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.33.4_1528918705859_0.6266758726802801"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0-0":{"name":"@fly/fly","version":"0.34.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/multiparty":"0.0.31","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/winston":"^2.3.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","debug":"^3.1.0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.1.0","nock":"^9.2.6","nyc":"^11.3.0","standard-version":"^4.3.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","web-streams-polyfill":"^1.3.2"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","bugsnag":"^2.0.1","chokidar":"^2.0.2","cli-table3":"^0.5.0","commandpost":"^1.3.0","cycle":"~1.0.3","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","winston":"^2.4.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"af5b51418af25a28a1aec06ac0934bcd4960a6da","_id":"@fly/fly@0.34.0-0","_npmVersion":"6.0.1","_nodeVersion":"10.1.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-2nT0+ZYUszVVbtIcdw39nB/S5/Img3ISKlvdAtJX3YJap17iR6an8cgFSTTh6FMQJNXxW68gy2NOlkofOvUicw==","shasum":"e1aa606624f606a30e6451657f95e82abbfc3979","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0-0.tgz","fileCount":331,"unpackedSize":12888478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJB2kCRA9TVsSAnZWagAATLYP+gMViW8B0UTDl036Xa21\ncz4JHvVCygxDWVRIGt9s0NwTqBsLnsyPiFAQnbtO8EQDCqOCN4ZVGP0Kvn1r\ntkHwi+RovYfAGAGl3VUZ2cvv7olAcRORmCH/UDOD0Npwwmq5qWe+ANFOwLlG\nNHmtroWKb8UruFhZ8m7SU+u0FTv0lbTfm1FdSnrlhuS297B5Td5swjeldW6P\n7UTDd/xfuhL7jlEIVSrr0c6c8sp2kTzwBIMRXX8AoKedtCpBErN/JkQ02An5\n3imgKLRBSp+6OJUzgXai44dPQUyf25GT0YhKAoi5NnRNgDBYUHZ7qoEWDuBl\nu6p4S3QvDZGztIjXzAo6pmvVUIYyHV1dnW2ADlPGvL5+SNzzFvbdsIdLWm6A\nm1fKTe1ZgVbpoj+7mDP4mMcewhI346qbr1hreORN5GhuMUvXSirA9Qpdembg\nI0qIhclvU/EOFsv3oTNO1C8npv0bOU6+Gg2mwvDy7VGNZx7dMKXZNflVTj7W\nZtsvPArgmG2huk/xQq3IklccvXzmLjgcPQ9NdL5886EDOEkDL4a1S6sLz1yZ\n5RpYbPVmNUIhTWGZ0FWzxQpsSg4l6rz59F1h7g93bWR2EqXO/bdZsgRFrSrG\nP6yhZ84wT2qbCZ9F24fyNTIl7k6oQFDVnYpAnoJP7oYD6rk/X1L6FNwobZOH\nBS5b\r\n=3Nre\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnu4s4hlHUK8x+5x5T/bmIFQQMT5Wde34bq7T6+o2RVwIgTYaBEzqQ1cWvpYQsCsg1EgDC4FDmlStqZ8u+z01BozQ="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0-0_1529093540223_0.2643693981972486"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0-1":{"name":"@fly/fly","version":"0.34.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"cc216ee9225ea938708d7e906aaca1dce85dda13","_id":"@fly/fly@0.34.0-1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-pI1775XYXqoNrhOR+ae9srzio+EqFIBh3CyUKAsYdi7CoAGGSByP83ZIJq1WmVfQy7q0lIDU9WixdGquqll8ZA==","shasum":"b65505f389586884e28f513a954ac817c37f5de9","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0-1.tgz","fileCount":380,"unpackedSize":14748168,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbM7qmCRA9TVsSAnZWagAAwXEP/3zuyp8Vl2eWvsDgdSEQ\n32jrTykAqp5NY9ZUyST6TsCsr6FUPIfZpbqzIrw4yAOGrxOxNDSjxfj4hzQd\nGfUNuOXrvNOn1WHzlVjcXM/b+B8EeybgVwgTpioJKOSTI/hDWRUVfjPk2OMo\nN/wKhwppw6GcUjFzjBEec98EI6vd3Xhthucw6+vF9oHDXiHj/8PXvYtmbnbd\nnCG+9tx87u7F0NCzM+h4PZUujUo/bVbtXqfUCWfqr96/OuWtYnIcv71r96EF\nSIg3Sj2rvH/rzBEPWpy3mCRK2A8QRhgUCXv/wuqRQYik5XRTOfGLNOxAwESK\nwYTU22fE316dmyODQkD/pcRjmrPjSC53cBXbAkUqQQ08fxYlfqeeCuscUHhK\nd6NfEGxAdBv7Z/533fJjERf4hdXBcWdWc0S+2dnWSrPCi60roq3hroK1dhjK\n87jLgN6K81tjVQ0lX1ZulXLRd0Y9XadE8gUwQiFqN19WklhB80R2UOVrd1zr\nVjNplvpMfGFJX2WYguCzZhiNrkdvtRjm6dUmNGGWpDlVAN1aa4dpetmlhG5e\n3JUKY9tX/fXUntcoPNKPygtTZo4S5hyF4rv4TFUg0syPkIaauwAZaB+V92Qj\n0JVo70yvaP1g6/7DdElj4vZhpqe/3hFakWlwtihOaz9fvRtLoew+q7+bJ3w+\n6ln8\r\n=0P0p\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVd4lUJOb6ea/AyRV3k2MN4yy69D19Djo/IW3O0h8fDwIgS+fDhnCr2ckNJz70N5/ElGV9tJNhU0rBbiE7YvlhtoY="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0-1_1530116773868_0.3427868271404162"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0-2":{"name":"@fly/fly","version":"0.34.0-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"982f42bab23d14bfecc09a1c230e4679ada585aa","_id":"@fly/fly@0.34.0-2","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-8eHtuTEWzUdny/R0AkhQtHzjoaE5145/l6j+3oFK/6lwkxw1wAzdsG9yzzkF8GBGJuoRIpTugGm/NEIPCmuhcQ==","shasum":"1380e069bf79cc653a39396b55ac76d7b861e2c0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0-2.tgz","fileCount":380,"unpackedSize":14748085,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbM8FSCRA9TVsSAnZWagAAPAwP/j9FfdcvGQekBBniNzhY\nmmSM1GMwkmTQvwTm8GYVmceNzU8CieCq/gtByZV9QcRDb8RPy8HXcZeiIQaT\nZpirp0HgM0GcvjRZy96lub0v0VCXq0B3qBGcna01PFk69M/xJ3iy7zz8Uhl6\nxxPyBLNG4wsGoyDfNPUPXrdKLT42G7CsB7Gzkkq1UVRkDG+2BiRWK86KtRz/\nAoJNuu8nAnlkGz4b5qWx8kdCAVGYfJqugC9IBlEcOj6N6fRy0wyazuGo0XBJ\nxf5zl3tusjsHPkpJTAPOJUwApdfFCd4C/SWdBpNK6PDYlVOHy0KI8hQLB1RY\nXbnxPNs0c1lEZ3JlDx2wFARFyC8HrzKAK06VKhwnd+SiakVl1IuLEqwmnq30\ny64q5YoH0ZhmwQAGPDKvLOjQIcQY0CKLHoJjpavs8qITIvR0uQjHlpeiahzM\nqF7RA0HkO0ctY4tfMbiorov6wv3BglA0pPK9Sw+pu8iWykmHmZ2PSqEA/LD8\ncI4dUar31jpxSt8A9d+Or8v8W/6RYSaaYkbxm8+Z28Pbq54EVv9rBtxNEEjL\nnPLmE7m9v9X2h2ObY+0ygg5ZKpvG9d1ZGZoFE3Bkw13ZXWtwT8W7T0PhmzjN\n3Yx1+90/eNIPrXJiPOfkQdsWrJ8+hpqXnWxrrDkgbQxjvccbWtn9323eEqIh\nCnr7\r\n=1I//\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEOhFaCLK8E6i4QCZrmhaTcsf1OUR8r4OqK5zw7y+FmyAiB9X8H+1KIqie0jd+M3jypCtuwlL4v+/b7gYL+E8RP9uw=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0-2_1530118481869_0.3013186240986072"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0-3":{"name":"@fly/fly","version":"0.34.0-3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"68e696543fbe225e2c6f06efa44e6b61e384285b","_id":"@fly/fly@0.34.0-3","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-2I+k+mOz4dUGIgWg/QOC+BYuSzAMArytqFaGGgbrSkPdegjDVNNPFePT7llpbnOfc4JMDTfzSnQz+rsd/OT6ww==","shasum":"5f5c7442e19a64d850a671da84e967e6fa708a69","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0-3.tgz","fileCount":380,"unpackedSize":14748718,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNiHNCRA9TVsSAnZWagAAQ4kP/jz07l0KQRZds14StPYW\nLI7DkLmRsFUlhqnU5JEFuUuDGKWOT4qfbJdlL+ZPfoOrOefrCmTMrc9Frj1C\n7gbH8qBn/ys26uN65nn2DkdFt2CTJ7Iln7synG47JJVHXtBQY+iVlvjdW68K\niqkVQehx8Z1XeohZJrjm0Bn+HQSKMNV81/XtSaTlGKR7n9S5QrVIJO4dNW7z\n/GaYIE9lxmWf4SvCxzrErt5z/kzDlGmxTK1ONhtYfr0IXMVnZxn3IJTb8Sze\nPVw1oNfbIEC9dRK2YW04os4NvgS2Ug181+zBrRowtG/E9DEQFDnf6NCvZCOi\n4/smFcOop0tKx1lDpYPKOf+uQbR4kjtBBrf9JOqMbOnHrdFqborwhFq5DI7p\nU9M1hrFOBI7ZN4cgGmqoOZAezfVlf3ImU3KaJ2h+GzgH/Dx+6dGuPatD3Fh0\ncizBdLLg6LNoxa9EAw2e/uEI3AalCfI6BLkOlfNwmM9FVtUSKeoxh3p7i0Qe\nGCNvQ2Sd0OIF4qWmtNcQIWzyqhZoIwIHhQEzF1IMOlimUQGg1RRDQYwcwUB7\ngzKx4ktJlNWw7x/z/h++H9+h1OWnsydLvDA6ftvLZkFububHWXRR/qy/F0LB\nV8VEqiuJY4Z49N+hxU1UydDW4673TMtYi0P8D294K5pA9J1UsurGCurkJ47n\nTbrc\r\n=uESK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCiBHkYED3kDvlfz2FddHRw+nqzoGsFTaLCYNElMrqsTwIgYeGAWd8yw0RAtnkQpOBXaK7aEAghPEES9p48iclbHLc="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0-3_1530274253408_0.45215581690006257"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0-4":{"name":"@fly/fly","version":"0.34.0-4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"db2c4eab90dda72c5ef173e85460e8a78c669dc0","_id":"@fly/fly@0.34.0-4","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-K+dlio2lXTMHmvDmPMFFqRccGi3Ues2aiInPaZVS+62PmE181sKLsRuY0Z5aFribuyeGt1O9BlCFQW9010jaAQ==","shasum":"42a1c69a7dd98b987f145f76bf7734ef7b1c9a74","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0-4.tgz","fileCount":380,"unpackedSize":14748475,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNjBACRA9TVsSAnZWagAARi8P+QCuH1my3FA/99+gFnrs\nrU8+oEHUlyLmD5r/mnMGYUgzA2UJ8lWJVaLAP6/rNLqzJNoLm/X3TLIwpYf/\nd1vEVKD0OoUryvR000GmSlhMomIn2ln9sXVPs/KrNbftuUjEA5MZtR35bCY8\n2D1p78d8wfo+l9hOUaCjzEfL9SfGyaGOJX8R7Oyk12sqnSQ9gewTEUkIKUJ6\ndzaK/XN4Jjkf16QY1FOBPn5lS9P7han9lSYF8rNycjx3LTZQtqkMeyC/1OpS\nh0SDRZxDBoM547Y8FNbqKROBp7n8V3ANWnzoba77pfUF2RFuqshuVzUalF+C\nmX8GSYg+5YttFk9QVeN4VsEUa/tF4K2Os9j4+D/+IudtrT8tUwywWRH3mylT\nYSdt16UK6OyG/eNvvpoMfYyhwwqkQ6/LHIi0MP01gkKC+azluHD2aquyw45H\n/do/+j5Y/LZZSywpZeeHVJokVfpSqdWODdoSt2TaE0QJDg20M49T0sX9ZazV\nbY20c5jsPhu2k81R6t6g8lbqLP7r5vY8dpvBFu+5YHOZFdUQcQniRdrlW8Yx\nli+12EwNpVk4XbuGYgKwKWLTeZhlETdcvbJRdFIwlI0kmLCWFY+gUWB/7KC+\ngB8aYXBV5vwjC+olKt0EFG6opUivF51oFUX6b7duszaiQq+FqXLYf8r6GmdE\nFr+L\r\n=r+LW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAunynQaQBrfpoDmakxtge1oKBZmuBhd+gvzqjgj5H9fAiEAu8h+27zGeedd9HHkVMG7YK4F2gyA1uV50cyK3lcB66Q="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0-4_1530277951922_0.3355987020125262"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0-5":{"name":"@fly/fly","version":"0.34.0-5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"95e8634752b61c8cacb0b0751092cdced14ff9b1","_id":"@fly/fly@0.34.0-5","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-HsLtE+N+DgAKl8Xqjdwr5jDiKw7A6t/qVPF3uSLXJXYe5V/JTANDH5CFwAYIfnewTQt94Wu+CKuE6aw6ro1nbg==","shasum":"3c155c8883be374fb55624b43b25dfd44b66cbbe","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0-5.tgz","fileCount":380,"unpackedSize":14748366,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNmreCRA9TVsSAnZWagAAEDYP/igM2raksmwLi0VQIBQM\nyEmAG+aTveXR6tYfMwM9x3Sk436bwzKxRjQqoqkPmK2u6WzE2XH8fPyR1fwr\nhZC7pUS4qGOc+m2sJcC2ZnQK4i/dNdt1BhJ8WVoH4x3npCCWCSrJH24ltYXa\nreOOS43v51MB73MKYC6hB7gYSgeieSygm+lOaosU44Lc4vSGUfAvR+j4vTpF\nXbHUpJpInyjquEKaO290j+Nsmz9Yx9cwHJ/m62PHLITdMuAkQxFYpZbtk32L\nl06PpgPRAZ+Vx5dpMncvJ1VNmKd36n81J4V3KzobIxEXGmj7XXEyvHElX9HJ\ncOSTvAjRXVxEmds6k4xXx1qkEj4qCBKgtXzSWyn+pYI0R+X5zisxxB6833cF\nAaux8eEffoy4WhHv3zmNG35LMqUfA0u4TaST0/bGwbbR2qcn3EZEZtByUGm6\n6nSYUEuqrA9cS2NonYCtqhllI5vTo3pfIUu0g4Gi959xYxY6waWGJwewsasz\nZWvFOcOpBkwEQsxME086dYQn89eD3EFWiwRguxUDicXIuKPZqvEvXMKlspZ9\nZ8Hr6a6QP3grfnhxFFxxSbrDvPD8iiJtYfUWR2TJbPsrWHHy/HUr4qKf5Tuv\ne8MKidiUuBSht1xaiq7ZMfCCQYdgUeHAhHApskz9dLALjLiJQC7zlIcQCTES\nSNWj\r\n=Q28b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAcLAJQmNCd4ZqPVSGoDO7A0O9ANwXxK7UBmrBR+Qn2CAiEAw0Ip5gAdtLYIHgzZW1HrXBpVW1MhURRV5n9PUnmvWNI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0-5_1530292958142_0.4613378297169022"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.34.0":{"name":"@fly/fly","version":"0.34.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"33f8a6b58cadbb8751418dfde7feb9ea2e51a247","_id":"@fly/fly@0.34.0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-C+25lBGg8qgVFYTaanx/OyKwcEgabqVo2CrJinaNEANSNxEBT/4OxX1LBnXHe/bOjwKLNvs/8osszu2RLoNjLg==","shasum":"77ab833e465a7a73ab206bc328a2d04ae9e4c7dd","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.34.0.tgz","fileCount":380,"unpackedSize":14746876,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOh/YCRA9TVsSAnZWagAANXIP/27TLmYFOBf1joVPsKPe\nkXgZdiwCI0wWrbgXV6zgobNBSOrPCc0Tit0Vv0gdhs5BirRvfba9lsu7COzm\nNUZYt+PRr3Bm2uoC9lKjxigWbpm+PU/AyDrnd26y/PO6deJ4tq8y4O7504m6\nI3EW2CSDOaJH81E4tvpCvOoxOoFfoBJY2N6DZU7nwu10x6r7b/srS29eDIFC\np6ygFP5MASK9KFgGfqq07gNMJptdHKm++kOy0YVinzxZN78EnROTXtUSazvl\nWhbNRHS5p32z5wFQCuNDTS/niZ7NBRpxQ76GxUYoSqYLBLtWRkuSQzdqhN/l\nbijeLc7j30dRfe/CQIZ86PT3VmMyF47HotOPQiYpXF/z0uGvD4YH9SX8iBHn\nwgothzsCChX5ti9TfKQa5Jjqj/o/nLhIoIMEegIatIPoTwweuFDksCg81hwf\nmvft1bN7RIBf2QthB7FNxwUNaZlGEVvMrVwZDhxpSRtX9k6TjseDhuyMQwPM\nEKO+qXkalSpUrZFF/jx6JYuFzLyp5pUu6n2xVpSoQeVLYbwAcczF+xmuKVD5\nalfjjtl/s3L2wIWla4w0FnZpgyEkwVdbCs9IXKlFzKFIa10wSCUHvHOLUUb2\nShrMcg9X9BC6RlUytUxTriYlVM0aCKI+EI0O/t2LCwzLH42qFI7slM65yBD6\nNPjI\r\n=Jl7Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDD/Hm9ETEELD6e8E6GrqVXtrCaIm20yQxSZ6RtRlm3HAIhAKt4rtupALvRPwGFDkygfS41N38C9MdTTeE/MT9ICetj"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.34.0_1530535896185_0.04710750112271578"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.35.0":{"name":"@fly/fly","version":"0.35.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"d48b69b0f8578a4207dcdc024e17825885a5dc21","_id":"@fly/fly@0.35.0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-mj7zd4ZfjDGDQWuEIafqd51A9Gx4y29qw+3TssRxewXAYh3m8XK95tA3lcfBqyNiJq0Mwwx60f6QjowSE/nfcg==","shasum":"7192ad80c2e2f4bf4f964033b512e7f816cf57bc","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.35.0.tgz","fileCount":384,"unpackedSize":14755449,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO60KCRA9TVsSAnZWagAAJT4QAJRBWQ30OUWROR1qXg/0\ny+9ODeUneMhHKJPDIAQUb6/WgsAGcfHw2FHvYNyagOUd4Dh8Z5afHo/krAl1\nDY/H13+xsN+vAxjzxv7bFbiZGUVii4fYooVU7PAhYFfbPyBR2T0wYTJU92Cw\n1ls2YBYTzexAUZJrfubQ3UgeVKlJKF9FNPAFTp57K4pYZTlrJ7RLCG9oaurU\nUh/1SRdyyQ0pCvG5tjwLRdek7pPffKW+KBAUFOxS6ouxyvPNEigv0u2siNcr\nAh8CFdcR8qHmZoXKFUdia41skiBzCMraH/W/YQ/kv6Sst75HxnCyrV0mb2Ke\nZZ7eLyGpSpjOBD6FGZfRCsZGMSrEy1wRRHjpET0F/+K7PZXoyVEh/endxeRd\nJKSDdcppgH/AL6bwvt35FeH3d/+7pdz242p8BkrC4b4lBgIt/gA+/Et7ne/l\nV9BFvaXy1528cC0/zwkhUQaXGl+uTgnoRnqdT4HS80asLnYR9/CGHr9wxqvj\nvizOfRJHLo2o//oajPD0eQmouIseqRDXnmh07mOzBcZjphlLAYyIIK4WZqB5\n3DFYMn//Bg0pdTkMKvQCFBhZvLu0uo5ituuhvTUNv29862uZpqumv74hEmuu\n1jucnghpDJ58f8bVnnrXWbKN45IvpH2OETJ0H/9gWEE3+9uDlxJJCGNXtOa8\nUT/5\r\n=6jki\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8QqTL+8uaCMQtTPzV9GF9XPmJTjIFvxhkmhJmFhXrWwIgXZ9hCG1oAA755zIUviqt2BNDXxunlpXhmAF6j2r/vpA="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.35.0_1530637577872_0.47715790983393114"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.0-0":{"name":"@fly/fly","version":"0.36.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"30487efd19bf1c7f7357ff05d3380f889d3ac1e2","_id":"@fly/fly@0.36.0-0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Jc6CubCVwBYUyY24lNl9pw84L5k+ZkpewROvFyD9kL++J+ctbhHioHb8iVyVFtMhSnNUwQ47pnS5hICbIJWLEA==","shasum":"fccc9a57bfb6e08876b40fb20ddce654a0845a4f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.0-0.tgz","fileCount":384,"unpackedSize":14763225,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQOgVCRA9TVsSAnZWagAA9yMP/1StWGyjNbSsI4f78rcr\n36Ihjn9GkHkn4X4oo71Qdn0BOHvgMr4BqBzlIgBzm2wjRINb33ftO0z1l5uW\nCDEWO7H2mbSpiHgfQ0X20Io/kWsEGgjS8/zNQR/bp0YSQgxKoPbY6m1P92Xq\nTYSokmZd2bRMkrm5g6QwE+I6JClECDmHnm9za38rXwR5K8DV6pLfwi4iQxso\ncedkuDk7ZkF2mB1shhrzmOWqUpoPU/QrDOPkpRiO4xlg0alwarlbMtbVmWZ/\ncXhwRqfxHgExazP8YF0+lpPFFXYoBSpUlpdvZg9dCRcGUzof+sU+zC2Bv2bU\nsNkLZeqg9wM+Jz87q/ZBA14urxHPkv3YbUzLokbb6ziwmFRcFautYIT3YLrh\nKLsNvl5JuDNHHrWnfcoolEZ7Du3HfanFHNpXCWgXGesOqgtoDIVI8FBNnCk2\nf0OMFobHPL1GDesCS9esgxXdxIxAused1EfdmPSu2CgrKCOXotU1WZ75t25C\nNAQShe8k744wjKL4nhzRx2rxOgQ5lFBL0MSoJfkZngL8W+M/w5LSGKGnd1Yn\n2+mstRgJNNUPnZCuQ54+TX6MFc9Nf1e5qCY0yL9CCew/MJtOPKF8DNv3ESI3\nNYDLERlBNkb32EFtvlaJjYUCRO/KJjqTJRtYEUmWUbFFux93MOl8SojVYaga\n9zPw\r\n=Rcot\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfyCLSbBvSvWy4anpzqUyz4nmTmBZe88VGAk3GPWLEKQIhAJjSQCHCgUJuHKyHVuoR2QxrIIuUhWj7KVGwrSTufWxj"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.0-0_1530980373286_0.38763717926797603"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.35.1-0":{"name":"@fly/fly","version":"0.35.1-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"44e075bedd58172d0e07e23e491d185a1e014578","_id":"@fly/fly@0.35.1-0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-rPxaouqAf5TWJy5YHVaArVGaHc4EEQsdfvzEgsc1AuxTZ0bnn0R+4snW7ay+LZXyZYEjtFVMVQYpFt8veAvitQ==","shasum":"16d9d0e081da0cc8fe648a5f122c47a57a511de3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.35.1-0.tgz","fileCount":384,"unpackedSize":14763696,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQjPrCRA9TVsSAnZWagAAg9EP/jyay4O/eTPdMv+ZIHt3\nUQ/wfRIANy/ynhsKGl7ktMO+ZVnChi6MsYY3L4iC5emnddgIYnG5TNUanNmo\nzI+ICIVW83o4AAtEbRTjB3DXlbqn0vlKziu6pt1Fjb/NgxwdVUtqxsHoNXMv\nPEoycS/Y+/4eFRdOWm8FNAPnL1vA9ssQDxLrGy7GbFJqMlyRtbeyb8A8NNp+\nbpAOELgEPo3zuujIqlvA12EkQ0KcXZ8GFtTFtWNYbCJN4hOl0RF5CSgDz4L+\n5ivNlVyEA/KTIJjTZD0B630fIEv9gpib9TATw4WtMgk8T+OP7UpmUK92GhOR\n8MQJwNqQUZ/dSn/Ms4vJPUe8OSzU934pxJk3lmXu/oKjAURWsGHGyNOr6I9J\n96vfSnX8wO2yCPj9u+qsCApwkDtL4voJFTGP34DT7wVrVWjbzl2hfM6aPcgw\nyUm2fDQViYePqUOlGnQcw1mlJTy8x9SYgVQB1yf+XdiQDQXkRFB15vF7jq8w\nIHZs3Zok+QO3kIi3LBXOczDtbOA0N2eI1KZgJxp4TJMCKueNAZmTnKw7JR08\nceF/oZVbb/nH4zPvVvLvVwcpV/xjXEGQJxJhXUmJLlSDl8PKaZULzz3pQD8s\nsecXZvprCjrqwbxnhIce+tgzwThZiKLz3SgNeLiinTI5AYQHjKjs+AunoVWy\n2c/q\r\n=BuhT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1OBdBQxm5g3RWETAFP9CvRWJPgk+y7/jGy7IxkUX+TwIgLMZX5UhzhdFhexlXjwTRQDSzhJVd1Pl8jcrs2BxgFlg="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.35.1-0_1531065323688_0.6942203086210623"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.1":{"name":"@fly/fly","version":"0.36.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"d80ec79bda28872184508039b89eaa025f9f9eba","_id":"@fly/fly@0.36.1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-lbj1joOR6SYOQuIWlclvEmuHUcEf35cQPTy6ggXi/Ww8eNxMLSBPOI6CijUUvDybsDL58TCyqRNpcQiFD/fOvw==","shasum":"d7c2d797a5e7766d90d74c0374f69fce1f916596","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.1.tgz","fileCount":384,"unpackedSize":14764167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQ6oCCRA9TVsSAnZWagAA60kP/1KZv9ruo2RTQTOZOvPO\nMpUI3gSy8qEALV2Xk1KHKXxIZwTVluUDwSawdrgAVLCpygubzsERMXKufYiO\nNOTcgh2L92O7cfCnIWC26cMVPPuTICa/oafKak6b04XR3u+KGF0tVYQPieao\nRly8/GRmQieiUwZmGfsm4IgW34y0PDLQyyKamYhkgFDEKIGJMNjiPeqirDte\nqo1+sYZ4ylsLuT1gYttu/GKpazw/20Eze0VqG0qmcd8Rr8J8+rSZKdUZ05RT\nfzhQVS0xjFuqViLycVYAy13LwgAy79jl3yJgYQoZABmKeJVwqp8FZF6QH3Ox\ncGk4x6IDPUo8DIGyp6G6QKw5A8wd0zeZEvuAMv9f2mFxcbXOVn12s2DF+exN\nRw37tVFFdmsWDXB9QT2Df9aZHbhuVgbUmyfEw1xOiRwp9KJqfBYvoYKndl17\n4tzjcDayIPtR+160aoywq33T/U3fj1egSHjHihm7pCDHUNqbcixb+xxPu6hC\n4R1JOy+gQnupZCNufMcLZUUMRr2+O2zH+/2DdCg8yz3/lk/0wmkk00O6uK+O\nq7RBlG6lyxoY+R6LZG5+bD0xuovS0tRsMwrcq09mWuLfOxzZKaqxlyCqlpn0\nvfM/fM1yTHsb9kW5AavicJYynGgp2MVCc7Yi9uvSRPbIOwI3CyhJ3xvfzauz\n0NFb\r\n=6DbN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB2QqP42uPiY3QrlNpPa6ZZBDIFq/ce/Faqt+CNKktN7AiEAsb4+nT94IA01sVypECgl6WDbtmr/2MPmpA9VLIfKydc="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.1_1531161089896_0.6958791155420176"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.2":{"name":"@fly/fly","version":"0.36.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"d7f8eb79463f8d537e3b469982ed22978b2d134c","_id":"@fly/fly@0.36.2","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-8f7JsF0ZEl8gJTf3blx6f2wBNCwTB0kOXXGAyWRbOp0htT2kCLanCNW13yg6UZ0r8t9r7rrCNLiFGlOrr48Gtw==","shasum":"cea5fca720c4e6d71ddd0e423539d008b7e871be","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.2.tgz","fileCount":384,"unpackedSize":14764863,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQ9seCRA9TVsSAnZWagAAeXUP/Rs0taWbsux7E/P+BUVR\nHOq3kH3rw3fXNha9q2+CDEJxZ4sC7IMtV+SUyHmT86/EC4fo1QQWKkwGhv05\n/Xhc9vnhrh3xiVyDBLcECQi8n752PVSjzTtzIFfMx442/gU+wG+8HPusWGZ7\n/yH5sFwTxIi8BR0MOwUUrbzFQ1oVXwM2an0P4O4W2kDqE8J3jZhnIokrDd2G\nAdVy1QSNYXuUB1RiZXUiN/qt8dTkJdkvcp8ZMSZYRf8gg8sI0OWP5cxEBbZB\nt4EzMOW5mtWq4Pj/0FKswBxnItughEdBJdBwnU1HbcE9IkOm2JIuNrJyvUFB\nS2l6KklhT+/iusJ71jO0kugrv3pP4pfeEak3Jgg0bw6mMnR1EN03irH/pO9v\n5ACENfb2A+MBlvfWAekDQuOV9HFVBcG1f83q1a73tF3ZKKKY/Bs1hhQy2VAV\nF/J2A79oQep5OLs5g6EERtNCQxVMHAgic+e3be7IJW1YBfr1rFu7R+5lB8Uq\nzcgW0ZaB1JyYSKP400CBGmpxRd8LEfQCBBZO106LA4E7J5TK56yV2Q3ZhnP3\nTYV5NHxnU0diu2MfoeB5/SYn/1jwMD63dpigxuFutu4RYSJxzHQex9C1Zlf7\nth0wdI76vbY3iionRUcgS4JxOQX3bCPxQlZL+XH7S9xarpS2ELjKhcslU8UU\nNyB9\r\n=IEp4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG5wHA+0lI1xRtSESAFNo9Yk0kW6n37/pQEZnaLfQpcUAiEA0U272iJGB0pcaklTW3IxOM+resbmgn7vgLjqelAj/kc="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.2_1531173662047_0.8353786859755372"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.0-0":{"name":"@fly/fly","version":"0.37.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","prerelease":"standard-version --prerelease","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"686bcdd94a981ba9eb8096bc554f1ad55c29c9d1","_id":"@fly/fly@0.37.0-0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-HmK1Qu/0EJ8BWuJMpPFNSEbEZhRFAMeuiMxTSgF07H/W/Mzinn7sRpBIr61i05oQaOFCkMBO8cxnNhyYEKZ1Rw==","shasum":"fb4aadacededadf8d509bcaf4a5b9ec8ad6c4f56","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.0-0.tgz","fileCount":388,"unpackedSize":14779158,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbQ/IOCRA9TVsSAnZWagAAELMQAIGVHv9UYfVOASYU6awb\nURjLtS9XKwE3QVjkesSl1QnuTsv67f1nM1pdA+eN2z8uGFYgjxms9rIhyZGP\nxM+fQS0XZYn31KVRhol1xK0aC/i/4OYSzcI1rNLBOUyAzM3K57hba7YNJI1d\nVGaZEXcRjuXkvKkjMvTk0sa7DFJAaKe6IP2X4XB/1q/4ErAa3UcvfHwpUsc9\nJTR9vD31BsdvC05msuJHXKF2giZnUcvdt9diZ4oeECIXxU0CayOYf0OOmjGz\nytz8z0aeyccgte5hmBHJ69l3fPzjfkPJkh+dDMUHvqvkSuivLPP5OMCSGMTs\nU15T8NLHS267QEaLvYB+Q6WhdB/Ml7ECAr1YN4IIovfjt6FuLuiXq/AkMG6e\nhv/Y6kbf62AGHWVVMOl2h8MDSJBkrPftgq82okbd9cH4F66ROUlvotsm9MHI\nFuhPuLSiqGK/tnuPdkJakbsL/W8vrqqKnWUFxCkYhw2e4Dbhu46QCWNKDfp7\nDdXJsOzzIbeb8aAcnZuEHVpK922FSdRMyl26VIsa4T47sxyntVJjm1SW6MG3\nPITe514zfvLLYC8c5uHR0e+d+6wvygbtrJ88INV9sZYldgmfq7LZ4icRM2cX\n5bkxvjyVAfeCUjTFD+fROdisctYlYJbHT+SUdEOrYX4wIklCuyNNxjnzQdLE\nG+at\r\n=8E2f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFdL4bPZQUuJm8hMa1VUn1PmA6mCKW8RbrLzoMnzz+VuAiEAt6dK2OVzQkWg1sYcZf5hcHFGdoZ7dONAyHh1VeXwrsQ="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.0-0_1531179534052_0.38000221514949417"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.0-1":{"name":"@fly/fly","version":"0.37.0-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","prerelease":"standard-version --prerelease","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"aa3228013c86f79fa3c135069ce4e5a459952d30","_id":"@fly/fly@0.37.0-1","_npmVersion":"6.1.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-Rwx4mudyP1GYwFLX/egjz65CL7HHMXmSOmT5EwQznwXnDZtk94XEh6JVW4x1wAQGskQd4kNSkoZDFHZyjpDcnw==","shasum":"a99d2b28b15ce42b969f3b562daa5ed92de9539d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.0-1.tgz","fileCount":403,"unpackedSize":14812567,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRNXuCRA9TVsSAnZWagAAlRIP/2HsBPqcHqAseZ5oWWyY\nkmEP/VU8hGVRogKeufeAQdHqAb1xe1aI8O2IkNiPQ+IkBuOXA7pwcm+Inqgt\n/oKJg0AubofWo6KBUk2cq7zgEoe57MHocc71SjUd08zG4fZm5RXI/HMoHmgE\nMpn7SUt1SkkFUCMZ8KiWSpqSCmoLLhtVCmXsYDW3kOHv3cGs7mo9QyFnu1OF\ntRuy/3NAfMURKSlkfVooRft+takHzRVroi4iBACTP56Hh9FDtR5OqYWWc2Se\nLJuMSXdXLVEp0L/RGTjs6dozXqmF8f8kpX/6X4nEe1RRNglgxCiuz52tkBzW\nyHweo4b7q3xJkRwTmq5sPm7VvWYsDYVXQaV7ZM1MgjCieOE60BfBzBmmpPYn\nmrjU1OM6onS86UC1zb+cmWv261cTuInIpfJlaL1yI051cfyIa7EE1yLLNYYC\ngEgaHsU2iw/yRa1FlPf8/7/tpLNTQPre1moj89RVziUmoQqI0Q+KEmnyH83i\n2ugkB7qYX3iuKqK0XWkotl4Lj8BrWpK0EvTY7PVeS9O3ACdeTJO2TAD17P5L\njnTobFYtgAxqnxiVjG7sMZxPU3tjCwZi/Nie1EWYoLY639q7D+pcQMgFEdXE\nWmW4ejcc4hCJNiqEydq0ZeqPBPr/um7V32k4t/Dhe/SAJj4y8fWEH55bZ2R5\ncbl0\r\n=oB3C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHX9pn9En7P7HferUKt5i+aNqg/7nCytxDRqYjHTB/KvAiAX/UWJfM0NHI1aDwHpUDlsLi98i9Ug/Q1zkGomkOOU3w=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.0-1_1531237869701_0.6619862137093477"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.0-2":{"name":"@fly/fly","version":"0.37.0-2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","prerelease":"standard-version --prerelease","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"e035eea789cd713222a73d99272277ebc60e3fb3","_id":"@fly/fly@0.37.0-2","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-zyrWUuQjAj6BDmZULqoX9N8rvjH8NXTAJWSWEd8ymfYmGNXUO/Vtfg+03LTSMmKna+MX7QlgNRM7VNmf4LMctg==","shasum":"53ea892a6f79b03ec4b22fbc94bcb432e0841ce0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.0-2.tgz","fileCount":403,"unpackedSize":14813397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRNySCRA9TVsSAnZWagAAwcQQAJ/PWX6h7/prRWnqnnnv\neaz+PhNW4jSD9iHBR0a2+avrvZDCtQHsOFbmaBEgTfS4DNghk01Z5tG7blhX\njaipQ/2lQ/oJbR/uBRfR8A060Asb5PzxN0Eb6HNVWL/27F/7kygXI+yg4AJ8\nm+TNze9ZMdyyP8fAFJbUY2Geb1Q4kcBRXUjXRvCUWNswJxyV4WvUZ+NMrMRk\nZ4kmnrFEH/PzhVns0fcA10TdpuoNio9u08PsU3Lk9pZtHAh7E/MpDUe/TaCd\nBiJOrTvJXAmSQjMcLEl3OPD4Vks38RL5Df40exb8RzN709HSr2FfwM9RZ1Jz\n7r1VAxAn87eBIUh6v454yonjtZS9JzYl4+BZ87pEfvOY/s5Mx3eJ6CPMdAJB\niR3mNHwHUfq76SOnb2Z8L16VxeTA0kFxl5r881F6mqIWDjSFwdmOVhbPxnz1\nO9XhIAh9FmNe/qusVVS18kCCVESMaSt16QWJ0Y5kVBuMwuDn1roecOAi6vQt\nnHpNKtXLuBZsN9CBfOqHzrU9o2givVWTl7ngXBvS5eW12JGnId2BYd6/HEYL\nCc34g76QqEPqaypN4rcMkFwDuKipg6Pkgbl8Ct9MTRpnPvQH0AD/ZIfLpmGF\nr9tUK3d1LmJ20tc/knByVOH5Jsip2Uo2AENaFtlZizVYKTKNORXWGSG4iRSU\n8nAE\r\n=+SZ6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD0WOdsXf4v16917zHCX0O04+LeKNt9WBn0GPV4+LlVUAIhAIlX5RSV2kXMN0GVDP/aYt48W6/OSZ4YfdoQd3fNdhYU"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.0-2_1531239570609_0.6898531238920629"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.0-3":{"name":"@fly/fly","version":"0.37.0-3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","prerelease":"standard-version --prerelease","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"3df2c0c5274d948669c3704eeca14a70fc3e5df6","_id":"@fly/fly@0.37.0-3","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-jQm1sg6AbTAylwQ0sYVlu80paVTKuHh5QbzsAh1R9el7cIfQ0qBa+jb3xGAsWfLzH/l6jV0gxzrOg9h4ETV78w==","shasum":"e51c60a8c6b076529e0d964e9c5f154636b0bec1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.0-3.tgz","fileCount":403,"unpackedSize":14827643,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbROxaCRA9TVsSAnZWagAAuzsP/jFRaeUV/oSH31K8v1m3\nCKob6+nYYvDOc9UVOrEA4lPrxCrjQlK9wKG4eM2jpstxqE7Y+Lm6y/cGMIdf\nZxuogQ3hC/tLfu1kMY4ehRBFk36sCfvhuoJIbc589vxz7FD7pKfEtIWUD0mS\n70KNyBHUOtY78l+V33H/vaMoaS5aCFIk5bQAfYY6eD0/M2x7Q8mZP8SdVlPI\n4UFF511ml+FV5EsC6DGr7zIlUYVNV/Yts6ATWrOCn6e2oZ4GQxXT81pX8OGg\n2yakeS7+fCwuY5qrFDBGE7Zo0g7Rar0KNCHwCuFrqXQcuUegVksfe9DQunNw\nQtcO2x+udNpenm8xTXwPwxLH+y6Jy/urPN9MEHNzMQF8greLI+uj79TB2tEp\nq9DKd03RkR4fHHRIx6Hb7f/cSB5WJ+HDuchRkGVq+RYpMxi+j3TuRxydPHq5\n4YjMMyLLocvz3xTKpTiJjUjixXj0HMbuvuuOlnsUu1YV7442ChX6qYyc6rPJ\ne9sWtX0G1zGE+oaIxKeWtqnGejxZCsUk8pcIBh0YPJkSx3G77RjMtjsb8nkY\nBQJdk2/OR0HGQnYYjXA4Q4FhjEJSEKup9WUdHv7H8tMCNgbliZKuJoWerpDt\nw8UWo3kT7fVX/OHb4Ja5UeyC0whyqAwN2dcnRybrT3RU/1E4ftYAkXx0/i4n\nZnHc\r\n=ljWB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBcW/meXtq65U2ly+G3QPu33+zLvJyv4KgxUwSyObwPhAiEAmW/Eho1oviLrFhnWxDOUlW8TBk0f2IbQRuC2vfiltzU="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.0-3_1531243610259_0.8292328023362283"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.0":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"9364cdaf71564872ade0f5c08987a28df3613db6","_id":"@fly/fly@0.36.3-streams-self-clean.0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-imO+RSiUUhXe+vpDYJz1x0fUWmDaJijcYG2nMkbIxT6oiHhvdYzxBKVk+BD/rFWhlvYOwpliNIYcL2eKi3DMTg==","shasum":"011f931a0393934257516385408f5182786834f3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.0.tgz","fileCount":384,"unpackedSize":14766286,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRWAKCRA9TVsSAnZWagAASKEP/11uAiEK5JkbS3LRT3Mw\najJWlq1Z3hUhQ0tW0sl8K7YAFXKXkdqLLnfdEsNAA7o5IxryfZBr1CGMn3bk\nkQhY/9wdz6o1ml3AK7N7Iqm7LVQMFDu6PMX5a/iKeGonyiGvOOi3U0c+EpHy\nVlaSD9y4eDqA9bp9LsIOgqo/1YzKBrsT2/sE6fzsOns3qPxcX0f3rcgxu9dq\nwdA+rCvO0f12t4F76/WiYrCrGHF//1A7XJE2a7OoVd2kp/Y+Ma5HYGipKKFd\no2fqGcWbv6nGpo/7I8PLF86c5hF5GFZQu+Za+huLVRke4fCK2oclhhuu/HP3\nikRusccr1ZXlmwJo/HOgI552NtxJJSER3yMpsV4JK2uRaWlSdbzqj7kUfR8G\nYrzD54PUPzv8aJwZHNF4L+6RpC9RX6xixGNP6mVXRL3UCQ2SNr/dNHG7nQAj\n3lD0t74bKxtiHF6OqyH33b8rmdKnMdxpI+Q1SOain9KSZPqYJxfjgdppErwm\nHiLXT+IZP258PxCAUBgZOo9rlaQLpi6BYMdkk7BFGuv5MT2ZbEpZcxPVugmW\ndYj/Dfjpb65kQ4V2XEWBbmvzmSHABXt3zjkKuEzwktOAIm/MvkOx2yBeXHd9\nI2O9FtF+MusCdn1d2+508LlHeMBFTHyrUSL8SRUwou8c+xAdgh3ErniM8SQO\nR6NZ\r\n=rVzS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCbZq1uZx/z2XceXwKnZN2vxe3S3dJ0NwfCxQVFLXAuvAIgWKgCThR545M4AAldFbJb0HMj0x424+ahB5V2i8ZCTwc="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.0_1531273225889_0.8365500577509277"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.1":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"9364cdaf71564872ade0f5c08987a28df3613db6","_id":"@fly/fly@0.36.3-streams-self-clean.1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-U7/R9zMMUZ4bwp4wrhvjp67FHrHRQmTETCaUnP4UgHeqCHedN7hZC9EhDbXntNOyWabc51S+SYeCneAsi37low==","shasum":"b88fbbd2b6d4aaa2c35a299bf423b3ec0a42d39b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.1.tgz","fileCount":384,"unpackedSize":14766399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRWU7CRA9TVsSAnZWagAA3dQP/2GH2+g9lo2JCA95qdd3\n7SzvZm+Ky2KVHn6yZrM7lyofbcP8vfNbYCltAEMKt2c0u1IaUMY1KUAp2u8n\nvVnF8qoVr+EtoSUwcU/mgiYH4m/M0zlZwjbG/Utyl8pYQGjns7CF/0l9V6Y9\netXWuh8fWJtOT+6EOw65mUSwygHRgE8FEWjrou5+qWbH8BSYMGPxFHgJ22hs\nqqHC6qi8BQaaXM2rwDwgaueELk0HWUSRt1YXU0bCi162qLl3NVgpvOWBByNN\nbHPiBkHyKuzFL1VwqVL0O0hgCbbNrK2jVLefcW8+am4WJDdmz6t/1CR8sSWX\nuuXR8fDOox1FAMEwfVVDQ7J+6O3j48j7DJqnD6iJul7Cee3kyvo2trh653h8\n1KFEJgslZl6Hmz4k+rI54eRdLCWNbnfuHG+oX7wGDmjNGHF5EyNNqgpEh13W\nq0jSBf0c50PyEryySYxFep9ZL+naDyfPb6LV4Pbkp/QFpgjid1a2KIpWW773\nLbgh/dQ3hwlGelZydAPoXrL5QbJJ33ITrIt/pRpgo7KCGqjOKsLWeanqlmm8\nFO4QRbm6pQKZ+Jsj3yiImlehbgUySDtT1O85Nj0tutzko6mNu1fIcqf/QpHU\njMB/OYBkqYyKsi1ifgqNenv3hiyN4OC7Imo6vpfVKLxXTm7djAV8u0BoHv0u\nRU2q\r\n=6Sb5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF3Rqv7fDC3p6Tx0kp5ezGjwZOBG0SHGy03FsecFxisRAiEArdgvSzON/eTmg6wWUG5vdlnVJwnArR4CvNyINC+CFKo="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.1_1531274555620_0.9182582532966295"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.2":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"9364cdaf71564872ade0f5c08987a28df3613db6","_id":"@fly/fly@0.36.3-streams-self-clean.2","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-IkYrXDGOgCkd3QSE1ih1RiWQ9cHEnqIT8ZPELd5lJBFDt2KbMbRl21s12CMActMClFlM8sgkEwNYKSTda+gB3w==","shasum":"c56893d3f3e88cb24985995bc61f675b9b926c49","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.2.tgz","fileCount":384,"unpackedSize":14766370,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRWZlCRA9TVsSAnZWagAAP28P/0OtY0kP98Vz5KTXBB3I\nMQeJVX9iXyFhx35jkLSOsB2l2SMVSdG2zQAwehRoZ2tG515U353SbgjpMkY4\nuuT4/sAFWrc9cNdRP9LjR7pMSA5+OYyshYGsQXTeSDqJncF0PbIgcdsjqKYo\nvv4gXcel0zoAIrwN6txAJEdHlmYa+kE+Xm0QQ+kLTMVcKvR6Fn6eoAMugDk7\nZzsHGg+kMAN5tDd22/aePiWCckY/Fg3JUYHBfAnh/+nXx0XHu7rGUzXMYYUn\nRX9lJOpXgaU4BQej3HcZ6xcC2SVzBoVYP24PQW7nZs1NgPIOdSscecskPOZy\nYqKjRbTfcYMd8za1StJxyn0Le0pSS0otKqiZuXA/LuMzIXELwPZfc6DCuAhP\nTp4UJm4ljOsmIH7dmT6EWhAYT9AJBxFoWms3XDgx6aAqXNdLwSeCg905JizZ\nO/YeC4SfTxIjq616H7nlgKla/U8lvdxLt9suK7Y0kXVinYBpKGbNs2m01Y+S\nXZc0ioWdr1TlAVLJHA/8C6uFY6LDys9yh4lBcCqON3l4bWMI9jJ5fw/Z637Z\nejsIw2hcXDWYF9PAz8ffV2TlR0uwU4S0Aen5M+KsYG0j/i5cqu7HcMaxu9DP\nHUEzHxPdfjFXt3Qii0319LmRTKyxO+dQjdtAhcIiwiP2wt8bfzJF6zzWv+Qx\novlz\r\n=Ki2v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIENzrKFo2c0Jf6eo0Gnz5r/x/ojY5Z1C4w6x+dqvsNJvAiAGYTAadNHCGxErsLpnX0yF9TBV0ZDDgnJDODvVPuTaww=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.2_1531274853095_0.9289123173754461"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.3":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"9364cdaf71564872ade0f5c08987a28df3613db6","_id":"@fly/fly@0.36.3-streams-self-clean.3","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-Y4+P4V8929jXAiAeAchDsJZG8eWwgnbKCkmgRv3Wn1iaqh6yGBYCph4/i0YMsDKupk28ceIDVuc8fUxPxmixlg==","shasum":"b722f605f64d3f6b4b015d7d583779e02dbfef0e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.3.tgz","fileCount":384,"unpackedSize":14766624,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRWd4CRA9TVsSAnZWagAAXjYQAJe2pwOkcsAR/4/O0Qej\ncvNqb4forJxg+a2tdgDCsE4ZBYg9zdp84eYLEF0tbB5PVppJilCNjwGXJDO7\n7br7VdiRbVm18jCoVkgOXdyPNxj4nw1fJEuYgopqnmYXDbKMgnEbHPcvOI+d\n7pw9jPNLQl2qebyWqYgpxlI9cqOBaPjk+ZOwBL/K/0XJptsBmIhItQ54QgNn\nxkN7NZHeq1p0LsR50eouIQlfccV7FITjJBbgvjt8QRDUkvZUoLguzJjeqmr0\np04bfwDlSG2YssY5NjavrBCiHjsJ0U150ZPAI2YazJn0hfI3rNgVwiAvOlum\nNl1iIaQs7u6cCEeGcWZ4/smZ/a+qzFtE38JgqzgnBCb9stBpITYleMIK4BkD\nRhuBzUudIHeLSTxsAK5iRlJJKnPTznWconxSpFQMzj1cyoNeaqPZgfv8MMRq\nqUrzzJEgtvJPnXFBtSyxKrtnTC9T/oAcoikQUyZ2r8oIN7ztFxxT29taaKnZ\nTCO7+NProrJPLv+zc3CM1ZeZ0GfI6quPoKHUYwnknEFScauxtD3ZN0lAy5S0\n55tdqBla3LMZI7HzwDa4xk3Vszr4nOriCqWpso1qs9PH2SaYG+WZk7FEYnVz\nKpl7dD0AGF7yVYdbHVuOZuqVXAjrUq+jAnulEnvXbMEelYblyZQAYdD3Asr2\nVhZl\r\n=DgBO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCsn/18LrGDVM+dCWFS68wZKyeT50l3OdKJaScf/kzDzQIhANRnaAuoAU4GG9Vg+mconh3k+6kq3SYBZrdf/T/9cfPm"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.3_1531275128258_0.7184526338833157"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.4":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"9364cdaf71564872ade0f5c08987a28df3613db6","_id":"@fly/fly@0.36.3-streams-self-clean.4","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-okFzwZ7Xn5a4MhLbxSF3mRBvijocYWDMTlPzknNmp72FHdWuB1oM65/AeEn4PpZepmeHVedDELkoNUW608eXGw==","shasum":"8cc5897755154a2c9ab9b2059465215bf7cbede8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.4.tgz","fileCount":384,"unpackedSize":14766759,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRWjfCRA9TVsSAnZWagAAiFcP+wexorfPLrGm64Dv2A+j\ntwJmSSh1ow4mEeHLPvjW2p/bGpB6CZtm9GBrqCgixijjfJBo575+eOJb6mLy\nTkGapo/Ug/PT79SIRVGEetoV2uftlFpOmPUn7N9F/YblWBdppKGgF14MNXJg\nU4+8su/M67ic5q0B+2udmgWWriM2cwPUgcolQjkQeGjzuoS3CWzdjk9JQb3U\nyLty4i5qFA9FD44iOlh9rPiHBGMV75YEawYHAPDYdKMwWEMsuwI+aRALTo45\ncGvmnFy9ewCeEQJfPwAhwUacqNsLy+l4RHWiDlngKP3fY9OegMHPHz5UuDGb\nLNbdlA2MtRfatCYMA3IEkZUG8M5gUnp28AeRdMaeG/cVQ9g//OSK76CKiZHe\nYp6+pfBUiMyYVT49ZhyRyZC6BeM7NmlB/YrFhwMPzSwavt86hdDoe3XNMqb9\nkblVRb7dsRxeHyI2UeB1GcVH2wX2yI3pg+1ODSkjCETsrK/TukaYa8V4BM88\nknEEYNWU07wF9C3HWGPBvo34hskRe1Bzvh0bYlNuZH5k7fK3VNQfuwxRCYK5\nTi+/Y9g1r6A5esgK+lLIjJnAJx5PfjEbNVAaySJVIwMQWnJ/WcFDKbBxWW76\ncC9GKxw4yyOaV5p5S0M9fnXMfH5QiWGBoDgq57ECHNFpqiAbUAqtta6XYF7Z\nhkcM\r\n=dHWF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCWPYqR2nU75L5zejCgGX/nZgaREl108KGoAg9S2gvpqwIgP+137I4gw+Ey0Tx+pc4lx5nPlS8SsHg4ZJjv7HoIPCM="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.4_1531275487268_0.00003845397877255685"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.5":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"49cf7a27a015562d2b1e54552212c3028769f595","_id":"@fly/fly@0.36.3-streams-self-clean.5","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-iLmSJzLSueeBk72+147viy4UmkYU2pIe7k3hWInp6KjvE8Vpz8ZOj/gzx662KRJHEb4Yf3iPHFlfqbIcR8xCQg==","shasum":"44578c7e334ee480f810659ee727a3e3f2afc662","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.5.tgz","fileCount":384,"unpackedSize":14766805,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRhVLCRA9TVsSAnZWagAAoewQAJwpAojT2gd62rQ6WKTP\njJD5CAiQL1+m8CAEMqD4NzjBoXy23yzSViyXpYbLQqeXXDbK3Htp733UThTV\nQ9tmr/+sdTR2q/qrTrZ62F1oA9ibnqvygG2Re5UIWu/gZAOfsmktcSBVD5Br\nGaKMrsFcVNBEevf1pIsl3sC7OOH/ZhBF4YCprvgd5nNIlgIiW4TU890TM92d\nFakhafCwbPK6ke7GZsTd9o5Vcf2akjofQjrTCqKTrzxECsQYPbTY6OSGoQZf\nqIrUMmkU7+D/WcZ2aHx3hKwO4TuLJ9qbgtq5TbS6do2eWgUGuy2gJuIuawZd\n1JG9ECkKeCIgVrqxTO7iaS9jyzXb4gg8VqYlGP5tGrKP9v6HIC+fOS7BuaXG\naq1JMC9eNT1nF48LRFLW+STJmwmzxFMJPvbY4W05jVRtVtbz0doI+2jmxkSo\ng7vs52lUCIXGYFwqIU9Hf3vcmXpmz1Oxxre5E1/m+NLRlvHNGq9pxD/D9MhM\n/GmBRBJ8E8aj1HrnP1eFP3XSBSmPohhJlzuwZxmI4QoHDz9f6+d2H0F0oT2q\n9iW+ywDCc9YUHgITdptZvT71lJlw090iPOvx2J8ZYnJwI/lQ9li/EDBYAhlo\ngGl8QRZ0NlpIn3EYEu0+rmqAJLRV1r/TuXrmdUZVMsU0Ut5Jd0Ydf8MPLlG0\n9t0a\r\n=l6CB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6J0HJlfNDBNkKu3JEF+bzyeHO1sDwKTyy3R0O2LO+SAIhAIKoQ/pxaCHFuTZ3ini05aKM9bEXN6/KvFFqK5NrUNlA"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.5_1531319626920_0.9101145556852877"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.36.3-streams-self-clean.6":{"name":"@fly/fly","version":"0.36.3-streams-self-clean.6","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"49cf7a27a015562d2b1e54552212c3028769f595","_id":"@fly/fly@0.36.3-streams-self-clean.6","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-bdZ9ecSSr/qz6SmmpghuVumlEYOKwD9awMra3rFCqPdgb5tBez5+zihIXotISITK0y7gn31OCRIEvgNOOMf2LA==","shasum":"c93152163d532ff68246bb73afa9aaf3552a3715","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.36.3-streams-self-clean.6.tgz","fileCount":384,"unpackedSize":14766797,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRhXQCRA9TVsSAnZWagAA9WQP/RgjqACpRfdYNVmBQBWD\nusD15dEJYXrPLYEpqrAmsszeknYVCWTG7uADeh4IOEx2x2krkRwI90pQNbvp\n1PcHceVqCK+PYhYFdtBcND2f5DIRAN+90RsgYFBezr1klTcI8/dZ98auWCMT\nD1nQUFKnFcJNd5vzGzkx73r2UZRCw72up7HAVB8+hKhnkV/ETGHCBc24fhM1\n2OBHYH+JeWaDJcVogOnfT7NBluNnwpYJhWCY8QVMj8O3OLrsRGNRSo8N05pB\n6s3Y/WaKXUG0sYE0OF7Rha3YxGuDRyM9DHxDK7OpQoKw+Kej2gr5CZUy9lWq\nqjZ8Wpxwe9IJ+EaJv6mFq1xIOnMOGJmaWFmbQjewKqJApjD6qvGLiDvggWkR\nv7I2znJBKDEFCMJya3tG61kCFxdorLefAk7fe+VvzcZVqv4OxjfbKhhRQEF7\nIg3ezwrL1vFwOTTefStFbxGL7ur/OzNbxbOOGgFASQmTkUV+xR9RmYWt9zdY\n3U2h204i6CPGmQ7LhVts9aRkRgYaq1gNWylXE1gdUR/RH1PT9NpEVNVAIPvb\nfhUey2q6EC6b+JYPKSxxYt42Xj4NMMvOmQtnUufpHkmP8BzZj+PAOHp8U8B2\nau9lCTR6VWk2VR0KavUJ9qkMV2Yte6PkDVLlxbR8k4G1qZLkzcPzrWpmaxm9\n0AIh\r\n=gwhH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwpKjmgIH3lZMNJmkvHXQVV9K1FPyYx37VGSWTMWjJJQIhAOmXo6Pn+RJPzxKm80zXwVNca1Zq5WC0bDCJPg4NuRh9"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.36.3-streams-self-clean.6_1531319759892_0.2737960294521835"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.0":{"name":"@fly/fly","version":"0.37.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"7b0319222d97ba95f40f53cd66bf2a773db88fc7","_id":"@fly/fly@0.37.0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-bTd8VSZmjduExzkmD+teadW/z4FhStF2qxQGZDEIrX3BFPW0hnfMKYvEkqNY5wQjmN5G1Pu40RhlioLPDEX8iA==","shasum":"7df75dc66cd33792f08ca4b1502132c81b4d0983","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.0.tgz","fileCount":395,"unpackedSize":14802491,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRlFICRA9TVsSAnZWagAAk34P/34+tlgb6eWVZtWwRTuJ\nM/znF4f096SZWnTrglCB9eLB/208WmYlhDT0XqbY9iYRMT/QqvyKvrjXQxPh\nRH3V0oLAsN3ThuQhXep90uYXKvj8ZjYZV/VS69M4HX9+lJTG3vBJLlPOMu8I\nfrB2QjGQq+eg0Y5KLmwim1+FFu1xtAxu5WMuDRJSIKs1UGsrl9LdeY0ioT79\n6obfW3bfN1WHyKeOFJR6Zs6Njh3TdHJUCfxG24VOSFOMdw9uuAbZM+78Acpw\nTmeoxJdaph+H8yfySnh8wHDDbhmoIkh+CszGgczfEg7kYqF0mFF8IA1vYiR8\n4otpzcBb4h4yLmw87DfiHx1p/aVqeClXQSbf8H3ONLbKtO2Xwp8qK1F4eV/d\nzqhTwItDiO5TsvfD2ujvG7ny2HSTkYRaSsyzNdfgwZkf+F1LEuWZmnfwK7th\nYtjrIwTJreEI4RfHEr8VLxb2WvAPJKuNhDHwDiCcNMwnWyW5b2lojtNWIIVQ\nY/x22Emu9KA0TXIubC2r9ydM4vw9IvtnnP5YONRAhrvr95nH+Bh2TElTArl9\nTbxWUZGYcdRF/L8N/SOrJA6fExCxktEaielC09I3Z5zv6DYEa6nE40VHP/vg\nxvJ9LgPZD01iVuwTlE3o6fRESzX5B1z/EY+bFaDoIURr4Lzo9GvC+eWyUHIh\n825F\r\n=Q5oU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCIDH1dPiAW/IyJgT2ac0qertzSKaD6Ya6fqsBsEhhwovjAh9ZjUwkSVsHSmbmbC+/MrEmsgG/r9L/W2hdiUqMjSM4"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.0_1531334984287_0.8447897346760296"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.1-0":{"name":"@fly/fly","version":"0.37.1-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"b7a68256dbaed7a09bf782d1f59b6d1769bca390","_id":"@fly/fly@0.37.1-0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-vK9d38tzdILqDbglImpjfuS18pyiyFhtCvai1/+arCczCg2QOu/TND1ANKiRNrqqHTNv5cxHz+25lEPw14vjkQ==","shasum":"12261c7b0ad00c7bfa83accf2b49e4c7f650ef78","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.1-0.tgz","fileCount":394,"unpackedSize":14817832,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbR7DwCRA9TVsSAnZWagAAOq4QAJl4goVHd7r1sx2babkl\nyRrWu9LqDyz7mZ7F+QQ8q5slsi+6w+wPhoMiWJKFMPcffhLh4mZXwXvOwUZ6\nSSE7TXtOAdhgYydVYh8rRtCO/gN5XWwnsAoX55qOvjjU0l4j4I6DfPGpt8UY\nad7YdgJGsCjvXTJRPi4/MiW8gpSBfGiul4xll5B3GV1dTHWg12QK08QvInA8\nGNIQ3Md5EPT1bJ4i299ok8JcEni/dH+2fzGjKzsQI1H7utz1eWkSQtwoRvcl\njq0EyPiy8lAHJHNotKKJX8zDBazRDxt7jJVuQsVXNIEn3nB2Pb7vZmIt4aV+\nvw9bEMsPt6Dcu2hlms0TEnv2F1uCo+dtD2TaY5kPzAAQ9yHRHDl50MXHeMu0\nadcMTmxA9RZyXxZZVufYbrBi90T3s0WSfIfioJ2XrzXGb6yuhDTIm+g70jIz\n5ApyY2z4Wa0idSzpo0Bco9T85gOf73v/6KlNwKfnTcmwTAgq9DkRtJTyset5\nwOOCmnqSRyuW8D3g7U6C9+LI0o/EWpy96WQeCmEwTL7S1aTsyBKN0pYw/wuM\n3vX8oFkwTUf6fRAFa3hZIcANRxy0ZD7uvRvmGOgqnZDX4+MY2P0QQ2e6OIrj\n2gss0hhXMToAz1nH/N3KjhOQRXRWGkocv2nF/MBF44gV4/XQ9GzWxBo3xiMo\ncAPA\r\n=DznY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxdq9/62gqiHq9zsOH1FHudNw5po5Qs1ugxtC+S8tONQIgAdZxVftrFAi7l5kUYnKPpjUDM9oaL1cclh2UHoWBJvY="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.1-0_1531425008505_0.5898362203421912"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.37.1-1":{"name":"@fly/fly","version":"0.37.1-1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.2"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","better-sqlite3":"^4.1.4","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","sharp":"^0.20.1","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"b7a68256dbaed7a09bf782d1f59b6d1769bca390","_id":"@fly/fly@0.37.1-1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-dQf1RHR5vSsOsj41OTRypwNPvSTtgHojalOOO/rQTYvDal+S6ZnEpjied5V8BQFWbjQczF9+n2NNUZAdLJQwfA==","shasum":"190240e4a3eb28cfe8dcd1cb371e3532dbaf0ac8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.37.1-1.tgz","fileCount":394,"unpackedSize":14817411,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbSNSOCRA9TVsSAnZWagAApUIP/0IDHrDefTZSO8WXEyBx\nEroASKYoK8IdEl4JaIntVb95LCyRZLR3giFzBFBIh+mQjeDvjDVFYfpsxVXw\n0giesezyeu3rzW577EFxU9+NxqvKggzjsZIlG+mcyyuF4Uqvljl/99yLQpPX\nVBCOufjb/SJ/+ENSGnBF5JIVPxkgUoPdND2ACWkR1mgT36K/4E94AVVpn8kM\nmJbOo0ECkweIXvUgXXgeGHMVqcuO0QAl9LnaYeHvc4Q0hdV1JGCzVRqlFg14\nPQ8Aohj2Q3sd5c8fm98pphlGp40nDQ9jSSHGK+V2ErQpGUvr8t8N9eJC1coc\n+o7+2ny2hV4fT5wntWkuOQ+BbGxNYFUOMpyD8rYd9J84z08g28zoi/UdKq8o\nIBwCGrFrw8iUyk6zf3hSwl1Vryf+JvWeB5TNaGygm316CTZoYE5X8SNqglsU\nvjkUJqC0OZ7j8eA9K9iI8mTcxEXqdZuC2wAUs1sV4wqf6g1pI4DdPglfqcOi\nIj+5+CU+H9GT0C0CKDVMS1dgf2ZpKzIdd/iJweiSp22Yikv8JAuFy6jyNrm/\n4fCg+Fi9QkGn6M57XY3q1uZCAbzd9GgKMZfeP3nJrTX+66jDFSb52nNEWKlq\nWtmW4cRgvynUPLrc5Cw75EHCCoT79VU6a6s+RPn2dgsn1a3c5eV12HWShfLw\nvJgP\r\n=ixDh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJlNH/FugkhSddlSG6OX0nliOiYKeSkcfvfeI5LJM6iwIhAIgKor9X2u0VmeUOc91Izp6Dc4dt0ljx3ArlNgF+V0F8"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.37.1-1_1531499662340_0.3624462799292989"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.38.0-0":{"name":"@fly/fly","version":"0.38.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.4"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","@types/execa":"^0.7.0"},"dependencies":{"@types/semver":"^5.5.0","@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0","execa":"^0.7.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"7b00c63bc87b7101315635e1c0ccfb142506784a","_id":"@fly/fly@0.38.0-0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-CSn9qy3ZMDbtis7/v9ag9m2fBVbnnIaSvZSgW4pQSnphNyo3hUJxNImzt1hUtjYE8sR2UVbXTVc5Uo1todgmfA==","shasum":"a5c9a01031dd908ce3dc363b5a11079aa113d3dc","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.38.0-0.tgz","fileCount":418,"unpackedSize":15057622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbUAQfCRA9TVsSAnZWagAAsp8P/2sjfXSGHFBjINjNYBeJ\nthhJEDIecInqqTEdn+NIA1PQx+SQVrtPRKRendB3Qs1NUAE3JT9h2oGYQJxO\nYgLcWPCd+tWwC1xTXugq0pPwcbHxEuXOFo6kYVNWtHs3eeSWV/MvtXmHwthc\nmUkXO7WFjRiBTYPj08FdZaHSweP7kY2B9HeEDNgT7t+V9v1B3/zrhmV2kERE\nJOr8zpjNA8JdBs7PcBUUmOVgxWpMQQoALEygviWc4X4dGgtn2+fVCyYLH6oL\nBVoL+dlWX8bYt4DVI00jpyLIvaZsO7KT5ZsN7tGdJmBBQs82eT4L48gAiwtQ\nB+lHUWeeO1Tw8WsuCakcG+oArgNZAEBoDQorscRZVCzL7+j0gmcgunJU+pbM\nUGxYKE3u+U4FjWNfpALMNsUil7zKCVzGWztmTzZCmKPFKqC6mDgYoa+dyArI\nHrtt7/O6pyZNMBhi1J3fCNtVyZNy5RcjMh9LdJQqkWRJd4AtTC5m3cIbw/8O\n5TzvfZdEU+xJUF3KkXgE1z7PvkcPvPmlb6BYSLmsGhebzN8Hvytyk1qV7ylw\nkWakMDv7HT3IPRWpRP/Vj0k8fughRkKsQOjTBSMtaNed4Y3PJp1zyc6KJLBq\nV4rlXEqyomZMYvdYD5Zm9Rq00XZA54lqLyi+NBSvABk+/ivRXvKQhg40dTlL\nJ7eD\r\n=Rkdj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/usiXKNCqdCaxQ6KiF5ARC5m7vPY6FYJF13X8g0rCgAIhANaYddVX0bsT7yWxkzNy5VYOajRM6vTp+3I8KVkxURVP"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.38.0-0_1531970591539_0.606206891236085"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.38.0":{"name":"@fly/fly","version":"0.38.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.4"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","@types/execa":"^0.7.0"},"dependencies":{"@types/semver":"^5.5.0","@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0","execa":"^0.7.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"98dfbb13c107b96e4c67582483a0336b9d856c93","_id":"@fly/fly@0.38.0","_npmVersion":"6.1.0","_nodeVersion":"8.9.3","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-MkDw2LtvJfOiNwverj4tTqNFPXG/YyprijqvRhLpTbBGuNPEiJXEmbtdqluBL8Vu95/qfRw5kuVmlovvxGNDvg==","shasum":"32360e52fd1a9a5d595ed3f1283ece3a7263b333","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.38.0.tgz","fileCount":422,"unpackedSize":15223254,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbUgXYCRA9TVsSAnZWagAAEyUP/2FS+EpUiF9VJy0xLW8l\nBXmdFAiBw8LY9hGgF7PLg+koFejp5eLQtfkqws74v1M/QjgUyyRxgjt2qetg\nsquBRyinmUr5hYZWf+f7A3/O+hMLOQjG5qdo3kSWfP9xHm858mPVLCUf2XGe\ntyuO3kJDgnAghB7G8sEefaBpQWVxIvrzF5zDaTZvhfr8Sp26J7fHtFE+SWLt\nJGHebi7zbCcIF4FkDxtuCJrg81qhvEPYjSkYSOFepAdhKulT07lwoZ8fanyB\nPyNKiUZpjvIj9Lu3Cm862++y4r4OgtVuF33BftxbuiakcHpx2fyZWTroi4k4\nLUW8PBZhoKXIOmxOOvAAnE7lVUKNBjQEmRypdt0YmDIPP3dIXYKdEllrtDpp\nId8qBZyxR2FOiWqNc7YPtfyyarKC5RdaZLI8oMkAcNk6Lz6VtMgev91Qp1ii\n5sjB1DK7b+HDOxGtz3i9ziJ/vWMwZ3/EsL2/NkRZ9Y3nuFtIRSiqpm7caWfS\nWocH2lLr9Abs4FR68sxO6Hypv2TIGrAW3qGZO2ZqKcJH5dijbkXtxuMEiSab\n4ffco0vypcIsULtn/1E0T7QWvfYt8qcaDkmfZLSD9kE/LVGav/apxHHp6Itj\n/gODOkwAS1b1IgUd1YelVbkvN9A9+Gc3eBJbn3iutJRn7ChFPmD90RD35X0L\n1w9D\r\n=yNjt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD58I3LInHYFzfbEE3HRhcsBXyRlmB+SznTMI//J9zW8QIhALViBz3OCGhMj4tuv9FWAzawFVQmTukwfj3otZt3JnWI"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.38.0_1532102104073_0.48771860294684144"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.38.1":{"name":"@fly/fly","version":"0.38.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env_test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env/ts && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/ts/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.4"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","@types/execa":"^0.7.0"},"dependencies":{"@types/semver":"^5.5.0","@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0","execa":"^0.7.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"2c253dcc23f4851afe8c7225015b0f3d5829542d","_id":"@fly/fly@0.38.1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-zYT+t1Z1ta3/xs2ryGuimlrLGSzdDKovSbdCLjK0TpEjn/ulTc7av9lPedqAB2t0u3tpRxw4xJKD3Th7YDzdaQ==","shasum":"1a4674b72c1ec45888a3feae8df77ddf7ad8d7e2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.38.1.tgz","fileCount":17806,"unpackedSize":99723401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbUg7+CRA9TVsSAnZWagAAsqEP/1c/0zW9h27RKAH8oONi\nB3HCGGmgvQrsfswDoHXUy+s/VAj79swmMegf8P2L1m3SJ4V3usHo8BEAAi8w\nQBA8Sc5wyfBL+lIEA4IejH6/AP0KTgw7dgvUnWRY3HP939OQK95g5Nnsc5W+\nTmKawSgYJ2RvIA351ckKFGT3Vl+XGxwgixG+JfypIfbXWUNRbUldP/JhZOrI\nW3IGZrJnmO10WhPqvee2qHdclrSk+q8qzpQtHQ2cLT49Ngl/Gk6sA3W/Ai3r\n2265sgYrp8KXOlCxa94if+tyfo2/SATMQ7sogvVekqN3smVVQnXdujDOM2gA\n2UbG0hgTD4y7HTM5HuDAhUyjqZXW9TUfvjpeOvIYWIKNSZ8ojMGdln6R7Lqy\niwsYiesjbw5K3gPTm0iQAKtY7OmqlrF9SdjQnMy4XavklPQnYyPeh520SIMO\nbV7rUJgFYicOmQdFoWMakR8KqejWGoAqQ/F0pdA2uWNTRqi1bglVcdOe+lXU\n+l3LkqyArJsG6qUxZMtjgETifRS5w5m+BqbPC6jAk+KlL7ATw6kurQc3Wk7h\n3SMHez38rveJfy2l/1dt2q/+YCIeovuSra9wgo/fts0v64NBCFAgXXUi8I70\nval2BlniPFLKfmuuCGneec8Yuc2kdoHcmF/neA17GazqQGBFymiOeaIf/84V\nd/Xp\r\n=uWHm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICbEmjrFc/N76+SZ3v3wM2Q4I4dVNDL09jWL3Fk+ErfbAiEAjVs5XdAo5zzD2x923oG6bQaPSMqh4PAcrFlyKirdMLg="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.38.1_1532104445374_0.6953026269334319"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.39.0-0":{"name":"@fly/fly","version":"0.39.0-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"npm run test:v8env && npm run test:core","test:core":"mocha -r ts-node/register","test:v8env":"npm run build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"concurrently -n \"core,v8env\" \"npm run build:core\" \"npm run build:v8env\"","build:live":"concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","build:cli":"tsc bin/fly.ts","build:cli:live":"npm run build:cli -- -w","prepublishOnly":"npm run build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache 2.0","engines":{"node":">=8 <10.4"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.5","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^2.9.0","url-parse":"^1.2.0","url-search-params":"^0.10.0","@types/execa":"^0.7.0"},"dependencies":{"@types/semver":"^5.5.0","@types/sharp":"^0.17.6","ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0","execa":"^0.7.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"0a74fff8444c489e3b4cce6e3a08bb6d323123bd","_id":"@fly/fly@0.39.0-0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-6oIwCWsdxVXTAA+/Q9y7M+glHDr3RJEm/Qm+Ub0KoDJQ1HJiQMvCPtVyH81VUSLa84d73qH04akVMH5ljzkpog==","shasum":"575e5772c6a0e2658a4ef74f2bc0b5a7816c4b99","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.39.0-0.tgz","fileCount":494,"unpackedSize":15227355,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbZMczCRA9TVsSAnZWagAAHYcQAIGyu2Qf7ZqKZMsuJfgA\nXr92xnu88lN4pB2dW+JOSiVcfoonKfIlDOte2NRSEWp0/72kbww1QXXc5z59\ntpAY+35D5dRELsJnJ9LaeA+lHVgC9KTHsIJvDKgLufPNF7+Kl79CnS7eRhoJ\nnCW++g1yg1HUOv9B9OEOzwSruo31KbDIauDAoSX59YjCYbY92V1j6xzBy+71\nkhHyB5phDoXvmuzbE2R+1xHhTH5BtWVTNWWVJ7wlj1oWaQLtfmr6hFexNdHJ\n8d20wQ3+8vDLhWC88pcaJT2ax0S5K+5Wj0sBf0LcYNvlTXIvA01riKuzj+oG\nUhpgHgcEnq/8YlCFxg903z3Sfr74LGQAAy6fwn+v8WVfK3iV1nE+SXbb/Nsv\nLrR8Q7dvXRztWWE0IieOOkS82RaKM5sB+UHfpumABM8HgMyZ7caXZ/63B7kj\n73DYiiMSZcnJq5V6noJuvfwhwTwmgm/kNh30wZL3gUBdQIP1V0gA+tKdE7WA\nj2MPbRtvt0g6cPAhE6EFogK22Gnx+4tUW2VzCxBTnHMzUc/z/E9OiUlcKB1X\nWdRta0qSK2GYMtPD1whDj1GQ/CXJwiUwcVdIdccUd0xDstcAvKQ63RJIrxhQ\n404FK2zOICJDgErSpmqeSSmTXGFf4z53eegTR89f6qYbWJhGbHatHYqsjd/1\nMZ6u\r\n=APe9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgpdu02/vPkM27ZrLekjRA0Zz3laRgeHpPEQcuyWTrTAIhANyTBYiBZJ/s0miKvXbwCchIVW2hrsKHDr8/a5PBX/hm"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.39.0-0_1533331250730_0.1087632430385781"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.39.0":{"name":"@fly/fly","version":"0.39.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.6.1","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"6def03bda88362b23006a16fbda17619f1e1f74d","_id":"@fly/fly@0.39.0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-oh10GTZzg6WgWj3DLoDdMF6mfOFZqeiKfY5YVjOWn86gzweMxJzUHgR2WctQpYQAuI45PS9KfABszZrXsuNoAg==","shasum":"12273fdde5fb6e286e51a722ce892aa9a1aa0cb2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.39.0.tgz","fileCount":522,"unpackedSize":15645020,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdeGXCRA9TVsSAnZWagAAx1gP+QDvJnZTCBzQic712iUY\n7TR/WrsBJxtIQMFaWwQlq0dZwR0N8ip+B5yQeNJtEQ29Bvk+tFeTDOOGXYDW\nhCjGSMMFJPP8cRMKz7t9dyXNP4aASzWxVAnCR/fVldLqYClZNwRZxij1IQz2\nzz6v47UFPeUiVBVgr+4AhaihrUSsvY/XqcFjsLhH76jN+Lri3ow58pDHqCKg\n8CVZ2QWm/KNj4V/tCONMI5p2XNDsxEA2UTg1iCumbi/Xq3eAxdyBAyoYuf7D\nSFNOH/uTALGkQcGlyGP8mb1oyRZc4eDQZrH78Lh1LXvWCMYikZvp8Op1B1e4\nQ6h5MNP8qUSqZtvaXT+pu/9RoimP7g/MkUAfwIoRXfrkQOvaM+DRZFBQfFo1\nPTMgacKt1joVQgjnnfFoli+09P7SEYtgsym2rP+jYAJkR6/DBHdfEdrsg1Xh\nmdF/r1ux5csRlnnwyRRuety5rnDpfYvhGr/Xbwwq1HRcrTkRAfFxY8JaFlO+\nvoObYsnC/d/qy1uPE5YM8quoRBLYsi+MmrMUYpk0RukCuFfYNfyFc/KauxSM\n+6jOjzrKWnsko12jhZeia2Hn4T1B877UgRJ2tCcwyQbmEIz7rGpm7Ba8ajk2\nrKdX9JLZfr4zaLMMEY5vvb6p4xZOLMqrc/49e1W5IylhCS+Y9jbAiWM2CELt\n/9Nw\r\n=1l0G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGqc8zPPi5WG2gsnO4x0s2A0C41L8Qdu/Pvot9eRwCG/AiBu7izsitcvG5VvvQpYF5qyNPnIesi4kKxR65IYKdFSRQ=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.39.0_1534452118506_0.7473145492814877"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.0":{"name":"@fly/fly","version":"0.40.0-caching.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"efff1447cdf9b9db9d08b0627a4d44c4d25eb434","_id":"@fly/fly@0.40.0-caching.0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-OfZ1Qwsbmqh45vmdQzNc+gpGfG15AgUXesS1Hm43xDKIAi+LO9FbpcuMz/rS88SCuMV8RbLqI4D7xWpCFyr7bg==","shasum":"d2a6906bd6bbed855d3726fb2ef2ad06dd04e82b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.0.tgz","fileCount":525,"unpackedSize":15702800,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbeCuYCRA9TVsSAnZWagAAFIwQAJB0Ef5kD3WSRvDTyAII\nhnQYzoLksVgRrqYTrgaiJnD3xSKq8nMcNWHMdsZbhs5KqPCvy/8SDepQcB2O\nV1eTOn4+OZZQ9/6lGUkPfjLPvg04+e81qtlfPigQ5DqxS/ziNQFR5a7FMucs\nP5VEPU/y81wSj8AKHinaRhLyZwQU00QBsCuDEOwM7R1IyNp67qTcXSs5Po1J\nr5eCb9HbAMVM3Pl3v5uShIyQ+1tVfMVTXe2Lg42TR2NSTdAR/r9eIOPGopdG\n2MT2d9GCxI2KUdtCXbyR1eNAJqdaBkl0LJs6i/0TW4OlwITNG92AZCUBVH5y\nc6l+D2nPeRZs+G4FEYr2k5cGp4jolxMWszzWdp1ihjfSekt9a+/m0RqUY+7O\n3afH8nEsrdHPPl8MqlcdJl2un9JS48ryOjKEfWHO7BE1kMfqdmsaRag5CHa6\nhEcsk7MfC+CE9xlnz/tHIAV82WqzmF8uhVuCDOgV5QkVxrlT9h2pzJMqwQqO\nmHYc0kctcCPG9317zSkKIH3l8Gkkt48kdE9/rmvN6uKE/6W71Bk14TVF6zBM\nW7MfBO6jrryspXlDHeyqqG9+1wbJ0/274NiWwsePc2DFJcYsNRI6fBbVBRh3\nKFHMXEQVlKZud1O2i7vX/qrNVBIyTyWCducqs8o9ZHGrWsCzmjiPsYP33JwM\nXNVe\r\n=lLUz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEEQnboNPNTxNl5WsguXDGopHwtD3pZbK93E0x9paXA/AiEA43vJnj4UJTskhVgnBeQNm31WqIlS6y5Voz1LbktpirA="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.0_1534602135631_0.3547237497251481"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.1":{"name":"@fly/fly","version":"0.40.0-caching.1","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"1d8671e5128f67e32eac76b277b358ce0f9382da","_id":"@fly/fly@0.40.0-caching.1","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-5oYxWPIvcUlQ+g68qoEtywn0eIvveG/tm8XcSh0DpCRrXONtAnLmnqwI736HQAJp1t0HAeQ5hGSLz3CUel2JGg==","shasum":"cd9398061f258e94ef614bd51d783f4774076eb7","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.1.tgz","fileCount":525,"unpackedSize":15702079,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbeFZXCRA9TVsSAnZWagAAS4AP/A6I+z/4sIAlDUVYbTxf\nkerPVf6a4gdDf/SSIySwGkkQGXk3CWOXyidMJyVwTOjLEcR0EXQJZjCEHYjY\nmKN+G8ugaLohPUWldoqGc3qrf+U4/Pvo8RGaPuBiAuG+o2i8I48TJMCFXGoc\n75z3FNoPknAoqYt22Re6uwpOoR0fb/x4Ww54Nr/lzB5X4ATFs5EODK+F/wM5\neOvTtEKO39ekxiXNa63RNgscecKBQcrus1O4XUIHyIxA0y4bMJfhZjdoYfl+\nsPki9eo7mFc2/g+988ol30iOdxY8Y8HvWetr4Fq3ruZPM66HTFChPp9TT8Ng\n74ULoVMaATcGec18a7saNq6xOekUVOjvglWzTWYC8gSeA25NQaDRErd56Bv7\ns7nx4bNpp1zXJr3pocXLOnFamuvaBCXUaWDhXO66L8IcRAKcAx5q1ufoXmeP\npDb4GHq3U/EHyOq6KFJ6AUpDZEXMPpNNxCWyD33hyahhscSbs8/nvJKX1WT9\nIbNCOqvwLv+oqgiOqluq5Pnmc8/PKmCZQnKubzM8JybrLHRbeEMAWchEXAsx\nnwsyeGH2cmI6ULHAX5+k+JvHpWkszP0iW0McSJqdf88Ac+JvWVGKKN4UVPJn\nCOLA19B3bYCq5VNOad70YXg0nAUeSgvXxEpzmehUQ0ExolGeRQXOE9OeDWX5\nyClX\r\n=bbvB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDevinLA61acrESIaZsP4SqFH2b9tQZ6ZCUvJ7qz7vY+AiEA1NEBFQhhGRYJoheNg4flQrtrwv60ncEdQcouIabXo/4="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.1_1534613078431_0.8641568509950011"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.2":{"name":"@fly/fly","version":"0.40.0-caching.2","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","chai-as-promised":"^7.1.1","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","find-my-way":"^1.10.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","string-to-stream":"^1.1.0","to-arraybuffer":"^1.0.1","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1","url-parse":"^1.2.0","url-search-params":"^0.10.0"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","glossy":"0.x.x","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"3278ad0e916b6ae098f66c8cf4a9f9ccdd04672b","_id":"@fly/fly@0.40.0-caching.2","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-xkHvTTxQMsPM+bc2zc3R8kq7HBk2XSyepVPUydtmFJMKwsjErfOfu1aNZzSJb26Hqj8QtOJGN0a+PmsgOncSrA==","shasum":"44edfa422f66da49841c21e7b9cf3c2cb9725b47","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.2.tgz","fileCount":525,"unpackedSize":15702847,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbeJogCRA9TVsSAnZWagAAUhkP/i/KwdZdeMGWjtPlXOwe\nPuzI111zOxM6eeQYOnn/LEQ1hRJcBH4xCFH2fhYMcxmDCZhwU44oV/0EKCxq\nq/xc+MQ9wpaXeYgb4kS3xG7IRb+QuBJCA7g6rbsER3RmyR/iljxgDPGjR6mg\n1mikMELO0XcK9HTjqACRUnAenquGhBtgL7iG1WK6oaYv5b1Y3GUTLQ7O8mqz\nmhfjKcDgJE9M0ZNdmxow8bXbpw3NZ3t/g83Z8BytyS8FSamKrDcooFvp45Gc\n7Vg5R40TwClv/cz9r1K4R9eyJddinqZ5PchaYcDTnvHOVrFo77DWNH6xRuKO\nmvrch4IV3J+pO4x4W+cHaqHPN35ysl/SedxeTRhnQ/W1HMmGZ09wiukAFMin\nSH6kQ1aFQD4WVI7HmhZedD+5ZoZ3SVqEmZCF8tgVko+B0FQnwvuw3SnXxEts\nkBitEpzcqRkijRgGkjAp5Hym1C1aw63623xVW5lJvWCcNmyhisieW2XtVG28\npGYwv9G9dSfsR2kCcyYFHfEyoZmevjnE4s5ezaEL7D/3+GHxJEbKgXRX/ofA\nqTKKhJe2fjae5rsXd7cqQldn9QuvMSfFg0ovD6g+vq+BdFiBv2miq236midZ\nOr0c40C8xRi/EGnoBrGPfcfe3/1UpwhQQt52cyn1g2uTeXGatxauvKX8GHao\n/YhU\r\n=17ff\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlVP+tG/+JHfQ+w7kMrc5/XBuV5/vZynG/+tyUZrOYTwIgXWII8D18/x0dlGqD4b3njuX+SKg4BwqoybhqJ+8VWm4="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.2_1534630431512_0.29189822148703826"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.3":{"name":"@fly/fly","version":"0.40.0-caching.3","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"ce6094ea09aa0d3f7f73996f7fad4d7c8a4a60b9","_id":"@fly/fly@0.40.0-caching.3","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-/EqNlWMWfUrXFgEK0xTcWrnA9r+NryRT+h883OAi6HCrA5ROqSR694LkzOI2wZyWa4WJUKP0v7R0hs73kqrfwA==","shasum":"d7bb64692f84ada99f23189b2b836aeb28042bad","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.3.tgz","fileCount":536,"unpackedSize":15749265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfLC1CRA9TVsSAnZWagAAWD4P/jwRRSSkLqDd//JRhPDu\nza5tqCh99e/q2MJ6MrExc+n9dr/5cLaM1U61Qk3VRQ/0TwzVz/WexPsQgk2E\nyu3CWeSPmt7NKcvw+ePksgT8N7USQvY0QOV7o3Pr70YD5GA+trACJf3Y+QSs\nzqbvbAy8Fdf8ybisnV4EJbnyx93sgerxkhCVI369Fx6l1asMZ/1WuKW/RC+s\nidAxKubHxqfJDwPRkrJj3HGIzdeeWf4y5hIusyWWLslo+mip/+ZtHMydTtHO\nYWLAv5MpAsAIFwUe8F/qzOaiaopN7HsxZJtpxGdbgRrh3oP94ryn10lJX77p\nkSLS+ILLBuE9ukoY2/0fYH6+AwdSPsDIL6n4GtcZ1Efjmtic//Knzr7id+rL\nRqXfuqg5GeAKaXNTjhXO7ERD4S40zrR8tlRMe4xe4PB31IxYTSYTjt6LvXcU\nKprq/o0cXUVVymvWBE+NbuJLU96SWgck9ziO9a6zLzdXXYYqyqw4c70mUK8R\nZu0YdT2vzB8Px4WtrRdbA0H1rcpmc8W1MC6VRWH3azOmAI/n/cfboqVG+okc\nQghm4RIa1v85V1pl1UPuJ0xstRn3/2ujyc78T3Ti0g/37KyZ9z8MTSNb5z5r\nXEQsZRHGme2tXUPYYRdLr20GcXL3gVtO56kNFiQPAzujuexrZMTCvmnE+nZy\n60SG\r\n=gW9c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICovfYZzvfw5M6FtU3GkG37nUAcg179RoePlViwwLj65AiEA6ngIJ4qtTi9eLOUyeEIp06qfwZAEOzIrcB9kqjnhmJY="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.3_1534898356769_0.8659944371920252"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.4":{"name":"@fly/fly","version":"0.40.0-caching.4","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"7bea6003861e552c60a7b3754512989c9ac89079","_id":"@fly/fly@0.40.0-caching.4","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-w1SCxFk0wxJz2cbNF5GkXxmCdhwOZB3g11r5nWz9JqleNCljCGEWd8gxFcMmdlVefw6YtYZ628LNOBDZv83AtQ==","shasum":"185aa11f8ff90cdcf15a86e5a1e44d3c05f40869","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.4.tgz","fileCount":517,"unpackedSize":15524939,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfWPpCRA9TVsSAnZWagAAd9sP/0jB/1GQg8tvWaLsr7sq\nVHrQ3Lr2Tu4t2iUVydUlwrYn/Y2mM7BzC1F5b2BSUAw+O7uSkcke2DDNfwMU\n4UIO6cqf6zjle1jkoxwPxtpFGVaTaDD/AEmRvxF8D+hJIgMXgfJ6ykGIHcot\naU5THezte1GZGtJMyf8MEzil+tZLfTVKpl7QwWCHIWCyVwbLyOhm1iTKV21B\noMj/PntJ7OcKQzXRRbM8MgAkoWcXG/UjVwqcWQY0Ee4WQOY2I3nkm//j7wHG\n5EQL3qxMTvOdKtWhkPXmXNROCw8Pn/w/pNbVG+VJAmRHwdx4M/IByZ8wppyv\nCbxTAGVB18SXBfM97o1wEH2ygsY40XHUZtEVoBIFdRBO/YDRTDcIrCM0IvEb\nZ5PTkhehvWKgR2UHq/wuRLPTHB+n7M8HB5/NDzPbT9HBkybIAeeWVGTb5Kic\ncJkK80DqeoToBS/Ckmig5vlUFynqWL+MkVJmUHyEK4X2R1qpLUVQWhmrcT3X\nk4reJNo81XIf5xDFyM9MI75cyFOltjdLDUDAmZq6SgdiIUmRO3b6ooRa1TJU\naDsrirDTgls0COYwyGufYvJXxCIqOD2blpIIbhyO4ySGHby6qsDByc4rQ4Ex\nupU856ZbkXbSGYYNawlHhM12mfBjPx7I0RfENW9mkWzkJ2jo8BMYz4I91qGg\nPs/b\r\n=pkb4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF5BZyK1dNL4F0h5nCjsuKHWWTWkOV/BM/DW9l1UZfrbAiBLB6nDIhBitNtdkYwI7xS/vtHffltigvEao01N94ceTw=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.4_1534944232732_0.14682494009734737"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.5":{"name":"@fly/fly","version":"0.40.0-caching.5","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"7bea6003861e552c60a7b3754512989c9ac89079","_id":"@fly/fly@0.40.0-caching.5","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-MdrRZo3vxX5zglcb/V84I2kfzPhNECo2gI3xwR/+mdseWhuXeDTRV7vgcHxRvhTd5a83xsLU56IX9ANUrVeeWw==","shasum":"9777258e8e3cd7bc06f0182d89cb5074b3b2c5a2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.5.tgz","fileCount":517,"unpackedSize":15525146,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfWulCRA9TVsSAnZWagAATP0QAJUtz2y7xkTSgMDZ8voa\nn6BmydmgZ8XLlprMClQ1ua4TnauMYqDnPtsSs9nmP4R95hphY3PceBdAb9s6\nhBtSQU3575CPM61vOFV7bjWRb8mWJS7kSQB6A1MYiAS+EQYK6wVeax5Jh7bA\nlBvlFnT47qukY6n3O+2/p/CBG3tAdt4P44O4iOZ0wlgN1BLJiYc5PV+KzAw9\nRCiqBwq68QeydB4hFmasDsJhRsHxS3/oedq67clHNOk/dNNt8m6IUWrFOUdq\nl+Tbmr0O2YF86wP4XZK8BLfxsWmdcpJP39KcnuruH75isYHNojUNWMggxvjf\nkdrtd48vv7exbqfxTS8o5r34kPG9rzXe7ZJT6Jl0Yb1lu5vvg8IMAxXn1rWW\n81ajbXZHo0BdhyTfM0/9A5vYoK6+vGVnMi3qXM6rDgOIL5l49l3uSeapfhqM\n6whdOu4FP8h+uKpWmuw7HjcKTFvMSzFLRH8i6kK+WEmY5kJYlLWYh9wu5LOJ\nZchRudxAcig3uxaKTAN5M1/Bn/41OrUtdTC1HnAJG/Q4IWBHPIGUSTqRAYhK\nYQeHfa3W1C91dgN6SqpdT8WWFXm2tzhZ0W7pp3NlcebhEmtuiwlSZWgDTvIu\n/3gzmlwhDt3yiDVM4PNNaPq3Fy1EFbk3WJIRqVxV+FS43PyppNqgaC7u+xKx\nidI9\r\n=OVid\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEYTR/fuFpbtQL1t++AP3xhS2XCaDAETvXD8Pwb3UtPjAiEA3q5rE+V5Np3CX/6nROT+ZOnmFXVWAo0AkXp8wUXaWm0="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.5_1534946212419_0.2588698100085376"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.6":{"name":"@fly/fly","version":"0.40.0-caching.6","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"6655b4cccc9bba65fd2b6e20f7b5b435cc0d110a","_id":"@fly/fly@0.40.0-caching.6","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-vm7TTcvtPJpCbpB8Tf1xLlc5JN8R9IL4UPLhzki713KySJK5l8jOHM0ge/hdmU4cuwyFB+aDl+PnZ9PwbGy0kw==","shasum":"d328bc99c73bcc408a16b29f0b555610c3c4309d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.6.tgz","fileCount":525,"unpackedSize":15708519,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfXKmCRA9TVsSAnZWagAAA9oP/2PvFhu0aqr5yoeeDXpg\ntLa/9jN0lBc1Hk2V9zW3Q/9AzT0aB1wbdezODAOHY6oKEsuNOYNx0oiTzAus\nzGKkDeIqgFDreYb2G1QON91aJtv8GIvxjrX2FL+bajYa1dEuIuFOEz9LM0K+\n2hIHu2MHzqPVO7JzJBfrjVFs8nItRiok/x9FoQSU72hu6SXF4wVViPRC8JxK\nBY5aMpDj04Wn9MkuAduYru6MALqpqQS4or2z/TUC2ZCCq20G3waCP417UBdl\nfE8djQc0NDt4+QO+VFiF2N14QUki3cMNdhltC1T0FLbwccocDnX837Bcja+X\n0EaDREAwVWObOsDprnJrQ1vE3518vgazxRuyaRHFftd5My02faL09DF4BbNU\nT6xexYoQRsuy2lggQq6E6ZkHf9N7ot4Ltjcfd8nF27qd10ssk/77hJV3ydtQ\nhVMkqXc3UeSmQizJAu1mSIgMKv/2z8pYEUoymFVrkStNKrFXsJic2Qnqx0q3\nnQdI+Dg0T1IovsGWIVVcesRPgLO0wcqxT768r4Sukcvs86faxK4UPf1i2X3W\nAU+RoqLS1NUYRVc2GJthA6ZKYLt1Y21AJTc1OHe55eKu2BzwJUyh6ymFzssV\nf9zgV4qvJrPYqmg3wuhowCfIxKFUPw3XT+AolPPiZ853txZ0P8ygoFk0fdS1\npjsn\r\n=A6go\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD/0z41W4fj6mkdg+kFzXyY4Emd4cC3O89rAwLB5/QdjQIgKPvFimdVrMXBbylyAwPvkaaR4Wh34NCeapNS6JnYNoo="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.6_1534948005757_0.8398844944336081"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.7":{"name":"@fly/fly","version":"0.40.0-caching.7","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"75613204b33108dd6da1be5d00b4bed8700a94d4","_id":"@fly/fly@0.40.0-caching.7","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-QwG+D6HwEMHHLTuSmc0Af69kkeThgjYVhWG/ISbDN0eNMUhvjxjD7iHT3bVLNn1Jjb/SFnhtvVyFlzPr2RTCJw==","shasum":"26eb39b400d55bf4bdcf442786f8ef152bceaf30","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.7.tgz","fileCount":525,"unpackedSize":15710798,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbfX9pCRA9TVsSAnZWagAA0ZsP/1ZLVK1elAatk91Jby3M\nICw68e2KoiUmqTeSLGm+gDsXACSTfkFpDLaAL8hupkg3T+ozOJvJ9RRefr9Y\nhnUHqenp0mc8tuvKKPFcuJcwL+gUo1McBswvJvZrIfS0kow/rfUKxSNS9xCu\nZJbE4nHdoOwjxl1ePDmvTOlKObtPQl4tWMcGo0VmSG/9c6XR/Wd7XF7KigPh\n2WgHYq6i5F8Cbls2/qUjMKbGSGQD/uFYq04RmADGGTC3gV5UyZvLrHVSqJRY\nXMWV7C4fP9laxBIf4XwLkdwS7F2MrKEu4s8qVMeSYfXyP+cC08I1Wqyr0EqM\navYOzcv8itOEdGcXnAh3pjU2QSNu+n8Q9ugVUpqZlIrbUet5oDcPtriuyaX4\nfjH0iAfXGBE2GuZS+lZ/dVUkuQfdjzXJ53n3Cb2QI3t2b3sez2ykT8/K6Gn7\nzBOdMOFPNZ54JipMBPOrkl7M6nRyUL1iXN6F2CGmXN2t4V9R3bjcakEfr1ac\n4iCEuPETXN35M8M1u7ey/6E4dsKVwE0HQnihvl7HAuBp/mGHBqSlZ+z57Grx\nSTVCWx1V6W8dAg4gVkSrFqBJSnxyS+JbTjxwCCzuhFhGTEixKQ528m+rACva\nTH4G9vQ9CZC9m7BMlgLYndDG4mE6m4E6IZ2FgcfQSM0IImQdNv/YPC9DnvU3\n0cPl\r\n=NQ4c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqZ4VIppJdPRGR9mgNEhCaUs3Mz+mZf1HJ9VLTEinn8wIhAL7sloN52slRwCLvNCbPckaOoromCGsbyOMTOiohtpnl"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.7_1534951272351_0.6663266537361952"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.9":{"name":"@fly/fly","version":"0.40.0-caching.9","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"66e394bb0190e983e0f36f85ba3afc8c96820a2d","_id":"@fly/fly@0.40.0-caching.9","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-Yik5fIANy6uiabYHN8ryFYTzKrvv6CT9iziYKFz0YLpoVPil5FU7Qw5erssQkN/CN60YJnIssQZL8txGGVj5rQ==","shasum":"4fbff86056898b16f54dd462629cdde495e09984","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.9.tgz","fileCount":536,"unpackedSize":15753259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhCohCRA9TVsSAnZWagAAY70P/j27rFaW4pJKFvRSPbt1\n9O7tDOkVkvG+387tVpOKlMXHcG+0bvVCe2wohywnwMXZHWs+94Ndp+a3LH/h\n15+R1jSObnPMKLUv0ZWQ9udr9wi/NPoqzl55IuOD+EOyqKBRt1bTkVmXxa7Q\ngIR6HfOj/W6B5FwS3ndobNmtlMafBhbszQby3g4y08cWALwfLup+Ge+36sk3\ngZmwdbosQjsG90bu7EwYa/HbeXJywR4uqGKafTlSa6wY/soqJgHu7uzlVp6m\nhAiVyBPwA4Jr7mN/8LakczfsS//ATo94XpQQIbNHYDbFLkBmKtAPiFdr+lSD\nFHjJdFveGNKYhSuR3CVURurAtJkNRjEyaxrDl665t/lgrnWBy9NhlKPw/Mda\n2HNbTfSe2WuxPzhkj8z7iM0iQR/GTneluh12hpxrh4+VYbD4vhVMqeeoMahr\nXDqBUvq8RS93xrJ26nstcsUmqQ5XB4wDV53Rud5ujOQS5TnJNTuczkvoPxW4\nrMI02omnKjoCPp6Nip2nVi0OUO0E4sk3X/zsUh8dqmKDgCX+qVJ44CXl4Rjx\nVh2knzZWPq+TDHxiE3oTx/Q3XzHmLKKt/S7D+2Epbw6/X5NGfRGzm9SK1IP2\njcnuvz4emkIRehXiD0CDFk0bCIjkzS13281Lj7p9+QnAKNZyItyVM4CgIQHH\nipdM\r\n=W43M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZdQ5SYmfV0JyxRqDV2upLARG/An1AeJrM+KBLRQGQWwIhAI5/5rccnGprCK0/yMGa/G0CbtV2iat0l3j/pvWc2OQb"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.9_1535388192531_0.4095638531335808"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.10":{"name":"@fly/fly","version":"0.40.0-caching.10","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"d98713c4526e1e97eb9a2000fb8c2a9638a6be28","_id":"@fly/fly@0.40.0-caching.10","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-jciQ/HmBU8CZGNB8lYYvG50D+hYKboGUWMd0C/tUl/3kdxGvU9Y8q4NFfA6tl038FjBczJ1FGPjCacFafOrzEg==","shasum":"2ffb041c3261920afdcf39a84a71df8fb2493cb4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.10.tgz","fileCount":536,"unpackedSize":15755366,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhHetCRA9TVsSAnZWagAAhO8P/i+1XlbLKPn4FMLfGzLX\nEA81+wzhoZLCzIfUbpAdyHdBOLtcHf7OD4tPe0WEnxMQ/eB7nClcQCigkwsE\nBsfd6qWm+e+FI2iw2VIPrIynODY7y4DqSy9TkbiJj8Ba0NsX6upYXRanSP+C\nMpH42R92QShIyi5go1GN0cv07wlbblXVE7fjFzGybS1ijhABcEkMhOM8oHYr\nd/NnIfqORPGc8QlB4RazdqWYGYEgbjqxX4IDbQ953/DF0RaCB1NXoC5n19Bx\nXsVVv1lif9tnL9/ysYnl1ttjBONa0AcyVZ4uDRWcWNJGGsem2Nc8hYdAsfja\n651vv0/aTsQaFs/mhY/VAoNIVarMUPGfEAWx8jcCph1yDFsdMQiQ5/JQExm3\neGubnZReHDUjb4IXytNn+2MWV7XlRY2TR0vGO0DwsfYCoF5gix5oBeeaTpGu\nLdQo4fU0AZH+8b0a9w226gsorNFBtY0VXjXrBggnRYg6byJjfJDBOiXmRJFN\nxtE/XZllnJqslCPNn1p2EjnzDwIOpFZrRIw4jAmztRP/SEabQP+OlWq0aQ6w\nxdk7Zi9lXvrEqtRfjoyIIAQquc26ZezQrJP6wx0VtjZ0zqw3LOf9cSbGCWaP\nZGMQLMf3H3w3Y7wXGIwJ+v2SmX/DKHB2KYYcTqkTfoTvILU4w2HHT5E1qSFd\nMSu2\r\n=xAt9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD54d+htkD18HKWwpAnFSB11PyTbPG52eO2KRBXGIbBCQIgZzsx9xmkPGg0KwgOi/7PvBYxIXmLg+vc78SnLVzCmLI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.10_1535408044939_0.248999680875873"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.11":{"name":"@fly/fly","version":"0.40.0-caching.11","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"1db0711417bf96785e81b3463dcb347ee47b48e9","_id":"@fly/fly@0.40.0-caching.11","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-U+DekgaWisDfs32w8L0VtI/PeDU+D4NJII6c2i4RBiBDwt2//fPUZH6jzX3qicJAtOjQFQz6itI9jk2arMUPmw==","shasum":"c39ff39c83d3a83158b1d63d35f8750c7113c2ea","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.11.tgz","fileCount":536,"unpackedSize":15756186,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhIMgCRA9TVsSAnZWagAAGJQP/AlH2CHXIQKEn9BmOjht\n3NpnU4cVs5rXqY4Gxv7/51d3KLq7evfx8rRvOOUzCU7E0EQgB9MFS2L+zIdb\nh8rzcy9Xyc8XKkJCnS1eIv8/j5GiGN+cQkNBQ6mfLRyhY2r45hPXuHwkhCIy\nb3+77YckTBa6gHE2+4rzJqGB5xhLnfVHPrORVi9cOolL0vb3BKBC+NgWEJLF\neOUy1TKS7e+7Jf8QRd4gF7aHnjC3yWf67/McBIECrB8gaK+DnZzbB6CU0Hgz\nea5SUB9awQ/flAat4he9ue9euMmzn7pnrzrVKoLSAoVFC5xiYhBKgKZeHOUg\nf+0rFRCSkop1tcekiT4Zb5gvSGtXJw6EQireMossFhMV8i0cqTC93WsBSLdy\nWnQkVzfxpV1vtffk9hHKg1glC9q/ivrmadqlLLGIH34vsV0AW3VBW0bBqSu5\n0AqJiK+DEBYK+9uncv8DzcKfXoZAs4t/b8+kjvfPZbUhgvoR90sBip6O8icu\nKHa8+xIG3ByuQKJdsVLvCoaJDKSX3ewi1RvBMNGzZjvcWAY5XLhZi5+lGkIQ\nPdUnIIsOP9Po9BUF2W+MW2Lh3C+V6yOBTlYTnvUUdf/Y5ig1E6I4yBrGNlYW\nxxGS/uRj5qLic8RRpA+dn6YdLP0rGNwS2kKj8jyyfQYGyLr5F6zIGUsytWZv\nrbON\r\n=PQ2r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDUYAx07Gkz2xfoaUbwobsbEhjOZti/jySOU+ZEIZ8d1wIhAOzrCn5C5R/zURsTgAqqKHvibS2i7iOHWGlcHP374CJw"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.11_1535410976079_0.21919906944393075"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.12":{"name":"@fly/fly","version":"0.40.0-caching.12","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"f230f11cb29caf49d050c993b1192ade77fcadbd","_id":"@fly/fly@0.40.0-caching.12","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-flg42FvSmKDEeXwvWWwFU5n4GzRVe4tky6TFD4VBHzUf79F20Qe/AbExCXggO/v76DEOfU3NEQTqibXoEozPvQ==","shasum":"0c8ad9295f7cb51c99d9beeec0a041c4c7080e4b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.12.tgz","fileCount":536,"unpackedSize":15756692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhVqQCRA9TVsSAnZWagAAE/wQAJFpcEEXOtCVg9yzZzug\nS5Nm0gS7Uyaas776EQ1fhG+ISKO56MRTbz4Ecmbsjk2GVOzXJaaYDFk7qW6g\nTe7kwkJvhm3FAB693qYU2xAt08AlerOQyvj/JMv7hH45pJsdPWFcz6XJ2sFb\nea6kF+Q+0i5v4gVEp3bHQ1RdJ42P+s2hbzO5h/o9/m7lVJ/T4TnwFM2IORD0\nGFI6HUVMrwuUip39Qf9ucqdskoL4J3PqFS79jPBWBPrqjbAHer+zgR6G+hHz\nb2Lfi0iW6Cn7j9vKyVz+qXvR2qluHfK8RlClVYTTdtZllUbJvpUI4wWs49sP\npT5UptJmCzTb4JAUok+ts+Urdw1MA51JaIhiDREKJoO23T8XcQSGzpojNi0B\nafnag4bKLbNWUQ+pIfVsuKmrhplpAnZVU+4KY60rrBBdtbtWplXPqItz2d+N\naiy2ynDpdvHGBU8LKqglQFcr85e+ZCwUNZducPwiFbmj9+TTK/YhQEY+gEoF\n74os4RVbDr8eFU2MKBjwXZIs1oYTW9n0LYIKtnaoW13ubcKrxGKlUgUtRmEf\nRJ9Pq9IJiWXWFC0No6S9KX/KZGVpemZC9uBcFQtK1pNyrXmNhgVufw3J1F7w\npjPTGOTPP5AtkicRMSDntJfu2qj8LWL9K/CNlckoKP7ibYcwpjq3eWkrwJwZ\nGk0s\r\n=u+gD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGrTRaFOuMKAaLd0Fi0tjnOya0B+N9A5NaeFJGT9xnxrAiEAli0863nBAfiDhg8Pbmp9TmFAUReo7Mr+IiZrswbPFyI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.12_1535466127396_0.3841136934516851"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0-caching.13":{"name":"@fly/fly","version":"0.40.0-caching.13","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","files":["examples/","lib/","dist/","v8env","docs/build/","vendor/"],"scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n# Fly\n\nThe fly.io Edge Application runtime is an open core Javascript environment built for proxy servers. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use. \n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open core\n\nWe develop fly in the open, the core of our service is [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n","readmeFilename":"README.md","gitHead":"afa103ef46b22dcf1345f2187017568f4f603bbc","_id":"@fly/fly@0.40.0-caching.13","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-V5t/yUjkvkoQnEdK3ooWBiPq55AxPtveIBpB7W2VcnxBPXt7rmAECumGTQmQDnHCBq4OOjaJtdvrGhBDbTEctg==","shasum":"3d0fa2aeb34b02d9c78a1b0f5a658182114fbcc3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0-caching.13.tgz","fileCount":536,"unpackedSize":15757435,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhZm5CRA9TVsSAnZWagAAMc8P/2/PDa+2szxXKkdP/wKZ\nXRyBuln5sE9uI43uxqV4QkO8sogWI8Y7He40XXiVsIpvJNLXzMUospFkHJUa\nOwkNNVOfCk4dP09Xvv5GNyGFArU+gvKdi20GSMkKI5TIRuxCMBrlx0py63ZD\n58PhUV+Wdc9BEocT6tfnExAZyZBjmZbdIepWmXypH/purXtGQUiCAdyaw7mZ\n/3wceMXcCq4EkX19Og++vM1cm1PxEsewkcALZJ0wjsNz3jtkQEizBkiomc8H\ngGj3huAuY35O85nqyqJf+nd9g17vp2/eAMqOxqGSs5VElhNz/pVm/it5YrNA\nUd5Fn1zbCVQEEdiFsutDpD4iiSe2AHi+cvuX4LIMZzrfciCtX1oNuvjz25fj\nwGhqi5kLYUtKHIvOVCqHrEYyZ1ruCVTN0Y1sIl9WZERh1aAVMP4Rr9bgKrLY\nxd8eStZX2xMRIlM1kT7iQkiUg+CcFTNDFee8IQSLpfbjrl5ROb7xja9o8JqZ\ns1rWv/zihYMYtqDHnEnqombGVuWb9EnP8rUEuPVlM3P8sG9OU2jaAFdCzTKJ\n4LYMPUWJklg/nie0O7DPF5vIC4xGi50AJ0RR7cjuwU8SILyoRalUN1yJLmnm\nNwiiZ17Knqf1Ev3eq9kZbKK/DJcyi6OhVw94FQMW9PYuCeXMUprMLk9VDmNx\nNV+5\r\n=fGt+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG8GyewZvXa1WKropCMFc9ZaZemTlSiT0EO28hB44UObAiEAyBICqY7QZwEuTl0p74TVnNC0OKM2/jIcM1V1JkJwt0E="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0-caching.13_1535482295641_0.08865809990225304"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.0":{"name":"@fly/fly","version":"0.40.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"561551e72fbc6092e9981323aadc0e413db9221a","_id":"@fly/fly@0.40.0","_npmVersion":"6.2.0","_nodeVersion":"10.9.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-OZGN0kile1+NzHJ8CowKO+ZeVe1EAZtXYJcqbl00QyOD28SCPlid+nNdVGm03pTUXf7/H9kySNHuuiEMcN/chQ==","shasum":"1d63fbfd7af0f3c8f16508ad301b36f8a2fda117","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.0.tgz","fileCount":541,"unpackedSize":15886068,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhbUTCRA9TVsSAnZWagAAYdMP/2+cqKjcAzDMYj+D0gb1\nHRun9/IIFotZRFHLOmdFxdzPx7cp15QWQin7HkKxSqmDVMNkRu0eCVLgnYnf\nsG3f/naNjcNNRRL5rCe8asaF7nBCeTv4H+cPaQL2T2FYDYerc/sItmOsCLiS\n+3oVhFBfjj9esWo2rcN64bmH+rx691YFqIGFJCbT5xUNRRz3UdjZ0nLq92/0\nA95C5zafD/PpOt02PnwJKsISa4vMgiujMM9aTdAhsorYr3sdHEF36Ce4+w7g\nKKU0RAn0+jqjnhmWIn4QJVprE715suZfOX6PpA9RZNwd9iGLKDNAqpo8jxzU\nl3zbvybKgSbnCg6ac6PSlMttXwaoNgWYi6ZX2x3aXgxsyRarwDQMH0oCxlxa\n8MCSHGNbZtdkjvVAzDd6ydWnD4Nq2L+GrEluh+WBsE+kkCIM+QjgaDdxnA/W\nXSWBXRSKXR8p9khococOhedfGBtTZYkznt0XlUoACkFWUDzQntC8Ua5gaCCc\neWibqNGjH++LFgYx/ffGG56pmMFzK13t4d206S1PTt2SpV3WPQx2BT3YmhKg\nM9qERdFpS8R48FT2zoKDXqakrZnXLeQuql9/leZbeSJyINaFblKgO49CwOeI\no0/jzM5UHft1VYUfILReLceQdM4fKhGPUOMQEPMSyW5hMb2JV94OFCtU508W\nD+vR\r\n=2lgJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH/YdhXPVjKOjE/AqnSuzbEoOhUpjYI7ib3w2222FxTtAiEAuTIoQd3oIugNGrBVLHlH9uLrt8NQWW2ssyq8kLOXG+A="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.0_1535489298682_0.6908496622037708"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.40.1-0":{"name":"@fly/fly","version":"0.40.1-0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","prepublishOnly":"yarn build","release":"standard-version","doc:v8env":"./node_modules/typedoc/bin/typedoc --tsconfig ./v8env/tsconfig.json"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"1aa84260e991807558d9a8a1dd17d8d6ee69c9e5","_id":"@fly/fly@0.40.1-0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-isnfcMm9xEJpNVJpWzeB0+FwY1leQ1JGaUZIRytSf/3exUC4d5ZlcMWhTgXX6hqDu5zhi7bJpbnSB+XXfAZGbA==","shasum":"d023adc1ba18b1f947185923601dfe624fa1edd6","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.40.1-0.tgz","fileCount":541,"unpackedSize":15886731,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbiZTeCRA9TVsSAnZWagAAo2gP/167jUuaf9nzflQlv+6a\nBGgnJG/L2NCaLUUnIPvbY2OVGFwalbEGEUjeygVnfgBb7qx/gnfoK+oFoebB\n/lm6BeoWqPIPF9qN68oyukg/I2OHKytVk+RfRd3EvDahfQMy4mAf8wBKFrmS\nM6gIcSB7b9/j7U/fp1BJZXuiCfp4uz20HlVQNZ/xWwzlJY2QGrGAhwZ6D7/M\nbsmOSQ7uGIxSdz78q186bDxf+eReewgxppNQoTlsoCrff7xPeNgXdJgaqmZn\nOdkzhwzTPhC5ocLGneSEtm39sHJvUTDt6xDk9V3UyKVqPdEhvB7l43ECd/aB\na8cwnC1lapHw5Qddy6hy67IvIRNAOXfKJCWX4br3Lvo+7VmGDHYra3KWWEGA\n45tL3WGh9CfBx8sR+k6e4lg5k8Ea5Ns3049A0gbx65SiE5hqHSxwe59FxmWS\n4LdLwU8Ie3HjnQHRqNOGsiYC48luEr+YtQc2UGVWn2+7jBMP1JeraHCDTjXk\nX3vIcDbWfVNj+lgZH+hqZ5VIivXWidTfYO7GVT49fqrNWBz2A8ppI05yAm85\nHhyYOKSW005wyNJKoQPxnRafqasHvBgs6ixkmlLjMww8DTYkAiTkdoHg//ep\nrMz9kNEic5HHLGE+AJMNkL4j29GahFoDntgnvNoMzsLgvSXX6DqBB3nqR7Xn\ntrW0\r\n=0w9n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAuyxaaxGtA3t1YXH8RGK0yDprGr+5Iz1W/pqlGrhOjwAiEA8MC+Pn6p0tvrX3ZfrTixH9jqJolUFBkucSxFydXrV8A="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.40.1-0_1535743197371_0.8152250177546352"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.41.0":{"name":"@fly/fly","version":"0.41.0","description":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/sup","main":"lib/index.js","scripts":{"start":"./lib/cmd/index.js server ./examples/getting-started","test":"yarn test:v8env && yarn test:core","test:core":"yarn run mocha -r ts-node/register","test:v8env":"yarn build:v8env && node ./lib/cmd/index.js test v8env/test/**/*.spec.js","coverage":"nyc npm test && nyc report --reporter=text-lcov | coveralls","build":"yarn run concurrently -n \"core,v8env\" \"yarn build:core\" \"yarn build:v8env\"","build:live":"yarn run concurrently -n \"core,v8env.ts,v8env\" \"tsc -w --pretty\" \"tsc -w --pretty -p v8env/ts\" \"webpack --config webpack.v8.config.js -w\"","build:core":"rm -rf lib && ./node_modules/.bin/tsc","build:v8env":"rm -rf dist v8env/lib && ./node_modules/.bin/tsc -p v8env && ./node_modules/.bin/webpack --config webpack.v8.config.js","release":"standard-version","doc:v8env":"./publish-docs.sh"},"bin":{"fly":"lib/cmd/index.js"},"types":"./lib/index.d.ts","author":"","license":"Apache-2.0","engines":{"node":">=8 <10.9.0"},"devDependencies":{"@fly/typedoc-plugin-external-module-name":"^1.1.3","@types/better-sqlite3":"^3.1.3","@types/chai":"^4.0.8","@types/chokidar":"^1.7.5","@types/cookie":"^0.3.1","@types/execa":"^0.7.0","@types/fs-extra":"^5.0.0","@types/glob":"^5.0.35","@types/ioredis":"^3.2.14","@types/js-yaml":"^3.10.1","@types/mocha":"^2.2.44","@types/nock":"^9.1.3","@types/node":"^8.5.8","@types/pako":"^1.0.0","@types/promise.prototype.finally":"^2.0.2","@types/redis":"^2.8.1","@types/semver":"^5.5.0","@types/sharp":"^0.17.6","@types/tar-fs":"^1.16.0","@types/url-parse":"^1.1.0","@types/webpack":"^3.8.2","@types/whatwg-streams":"0.0.7","@types/ws":"^4.0.0","arraybuffer-loader":"^1.0.3","babel-eslint":"^8.2.1","better-assert":"^1.0.2","chai":"^4.1.2","concurrently":"^3.5.1","cookie":"^0.3.1","coveralls":"^3.0.0","css-select":"^1.3.0-rc0","domutils":"^1.6.2","eventemitter2":"^5.0.1","htmlparser2":"^3.9.2","http-cache-semantics":"^3.8.1","image-webpack-loader":"^4.3.1","nock":"^9.2.6","nyc":"^13.0.0","standard-version":"^4.4.0","ts-loader":"^3.2.0","ts-node":"^3.3.0","typedoc":"git+https://github.com/mrkurt/typedoc.git#build","typescript":"^3.0.1"},"dependencies":{"ansi-colors":"^1.1.0","axios":"^0.18.0","better-sqlite3":"^4.1.4","chokidar":"^2.0.4","cli-table3":"^0.5.0","commandpost":"^1.3.0","console-log-level":"^1.4.0","execa":"^0.7.0","fs-extra":"^5.0.0","glob":"^7.1.2","ioredis":"^3.2.2","ioredis-mock":"^3.10.2","isolated-vm":"1.6.1","js-yaml":"^3.10.0","mocha":"^4.0.1","promise.prototype.finally":"^3.1.0","promptly":"^3.0.3","redis":"^2.8.0","segfault-handler":"^1.0.1","semver":"^5.5.0","sharp":"^0.20.5","source-map":"^0.6.1","tar-fs":"^1.16.0","uglifyjs-webpack-plugin":"^1.2.2","universal-url-lite":"^1.0.0","webpack":"^3.11.0","ws":"^4.0.0"},"publishConfig":{"access":"public"},"nyc":{"extension":[".ts",".tsx"],"exclude":["**/*.d.ts","test/**/*","**/*.js","v8env/"],"reporter":["text"],"all":true},"gitHead":"fd2d9ca91ab41541ef355d394b5f8da20b2df5cd","_id":"@fly/fly@0.41.0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-MQottbGgxH9ekPVI71fKFMtPS2WdKZRMwl551a1p1aIlcY7OwX7mFZD7LQQpPEMPG8u11biuhu9ejvyHW15KMg==","shasum":"5037fe1c8c8b0ef4213df250a731a4108e435574","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.41.0.tgz","fileCount":57439,"unpackedSize":173592447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmBlECRA9TVsSAnZWagAA/4UP/iKfCCeDRaXk1y20SGF6\nLmWpWxC1jC7aqOsBsMADa2mFIGDv9gFmSjCbnrQtfXhvdSf51xH7a+48cQSy\nualDNhAdmAzURwr2zH+h80MvOlcwnjWVZMcY3m1TitgVC0z3PCJTdvvHUjA/\nZcoGJbh7qgyHwQeeRXmFGY8KW+W+0zKFzsgdrWTgZ//9ZBa5/8QQN4ApGvT7\nmLiI2uzf2mQYUaQaMN24X/3rS0Wa8tHZc7p6dmyQWPHRONfh+Q6JIYef8oC5\n4pTQXnTtZ76RNRFlJcy07kj5kuI3yn9jfuacnlm13uAdXGgjvtcuWTDk0Y2E\nB/tQCaQ1TgdOvJPZ2QGxjOTKmdui1+2tvfFxJvw2kqA5hz1S3dE+QOtZ6QUc\n8+O8D04VcBNGCZlj1dxjiZr7ORu0EkpZ7ttaHSZp5ytfDWUFSnCdIn4RaN6M\nQc1TAL7XrunBFgYlhKr22nC9rzg3WAwYT+pLLg3Z86sURXL+6Ffpy0DA3h8H\nIHTt8EYk+6rBsFkfRLxNMbFZpS+YduCUL3XGc4vhQ3ImivkUZLIYY4rrYEwO\n+9V8k7KEkUlEb083M2amv8xeRbSzMWv57E5Wr2OGgNDy2NKMGOX06sFWkgoV\nmMKx5rCvkn5nBVifoRidp5TeGwlcB+JmSdCejq/bQuYakb5Ktbr9N1MYQKxz\nMAs7\r\n=bccr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG4CHi2OaGbu/B+wgVhCuENwA3ePFUef+COA8o/sX2s0AiEAiksNGPvqTQDqHxvWoiuvB/oDRWk4rCmkyt+AMXsIxpw="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.41.0_1536694594675_0.4078139175841522"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.1":{"name":"@fly/fly","version":"0.42.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","scripts":{"clean":"rm -rf examples/*","build":"cp -r ../../examples/ examples/"},"engines":{"node":">=8 <10.9.0"},"dependencies":{"@fly/core":"0.42.0-pre.1","@fly/v8env":"0.42.0-pre.1"},"publishConfig":{"access":"public"},"gitHead":"082bbc6ccfcbb0f18b98f0c111b8d4d0a59949b9","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.1","_npmVersion":"6.2.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-MRZfQsBcWh+zFF/jB2GbEkilGTR1UlxV9VspKIKTuTgirgu+thiojpVi6+f+ORW6OUZ9JvoTDd9a6VtMapAF2Q==","shasum":"44b5410d24ad10610bcf1114b489874d4d0feb09","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.1.tgz","fileCount":40,"unpackedSize":51724,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmC5ECRA9TVsSAnZWagAAZIAQAJCsSKBZYcEoo+FzWjLP\nsBFgQxFrze2z/34yRjdDIjRRiC4O98bQILWmjGqdFzUHOm/IaMX3iTT3jdKt\n5Iyju32MA41o7uLUVFDP3wROlLE4N8hw+bD7tuvemQVMNvHPC3iHFJG/5blT\nk3ls86vJhJtvgbFLdtKxn57bjSe9Ny2E7OcqIHFsedYibc/tu/KBCDDDijLM\nlr8SxVravKt5an19o/hUF99MlvU/NcN7gjceLbUEfBbNnvDw0wVpH7wCPQL7\nAPIKlbBfCgft3R/V9TKHibQTDFOm07wrRUs0bOKD919fh6VdgeGcoRE7PgI4\nErfFNS+mh9btzsw98BtWgRTqqzCAiqdjjtlKbbpjhlq/tp+qHjynTY0uRwCb\nx0/horsM1rNpyzTtlIHQxXKZztqpgcepRfrnnAhp/XunwkO7KGT5aPLsgmsc\ncL3Yz7KeTtsidoterNppY4LUOMn6k/8yCdyloMNvTa3wbRkclv54wvnvonlw\ndl07prGPhpWVr8wJhmhru+Wesn2LPLxaM96lVKP8F1XAB33fxoPsfJbsSKPi\n+FKRqAIyq7HJIeV6i1lepUFNhmbdF28edbStUEfC42uKWSw9B6z82okDEuQ+\nqNM/zqiNtpbLY8mCvtTz4VF+uUOwvwGQH0/cwAANA/Hd/33Q1R4SHOJQtRgC\nBFVA\r\n=feZ7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICd6prrwATmfMmrdolIqc4E9ug+dzQJcS+5WLPUm0Gb5AiEAvxMrroS6OLgbDSyBJcMFlCp9+H6Zg40BUTswjn1ty6k="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.1_1536699972167_0.2861232789552277"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.2":{"name":"@fly/fly","version":"0.42.0-pre.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md ."},"engines":{"node":">=8 <10.9.0"},"dependencies":{"@fly/core":"0.42.0-pre.2","@fly/v8env":"0.42.0-pre.2"},"publishConfig":{"access":"public"},"gitHead":"3a1bfd635ad02f9d1a36c0186a95abcd9858ba9d","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.2","_npmVersion":"5.6.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-3QK248cy5JOKgLTZLNNXPljmTPPGsO2pYj27Ne05P513OqG0ZhvTIBJHecFcwwdf8ZQt5y6Mq+XONSHQhXTU4g==","shasum":"eb554c3c982e4313607d0070d979ccb5cfdff8e6","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.2.tgz","fileCount":3,"unpackedSize":12902,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmDAbCRA9TVsSAnZWagAA7l0P/3OXvn+JRHwIyAUuEAN+\n2v948ETjaMNAHXB2ZNkeYQczNQq+SZL5Ugk+8+30pOq61OoPgCfGy3JNn9Lg\nDjbK/4Q2iDkyiNmG6NB6fHdGHufMI1nggQ50ESeT3O0IA7v1e5ODn9Jg/uJn\njeMqsdjBjQzLwgXTOC889w+7Hm8Ijn2B3sF2K6IZQU1V+5A1hMkXrv0Hf2E6\nXx5QLOziIuNsKFvSNCQP4HyB+oo7za2LcK8DMdxUbWwPQX9mHKqqMf9f/7HW\nUd6JkEkFsJHOfAqkoULMw8hpQvPqeEOo24jr1Th+eOYVv+RJudYorqRHCDFS\n1uNpqi8ESGRho2PN6xOBjwOWaBrof0LGSUnM3YI79VOdO+NqDcdtrniZSroT\njjJaTiYCk0GrD75NchzK6quWr7Vf6WOFs974uIhY16xV2wT0EChUu9D1frR5\ncdqb+ZJqtWvnaQdY/08ZS7XO3rkiHiLm9u+7wjnTpW27L7Iu6KIUx/U624cv\nXfeyHuh0FMBV0nx/49qDLkGOeRbAYXDbeOt0cvLyq7czXqS3J4x4Tr0q25a5\nJlBOPXJRmSqPUwntSnRkakDS/ko3mObplv8jHP8Kl6EyoN0FjB++QIQoz4If\n1VhYcHIw32vZIZZHdwfNvfQpcxM/T4Bfqp5v5+T2QAZEF/M39X2DD4uvhQ7J\nsDv9\r\n=HZry\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGF7OLJbQyOPiGjjwbvCRgQctgWQPGyobXiX9QP5XftjAiBzxaiQFwskROFyRjolaAHNdvqAqrkZCtaLQ49SUov1VA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.2_1536700443040_0.00429283463750374"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.4":{"name":"@fly/fly","version":"0.42.0-pre.4","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <10.9.0"},"dependencies":{"@fly/core":"0.42.0-pre.4","@fly/v8env":"0.42.0-pre.4"},"publishConfig":{"access":"public"},"gitHead":"f0a4967bbf174f6caecbef3c3529de7c76e71dfc","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.4","_npmVersion":"5.6.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-Q5oOLUpJTD2oZ4/RV8uwug3Q1ryKnxfhz4+pjOjGsepuFUdjTIUvA3PuNLEY31aA/A7B27JXyguTVqwNinVFfg==","shasum":"922a0af1d7746b81510936d3f9504df4df7f7033","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.4.tgz","fileCount":42,"unpackedSize":71471,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmXPsCRA9TVsSAnZWagAAmcIP/2ZB+v2j71jzmAAd1t8q\nrAFvGHLOmQHEm0io8u9SRZVMHVci3hp/+D6YryRBln2bJWxke4yCuT9e4JS1\nkV3nJR7o7Jlw7vK4gzYMgyreUxvDqt6L/nNG7k5CpLgD7E7EbrkzEdMc1bM+\nMrFTpD45hCu/3kAxwTwSzWlywUUxrykZqnxPUt0w8XedtOruNJfbnqopPzeh\n0LfbOj+oXXaJinzJIdV2lCnF/jIusFsLoNTWAcFNyo6CrngSsqGBU/9ypHVM\n1q2iqb+jPn/GhdtG6FZkVGMJ5hS9m38AQwBDafWvhxXvLD9j6dFe9gxkszda\nTguifySupEjNB1DHuN9kf+bhqHQYEtxIv6vp9NL+o4ylp621Zkwsm/LeDAzO\n7JX84YqX+yjhbN8Zz4h8dxVHv5khuu8YiKq2mcTKkxVfTjjfkUzQwSqbTFgG\nGCkTIz7zO+3EMISnJuMQuNGIQbOmedQu3ew5XyRG77rfqkjR9/RNL9It/s0H\nSIipn0hDWoJBKt7FBYb0JoSqPnYWyHNxinpYE2GdFKo3sYzKYPtQnkGbia/H\nMjjXtmN9KF8YjUytznAW+PoBjdC+kyv0HYKNIrBHhLL7qAR5Z+rzvmErjq9Z\nEaasbMbSvxt3zJbcFOb7d3PMB2+wm211MjRt9OVLMtaPPDIfHwYJ4C5BywtM\ndGJC\r\n=JQv1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIlIKha8WP8YQLSJpLVEzQHk2q8qxQBpnB6Zkgb8W8fgIhALejt4LQ2k8l0IaAkwopNZwuW7MDrBRO2nNy6MnTmCE9"}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.4_1536783339726_0.8225756115457528"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.6":{"name":"@fly/fly","version":"0.42.0-pre.6","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <10.9.0"},"dependencies":{"@fly/core":"0.42.0-pre.6","@fly/v8env":"0.42.0-pre.6"},"publishConfig":{"access":"public"},"gitHead":"6c4e62de871ca60997773193422d66bd44bf35c8","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.6","_npmVersion":"5.6.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-Lc64ZaKmZemcFixfNswg8BEwpQK3/OR7TmXU7Nj36OPNfH25MyeApe+DJs1mKrxbrnoSkH9eEnZ8DWtQOML9mg==","shasum":"0bafac9567a14da4c1f6179ab6c79c7d15b8b993","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.6.tgz","fileCount":43,"unpackedSize":71944,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmXoHCRA9TVsSAnZWagAAiOYP+waJW0aw1/CdGxpxap56\nDR26oRMHiWJGEGSpSoKoHtGTF6tpnISYu0IY4IwunP/z/zd/eAzbNbWMLWLI\nmrogI1bMR92PHGAhyCXm0/V/A7LDkjofiFy7WMbE6r6/4gaYEDI6tZEDPcL8\nJpHdleAQ4MLvO9qEHPaf16SXTOfM/bf77pl9uHfcyXH1bECmq00mUXzK7QCT\n6OhpbuB5j9lyhrkH2pf5xW6llG8c6M8KrpWNliR2tbPTjV9Vvr4+ScBDPo0R\nIW9PoILDgUsiVMS7xSGtlmJEPUk2p6ZhA+0H1tCuvFEKTHBvMrTX/G0DUmLU\nl22OTw5WT8ANrUQbmCK3rmYtuXpU5r+OrgEovDFK73iXC1w2TUukoAtfxi4T\n0nk4Kb7CwE0tnFNOy4dMiaD7yGClgGD5menY0Nd6nIHXX2iCEBsgIdN0HnKt\ni2b/98WfwxHu1dDex9FfbaIgUua5qIgjEpGkF58VwCjgo6hly/CjJcmjSv1U\npOHVSwGXSM7JjFEMoL5xstt1sKoNkumIx7IqEvtD8Q2KTXjYFwlqM9GCL72z\ngXfkwMH3v/wSuNw426BGqGRxp9Ixo6w0R4pA4fZvEImA4/326K2HRjU6wvkc\nAxWgnbIC4WI9kLz7PDUnEqruQ+FcAmGNzKFoPdLx/gYnWijfo9b8J/sLA4Ra\niB/3\r\n=JuXu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUdE2gvgdcf6HvXL2vbXZgJJBrjSeozYeOZ6onxyqlUQIgITRUuP5a9MPMb6zUSdloF47YN5HGy8VGrxaeQEfHgdI="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.6_1536784902519_0.14037061016156982"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.7":{"name":"@fly/fly","version":"0.42.0-pre.7","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <10.9.0"},"dependencies":{"@fly/core":"0.42.0-pre.7","@fly/v8env":"0.42.0-pre.7"},"publishConfig":{"access":"public"},"gitHead":"9e35cbc87be39097dd6f7ba2af8bfd7e679a78ac","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.7","_npmVersion":"5.6.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-kUsKhwKxKPv6jhpVyhXR36aplYaixg4QN1BsK5ZZvE0p+ldnwpqq6AbD8NcAjm3dU0hbcM7EXFivHzL6ZHEwpA==","shasum":"74ec6ec4c0944fb49a2cf84e442454dfc9ddd6ea","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.7.tgz","fileCount":43,"unpackedSize":72128,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmXuJCRA9TVsSAnZWagAAJOAQAI5Ihxix0130UGC5xHY+\n5btcnJGmgZbj2rXDYuNAKGvwsCt3CX0JgpJFnDOhUm7EkfifbfqeiPETx2Qz\nkXinutVkutHgC0qADktYn89q6YDug1q8xon8a64mDkHnGnpYmx+jVaHjkTjC\nlb+nE6yi0i2lcD/VX0/kjcFOWgYxgOPjoI0tdDdtWYAC1oj0hA8vZ4CcpQkS\n47HRuhSef/rjx5RObzXYLRjTTz3l4kFVaLqvwzOSKDL19Nsq8665ndtNfaQ/\nx9o3sPxOxztx3u9LwTb9vAxLkVS6OZnUxP7pJJREbDt7HdBkvtsPqZDaDqCB\n2AWp2432M2dfCc/JdsnR2EksIThQICto3SH8hBW09mg8bAdJ9w+kXsIS3zio\nPjd3I8V9uTYzZA938vudxydvtpUPiILNyRb56NGFF3HxGwwvJ/K5Q0LRrdCa\nzNFUs4LOVYAJ6npfRXMKDeU3+8vn3NZ0ngnG/uhmX63xmX/xbmpWgUcSaDky\nXip96rnSAzcBgCMTGtERm+SaRHcMTKC9qi7/X4OjvzUerEYiPT4Wlaf9ySu+\nr2MEBsxZaWT7UWZeuKLzFIBVf0u/ghRMKsQ51EiMvUCQi2zMrABPG7ym8i5O\nSn6zl8LKow23T1eddVJ3dyT2MrFH1V1K+Jz8QqrX0yiHkHRO72w9aAXCEPPu\ns9l7\r\n=papJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICNquHckJOQ8iA/3TDEC7HWL1YMh2W0sG6lpwIAqtQZ6AiEApMkVjc8X9pTehJviyF5Hhzlo5jtVW7uxN4PI7THWiuY="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.7_1536785288485_0.4522394687500195"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.8":{"name":"@fly/fly","version":"0.42.0-pre.8","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.0-pre.8","@fly/v8env":"0.42.0-pre.8"},"publishConfig":{"access":"public"},"gitHead":"3b92a0eced60cbe863d92e6420713184eabed9f0","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly) [![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) [![Build Status](https://travis-ci.org/superfly/fly.svg?branch=master)](https://travis-ci.org/superfly/fly) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.8","_npmVersion":"5.6.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-W4wSZYWJVuimiTho0ej9hAXobGvdTGahc+CEvKHHy3yT2E678rLZeyncZAV1upYGLWs8ooWMUJlbgLrFhsgZOQ==","shasum":"1003664822c4c3529ec5ab8fcc9d971a03b8f182","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.8.tgz","fileCount":43,"unpackedSize":72308,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmYXyCRA9TVsSAnZWagAAlkQP/RLGtHSNCzS9NgnyWu97\n0Q272CcyztqKP7gOo15+xBxVv1rVcouYOItP8PWMd4QeSSt6nhXUDglEt/EC\ndA+gfP/z7pHQVuNeyJ4K29H0cZZnKlUKJLIgftm/O5C+OdtaaX9CkruaSGhr\nKD6hJ+8VJn5IBER/0+AjqBAKTEXoQM1xrVAU58SbmngsINWmXX6PkD8fVt2Q\ni/Cjz6nQrx++au/hmaoVtCeRvrjvayIJ5mZH5nP+rPp9hJX4qWxomB5Y7PMG\nWpZXhpdoSAMa4p8hBmKWmR/i3o3Ox7PG0nW5w1f2CSv8opylLLrE/NydVAzl\nGWzIx7l98MsU5B04bhVxYLmZgBJjeHAtoJMmzAAxshgUye1OCAdRKYrncDz0\nOhZhoxfWy69g8JbOzXxmr0UkS1QUC5nJYtLoOxQOyqmH36wDRJj6TB6VGxcr\nsuZuqHwIr8QXrwBXV0BPa6OCci5GzCScLU05i9/WSGTMvD0hVhdikCpnCOJ1\nOGcW5KJUeh1gTQnwg9kWqPCUQw+7ZJbGdk8MRXC9xIyEvpnnA5+WnRHV1/p9\nk6XRt+J72h99NnHn6TROROOhBGcJGgThi1NnT9D4gz91nnGkClFDJEq5XN5m\nFL8Te2mWC/heZDf1nvXFG6Us1gmF/xwbZzS7JEpBh1vnMc+oQi8829/TcDdc\nHW9A\r\n=HpUR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGMFI6ilAOvNnRaVYZ+VAiFYOhdfN917Eh5K3XiKsuNZAiA+gJQLdq5Djob4uMFhoHBuqp3pAPsHkijaE7gCmdnaWA=="}]},"maintainers":[{"email":"support@fly.io","name":"flysupport"},{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.8_1536787954224_0.38787084454278653"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0-pre.9":{"name":"@fly/fly","version":"0.42.0-pre.9","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.0-pre.9","@fly/v8env":"0.42.0-pre.9"},"publishConfig":{"access":"public"},"gitHead":"a2d88031d0e6360ff50782e59678040ae26bf7ca","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.0-pre.9.tgz","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0-pre.9","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-qVaqrb1Pb44B+jKF9oKPEsHa9HuQL99y5XqLLQiorLNA6nGVDyzwrCip/z17Zz7e4u7I60eKyCD6LcwA7eRUiw==","shasum":"a20ffda13b49fbdaf95aa0f3fb706817dfcaf7a4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0-pre.9.tgz","fileCount":138,"unpackedSize":9919356,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbomyaCRA9TVsSAnZWagAAF70P/AvpAh4nFkT4g9cOhapV\nVgxwsTNJ+aGvOze5ylpakLvM7AQarWP9rLsvzf9wgsOreeizJP2adGUpQd1b\nD8L2VJynn48OC6iI92rT4kYgyELOaTf1ocg0NaKh+DWZoHUAya/Tdfqz+af0\nC6FwvXSJ+My4hKDK1xsJ83EgYYa536bDDkKx2v+0oL3CDFgPfFCMZh+tpVsh\nYMFER+/h4/1Pp1z/uEmzCIuLcrltSPJNHhf7hlxxFcdVISoGXi+585rmsW5V\n+pxOTdbt8ohoERch8k+/6wW8kmx6YhmmHi/6qvchdPidgRE8bOoiCfpZzft5\n0EGiiHhX4lM1ZSFByq2cA7zoSW+EVNyUiiCBRe4apApfJxzQfO9gOCz73Log\nI3tW5gUHdHncwa4yAIHbQBxKZOFGIufn3DwbAMFkV/Bi/UhzcefYMBBz4NtH\n9oRaWJf9OmH01YIfR9rMoTbepzQR0ieJwMZXQ0c54iOblPs3k3GVsdraCK10\nsbFE6HH7bc0aeMkd81W2576okF9vpGTs3UiA/sBAOds8hjSvWQuFYp9whzOB\n2RvPSsbey0fx6nJ5lQI2cPo2H2iwTInlzLnu//Zm3w7uH1x//71mIPrKbDPo\n1yYy5tsordv6UBlRV9MHoTHH27VXBkWKb2KoRDND9l1Y89aQWMhmVkeen4+i\nWJh3\r\n=OvHT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAhrIPSW4Yeq8uTuLrF8llVw+9zDoVZtAWsY2Z1q96mxAiBoKY2/uRstY2TGkPzj4LyhxyBZsGzqIvGae/8UFN/3YA=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0-pre.9_1537371289270_0.28019333229472565"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.0":{"name":"@fly/fly","version":"0.42.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.0","@fly/v8env":"0.42.0"},"publishConfig":{"access":"public"},"gitHead":"f4b9831bf6c5aa8cadc9dd088510df0cb55fdbed","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.0.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.0","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-irK3hRV9cwsTtt07CTKITRWqGgcl8pY1c6TeeUfHPC3sG57XderEu3mjW+tnA9d4VK+4EVIW5DujMcSEgSM/Qg==","shasum":"1fe0a30eac5b5a1d206fc3c073e2d6e173146c45","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.0.tgz","fileCount":43,"unpackedSize":72932,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbom8pCRA9TVsSAnZWagAAsjoP/iVjkNxb8WOamJUhXNoH\nToqK9pfGfD308S7McQ0rPFOkSl1qJwBkzxOEKSzcCwY9SSnpxqbj4A/VD5/U\nMNWbb8BcR9UYsol9/3ZyeSjoDV5yawZHS88+IpX6Ey5SAWYjvOewL4txeSSd\nW8U5BmsYLMnFmz23ZG7lqhFDwfW3vTx1FDLouBQR9Uv3grYiG3/h89c4e/Wv\nyNsWmupSiPI67CagjKn2Z8Q7HyQXXJQBKp3MP4aP4LRgTCDWMVXdUnNwSz8Z\nHp1wtWRKscYekH8utreSaG5hMhJF2aQ57J81Z21gcK1Vvfz669nl3Rp2Qk85\nBgx/tcV4IGij+D1FIrDh1T+HqV3EzPNp0Syga8wPNe2gxnR4idgs5z8n9S57\nafmfRzwGKu36Kp5EfJpdDkK1iyCHUoCvQTvK5lI4UFGYz2l24SACF3P62bsj\nlQ+gT16KdCg5w3cPJF6WLMcZ7rwmQO6DvXy8McJvRcwxOP+zL7B4vB6gMPyf\n3wR/W7EYRTVkTywCucjQkUQpr7hJpBZCM5AHsBDSlOqUwJnvoMZrWeBfCUbw\nt98T1l0xHFD+piUadG3X2uY4eUbgnlE7ThBRmmrnmd47dIKnUQyt3US4Rdxb\n5RkxyXWkI6G4U7HUvAM8VYmHP/TGZN/cX6+ZADDHy85gK8bNNEYWor8RQI+M\nUlZC\r\n=TCMQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBRCkXlrTt2UvOL/KYCFRgoNAZybNDWqCwJanu/IJ0vrAiAIVidvyX0SSiaiVa4FUl4Lqy0a2ZYdJOtwYVYstmnGqA=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.0_1537371944817_0.8709234595613449"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.1-pre.0":{"name":"@fly/fly","version":"0.42.1-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf examples/* README.md","build":"cp -r ../../examples/ examples/ && cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.1-pre.0","@fly/v8env":"0.42.1-pre.0"},"publishConfig":{"access":"public"},"gitHead":"7624b77b89b96637ce8a50e36e1073601575ebc3","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.1-pre.0.tgz","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.1-pre.0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-UuopgvQRqnXAJVk/tmiA5JvB+XX95YVlxPyCqYLHwPR/61AWgfNX6RdXDa9RgCUhsW4onxOmpj/7Q22AfT/1zQ==","shasum":"e39d3df89190c9b4b09295454af55beecda0b54d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.1-pre.0.tgz","fileCount":138,"unpackedSize":9919701,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbos86CRA9TVsSAnZWagAAvZoP/AytgQEf9qX3zoeLDjst\nWPlHHnNHKt6pEi4UokGv6vjSaUwMqP7ns3gaS5n1EwSms7vSgC2WmYE6Yj/N\nkgweajZAcyiW9f6zaMg0m7VNAnMCm3grfXJONZk8YHyaTYge9cNkGPMhBZxj\nzhMNMU5DkgJHPkyiu86ak7hL+KfeY7Og0U0P/WdYRAd+qq0QVGOh4Nj1yc1W\nkhGfcmtWp2xTKHLsKU+U3CtvacV14dSMdudQxl/XNc9RFLKWj3/xB19fKH2K\n1c5ZA4QX4tDgf/SxMOMsxDOMmpVAnWaJhSvBmqjo3Y0DM3dEtDoi+bDBzRXa\n/0WxZotCLHhkTlPQ5P334c+eEzIm6AVzn5OlyVCuQ5qERMqNWEndZWd1+D4o\n6+9/pOnX423hOzKKXHWCkej5PFvlzZcc7Fc0uSGCVIffgPFnZ1kbbWm4eIbb\nQm3xKPzTMgg0ufTEcxAxGA/GdsZukh3wV3JFCThP2a6W8fZPRGqcZ/EQ6sy6\nu59J3iAiu9KmmCg7wBOQ7v7Ee7ZIqp9I98lUQQheEydzgo/Kn2X85f6uSvYc\n/lC/G7PLO+C6tQy7sE7iElLyyn0unn2FHjcbUC4eSOvSHfGN4XZxgykcFQfy\ni1VXoI6Rj9hsPEtrRa7bQUV+ISSAKXjMwD5N2vOfRq5H3qZ1USOkUYPqj9ze\nUcjI\r\n=XEdw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFQRtzNeHnJpeemkPpu8ucp2F+MgrhszbQOb5sHCgDq3AiEAoKYtqld+1kgtTELMJY9dVea/fYyHkHs7KIS7adpAyx8="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.1-pre.0_1537396537631_0.8572474859317796"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.2-pre.0":{"name":"@fly/fly","version":"0.42.2-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.2-pre.0","@fly/v8env":"0.42.2-pre.0"},"publishConfig":{"access":"public"},"gitHead":"9618a214226215c361a1e210422343f2070f81cb","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.2-pre.0.tgz","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your a `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.2-pre.0","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-vvnbEbKYWM0g2dKCMJZ9sS8TQS0Fft1d6oAo4QKLPqYgdd0AdNJXcyJqFoWfyZ1NwTFVP/PJSmzvKzIwltUuiA==","shasum":"a56e92b48d6182518c63fba2983cbd967bfe2cce","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.2-pre.0.tgz","fileCount":5,"unpackedSize":22644,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbo802CRA9TVsSAnZWagAA9FwP/0SM8gw/+cuc8rXYjmmg\n5Tr5PznuhUoRTQqFslxZ+rNW6a4+qAh7ZvX2mV8Bm56ys67989UDHV1goANa\n5XTfPP/SiKGKLedNFAnEI62Q0DiX/0leOzbFxH4CL6n+uxBIABf3LcNHYlbR\nwSjzODgrqV7ad+NidwXUuLDn/b2RThtddcbu6LB/qsAX99VbwP2Xhrl5Jrf9\n4SdMyybvDlF2hEzjV3biOrSFpTfOEw6LUp12ns9xG/eaKRmdrLneNu5cW5Ij\nIrhBTRyQbfQk7C9r+jxBxvMjhqihrjknMyPk3C6+TzC7dc82wctx7+hSY1Fx\nZB5FH2KVRA8QhwtNcGWo2z3MrvjvApjry5cp4kwGC4F+4XLAXcBy3rDtassk\nEfyL6M9QOhhZwLaS/TkXHZraSToTvrc92JmhieqS9n1D7HvaJas5aP3U8EK7\nNMzU0YhxzBtILD3LLZ/zHPmtE1bEi/RcGG3w++D/TFi+LuR5y6e/CD3ExOqg\nwTpeoOx+yqj8hTLahoDV4Bm82XwPSxMPsgTJoprsTziIS8H0nv2iZ8026uP2\nlkgxUvxdSz+2w2ZGP4MyrXsaG5+zpUtTg5E2jioQRH/D4PjFXHzAMFIbQwQT\nephvU/qz0UxND0AOkYLtS9eFaTE/E7h+POTozTXUFVV2Xud4dhlhqBlEgRV3\ndn0q\r\n=7Vx+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDev8JMv0gNWO+2IdmPTE7h72Vz56h7AKPYYenm1JEZLgIhANFFGZjdxHztsa1jZj6sum1x+3DN7wyW72f/bTvf1Nz6"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.2-pre.0_1537461557415_0.4359795800745476"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.2":{"name":"@fly/fly","version":"0.42.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.2","@fly/v8env":"0.42.2"},"publishConfig":{"access":"public"},"gitHead":"a9af9d3a92e647229ea191cf53a0253a90e813e1","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.2.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.2","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-lGFiazNiN3pBrHX53qCUO+St56Bajdcm2qIa5uVokkgryQVp/fyO+ACMD7NwwCQykZXWxbvDQyytEZBLidx+pw==","shasum":"6555c732e5aad60327ed50f5b1d6cec8526509d6","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.2.tgz","fileCount":5,"unpackedSize":22793,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbo89sCRA9TVsSAnZWagAAe/sP+QA+j03BEpD8l20NCMcA\nBNGLrCji4PQFGxAp/8CnKFCSmp4LXi6H+poFLzLVwBblgGTCOQVyxPWJdvq8\nUoXnSIoGdVK/6DKi/2l1JtB+WhB6LhJ33naW1+Wy44tindWuISJZzCfxOMDZ\nTbLCgspZ5yEcpb03AQo7qltQEcgNsUeG5ZSjcH5UfgF8b/+/H9PYy1aYKpWb\nZmzlaEtdC08TxVVUchJuOpMZAWkjXTafX8U3rzamBt1UKGJVu/bP9UaZbEvH\nz3g77agdl0zeS1U5oqzoRCSC5LsWzcD3Z7nQ+2D+VqTBmNV4l3dTrp9VkupM\nQLzza2zpa6qpWn3F9jYrab1+xC56xxu7lpKYnu8iZ/3Gypa6XiZzafKiXbAo\nJ2g3M/afK0gsVGSHbJ4rf8wGucRirA3bcUefmuECkGxtKnHk71ZwhQ6+B3eS\n6svhvHkMCvIcEtVeg1KbSnaNk1iAkh6WwfIRaZxHrxsGcCU3/LTU4+UvE1RQ\nqhHYzzVDHZbCSHQ4q5+FEVsgQ9kWIptp7xDwQl2KuC/tXgPsCfYoE4VGeX75\npeddPQlS5A6RY2YGBv1BwvBg4Zt6Pn+uOLCuNqFLt0XkLpqTYncLsDSnIlYK\nUsj5qkBGVdn9GVLfAfXVwaFfuVhfunnG++SHC3EZ2OZm1miNTaO/CP3x/fQN\ncZ+2\r\n=+c3C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4j8TEFA4cDM0wBRN7+BOdFA6Cyih8+9JcQLUWlA74lQIgGOiPrgfriNzJTCz5EcSOCCITTqhAqchLbIiTi6nE2+c="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.2_1537462123951_0.40833346441587515"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.4-pre.0":{"name":"@fly/fly","version":"0.42.4-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.4-pre.0","@fly/v8env":"0.42.4-pre.0"},"publishConfig":{"access":"public"},"gitHead":"6f982090e9df79e20310bdbe18ca8be1a76c9ead","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.4-pre.0.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.4-pre.0","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-OTiN5edAo8dfI9m472GjjPKwB3pSW7sV0KTpp7xUcouA4p08E5K7mR00/RbtAzZaxMU0cbtZ7fiXu6ZxSTBWrA==","shasum":"40c1a9cbc4a2229330ca323632de65ed91b3a2ae","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.4-pre.0.tgz","fileCount":5,"unpackedSize":23358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbz00BCRA9TVsSAnZWagAAgBUP/RduCfmA5MW6lIl8Rv0o\nWZ5tuDsxtYbu+U+npLTI1xeImTOorHYuf4UNeCmxFmR5AQa6Q0auqg/PI1sE\nwRqFRPdlTMc6vCkSOuVMMYNons4C0JdetK3QJ8H4qNlsL7PxltsP27zWYLIn\naWMD40+4Y+TOEmLiMZ4FFdeMiDO134C2q2QUcNeLJJkFIL8D1aM5syG9Y2ho\nBVFvVhOTOHvAx+lnWlcq8qbq88apxKrfiAAOqk6x0mbD+v6xBzbfaiNOoLyZ\nHsCwc0AIMmrq5+HF0iTFZMElcDpwa6WckvjJ3iCMekYQ850s7SeEyLdnHqni\n3N8puLEkkhraRLPNKW3vEcDrFbGGQG0VVjZSMbRg/mYe+0P3G5wHPUw6L3AC\nw6k3QN3aJ8qui0ySC0/bKt5+h4N125NX9txGcG6Sk7sIqb/9IXxhA/BDV5m9\n/DLLU/97qNpBsqSnVPPPt49+/oZq1lwRhS3yg3eAxWGuWHVwh1tzzGYMj3WT\nkOHUr9Nb/QqCEbZMwE5w8yeyHJ0ltFut3M6NhMD+1Mc2e0ml2j9tBmgB0tzJ\nylnfnNkaRtufYRMCDPe+SMOhjFg9+IZdQmZZu/bcj7Tx95aXYxb9afogd1hr\nelFmy+/yDE5AikFpfQub1/fqXHEAffrb8hIIhNUC+t9YLcamxdeE/HiNl5XE\n7Dw+\r\n=NTNI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFK1GOVL0AlBrFplOeKhVZfDV54bQmGioHNvDdY4Dg+GAiBdEkR75b8llClzRA8NbSpj5skah6Od52t3bxTp0kT6cA=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.4-pre.0_1540312321265_0.5675688078791223"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.43.1":{"name":"@fly/fly","version":"0.43.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.43.1","@fly/v8env":"0.43.1"},"publishConfig":{"access":"public"},"gitHead":"8b4868c6752d4a81e8f99c9bdb8e8790b5992cf4","_resolved":"","_integrity":"","_from":"file:fly-fly-0.43.1.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.43.1","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-P2Tn7H0ivPwO4Z96L9nuER8xAO34BNnrIcaTEGfEp4aPunNVhdylo06Eh2nijbgGubutl4R/JDkvZV22nbSQBQ==","shasum":"6a7eefab4bb9f2e81285b1da2c9729d0a0a4e49d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.43.1.tgz","fileCount":5,"unpackedSize":23112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbz05VCRA9TVsSAnZWagAAmksP/3iX16Rt2V2I4xqOiMmz\nAHYkIdpofQmaBwZRN9YuTVcnSHG83jjS7jlDKWk3QRLGJ1978V7yA8WhIwRd\nLRVXaAoVIilg4z+TgAZvyqfQDp3Bz1nFFuqZhj/tt2Oep5OqFvfYYAMGifJI\nyZt2Y2GC5o107EQEAMce66PfEQBALOonvndw4hTVfrHATnDka4es7xXGsk4j\nlDaehJM+l90td/RMLGD4ct2tnmn33MNYotyKqe11Q41n7E96p1BMeezpq+k9\n3Av2fBoMKMMnsQJ4ZxZNExBykERNIljuusi6UGR7vAMVcyMORP2XeLUdk7Oo\nd+3w0WddX/gQ02xb2vAF9sUIN0R8opi4ySGUJ/e9ueoIurS76uHgE/MK3bJA\nGaoipgyTbT58adh9GcW0XXzW3iRfIKvChsq1f0mdG419/RE7VOn43lOgjvDL\nWJ2BTWVrTwAq01h2V2kiyG4OUOx/YML2uQPhrarV4mDUQPwFA6f4aXhXRlK4\nYw+dpe0zd30FlU4cqpetUv+4rm2NfLkNPmNF9LXDTVPQDFiUU1lcf3O05xE6\n8Dg3f5EXgHvXQZLywvvyAqjesXTKqAc8nM7KM0b0oT9Bf4jJGTfi0/sJj+no\ndvvwOSV5wVn73ahAwhEcA/ZauLHJvS+PVJ6Hll4jjWqJj+C2jsMxm6VDdnet\nQD1S\r\n=Jpdb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzVJFyYTRFbLouQH7f7GSfnsvVCVheWP/XnRf4pgC5eAIga2SaCCOGvxpoho4kmULXSP7GeyuraDq8OY1KYQT4014="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.43.1_1540312660413_0.8719411795097094"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.42.4-pre.1":{"name":"@fly/fly","version":"0.42.4-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.42.4-pre.1","@fly/v8env":"0.42.4-pre.0"},"publishConfig":{"access":"public"},"gitHead":"74c428f1dc54a6573ed1a7b826a5e23fa3c36cb8","_resolved":"","_integrity":"","_from":"file:fly-fly-0.42.4-pre.1.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.42.4-pre.1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-DzLIHYltIDNsQIntM10f9u8QtoO8fT4P10KJ5Ngj/rQpX/HarTyjLGtXrhTEFFd1OoCGgXHep9Mq30H0aCc52g==","shasum":"6ea85687a53720a0b7e14d43e56dcdcdac5a82ee","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.42.4-pre.1.tgz","fileCount":5,"unpackedSize":23543,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbz1RGCRA9TVsSAnZWagAAx2oP/AukCB5uCVn+6UIYIC4S\nfaAtteZyZcCBNJB0wUlWOfqDsaK8mB2e3oN1BIPTA10rCvp6RXRBQDuUMsPr\nd1Yp8cZcQ4kM8hiwSaFcQeEpMjqpsanvSOkLpXIwq6pf+45dVac1mru4PumN\nmUUCvOGF/QPAfa5mM4ZWDVAf6QC27UqtqI2izf6ERlUJYVzO8xkp+K3PAbgc\nZXtxgPsGViW4Pp0JoeHCu3Wn/RcKhhU9ZNzrjFOv5QzyFP6LtkbSSEB+RkVp\n5d3ublNUMM5lNY+SlU7Df0U9pnLmDAaGvJ0vPx1lmWxY0WYbAM4eDRzKQE/j\nE2LWVWYq6/QEQ2xV394ndtba6iVZXGH4q8RWoHIlY4RX3t692U7sIuukFojj\nelIWGAbrR9LlKgjVpm+PhlgnIRV7Vo7Oy8bJlVpuzRAmZ2lmaRHqHxexne3c\nYJTRLgQrXkawcB7QrenA0AXRP5+ksZwngIrtoXs21cBbl2nieaEKUUdKAPpp\nkAvt618H0WIXHHRcGnZ+caXGO1+X1kWULo0TKYwPlsw3CcOmpBoIinR4YObg\n/XTIhz0X40ET+FMvD+49eYztAbJtB6AuneLxGubgvZ6gX9qNygu410Bx4xcd\nfW4M2BDG98l8Sjyed6dEe/6Y0SUDBnTRyMxo641QrR5B1PNyTletuIY0VFfV\n40pr\r\n=FZJa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcOBLf3TKUhdaR4Y10uWdf9hZ8ekdBmmHJhPvxVd9TjgIhAM6L65jh59g3Z9dvYk4HLP3mtwQQTDmotHO2CxEk3jKe"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.42.4-pre.1_1540314181415_0.8770857002446271"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.0-pre.1":{"name":"@fly/fly","version":"0.44.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.0-pre.1","@fly/v8env":"0.44.0-pre.1"},"publishConfig":{"access":"public"},"gitHead":"db4d6767f35a97ea6ab7d4a835b94bbe3422be17","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.0-pre.1.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.0-pre.1","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-7BO+zSVse2R6nzS0vSBOlVNc60v0WM5/noeqG/W4YutQaXM5fv1wopOour5fWcKShigbp5j8zsbpRPaePuXFfQ==","shasum":"7afec91dbb972568def018c8db8cb976efcd8a91","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.0-pre.1.tgz","fileCount":5,"unpackedSize":23492,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2HO6CRA9TVsSAnZWagAAzX8P/2wAgTL8CBqlOe57DAwU\nnZjot8z8dhjvUaehXFQx5BWWttWsEZm8HWOuVO3waFqEDLnTXqN1pekbLxoJ\nEXWDleWtARvZfZSajLNbWWSiiWBPOIBI5db1IgT+hdA5Otg1Xex7HEUcpqJs\nR84PsE0nfI5KW7zFHmHZuk0W5CiAmfwggB3c52B3XuqzhbLGs1+HvICOQL0U\ntAKFkx0Pim9KwLHhTdGNzhb3KZVFAxvnCgc+JAYZxhFgGoOSIhf1a9LCgTJu\nx0L26KU+x+cIgGy9yGDsXnCKbJEjjTH8hOyG9y2g0nclv7C5FdS2Qaeht+jC\nAsykAF82jNoFpkKHlixy0e/XZ5ZkJ/MVlpwTO3USdY2xhi/wLbbfOsNH4iKT\n0hyLwaJcgCy9CXgZpzhrvGzhASpVBI1FmrSxgTz0gbHKH8j/MjpHDzq7U6kb\n1LYjmngCyw6xplJO+nK0drrsZ1IQh1y4fImtgL9SPlvVAkb4SeAVcwYmkb5Z\njw9RAKWNOYrIjvdGQHp5v1ox6QMsvqdWRyAjNyRI5WRDHGpWQGNSlY12LOpJ\nkMl6DlQxAf9dsy7acCh69GQxjSuD2k8zqrQo2HsUIprhPQ3JRdNmkBot5SB5\nuNmaPkkJuP5iYJzZoF5IRQI6sg3UBB5hM7aNBR8/agxYoo9dH/zgrC2+zA95\nz+kN\r\n=ts8n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDTlTidxjUavUJEdubEIkGfilB0wo0gHqSuD9ebNya+mAiEAit+O3pa7tv1T2plmE8KNgPsRrmjwpxFigIcLZ4znvVs="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.0-pre.1_1540912057138_0.12805517183260084"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.0":{"name":"@fly/fly","version":"0.44.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.0","@fly/v8env":"0.44.0"},"publishConfig":{"access":"public"},"gitHead":"ed3f38bf18205bf92759c939bcc2c8a064a8a4dd","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.0","_npmVersion":"5.6.0","_nodeVersion":"8.11.3","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-gjGmLSAWJhoFwyMzIi32jzUuIsfVTl/c2iRtlQteCN9f4ReCvGsrbU26wY8q9/A4rU0yJttQRVFsaBXF9x/C2w==","shasum":"7d23e13d6d0902454d35c54c92d2ac3885f3bf17","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.0.tgz","fileCount":5,"unpackedSize":23450,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb2IBnCRA9TVsSAnZWagAAD+oQAKQIvSlNV20xB8PYBMOX\nAMu1fNZ6Cy77WRJx6hvyP2fjGRQoLgJb84DSe+qXMCC74xS5L6yWL42QBv8C\n26Ek/eqCvgFgJ2EHqqyY/Xu3clz6h9J9XLj6uoLow5dsL4fcyvxqNijbbtov\nyK2u9zsjVYAoo/DHzIwcB/xNe3KQk+KZSUHc7GBG+ID6DZJM9gs7W95ZoVmS\nXeRg8GJUiI/v2oasUVnst7qBPRF3jF1vX6oC7us5UrljF/o6zIKUDevGti97\nQmzWCweI8AABm4tUP5gJW0057vL9CILvWau6tfCSe3fx0GZJfFer4gl8nbsw\nwuYXFWhGq0m3GRSdWVW99kDZcGGli51D3/X3sPvhoSgP2ZKZ6bS8gnnmQs4U\n5Lzw8k+6BE2rTmnIP/AsADfj2NHsBCTqH9pN4fWd2uPR55o6iNZVHtRJcHIh\ndPtDxDwT+esRBpK9SPcZsNMb2bn09jSRmMvxKif4p8oIOeowXEHmAIbWcimc\nH1RxdSdy6R9JdqViPpXyXm/LekuEZaKvVbZYfSgLqQ1F+PAn/rDoS7R/ZYTc\nx8sjKEWismvVVVr6PQ+56fl2AmoL/knhAqaPKnmhXEUZqPvZuYwfSh28nNRj\ntboo9Me0E0w2/o7KPnFuAoYpqm5Tk5REvJ4KSCc3g1W49uVC+MrdCq3hjV4a\n3Id5\r\n=a8+I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDmqqpNarTotlXH236yw5A69fdSrUf/oBo/sxH2gFEbbAiAtzb9b4rO2wLDt2liD/mjsDxL/d/h+lXCI5ZdDsKefTA=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.0_1540915302797_0.14318013326840862"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.1":{"name":"@fly/fly","version":"0.44.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.1","@fly/v8env":"0.44.1"},"publishConfig":{"access":"public"},"gitHead":"81b38adbddfc6ea905d210490dc3da5c7afec4da","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.1.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.1","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-v/6UH09kP5IDoxA3GQp9okKdIwCZ5O6SnJ9nqZ+j1e327HBqT6+oKxdosoMYY4lqoaBYrWSD3xo3kRYFjRButw==","shasum":"d695401202dd70832a8b5e0f720d3e867a6dd70e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.1.tgz","fileCount":5,"unpackedSize":23611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3G3+CRA9TVsSAnZWagAAnEUP/A8sixZwB2Fd8oC0nvwy\nnBTMaB0LGAwNDiPdEDTQeOUb54COW5MN58TeRBZATO89srlWAM7h4NFMLykJ\nhEFTAN0JACAKlb2VxLhe20NRpjNgjKPnbsZHU++26tzwpch6dKcueaMlW8p2\nkUd85piQYKlozkspevcf9PyIhf9gdObEic/h1lTdpBG+e57K/mmm7SmPYBjY\nO9TdREjMSB+510DYd8QyeVWKclpyQWvlLXOeukx8jVavLWwTtVhd/PQrzVHs\nguGoWnOm3tRI3Tc4/4hW0JcEDXtF8asHcI3HUxMoRwiEdUbBIx+OA31IPlJ1\n/k/3b4p8ClYKbZ5gBvydhN+GtZOuxlNGHNUV7WyiveKdK7qAcidMKMoINwMF\nFUyLLodrVNyyHsUPA6PXxDQB0ReWrc+LVH+Ukv4ZWPwrVCukY0N9+AvvCQIV\n/wM85QFrrKTIV4S7XetlMIZIN8Bn5SN/muSNShdL8etFpPIe04X+brgrAmd1\nDIBhN6Id20b9t44j3zhqVB3iTEF5oPD3ZP2qcvKSq6bstK/Nk2j7xCEtdNOM\nb6AWEBB3oBg7MZr0oq3IcxXwX0vBYjTkFDHfe8JHyKXPlivmlWp263HNwjsd\n/kyy3RKBI7xiplbDBTgRuvg+zn0nCd/e+h/d3GsjKemWnH9/Dwjvyyx6Ij+J\nnt17\r\n=q4M3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOyM+LqKvtDbL2yIIUBfqNukxwwuiIFPKIHH1mXZ0QDwIgaOTBQB8TIxvd9Am+KcPMPOfE5bFYpdCg219fq2yI/Rc="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.1_1541172733938_0.3245803119785553"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.2":{"name":"@fly/fly","version":"0.44.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.2","@fly/v8env":"0.44.2"},"publishConfig":{"access":"public"},"gitHead":"574e3e87adf6c3e3baddc42fcf1e32f318da2531","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.2.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.2","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-Bk/sXgsfhbzsGzOGTuEkWYoN2YQs5y2mYuqnC7GX4j7/2hR+XRw+CCaq3tOfezxzdP9v9jpFuwtkYmjp1ymTYw==","shasum":"9559565ec38e4b5023217642442bde0b0b68c82e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.2.tgz","fileCount":5,"unpackedSize":23940,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb4OawCRA9TVsSAnZWagAAU8oP/2CY+qGQXER98IMjunOK\n+ZJ/h1lbDJefIuDSQ4Jg//mB7kYH6PdHtwtEPVbkbnZjYPoEyVR6YvOvmx19\nse30YCFg9oeE89EixtDHq15rgMSqnGgxBIOR7O6/MyeCgi+JnTZJ2t45cIvc\nzqwELvSTUxRFILzjbL0UYHYi9VdlGu2nGZFPLNaszrEX5bUnFi+9bdiIYbnN\nghISTlGvNgjSOuvzsd5z0o01NdrY1SxgJ5tAIpCfYZ6G4bwC8zR33wmzshWa\nRYyQxnrWNogd1aqEe9ar79GfqvBvtV23MowDkqD5VIUckNPNjfnrU2RPWA3m\nreQtl9SG+tlHkoYDyLNgPgKDZORVsmPSY+UCyxP5y98anmwfZjorj+Fsan7M\nBkCKtIlVb1ZkCiNnK18huuafA503IH6iqaeOC0VN3aM83V+0BKqvON/iZBPB\n4wzbjrpZysh5xzwYTALLIZWQb4UV7XjM0hu9bsDReCqun0KKgBtonQnJ5ORS\nFFcdkQIr43Nss8v8WtNdsYCDWmle2JmjPzB1Ow9d/JQ3b9qpG1Q2zLDa588N\ndgIgNAsDacNMz5EyhONyCfYdy7NQGneSt8U8UUk85yYj5yV5zpUqlXUlgQyp\nX8hFRNowrnbgcLm5TPRP0cWcTmyuX6GZY8rGN1uyQOWzOY1/4w8wh/UNKV0M\nyUFN\r\n=jTTo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClpy5jK7AxHb6gRNuIuluYP+zt0C85gSauOSkLzOUSPwIgcKoQpGJtQkfsSx+PfhmiwivqxtSdJ1szfgdr8Uytycs="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.2_1541465775848_0.708988502509297"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.4":{"name":"@fly/fly","version":"0.44.4","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.4","@fly/v8env":"0.44.4"},"publishConfig":{"access":"public"},"gitHead":"295e03cdb5716a4c41c86c30951c4a978b961c30","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.4.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.4","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-uzc+hroqK7eH13BrRrZk03LlcNWy024q79bbM7NycZi7bMUs6SXIIor+02K93PxR/3VXoq1HrE7ErKTLWuZ69Q==","shasum":"3bcdfa810f6f28258151a4247035c3683c8b773e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.4.tgz","fileCount":5,"unpackedSize":24218,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcEuBFCRA9TVsSAnZWagAAAtMP/jrviyt7jkENFvGKvdcF\nwdFXr5HNgeNeOMZZZognJATXclXgG6V2PTEc5XemWMiIukC+siq6aWbVQjCo\n9zKPVToTw7jVQiDBLNtrYBLq0LjHrgSb7xRdcmwlRPoKynz8mr5Q0zVM29pH\n1t2NJ0uAlJQCS+AmGUmNwiPuUPMkJsnW1g7t+ZXQdMQIqe/TQzKSOV/fa2zM\nQx4zuVvvToNAAM6xuq4HhxTm55B4BCBpb20eRHSBaEkTDyaLhjguU0dGDuvv\nBR3VSpYMC03ngDSi0roKaRoZzuiegI2i/TnWzIycqf+ab5xHK68WNcoP/Yir\nJobZfEp9mqhxDtpr4Ye4/LPGVgdXmx5Q1Pde+066GdnHtdZS+QDLnuBvgyZQ\nsu7339OHkNpptK/S7WkgwsxTXaC3/6hXIcHNTVLy2t0YrABqfWqdXTVvaGKX\n9eKDd8N9F1uAyLwve1BUdWx82Wmw+hRJtGOfLqqvaUmeXwTsU0QRirVpFU3Z\nctWeHPF+Ah+v3D1ZFnTCZ3aOen9rxIureLWnUh6jpqxvIefeTRBcW7MV2kvM\nYbWqhH2/AMyuFiKAh+XS/IyZsjqqgVVncI9/dobRbX3S6jvVeFIkSInNO2Dk\n3mckhmOq+X507edWv6ARsvYB31FcRufTF+fen6QX8+UQMzThCq6+4OayYW/w\nrFHE\r\n=7CDY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnHOAd9SWijcIwAYnI6J3B5tsfYw9of7HTnVJ/YgCSbwIgUvzefxll1UL0UDCYAgsUWwRCSyB+pi651aqqMYtR9oM="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.4_1544740932582_0.4248797796168795"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.5":{"name":"@fly/fly","version":"0.44.5","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.5","@fly/v8env":"0.44.5"},"publishConfig":{"access":"public"},"gitHead":"eeec5bd1b7ed383ad82c93917d44c1e140306df1","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.5.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.5","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-s1c4nVoU6nhWLywSUj0gYuVPeI9Nvc5bBPc7szFLuQIjVWr80caj6ROZMhBiBcYfzIQQbgK1IGutfYAtkBrw1A==","shasum":"0e757bde8d411ec3734674e800d87bd02e5d0b51","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.5.tgz","fileCount":5,"unpackedSize":24357,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcFAVYCRA9TVsSAnZWagAA5CgP/ju7alkmDGWF+EtOJdVu\n1S+N6pryrwcgY70ohgzYeJBagQFxr0LUw1hR5qejNP73q6TP8A8gGTc9iEZG\ns3xE54S9eNeVGziTGEnGcuI06ugcH+W5mFcObZhr1mvafm/E3XZuRTDnBQVH\nXW5LWUERiqvPLRtb1jmzxua1UTSYk7dnuy4nOCW4fW0Eyej93ANSmUTFRaMi\nGRj/HRO6/jrJuAJDxI47t376j4vKELNYvG7KS/9TLlw6BVzdnkw3XUhj8Cv5\nDUVR03DqhNQi2zVixumJrUfGERJDPbb2HjT042e53G7ZymLhZ2FqGAD411B3\nK4S7tzcMoZVG1/f/Fci7PgUo1UbqedO8olUK8u9gSM9cFTgmUlVEkNSIL9jT\nhKZuIW0DfqHOFXmAT2ytehx2hKpGHmxWHuF0x1uciQQ/3bWZ+3s0Z4W6nnk/\nTniWj1L6efXwEC/0qwFZx+SWsRz+CJtCAbakGk0/+PD+GntJ6RZV1T6+NVlk\nFmHO+shIZj1pXqWCNN8dI5LSi9oweY0ftJ4pem8l4D0Sa4DouCX3zAnuFgck\n5SIPIQ9y3wuHyZNJU8upsF9o0W9fSu7uDCXuA6UI252ELmSfCUox0r/4x5mQ\n/ESJhG/KuT6bnuawnQdnhE5dr5Ypn4TKK0PTgiSlDbdvwtDNFVyit8ydADYv\nacA9\r\n=iC+S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBPEWCT2petlr8F/Atmz6tZ/livJuuJ4Kty20AsBtAUuAiAh+s1bwQRldyDwyBhh6BGFrdYqBQnEUz9ocUEjiS21RA=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.5_1544815959642_0.7613780961861178"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.6":{"name":"@fly/fly","version":"0.44.6","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.6","@fly/v8env":"0.44.5"},"publishConfig":{"access":"public"},"gitHead":"aeb8a93ed1eae51a5f4aeac61e92262ed17f4a9c","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.6.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.6","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-9bm/RMdFEFRPdltzuM0CqLQzgz6+9+tdP+ZrTLcoHyUiwd5PrtrV3bAXtoxDu/J7UWwr3HfhBtk7dnZ9OFxIFg==","shasum":"f6e3235f5dcf4cf21e9adefb8ffb0aa8677b0225","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.6.tgz","fileCount":5,"unpackedSize":24496,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcFRHbCRA9TVsSAnZWagAAX2sP/1Jctb7sxjlp1k5AXELL\ngemg2kQnk3lt3BfjvRZ4TTkUR4ddVEAt06TWZUWLBhfIoFPFeZYhnmMNzCWz\nszYtbBAxzCrZIscZt0YW5dJIDXDT6N4aFfGZMvg/32dRfsWbHqTMQJhCryW9\nEF2RDUpU3BLxOPZ8RFBChoPmFWVwO87Fh1aTMrBWjthDGlcKEpNVEUvvMGAE\nNBeQTiGKofAOcWQ1pzBz77BFi68L0J9SewzHANVLUN/68pAdJzdV/AIZrGK6\nlLIy7BJvYpEptX/8t1UqCDEPhnjBcUdG/oNO1TSt8Ek+DjKxX6qApAwXQqid\nfcOmh914d8Qy8FxIf64SFpdgKJ4VJyY4IPei7H+cevjkALeBPVQK9LPpec7K\n6xKeROvNdBAfPLtwzq24pLHQZD1/iPN0+erepl3S4mlFggIRvmjwVDqdAfvQ\nG7qjRFFc74+F8Nor7kXkEV10sJy5xoZqt4gNKdZ/lgEAlM7mfSr9XSKqI1k0\nf3HlX6jy1NI0i5/BMCpzVJgUSGWbueZuPH4JdCdvfjdIoWv4nohA0Wdouvav\nORQ11Shekhr0Y7BHqCw4LRXs/Hu2arerrHchHifjPyjIgwh8gark9jLN0BCn\n7o81mQpLl0kPM3iFaEIw4NQnfVO26UxLTztK9RL/BZq6LNxvhIIur4NxUVdB\nv6Yn\r\n=KpMi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAj7GeLnk/IrOepeC7z7KlyLl3HiBOC8xZdCTV9Mpc1mAiAi/jLgv8xAzjYmPzgEmLMvC2JbifZIQJK7Gm7I1Ggq9g=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.6_1544884698569_0.11553087362193626"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.7":{"name":"@fly/fly","version":"0.44.7","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.7","@fly/v8env":"0.44.5"},"publishConfig":{"access":"public"},"gitHead":"9910a081476e4d5c3f64dcdc42e3d3cdbe0f6538","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.7.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.7","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-QO3v0tHLbfEyonmF1+lXRffB/6s6crudYStgmn8rsZPQTc4WRdg5ghmUkwnzUd+wztxEJIMdY93AU8IP//QJyg==","shasum":"3b5ea36363ceb59e79ff0f43ae18e247157b4847","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.7.tgz","fileCount":5,"unpackedSize":24635,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcFpURCRA9TVsSAnZWagAACqkP/1ShHmPS9Uds/i2ykSp8\nvNJSORIfvNZDX/Vpf7n/3Gj6Bu+3uekoUKk5fj4l95KOoYi493JkChkksSuV\nWOU1mBqyo6FyeSQ8pYvjRVuV8+bxzfvj60XC7qbxD4ZTHmiypqgO+3YfNPG8\n3p2r3iU26vs8nJHEDLvSfoJ5+bBxNXWqB4Ocphmqg4jygsLH0bkYZm06iVsN\n8Rc7l6tolZx7e0IRH/oEHfJbra0MhWAbEzH0xopSOgO6D0wm3C+Y6BtMRVMN\n6FQQrkYk1Rlefy4Hv+q6jpVvLzh8XYn+Z7lNpDQ2Y8e/voNJDFZXMxeLeCsS\nHg5GHIPDS9gQriCdLhRyUy8T5ywuWiv6Wm8OwPV20hPyg96PX5MDNJh8Jdwy\n7HBZOIAGMVe2HNniQ9rBMAFHme1H4NHaVYhchpgKwuWCJ5+Cmw4y7BCRWpz3\nKjwPrY5ANEyO1r3nUVV+J27RtwJ2Zr4EjR9b7rfhcGW8/E+tDwAho+DoZmFs\n0wf6fNaMkzhWlM5E0DSR5Vi6EUwfysLICMGEZOvMkzPEVhuRK1VggRzh/D6k\nPIJXiM/axp9fcrbiG25zRYQNwSh04oeJPk1C1IiVkbDMh2w+omNHPAal1aMW\nfZevX6VKRYmh/c4b1f4awCO1y17MORB261tCx944zubvumiHsztnQAjnsS8z\nG2F6\r\n=b8zH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUDoMcvX2mPFjmW4n+JwWUTL3/s38c6qqtGQx9Qzd1CAiEAklp91n7wJ/sA9s6qm3JsipbPdxZ6W2bGo3S7OvqQf+U="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.7_1544983824394_0.12014760091943244"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.8":{"name":"@fly/fly","version":"0.44.8","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.8","@fly/v8env":"0.44.5"},"publishConfig":{"access":"public"},"gitHead":"2bb0435b2988350ec06df77723788fe78147e036","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.8.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.8","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-HFuwJ4U/GX77cxooe1N2fEvKkzsuJIxNZHuHVZOYaxEzxbaWD26uFD8+zgbrdrcFCsZdEaUoOsvlPYhIwZ8sfA==","shasum":"bdb6c216e257e0b4a7ca6e624d9828eefb5dcebd","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.8.tgz","fileCount":5,"unpackedSize":24774,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcF9BxCRA9TVsSAnZWagAAIfoQAKH66RfzbCRrMWPnPWNq\nld5XJu9b/YZQSpPiyjwb6jqigaOMemnNb3S45ZLVMkBWCcbs2WpCqD+yX4Hr\n5hBCR7KPjUdsjTNDC5DGbyH53uokQpyhTrcmW5+b1G1Dp2+KA8pj7HVssMSS\nk3DLWQ8tI6cNDiCjl+B0PQIfzxrjhDgIJFjsf/AnszE3WDhSD2MbgQY0msCi\nHSsNdIVILODhH3FPM0QrTi5n28DhrVuKqK1s0eRfX+nVvIlEpnXqp44lUeID\nxdQI7ZiWxfHxtawBjY1hZXVeoytXF/u5PwOk4yA70F03+fw6+xO4K6K/H5J8\nq4CgankICECwOTstUjKtusKr45oKMi9KJ9xKxrc+vitd4mE97o3Wk1hmPwOd\ngI62cdXTq/lUMHyp3SETow4QKHvsMbJ+Rpk9ubJX/iNt6lz6+9WqaRi4ETiW\niw0vjxtIJd5WSHJUzDgLMIFhg8CC1ZqYayW71wDOKCCoLlpblu8jgDFwFYlK\nmPuDaURbIwS3KyThSrKmCjI3OMQk1SOw9y1qejyVrq5yhc/2MXDfWd4IPFmk\n7f8kmA91Eolj3/0hjnFh1sRl/8Z1G+hzAPomqaN1xCEd3w7b0f00yyUzDqj8\ntVibvUjcj6xxXElMeWiwj7KY8MNsR8TCdmSev1Y/12Sl9HNf9+whh9iDTjL1\nKxqf\r\n=pw+q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIELXrWz5mdTMfeL02w91lFrL4Se9UEvlDugozdx7x4gbAiBH1xi/mnDIMAwEdB0bKjnaJ+m1ymXQepoetkLguTWcFg=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.8_1545064561198_0.5770018715554226"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.9-pre.0":{"name":"@fly/fly","version":"0.44.9-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.9-pre.0","@fly/v8env":"0.44.5"},"publishConfig":{"access":"public"},"gitHead":"692a1b8de57d62006dcd656d80f7cca71ff56f61","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.9-pre.0.tgz","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n## Let's chat on Gitter & Twitter\n\nFind our devs and other community members on [Gitter](https://gitter.im/superfly/fly) and [Twitter](https://twitter.com/flydotio)! \n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.9-pre.0","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-lZllMLEBW1EBb+f+Vlc9gITmtGV0RLq8WlqhV9FyN4beSr1zfNcUA7nkiPt/1OUt30Yj+TaPSGOc/hZPyP+dDw==","shasum":"5acbc57da861e02016041b570a4ef8eb967c049d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.9-pre.0.tgz","fileCount":5,"unpackedSize":24937,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGmXNCRA9TVsSAnZWagAAOMEQAKLsxl3v5eyCv8rMAN4q\nSPh9AKXAb1alF7HYwNIDcBWeuDECXzkvBEj5o6E7/xm03Xq0GIlKOlfVPyX/\nTKTZk7y4KCqaGd3mwveIjV51xnsdouNWkmXuQNqiPGKZhmxUCfoeD5RnQG0Q\nL7PVIaxKKv/bsBzZTwA2/x9e3GCsQ9vXeglzAit6TYI6iGQAzL5oEHcxk0Ha\nSYHePitbwWIz5bl97MZE1YYFgoGiGffrhunMnpPaqWfpKV0aLSIjG92TSeXB\nDKQ41QzDDwPSugQwWQrzKM7Ajbv4nwyeVo7yC3euGMfzJQj5u1DxpYc8/Q4C\np3ug+BirDEjGCguv5xoGZQ41BFdD7IyOKBLz4viIQX+njOo7ePsUGri+oeEK\nFTRhxGZ4S7/vPaJ0C3TaSqmTl+Qm9gp94JvR+OjBZrBbk+9NajCl0A692GEt\nQmx3z5K2l8fkHedWFvctnFO8mJXBvy/dzCV8FcCjw340FDHV+zpLHoCRVd1p\nnuYG+2HGQB8xXDugext2B/XwXE7eH3futb6G4mgPq+9XFcaUuoK8ZEiHh1ey\nFooFSQ2tV8t8sbsly06nSTv7HXN0m/Dh71NHszJHujlfCUtNxLyjy48pZkLn\nAwE5M3OCKj4LI3QkzrqLfD8bZfPzUU60fLQddLMtAWZ8lak26ejzqhBAsCev\npg4u\r\n=6ORq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCEjhHCFM2TXn4cUdMmfJ62+LAry/iYTupjd0/srSCI9gIhAIntS14u2VMTVfqSuSbsPntkVkldvDo/PbZXo42hhGDn"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.9-pre.0_1545233868578_0.6952446522356577"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.9-pre.2":{"name":"@fly/fly","version":"0.44.9-pre.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.9-pre.2","@fly/v8env":"0.44.9-pre.2"},"publishConfig":{"access":"public"},"gitHead":"af5fb1c5543871b0db8e01dfd8357073eac52c3f","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.9-pre.2.tgz","readme":"[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n\n![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n# Fly\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Open source <3\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n## Let's chat on Gitter & Twitter\n\nFind our devs and other community members on [Gitter](https://gitter.im/superfly/fly) and [Twitter](https://twitter.com/flydotio)! \n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.9-pre.2","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-UEzVQLqPnVRibpoPuvXd1uf/IIs4mL5v2dFsIaAl7AiYhUFDjutJ1hUb3d+8r5ufLQkMtm7pxVN1Qx1JDj4MeQ==","shasum":"4a03159f0b9651e6f3f3769abb32a406e4b3bf5f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.9-pre.2.tgz","fileCount":5,"unpackedSize":25257,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcHDVRCRA9TVsSAnZWagAASUUP/jCKy8/5sL1d/l7P+myq\n6COaEExOM7V2EZ2MMcsQ9HQi6Y9uGnrc5QWNYAV4pk21WXaCAXysMRP+O5z6\nMdXK4CkCp6vMC/J+yKuWY5ZZImJpaUsTWEqBjxnyolWWktwAuiph2bc5uGV5\nEM/BbPHfIuFkAofazWJ8CpQMGICjw7OSJG2Abj/9Z5jY95mL+NduyeQKXR0c\nq2sm0f7RUtr/95XiKNrDZcKPPu9z0I3d+1qg19steEpJvltOr4eLomQD2eBY\n1/YmCNLB8EUsTVKEbz/wvKS1+qCJDstqw8CyoPnnh0jxWXKaik0vn7tbhJho\n7hANmFYTVsjb2FUWA3T/D696284XC1j5jQbhACDpDI4uq6hxpimUVenkvma+\nDFNkKv06ShT/ooAsvPBChIkeOmQBJq+gSqlUjbp54patmPBNNA6xTSoYiQsT\nZ0uS81leg7tJmsnNCC+CTOnuy72AhpzF7kaGewZU73PH+AGNlE61j8d2lbaP\n8VqG/5tVQGZ2bF+ZOcemXxm6ExJRR2ChyHbBLloryj5wSKkZj6Ga4HBsa+pQ\nDzlTek86ebsTK9YRyK6fVwkpOJG7KOHUb/aWfCx7ht/HLrle7mzUehfEdn4U\nPGaPYCekt8W64/4Oz1+v4lQHsiyUzRTV2xoZB58I6/wmMsLu7+U26Xq9HYJl\n/65z\r\n=8k6/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIkORkfgfIWawX/NllZoBK76wfGzEMep74qw4bw0gstwIhALUuLKQcbXbp/Q/Fhuek0B5nLAvI9VU2dLZyVE1Qshjw"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.9-pre.2_1545352528436_0.2673452382299595"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.9":{"name":"@fly/fly","version":"0.44.9","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.9","@fly/v8env":"0.44.9"},"publishConfig":{"access":"public"},"gitHead":"74eb903d9c3a0c4ed345fff35fc1e11096e9adf4","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.9.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.9","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-hH/MWffGgc2PZOeiZfx91WpKivURkejNeVIm4eNww/Xo/71j89lxfcTJzWkeJN5wXxZH/Th6BHxqyyQzCX7xiQ==","shasum":"5f283b491e3a6ff1e976d43ccdea0ec21e3a101b","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.9.tgz","fileCount":5,"unpackedSize":25384,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcP605CRA9TVsSAnZWagAAbukP/iz5zt38pdvLOhRiP2LE\nMPCMkDpoG0a39nLdFQzavz8rJyb8ns5aBln6As6kteEIv7KUFHJ5Ys8QeT7E\npyDIYn+SkA0yLK2AIKK11uIcIPjjjcKznJgMqt0aafUUX3wgHjydFHTzYxH4\nNHOQrIWsU/fP8qbexa7U9ntpnEzf3iq9yPG1FyIc/IPtrYo6YcWUnXci4d+/\nIA32mckUft93Z/xziaJXangNkyARPHwIKUns26iIgguVfYiIKC6Kw/qpZK7j\n+OrXjCv/XjK41clisl+6VDgZOsyEDXm3dei9/9CepmCapX1Y3e2P7Z8JCH1q\nrpxlHYxMM/4FaoUldFAzypENwuP8a6NY96xeBhxnfiJvYU+HWA92iGY2V7+r\niPLBhr563IPzVmyzL7KeCRJf2kobV77X/VgWhPIi2sPuF+9bUtesVdaYACj8\naEQsWobXvzAckp5yPdSmGNqJGDcUqULWnpEqY5x0vIKP5xEa3/dwkGsvIICG\n49G5kUz+CJecUcNvlRVVs1uvQ52lOEKSRQMphDtBs0NgCMfAM+Hev4pYbHF9\nGI2wm608x180u7kzbCAOctq2ZBQSpHy7dOq5f/2t+k6OsiP58sKdFYNcCGZU\nHjm82bG8gDALMYuTzGVE5UhOwbuv4ZWXAL+p9Nc2TfAsUqUbhz5lTRgFcpIy\nHYQt\r\n=r/yu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHitQaRblGK+Prqa+L6rsfLcfH6zbb6Vwq5X81J+2NHrAiEAlxFt3tfU5uNGzgeyXrmgE+QV8LFrMpHCLyfM94XvLXA="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.9_1547676984573_0.7481415034667611"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.0":{"name":"@fly/fly","version":"0.44.10-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.10-pre.0","@fly/v8env":"0.44.10-pre.0"},"publishConfig":{"access":"public"},"gitHead":"a925a1e3f44d45fb1610eacdf94dd7efddac88d9","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.0.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.0","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-WxbayjRnvX31Ls+m/VUQGjMQ+G4ErcizUklNPUl4a2nnz4kLhI7D23lfYQx8ZbBQwLgZ1PWYAxt+CiAX8GKBeQ==","shasum":"3184dab1e210c2fc85c75038860d8acf8c114199","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.0.tgz","fileCount":5,"unpackedSize":25740,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWabbCRA9TVsSAnZWagAAq9wQAIlpVnLL24/eD1ukWsw8\nzQ+C1oS3KngP21x31MvtcnnYyqfsnPraU/5YbQjMYcoyxtTJc4B0aBxA1Wqf\n6MKIBGr4zny4K6EYOTVGb0Rrbt2Tv1uENy8HJWqMOZ0wIii8rJecAniyjBp3\n4RW+/Ax6ZxSoNcbz4spVQyl818ytUoM4W13Q6N87EOyvnlFlxtQs0Cu1qqQy\nraWM+EzsBf/w47sBFsaWmymu46Gl8kUeq67ca3dP5Yf8z74wTsiAsvNUNfgO\nmhS287kFa++8utV9wLO+I83vBuxjKBjwKI6ovipUfau6iACIiaM/AIgYL/ys\nuhPRx04Jc7P/7ZbeuSV2e29bl8AyGF/VQNyZTz40Pnux+/b/CPFqaba1adOz\nq6l3ORe0EG1hi5Hppy72YTFmSLxCPoKpDaQyUR1+rxLfHi/BX8TznDeI2be/\nTDkGKCktsjoHcPN/qHQkOF8lvIVpDciQv1/fBTQOfbngGwbMuwfZEeeW5sFi\n9LiLDxS9AgRxjdo6byvn11sk9YwqeMRIdztzWI0jw7mImqR7nvOLbfzObVYt\nhGhVnvzy2uFmk6f3qcXHXPk+e3db/+I4tH8qPg06PMTYWenoDmig+TOPUQJL\nQJ4DkaabX5kgXiBRjgdj82vj3tjfzgcETVunaebkU9MH9iLA2hf8ZGGJNG2j\n1Kr/\r\n=4Udl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD7qLBZf13d6S/7EZM20l6dy2TziZtA5uVWnOetOKUObgIge3Xl3Gh269yJsgKbMkbGUfH0fAWa7N6M8nKWIZ2iq9E="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.0_1549379290630_0.2661144322523823"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.1":{"name":"@fly/fly","version":"0.44.10-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.10-pre.1","@fly/v8env":"0.44.10-pre.1"},"publishConfig":{"access":"public"},"gitHead":"cf0cede74d9a2916f768fec452f68809e4924b91","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.1.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.1","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-e3H4zW2rX69PnP4Kp0EgbH87gdBPLFYgzKww3vx0mkXyQ7hqhTjaFXntWOEAZFAifqVauL4xIlacrGf4rZnEwg==","shasum":"e8a46534d59bb9497cb72520c493a419b01b895a","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.1.tgz","fileCount":5,"unpackedSize":25900,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWheNCRA9TVsSAnZWagAA0GwP/2b7NtaMBrxKH8XqC0mr\nev10nMGuL2IBodUFcL+5Cecaaqx4otk4XF2pUJO+z2U2FQXX5ErnlBzc1q4H\no2NvuGxr60tksUuzU7FAxaayTTIXjgDrCuqTbhKKMFPaBkaeMAEJFnpNVP94\nVckqEN/o7c1kcAGp8Tr4KWJzn2f10wrB4aUwwJgJbv7B7Lulvn5/9ARW5ohS\n0KGvLgB21SVB2Imtqk7kUhtRqqg2aIsklWZb5kYOjVbYJKSzTkQ+TbBr3llq\neunwNKSEkZqCBbr/iOZFFDV3ovJWkkHy+QKk/7XnuaqyYJWQog7e1uQxxjVf\njoZRkVfX6QY0hA+bDW7jEWAUVTreQKkq/8SescLYYJ5cQO0oPSAnAFq0cRb5\naqPL3xgdnbJSa0+DgS+Np33iQm/wP99ti4zykDWXc0XGrY/LaZJKJqWv49WR\ntJJBM6CLZt/Yow85WMt6DFq8++8UQ14GjbEPVh4reEZIuIcpgMHO5QzSt6BI\nGsY7pk40ynFiOJXVAElmukrCqVlCc/jZFf/1+vZUXfuV+wXGM5iCs8LLBslS\nMUV/IPitbhSWYBY2UmZ8dCyGcduER2QH+ZeUnPRO10h8ftmLvpWps+PQsV21\nVa1YfF6Nc9QYxf/GMlZBftgRknuOMiGRlhfUEta3uXAkoXSOcvjJZ5mopDtt\nySaQ\r\n=nKwI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDw24v1vt/eTDrjG4FPAw0dCceAxgdPWdWlg8OVHBKAkQIgNNyI3V35+9pW6BvLlQbNGpZaDDCUdAo3q6eJFRVGpHM="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.1_1549408141373_0.7915270662191427"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.2":{"name":"@fly/fly","version":"0.44.10-pre.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.10-pre.2","@fly/v8env":"0.44.10-pre.2"},"publishConfig":{"access":"public"},"gitHead":"fe25fae4a73706f8d40ef03f787f8802ee694458","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.2.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.2","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-0GTxX3pLMns60ZeoQC8pGJ6qGeNoIkhaTXTah/tT6DI8Wst5i/aUT9RgvrR3ziwuyg7lv8++q90sEmm3+UoPww==","shasum":"98c51fadf9faa1d776147f12475a8ada33756b79","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.2.tgz","fileCount":5,"unpackedSize":26060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWhnBCRA9TVsSAnZWagAAlr4P/jI0mEXuLoqUUKLW9dwq\noQ0nn/mY3mMhldaXGSbvredzHpLCOugGi+MlndzVExXZgIl4hNHskpg77iQt\n8QTw8DXUBX6eFDUekSOpbEyk0XDFk16P/vFHpo7whNZTdOudg9ZB8Q76VjMz\nCMBYYDXLs3Zb+eVIVbNioleZHGQvPDGncqeiDWZqBm2PWEA2HN4drG1RhP4Q\nlBZvStpx7/Wy578WRlCRDlt+q3U4m1VR/jy4OHBT+EVyOTSdVmH5hJJ8WKkC\nZKO28ptkkpBxhJTNFB6CmNAnkSCCMWGqjZaNaPBZXqlWBAHG2VMkGnUn6fGp\nyjutYJFt9g4sH6k08KczT1srjhGcfi2PdL8aZ7TmZXeB61b1E9a0nIC4ROCD\nQUxoi1vZpQ/ceRvTTAB93ECDqYCtVv8/QWOXMTpYgspU+yMo/8ODS6lfIXAf\nF1I8MlBGoQyKJDJ0X/yphPztp+DYLvXZUrLQcv9Qf4680jNaB+uZWiDJgZzq\nuurvKYevqp1OULSq0Mm7deAtVEotZ8b3xm3OoRDYyxqChpln5AiGlH8ARH+b\nl2kjjZ3iykQleo75FM3juRbMeaT5TdmFvssqSKp95WxVxICK6ai2y9N7Ij26\nG1+e6Wm7Cr7zGmvqaWCBPcJJwa867PV8Yze6wj8Hx+WNohjxnve+K6m6VYU+\nLHIl\r\n=KJKk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXzyCZUgCvH9picQ9C04DRE4nH/PCdQ0UjffCMvN+EawIhAP0edivtJNZXR6y+azFXY6qNENmVruLUYudZHZTyqm/W"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.2_1549408704892_0.9481563116665239"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.4":{"name":"@fly/fly","version":"0.44.10-pre.4","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"engines":{"node":">=8 <11"},"dependencies":{"@fly/core":"0.44.10-pre.4","@fly/v8env":"0.44.10-pre.4"},"publishConfig":{"access":"public"},"gitHead":"71fd0eaeaed7a80bb87fdc292b5976a3f815c3db","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.4.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.4","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-+LMx0zg9cD5CRDingkqe8qh2JFIjYcaQRrj0NQQviuIzwllHVTIyFNh6LyJUD2wBFmlqrynOT8BOHO7IG1gixg==","shasum":"1ec995318b66971182016753c4fc3343e21ae321","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.4.tgz","fileCount":5,"unpackedSize":26380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWuXuCRA9TVsSAnZWagAAS+MQAIgGUrmbfZCwylHsdQ3U\ntPrMkZn6G9+qfHCdaeHu/aJmLc2yLS2e/EA2OckoUNwChSpCca2HuMbVWwIx\nexx2vjD6+6URXUFD8DQnHR+iGBHWhz/wma42ERBO/D/MS92uXz42WQLjyLkX\nSQgX3xo77vtibWLxZ+nDBDEp1LdPj4149xVAzW2o1b1yRBiyp4XOD9JbpZO7\nWzRziPVUiamFFQccpLagnjt1+aIlZpVVE9ybDFEFphbgrV6vnyZrbUN9pu8X\nxhYsU6pnzDiD/vq4aWWHOmoR/1t4naXdLa8YSb2GWsSxieFTj5MFfWC+pha8\nlCaJMW2C5LHvHmLQp2EscjFbW7LiprNFNad1cTAt06A+l77v1iOb5k7WkNvY\nfGOX0YXDW11FLaYHToI+95Ye8MZ7czUkYLryjAz+FLcJ50jrNnB0DZHKodpJ\nvOgCMyn1d4hzqLnruQANFHJIFNW4SchaFw3iu1MaQ/gOSYo+tvGCQ5Ctp64N\nzU9CL5MyVYStPCz8yooWk2Ui2kqNyR1Pv3CNQ2QqkrG4r9T64ze5SU6xdR37\nXb67Ckz9XTAB2LnZxCmwGjwezyWL64kojIgHNJJZNXfdpXzsYfiAvet1sl7c\nhKrP900w5xskbFG5pscSQ3NYI27cDp2C6uJjyjAIGuQ++Zob+tM6OEogT23L\n37Di\r\n=+A3X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUOJlY0AuGkbN+Qq11IQmGh4Uy4NozEER9mci7HdKHvwIgQrtS3Z/EVbU4fODE58o0YgSQswaAmC9DBTTqQ/tNVfM="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.4_1549460973655_0.044546873481998484"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.5":{"name":"@fly/fly","version":"0.44.10-pre.5","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.5","@fly/v8env":"0.44.10-pre.5"},"publishConfig":{"access":"public"},"gitHead":"d10b1c6f81576042be38af5f40218b7eb7d5e660","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.5.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.5","_npmVersion":"6.5.0","_nodeVersion":"11.9.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-MqtVMayDz+AhGeKVBDwIhjsPkwIpq+wzTe5bTQ6hv/z8jvKC0z5frO12HiX80ygfAH0VPEgAPI5cNky1bWd54A==","shasum":"bb3d90a8e27690d32c45e653a9729a75ca9f632f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.5.tgz","fileCount":5,"unpackedSize":26498,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWvzGCRA9TVsSAnZWagAAaRgP+QGjWNYzwK+vW6i6osBW\n6yfktPuiBs1YaPic/WeL/0vdpqjEtvVgiMrllmgCQW/OZNkw3jvHNO8I/GQz\nO7Wb80oHLAaIan8Q+whasvspsFRjNzOxO3NjKWtfFIYNcgI5gcTq1rblqgsw\nOjTw15SlNJO/vOBeXOBpxhUp5LMg8MU+QOQqG6jMXT+eMwZXdg3pcByRX2qP\nCnv8amoi9DijI6aXhG9QKYRJE22BIkYncvYbHAhqUCs7ruJEjovL+OSmWA+r\nfZ3v4Ne80fBX0+Gn836U+qTlmWc6jjksPnIEOOZ8pVJIrvFryLFOEE53KrLx\no39IgIzTnm5myvI+5gZQcowgMCac9G6BO9a3a7bJ7qn+ejQ8eUzYvFJw5xSE\njNIpmo+V7nYuZGYV9uOjiUVamlpgA3g7DfiU/sdsrRHKsYPdFI1EO9o96dPU\nYGzBnDqrOBHXmK5voMCXzIj3Sw4Hd0xSHvTGN91YWQ3YCUJ6ri9uAZ9Jflq4\nWa1eY6QEonbjLP5a+GDCLwtLVV8fdDxoK8zMpy2jjU3EsvQLWq4LgwhFIJag\nUnJNvGnnuvQ1tKafGNe3jWld7IfrTm1q1XLOxO8OGY/LWg90dK3dE+9VwARg\nuV9H13a80SBegrw1UBXY7rta7jqx6a94xys8QdleYf2B+I9IweE6N1JTPhaI\nylhU\r\n=/oNs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBrGF+gBxPXeT7GoLFerc1JvHc5FphmLBs3rZHPQ5vcEAiEA7mIiSJ/eGRAiy+EVzX8m2aENdYlbndzQl6jZW9HtgTA="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.5_1549466821628_0.5011510207400212"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.6":{"name":"@fly/fly","version":"0.44.10-pre.6","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.6","@fly/v8env":"0.44.10-pre.6"},"publishConfig":{"access":"public"},"gitHead":"600c49e324bb532479d4c4cddd673872dc015b60","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.6.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.6","_npmVersion":"6.5.0","_nodeVersion":"11.9.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-5wwQ5+OVem6yq3hnnZY9n3i4MYiK7/EIpfiWCgy0AAseK3rAKJYo4V8Pu2M+lFzqbMRWwrCn2jT5Kh5mjn02Hw==","shasum":"193de6c6067aaace7432b7b6eac3326eef2b9209","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.6.tgz","fileCount":5,"unpackedSize":26658,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWwBwCRA9TVsSAnZWagAAz2AP/1dnXJ3xcnYz3gDgeim5\nuzyYmgW+SfHiVFPyPNMJYp0xbVjR9n1ttedo527GuGNNbp1Kig84iKlQZ9Nh\nY7boDLGuAvkpzT+h/hI/cFZ2ocCL25WRNOw1BdesO9lUvSGjI/tkXIrmi/cH\naPirLwbl3ADv8tLwbdLvXFufnXWDUIaPBSIQqQfzh7fuNvcGPigDaRv1dZIt\nyoU8Cps+yiLUOjsEnrNR6LJ5D9+qTUiXDyzF6nFriqDeIGr/CmUQxf1tUvPa\nofmMCp2e1RSvEu8ncJi3Ecf69aO1ID0/gDb1Nexd3C/sa6uAv4VPdt8+97Rn\ns0SEL+Ya08+WADyfHkalRqMg0SzzhTurRU08cxkozjyCUvIRFqqHVEjd7+WL\nIxLzE6DZAd2whhZrTa8eKfWw/XvtpHSSdVTdNX3QXFRY2dcWFkU+iSaDGC5/\n4HDpKMSAimRo4qc+eeU4WpJHHqW5FNwDovPp1RVjYr6G3pY0beb1zW2u9/eT\nAIvTV37qLV/xK6z90Cr+3R3sHf0zfO0CDvtLoXU5U9NhPIOVIU3iBKb33ZUZ\nXk7dwbjB95skMV5sfqSCdyZS5UoSmKOoApjABBeTH3kTZ8NBgZyygFtmeGGb\nfXGNvbrcznJSKb7CaT7JEOIWhQ2V3aFZZ41raMgDI5GE2zHnCG0KnMro6vj3\nU34/\r\n=IaXd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC0AwgrraAa1vSH/22nZsGR0H471OheHojEWiZqlrQgHgIhAP9ZuWmw5rh1JShRqWPqFG/UyJF0+CoCTY9vBUD72II1"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.6_1549467759737_0.9527364611500453"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.7":{"name":"@fly/fly","version":"0.44.10-pre.7","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.7","@fly/v8env":"0.44.10-pre.7"},"publishConfig":{"access":"public"},"gitHead":"eaa563c5fd478a5d50026ea5629c6b4dd51d1981","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.7.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.7","_npmVersion":"6.5.0","_nodeVersion":"11.9.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-C5qfjcvkozYPezW6GQ5HANw3qRnWtZZNfTdFImDsqJ63VSjGX09faxqurWK2MwUCtaMO2IWiF4TlA1DI7fmLTQ==","shasum":"86332fdb216748306e177c15614783c949f45484","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.7.tgz","fileCount":5,"unpackedSize":26818,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWwTgCRA9TVsSAnZWagAA5gcQAILjD8GdOaGvidsDcRx+\nEmomPpkeFWadirXtu0S4AXqwcUrOt7ZhLL5deDiXuVd/lP5nYLSo8rQjlF7j\ncXM/2pGnD/OVPoY5jWvAg6EiS50epakfZD3Z6ZIJ9vZQLsZFq/zXH6kRG58/\n1qC18KsCAxLaVoALRYOmgEySkn/zfprbbwGU/XDtv0CHA5dc19CL7YGkozWs\nKDyhVYW2oVcT1Dgr+G0jfMbX4rHHwPeGPB+W36VR3rtkEjBGhipa/BB2p5Dp\n4hurLydTJHuqp4E6gkzLIPbaF1LuRF7l3khk0O3J8p6WKsysqZ4v3On4+WXa\nQpT4TWK8IlTbmVrZqZuJcGF/+HcAlR8nfUKj6MEc8p9IfOa5Bc/VM8/K6WtT\ncIvQ7E569z006XkfvV4jE9vAmy6kyOQnQp/w5u5yj78vjPlslq95Io8dVoCM\nvT+T8hgwdXWPtXqX4+CSnGboExcbqnHQewMGQDyGI0jgla77F4CulT9hju+K\nK5bIxhFctRbodcjvSSq2te5pYjnglrxQKp801PRtK20DoZwYVM0rfYMACMmf\n2nhzza+5FzMeospKDD0r+/WpOFweonfJ2ATmk1mxevbA3Qtd358hiAORQ6qX\n68N3qBMOxZt9Uaildj4BfdX5cXtj8rDTZD5LoKlqqpH0Ksqo8EK9ZSMi/ta0\nZkBu\r\n=eAhi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlwskEOKXfpCkLf1awJCCU/9In487vqw+oZdvid0SuVQIgA4rNJKxrZ2fWDDEzi4T/g1QBqa3bJjqNBXqLzJNMO+c="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.7_1549468895882_0.10665203554781999"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.8":{"name":"@fly/fly","version":"0.44.10-pre.8","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.8","@fly/v8env":"0.44.10-pre.8"},"publishConfig":{"access":"public"},"gitHead":"9c1530eed22274fd6eec26cccea0460d716a7658","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.8.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.8","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-tV+/kLbAt5pPGjfDmCuR7zJCekEYpLc2wbnDWwPTG56gGnJelm3JzZCgmzpFuLNJwFcQQQH5dwadmcn0T2RWCg==","shasum":"6bd47e186b238c3f9f827744f85475fb3ff6f710","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.8.tgz","fileCount":5,"unpackedSize":26978,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcXJbxCRA9TVsSAnZWagAA3qQP/R+tQsJvovo4PGW2knSx\ngTgZdSmPZc7uDbEkPdqPhVvRk9UcJQxNIIXi+w1w8OTiPgWCc0LGiiub+dqN\nN+YDNlv7cWpYjscK6Zq6s5b300UliWen8AZM+H3cJFCuWww0s/ulxJFmIejg\nnXOT0KH6L8hSmnUL8djvMtZX88S7UsYTBMxP2zhQcKoA8jhIufWIMF/wmRxH\nK27F6yL4D5Bpo81JYDa00FK2+lIxPBljPgE/yaEBCILMQCsldMsfpTZULKAo\nfdTzFDNxb4BqohI5Y2cFCLwkuDk7VPkq3w21g98fuyNJTSehy+hT6Z//YXf5\nuQ8CpNjbSV4mpGsfUMocGZP8ArJwdfSHPf6S9IUpM9SrtiIrflgwv2k4BzFJ\nnH82MvB5OAf4+Nk5PoHkpafI5tUQG49OTZESX4hqYNyQnrjd1GezNZgzoAPB\nNUef7Hzm2Ljf5EAknyKsHAanZnKGus8aHOmUDcG6Vj+NXrb2CgLLrPHUNn+k\ni9h7aDuZkj9pPemII3KzDE/Q9fnOfQl7/Bt2Pg+dBrJfR69bukn0Tbo/Dnmu\n8vbaU2UK5Q55XtXmrS6anTaWMnB6GzhCwnbV4UsT331cj4Ey4Q8T5ghBaP2x\ncBBLrwKi0Q0J5jp7ItqQ1uC0ojOCkC6HQd0uMaogR4alIUdsmj5PeLMdCJ9B\nwbXO\r\n=Cfw6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFPkI9F34PFD7UCTm4vytN4yFuh64Fe4MkrEB/0GIFJ7AiB6YJ2TboPcg+lbviklWU0nV/f7CinW7WTEOWMKlpL7Kg=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.8_1549571824359_0.37554032114799396"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.9":{"name":"@fly/fly","version":"0.44.10-pre.9","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.9","@fly/v8env":"0.44.10-pre.8"},"publishConfig":{"access":"public"},"gitHead":"7073efefe6a592d3cafd9a4ee3081352e1285115","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.9.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.9","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-+CBTrC3MN0Z2UXEiFynHPuXcpVRV7c+Dw2wZ0nQd7JP7+yjNJSj8i/cGPmGMiahVuMKW5hy6YadkOXQoTDUONA==","shasum":"9e9dfbd867fc543be9ebab2c8d6d779c620b8bf0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.9.tgz","fileCount":5,"unpackedSize":27138,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcXKdQCRA9TVsSAnZWagAAXHwP/1iNAprxosnqmjVBHE6A\nEihfqFy5ZqmEkH/1t9kDQSFtdO/FDdF3OkGcp4Iv0cocxTVcfupkx1MPCJCZ\nicBcfSg4iVme9Zy/MyMGz/hrDGlxDX46t2o51Qu2Y+aYNd5GBpw3ZLYpuOlA\nBfHEZghQy7eURJoBNVAx4oU37MCGjvO8NNRdtv0K7/O8S7+nzU1iUe2HjZjj\nj+DfDZwMVWAzvdzBBmkUC34cHR+YUyCbgp/m6ZID3g6T0rMeBqlbP4Q3exx5\nJXhrSbT/dn9RVtZuVv6PcPsv6CUe+m8+gSQOm78rzgUrVuNepDqn/P/83ZV0\nTVxeKtt/32VH3FIOi5Hs0qw5rIvoS7gAUPjrjNbbcQvYMI5gWBhPb/XT2pMH\nRdhFJqJGj/M3zqVKkmqubE9ZRvlv+YNdE2vsY+QVTwHlDu8/ABCdUk+gwkKN\n1EQwN8TN6rcguuUJyQ0cWyMv6wOK7ToMY0ra48+zLCXSzNMGCJVbNhfpxBha\nPG1/4GrFZJXSA+vX2V8sYiNfoWAOnuND77AFvGsBhBeUDrvgLCuUsygXEA4f\naEcmFyO/7Dg02kESXMR/i79kVjBOzq9+bsD8Nh70d3dt9G2tS249RTW9o1Wn\nWOyes/meeJ8j5vsXcx4FEq7oMQthvResAeBRb8qysPsbO2qFbLYG014f4Ehs\ndQPK\r\n=CGCW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBNLONpuf5YqChdhOqPwSsx0kUlFYycjucQt3SSBcjo7AiBjMdY73JJbmCJW7wUllNNx5GmInTL1gotJZUmX43PV2g=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.9_1549576016005_0.33523538394397034"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.10":{"name":"@fly/fly","version":"0.44.10-pre.10","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.10","@fly/v8env":"0.44.10-pre.8"},"publishConfig":{"access":"public"},"gitHead":"05ebe547fdcf6d2cd568a9b71e9a675088478d4f","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.10.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.10","_npmVersion":"6.2.0","_nodeVersion":"10.3.0","_npmUser":{"name":"mrkurt","email":"mrkurt@gmail.com"},"dist":{"integrity":"sha512-JgpLseCPhOJVzLRrdBEAFmLHe25v67Ktorup95EaumSx8jMXQsIYSFm/sTGYMy8yULKlM1zFNv2r2ni5BoZeuQ==","shasum":"e236062c91c49dc5da69da4e7ddbd7b1c233c4f8","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.10.tgz","fileCount":5,"unpackedSize":27302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYauRCRA9TVsSAnZWagAAzcIP/iOWO5oZulDKvbOq+ulR\nXYQ+oUWiaYkcUVAQpgETf5lf/3y+wm9FF+ZE8DgzoeOqLlS2TfzSPoLiiNWZ\nBQwbpg+Mwnss9JfMbBqSo1jDtrGND1U5+g5oTeuvW+N6CRgWKuBuUAzhNzBe\nhtrUb5gObDuy1CYOR0HGIvm2Ay1iC1spixlyVmLkEL1vNH8aJLYWtdxWIfHm\nHX8vH3QhwWWrqjlNloVzh6K7JqxUWnJdGGWcoTdKg+bcZyDBBLj9+7Opb0x9\nieC0xSCt625CEg+mmkFZSmvDoqjtWPdLds9oFnzgU1Z00JTYjQCEDI5gykFL\nLhGSE936KvtPM4CjRT0Yy5pvX7+bszCtSkBFA1wYGgb9ctKMtm8oKrdCT1CI\ntYXEAjIFQfi+F/U8FMtEehEZ7vg+Sym70qci+zOyMUhDlF8i35yCSGSFh9b/\nzParaeE3iz+dJUaLyBp3QTTfzJen3miAOHaxKp6z0dvrJcSBWUAYiWonNscE\n6E6SzjeKLF8AQ9qLx4F7YFlLADACLJyHzyzSU/YuD3Rr05jfe4OJC0DqzIir\nFNXUo9oUNrRUcRJ8uw2ofgUVvD65Ys4DsHtjAe5Gz8sY8k/sC0Njpg+JfoUA\nPLI4GksMaWSBXECCKtuKHD/pOHvrZ42+F3nIQSOGK1hwMJ23fo7klQ0mtjW7\nXqBl\r\n=yzlG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2TcgaO2EqXSNvufAgzfPtLAqOv3zkAsx4pZDShsr7ygIgbHHQ8BkWpqYUsSz31moxC/71D1RMRpy5PlzrY5doaqQ="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.10_1549904784519_0.005664176114724251"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.11":{"name":"@fly/fly","version":"0.44.10-pre.11","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.11","@fly/v8env":"0.44.10-pre.8"},"publishConfig":{"access":"public"},"gitHead":"e2414a200d5c527cacc27db53d15ddf65129f5df","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.11.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.11","_npmVersion":"6.5.0","_nodeVersion":"11.9.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-phfCYApn3izQy0xycsZa+pwpRnin88qDehzmcUADf+TGMNj3dHk9LyrXdasDcfim5XVYVXaoUcXJJRjcp8l01w==","shasum":"5d13b0255ab98b025c42028a92038f18fe1e9fc4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.11.tgz","fileCount":5,"unpackedSize":27465,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJccuL7CRA9TVsSAnZWagAAdn0P/14ilhqeSpJLJuWJZUQB\np1LIEzTkrsko+kppTz4HmwHaFS9q+TrQn68VgbL+j4T5gXlmGvmMXZLWxrb/\n/rXDOnJi5dzYicMG7dMahArDHOuDZVAlAuICVWDSD075z7RHtLYmqMyMds92\nLO8OL7Ori1Sh24h266JQWjIXWxPGOtfkqRAtfHpQbWGIJVUvuZxlSd27RQwA\nl4u2YBC42DPn5HPRpeXee9WJpT/ihbOWq/jypLyVaT21OWpvCt3LAiMmlTXd\nW9ps5ih0bAox2DQ5Kd4dop+INRnnUdUUDlYG0n6qGbz+os6rQ5gZixWR8vc7\nYgFX0cpYUv2V6l4u22qbo54VD0+ts7c7ixcL6hRFBtZCucluTt/pYZAk/u+Q\nMncw2hmls3tO4q7gzjAGXkIikAAdoSSECKYRSEuWruk7zZ7tX2DONTwQIeDI\nFu5D9kDJV5ltjmFZEL7lKleSYf2IsKHzL1EVMye6Kw/yTjMZGyDHLS8os39h\nWt/6SV0PA+9YtreJ+N7Caig4kLDTL3jLKihjrNwptPm1QNKUXUejCGZ/eeXP\nuipjRCO6rhfoPWoE4LwRzzYaTx+84TG/gm5HqCAWacu/K64Pt9upScBfCgGQ\n+0CezhtT/sCFvd5w+VWmpx0kL1woKK8oZhYyf7DfA+yBZ55uwsKgsEi7ojUs\ngb+I\r\n=75Wt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfYmdVW61rPkjQb2AQaouGZGmJWVfNWpES1uHwYLoawwIgWakNe5WtuMEo6d3C7h6UdQqYd5jLp3NJCSUd1L3E5ZI="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.11_1551033083206_0.8848505107247506"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.45.0-pre.0":{"name":"@fly/fly","version":"0.45.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.45.0-pre.0","@fly/v8env":"0.45.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"77a7a6bafd0b325e4a82c7a5fb02255822e3418b","_resolved":"","_integrity":"","_from":"file:fly-fly-0.45.0-pre.0.tgz","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.45.0-pre.0","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-FATQbUjr3OMIOHv6MWSs0t9tKMzXDePvOGEnBB0HqUbfn8kmX0ijL/nHkERPsPjXgAkxhD4zlpk4JYmvB4LG8g==","shasum":"f7254f66e2781acd0e6372cd8c2e475229db6800","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.45.0-pre.0.tgz","fileCount":5,"unpackedSize":27455,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdaIWCRA9TVsSAnZWagAAS7cQAI3SMmoRtcNhbP8mR1KY\niw2FK9Pfm0zU1CvfF6rjogjdQekFSYsY9/cWyEFnwIORV5RRFb1vAdvb0ECC\n3apJ1E4XSyNVVxxvXArWA7N8VAkWHNnnctF+52qSh2q82U0I7AnydKgK7/YH\nI5e6uFvNxtd/00vCffnbTyvvcQyi6qFyVki2Xh1aKZxm64Qw22nJm1wT9zww\neMzpURCQKlpRwMhaRMLN2cvh8LU4fpLDMVihcX98phGWTR3f71gjFf27AjBd\ncnMvItp3a9J19Bzg+D7x+y0cALiQd4ynVmZFiABNJ6pJQa+Q1TCVuPA/PpjS\nqKLDkwLu7vY6wE/A9QiyjgQnf38SHeTXlFebB8dNTw8KzKb07zLNtC+H89hQ\nGxDsRHDhd+JCM59uaztr8CWI+WBf1bIxrCIvLIwbCSvL+c6zNRQsedr2g+aI\nm6xaQLuiMxGGfP0wvDgNU2GbsVOwZgPsbVfH7F3NmR2snAaSGP/HEdOHxJVW\n2yParHnwrxa19Ul0pM0twyxy22Ia+dU47xayJ/1xWBv/IFSdLuQs7PMwZk8c\nq1uuznbL1fKzfOGy21p4vF0U2gELM4+Hged31QMZHeLicB0bogrKeBiFajuw\nTA2B5umeMyduVXBTfdhultF7Y3pfDJCm2nRS6B+7kUCGtfcJPCUvrvLbm4cN\nYtNz\r\n=oJJU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCV8q1jPes1S62RCkMHf0FXzSLEOQ6PMTkjd62LmAiUKQIhAL+A1qHYKLXwiCyC92qnySLgzaZ/pWpGsliKAaiyr2E5"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.45.0-pre.0_1551213077892_0.13333084214860746"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.45.0":{"name":"@fly/fly","version":"0.45.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.45.0","@fly/v8env":"0.45.0"},"publishConfig":{"access":"public"},"gitHead":"6734b7d5e3a210a83d900d45122f9d5632ff3028","_resolved":"","_integrity":"","_from":"file:fly-fly-0.45.0.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.45.0","_npmVersion":"6.2.0","_nodeVersion":"10.8.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-h9s1RbapecuwLJ9B3Y0chkNAe2suiXUu+kxneFAP4XWnNesQoDekQYPInN3ry6HMZ+5O61JVx2UgP8S0VFaFxQ==","shasum":"88f307434cf9e9fb6035374397bfed96b7305d44","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.45.0.tgz","fileCount":5,"unpackedSize":27583,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdcQrCRA9TVsSAnZWagAAA0kP/AwF6GL5xO42kREudXWL\nqsxNd0qT42CfXUgCBmGZWmviJ9lcKwCdPniQ8CDM0+EjrdZH2cU2u4lI2Kdf\nc5nVWuef0O1lt4MuPMty/U9YbQMOxDJP+KM3LCLUtBsu7GSJi3LBhVkBfzZo\nVPMRJ+xY4yeQKGcr9xQu3XLN5+gKIMt3WUjrawEPA1BYZb1mErPOFP9gyT60\nRDlJXSJos9OwJfAOs7tDwAmT80ieUYg6Zt8ENqu7z6ZJTAT1yfjQw/t2s+ti\nVRUt6azuLqvI21F8mIYdnpEsHeSYHnci2OKjcc6HKMItCgmv+NIEhh/MsWAB\nHv7O8OJvgI/1Co0e4XUvexptNwtjrvhI6WCxJ6ZOXU8F0bleLZagYO0OfqLA\nhm6EmPO5f/U76C5gLF1DdoBzLXHIwrIm9RAC3zUJwdw1mo8Gx7p7TyfQKRK1\nGep2pZdC4secofmCjq3nplIQvteRxowZRXh/SLnL4vfL03ZAY8/HPjwwfXKT\n/lmJAg3ZyziJzbjB9fRPUa9MJyaVFWhtvvBkbPbN1ihc5onyKwbFa2BNtem9\nN6iHon8tnF/72Ru7re37OCUPW/B4bXjGo6bWlzHNgtI/Z4ql1WJp9GyyHJAr\neOWboxAWkZBf41RrQiTNUIqF0SFYZPHVrqGxXFcPeewb7W5SQP60bT82ah+J\nakxP\r\n=5neH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOozqc4t8svsq+BDCcITMQPsacW+I/tXs/S6jWUVeF0gIgXjH3e9fguUZR1AEKCvPylWtEp1LkDQPILf6b223yZdc="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.45.0_1551221802512_0.14153001717908542"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.44.10-pre.12":{"name":"@fly/fly","version":"0.44.10-pre.12","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.44.10-pre.12","@fly/v8env":"0.44.10-pre.8"},"publishConfig":{"access":"public"},"gitHead":"6f8938930f559f2d57cec6fe2bcbd02697e4b8fa","_resolved":"","_integrity":"","_from":"file:fly-fly-0.44.10-pre.12.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.44.10-pre.12","_npmVersion":"6.5.0","_nodeVersion":"11.9.0","_npmUser":{"name":"jeromegn","email":"jeromegn@gmail.com"},"dist":{"integrity":"sha512-epx8S74fGc5HB91neSyyo4OK/Q+uCZwc/flswP4MyHxTICeTl67rlONYgk1CIDRbBk3DUXwOoqDwZaKD/h5iUA==","shasum":"1d1a90b69438a5b3690c50f5505562edf997aca5","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.44.10-pre.12.tgz","fileCount":5,"unpackedSize":27628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJceE/ACRA9TVsSAnZWagAAt6sP/0edM4rebAgS4gO8+4Y+\nmUzvz6sd6nvsCadGon+1uFdMwFeuw8LgfzCpi+JEvlYxwxDBUHRNbAcS/EBc\n03lTrllG5TEVVtx7yQH1nZWZX4JHfl4rvbl6y/Simzg6eU/WSCjglv1uZQLd\nSLqefTl95DFEmJo5u+9oqCzj+NHYH9I3UXik/Nnum2lmIPUB/pTF2uiErlsF\nT4XHyHxuvjpv8ASxji9VNRvXyS3VH0j/ximgRqD6W7k64xFdvtFKOcdqxe2C\nHoV1rhk/V69UysObP08d1AP9txd4KZ2f9OA+B6WlS/EQgq89fCEBqyzX69B8\ndtgF2yHLEykufeZIpNXWUnWc0vnLpDkthi68N4AExK5r3d+/yvA/N0nf3Zh2\nTGqK/rdiMM3OdU2A75QfZSiVndZBMPP4RwCYK/l1CUrKoKi72W3ztD7pML8H\nol/+hNVVfRlB7WRFXJBG4d3r9MPEl6LTxudN4eJ4RG4rJu/13YLnfyxd7cSj\n8fJisS7Pt3HNX+gYOXF8r1p7isH3jhVhc7BL3klXe5w32vs+avytn7693kwF\nkpjqNMWlqNPAx6COZVDQ/v1IkpQLueim7WIHYAkmEzQiCG/Eex5vkpY/8Bre\njnV8Kn5P+aCCG5we5d8sAxIWa7yU+bSCA+lGStmLUyRhOdRFPQ5/9w7VJVLR\ng8ba\r\n=cyq0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFfqwWFcigryPscAjcr+eo5l4MgPoKWKlxpTtQnBep54AiBe1auQ150nHgn8sDmbkUBDEi6v4DANSRYbnyDLa/Zh0w=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.44.10-pre.12_1551388608016_0.43864036231215175"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.45.1":{"name":"@fly/fly","version":"0.45.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.45.1","@fly/v8env":"0.45.1"},"publishConfig":{"access":"public"},"gitHead":"867d959e6aea6d7e768d9df1ec59c21ded2121c5","_resolved":"","_integrity":"","_from":"file:fly-fly-0.45.1.tgz","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.45.1","_npmVersion":"6.1.0","_nodeVersion":"10.3.0","_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"dist":{"integrity":"sha512-MJOariZysEHB3M+BBxjgfo84nPZnx8UBsNWwcxJtMntMk5ZIuBBE7CkkSvoNKlKsl85d3iQJ3OkGfOyzhjSwOQ==","shasum":"bece22a6538adede13ad45d483f499537dcd961a","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.45.1.tgz","fileCount":5,"unpackedSize":27722,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcfVZbCRA9TVsSAnZWagAAmksP/RCcxLXdC1Im2CFNMF3k\nUB/ODQEPjhE94CCpJA6nKd1p0D1YL5lc1cbWJ5bZuWaRzFraRO4RIMgNHmqw\n+Sh219nyUVNZvsdK5sS0nKKQKj9f0zpnbQZJGj5AXL/5DyneyFT++ubX/ZLW\nJOM+7IPhJGqe1Hh9EcLWIIW4goLdlG2G2xZFmSV3ksOaJMVqHFgICh2lB1VI\n8esk/hsv4PA9fUvqnfGBWxmxzOXw/At85kBnqZvlcZ2Bcwoitm+p9Apzya4I\nVOBVCcGp05qBviZ/2daOC7ryE0+3o5SM11YhNHIBxUWL4V+ZaQ4n3OqlXPwJ\nC91tYJSSRnA/763H3oCMHrBOgEk49ai2J18NMZwaZjAvmy7Nx3Y8bHtOEJTJ\novzqgRM1svYqZLGtAsIFiQLijIW3zeVyJivIiPFiluU1NEj7N1spsRCC0dmT\n9ixFJeIoueo7h7lm6dph+U6xzytELnx0Cgv95SiKN1aDp4G9J4hbdGGmpTUy\nFzi0n/UnhgTtdQfPCTCJscK3rwfYvF5rKH7giViObjaiA2g0roEv2XA4RmHC\nMsvfLuJHLGDzuS2chJKw4aS3Ru3f4ZXpydWP9KKb1+jwQQ5O0wh5QcwD9c1b\nLhynthfCRX53PAZLceEKbpmqqvXGk0c4r5kOZQOxCZngFBVAnFzRpjZ66w/g\nKi8s\r\n=Kq2I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEgAU5XpKGQvFwrKSGfdBAibIYtkUBt/ntr9HQRy5BrIAiEA1DMO00dWHkwCE601QM9Sc0RG9fzTbseUdeDTZdHMNYA="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.45.1_1551717978475_0.1843108333352037"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.45.2":{"name":"@fly/fly","version":"0.45.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.45.2","@fly/v8env":"0.45.1"},"publishConfig":{"access":"public"},"gitHead":"82b90133df9fc6be0411900244873be40af4f256","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.45.2","_nodeVersion":"10.3.0","_npmVersion":"lerna/3.13.1/node@v10.3.0+x64 (darwin)","dist":{"integrity":"sha512-TtSr1O7jRxWUlzywW7QC6TEQjt0Mc8Ogb0y9+14h0Fmpe1dmJcEzxDWr7xO1foK74zzhT0FRdJUEysIW57uNbA==","shasum":"6815d8b6914c27f9996aabfbbab2f46992043f79","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.45.2.tgz","fileCount":5,"unpackedSize":27861,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcfV5vCRA9TVsSAnZWagAAjPwP/RQkD45yjAatRPVn2URN\nsmkjmrwyqA/7OqnhB0GAkQg7ghoX3ydJavIPbmJB6IcCHDnVzUGwnmlq2m7m\nNIr/5U4o/2o/cW/0xjV+GQqTOmpOj2aZUpRD4OjFh13BlUz0RuLS91gfqyGf\nKNuzoDSVtks/RrlhU8rPKGfJm5N4Q7jgo1yASg7vRhu8gEflQjsgGajFLybg\nYjsW/hedVTomvOxPYJltr04sIivIM/4fHV/trphopvUwDrbrsRA2Ff1d9+he\nETsN+JfBjl8A0Xe6avQB/l9Jex7kc4pvhEOzwsWpPV4JRI6OACagHHqgvrCi\ntFrkmPRWjvFX/SPUjyal4tgJ6kjECMyPp8jI4eya29mMucZPQE99PfRFb8yB\nSROEaqoa434zzpQZBuZa7mqpuUw/YJ8+U6kIOA3kRvIgwgRSSESiW4XtknYD\ntfExoyV/GI0I8aPWdaO6vND47QuabMkgXhzGA74vLbEePAk4q9k8N6wau9z4\n1MFQWqOMECN614a8M6PYf8xhzTPXsqHTyxQ8F4dD/ve/eM/WuhGH9/ZE16Mn\nfpiM5lsTba5+ECMcqIqCFRJZUUSZrYsNRAp+Cot/tYBkeJV/qE6X4HEu2/BG\nAYyecELNd4MR2GsgN0LZGJxlx9J3vgZZoh1QHohSAx1887pNW0XzIo0FqWu0\nUfY1\r\n=ObsE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDddnLJi3oh4c9ousj12mPzOyYxKMDL3lYP2MQmG/AJAAIhALF5tPegQzxOc90j9H0x28p5gV/pDQogfPpT4adtNnZP"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.45.2_1551720047335_0.8966047144820835"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.46.0-pre.0":{"name":"@fly/fly","version":"0.46.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.46.0-pre.0","@fly/v8env":"0.45.1"},"publishConfig":{"access":"public"},"gitHead":"10114963851cbbf44f1cdda54a980fdf286bf61d","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.46.0-pre.0","_nodeVersion":"10.3.0","_npmVersion":"lerna/3.13.1/node@v10.3.0+x64 (darwin)","dist":{"integrity":"sha512-EFgdbkLOnuQFzSew3g55/6rNyT/eUmX8HEfbm0cK9fPlkO0PenIrnck+VirylNewqxVeKlLVncE5jHUMUou93A==","shasum":"2bfdd011a59459d98db615995281c290af27b543","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.46.0-pre.0.tgz","fileCount":5,"unpackedSize":28023,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcgV6YCRA9TVsSAnZWagAAufMQAIR2woAGr90gBvXW1W67\nL7VnTz74j7BPv8qEw6GhyDltv7AlW7s5KT7Ekxed4xlesgWywKa3s9jIJur+\nKJpMv8au5qWNWV6fnE2ZegIRVP6DVbijE/bPopPizuU0XVy8781L+s2nBCby\nBWG5KR61ut9NR0GjdyXTDfdB2UH0v0VzswBWsSM2q6dyg2NXj91HiNfeLvzg\nOWljFgJpbC+omNFSJS7jZu88z2t2WO1hKthunUXSz9AqNfpotkRzuP50fj6h\neJAGK9GmFPYXkmuGQjZVfaElZc3LIQk3+yGkTT6XOaZ8CMAFelaeKZmB2Htk\nudZEJcPD8acM7JuG8lvu9saPdkjEXu383V+uveVDyerPyixX4kHKFh3pFYJ6\n/wstNHJwpBRA0pF2YpxLSB3zG13dY3VnlVTAnOo94I/gqzLhCTMt7KZDOVcE\nFDL4Cejwvq51EG5zOvnBdY/dHzC8CgJ6IKV2EQNdbOgvD0UoO0rxkEUu1hpo\nrVvIpiOU6GlDnM2SDLs4Mt8TKYn2veZ1cF1aEKu5nMy8dLGfnQ9u0QgdpBmQ\nx4FMdmNu+gQVjHdMM7BwQIyDWu5J4e2x98/yd6GncspGQpNFlBAi3YWDW1JP\nD0BP31vGPN1HmNvrMfgAGA2pR9tFP4BiDNY5R8M1wt08RU1svbUWOjE4slVA\nU1dA\r\n=C+GJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAr7UNUCxXPTQJccmD0+aMAOrmV3uWeHcoG11kMqh07vAiAZgnw8FlWFbCmDhwKGwxzX03A5EoeUm2MwvHWzAc4Tig=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.46.0-pre.0_1551982229798_0.8126858922336069"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.46.0":{"name":"@fly/fly","version":"0.46.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.46.0","@fly/v8env":"0.46.0"},"publishConfig":{"access":"public"},"gitHead":"f524f833cf83f87d6f5926cf247ee93b2241a1c2","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.46.0","_nodeVersion":"10.3.0","_npmVersion":"lerna/3.13.1/node@v10.3.0+x64 (darwin)","dist":{"integrity":"sha512-im42FsIi5QVFOII31kM9vYUvagLC+ns5oXYDg9hH3A5HUgEWftG2P2fj6rL+RWlD/HrNxHij/mtMj1UNkDmPNg==","shasum":"9c997aedce151de68c14e9167288811d6a6418f5","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.46.0.tgz","fileCount":5,"unpackedSize":28249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcgZGlCRA9TVsSAnZWagAAW4oP/0DmQgESnIjAitPoEqBj\nDuSaNXN2DIs4l26kmsPN0Mpbg96u93JFxwO9ZaIhYYe0wa3/JdSG9ExNk76l\nJirB/r5Nm+t5OLl3dADa3R+qk+zcbUlK/L5jUshCaymCn0wlJIX241/MyY4j\nBc7WSQ3bFDvFA/AVmg0RM1J9ZidAfXND9IAYAwcgc9feyZuJbzDc3HVP1Vop\n3k2Z86K2YcgkPE5jUGJVXPd8yMQel6zJ4NxDSTURAnXH9nqcqZFfn5h8l8lK\n32DHJFSzAu5/Asu23xSIqUy9gxBAvsSQ3IFmhAj823g8SFCvVaJOWdSCoQzn\nw9cFvDoRKyDPjsmgVl4F4HuFmKaz87IivReWOzmNw/b5hAaBs92RrrLkOXk3\nRgEN0tld4vI/5x615PrdkCSyK/oOJ2nTt/WuJFE2yykguAIv10yXVkAQgdru\nbN7OW5RQa7CBP53zaeAqpCIxg62F/VFRgb13ZQre8cSMZ34btVFKYDOuTlCS\nBi4sa8eUXPLqkorZaa4OrL3eUELIVQ5KjW2Y6QdpR1NeLiSFBZSKS8+No+US\nq1K0zCaRE5Alb3Lo8L6Ym/kkKLiXP126YuInhlkxkevAfP3heomyL5wI2SiI\n2zByUi0GtilbVb+6GzK3kpzZnGWeTQyleiRCYDPaJI6bbLcqeUdDH2tD+F+K\nqrJy\r\n=x7Mg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCstpi+rfIh5nGGXdR7BEvVYofD4xG8cjP7aOhLpij0LwIhAOFhgHZ5AVK5UooFn00xIhp9Uavb1di97kykYBfx1IIP"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.46.0_1551995300162_0.8249075835260937"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.46.1-pre.0":{"name":"@fly/fly","version":"0.46.1-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.46.1-pre.0","@fly/v8env":"0.46.0"},"publishConfig":{"access":"public"},"gitHead":"86d0554f756e263b39a544674a95a204e2165a45","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.46.1-pre.0","_nodeVersion":"10.3.0","_npmVersion":"lerna/3.13.1/node@v10.3.0+x64 (darwin)","dist":{"integrity":"sha512-ylFLSfZLQ+N0zHo4zbCDJlMXrELLsmnp76G0i6sDaY9PUkqXR8QvRWslxdVKLUEqicVGpeqLwSNh8jypIJ7ZRQ==","shasum":"180a79ec0c35004aa1eebb85fa9913efa53936b5","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.46.1-pre.0.tgz","fileCount":5,"unpackedSize":28261,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchpz8CRA9TVsSAnZWagAAIqgP/0uC41uM6mE0aeeYZ5Lt\nIlLKggvfoS0GROJbQYWo3h3VBXaHWF8vRj3HkEJs1vA7+jFe9H5ClPGuIEzI\n22tRhFo0IikHbJQmGQ8itCKD56G/dH46QPT1oUnQ05H5B8LgFrj2l9wbtRY3\nq7m86Wv/LPSqgOewKB2I7fOIqu59F/kB+GNmADP8nyRZIEvTAxrixkBkqgsK\n0cxZFOwwe7rvunsagoJR2z096uQZO0cE0zKLcVdLeVvBWbqgyfElEUtovUrd\nZMoVi8tRCcvlV02d5s4ytDXMDmnSEb13D3jeULOmE0wKMsTgwOiGhx6K8VP8\nVxpoydn3AnzBJW7YLWJwA9bR9WUkJCFj8lbzlW8ZHxcby7DEorNPK1tm0DjH\naP09CDCbOep/48jRlZllXJg947XMeyf7aGzG7e9BEBJ1Nkk6ZHFPL6srV+i5\nfRGWZ7hDG4knbPFP0mtZAISGHNkWoMr0Gnmx91sCxbUk3pumjY0EXtEyuLds\n6vNAPn3iYh1zSXy47G3xXQ2GTKX2leFof7gGDpq+1Nq3Hvk5jgVEML/63JL0\n7vnuwuWnBZa7uKaZ4eI6p4m3n7xjlEzcH9XsWE92qmgkadRZRlEfq1NOUrDo\n3SSgfHDKrG9iIV5kIclXMbn5tRl85GHxCIq1xmIgcDmR+B9JTM6uE9IxpbTq\nedLh\r\n=0Ife\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAVxggpgBEpk/SJBygyVLAHn113hNLONVCvsHqZobAyQAiBJP5edSFXwp2H3JYVnkpatl2bGI4C0CSMmU/XfLe9TYg=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.46.1-pre.0_1552325884003_0.008415104574027055"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.46.1":{"name":"@fly/fly","version":"0.46.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.46.1","@fly/v8env":"0.46.0"},"publishConfig":{"access":"public"},"gitHead":"83d386b69bea626847ce17ab7bbe2b8a8e940d9e","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.46.1","_nodeVersion":"10.3.0","_npmVersion":"lerna/3.13.1/node@v10.3.0+x64 (darwin)","dist":{"integrity":"sha512-KeFSdsuwTzPS/8p0gHmq9HuUoA13uDi+x2FNjCHsGVmjknJxQF2THVA8PfzhDQu8baE2ybyhftpGGWtFDhH+tg==","shasum":"1fc6262e71f64697bbb599df1152f67f79e19971","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.46.1.tgz","fileCount":5,"unpackedSize":28388,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchrtICRA9TVsSAnZWagAA5H8P/1tko6XAzsDyA7c/GrvU\nl3o3adclbnFPEXIh96BOqFz8oV84aO7ZOciHoEZ5oBCAihJFC3XgxxCG391/\naOXhfiy+Th+4Kk1z5bBr0VvSrE/24F/uUGW39SgjJaIcYYydhWHnS9SMwv+C\n179034ZMSnhe8Q0HEpERmtLKYuw/HFEWoKzUlhqO/YUfCwi9ZpA5DC8+Za46\nRKtG1qGbkb/mRQRreniRonajVg08CZQaZ/JU5AtqMvdYR2ll3j39nqQaRd0c\nQSKQy7ABnNuvZgLkp/KMERdFvRul6DmIf+hEQYjdm01ZmYcDmhDkTvqyy+wY\nZIPPqKM13o2UR7x8DjCjG6HNIm92hSmYZFZAUfPFoCyyZ1AocSjsWhUWN2LB\nkGtVQKx6gOKPGC2/9I5CQAwYYJJioRs91tzYtexSQWcN0WHLVOdhKsuH03Wt\nTaeNhUX4hkBZUnsklcmlTl3cSKQttcdP2xrYGe5d7HqyZKCI0Mo2X3dCv1d2\nJFVBr9LzcLBk4hG8SkwaJpYxr20O6DxC4n7EIBDLaQq+pr0s7TQh53GlcnYY\no6W6S+PrfY4Ogfbb1Ho0JW6qKLIQNLGTMIEvD9DWN/jPQbqtfJzsPpPlEDo7\nQf/Vt3MeDbHhqynGsjuhIja3LfFhV11UWm85AsMo2PtdicVqxodlXv3DLEtk\nqMfn\r\n=8lpM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCN7266maWGhCSnqpt8hFlWhcXlH73iu4zYnoFDf8HJAgIhAP2/gmLOi2EwtUdOIdFYy15g4mt38KVlCGc1L6b1WEHX"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.46.1_1552333639873_0.2767915110428494"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.47.1":{"name":"@fly/fly","version":"0.47.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/core":"0.47.1","@fly/v8env":"0.47.1"},"publishConfig":{"access":"public"},"gitHead":"2f025d0bbb9f1c365bb1fdb0b5195a0f045ee9f1","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.47.1","_nodeVersion":"10.3.0","_npmVersion":"lerna/3.13.1/node@v10.3.0+x64 (darwin)","dist":{"integrity":"sha512-MyGXDEpDD5ikHeAhRcCLNyJovQfJJf4YOYybYSfA1ZSKmkaR7VecoGt6laT0XboG11QpSCdqYMGXLi2id8rMZQ==","shasum":"3536555c838d28d8a8aa710694d0f570f2de598d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.47.1.tgz","fileCount":5,"unpackedSize":28665,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciVG4CRA9TVsSAnZWagAAkJEQAJKBNRcJmGHHLJwrSInM\n9IKMTk9eYphe0OzpqiEBQqRORtOBfa0ULvOSZmiLvleRdW798wAvHsDY06xc\ny4bLuGInS9m273K5PsAvMAOA71O5X+Xoe1AcJlWL7HTpCOyrzzaVszNUnTJE\nuUgXgsOYj0C05jB8iYBS8LAoxCN7qFpK48LgywaOVBMycgI2lUoF4v/cBOqw\noMTqX57LHzXwxOocxujHEcRsbKNAM8IB2Q7C7+R8+K3iYvezUPQ2dwLCl2Bw\nXiJxA31XIBEDWbmDPH8bcpKOO6Sm5vyOzzs7PoOJySeD7pzv0ZM55r5Zx2RM\n0Yk9DBRFzb7XdR1Pzphj90WSajOySvVxnd9hJSDfhlUou+ei2AzcBctagzMU\nBLWfKv1wnwqeqj6QqCc+BX94X0bsBsw7+C9YHpV04bjqn9aPkRJw5km4Lwez\niCcQXN74yBBRwKXKxezhdVl1CW99lBV0vkLjkMTDeiiePIMmVXvUSbpg0rMI\nTAZo5zeanXv36lz3NY5uKXIKb+kalsisX84kyi0XTtCisSvrhl/jV7oHUlz+\nJKmBcrwmSt5PTIq3/YvdOouxj/xlRohfBNWHdngqZAbF5zQyFymrF2LcVIxM\n5GVEpW3Q2nMzsBti99r5Tvd174Q7vEnsThOKPMEc3PgMKQz2akKqWBnfQXb4\nrgMz\r\n=KW3K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBF7462JPqGOedJ3b0lizBYhUpynE9HM/PFSGx6hFDYTAiBOh38J6EUe302OOfDILGqlVl20Im+jnNio65SVroAfqw=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.47.1_1552503224198_0.05674052637040794"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.48.0-pre.0":{"name":"@fly/fly","version":"0.48.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.48.0-pre.0","@fly/core":"0.48.0-pre.0","@fly/v8env":"0.47.1"},"publishConfig":{"access":"public"},"gitHead":"c7b389dced20386ddc2eb513ecb4ff62b2d04101","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.48.0-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (darwin)","dist":{"integrity":"sha512-w1uThPj5MlUk3bt34JZr5gu3oS7n7AXM9RjVLXPJj0MzudsBiEJs+eqbrzpDmyq/+FZ3SS8CY62udLqPPdoTgQ==","shasum":"fa5b580717fd65d4ea96bd00550d7a5c8bbaef9c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.48.0-pre.0.tgz","fileCount":5,"unpackedSize":28857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJclVgcCRA9TVsSAnZWagAAxYwQAIdX3dMjQJn916pzOyl5\nqhvX8tL1n94rR5tcBJ5ABV7xyNFkEwY24MNQ5cN9sUeZm9S6dM/3ybw1Dofu\nOks25z4WpWSCMmwr7gXwY+vTFhhVcFl8olIdXf1ZwYV75eCZ4HGBl92/LqOK\nF02oOj3jz5CI2G2tnvBBcLvZTr8hFvrLSYEAWgwIpPETf95LiUMThICY+clx\n52ET4iGJQV5coRdLKC9rqc/tDAbA0+yC29mKVWx9VJlHX/PdfxD+3w5h6/4/\nhB2GTk8rfbg/BUctViLJhIF9V1Jqe59XwKGnWxJYgp3ryY+SSV2faqQMbB68\ngJUl/Se535tM9nK1+TRG4ThuBnfg5oxj+sozA6yCJMvaExIX2gumZRVW27sT\niikPejRfurPvDt8bnLP5WQiqlknV72+NM382oUFTsiTgZ9RLHK9EyqNPh0aX\ngPzaWyoIaFbc+kBZ3UOHBwctHjhpM9Y9iMD1PcJaS3YxwLYnnkTajeCQGf1w\nLnDSr8SxvW5A+p45ej9uiEbhN3jWaBbmWV7iKmTWZP/FDL4oJtBBXiz9nRJM\nYR7K885C7rRnVo7uLsRysOrJyDFnmvi4JTVW9cxz+ntDy0R3x4gWPYQdG2uk\nyBp28S5v6YheJGZg1/eNSQ7mcn4LpxTtz69Z77vcjOhsB9Phl5xuB0TQPmmo\nz3QB\r\n=PNe8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBUxsvtEG9M0OIMqvYQlWKr6Sn6hkWWJFEwPGhXVzwtMAiEA6QiPfh5BJ8WXiCTzRQi1yXiNg0C/KcqsYsKWmLeyiW0="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.48.0-pre.0_1553291291582_0.47658216784626184"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.48.0-pre.1":{"name":"@fly/fly","version":"0.48.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.48.0-pre.1","@fly/core":"0.48.0-pre.0","@fly/v8env":"0.47.1"},"publishConfig":{"access":"public"},"gitHead":"adefad1507b5dd0ab2ed136140957de766257994","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.48.0-pre.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (darwin)","dist":{"integrity":"sha512-mkvrEr9peHcgCp+c+5+deDygX4OIkUAjm3Wk64iciAqqeyAqLQGX+Mc0i7ZY5ZRgrq/Nx0SKP1jE9KjntJApgg==","shasum":"45a10c14002fa0170e09a4437bbaa22b73769959","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.48.0-pre.1.tgz","fileCount":5,"unpackedSize":29013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJclV3bCRA9TVsSAnZWagAAcsAP/00aoOjBCnMsu4imTfWg\nUfk7TS2vqxpHgK2WAfd7S2s8g+ky2dLzm3Wf2/l0ydsITwJSVktT27D6j63b\nakaCSj4t1sudjJ3mB8kOHxCAkckHuMH0ro+dWJm7nVU0x2eLXjRQMNdVruNG\n6HI4HAeh2BYSnPmK1wQd5GeGvSo88xb1HPVh5YZMVnLmoCA10YQZFh06i+Rr\nNbevsgE/J3nJDwYFv0Z8sKHJrfWSke3eX17B0jvWWLuPComsgyoc50+46J/s\n6X+2+v8hr0erKRJQOitE6EMn2EJOANV9fLsN105mUv60dJAty1KhNAs2JrkR\nQM/CGwH30mYSPHxnp3Gk8PioiZ7uTNglnKmtLkVMDOXt6gSb9rY9j/5xNKf2\niHHRdau2mmMN7SxbhGw6D/OTMrKzxvzltfhMJPP0o1dX34hbA7HoCHV88QxR\nrM4Kj5kwntrN+U1snBe256jHnnEv4xqOex/CUL6x79GqBe9xqhkNbSd9mK5a\nxd9zpr0Kr6FYVIGVDnR9hxX1qtawdq5T3DkrICug0hCAlBWUPeZX8jCKK+oO\n5PAoewx+4QwEU1kkNP06PRBt4NdyXfGUOPoxzbGTkuJ+lVlzvdD4PMb/6ZD3\n2ik5n06/ARCjRFUzlOvtcnrsUJ1shBCQzWmE68Ws9nYej8ITxO9VqRkbPu34\n3wdD\r\n=Ufiw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvT9PBrm5DySlIUJX0F6U7h+NXXGb+y3ZFI/nzGUDhGAIgR4yiKf2b1iGlsvj0N7D7XL744KFDpH38v8cV9r8IVNY="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.48.0-pre.1_1553292763117_0.6138121440928677"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.48.0-pre.2":{"name":"@fly/fly","version":"0.48.0-pre.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.48.0-pre.1","@fly/core":"0.48.0-pre.2","@fly/v8env":"0.47.1"},"publishConfig":{"access":"public"},"gitHead":"85e3e8a38a62c80426e885363bb15b4472a7931a","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.48.0-pre.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-dF4Wouf7abPRldYzKNqO4lEhNBPexwSZ2XrTKxgIWRKHE9l6z5onaOAhaCyuZRz64isWcDRZNvHawS6fkNv0Kw==","shasum":"3e67312420334b304adc58eba7f15ce9d8663a89","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.48.0-pre.2.tgz","fileCount":5,"unpackedSize":29169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnmOBCRA9TVsSAnZWagAAdUgP/1sNwi7V2l9s5oDpyE/K\nu5PJT+RHCn/XzXC5HtbJ+ppHLu+IfN7d1+H43C4eWTi1KiF7MgQSrshxMv3X\nfCesKDIPKDpQNTfDrN93Mv4LQyszco2pWKh04z7irkNDXNpkItGoeV7g1qTA\nQXOPC/VVfqk3fFx2xxBZIWpPAsKLOjC5LWbXxZoHlU/GSDQDIK4IViQIE1xX\nHtBQH/5iH5T1svOmqyQb6Plxg4+FLo7XLviaMQETCiPspWJg+Npby3NVDNbw\nfqwD2/FWjImMs+vq/SiNETps9Afg7Wlb/Ht4qWCVUV43mpywGfl09XZVP1AO\nX2uDR0AwTxuO5cIJF/7Fhz+xu2cnoHWqgmRHKPRZ16Aoyt6y2zQPGb0f3lLG\neSvAZNvd4rWkQItAS0O1CKmSrnjXFXodNiar7jRmvwcfKgYdj8JRCaCovFaW\nkyPNAFtRvP+TwENaZiMSkLaTzRXf8V/6T+yS15V5bnUfrQNd945NQnl1j4PZ\nD9jINMYSessN3g+IZmBDHSxhuxcFWHprBCIeLeHdiLcvianSlA6MWKwbMGNw\nLTiKCb/bgEeoJtgkP+mIJdEz/d2cfkJXNEyftrWUFSknISx4I0qX6BYgyU/a\nZvx1qH6KmK4aVXodQ6LuYwT1GUTwl0hDHj7iPxXUhX9qRyh8IjBaTFc31eRo\nce1s\r\n=pcAC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2nnAokfSakT0RjLp5t57Ox9tB712d2n6qdtLgW7lpUgIhANwdAqXnphdfe2cwjjKlLn2VdO5jBQnZR/qXV01+4fWM"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.48.0-pre.2_1553884032774_0.049292454739604086"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.48.0-pre.4":{"name":"@fly/fly","version":"0.48.0-pre.4","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.48.0-pre.1","@fly/core":"0.48.0-pre.4","@fly/v8env":"0.47.1"},"publishConfig":{"access":"public"},"gitHead":"24bce4dbdc250acf45a56155eca24228d71b68df","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.48.0-pre.4","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-3fqo5EVVMyjRZC8etD4UJTaI88RAv/reNz1K6YOZrvdzc3kVUqsib6gdCXgiY00u2HGY+vl3YU5tNAP8unCwMQ==","shasum":"18ddd645683cfdfb8cc7e9f36170351fd2732b06","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.48.0-pre.4.tgz","fileCount":5,"unpackedSize":29325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJconnACRA9TVsSAnZWagAA1+UP/RhU1bfLkUUVn7PDjK4x\nhU9GE3uJ5rkj2e/morZvx3RH2cWmsvTwkPKh/szAtVDshU7iGvxCU67qXIUA\nmJ7aEBAC//1Bmdl77NUHpztmQHtcT39v/fcSeOdbS2zfI2Rc5f77b24fJK3J\ngGdQVQFG4wgYGAvWGT9/dsMN7eGiSfeGik9toPfFApiVVnlJEEuQ3dj7CCYM\nt6GDyebWjcLmrJrb/F3sdC7vi2EjIlmjsijkY6MEVkW3QG+kfgHxoNX5GEoc\nq7587BkmtNwZMV47yfPf0nS1d5Bht2qEaGO+dOWcH3tOdc2ds3CjuopHra5D\nTfApD516JdtHv4P3NREtnVLFPjQJ8u5qohl433gKa4iygsQ1mljpnUYkLj5U\neiR7TaTWFqH3CuCt/zZ5fpdMfP8sme3vauYKitXOJe6tpdg4LFdOwLB8+7dy\njln/ccR+dxzS39HmfxP3q24/ZcPilvDnIAX9VtezGyafZd7/DoUMeJisrmvU\npa+bzdMRv+wL+Pe6A6Qyg6QKK8mqXUITnryomvCvWIRa3GB2CIguZoKCO+JP\nT+DIrRL48aBh3auJtPXEY2Bu+ZwjjGyxGJM9z29ZjzEQxLhIeL8GNNNbe0Xx\nReawLYKGz1cF7tUnKx2tE78IS1szzmkT2EZu+9cdROEewqjG5JBIXHYuPVuZ\ngUBu\r\n=yiIO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFBLbFMi7bC1FP01sVJ5GlVYpk2VOhDbyacEuKKFHGNFAiEA4ZgJjHvOgzhEnRM3Ao6cm/lDBCQU+YNaBmNqxgL5Kx8="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.48.0-pre.4_1554151871507_0.41771836311040467"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.48.2":{"name":"@fly/fly","version":"0.48.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.48.1","@fly/core":"0.48.0","@fly/v8env":"0.47.1"},"publishConfig":{"access":"public"},"gitHead":"c52b1beb9e4aa400c687eff4504f060a090ee497","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.48.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-967ms1F32DDBMywlJbAFbY3j/ZWZz+qor3lEFebD5P7F/Q8uVKxFfskKVyXBjLqkkECFaRy04bdvMNp4RX8gTg==","shasum":"a88445b6f2bb38df116df7ccaba402e2e930b1cd","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.48.2.tgz","fileCount":5,"unpackedSize":29692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJco84ICRA9TVsSAnZWagAAqYMP/R0YAqJrOxO7e7lo39CC\nlQxAdcO9qgY500vyMLxO9TqSkWliD+AqYGPTRzTDVhbrJcHybrUU1MIP9gGr\n23Qbu39ktxLC+LFLSn5YZnEybWV9kfJ/uzhs/5BnXCcF99P6JkqLmASAg30I\nqWCUKM4q2DAsAzOjKYztGC2vNvHM5/VdAL6911DVDD8Js3glBZL+AZrkrhPm\n+NwCu6zEh2JCiAEw1JWxHqFIdAnSs4zxTv+lMN95ILkmnhLjzssjOTdqUZCV\nXzabQayRpvkXr0FJwTlRQZGSR3/QogZac8RngUVRPVdIED/LuXvZyvB8jmX3\nmlGcWXmmU8URPD+Vu4KbWLYI75JkmnQPArACF3NUeLtLhn8YLB5WCGHXfkyy\nHl4hkWTyMu43+rChcxTML44BIxlOTQaoNUoZbBUyH/ehhlC7ri5yDDFqSILL\nkDKU0VSTyTYBNwRoQS1WLJ8WJg4mHgjejbZOGu1pTSsaoTzAUsUFJUfYjLi9\nKOMH54G0vHphtptKULNv1tTXRhym+NMiULJbo+xfYUmzBDSivViDL79B6bDi\nebrEPAQJTQy7t9DCYNPAUYdB48wPpJCDUaIDVLUOK97+byfO/qX6gk1gl2uL\nsydFl+X6bMqX0Ffqqc0AGrzeCy/TnPEfojpDEFy9WIURz2/chTokV6vey0YO\nSWSR\r\n=X8aB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQeSyjSzFq2ZCMPlyYei0/kXYYVA0ldz+ImQ+EOCYDXQIhALrRl/mPWY3kc9uJk1yZuIdMxw0ro1i0kNatvup9OYfe"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.48.2_1554238983695_0.676181017419411"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.49.0-pre.0":{"name":"@fly/fly","version":"0.49.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.49.0-pre.0","@fly/core":"0.49.0-pre.0","@fly/v8env":"0.49.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"3992100343c592cadd20f3af540fc589eb084606","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.49.0-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-xpcwdgwG7bHlmFCNujpuG5i0sj6IsEl3ZX7gzG70ja5Xm29Cw1kxG3PVUUEVh9IqOZLJFt0eYF1Jds4HdicD/Q==","shasum":"4c1c7721cee47cf022856894652ea6f43d2c3ca2","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.49.0-pre.0.tgz","fileCount":5,"unpackedSize":29866,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpmgsCRA9TVsSAnZWagAAx7UP/jgRSOY83TTKhL3CBm1J\nh/UWhdR+QvGXlodcktKOFqrJsnCv78jaQSzFli37sNG8sL8DaBCw0npSj5CE\n9Qf71MnzFnQI9j9aaqSRoi/B/r4OZMuAkQsWWHJPWKNZ5oPviM0aClnF1Chz\nSx8xItpB+LEnG+3dBDtypUkvVXw36Hv5HPMq5ulRW3h/wAnX87Ltfj+kiIHu\n1iigODiNfDsTpo2i2jBHEVaKHKvZ5XCbDQa9PbglFD5xhFSX5UNBaqxbh4kV\ny1ddgb429sgu43xsL4hICxT9AGzadJK3XwzM85byJmcR54aToU9bSv0L0dVF\nt8OjeN2ohauQak1LklNCSGFTiHJShnkSJqHx+lWe5btoMGQKSsSKJxsqYeb7\nEq+vWhQpslpsmzvEQjnm0ms6R70wJYOVyO2hELG14zIE4SIIb9+v2nNXAy5J\nujvrQ2ATSyEknVfLSiIphxTuXM6jyxdFOtG1x+klK5UurVHbfWmb1Ml6Os4d\n3zULp9zjmwbNz+9rKGZoeiXJ5a3qv6ps5nVAu8wE1uS0wfCZV1a5Ed0kT//B\nElDMdAu9pq9owa0OtI8R5nkJeOVUwda+B4A573qZ53vyc1wEmXO6kbeguCHn\na8bAE9NtF6GVfF4U9I/30fWNjWvTNeuLpnGWjHMyWzMPQpXf/LhcJgMcR6FA\njqVD\r\n=KRWJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGux0NSZwouaYk0VUdZp9Q68oXMu+GOzVKfVq+DhY9FpAiBAtgbbCOnjOtVvvUCGz1dniTyGVpTuXokIKGFa15Zf/g=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.49.0-pre.0_1554409515713_0.1802319723513266"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.49.0-pre.1":{"name":"@fly/fly","version":"0.49.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.49.0-pre.1","@fly/core":"0.49.0-pre.1","@fly/v8env":"0.49.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"173292d75cdbf9ed56c698bdaeedfdae83e00136","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.49.0-pre.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-3R1c4qF3FU3HPkgl+EozIgMwiB5Y9BlTnZyWC88Po3UnotcgX4ToIXM0Q4AbySTiS7gKo0bgp5ENacAGBcXsZA==","shasum":"6765e504a156e6373848fef729b998e78174a8c1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.49.0-pre.1.tgz","fileCount":5,"unpackedSize":30022,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpmojCRA9TVsSAnZWagAAVycQAIhJQTLdetbwzw1hCFKA\nEUbULiTRmcsuiPf+2MAQ7S79K3ybC4IjoGcc1Rzm23Ndmh2FPrf1vXKGcm2P\nVT+tHcr5ssohfDNC+m+Nuzd8Rh1kVv5Kb3t2GGsU6n0XxEpzK68Lp5oBDP0A\n4de0nWmeUoyiG1PlxTFRxg7hfy691LH8bgYatbO5HSFzsOEkJxIWy2XHMeTC\nFDb43jeH1+FKM640C5hMA9oCAyDWwkawDiq27nHoMEvOQ7fAmOaAXXe3ptbN\n4QuKq5rLOmMRmZz6RupRUDoarsEVHJYOPYX2AFxOlCZ4QV0Yp8FFaiNOy2hG\nAoPAbIjSv3Ijf76FsVLMiWB1qSvyhmpEWVwNZn70XYZR6dNVcjOYNtcmvGnC\nmGfK7OZLQdbaIiNRyVvkMNT1C6u0hmo9HxpfUxtw2BTZHRok3N6It9/p1vJo\nLc07vskyt2qMN0HVIU9pOgm80d0n46KZeU3j/krylCzCIpZoDo06RaiEAapD\nUuGJ27LVQOJLy55EdfBkxKkR5jpOliMgmZD3qsk74wlvJXp+1LM25E554+gv\nOb5w7Pmnsk2IaA8jn4HC+vOxjoQE9ZlFhsLv14mogN2/IlveXN1qTG5rUatb\nnHMd2is0e7qcbhNe7LJbvl2e4GoDGaUM9JyZFm/F5LiyGaLSwRoI0BiKQ9iL\nZkO9\r\n=jaMQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYJa3Dd/S7IXi2W2ifengxu47kfWjhvjQekiPyZTa5gwIhAKjvBmT25AVoZjDfG4LdRLLuG0F/EfKuZuyAmpU4H+4p"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.49.0-pre.1_1554410019047_0.1349181117933307"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.49.0":{"name":"@fly/fly","version":"0.49.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.49.0","@fly/core":"0.49.0","@fly/v8env":"0.49.0"},"publishConfig":{"access":"public"},"gitHead":"70b23e5a9a364dd2b013c2be6ee958d83f488230","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.49.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-RJPG1Ai08JOrQgGlZC1uo1cVJiS7FZ17+5JcI84dqBzBJiWwCqMycp5QXChDrX52ELYzpWYAvb+Dke1oecLODg==","shasum":"dbcd432331ebd40b6db6e8212dfa8fe43c037514","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.49.0.tgz","fileCount":5,"unpackedSize":30142,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpnGACRA9TVsSAnZWagAAJ3gP/RrO5iy6nyS8/Tn5gTLh\nXtH8yesBpqnjzBxn8KmSoPMuLlduSaX0owm3/WAJv1wG4wLIUt/4Cb1plgmp\nch+A5R79Un+ReeAIJM67wZb8piCqLBkZd3UB8guHzz6zyc+5yHQy8xoHdbj/\nuZx/o5/7uZcHJ53u3BDG1fePhmoNUEgX8ftV2O15R1TV+k5Z3c/WSghMgK54\nvTqHbKFIXY6dzQ9iLbCtVP/paTcNrn19tSyHAZIRqmINEAkIKCEQ2YlhhxWE\nJ+uqAUSLztIvbg8Cy7pgItd/XFQ1999MF2EQUf29il5e4LVJyjumu2cnmpYF\nPuZPWUIx/xmKkM2nXydEugeISO96TSpUB9fmsp1d7xnGtw3ikdW/Jv25pr+k\ncbC+L7rMstWiM9E8o699arrETPDMAzKl4CYoD/qcio0zGbc/P9NtotBWyb/2\n0vOK0dkoA9wN5nPHllTKa9WkBiE0yS4QLiaSrPt2ph8bfmf1REFed3rPCACw\nOugZidhASjDbm1xNSpFVc88aO25cYY2BwUAjZ54bnNp3PKbTdCH2Qn4xyl7c\nCwhrrPT6Wah0LrRb0Wm4J2Y0i3JgxbPGgKpMfwC5rW1TxypB4Q5v7BIuaX5y\nLacTnaDar07lAL/zuseiybpKB9rhBre/3m5PmouitPNs9Qd59omB9dCMIS36\nzzHQ\r\n=SzSC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBrvMDubIQWUS/8wsDgLhgYwv/Q4JNHwAMLFZFupXqxAIhALdymTPPsFHUij7GAOjMA9XFJKl59W4UnUubsddih2DE"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.49.0_1554411903647_0.42320015802412025"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.49.1":{"name":"@fly/fly","version":"0.49.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.49.1","@fly/core":"0.49.1","@fly/v8env":"0.49.0"},"publishConfig":{"access":"public"},"gitHead":"a76b1b595e23c5abd692569786bde17cfba7a3e7","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.49.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-YejV05lWeS/7/pEvqWTJijjW2n748CUXWOlPS7S1droMbEmcdL/OvJDsFIRBP8uu9DMPKVxrahdMxveEc+M5+g==","shasum":"8420b573b7802f6786a0f9cc39dfc009ebfbfa81","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.49.1.tgz","fileCount":5,"unpackedSize":30281,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpnfECRA9TVsSAnZWagAA53gQAJj3DsWfDrJ5+51ZgllS\nBaLpXFr2un24E2uqdLlyAPgnvT/ZTx6HPrATty/HU/tnex/DkaQcfAW6ICUW\ndaEmI5YRYLRQzmCqejdKgni0UXmReP1XDoKpgYURTEQ06UKuLs/5Izu07PWP\nVA5cJf2j2ewEpSGj6zf6wt/4AdY09kOyn+RsH2zynsz898gwGY6YLl/FrfjD\nEhxehZyplLE8rBlsajFZDGt9wEhGhbx5BlpKHYZIf1r4Pw3szHD13v+TRZll\n0TaFOTEmC4bVO4BRyAlOxTtXAsBcFNvH/Mx+TNWhjEcNOl0FqTaQZeui4bLX\nR3aQoXDvYqzLcEkcd9SiUPmJOxeFDIT7g2As67L99jBq106KxB+W477IyS72\nwklxoJVvx9Bb+CcEsRKjUMU25feMITexrZwPiROI8Dgw2l14WDlkHgbYTAQ3\nyuu1pI23jfndeporz6qPjq3sjjr24V4WPUgC6qDhVvADYQh9E5BlCVFYM/9b\nYRbNcFEvO8TTK+mXgQ9CnIDy2/QfC3EbCO4o1P2cZA1NNj8bW3IqcDuoLR0w\nYqv6s+OZHs/zC6i0d1Djiq2hLzae9ygY9tjcgIpF6/UCdR6RmkD6Thd7xPe+\nDmCrsJnum3wPTnY1VPNeAJrRgX/i9tOkZ0etEa47wtLIx/yZAaUR7QuCJLX9\n79/2\r\n=wCJg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBqwmjei3qKM7DaQeaUbukLr2zAV7/pfS82At3DmKvUNAiEAyMZTzlORwqu87RMZRrdviaapBDD3Wvb7vDAjdCEbPxA="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.49.1_1554413508061_0.9806764564243748"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.49.2":{"name":"@fly/fly","version":"0.49.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.49.2","@fly/core":"0.49.2","@fly/v8env":"0.49.0"},"publishConfig":{"access":"public"},"gitHead":"cb1b216836a6892c44d90b2c556c53a3761dea2d","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.49.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-FHxWYPhm16I3k138idgMESA0BcoQtjlTFZce0xttLcWGY/owU6kPsV0Zv5DYiFCPdA5xCDysn6RNLzIZFZaAtA==","shasum":"a729e102b573f2cb3ce0962767a6b2ad4bb9d94a","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.49.2.tgz","fileCount":5,"unpackedSize":30420,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcrPKVCRA9TVsSAnZWagAAFk8P/2d0ZNShBpxSHlV7fZju\nJX2x60nKGz8oR6b+o2EgA0Ebqu1WQBcF3CaeWSvHsYOR2xPtWHbkQy5kKMrM\nYs8Saf4SsGOWk4zbQdTviQjgt0yOgVM7e25BL83xDGh7GMVQCaVcrIjMQcC2\n2Me7TNpcXB4UCNEkVY9+JYAe6CnKQL9D3sVyZf/Tig7HnlFiZ2qC8+/LJTm8\nxlXGBOWmn+5q+7hwhXTkWq3th8PDkqEZIrDWuHropo8TW7UAS9yHf1VpLlxI\nI5z9/rLLCIyjHpmvmlli2jnJuQCAgrALd6UHs0pUUcgQW+rpth0TJUWtq/66\n1tnCKCi2Oyf1VgAUBovRX8NFYSf75Hx4w6FMqJKN0nF8zVKZbmTIIHW/eQNn\nlZqX3O0Skn7scKJS5ZR1ZC84x6b/ro4nFrCd5XoUQVomESwna0LYufG+F0sv\n3AiV2ICOzzvrdG/Chm41rcGCwvNcmXXqp9rvthX5M1DBo88/t0XmPgzLDFnA\nS3ByQyIojKd3D+UGBbxVhdYrmGZOg9Jay7z7SFfrRd6Tux1Ns3A57gov80PP\nRZuBqQ58B8l11bxtEqMRRA4ZIauOQzEYlLcxRlfZ9p2WEbSSaYGO+ZLMi86k\ncxk/YIXU0gF5YdsUuTsZMHPmw7pNC3/Hateo27rgL7MWd7sMOBJ7uoiGIA+y\nG/3g\r\n=oYZJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGhkP+ZLSjus6bjd/WKE4pK50jM2ZH5IPg0vnjq2Mp0gIhALbQuHa9oRmrubJqPqbsovneW6AFkakQFG5JQ/J77G8/"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.49.2_1554838164609_0.16655767439792002"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.50.0":{"name":"@fly/fly","version":"0.50.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.50.0","@fly/core":"0.50.0","@fly/v8env":"0.50.0"},"publishConfig":{"access":"public"},"gitHead":"df05e0606a984dbc3acdf5c062aad035586004e1","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.50.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-qUtcXR4/x6I4DCJ8mfiqrZhttGzxnns2fCHJkEEJP1zGPI5haPvMyuOFsAS6V6JwZcZWK7fGIjaHCL8lUlqyFA==","shasum":"dcf1d85b75b74242baf3faa230e3a8dd09a2541c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.50.0.tgz","fileCount":5,"unpackedSize":30558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcrgcFCRA9TVsSAnZWagAACQ4P/iFthJx2IeQ+sWFAdiPA\ntb1h+JDDSOfWzyb0ONxQK/4u+bQ4vq3xwHwVcznQG8j66DcX7nd7HzFYu3Jt\naLr3APc5eix+1dQgvRiQxIm/vBHpCvr+yNd65UqJjgxbv1L6wZBTwHgUN7Xe\n76V+0O43nyZEwZrePkHnXXOgUjpt+4KkiRWVpUA4+GVKGwfoUZcEeJyzTwDE\nWMyvFBdHXZs7wVdCIYCfAnJ1Hxey5nfNChWl6aCRfi7w7VzvgjvkzTgKDAnn\nUpisqY/0rjPuN3dz6qTOEPOjOdo5Cy7TV0/nEt8gVsKbs1UZEyvslfiQGcAj\nMAYGh5sQuPiYFwlE0PY8gDRBHPuX1Pq5CfsaZYB0TD2yT0vMK224IFDWZ594\n+y3O05spQKHNeb5+/+CRD8oW24HN/mJxqfyL1WrkfxMCH2jKU1v3JvT7lc07\nL1fE0+y1HV5DPhodeNJi52S2aSlMXI9Cz0FVIRakY3ouiGz64L+YV7fTFAVy\nWGrbWPxNbNxyOuL9qk07hk+3rLXPo1ZKA9PB437VOUJqMRUwNxAfTrLa8S7Q\nTxwUOs6+RIoG43Y4drTsj6qMDvMmNrxTTngy3IIuBzzFAElyP0ug/F+K1aqj\nQvolf74aik1mBisc3gdnX7DuUgVFChsOjf8QclBWSgoeU7S6QS4YU8ZjmgGN\nH2Us\r\n=w6Et\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDn/TXDOqG9ygMOc1LRP/KD5Nr27DRHEiiwOFvblEb39wIhAM/VXRFLTQTcyM1uCjcZoU9MIGbabkJ7ewcUsAHgLSBg"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.50.0_1554908932491_0.5240952956827309"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.50.1-pre.0":{"name":"@fly/fly","version":"0.50.1-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.50.1-pre.0","@fly/core":"0.50.1-pre.0","@fly/v8env":"0.50.1-pre.0"},"publishConfig":{"access":"public"},"gitHead":"635d607a40cac81dd9e4edccefc08a14597bb17e","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.50.1-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-sTFnUsfushItDnKRRk1ucqSg9EHnCpXcmSUZ5pyb3GREMBzfuUFCB3hjASh4gjarjmel2GzH5rciSYoa8hoFMQ==","shasum":"141ab327a8912b7b459698ed525836472f0b45a4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.50.1-pre.0.tgz","fileCount":5,"unpackedSize":30733,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcr61ZCRA9TVsSAnZWagAAP1MQAI2hPqEvIw9Gq6U7bvQQ\nF7rTEZ2pbUdewLnaNlh4ZwUX6JqT2QnuaMW1Gqdswuy2pKyYEcagR2dAtexa\ncPcFf3MJgxJxcvHoe+4TMXH4Qk343X4PKVFSjDMOjY5mrCVLH3hpZ626OXlI\nz+ZsJJRug925DnwCYcObL+zMQ2zIjYihlQ1l4fxekq1W0y6SreGlwsXt8igP\n8ClpPih1oMwoi/ij+5PNC+W16NzE36PeOLIzK71EpqmYIeURtN4+lO7Q4ZPK\nS2MFrZjI91ISfIV58O3DXvol3GsP0CnY0MD46JE/1XLL81OEbjFXR3eygMEO\n8y/zeZQ8lAYpkerlSSoZpkgmzbFAftQobPAvBE8z2Qr7Acp1EWjnBFZz2YJW\nWJg4jvu1DKiri7PvZrZnsuE3F41PxOTZqn7eT5G3vdSzLkL3jeIAbNQeJti9\n6ZvAow2J7nx17qqxhs8CW/x8EA/BuW6zlfCQM58E30XJ5g91m3ydgmwRKHsR\nnKxrKGeq+VsJz8DalOc4o9I6W5M2+t1sM4I7gOg0/qOw+6gUJFLjnOM/N0Jg\nhtcodS/ls8gkb7MVvtqf9SI+QhJ6Y84WWfMXsMTbgMnncNyG8H4xGh+8sDDa\nCd2HlqqLJHiRlcTrFVUaoMUpVCbH8sIXNP26r/iDDAO6uaufHewEvTdYpD9h\npV69\r\n=nIHy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAmkibH0415siXZhhrb0qhw3Fsja7Pv8N0QSuw1wAdINAiBpOVoSvGOesCLkvAXuP7LvpM8QHxHJDtKvDAhC4r2jew=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.50.1-pre.0_1555017048749_0.17857506076850127"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.50.2-pre.2":{"name":"@fly/fly","version":"0.50.2-pre.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.50.2-pre.2","@fly/core":"0.50.2-pre.2","@fly/v8env":"0.50.2-pre.2"},"publishConfig":{"access":"public"},"gitHead":"bb59bdab72e352d723f57e61fd205c72cdddefdb","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Usage\n\n### Installation\n\nInstall globally:\n\n```\nnpm install -g @fly/fly\n```\n\nor as a `devDependency` in your project:\n\n```\nnpm install --save-dev @fly/fly\n```\n\n#### Windows Users\n\nFollow the node-gyp instructions from here: [node-gyp](https://github.com/nodejs/node-gyp)\n\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith(function(request){\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```\nfly server\n```\n\nVisit your app:\n\n```\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses webpack to bundle your javascript\n- Assumes the presence of `index.js` and a basic webpack configuration\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/cdn/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.50.2-pre.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-XWJyW7PbzitYjSHorIb+VTPbR1BnmPPHsVeocX7q1aK2MzarnEtsd02UEd4a1lbt/7O4eoIBsjqVJn27QlYboQ==","shasum":"e0da79b00828d595e10b81e403d1937f02339179","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.50.2-pre.2.tgz","fileCount":5,"unpackedSize":31204,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcr9WECRA9TVsSAnZWagAAiqsP/jjoeVOlo0q1u/4/gSIn\nH7utAoWDa6YjMTNayuilXgbfESNQHiqluGt/1ftS2FdyhJ7E/sE1olN923b0\nlR9CSak+LojVKcTmZXMYAec7eEx0GpPJrUCddrR6PcfvGH9abR0KHPHszCFk\n2ezDocB9sACJBy1YaN4TgNB+ttJNf7c6XBoksjamMl9s1m+psaFkzfFyJ/jp\nsiQyt3oznyFXwVTKCrxOlXS+zTCkeCBb0pJp/xz+Pa5LgXMmNiqCTkm2mmdU\nRHNlS8UA8Jc3VoA9SbQ9vujO+9N4dVdZ7cFm0TWwry75ZErI0khe0ULR6z9m\nRdS7SnZbZz1oEjJB5V5uiwGiA7Y3QWsLIGiNnc7GATVbkBPM3Ac47+UiwS6N\nn88UaL7UXAwRjXuEv8883VSJh5zHrnJbBMx9MlYGa2+XSfiihMx39icZfV/b\nXJ2Iz3UAO50zz2NqLrigBrFci2NFrom/bGxnNhg6JCwsYxQk9Oz0FEadEe6+\nWBMNNua9L7a0B1R6sCWOiZfstdY8XN8S3ZVl1FwQFf7mI7RiEq08IohE9Dj1\nunXGeEoG6H5pt4pCJacMCdni+9Oh3yMS6wbUmYOT+HXJbi70LejIlOsQzjYa\nyaM/JypA/GIF+Set5kBTj6B4TA/3AlPahUtht7WTlY74U8wtrbZf5R1euby+\nMBUY\r\n=ORsP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFNPZm/t98fjMCWPMpSKnb8OnOjJYHQX63KEJl+oibuFAiEA6ekWLnCh/wHRGFYUtZ/S7ydw/6oF8nRoKEsN0diQ5TA="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.50.2-pre.2_1555027331698_0.8492916872409764"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.51.0":{"name":"@fly/fly","version":"0.51.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.51.0","@fly/core":"0.51.0","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"cf399c605b2e6385452ac32def553c81697f1ea9","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.51.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-IWzqIs+Tk9CbhYyRHAIFbQyIQ+I/mFFVJKUTPPzJPUcTH6pcvdbO2N7hfVp1/hRhVeBSKNJTJbJMzdGFTIDd7Q==","shasum":"67299245279f243bee709af798a783db304ac3d1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.51.0.tgz","fileCount":5,"unpackedSize":31324,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcsNtVCRA9TVsSAnZWagAA3VIP/ixzN/AOTTgdqUfBVxi/\nGoh1QnEihH7R3hDAVekesbFb6ziVdqcZfvqNpsIA1m4m44P+D+1CU7hjeHsR\nudOxYCUIfmoXJqWFsIn2UPatiw4boxchvOqkWNNBuaLqZkwUoL8nnXx5iIzw\nRV/YNlx0O5y1EkYLC9xdWfUtAT9wVvOcBlzuasfBvn/sV6PPot1r6sgkSoKw\nhpDfjOs6MklLFtszSeDaY5xVHyoCRGWMp2rlwd+kk/Rk0033H3RlX4BkiJm/\n9DmA7w5CHYjUg08VUL13pBMat/1UGfFAjMFyVz7UQ/nXgQ/6vnu4pPNxdbqJ\nwT4r5EQRZhciF8vaNKahZz90FOLT2YmI4n1yfx0yAzKMb38VTw9NWdPxRNlY\nJvzkTag8XP6HBOxSA2KnFuMBF0IUbV9Cp+3trlqp5VA/HgmXG7P1wSBvmIkE\n9gtSkFW28Ndj9I71a5f0NB4Ym5cwQmI8v3cEVNBQnrwo/x+o73x0WlAMJllV\nf+OYL1DE/kBr/9TPokSQ9Pi+8P7ZtGxMiD1aHaEI3Dj8MZG9KorvN9r6xdYr\nndaVtOb6CBfphR72Zz8LkkAhGd7fAg6fmEOnUuf16kRdaDoB+9qL8m00Vt9z\nUPhwkLHUcgHeoMQEjEv2aMfSuuGaEuBbEJ2mz1DJxBssIO+P1Ra/aFpxcApc\nS1Dr\r\n=BerR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqIJ1QCn1cRgIV/Hfaj1Z3/Uus0P7DpieYJX6B7dLsxwIhALIGf4aOjOGtFG84FKg08WG2zsH/tANFP7PbGYXki9tx"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.51.0_1555094357082_0.7771143586057874"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.51.1":{"name":"@fly/fly","version":"0.51.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.51.1","@fly/core":"0.51.0","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"218d485e0963b4b9cb74fab09491fdbd8c41755c","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.51.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-eiS0u7FOkcjgG3FKOJe36VVRBv9o3Yg4TxVW2Zlsow+ruxcitm12wQBFuCrGQXugSVw1TBLjhAWdJmnbBg7DEg==","shasum":"49f1f75b8a751d342405d77da5bce88982863ac4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.51.1.tgz","fileCount":5,"unpackedSize":31463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcsPPQCRA9TVsSAnZWagAAWkMQAJk3/rLL4W5USrN658IZ\nO5Dsl7SRINLmXTpgpoV+FGHhh9vooeraS9kg15YIB6XyySzxjjRzowKLcgrd\n0R6QtXe3HRsKlK49ZrNE/1/NZEg8wShiRJGE8QLYDPFd10u169AnpNckXTvE\nc11oG4lw9zfDdK8gePDrTnE27S34khMYmUgNw4E/kx2Dqk7vIpXgCoKlC729\nELQpHSAxTcfjARiHoPkOr4lIuBgT6Ueu36zuO4Poly6leavEjZXimLmUjUh6\nFi27FsEXG2oiIHKpqCZJb6CHOhE7N3dMfVCM67W8v46zmV1ZFf4YEvk2zYta\nNuHo8NYU+p7U+LcUwWPZ1GZ6Z5p7YZJsuuj3BOINpASO6CtktVq1Eofsod/R\nSG81uwCk/P8OluLAKoGTW83YQli7Twi+uVD5OE/c5oOpy54IsJ2iOWVChzdt\nAK6TQ4cd+iB8jDV8ngBOpy2SmB182C+yaBsRgGsnuA3AqeVl4gHwXGkbnRFq\nPQ69ssrkI+WzbmG+wRNqDGepM5EfZv/1V/UXLYEct5SXsv1ygJ7MQO64JS1k\nKoHlO+hXIf051k0y/SkLFpQG3jRw8b4fx4W4OHI2MeDrfSghr32PHaKOkA68\nMgKFx3RpAYkWUt/qEE2EHxCX0I38XYbkFiUnePQHwFhgVVOTcTILeoRwFJOg\nlhV3\r\n=EgtN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAv0rPp469s6VzzJar8NIrYW4l3yE+EWntq67g1/efPDAiEA6wcJ2HM/2YacT4XeVDIAxPtnmsAuI/SG073N6NowqNk="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.51.1_1555100624287_0.4429495814233877"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.51.2":{"name":"@fly/fly","version":"0.51.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.51.2","@fly/core":"0.51.2","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"be1d9f83882d40a61c3383db9a8a215e994361a8","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.51.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-hzARW1APHhIYs9+1V3wowjF1RNv5ZNJxwj8ZFrLJd9qQ+grLOPODtQmoyV4+mI2pywumJQAHeYIrGQafASBapA==","shasum":"4474e1110ad1791a37f3aac0828f6f9fadcdd9e3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.51.2.tgz","fileCount":5,"unpackedSize":32876,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcuOPiCRA9TVsSAnZWagAAYjcP/Rv16jG875SZai5MtJE0\nMY0Dt0jUmqwiZjsirn6r8m4tOeXaKj5kZ0Ecmpx4+uEY2BrgwWRQMilt8uPO\nGtLsZB3LOTl7GBuYR++3wpDXGmsJ+uptCVWWo5KWIi/3WYPOip1tlAvWAC0c\nHok7KDF68xDFw0Qyy6Vsyt0/pjEVyC9hatPJVSiOysXLZXjPVd67y8i6sy7m\nGDWH6AuR++C+Lv+5bEPdeUfXSPX/cL9e7/Z2nh32pPrt4/I0R7CrPyUAgL/K\nFnz4A6QW8/iBr70JWsQU2uMIg/54590PfQY0indti+HgYAY7YRy6TcevDczx\n1kfQAFc7ScTatNmjcu/6y66jlxx+GoA6enIEUD/GOctEmDMzoYOuW8UOnNdX\npyBhcwYHlP1Wluwi0HKy+sAY1pm5A75RT8G8RgSyXtcnISM0Csy8Goh9pc0I\nEDHwD5zNHmFgCkDAVDp+YXuCqlN5KJllhbkB4bhjjmQ9EfyTbRcnLNwhp3gf\nAK7nJvToaqLrD0/nsBwScDjuhw0otT4txCPo3MlTp8r7ineiaOETfDAc2beV\nP4XbVHQqGqaNFc4w96wP/7eCXpH4TEFr65aX3s+6wGIyQqx7GNHq7mAFb2e3\nk6xtg8/9/ZNtErzOjFoYSFIKTS9OV2NfWnda8hbJFtSB3zmhEHdOBldhWhU4\nmIHH\r\n=AqH4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHAgRUiV4aVqijjTLtGyHbBLIPIQcHABZ4ogqh/qbYyZAiB/4OXMDSh/DNgVfRAaTXArSy7lVVzgkFT71vU4P9pf7Q=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.51.2_1555620833219_0.6831125017179047"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.52.0-pre.0":{"name":"@fly/fly","version":"0.52.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.52.0-pre.0","@fly/core":"0.52.0-pre.0","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"3503cbc34e12a038749adb929568d3a6b31ef3e8","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://fly.io/cli/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.52.0-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-UXkjKjKqsqf0/WGv8llBZt59ZbWoKgfQEw14XjEWKG/CXHSxgTrw9vLaBeqIaEE2ujQ4S8bwBFN7HWY41Ybuxw==","shasum":"dd00bff80f2e001d7972480e400d98326283e52f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.52.0-pre.0.tgz","fileCount":5,"unpackedSize":33044,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcujzfCRA9TVsSAnZWagAAhw8P/0nOrttpBPr8WeFWChbT\nfBfV8bQXwYpuF2vwzT8/NLpIKgPv+DnJuuWE9xPXD6ppGGPD82tfrkclLu62\nBGKE0NdW/7dCOjm7/UPzgWR6o3bFK+Z3drF2Fbo+P0GyJ5nInVFaXImARJTe\nr9AO+ZBv2RHZjrMMQrcjCYhK6Ayv9HdRsHI5nWBvbx9djVoHsoWk0D4llnWM\nD48qcSaLRNzaYUqzwF0sQyvJiA2rgW8xbJwi7UhM8R1ss53Ezi1l3trgcTyB\nCzgkIKewv5PakYrzQP/SLT+5yfoamFOg7esrxZbhfxQcoqBJNHHlVoFD2Zmv\nTjtnNzM4uTPvQuc5MfqHo0/9N2rd+jhZRX6DOX7+sobBR9FfPBDikTOmeNFX\nwxijuGHp5EqLAsxWjpKKVl1G0b8q5J11kdYoA2WM3y9ciNqBxx+0FmsPiG7u\nj9odBQnebh97y/6nHX3lesw5XFn0x+ttXDbr1r97AIYXrfQMsp/6o2FRJn+9\nwt0WkCwvYo04IVNGTGzPG0q92mHGHllyxqSyB9aCsgDp4YufmtFlnSdmnUe2\nSj2gwN2/WKpwK2P5ENY2foClM9CD3WkOSHCPH6iXECxS7LxfTqd45WouCZIX\nTA71rBnD6YCBZGN3OpAcL+vpeDgfjuoWuPzRW1UEWRoMmKbnwHmUCuCiQTiD\nwy5X\r\n=zxmW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpQ4N7NYaDLNOgBjUb9qxb201ZMbJWeLxcnT2+JJz2FAIhALoJjD+hTDm7VSpTxo5VVFM4BexNt/Fg1S6G2hDJvCaE"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.52.0-pre.0_1555709150517_0.7709449241829935"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.52.0-pre.1":{"name":"@fly/fly","version":"0.52.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.52.0-pre.1","@fly/core":"0.52.0-pre.1","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"bfc4619718d9b6930872089c5211d7a4647f8164","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.52.0-pre.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-2wYHgKZkcoemXH/6ZwjE5X7bMdjOcdAPje2/tTVfMNxSrF2+pOFzL2BCmu0GPJ5TQZsLOazMxf/2V/+M8719Gw==","shasum":"0a7ce6d4836b43f8307fa2184cd1aae67ff71fde","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.52.0-pre.1.tgz","fileCount":5,"unpackedSize":33200,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvfQ5CRA9TVsSAnZWagAAuYwP/jATIBVb2CNQDp8CEuJT\nGD14S1Dscdkx+VHSRpTm0PAy3bSrMFvmKyIAodLwwAKE68BjcOhwWfFdnICw\npmHZnBOin/26pLEU5Z0B2FwKvCBpYdRVkAcAghQ6/y8UB+eBaJxt3nWmKDV2\n6GdbLKQmkMEYY8PiNhC6UVZKBzZpPdo8ipAD9Sq6Keg4lqKqTOSvLZNMtFFZ\npfcdnxHX7YRjAfI8pjDYUpuo3sfC2m8UoPHhhTFXWDgQZUBgGfaDkT6kaALg\nYc60z8oBOXEFp0OxM0fA53rOiHKhL0SaaKi1CCfnK3VCupuLxKnbO4CCWhLY\nZ9HoJtIfSnYcoyjUdJtzvxgTakcP/J+r2ieOMkwDO0vR/WvZ8ve0rS+0rmUy\nYEygMlYb6xWk241H/Q7BTcsELOJ8dVo45dNDjWSbDdyh0H2D0WcEB+bNSiLR\n0LJdyEVd3YFsPNJVnmhFXg7BmXMh7+A/qJ+09hzBsq+wEN3RDOGkqfL4epZe\nTzuQ+ERbgjy/m11ZvXdfy2lNVGndjo72fCnou2Jh0BI0jMNBvpLrcAjdXV76\nuq/oR6eu0H9hVPdgZGLSndTWaLx3b5AQoBYj6D1+/xIae1IOUkTn8gB/AymV\nRMqUSYAkxgdoMOgbJV0kAE1JgHOmH5MYSiFxMUf7X2rfaYiK/gTh7o18Ouz1\nK4l+\r\n=A+Fe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgfHq3evKSGWT0j/omPYoaSrC8a/cVtLCGSCls5OcKaQIgY69RkEXWTCxIt8LKx6mdVrIQXptOVfrGjvJ4oPV2cMs="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.52.0-pre.1_1555952697150_0.11146492311075051"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.52.0":{"name":"@fly/fly","version":"0.52.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.52.0","@fly/core":"0.52.0-pre.1","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"9a8291723b72d879b60d1e95f5808cddce013267","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.52.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-IMKafXucYxUAKncbAQrdBd8xxDRvogNNQ09tY0ch/aFc7N2jqD2TLzgAAO+4EH1qMcP0XBRotLThpx9PtPqhhg==","shasum":"68ec06f74aeed756893db398a82846f6ab89728e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.52.0.tgz","fileCount":5,"unpackedSize":33332,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcviEQCRA9TVsSAnZWagAA0UUP/j5yfZMTNlxp5Tj8yWDJ\nU+Eofg5oyjYQPkb9p/9+PJF9kuznmxTx9kUpFnWFBrxDdIs+Ff2CDcdRkxz9\nxGcMqpovmhQxbxj95RI6MN3yh+zZSBscHoohmkwpH2TlxgrmBzWSJ0AIAwR7\n0BCaxhQccOHmoFVJCIWQAe29nS7qqusTP6yS+M7tzWXoJbOJVGpSrvQjcP5P\njZKQxC6v3VD39hKhG9ynPETapd793HwSb5BOhPSYRUEcgzRdyDgATKFxQsWi\nS3kQztAO41eHafyWFz5g15P8xKTdpQzNbk0weYhx5RjG6bbqQgnqAgpk+4go\n0c8Titzm9pcAJ42gkNvj2IOtGHnmfZCxghzSmmMMaSnUmYXaZ/QN7nQXjLMj\nhQuyAxconfXEQukBsnwQ2ZSUpjNB9uQSPPSzN+OHqOx3NYNXiWjm5KT8ayBu\nKUkbnbcxPdN/9LEoEnd6kkOJPlCnWCpIgJt99Jyfuu+lbGcOv87prpQ/dMsx\nU79igC+7w7h8YmOG9FFyoNfXj7K4Xtdu/MfFn2WoEFo/gIRgEzMleTAO0Xln\nJC9Kpj06Xs0IMhkRQP0arsYng9BVUze/yHafr3c5PEOCo0CbsM9HSctMlOnB\nvIE+pIZuNz9CSrxeYX15FLEyol4v1KTCESfj/aqJJ34e8UfpC7m56h1onzVq\nW4w0\r\n=5oOz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFrTdKx5floTRTiWtu2s4j6SeqeBB21nGCU+H4lcHMO6AiEA56kk4ZQ3qPxZKj9Uut2scBRME4cL0ipoLzlVYcLoH+o="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.52.0_1555964175373_0.8770891820938576"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.52.1-pre.0":{"name":"@fly/fly","version":"0.52.1-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.52.1-pre.0","@fly/core":"0.52.1-pre.0","@fly/v8env":"0.51.0"},"publishConfig":{"access":"public"},"gitHead":"b48ba6f637c8498df3e6b447f825e8801a218ea5","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.52.1-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-YB7vIhs7fhAFnMtbdHOcSd/PED50lSo2VoQEMI7chaQG6mUPlZVToJMYtydbiCiPKUVvRVgGF7ftSv7AlyzZQg==","shasum":"78f5e4b89e949eda72fc4bf333e8766838240d09","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.52.1-pre.0.tgz","fileCount":5,"unpackedSize":33495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0KJ5CRA9TVsSAnZWagAATV8P/iv7dxoKKPK2kOQVpJYH\npsTULhDs94iTMoxZSJwihkO0yAdmWhmu/j9Wye0o+UHqwrgo/v7lcGm9pOe2\njAvGNk9Yh8IuMCKHTx8M/86ql6Bt2u4Mh4mUDDko5RRNwu9qD4BVeChHVf/V\nbXMWkskdIN4ugpniLDwV3UxI48XW12d/lzsk++rxHB3+N4IcLyh+nQ6w8Nui\neQnSccCiMlM29IDkcBXrKkIlEF579yx/oliUMDputfXUohW11VNIvIGmctHu\n10bmRmqAaOi6RGBTcME8vO1/eBxJpbYzXc7EFn7mEq6AhsaN6DoVsaTY1eui\nAqUG0o4Ort3k8yDajRCIVXRCOaWoMHD7QcaKpCCUD7AiKFiGnD6U7WNmttar\nI1k0rXaeTvPJ10MbZnN5TcMfdK3t7EXOEfyOcJpYGodycMLwbxl6kf1Pjmqk\nOZaCSRJrk2sv69gHMbqxkSknLsY4Xlm3b9b5EpZr075kgByQ0IxZZf/qXPOX\nCxzVIwK7kxTVoLWN1yGnE1rC9Xn/H0S8mCpOH5Q7fGOh+DGkhMcaJRbOHGpW\n9z7VnX6BNQy5sIPkTN8EYbbC8JT2/kxQwNRnslhnrFls4vp1lkYBjRh7BmZf\nOGOAFfIsIS0OIGtFL8VV9fG/e7YCFqapUt07HBibIUB8Z9pOt6WfQRhMqrze\nCtZ/\r\n=pTOp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAvpADtMyHzMJJKbFybneZlM0f2oPxpoYh7okzpGJce1AiB17TwiLNKgakBgv6rNbQGRatW0LFd9ZfHnS06TB7cluw=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.52.1-pre.0_1557176952286_0.1842168864724829"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.53.0-pre.0":{"name":"@fly/fly","version":"0.53.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.53.0-pre.0","@fly/core":"0.53.0-pre.0","@fly/v8env":"0.53.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"746df451a3517555813a4340f2678a7d757ecebc","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.53.0-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-mOIvpAIAeOJJz+8PkB5IiQcvHip9WgOss1HmvPBJ9eWzyU5mkBuxaZ6IuvYG/K+JKm2VQopXBC2RIPlegHxc9w==","shasum":"8de0ec4bd40e50af61dcd239c121ee55355d71c4","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.53.0-pre.0.tgz","fileCount":5,"unpackedSize":33657,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0ba8CRA9TVsSAnZWagAAxbEP/2ZNqrxTuXkC6FIirSVE\nh+u2oRntiKJ6RMiPOvqqEgxTtvrbPp9yGSW2yJ0kOT4uv3q2+DPO6wqXUBMJ\nBe+WbDqI1PfyReO6tFT1qhpUVaXBZStDRqJzyH3kTKnzyyuNL8stPQM4EIow\nICYmpeCISzLy87UTXuFnvhCaR5GoKJ6G1FxqULD1GLjNIE8CLwATDqx1nj5o\nRe/8GBm6sDwWIUBQZGzjrpP28/H6ygiXgT09sk/KWbq/6tvh0/eOqe60CHbu\n09zWuJJ6eRBjKYPFQpqTi+mTcM4gTe6cSPadR5nPh6JIcovLqgnuygvPMELS\nZpapegb9rUpCV4C9ytY7tXfyHAwQKTdB06+xk0CbUwJQ3U5S9AB4aX4TvDGR\np+hTLEmr3oCjop3arrd9RtbNGLjCOq2V20eabcyNmeDVKwSozTs8JMOSjHqk\nsQGAVx0BJ9yyCSqsMLhzdYVur/MT6aCHXQ8xV5SvRT98Cw3t4SkEGnHy9J4K\nrdjB8rQ5x+U55gc+EXTbJPspV1X3jciUbCG/BZSaJCNIqJknIdn4nruB9Lqb\nLffakwOGo8sNlwcDpktuNsUL+9j1VJN7QmEVjVyF0CiohI6JqgRNkpYx85Cg\ncKY1ghmaPyQEPtUCwSxsCanSZQgDKTcu0FVNis8SHvN0AKdztob5r6xJsX+z\nGUk1\r\n=4WhC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHQjihKaJDSYLsxUdVB3wIR3PfcQLkmctqhoY+jBvU/eAiEA83ZVylq5+8N0N/JCW3HKq9Ck/lpq8qx/xxSFRBfd5Os="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.53.0-pre.0_1557247676056_0.2853518520705278"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.53.0-pre.1":{"name":"@fly/fly","version":"0.53.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.53.0-pre.1","@fly/core":"0.53.0-pre.1","@fly/v8env":"0.53.0-pre.1"},"publishConfig":{"access":"public"},"gitHead":"374f768e333bfed8cb018fb83a95d3eee6199924","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.53.0-pre.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-cBAHb6rcxIezTYf+EcKiCsUpN3vAbH5U5RcbayGnyeOS02djZ9cZaYuWEJlYenStkQPdRwgCqNVGccsEQlt+DA==","shasum":"8d9b717104ec2c86c002dab44d521c62a7913d54","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.53.0-pre.1.tgz","fileCount":5,"unpackedSize":33859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1aBpCRA9TVsSAnZWagAA+LwP/2n3fmcMLrX1dLhcW7Oo\nfK7x+/MNm692mitoErryRAu0YRa8wfuBfc1OJXgZuTqOK8XyGqsTQX6fdUG1\n8P7wP6MDbcca4xDP5Nzgp0uLjGARnkI+6BvPBALFGiaWEMSsp2YLd9BfMws8\nILVhckY1qaagP4SJOLXeFoK2kIcCR7/hUaLCAMoVSzE6ye2lWB2KairEXbbv\nt9YF5iHRIXHF5L9+qMhk4QlE4BqXJ/aduvY79INE0zEiBRv9WYr+KJWkw/Vc\nzXeVDGBFMG9yqO4S/aXi1SO9LCh2C3RiB7HlwfUx9Jy+LKEvrghypGe9CHzh\n2XkVgZJlxHITdQTJz9sYXnbMEDLvJYOmYKh6nhXmETJ+W3MJco7NWUyXWwZC\nXJ+2pmt5r0ng6M84HopUKwADz1hGqalZn9w/vOKso415M8ywXDrUMX0ejwUC\n0TrhkLn88cj6RuM3tPxFwMcmG4cEjp+jqN5UbQ3tUuCQ+4ZCDnrcv73D0A8f\nK5S37XoAAM3uyCyqxPoMic3ZTx3DOffjOfChpMf/H2GZgTTm6/GqB8WlQaca\nr4FRHpbQm7hL8ZIXuzcA9kUD+ZBQcbXUVIR58XpxPoZEwigg3YdJQ5EfEYQi\nJb8IURfkUgDqURu8kqhsYcT9mQAtV0nctFYTEj1kh44UcqDIlsftPtbmTgsQ\nxETe\r\n=1qUk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEGHrg8YEiuQRiircQx09uevYdNlgQUvqE4j8070DQDFAiEAm9w/hskQQGjLnPYC2M4UjiEwMKLLo5kRC2Kvw3rBxYU="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.53.0-pre.1_1557504104686_0.912645830532353"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.53.0-pre.2":{"name":"@fly/fly","version":"0.53.0-pre.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.53.0-pre.2","@fly/core":"0.53.0-pre.2","@fly/v8env":"0.53.0-pre.1"},"publishConfig":{"access":"public"},"gitHead":"ea31d18ccc9378baa72bb34ffe3f3d0f26ca9958","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.53.0-pre.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-AenagTivEYl1Ojyj6zgmYTwearJtXtpfdjbEHQymkEvj9Z3PfB2QuqwMEBKeJvrrg9D4oTTy8C4Bq2DcF0eeAQ==","shasum":"4cdb4853b29d1b1b732cdb226a76232b00b095cd","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.53.0-pre.2.tgz","fileCount":5,"unpackedSize":34015,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1d8NCRA9TVsSAnZWagAAUq8P/3pwYZ7pW7sfFVaHSLWy\nkWxVsjLRasPd03r+8/cGwqWBJ/x5lyy2tUE1AADwujAHZ8Aox7xKYQzGavnd\n83ofoU8IXcHvKNEXMXg9tO2IFK5vw9B5X1CNTtRd5GcESb3idn5L7uX/kp8O\nixKuuzsp+rt7/2YPcSooVCjigJzWsARmgvYYNQ/7/n9hhPAT/E+cRQyikCYF\nHSDpqggAtf06Dj5oBLnrjwQrtXZUf1A6VXJJEqosx3vf5m5w+W/nDDT3i8+0\ncvjemC5CzzI4PTLd0d0mjx2VtZFe8QD5wWV/0mVtycec1yv3/tcWS5prtMeD\nPa0/EX1x1kpY0bmraU5uMKVmHj/NiTxfwUeCxB79C0ftD233W8BFd9mp6F5n\nU50+bjVAly1y5Ndicup9G/tjVZWkXJyMY++/RvUHzZ3wzDt+dylj+pY533es\n3FT+IC0FLbLNDjGbN+jg5Cd7bRfxxOW+GqNxOYJV2a+5mX/ED96/rNEeShJz\nm30DY5ebjgmiWHxSE50DeZrjww41ATAv9x1/1RPL04DCwPMjzrQ0qq/Xf7Ox\nE/A7RKahPFAvAiwTmjEBQZ7SdW3PotouN2Drp/7gRrup6ymq97aq/wEX5ltB\nMehsduVZrwwXrGRNsSGEW/awPaay8WNTvc5/5K0r+M+H4cqNNjUfRF83Z9cJ\nY5bC\r\n=M89o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAosJGryLLZiRd2e8lEnrykHDo5dHdTf/rm4F1FzL8O/AiBugmtSWzqaQKxUjKTdO0ZAcOsTGzR5LfaaIAb2EXVRvQ=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.53.0-pre.2_1557520140350_0.14329661939486216"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.53.0":{"name":"@fly/fly","version":"0.53.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.53.0","@fly/core":"0.53.0","@fly/v8env":"0.53.0"},"publishConfig":{"access":"public"},"gitHead":"3deaee6a9b16abc2176bf19c0fef682afface62e","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.53.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.13.1/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-D40KIrab9BKjNhtFaIa9ysfeJ2K6HEANV3cQQj5N8wTkelaJpb9P7BulLfnPWt8lvro5yiS6VLdIE25L2VB85Q==","shasum":"abdef1c83f2c5a23618dbbf91946b926cb85233d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.53.0.tgz","fileCount":5,"unpackedSize":34135,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3EA7CRA9TVsSAnZWagAAdgUP/A7nlhA4Kr9KS6+OyMa9\n+K2mgmXrMIYCN4vLOI/ufjoNBBGvbqvIMwf37XnEOJl5MWMwXiC7G0vJJZQF\ngZDmiJKn5/Jl4RwQja1M85l6eWu76+hGV7ZuNOb+d9cYuPO6rkmrPITr/+Rb\n8olDT7BnJz43j4PNfI7Yw83XNkmCWzBt1IysQ0oNRYWsQJtZSYPeCxivML6A\n74L9IJfLtyqCkc7eiArMRhLKQALVY7ujBEJ3k1A6Y4VTPXRS7pU8lUVqXD2r\nBf9mwWFUaHqAhP6IxNP+bUrM0XOyM9vHTM5ZvoMvJdemmyUYmQDO3aR/hfXq\n7PyWhIR1gShmxbct6lAsPdU4Koye7JX3qHtj8OKMPF8ab7l982F3vlW3aoZv\nod0Y77LBiwk4TxK9dVT5RnpNEF6cmAR5HkSgP/iPAk9FAHyKAvr/27SNZrIP\nCDf2XhKeFcrWvg+xoXOs4Z82dTVpS04vZjUPfoCi58Y6CxgxlyOkgghpGRlS\nxSBeZsHQq5mqASQiWT/YQERWA8NvcYtRCDmvYBFh5e+Oxu/6guvP5wMqNz3B\nGJnLExdjHQ8i8IcN6N/lC2ztoyDEhs1yYFr+dmlfL2bN0LW6X5WuA5h2Jfyd\nFlcrndACPyqvqUkaQR4EKpFl5BHoE3RF8frjzFdf54OmEjYzekcOcOEhW9V2\nmEUV\r\n=Svch\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEi1yeYelaRCSw3kCeB6H51zB0C24Px2Ml4y28rkUAMsAiAJABq3xfCBSMkz0+4pw7IV1pXg3Fxfc3sHFBAaDEYVXw=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.53.0_1557938234278_0.5904806428155496"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.53.1-pre.0":{"name":"@fly/fly","version":"0.53.1-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.53.1-pre.0","@fly/core":"0.53.1-pre.0","@fly/v8env":"0.53.0"},"publishConfig":{"access":"public"},"gitHead":"9d66f843b5c125eeea4044213011fab58a1bb4bf","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.53.1-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-eyGmPPN0jJaO30bm6X/uDl0acg1turh5smiBO6ifWh2f8BcSFthhGy/MvhU+gzNGuQC+gdmLPIx8CVQwxp7M6Q==","shasum":"aa6cbe40e32c6748c8bfe7d11195a30f3f7d8cad","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.53.1-pre.0.tgz","fileCount":5,"unpackedSize":34304,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3W13CRA9TVsSAnZWagAAkaQP/jXaiGYbBXWCS7hY1jwE\n0SD7VxVJAbJiz4ee+UCeoDAN0wnoQWrHQCdb57Hw+GXJnqAhdOyFO88tY3bt\nLaQpadAsXgQb2Q7t6+xThG+xEBO0RgI01sdcQtBiF+4p5EP8y2jwOCgUiOak\n5xflrpyZlnIHT9mj26YynUK0GDMvB1X1I6UCtMfJfqd4hBZW+I9yuHA2XNrz\nONusxr0x12TwznCY/gsEXFU/ABRI4V02ReYWl3egW4JuIYnwRKg4ZWxg3jRk\nQ1J3fmESUAHlYMLuuMxwwa9ucIfb7CH3VmVZrR8/6gNBAzhGCKcraKmxGjmw\n4lgSSphF6JjAvKvRSvJmi0s+pJjjpQXl1M+ZsRb6X1sioIrpoT5DP9uqYU5H\nM57CgyEGlhmyNFHN+NddCqTeRL/xo1zQVsI2ofglVJaaMVms62aWZnEEvSud\nIvRNcW86w7GZnj7g0rhYICoxewNnqvax7gOrFD2mdQcRJE8xUvaooO+JTJYH\n5Fy71ZIdsi1GyB/PPb5/qJBhFEVeZUWndE//yXT3g4i5NcmcOW00Is4twohQ\nbEQLP/xBJ0hhh9WKU2MaV3yooobPK916n7rPv/eBCl6tC7q95x7locABkNR5\ndcP2Umc+nfL/LMjvzWCD/i5n9nTquBf7iAHfQachGZJEqaunCDCFNSBsXtrc\ntIl/\r\n=p+n/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFl1nphWHlQxVx+zoENBIhvDPAlXk5qbCRDs99hN8RApAiB3WjXsp6CK/jX3+Bmc7ARu1GdqBl1d+bgID4EUV8sZ4Q=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.53.1-pre.0_1558015350658_0.11080666980584053"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.53.1":{"name":"@fly/fly","version":"0.53.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.53.1","@fly/core":"0.53.1","@fly/v8env":"0.53.0"},"publishConfig":{"access":"public"},"gitHead":"7696fa58a636e8866c405b74422c17494c3959c9","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.53.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-KCKIYZKStPjxJwbkObJM8I5e0rl8ul7NcKKNawHfHCP3jXc0+wvJbjDFE2+4Rn6kXT14zzI3gZZ2v/tBvHWauA==","shasum":"b4bd321e1be8e4b3a75d4822477317feb01dde57","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.53.1.tgz","fileCount":5,"unpackedSize":34431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3XJrCRA9TVsSAnZWagAAy9wP/joCh5caqVtlEmIDTBal\ni3oB/9X2jRx8W0VVv/Mi0R9FD4PEvxRnP+MQErxQCszQXCy5bzr6NGUNx+Sp\n/GtoMat7ry9SGMqWytN6iOuLJ6LBmwJ5fjk7tryw9kzTz+2uo8ICwFRPZw6B\nlc2b5SZhJqiN67enOGYeAlH3hTNn7ptPLCqhN5YYc4jHgf3UGtCDEBTKilcK\ncpSQcIyF3dyL1j0BDqYgm8c/cbX1nINyjNOZ3cQY5w5n8+/lxC0HvWzBrSe6\n5MQM0cArnJ+IeWP1kkGiZPIgKrAqYxuCBHX6SQly7S5c5jpk8Q5CiT5KweDy\nbeRMEO7UCKRylUHCytDE+4X41ZArDaxLLgfs4L9AAy0FL6q3pG/M5NxEpoPT\nLiPJXb4mzl/2pV2Qnh9zEYEIEJ3YjGBsJcjm19YDt9kd8q2PkrrapILI0JK3\nVlq/TklXKfBUK8WqtsqyiWuPYehvCa/vRjtM54emdAvQhG3nA2Mwc2v4fckW\nkYCiebdM/7UGmOmp8ama+dqvxwnhz2TOQwQaCAsA7siatkZY3iWjLU/69Vhy\nJb2M7oX7IpH9Dad1ocJ6PHHpIzz6fo3JCd2A7Vnzs9ezF0dmTUN7DIS6PQfC\nPnJi0mxdpqxNejhw2Q2xxTRVEXZ+2mSm/EzD24oNTjl4AXQfjip8CQ0l9XYI\nWBwC\r\n=96TZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBQkxfk8x5X/0U9wfLic+/HPkAG6Mh1tsRR58og4Vfk0AiEA4VI/LWZWyQntIoY/qjGcSxI+HPo5I/FIDnmM9Op//Oc="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.53.1_1558016618503_0.8404970021565374"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.0-pre.0":{"name":"@fly/fly","version":"0.54.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.0-pre.0","@fly/core":"0.54.0-pre.0","@fly/v8env":"0.54.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"d8eae2531c7ea646ea96038a71c6185d7c3be74a","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.0-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-tVMNBxnq1Gq3xOCSgKRj6xl4weHTqW91xg0ObSMsiS9dHS4soOfHdRFDFA4hA9nNTf/DFyJEIHZyrEP37W2Giw==","shasum":"60d635d448276251467dd9caa4cdcbfafd4f5420","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.0-pre.0.tgz","fileCount":5,"unpackedSize":34605,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3dSlCRA9TVsSAnZWagAABfIQAJkTGl7Q70jw5obj5t7p\nR8PzIHiiW93CXPNmfIWtJueYasgQCBh9vvO7hhThHno/mHWYmSQrcyZ8uWCN\naNAjsjc1DbZhPaibL4UghBnrCGH5Sw6roBkgA6Y0lZWPqYOBaw08Ss0YnJil\nC5mX6NwU16klF62HbHwVbI/GLb2iB1docfQfIBGKONjklkae0M1HDq5ady3B\nIEewQ+G0aD1RLyJAiKEUHgQ78uN5r17XzLgjwtahPIRAUrDpQlaVyOUsL6b7\nmYKYkpoRTp+1WB2rHwu6NWpPN6F1XVyN6j0dE+gPES88eJZcR9PDkSc6jAGb\n5p/iGAF/jYeSDsfXOO2baDl5ynvZeuLi7fgsUlvhTbfTMo0Afq0aOo2CzXgk\nbG9LPaUxJm9vmq061+s0mUGsyK88El4+1pfisY+oTTyv+oqQnEzwUcb4uZU3\nL8+7DmUl4WXgSEPt0l5EnNx8mnVee3MoL+CwhhsxHxfkIx8zBwKaMfAPGQwi\np/fI8W8O0cnoaMDPdb3hmUsj45/YQzEk/YtM8n+Ksvmfu9UhCYxYxXbiRfyZ\nZhnclKI8xwIQWFdDyO5xeBb4sW3kF3ymAU5E6Zuz/mrEPJqd8xBtGTR0lYm6\n8K7nc2DesLFoVQzlyqm2pGKmiCdLafcED/MdpEdUtOi9AJcO9XGV+H+BRjDH\nTgi/\r\n=o0aC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFve6uoltfMrpI3BJqdUkq0YZySJrq8dAGLMETzgipmlAiEAp1oZKkKMOmVEa0Fa5+oNbVxJJgJQuJiOizY0VzA4Az4="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.0-pre.0_1558041765133_0.7638076623424344"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.0-pre.1":{"name":"@fly/fly","version":"0.54.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.0-pre.1","@fly/core":"0.54.0-pre.0","@fly/v8env":"0.54.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"2e3556fb9cad025bf6b5e8d4f284a056422145cb","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.0-pre.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-7v/2D7o5sj0TyGugsKOKaOiF6sHSr32sFtmiYrrD55SX/qZ2butYZVaJVNXfxoSp1E4YU/KMnVryvJYZIG0sQw==","shasum":"ca918c3369fc6fdac8efeb3c9ba60d32d3fc1795","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.0-pre.1.tgz","fileCount":5,"unpackedSize":34761,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5E4uCRA9TVsSAnZWagAAXSoP+wV5oBstnEeq18gulIZ2\nzoMJYDB0KJLQ9fJZIHGUZW7pM8ygjjvZEWK5CiRQAhzelK+kbDEnpCY8+Wa5\nmzLX3CsPA5XxgqAKnYtlyBm8OdoFiKhf7l8CYUbNdYcdm1W4k2s+kItbGfds\nYW0i7DR32ftfEkSMeStQckcaqytIy81NURyO3cYBjYow400SyGZno0Rrzq8m\n+IDHxpZLjTAAjAIomhTotvjzNDt1tGcUqI2Er5ZQLGEtbR6aUAH/LCsaJT2v\nQxoABLNX6qDD9jos9Q/y0D73f4ZhoUbNm1BQtZfsYr8XhI/w6ZCpyqfdHdlI\nfdT9bszYJ9hRO1yVS48QIFdmy61LLUZGG/IxWMW3Tg5d3WWEFpR2cy/FgI6X\nQ9ezYgbcaLnNEBq9ELqA4YOigpFYLbBznbjGbc+zOh2CVm07kd7gha+Srfc0\nVskjE2a2vlRUXIux6BgcbrbFSOYQlQFElPR+akLFIKTmKoqwQaY4/tuVMDLe\n4bZqiav7BtQ1N+Icvyixt1qeJH3LOWe19c6lUmZy+45Be2hg4D8SkNYxS3ED\n+qgaVeKXRkVq6YZLWkJBusjoSTJjqpaSexzVQ+ja7MrECVdeESbuTBg+agqP\nof9jNjCTaxHUzmyXHSq6+Y2wuQ2usmCZ76dy9z7FrEi/6kY9KIVEvX0x6lZT\nhyJA\r\n=rm7R\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOcXSwZVNqSeRvSb0/XLM0axGv1nl9YqlDBDsrfNrZbAIgOKEWts/0J2GeOCqOcn8cD1lyMRdGOolKBK3kd2R9AKY="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.0-pre.1_1558466092997_0.6249918451966376"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.0":{"name":"@fly/fly","version":"0.54.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.0","@fly/core":"0.54.0","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"2b5ce15384d21b6fffe1d76f6ff5408651c9510d","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-jNEnaMmmIjJQEJYoaKAOq8hvsTWLIXuuhL9qL0ePfRtXpWPj/P7VTuKQ/PCqSEP3a00wANyINN7Hw73ArC6d/g==","shasum":"c775b251ce3ecff0562872b319e148e63704c00c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.0.tgz","fileCount":5,"unpackedSize":34881,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5FYsCRA9TVsSAnZWagAAq7MQAI9zcDuwIUdjj0Ru4cDp\nk66IHvYHQs2+oB+xKcTvMm41S5C++rijvIRgFGNOIwBgmTjaw7eRpJxrBgAh\nYibJbkY1XZJV4bNBl4/mvc5FY4DJ6APBo1/Mmx+8s07NeNp7iIVBUb+OSpSe\nebbw4tymDkwgS8QJfpPrjbpythUx/FGuD074mGsvg/O6fEvWEDnWjW5fWPQK\n29y8JIbNEkomMULAXz2nFQx9wVGu7yrnx/QIr0P3NhUFXGFqGlFY67IiLY6K\njEvCdmHGFcJBzEXKF91iPeL4Y0vclfa7HvOIRFSEXYtufJnyokvGgnm/nfl5\nZy5N448lsJKLeGPFy5ZxNxhW22n8829ySIarYB72eUWxDIulhg4mGWWZXKaE\nzHm1UrdBaIjUrXQ7GMQVshocgOdHNU8PqM1tlKegpLWC1ra8tKn4dLyZqTDn\nlWvfubi0wSV0bJ8CZbmN2uH8e2iaOfuM671PCeSVGHnpJRlvZ4w2S5FvVDCe\nQiMKmdpWwK2a56DKh+ntVf+pMaRPcAjM63ivaezz1XohrXNDEAZrIV5opoet\n7AmQWV2mlp+c5B6p3qNnonD3Ly5sWcMWg6+BzFy8L7pUKPM+qLlLKWreQX9c\nHpPEj1maiCTL7n//puMadg4CehcGKGefbWUfp3jCzYdWYrZjEYylGqKdj2jz\n3+RL\r\n=MqZP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQChbHJoo5eYFuBJ8YnOwKGwg6rGfBV7B/Zc3+h3ORhAQgIhAPtm2qDB74s31e/IzzTvgFUtnGxxKkG9eg1OdTySjHmX"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.0_1558468139359_0.4174298606945226"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.1-api-v2.0":{"name":"@fly/fly","version":"0.54.1-api-v2.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.1-api-v2.0","@fly/core":"0.54.0","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"c129683d9783beed81e59cf5bc872a1df9bb6645","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.1-api-v2.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-rFkkgigO77W5OTmHGSBXfvblTTBKUm3oipaz+GHrlbD2QKpHtgAq4ewx2+KH6PBFSf6uLLfqTp3sD868YVlivQ==","shasum":"78c516efd828bba53f0560e7647aad4cdc0787f0","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.1-api-v2.0.tgz","fileCount":5,"unpackedSize":35056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdE/AOCRA9TVsSAnZWagAAudMP/j93GzU/CWaUtqbnlo4M\nnPhysBkKd8FkDAJEW1v2qhgBHHx9rJNnkV6qcObcg3a5hc24EtWGn8LncYWk\nS9812VlJssXnXXRXqo2hOI2cqDYiHtDCbv/3jk/VvngLs5ypBfDUjERw8Shs\nXGRO5Q7yj6SFC/THyYVGTR45Pq8OAggBtL42YJ/TwvRD6htHI/UDNNCgI1x2\nEN6MAqvdlgn1rX6GqnKTW1xIuy6XoZuFgozR+8R//SXEySoaqIal04WjgYb5\n+CaFl1WOnLb60SPjHR8xXZ1pgAVmybNe5l9lzJexvmSbwM9FxmajsSESMN/T\nZ4IcER1HAyS8xtZpdYl5kZfpdSCpBHppTREc53Jinj+0CAwSjdKodKxMH2Nl\nl4H3lmGdVcxe26fR7XK10U0PtFkfVVT9m8sDadGw3HzrpdxCFd0wSKD7HbjV\ni03BzscFmG/JPl4OvZnCEeT2PT4mvOf0j/6bE7fTwycjTjsT5RIoDnZNpGCS\nefzpIAhRaUi0+Nay8M9u1FWZCm5Zt9/BW5jgQHW6jExzXpmFYX7gMkOG2+GX\nti7MMJzP0OyjnoOkjyoli81lDQnH1a5gDLEm2DtwCcIgCh3c9l+0BiXTDk6w\nB5OpB4WrCScfE2jFEy0VaGdFeZHkh7Mpf9CpCl85vXt9gkWsZhaozpJHH/vs\nbDMX\r\n=EMcS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEpTqXxMUt0STloOBrdvCEPlsCcDNgN05sl4sdbonj7wIhAIBTmMbCvnHAGY89ww9pORwXo5kuseTUrmyQH6w/T+1X"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.1-api-v2.0_1561587726171_0.2691813480909584"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.1-pre.0":{"name":"@fly/fly","version":"0.54.1-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.1-pre.0","@fly/core":"0.54.1-pre.0","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"545d0072a9dc5a23a150f4097f76388288397967","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\n![edge ascci](https://fly.io/articles/content/images/2018/08/edge-ascii@2x.png)\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.1-pre.0","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-aqfA97SaQuBqGCz4EggcncOqgrrtVDvyYVHSyTtlnKo4o7bbdHFvOVnCjvu9sNKWwiyK597X8WRiBWuDyTOx2g==","shasum":"330aa7f8df21f2e58c13dfac1546509299052f32","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.1-pre.0.tgz","fileCount":5,"unpackedSize":35216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNkkHCRA9TVsSAnZWagAAlYYP/3xXiRuGRTrhYwxY74ZY\nk5rMv+kShd6ZIVQ02Kn2VWRctPMRr261TB1lkWEYFWiYW1naxLvw9M+cTOZQ\n4MOODikP4Gm1vSIEzLgRZk45bfZoDOQ9xLp5BoPx6ReDF28UGVTuSuz9di2L\nF8JdZiYWGLKtjAhTg3LVDd/7EEsgmA9ig4kq9BVYTLHZvUDLMSh+mKD+vgR0\npC3Wcac6ej7cz1rxua/OEUHg7em2QTogmkMbWgi0pTHPcS243lEGdTWpcn6z\nBKr9ljkGYyu9dy7xz/eeSgQ0nfm4CpA4Ax7j0GK/KpOJgdcwSTcmcYcqhp6k\nElpMDBPy6A4saiidCRT0qkDVyQX1woE5fUgcMyQKmlukXtMMxDEYi2+Q72/D\nSaq48OP+dbOsw6tkdFqLjIIoaxohDhhivXe/2vCrWxaX99qoN0AKU60KBWjQ\nPHZAJqOkofZJuSoNeC1N0ywMMFtINdNAoz8CKBtUaR/CzfkhIfSh0tK3/Ko4\nbMYawyZ0v/qiZxaxs3xFrZ4OaoQcEN4o0y0wnwH6PoZxRVyYWbfblmWcV7P5\nizg9PJMTetoE2DmpEd7bhDxiwuOs5aJsGKvcBZinTd0nn/SqNH+tUrNK+Uje\nT16uOyc5a2UKRZJGxW/zuUhEsxwq5EjOdU6vw+sCnS8tD3aguTCEQKzQgshy\nJMUN\r\n=xZaP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC40vmA6TFVsAYxah3d84HKs/0oyUPwiN9nJ8QGqrGy6wIgfYZftk/XQGywStChcm9po5hD7EuHFZaJQXecZ/mEFR4="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.1-pre.0_1563838726514_0.9112502821370392"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.1":{"name":"@fly/fly","version":"0.54.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.1","@fly/core":"0.54.1","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"b38f13c26b39241beb95ba099e13c8be66f96db9","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.1","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-f02QLPGLYS9oivnZHqIk7RqURiWwh2MlwdC/kgxpb7rXOLsE7soh0HR2J743lfvpo+ieEllLMa9RvRwq8TkTow==","shasum":"cd05676369ae629e7d7162da7ae8d9a0f978357c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.1.tgz","fileCount":5,"unpackedSize":35343,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOcd/CRA9TVsSAnZWagAAJfAQAJZN7VKUAnsWVpKLb/a6\n8WuZtSDTkxqkB/DgFTpt6bRN0odwPQvKdco7Tus4ylUe48WfySWBl+I1KISj\nugxMNHRvG/UtrIkuV/xn8cMj5tnkJO7b8anzUrvUm9UmLGc/PyibzGm/aGeu\n8/H8Z3IDZ9uL4Ya04rAnwt4/qeVd+Ld0dNpFJGgKIi7koAEFFId7p6G7lHoK\n5djOEIL75zQh39Ptc6X2alQtCBoxzaqumJQa/wTfb9UiozszWmI2ddkRu0T6\nGphWh7QZq4vv+m4ZWYIJjqyDbpyGj9NysB/kxSsa+vtP7YRNSJ7pbp4fKAXi\nBLEwk914JEDu/WGZwEcMTgYJgxYN+8LpXDUQcjq6ENylI5SswasLk22lBsPS\nzE4LRA/92CCQI4/Scrab6DEp3nKFN0Lye65I2Z1e1NAEJmF68mHarjFQlr2R\nT0POS7qTScOdEe+b/1jCu29bIvyX7onrNFTxAoJirEyTMq7Eq74YUVtS8LBs\nJ7iluUTbdFXolglzCQmHrfr2J3r/C/3B7tBVOxtexeSKWaWg4Yt7Zqnq957y\nir5MMyNDUClv+iPb1ucUWiAuL+FHAcHKjk91CdNj085VHSF4qDndjVZA7zQn\nvA7Rxh9G1f2E/PSP+vhCIIpRD8nSfvZBryWxL69VVCfz0c1PQ59tCfe42nH+\ntn+i\r\n=GgpX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFv4AYq9IfPuFmlIeALL+SJFWsfzhrgQZnV8GtMVK2ytAiEAuaW45FmCf9VTbNSSWsfZIgj9vWb4HZ01jsAwIQEGukc="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.1_1564067710680_0.6556745136359556"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.2":{"name":"@fly/fly","version":"0.54.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.2","@fly/core":"0.54.1","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"4b54ddfe66165fc01554e286d45a503d5cb43efd","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.2","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-hqmBePqDJL6+I1PcTw+MsQLzd9OJ8QfE53GwMb6T8z7lBg8367dRPs2UXNh/1MyHuMTRrSyTiC8NKoA/+8gpUQ==","shasum":"b56747d24525406168d83fdc5716430aef9efe76","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.2.tgz","fileCount":5,"unpackedSize":35482,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOcebCRA9TVsSAnZWagAA6F4P/1BpaTId1+1nOTeAFSIR\nq3VVLJnH9RAXvPbE/rkQMqym/sX8mxEnFdkYouEk7YCSfjKtWcqKQh8aviAd\nZQAv19CTG9O/2X4+sk9QrZJA4VeQxGmeXPX47URBrE7moa5PWSpVdk5t/YxV\nLOTwLDtzlAzXSR6s7fqeP7uSLC9o2dkeRk/OF3i6Mruu88LypxMsUOa1iVXw\nh6u2mPKRBNwAloVLmm2D1o+A/V+0wYgbQjF4O9Yb/4QjjsKED3ysEyvOMQKT\njLr4YCH1VNrJnig5DD3AfmCWlvk7jPeCZND4/p+yO4Uo61Nrn/uTveckjTzc\nkK4rRGFlcyr/7P6DiKrrT5oHIcM6i41pw2HyYkUMqxGRat4UX2DJPqUpZo6w\nIGQHBfr541x+O6+ZO73NfU8XfU5OeHHwDpxAvY+3JMsG91wZ27NL2uZ+MJDW\nt2qraTMnuTH56kNM+rn8QNrNtCoiiago5zggeMlUeyQH4Ss48pEwhhBGGVv9\nzXr8wt5C/WYZueHL1ZJAgK8Q+lZ5yWgb68SZGIxPSTGzy1DRj0XehaSMb+Ap\nJy/jXv4OcW1zsPEFkKCmsEqSfGWMkuBqS8VQQn3pIaIS4dwu2tTEadOFe96S\nc222vZXGylqmeeTlexzpIaqcqUgfg4Wi6Dw3xGawgHQjajL4sEZTMM3agDIk\nJw0z\r\n=FGaX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIECeWN7aCVawnm37aQljR+5xOwZJMa8x58rs8u77ruHEAiEApOVMG44qG00iCRUdyhuTiOmKQ/97/2U3XQjrWP80FvY="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.2_1564067739172_0.5811254122742593"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.3":{"name":"@fly/fly","version":"0.54.3","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.3","@fly/core":"0.54.1","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"ebda1e0b93e1d84e2289074363133aef1bc51071","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.3","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-bm8rTQmvaChPh/NoogiPZv8XHkakaFG0L1udbCvpPolSpHve9RZN1Z6Hjt1QlO9NFs86CvAOvRTmO5GvCXbWzQ==","shasum":"980eaf35f315a6b1fc031ee73adc62f03d92207c","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.3.tgz","fileCount":5,"unpackedSize":35540,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkhh+CRA9TVsSAnZWagAAQOYQAJVunjx1eDvqCY/MyVBJ\nASRnNXvGx6HKecdKB7d862wunEJY4wKrYmEcYO3KyXeHA2Kd5s0pv4ribIMu\nOgxqxLJAtYJ2dt507Vdm4PCnqdd+y2fCNyIc43CTb/Ncfz/DQT8aXGmIZEW6\nu0LkCSpm0IhsUZDrhnT9Vg0XFnY3cVM3BHGFnZu5ZIzhltTcNZgxAsPUb88p\nrlWa13N9/f1nbpocZAE9xc0tl+e665C0LkOrv+AxZnPEXhdYQQ+ZOiKGoi+N\nD94rHspRq9XsSbTP+PEMJDBBX3SX2FeRIWFc6UKSoLQTougqJjyJWauB3MES\nNeiycrsM0W4rxjfwQs3zC2U+lhMn/TuGyVp73hTSwj+HuOb4XpY8MNHAJyfm\nnT+9jz0CQ/dZkZogayGq2c2nu2A1ZcVhGsGiZi8wuPy0sSXO6b0SygyMIuO8\nVp89zg7gg7+rqpOUEv7x62Kk3rbaz3hBSc9LPjt4rTGv9Uq58WnWgkEfHFhc\nU8Io/CF/4CyAtmwuMQ3sbnxke17YM9RkmYssGyZpD/iaW+ysWGuelt2r+GcL\njxqUQbbqnpZMlwyr0qnpWE2/1zNK9gqk473z593frvaes0flcvwHGJ67+Qmr\nUHb/otl7efOzAY1WVbe0mJDyEcP9sw+6dfri+TmIw4XBdEhjmzccMkwZPPzd\n7+/J\r\n=HPYU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8ZtKaGItL1DG0QzZnppBHSrc5ci48C46WES9Q3ltjFQIgPzj3kjEcf7riHb7IWG1t7ccvWq0B4dFQp/uQtqkZfSQ="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.3_1569855613379_0.6418240985194048"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.4":{"name":"@fly/fly","version":"0.54.4","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.4","@fly/core":"0.54.1","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"39c4ef2e963c57c72334c22a0c4a5a09ed0d0213","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.4","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-QuF9uNB071ep0UeiJL6af+ULH7IeD1BpMahKiTvEt091fRIZSF2zEzMzdRlZHeh2Gwao61bwHZRP9RmNjpktbA==","shasum":"0a73a75bcaf2b0574e5f3f7812d6cd6f16f7d975","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.4.tgz","fileCount":5,"unpackedSize":35679,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpgP4CRA9TVsSAnZWagAAmjkQAKB/y3CQ+ROUipEyLqzW\n0PLnOY3zVygqaaXxsPgYug5dy/xFlHXRWuIPPZFYucoAXul2HqmfLCNPJnh7\nboYU27IIiQRPOdvQKYD6WSqEQnVNWf1hTpnmyUAPQCxMy2eFsuxv27v5KytB\n2PXnm8k5srVMD1NM3xu/++cw+IhS8gGvd2oBKVNJVzfyehrYjG3C9/U0Wt3d\nBoGykQ5lFEwN+jeENnovYu8jXqKZ2E8JbdSVFFP0UhB+dsIUMY/9JgZi7yZd\n0gmMTPJXppltFowxEi3gTIhQzB5lAbwBeV27T2rgrL4cQm53m6AeFKpU4eFy\nhWFSzAEV6UCgosqueeDTZPiLpCwpTp87aIuYnyt5zfjm8fnef8+PHx+o9JsK\nC8Ba/qH8yrcKPzzAlFdByS1cqbODsG7wojIT9fFIlJ3fKS8cHS8xFKo0HH0I\nHQYQ8lwX3hEDFGY+qojAEtYBlbmDsa3z6HG+Q3Y475jiNC6Fpj82pSaaFYSe\n2MTb1hUjBVz63XnhNsga+qwg9f/m7LRqnYjm3sdw0BADLeZhlrwlpTbKHsMk\n6sIiCzlUKUxWXqjP9p5Lz/E/8u2avQF+JH7TenpKeOcgIoeU/PKlCcrc2Qca\nqC4heCHftitWQ3l+GpBXufwd6RHfgLF9nuuwFqvFA+lCZLwXZdiWGr91nJss\niPD4\r\n=2q86\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDmLQC9R2gfaVE05VujrAPDsqYvQCHqZGTbwNgM+X7ikAiArSR79RnJmpVOj4TDJlhhYgMJmUQj+S2Sq4eCclKs/bA=="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.4_1571161079885_0.7387368057424166"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.54.5":{"name":"@fly/fly","version":"0.54.5","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.54.5","@fly/core":"0.54.1","@fly/v8env":"0.54.0"},"publishConfig":{"access":"public"},"gitHead":"0b315f060cc2e1212a3283bfac2967273182b9ce","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.54.5","_nodeVersion":"11.10.1","_npmVersion":"lerna/3.14.0/node@v11.10.1+x64 (linux)","dist":{"integrity":"sha512-K/LZmDgealRcEKCH3agJgJeP7ggVDYzYK3vteBSkEKMYMiFZDFCKcRE+18eqxgV/0eVHkuFN/bt2Bru1BNBfzw==","shasum":"c8de1f456921e313d72d722f2eb4c5ecb50da57d","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.54.5.tgz","fileCount":5,"unpackedSize":35818,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdzCEqCRA9TVsSAnZWagAAui0P/18OrJA8TNmfcToLCg14\ns8DiL/gnfJpr6MysdyhxMey/N0vs619KmGib25DWfJag1cp7dhW60MhIjj+Q\nBhvX9TsaTR9Kpaw6CT1tM9V2F17hxhLue+groxUXyuXTeA3J/mUIsflu9mR+\nSLwjLXRU+Ji3nk/IzUzWj4zDli9eB62acDsCWaAkz1KVr+i05Pr6VzlVTj5g\nUQki7PV7vE0kOSNaatseOXiVDNDaDApPPwVqaQvDnqSdC00ZDiIRLxB8+RUX\nMMjdaD1+lF2ZW/kw/fP4ocVJ5gr95sAJihq0SRP1MlJTJu2fv+jirUfcPAi6\nHOXtLEWqp/EJAe8aIosj+BqGT+H3CsItGvQFB7q9KuRknE2k80BzcYhWRbkG\nncBxkbTbtOIJiKyh24dRcmJ6zCpFDjIrPv6M/tfQbiA1poxKTkV7xtCPJITF\nbi4je8ULMqOOuYDx5/6znott5bSr1GY9wO5HfLvpxbySa6qNjHX+weu/8cNm\ngn7QrwScyM8FFz4pxVKkifFwOaUfJzQPizyoCY3oLrTkS2ioF5Fv2NhywKS/\n4zwse83z/vzBl6BH4MooiKqdNQpoyxRJr+fz5IkSJy9j01/jYIiu29jwJ7rP\nfZcy+1Vf71TNeiT+OAj4isv1TkoJwQ3/SxhGMdZJ1zbMeN6oNpPCn4DbRNOO\n9SgJ\r\n=GN0W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpNpLKjNDG6XdD69Xed8BW9Ed+6hB4QwWqeoCrZ4yA0QIhAJb4lPuDddUvm6d4D0RnIdBRMNNjExOTOgm9sY0UyI0F"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.54.5_1573658922517_0.4315246314330583"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.0-pre.0":{"name":"@fly/fly","version":"0.55.0-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.0-pre.0","@fly/core":"0.55.0-pre.0","@fly/v8env":"0.55.0-pre.0"},"publishConfig":{"access":"public"},"gitHead":"0305764cd006380525938a1d9d96a0aaf125abeb","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.0-pre.0","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.19.0/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-TUV5rra6BmKwACc1n587NV01yCATJ/i6md9oGzE5oVslH+KZRcoRtuzQx4Gq7uBLiE2shioaGTF34OVVgifw7A==","shasum":"b69a59093b4d0ca65c0497974f427998c56590c1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.0-pre.0.tgz","fileCount":5,"unpackedSize":35992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1vn1CRA9TVsSAnZWagAAMqQP/AvLfNw+aOWkc+DUqjqY\nl5om5/N/f+WjBgEp4oGUrWNQrxyh2ivR5x9a1rciOwO0/w2kkmb7/ILVL/q/\nnvUHUyfrqxeZpYRv5LW/rhdhg53QfKMk60rqjQuBMSPccryUJ4s43+9+NQ+z\nT5zBN0Kj7ZFEAmRVl6tDEUUSkye5QoGwCXXrfgYdaNv4GYnOngNSFy7p5Mtl\ngwpyQYFgrD0syj90MvnW2NUO1XKgiavtE3nZASEOIefHje8CB3V9Hg3NoRXd\n/Nf1d2F6RNbuwclhazvA4f9xfvvyPxZPFcCaS73ow6o6/DEwXlB+xlGb1wZk\nugoQyzx7s2Day1qA3zepD86tb65+XJuJRqyFKiKWWjCX/17JkOK365Uez36a\nLZrioL6PO0pODfQhQKkIE6ucoZ1/eQWguvvCnxFUbkC4zq6rOZCIcY3KWPS0\ndJlp64mEE4QxWE/y9yDvTx0O6X90w3Qm99hEhFEFyFtCEUmgIMntLksTDPrq\nCLjyyK6VL6/NUhvP6Js/2BBMNzlmhH+kQ8qYfh7Vw0AYASILh6F4pJ0ErNeG\nyNHI0q9tV3pj87ApFXP6Gr6w9Asofd/Z12BPlH0Jrc0+AVpkHHpx4OKpYppu\nTeOH7Q5NSQ5qR9jZ3QnM5D8qJKOtn2/rFmCHoBYFyhRVzonIR07tVLaJyo3o\nOhI7\r\n=Dfim\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwlZQCKWBURb+I9DyQeOqRPewJzxFybi0oI6sHhiqe+gIgMG9oRET+PMYq5aqQf10Z6EI8ldrRVGPWwDBItBf7kg4="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.0-pre.0_1574369781422_0.7069704134246582"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.0-pre.1":{"name":"@fly/fly","version":"0.55.0-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.0-pre.1","@fly/core":"0.55.0-pre.1","@fly/v8env":"0.55.0-pre.1"},"publishConfig":{"access":"public"},"gitHead":"bd1bda541d11253460bfa182c0755f0c0c8df265","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatibility, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.0-pre.1","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.19.0/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-nquBVe6V5C0B97v9f8IIrYO2NPF69yBlqs+uPhuvdrT6G4JtyYnbj9uDBHWn75hRm6eTXNE0RbqOb41GhndDTg==","shasum":"f5288b63378af98f8ec071231670c9a467faa274","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.0-pre.1.tgz","fileCount":5,"unpackedSize":36148,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeQY7XCRA9TVsSAnZWagAAddgP/ioCemc88TuixhoMc6Uf\nDxt2lW6fQdxS05zgnQqu8Fd1xQ3oOb+rxGNkTGph1FUo8kRkTJQlM43HRLfJ\n1c+T00s5O5tsuDWwg7QQnk8Q1chPf3lTPbpREIJPH8zsPpFwVwIXvdLLmcnG\nfWdS9C7oygwFArGwGyP9bbXXhEO1JQAGfwZ3GApRovJYGC46giwl/mR778D7\npaiq5G5InRYh273LNC2waNPaq8NIDSTamTEKYYWFC9xJhhj+LNjGiDhdDJGV\nPzvpjIGuFGb5SfpT7aKc01ejA7bVqA3e2l+UpXYKOVp+7U6hsI9RUzkl4C/8\ny/G05ZOtjf0klRSDEQefcL4U6JlApnfHUZTMctcv7N8ggJkaoiugPgqv5T4e\n7vYzVDRobgPTm/yJrqYO/aDCnR7G/oZdihUGyp5NGnVRIfRxJ7OOjpBorKDR\nC6VGiYWYIooWSo2DEdajo1rPFELFDVwrEVeQAD+gQ6A1fVTDM77MhPGRTZAM\nwuknW2XFxeW5Vmk0sURRStW1Lm7XUhY2taIk3l+qOuQtc9HvboNZvJuC6SeQ\nFDVsfMnIayeqasEGRsIt16iEHF7q7CBu0zL/IDtUUHQKMYCLe6q3qPPuY4Sd\nSxkHstAVdufnphl5YFzmRIyhOnVgWmeGkMiLw2V1vm3jrxm6XNFxWv1OhEqR\nGv0A\r\n=vEgp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHF3jkiE1QhH4HPkACt+m1X1QPMx22/zGcqNaIOzTii1AiEA8ihNBVl44IpU4HZVJnL14KPhH6YqbPE962MYfw9AoPk="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.0-pre.1_1581354711290_0.47723590738600086"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.0":{"name":"@fly/fly","version":"0.55.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.0","@fly/core":"0.55.0","@fly/v8env":"0.55.0"},"publishConfig":{"access":"public"},"gitHead":"eee177dc17d945e37af803ed0787081ba53f3627","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.0","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.19.0/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-/lQcY/9C8fKBgJfxIbclYMjRDHy8TxB9svlqTCXvAhtsAkWGddliT1r8ZsSOOJz2VQa8VrCC+cWbLa0o/reSKw==","shasum":"4ecf75f9dc3cf1c458ca8c2ce76b8901a19efe22","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.0.tgz","fileCount":5,"unpackedSize":36265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeliMNCRA9TVsSAnZWagAA9i0QAKLpadMaWVa/SuU+ariJ\nxmxuf+fGskim0yAWdUZG1Uz4VMOgWR6DpK//c6na9bwDhN8/m2CaSTZG/nAh\n1HkEk2N5oLZBLyv7Q0c4F+ssSSr1EXq26iOFeqOrjeYtPQB/xa98FDG0F6PE\nk27Q1ThIeGx7q1DYzyT8hxc4obfrw44yuc3fVJpWshbFlE/IrFKECGRHM+hX\nbGsBg2Sn27QRiaTGe7BD95lKcTD/qiNfCs5kWk5mR1ZvmvTwpA/FwJmS56lr\nzsuN5PwFqGDkUtmjc6YlfkFBtAAP9osM8ntKcCFn4VaDLodk/qr9RUCy3g+E\nV6uW9JiWslQs/Y4N5BO/lZ6k37PT1paTOGQgSamc1Cbxg94NKS3hd1G0xvWk\n8cit7CO4ol/zLhjEaxrK16LKdZr3M9CmRWLnEsMRymgMdc0W6POwfKtvq+jO\nknUvlrf3oHnIwjA5Q04vM2Q2z2FnCRD8vS69g2BygsT7L2Id84ICTY2I+Lay\nMn751inomWykGIR/4UbaM2XIviFt7Wu9VcVkI0ieibS04apm1sLZz9j2TgM6\nuPkgn+lJNSIBTzCK30yCahjxYhoSFU61ubX5MWHcDSF+d+TIM3sWgxZg5iE2\n4ZbEZU2ki+EAtybt4PG5mGBAFlQH+sRLO/y2T4G1Hs4ooYrfHFHYZ6kiGwe0\nXZeA\r\n=L30s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLgtc6Dh64QINFKWkXLhpKblCJA3gilyJA9PLKCBP5vwIgUsB0GQs/4mr5ZfvlS9O6tivMfhAj4zjELgApwkdGObg="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.0_1586897676801_0.7786166840457285"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.1":{"name":"@fly/fly","version":"0.55.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.1","@fly/core":"0.55.0","@fly/v8env":"0.55.0"},"publishConfig":{"access":"public"},"gitHead":"55cc3decd648c718ff3aa439f3172ef86cb6914f","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.1","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.19.0/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-Ruvg+yj0Gni4bOH+9ntpCGHMdU6W9vB44Uv6pcWuGxiwjU3C+8nb0EwWV2L6SrtL+gzPInGUR+E9dZM8tBfpGw==","shasum":"9903018c90fc4a5bbcb5c2bf7b85305bfeadbe4f","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.1.tgz","fileCount":5,"unpackedSize":36404,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJel0xICRA9TVsSAnZWagAAWqoP/3QqzWxhAHg4TxvnzmTT\nmYwp5gvqs/kXz4XMHg1zse1TpUoTpPQzdADDcZ873SX6YcTy+9sO4XREoRXz\nk2ocbiHjobxYDDNuGIpoIJNZxQtcSfJvqTDPagjql1dE3jf7v5jl79leJ7fx\nkmvLZ7DhlpuurH1PvRHxj+I28z6IQ0XesB5AnOKr2Z8TRXPHxmOTZRxXYpK7\n6yWE56mi3T9TXaFRzFUXzKPSwjTeFXKbz1E+c91DQUWnUzR+BnIHIrDhvBhL\nfGRs/QYPpXS1ulK4NrUk6U1p02eSDowHgsFTzo6lT4rtok5l4x103r3XDDa9\nD9mZ3oAt0dCV1KWXPnU8imQHA8qlGeoAeyjx/KqcI6Q7NwqpA1BwDeAk+h6C\nYh6o3O6ZNl36jhS70lyx1fMTmIP0CXzyfy7bc7qUnrhlzpKvp2AC+9UNFnom\nYSiiuCEz3YJdDil08jdXVc+drXlfih/LSzOtkCGIYRWlMGB4y+HcVXAW6j7Q\nJWnS6X9aGREF0Q0KksCMw42tLVTzjBbkVV/+/n84ox8v3mbfX8LLiVxVwACQ\nUEfz78z83BrLQAU33dKbAuVGPqQG2d9y6c2KpdI8KkFLRPyc/JS6dDEN+wTe\nSWJNpgugK83xn5ASzUOMEcjzNU/95Sta55s1PEOB3XcjpsAzn0q32ARPUIGt\n5nQP\r\n=lKRV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBvtLzjCfatrGc8Rs1o2zr+SrEW+oCA8BaGM9v6uY5cAIhAISCn5sTa8hszVskDlfOIsoq34tn10wdmIfOS7E7Utda"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.1_1586973768399_0.665366432198305"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.2":{"name":"@fly/fly","version":"0.55.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"./bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.2","@fly/core":"0.55.2","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"512271fde9bd89865479de302bf604bd831881ce","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.2","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.19.0/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-oPdVcHupLpQBSnYFNWBAXnDXPKu76K384QOM3n5pHB2CvmVZatf4DcaAvVcZ9siCYL1DypX6jw6yMtwTIwZygg==","shasum":"0dd14faa71f18ce3e248175983c43f3e937582af","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.2.tgz","fileCount":5,"unpackedSize":36543,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJel2ldCRA9TVsSAnZWagAAYqcQAKMu+yy5ujlzrkTZlK4K\ntOCWd0XkTVqAGtGjuZ4EuQEwwLPKl33j6enhhXk8x+K1EEt8WDGrVW/axQBR\nluJDecrXB+3/hvm9OgGUuymv9T27xodULz0fB5xm/MHKupSCFHrTeetawS5W\nwMdzP9B9T3CYJwr+GT/t1WgIXvEbGEQu1iDjNKxOnbia9kA28BMd3m1wzDPx\nc+ZtT7DJoqUoQVZSuhkN63qO+0h0LOJ3Sdu7TQgczMKNx994PgzXnAV6OTr8\nw8+YhUdsONAFcoJSVtPkfqdaPAH4ptSDVsbDuX7YiIKEE7Re6SdGSQfyTuH4\nCBlI28+kWAMFcds4pyyQo8AV5noSi65gkNI1GJIvSvhTK/h5xHZ7CROkMv1/\ngbeSgOov6Xl3uAs8WfG1v1bX6P+s6DcPXsp6vHz44Yn9gqlcznkL26dLGETq\nbHmV9oKUaP4cmxpRJCX5nMyUt6FkldY06y0Dlewsu7U/3itz8LnZWYhtbKDe\nDG+ks8vP4SVnklHgDMOP1VP8IULQKrq+jbjmRVZaekS0+8VdLx+ymf1c0aUD\n4LEvu5FD4s4BLXLUgLfY7d9VrQfhxCIoQlKBRY9NX2sMmGtw4EiSFavya5KL\nZ9h1VySaP0zk3l4KVDZUUGZSyUl76H0BeLIa8AJNB8r9UgVA1LYeMd2C2E3F\ncdTt\r\n=8uyx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEfgAkcvG3XhgTGL3ghobITK+16ReqIuDl864P8PRu7TAiEAmvjJvZAvpByOe2mDYpELVaW3PxC8vjmlcfbfX0ZSsHw="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.2_1586981212920_0.5568436338341096"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.3":{"name":"@fly/fly","version":"0.55.3","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.3","@fly/core":"0.55.2","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"668373e830aa7a9f4d47f85c3ad9f0386179c59c","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.3","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-0SzLSPX4ozcYzgRRj3smUH+h7I3LkIh5WQbAXqCslM3HX8ClGMihLlcaMEkVOcL+q7kJ+ypJ5daa6WxN/xS2Pg==","shasum":"c449e3ca42636a24d208a8a5be1ffdf243d15fe3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.3.tgz","fileCount":5,"unpackedSize":36682,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4tuiCRA9TVsSAnZWagAA1UsQAJEFYe9NvpaUe724TYiq\nR1pimS1srdsdBf2CGKU9dQk2ayTy5nZjAm+yawUgSBH24OfvBQ/x/XPDAx7x\nLajNUJjlFiVHaakD4D4b/zL3BUY3bdLmGLrXCXFKQB2VOwspIluCDfTaqT5L\nKSgtASjjoRnzhylCJ6SGt++P/yu9ehcikOMKWtSdIDCp+ypt4bteyLJ1BBXO\n/80nXokhSYw6+wep9rS8Irc6FVuTCp5P/S2u6qLKCaX/SXd+UyoVInDFfI5t\nVWvrhZroyErso8ZyHJfkYhzn4a6qXFFvjwnQeVvvLEg+ufuHqRXUFBhd1KRH\n3ggaW9McP1/rMML8ZjqcFcdoy5H+bY2re2iIZqBuv6fZ/gfrqrj8JF8ptQ9j\n+wqcACTHpRllCoZFJ01y3RPJ4mivoWVNMqJ8hxp6sOApHgskgiicCnIWFTNs\nO4QhsPKYQxpFmgN8uueQdHBW6FuD4sR2xej56O96WZEDkFvzfU8yJZa+Rec4\nM4ElYNCrhMIElPgIJjM7TPSllvWADEX3VnHVBsSxlAcgi1cHNFi2lSSWnsLW\n5r+9quDdlk0aH+Mo8eprqZwGR2GTqA1lxMf9CuUc0XaMT7PZL+BSk9v1nDV1\neuK6fa4bci+kNTTJKp8Z7aZ11ILeO4pZzWq09W6aYsT3JtZmH6FVxTbw0SM+\nnwrx\r\n=PS9O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC2cKBt99S9UCKYPKDLASJzeT/37C78XrDy75Cpfwaj4QIhAMiTdqtzJYELAQ+8MBTAVNDZN2Ywz4B2d3cUNUvMlznf"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.3_1591925665185_0.1720924335345626"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.4":{"name":"@fly/fly","version":"0.55.4","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.4","@fly/core":"0.55.2","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"00e2f12e331d2374fba8858bd43498eb7b706899","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.4","_nodeVersion":"12.18.2","_npmVersion":"lerna/3.22.1/node@v12.18.2+x64 (linux)","dist":{"integrity":"sha512-roQX/gH9FRR+mQWsRbGaGgg+HzFsaA/ZDtyE136XfoXNLMa6YM2gWA4Aaj4WHQ2K1h6UUd7FFq7MxRw4P3Q28w==","shasum":"9ccf6a7fbed9cd1b725e87fa095223c0274b49f3","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.4.tgz","fileCount":4,"unpackedSize":27479,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+7akCRA9TVsSAnZWagAAF9UP/AkEqPxhdo7i6hsu1nCg\ntmxV4FmetFd6xT2fA3K5apQJAVjzBfwBNHiTwPtPJ3Pc2+d/mHtrNsNlcitr\nYw7atFEBNtQCZxBlbfyn1v9mqdkGqeiPV7CvpMsnwWoZH3U5G/KN3fGzKXXH\n+ZR8D8AnZOQTlklpt4deeDJ+xTHLU40+9CVj5vL/vjLs3iAU8ozpMPldHk9V\ntwWGRfTUMYh0eQSOeUxqHoEHnvJAsmjVE3NmZuaGRevlEHi3HjUQ9CaQ+mPJ\njWWtq+7wSRdZnxnyutSyGTsE8mdyPEfHZoQPZNz2uQ5fNq3DrEvzqZ15eJA2\nbsgUjlcSYRELesBFgA1cd3siDT4NMU5ZvsiowWBJ+feeUN7Vw1mifFnCBRN4\noSHA9c6CERd9swxWDOrpzMyw5nzDiKTMDgYAEnS7Lt6OaGQzlW0F+q0RzEgW\n59ex4dQNGa4Jyjx8kVvXUq/sK4wgLORnp55spT1A6e2Qf9qlJeoQXn//SU6a\nYS9cIxbEC81vexnh8TJ0Hg7R3mxU/y+LXI1vUd3xzaHScKMu6zI6Y7X74a6I\n72gl6r58VPmFYqe2WX3aDqEpjflPcDiybsn54nf2PGORt9MDtW3wlXNKMGnE\nCgl2GOrOT8cJmOQONn6mUK0Xb/5fr0mq3DDbeanj/YJC+GerscCZkiyquxJC\nB/Qn\r\n=nc0w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCC0ZJ6439UJwp8AkML7Gc+szBeCgkfe3Fy2EHdxya2wgIhALcqkYssMT0LM+APPmkPyBz7xyjFzt9WMZ4tYFH6l1w0"}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.4_1593554595972_0.16221331909093317"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.7":{"name":"@fly/fly","version":"0.55.7","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.7","@fly/core":"0.55.7","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"9466035f33654f96be3beabba70ced8fd08ba7f6","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.7","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-EKTsm5Nxp20uBVoMOC4stD3HkzkSZVlyDvQE18IsCs0EGS8gTFakLFKVCWzoD6rhIptif55DO56t/pT1BamsqQ==","shasum":"dfa7787cebc0e024c2592698c4d7a5d1302cd543","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.7.tgz","fileCount":5,"unpackedSize":37099,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUDNhCRA9TVsSAnZWagAAfUQQAJLeSdkLi3OuNHoIYmLr\npbTXaJp/rukTqNudb3zdtizKy3kG8xwdrCJIFPFuUx2fb89NJ2TcOYyfHlpN\nzXVqyS017TGOlIji7oKP+zfxQdNnXrwE+n6lUEihsav7qrgglvJwj3S7gWiI\n0+CmSTiUmAh42uFYd5+ZUreH+jx3V+vLLtVdExVW1VmRYWWiwD/IeRHFZEHo\nIRTrBWpH5q+6cQVcpjs7D7/y+XbE8f2znKffJLHUP9mJHsa0Bjv7cZc4eCeR\nXgDcse0rlWO5YMgfOwn6NailqhnUD+NeKZQbMAozrsgAroYKRXsRq3RSlM+T\n9qt9jXEYQCTuyLy9GLn6eanMw0LrqRDpZz5TkAu5/A6N+KLdWzzSSwkrOTnE\nsdk7qKN1I6e6J6m9VnmoldXocFbYo/dBvhQu9cvonC9FKsS1N8d5A1W0q1Fm\no1Y/cdkbZ5GSr147W/tqrZIkzJTGhwCrKITNUdwKr+6uwwOdevmOGXgvWVyd\nKOB1nzPoSxFGXw+m9M91QB26/xdGxa1aJM8nPWccl3Mwv2GnueCmq+PTZtTZ\nEd9y76RdjIL8bj2qbNebdiKw3hIVhmgRCro+chWz+jJj85p0hQV0EkbjN/Gk\nnMd00dglTQkb8m5UkZWMqH0wbBBABrDaIHj1Xj+dv+mPKWip6Hr3OKZC3ETq\nMdZa\r\n=Y9e1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoVklnJBNp+cNilQ/RXRmGa5Vm0DlnKKt13+qzpQA9YwIgDBFEkPWm2mx3fKcqXypk9rGY6aL0Ksp18V3v2GKzRlQ="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.7_1599091552777_0.569093063220262"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.8-pre.0":{"name":"@fly/fly","version":"0.55.8-pre.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.8-pre.0","@fly/core":"0.55.8-pre.0","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"2fd2a8825155667d6761c60d4c786b818b790fd0","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatible, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.8-pre.0","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-JvQBm77GJiybITSCy+PRH5sTFd7GITLQuUPDNKkTu80zqRRLdioakmd0joyRx4Xj/yZ4+0Gy7YAk2D6Ge1KAyA==","shasum":"49c47085387cecdb2b56bf9070e2b4e7b82b6088","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.8-pre.0.tgz","fileCount":5,"unpackedSize":37268,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUSdhCRA9TVsSAnZWagAAil8P/37AXDSPongf9arNbeAm\nIw8A7vFEs6MsxLXSkREIWUQqFQDobuLcQ6GtoVLDZxEyuWdD0JWIEIY9O9h/\nqjPqWocfDzceIQY1NWfZlbVdBa2HRIaJb79Bj3ozjVFldI76WAseyOkXCnxM\nHkVfF+sGWV9y4I85+g7OTFvxd8DCeXeFy7Yb4+4kvvGRIDtXFoUWn+omVW7S\nzX2EKWsBO7VrzYZGHtZ1z4rZqLDputqkerLcTc8R7lwll6JAuFgE/TvyTlk2\n8DL2+yFdrwVekjZtY4almT9Ks6cF4D0oCfdmeukb7ztu4gl70oL/y9mK+5nX\njqDDncugvvdA9a7cWA5fMR6cVxLQo5g4cH7X98/vbt1/siwr3bg+W+0PAUr8\nok+jgCeF4IaRaiGxnqaKCngO1A7P94bL9piCZKzwGpZ1zcA1pVCSi2uBKoFi\nMfRoMQj+ggEpHJnrvKZYZMgWGOo4ZJvrnJQi97o4sOGTQeSCu5QegwDl5drB\n/ACOIaW7HxsjRjBVhBB124MEX3jZ2Uf55i8dWNvQi+68Riku8zbsTJDaP/vL\nSOQNSzxXiTWXM4xUGoLEU8eQIWRokfPi+cEVN6Bh/UCjtLGqznnP2tykIMQP\nDSKPEJ46QCAWfBKpbxxKLFZIhP/LIvNCcSDxsien7WZnr2u65ZZJn7ERQb4s\nwvl3\r\n=Gf+N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3osQ10KI7RaHknBj3MrjOjXaDMdw6DgxNlLZFa5TgPQIgHLM+WbxBRFaI8k062bJDEkyhS3iqT1MPymUJ0fLWt1g="}]},"maintainers":[{"email":"jeromegn@gmail.com","name":"jeromegn"},{"email":"m@dwan.io","name":"michaeldwan"},{"email":"mrkurt@gmail.com","name":"mrkurt"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.8-pre.0_1599154017146_0.7709207936863558"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.55.8-pre.1":{"name":"@fly/fly","version":"0.55.8-pre.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"fly":"bin/fly.js","flyjs":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.55.8-pre.0","@fly/core":"0.55.8-pre.0","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"acf4406d59b4e46c0b36461e0657cfe5864c7c4f","readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatible, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.55.8-pre.1","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-vwu9f+1B8yImE28tesT+ZqU2qEqRTKe8HClGeJZhI0Jiq8bHpvNRycOGRscyF/PObq7HFdNyj5ZjW2W/DUGchA==","shasum":"dc153a61fc688e3de137617ff1e9e64700554b64","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.55.8-pre.1.tgz","fileCount":5,"unpackedSize":37454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfWQMKCRA9TVsSAnZWagAAPA0P/2Mfks66UTzXS0TTmUDS\nFSZuP/n1ER04hZgJZj3+FWOAgNv6zpdtDG2E++aOGYOcAq8uP1A7kyWIubpF\n2Qz3FS2iNu9CpkduHrZHBq2UegMg7YtmvI1lWkn3OMiEbpg4pTcz/F6qtvku\nTnIzVSIraOZD/KrhB9LqpSQFzOFS1ocgE+Y7mQDGzcQ95uh9uNpBCnwp3Awm\n4OWSAy8U9vgX3oDDaHy6TJRNipoYhMurEButLKE1g7BPTgocvrwwvs8BymoV\nIz6y3VCd0jtixws6xh6di+1PXJPEzT1G8IbynURouJOomny/CpRdipXXCdn1\n37XyerBMf7j2qX7TAeQT4TEybP0AQjE9WqpBYxMfrsWWdkX/1yv/hxZ4mwO8\njEUkAwP1OMPi/hIdp0SsghmU94e5gXSFHnyskgz3WSgRk60bgn+bFBOMomZd\n8PfSzoTF/8b0X2wANGYrqiqYEUevS8SWfulpqLrYTBqnbV/krcyQX4yybtsQ\nP5hKMp+LKyntEk42aRU6eRy8y7wI7hKegQA02FiX2ZCsiDg358YSx9N5Ao/b\n6RPk2X9flhhrhOgXXAC2Gmrc9DO+gxZ+0TM0sJJPIoFl8UALJqVJX6TeWauC\nnFEBQVadhfhgi14Bl0YFcWCeY2cFrYV+Ids5D4zbqB+Y5SQwgrBzbXSRgiJ1\nSrXW\r\n=syBG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHaJze4fgVnllFiClt3Pk9+3zoyzcTjmOrWtgYuccRj2AiEAkH1U2DnzVcbn212IrHLbUH7cK+4wC2P+Ktrhxg6IBaw="}]},"maintainers":[{"name":"michaeldwan","email":"m@dwan.io"},{"name":"jeromegn","email":"jeromegn@gmail.com"},{"name":"mrkurt","email":"mrkurt@gmail.com"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.55.8-pre.1_1599669001395_0.47128117864723684"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.56.0":{"name":"@fly/fly","version":"0.56.0","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"flyjs":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.56.0","@fly/core":"0.56.0","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"f892270aa37d6a1b4cc59614cda4fac2eb094930","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.56.0","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-/JG1uC1H85gR1k8xVRIg220ppyWRuHyaGqsHBGwRZugAXPkmS8W757He1THfsG7lJ1uWqHUzbmh/+DV0rVuAmw==","shasum":"3556c4c17bbb92c6cb9fa85b307c61e241ef385e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.56.0.tgz","fileCount":5,"unpackedSize":37553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfWQx7CRA9TVsSAnZWagAArcAP/A2HxFJKlup4qc0IkR4j\nC8e3m3nkfu3G6nx1sHENOVR5rr4hEO4wgVQXyf0jMOHsnoa2HiNzLv3xjArr\nUIt132rVQuGzHCDN9I6fuflBkpCal98XU1Vz87+biOsXmY2DELFKP3xzRfj2\nYOhBcUIauRerGLnXt3EpnQAMeeWPljrdGkFFWAC/azS9IIjaItpm8+M9+kIt\nBHLo8DPq/wifWfF/8/hzJ5q6XqPCg8LGr/JXwUT/WqlOLlFIX19MIo3rSIP+\ns4VSre4r0yf95Vpfyn52HqhMIT73zQkbwGCusbXAh19wxbeEyTry8furDQsh\n70P4MTM4U1SuLys4kjY2IynouxyxcYqEI0m6NNw2DpEPDWB/4L/+PYZW94Qy\nPI1lASfBfO2y+/Dn1oSmX+EE0SmguETKZtoxd0MVMNapXSMQPsqjQWgJ++JZ\ny3eIqQW3ykS7oJDRM6y3IpSXisJiRw+IRBje5Uc2Gg8joEsRXOy6MsK+cDa1\nMsPt5gMOIxKeGGo6CtNyOfkszbkJjOD1TN6SnGJYSgWMiK728XTOy9JX/Frt\nY3zKIho1hf0oe8j2G+8LpUzaRKb6xok9E524849vJZdd+wlozh8k8gWCfD27\n279nL/mP6HlraNTKe0IQKqpljDtvc0rFKthvnbjqkr1Un9/o1LPLdMByGWlB\nveLZ\r\n=jr6G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1Leuah3QHRQDZ84cAYscKfKOLpQBHn9fk0naN01PpewIgCJSs8nsyKg0MvksdaGvdZhOFhhqc1tenc8fQvTTcoTY="}]},"maintainers":[{"name":"michaeldwan","email":"m@dwan.io"},{"name":"jeromegn","email":"jeromegn@gmail.com"},{"name":"mrkurt","email":"mrkurt@gmail.com"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.56.0_1599671418605_0.5057869246924702"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.56.1":{"name":"@fly/fly","version":"0.56.1","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"flyjs":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.56.1","@fly/core":"0.56.0","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"90d28555ca2ddd6e181be8d6a9f7dbecc0959d4f","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.56.1","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-WcbV/XfzAD83qsTXsJ663H7JXILtD2BGM1qOs9Dzm96bmJRhIb/7DyJ7SAwkA182b5hBHsK7I/KW2zZuDzOLWQ==","shasum":"a2311fdf7c2133fa8488d8bbe527199567bbf0a1","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.56.1.tgz","fileCount":5,"unpackedSize":37692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfifxVCRA9TVsSAnZWagAAmOwP/jHqPK4HCMdlyzH8np2D\nVjkhdAsTRx1rf1fSUlu2k3NfMUIGcBVqQg/cUHFEMq5xk+4tlV+lGB6ghqkK\noGBpP7Mp1tkcA6gO4v4cnOO5UsI2ow9p0lG0nhw6icS72w0mWrGghJ3EGJ0g\nTJIzjQheVD11lI3VtwaqqdQdnzIDTiHVLxJOVbQpo7r9FoCcOCXR0AlmypvF\n7wsLMUTvy0dGvcH2DbV4IpGb46As3TbYDPADiH8KemgYSVeXIuYmHDQ9lnL2\nn6VdUWC8aMt32OScdaiuyMkomz8v1AWcQIU/BcGvuKGDZXevGRyIs4yOSK7l\nwTDW5HImHIE4W0edrM6kLnnW9bf27Eg+/lyn3EK6Iv8qvDTLEbNU+AU8VzeF\n9zF2soS3eZ/mvrEZ/Sw1hgPw5eo3ALyNzN4HZ9Rr1XpgTQ9RO9/IsXyn/zhW\nokGEJoEErJwcffhmRHzfRiqpdtwaayiDCuzDS6lT6L7zAdJ/SyCGner9FIe6\nMcaedflmQn3VLzVtTXlri93omBLBKXZOs25M/DnMfHomVARbdMCB304t+0HK\nvZeAM9FI6T/5sBnXPYqz5dJeQecs9RVn+/7qYZbz16zNl/msLT8SOMe+x19U\nJzueZMljsbDU+MECru2pRT+AUJfUu9JEvOspB+gAhy4vN2mY2M0kQvjIQshO\nRZ3w\r\n=qu2N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQnQnayxbHw0eMr/7YSpsMMzPDtsYXzZYZ4PL0PXRHEwIhAKYDaCWBsivpfdY1ebtsk7lcOuh217TGEax44vWDEi1p"}]},"maintainers":[{"name":"michaeldwan","email":"m@dwan.io"},{"name":"jeromegn","email":"jeromegn@gmail.com"},{"name":"mrkurt","email":"mrkurt@gmail.com"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.56.1_1602878548535_0.7914024215482538"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.56.2":{"name":"@fly/fly","version":"0.56.2","description":"Open source Edge Application runtime","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"homepage":"https://fly.io","bin":{"flyjs":"bin/fly.js"},"scripts":{"clean":"rm -rf README.md","build":"cp ../../README.md .","prepublishOnly":"yarn build"},"dependencies":{"@fly/cli":"0.56.2","@fly/core":"0.56.0","@fly/v8env":"0.55.2"},"publishConfig":{"access":"public"},"gitHead":"505cf5079d5a8504c51d4c0e6c0fea3816e7c9f4","bugs":{"url":"https://github.com/superfly/fly/issues"},"_id":"@fly/fly@0.56.2","_nodeVersion":"12.13.1","_npmVersion":"lerna/3.22.1/node@v12.13.1+x64 (linux)","dist":{"integrity":"sha512-LiaIfuhzdeewub1hESJD2mLKcdSWh+6QfLhjgRbcXXLefiKsHVHxu/geEOWgzEHs7rTglbx6H9LkT6IRuctIjA==","shasum":"4ec446b28f5484be864bee292447d06c2185b26e","tarball":"https://registry.npmjs.org/@fly/fly/-/fly-0.56.2.tgz","fileCount":5,"unpackedSize":37831,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfigX3CRA9TVsSAnZWagAAc2QP/0Db6u6apxnVTMDdnCo8\neKqrud4WP6eGQpf0ofgN32tJeSr74PZjporL1pMKe/jRtfJ2B9kCvt0ercQU\nqGvjuSb0ZjQtqAjM74fThtvJToMPCaIGRr1tOT6YYPKd5LLHGED1YZ47Db41\nocwZHPRiM1EOK+jDLSUEBPnv6Yt76alYMK2Ob3uhYdaOHVlRcDJq1gwAY5jB\nZDiAX0xFP/H5jTCsSw6VaxnV36KlqSPaQJB5tkVYSAE/h4nHx1KbULEbnDYO\nIjKW+0O6D2T3JcoTvYG+v6IeW/4QWC9P71ebyz75+2Zwc03VU0h5A/9G7QqQ\nJzFP9/pMoIKKsDr0veqk8DRf+0gEPyw/nxexpChGRx6RxN3Pz7AZRgHlLNku\nXpAcZkDJVFkFjUMfMt4sfyKvHpUI0MmXniQ6kq2q8JtqY62+G//bMaR2xUJN\nIcNpRu3R+FcYP+6t0LN6hCXHp+D36rkPEFHa45zQaugsudb3ZG5PQgAjDvRX\nIOwHJt01GjitvGyeuYWIsdULe+LibX8QGD9Zu10GDJOoixfNiVXuq/W1EoBc\n33u8zB6udWUHT/VDeLQFNO+HijK0mTf/fLd5pjABokcNncfSw9tXT+mQStAO\n5fexKyZKoLw6Ohcn0GrefY8RuqWaxY/MZxnsE0pL+whsHJEkUubiNrD0EZ5w\nHGd+\r\n=GMGD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCp/+nQd/8tCEd7uRgMkYpFINqEp8ZSKo8/BiAn2XFfXQIgV5QGeiP5GwsGDVLLPMd5MKfPxRDBXhfp9BOa3zNcUU8="}]},"maintainers":[{"name":"michaeldwan","email":"m@dwan.io"},{"name":"jeromegn","email":"jeromegn@gmail.com"},{"name":"mrkurt","email":"mrkurt@gmail.com"}],"_npmUser":{"name":"michaeldwan","email":"m@dwan.io"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/fly_0.56.2_1602881014907_0.5073533687097327"},"_hasShrinkwrap":false,"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"readme":"![superfly octokitty](https://user-images.githubusercontent.com/7375749/44759033-57b92780-aafd-11e8-880c-818b01c65ff3.png)\n\n\n# Fly\n\n[![npm version](https://img.shields.io/npm/v/@fly/fly.svg)](https://www.npmjs.com/package/@fly/fly)\n[![isc license](https://img.shields.io/npm/l/@fly/fly.svg)](https://github.com/superfly/fly/blob/master/LICENSE) \n[![Build Status](https://dev.azure.com/flydotio/fly/_apis/build/status/fly)](https://dev.azure.com/flydotio/fly/_build/latest?definitionId=1)\n[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) \n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsuperfly%2Ffly.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsuperfly%2Ffly?ref=badge_shield)\n![Gitter](https://img.shields.io/gitter/room/superfly/fly.svg?colorB=red)\n\nThe Fly runtime is an open source Javascript environment built to run Edge Applications. It gives developers powerful caching, content modification, and routing tools.\n\nThe runtime is based on v8, with a proxy-appropriate set of Javascript libraries. There are built in APIs for manipulating HTML and Image content, low level caching, and HTTP requests/responses. When possible, we use WhatWG standards (like `fetch`, `Request`, `Response`, `Cache`, `ReadableStream`).\n\nYou can [use it locally](#hello-world) for development and testing, and [deploy it to Fly's fleet](#deployment) of edge servers for production use.\n\n## Edge Applications: the in between\n\nYou can use Fly to build HTTP load balancers, caching services, etc, etc. Edge Applications are typically built to replace or augment infrastructure that runs between web apps and users.\n\nThis in-between is a great place to solve certain categories of problems. If you need to solve one of these, you might want to build an Edge Application:\n\n* A/B testing at the load balancer layer\n* Route traffic to different cloud providers\n* Cache personalization data geographically close to individual users\n* Route authenticated users to specific apps\n* Enforce backend SLAs, serve fallback content when backends are degraded\n* Load balancers across cloud storage providers\n* Per user rate limiting (for APIs or apps)\n\n## Installation\n\n#### macOS\n\nHomebrew is the quickest way to get started on macOS:\n\n```bash\nbrew tap superfly/brew && brew install superfly/brew/fly\n```\n\n#### Linux\n\nUse the [standalone installer](#standalone-install)\n\n#### Windows\n\nUse [npm](#npm)\n\n### Other installation methods\n\n#### Standalone Install\n\nThe standalone install is a tarball containing the Fly CLI, precompiled native extensions, and a nodejs binary. This is useful in containers or hosts with restricted access.\n\nTo quickly install into `/usr/local/lib/fly` and `/usr/local/bin/fly`, run this [script](https://github.com/superfly/fly/blob/master/install-standalone.sh) (requires sudo and not Windows compatible):\n\n```bash\ncurl https://get.fly.io/install.sh | sh\n```\n\nOtherwise, download one of the tarballs below and extract it yourself.\n\n#### Tarballs\n\n* [macOS](https://get.fly.io/tarballs/stable/fly-darwin-x64.tar.gz)\n* [Linux (x64)](https://get.fly.io/tarballs/stable/fly-linux-x64.tar.gz)\n\n#### npm\n\nThe Fly CLI and runtime is built on Node.js with native extensions. As a result, installing from npm requires a proper C/C++ compiler toolchain and takes significantly longer than the other methods. If you're on Windows or don't have XCode/gcc installed, follow the [node-gyp instructions](https://github.com/nodejs/node-gyp#installation) before continuing.\n\nInstall globally:\n\n```bash\nnpm install -g @fly/fly\n```\n\nor as a devDependency in your project:\n\n```bash\nnpm install --save-dev @fly/fly\n```\n\n## Usage\n\n### Hello World!\n\nWrite javascript code to a file (`index.js`):\n\n```js\nfly.http.respondWith((request) => {\n  return new Response(\"Hello! We support whirled peas.\", { status: 200})\n})\n// if you'd prefer to be service worker compatible, this is also supported:\n// around addEventListener('fetch', function(event){})\n```\n\nStart the fly server:\n\n```bash\nfly server\n```\n\nVisit your app:\n\n```bash\nopen http://localhost:3000\n```\n\nChange code and configuration, it's reloaded seamlessly.\n\n### How does it work?\n\nSimply put:\n\n- Uses a basic webpack configuration to bundle your javascript\n- Assumes the presence of `index.js` or `index.ts`\n- You can customize everything by creating a `webpack.fly.config.js` which will be loaded for you\n- Use npm packages compatible with the v8 javascript engine, you don't have access to node.js-specific concepts or packages.\n\n### Configuration\n\nBy default, fly will read your `.fly.yml` file in your current working directory.\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  foo: bar\nfiles:\n  - path/to/file\n```\n\nProperties:\n\n- `app` - the fly.io app name, can be ommitted, useful for deployment purposes\n- `config` - arbitrary settings for your applications, accessible in your code via the global variable `app.config`\n- `files` - array of files, relative to your `.fly.yml` to include in the deployment. Can be accessed via `fetch(\"file://path/to/file\")`\n\n### Secrets\n\nYou can require secrets in your app.config like this:\n\n```yaml\n# .fly.yml\napp: my-app-name\nconfig:\n  secretThing:\n    fromSecret: secretKey\n```\n\nIn your code, you can seamlessly use this value like:\n\n```javascript\napp.config.secretThing\n```\n\nWhen deployed on fly.io, secrets are fetched from an encrypted store. You need to pre-define your secrets via `fly secrets:set <key> <value>`.\n\nLocally, you need to define them in a `.fly.secrets.yml` file, make sure you add it to your `.gitignore` as it can contain sensitive data. Example file.\n\n```yaml\n# .fly.secrets.yml\nsecretKey: <your secret value>\n```\n\n### Files\n\nBy specifying a `files` property in your `.fly.yml`, it's possible to use `fetch` to load files without having to bundle them in your javascript directly.\n\nLocally, these are fetched from your filesystem. Deployed, these are fetched from our distributed store.\n\nExample usage in your code: (given a `client/app.js` file)\n\n```javascript\n// index.js\n\naddEventListener('fetch', function(event){\n  event.respondWith(async function(){\n    const res = await fetch(\"file://client/app.js\")\n    res.status // 200\n    res.headers.set(\"content-type\", \"application/javascript\")\n    return res\n  })\n})\n```\n\nNote that fetching with the `file:` protocol returns a very basic response.\n\n### Multiple environments\n\nDifferent environments (development, test, production) require different configurations. You can specify how each should behave by adding one level to your `.fly.yml` like:\n\n```yaml\nconfig: &config # your default config\n  foo: bar\n\ndefault: &default\n  app: your-app-name\n  config:\n    <<: *config\n\ndevelopment:\n  <<: *default\n\ntest:\n  <<: *default\n  config:\n    <<: *config\n    foo: not-bar\n\nproduction:\n  <<: *default\n  config:\n    <<: *config\n    foo:\n      fromSecret: fooSecret\n```\n\n## Testing\n\n`fly` comes with `mocha` as its default testing framework.\n\nYou can write unit tests and use `fly test` to run them within the fly environment:\n\n```javascript\n// ./test/index.spec.js\nimport { MyModule } from '../my_module' // load some code\nimport { expect } from 'chai'\n\ndescribe(\"MyModule\", ()=>{\n  it(\"works\", function(){\n    expect(MyModule).to.be.instanceof(Function)\n  })\n})\n```\n\n## Deployment\n\nOnce you're happy with your app, you can deploy to [fly.io](https://fly.io).\n\n### 1. Login\n\nUse `fly login` to log into your fly.io account, if you don't have one, go create one!\n\n### 2. Create an app\n\nMake sure you've created your fly app for your account with `fly apps:create [name]` (name is optional)\n\nSet your `app` property in your `.fly.yml`\n\n### 3. Deploy!\n\nUsing `fly deploy`, here's what happens:\n- Your code is bundled via webpack, it's also uglified to save space\n- Your code, source map and `files` are added to a simple tarball, gzipped and uploaded to the fly.io API using your token\n- We create a \"release\" for your app, those are immutable, changing anything (by using `fly deploy` or `fly secrets:set`) will trigger a new release which will be deployed automatically\n- Your code is distributed instantly(-ish) across our global fleet of servers\n\n## Logs\n\nTail production logs with:\n\n```bash\nfly logs\n```\n\n## Documentation\n\n- [Getting Started](https://fly.io/docs/apps/)\n- [API Reference](https://fly.io/docs/apps/api/index.html)\n- [Examples](https://github.com/superfly/edge/)\n\n## Open source\n\nWe develop fly in the open. We're [Apache licensed](https://github.com/superfly/fly/blob/master/LICENSE) and designed to run easily in local dev. You _can_ deploy our core software to production, but it takes a little elbow grease and a fair amount of infrastructure. If you want to give this a try, let us know and we can help (and we would love related pull requests!).\n\nOur commercial offering is built on top of this library, with additional code for managing certificates, distributed caching, and multi-tenant isolation. Over time we expect to extract many of these features, document them, and include them in our open source releases.\n\nWe support [Let's Encrypt](https://github.com/letsencrypt): We donate half our certificate management fees to Let's Encrypt every year.\n\n[![](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/flydotio)\n","readmeFilename":"README.md","description":"Open source Edge Application runtime","license":"Apache-2.0","homepage":"https://fly.io","repository":{"type":"git","url":"git+https://github.com/superfly/fly.git"},"bugs":{"url":"https://github.com/superfly/fly/issues"}}