├── .github └── FUNDING.yml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── ROADMAP.md ├── _config.yml ├── atmosphere-packages ├── webpack-dev-middleware │ ├── .npm │ │ └── package │ │ │ ├── .gitignore │ │ │ ├── README │ │ │ └── npm-shrinkwrap.json │ ├── .versions │ ├── dev-server.js │ └── package.js └── webpack │ ├── .npm │ └── plugin │ │ └── webpack │ │ ├── .gitignore │ │ ├── README │ │ └── npm-shrinkwrap.json │ ├── .versions │ ├── package.js │ └── plugin.js ├── examples ├── angular │ ├── .gitignore │ ├── .meteor │ │ ├── .finished-upgraders │ │ ├── .gitignore │ │ ├── .id │ │ ├── packages │ │ ├── platforms │ │ ├── release │ │ └── versions │ ├── .meteorignore │ ├── client │ │ ├── app │ │ │ ├── app.component.ts │ │ │ ├── app.html │ │ │ └── app.module.ts │ │ ├── index.html │ │ └── index.ts │ ├── imports │ │ ├── todo.ts │ │ └── todos.ts │ ├── package-lock.json │ ├── package.json │ ├── server │ │ ├── addTodo.ts │ │ ├── greeting.ts │ │ ├── index.ts │ │ ├── removeTodo.ts │ │ └── todos.ts │ ├── tsconfig.json │ └── webpack.config.js ├── react │ ├── .babelrc │ ├── .gitignore │ ├── .meteor │ │ ├── .finished-upgraders │ │ ├── .gitignore │ │ ├── .id │ │ ├── packages │ │ ├── platforms │ │ ├── release │ │ └── versions │ ├── .meteorignore │ ├── README.md │ ├── client │ │ ├── main.css │ │ ├── main.html │ │ ├── main.jsx │ │ └── ui │ │ │ ├── AccountsUIWrapper.jsx │ │ │ ├── App.jsx │ │ │ └── Task.jsx │ ├── imports │ │ └── api │ │ │ ├── tasks.js │ │ │ └── tasks.tests.js │ ├── package-lock.json │ ├── package.json │ ├── screenshot.png │ ├── server │ │ └── main.js │ └── webpack.config.js ├── vanilla │ ├── .gitignore │ ├── .meteor │ │ ├── .finished-upgraders │ │ ├── .gitignore │ │ ├── .id │ │ ├── packages │ │ ├── platforms │ │ ├── release │ │ └── versions │ ├── .meteorignore │ ├── client │ │ ├── dynamicprint.js │ │ ├── index.html │ │ ├── lazyprint.js │ │ ├── main.js │ │ └── todo-list-renderer.js │ ├── imports │ │ └── todos.js │ ├── package-lock.json │ ├── package.json │ ├── server │ │ ├── addTodo.js │ │ ├── main.js │ │ ├── removeTodo.js │ │ └── todos.js │ └── webpack.config.js └── vue │ ├── .babelrc │ ├── .gitignore │ ├── .meteor │ ├── .finished-upgraders │ ├── .gitignore │ ├── .id │ ├── packages │ ├── platforms │ ├── release │ └── versions │ ├── .meteorignore │ ├── README.md │ ├── client │ ├── main.css │ ├── main.html │ └── main.js │ ├── imports │ ├── collections.js │ └── ui │ │ ├── App.vue │ │ ├── Chat.vue │ │ ├── MyButton.vue │ │ ├── Test.vue │ │ ├── Test2.vue │ │ └── blaze.js │ ├── package-lock.json │ ├── package.json │ ├── server │ └── main.js │ └── webpack.config.js ├── npm-packages └── webpack-meteor-externals │ ├── index.js │ └── package.json ├── publish.sh └── renovate.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | 2 | patreon: ardatan 3 | github: ardatan 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "git.ignoreLimitWarning": true 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Arda TANRIKULU 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Meteor-Webpack 2 | 3 | Blog Post : 4 | https://medium.com/@ardatan/meteor-with-webpack-in-2018-faster-compilation-better-source-handling-benefit-from-bc5ccc5735ef 5 | 6 | Meteor-Webpack provides you a development environment that integrates modern web bundler Webpack, and modern perfect full-stack JavaScript framework Meteor. 7 | 8 | You need just one atmosphere package to start; 9 | `ardatan:webpack` 10 | 11 | This project includes some examples with popular Frontend frameworks and a compiler package that replaces Meteor's bundler with modern web project bundler Webpack. 12 | You have to create a `webpack.config.js` file that has the compilation configurations for both client and server code. 13 | You are to free to choose the directory structure in your project, Webpack will compile your project regarding to your entry definition. 14 | 15 | ## Simple Migration 16 | 17 | ### Feel free like you are working in a Webpack CLI 18 | 19 | Meteor-Webpack would make you feel you are using Webpack CLI. Just use same cases in Webpack's own documentation. 20 | 21 | ### Feel free like you are working in a regular Meteor environment as well 22 | 23 | Meteor-Webpack can resolve any atmosphere packages and Meteor modules like you are using without Meteor-Webpack 24 | 25 | ## Try our examples with your favorite Frontend framework 26 | 27 | - [Vanilla](https://github.com/ardatan/meteor-webpack/tree/master/examples/vanilla) 28 | - [Angular](https://github.com/ardatan/meteor-webpack/tree/master/examples/angular) 29 | - [React](https://github.com/ardatan/meteor-webpack/tree/master/examples/react) 30 | - [Vue](https://github.com/ardatan/meteor-webpack/tree/master/examples/vue) 31 | 32 | ## Why Webpack 33 | 34 | - Faster compilation thanks to Webpack good caching during compilation 35 | - ES2015 Modules support instead of loading modules on runtime like Meteor's bundle does in CommonJS way, because Meteor only converts ES2015 import syntax,`import module from 'module'`,to CommonJS import syntax; `const module = require('module')`. 36 | - Tree-shaking for smaller final production bundle 37 | - You can migrate your existing Webpack project to Meteor easily. 38 | - You can use your existing Webpack loaders and plugins without a great modification including the ones don't exist as an atmosphere package. 39 | - Hot Module Replacement without reloading in each compilation using Webpack Dev Middleware together with Meteor's `connect`-compatible HTTP Server 40 | - HMR is available for server-side code, so your re-compiled server-side code will be replaced in 'already running' server without restart. So, the recompilation of server-side code takes less time than regular Meteor bundler's. 41 | - Comparisons with other bundlers are explained [here](https://webpack.js.org/comparison/). 42 | 43 | ## Comparison with other solutions in Meteor 44 | 45 | ### Regular Meteor Bundler 46 | 47 | Regular Meteor Bundler uses `babel` which tranpiles your ES2015 syntax to ES5 even imports to `CommonJS` which creates some limitation for you. For instance, you cannot use ES2015 modules, then you need to import UMD modules which would probably contain unused submodules of this module. 48 | Despite you can use atmosphere packages with Meteor-Webpack, you don't need to add extra atmosphere packages for sass, typescript and others' compilation. For an extra compiler such as sass, less and pug etc; you can just install necessary webpack loader plugins, and add them into `webpack.config.js`. Meteor-Webpack runs exactly same way with `webpack-dev-server`. 49 | 50 | ### [Meteor Client Bundler](https://github.com/Urigo/meteor-client-bundler) 51 | 52 | As in its documentation; 53 | `meteor-client-bundler` is a module bundler which will take a bunch of Atmosphere package and put them into a single module, so we can load Meteor's client scripts regardless of what framework we're using to run our server. 54 | But you cannot use this client bundle with Server Side Rendering, and you must have two different projects which run on two different servers. 55 | With Meteor-Webpack, you can extract `webpack.config.js` from Angular CLI, `create-react-app` and any other CLI tools', then easily use it with Meteor. 56 | 57 | ## Before you start 58 | 59 | - Remove existing compiler packages; `meteor remove ecmascript es5-shim static-html` 60 | - If you are using Meteor entry points, you have to remove them from your `package.json` 61 | ```json 62 | "meteor": { 63 | "mainModule": { 64 | "client": "client/main.js", 65 | "server": "server/main.js" 66 | } 67 | } 68 | ``` 69 | - You have to install webpack and necessary plugins with your favorite package manager; `yarn` or `npm` 70 | - Add Meteor package `webpack` by the command `meteor add ardatan:webpack` 71 | - Create `webpack.config.js`, and define entry module which is necessary for webpack. 72 | - If you have seperate client and server codes, you have to declare two configurations like we have in our example. 73 | 74 | ## Seperating Client and Server Configuration - IMPORTANT! 75 | 76 | - You have to add `target` field by `node` value in the configuration object you want to use as server's; 77 | 78 | ```js 79 | const clientConfig = { 80 | //... 81 | } 82 | const serverConfig = { 83 | //... 84 | target: 'node', 85 | } 86 | ``` 87 | 88 | ## Meteor Package Imports - IMPORTANT! 89 | - If you are using Meteor's package imports such as `import { Meteor } from 'meteor/meteor'`, `import { Mongo } from 'meteor/mongo'` and also non-global package references such as `import { publishComposite } from 'meteor/reywood:publish-composite'`. You have to install `webpack-meteor-externals` npm package, and add it to both client and server entries in `webpack.config.js`. 90 | - If you are using all of them by their global references without imports, you don't need that package. 91 | ```bash 92 | meteor npm install webpack-meteor-externals --save-dev 93 | ``` 94 | 95 | ```js 96 | const meteorExternals = require('webpack-meteor-externals'); 97 | //... 98 | externals: [ 99 | meteorExternals() 100 | ] 101 | //... 102 | ``` 103 | 104 | ## Meteor File Imports - Optional 105 | - If you have an existing meteor app and do not want to change the pathnames from '/imports/...' to relative paths, use the following in your `webpack.config.js` 106 | 107 | ```js 108 | //... 109 | resolve: { 110 | modules: [ 111 | path.resolve(__dirname, 'node_modules'), 112 | path.resolve(__dirname, './'), // enables you to use 'imports/...' instead of '/imports/...' 113 | ], 114 | alias: { 115 | '/imports': path.resolve(__dirname, './imports'), 116 | '/ui': path.resolve(__dirname, './ui'), 117 | // ... and any other directories you might have 118 | } 119 | } 120 | //... 121 | ``` 122 | 123 | ### Client Configuration 124 | 125 | #### [Webpack Dev Middleware](https://github.com/webpack/webpack-dev-middleware) 126 | 127 | If you want to use Webpack's Development Server instead of Meteor's, you have to add `devServer` field in the client configuration; 128 | 129 | ```js 130 | devServer: {} 131 | ``` 132 | 133 | then you have to add another atmosphere package to packages; 134 | 135 | ```bash 136 | meteor add ardatan:webpack-dev-middleware 137 | ``` 138 | 139 | ***NOTE*** Make sure `ardatan:webpack-dev-middleware` is at the bottom of your `.packages` list for the best compatibility with other Meteor packages. 140 | 141 | don't forget to install `webpack-dev-middleware` package from NPM; 142 | 143 | ```bash 144 | meteor npm install webpack-dev-middleware --save-dev 145 | ``` 146 | 147 | ### Server Configuration 148 | 149 | #### Loading NPM modules on runtime instead of compiling them by Meteor 150 | 151 | - Install `webpack-node-externals` 152 | 153 | ```bash 154 | meteor npm install webpack-node-externals --save-dev 155 | ``` 156 | 157 | - Add externals into the server configuration in `webpack.config.js` 158 | 159 | ```js 160 | externals: [nodeExternals()], // in order to ignore all modules in node_modules folder 161 | ``` 162 | 163 | ### [Hot Module Replacement](https://webpack.js.org/concepts/hot-module-replacement/) 164 | 165 | - Process is the same with Webpack; so you have to just change your client and server configuration; 166 | 167 | - Add `hot` field for both client and server which is `true`, 168 | 169 | ```js 170 | devServer: { 171 | hot: true 172 | } 173 | ``` 174 | 175 | - and add the necessary plugin only for client; do not add this plugin for server, `hot: true` is enough for server-side HMR! 176 | 177 | ```js 178 | plugins: { 179 | new webpack.HotModuleReplacementPlugin() 180 | } 181 | ``` 182 | 183 | - Then install `webpack-dev-middleware`, 184 | - Install client-side HMR middleware [`webpack-hot-middleware`](https://github.com/glenjamin/webpack-hot-middleware) in your project 185 | - Install server-side HMR middleware [`webpack-hot-server-middleware`](https://github.com/60frames/webpack-hot-server-middleware) in your project 186 | 187 | - Meteor's bundler may restart your server which is not good for HMR's working process; so we need to disable it by adding `.meteorignore` on the root with the following content; 188 | ``` 189 | * 190 | !.meteor/ 191 | !node_modules/ 192 | !webpack.config.js 193 | ``` 194 | 195 | ### meteor/server-render 196 | 197 | - Meteor's `server-render` will work as expected if you use webpack to include HTML via `HtmlWebpackPlugin`. **Important: Be sure that server-render is listed BELOW webpack-dev-server in `meteor/packages`** 198 | 199 | ### Dynamic boilerplate assets 200 | 201 | - You can use `WebAppInternals.registerBoilerplateCallback` to dynamically change the CSS and JS served to visitors via `data.js` and `data.css`. In order to use this feature with webpack, you must set `inject: false` on `HtmlWebpackPlugin` and set the environment variable `DYNAMIC_ASSETS=true`. 202 | 203 | ## Galaxy Deployment 204 | `meteor deploy` command doesn't set `NODE_ENV=production` environment variable. That's why, `webpack` compiler recognizes that it is still a `development` build. You have two options to fix issue; 205 | ### First option ( Recommended ) 206 | - You have to provide `GALAXY_NODE_OPTIONS=--production` to make `webpack` recognize that it is a `production` build. 207 | or 208 | ## Second option 209 | - Create a seperate configuration file for `webpack` which doesn't contain development settings such as `devServer`, and includes `UglifyJs` plugins. Then, set environment variable `WEBPACK_CONFIG_FILE=`. 210 | 211 | ## Testing 212 | 213 | - Using `meteor test` requires the option `--test-app-path $(pwd)/.meteortest`. This will run the test inside the `.meteortest` directory in your project. Normally, `meteor test` runs a test version of the application inside your `/tmp` directory, but webpack needs to be able to access the project's `node_modules` folder. 214 | 215 | - You may also run into permissions issues after the `.meteortest` folder is created. I recommend adding `rm -r .meteortest` to the beginning of your test command. 216 | 217 | - All DDP connections are closed when the dev server recompiles in test mode. This will trigger testing libraries that use DDP (Chimpy) to re-run if they are in watch mode. 218 | -------------------------------------------------------------------------------- /ROADMAP.md: -------------------------------------------------------------------------------- 1 | Add Polymer, Web Components examples -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /atmosphere-packages/webpack-dev-middleware/.npm/package/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack-dev-middleware/.npm/package/README: -------------------------------------------------------------------------------- 1 | This directory and the files immediately inside it are automatically generated 2 | when you change this package's NPM dependencies. Commit the files in this 3 | directory (npm-shrinkwrap.json, .gitignore, and this README) to source control 4 | so that others run the same versions of sub-dependencies. 5 | 6 | You should NOT check in the node_modules directory that Meteor automatically 7 | creates; if you are using git, the .gitignore file tells git to ignore it. 8 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack-dev-middleware/.npm/package/npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1, 3 | "dependencies": { 4 | "buffer-from": { 5 | "version": "1.1.2", 6 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 7 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 8 | }, 9 | "debug": { 10 | "version": "4.3.1", 11 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 12 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" 13 | }, 14 | "ms": { 15 | "version": "2.1.2", 16 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 17 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 18 | }, 19 | "require-from-string": { 20 | "version": "2.0.2", 21 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 22 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" 23 | }, 24 | "source-map": { 25 | "version": "0.6.1", 26 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 27 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 28 | }, 29 | "source-map-support": { 30 | "version": "0.5.19", 31 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 32 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack-dev-middleware/.versions: -------------------------------------------------------------------------------- 1 | ardatan:webpack-dev-middleware@0.0.14 2 | babel-compiler@7.6.2 3 | babel-runtime@1.5.0 4 | base64@1.0.12 5 | boilerplate-generator@1.7.1 6 | dynamic-import@0.7.1 7 | ecmascript@0.15.2 8 | ecmascript-runtime@0.7.0 9 | ecmascript-runtime-client@0.11.1 10 | ecmascript-runtime-server@0.10.1 11 | ejson@1.1.1 12 | fetch@0.1.1 13 | inter-process-messaging@0.1.1 14 | logging@1.2.0 15 | meteor@1.9.3 16 | modern-browsers@0.1.5 17 | modules@0.16.0 18 | modules-runtime@0.12.0 19 | promise@0.12.0 20 | react-fast-refresh@0.1.1 21 | routepolicy@1.1.1 22 | underscore@1.0.10 23 | webapp@1.11.1 24 | webapp-hashing@1.1.0 25 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack-dev-middleware/dev-server.js: -------------------------------------------------------------------------------- 1 | const WEBPACK_CONFIG_FILE = process.env.WEBPACK_CONFIG_FILE || 'webpack.config.js'; 2 | const DYNAMIC_ASSETS = process.env.DYNAMIC_ASSETS || false; 3 | const path = Npm.require('path'); 4 | const projectPath = path.resolve('.').split(path.sep + '.meteor')[0]; 5 | 6 | function interopRequireDefault(obj) { 7 | return obj && obj.__esModule ? obj.default : obj; 8 | } 9 | 10 | function isMultiCompiler(compiler) { 11 | // Duck typing as `instanceof MultiCompiler` fails when npm decides to 12 | // install multiple instances of webpack. 13 | return compiler && compiler.compilers; 14 | } 15 | 16 | function findCompiler(multiCompiler, name) { 17 | return multiCompiler.compilers.filter(compiler => compiler.name.indexOf(name) === 0); 18 | } 19 | 20 | function findStats(multiStats, name) { 21 | return multiStats.stats.filter(stats => stats.compilation.name.indexOf(name) === 0); 22 | } 23 | 24 | function getFilename(serverStats, outputPath, chunkName) { 25 | const assetsByChunkName = serverStats.toJson().assetsByChunkName; 26 | let filename = assetsByChunkName[chunkName] || ''; 27 | // If source maps are generated `assetsByChunkName.main` 28 | // will be an array of filenames. 29 | return path.join( 30 | outputPath, 31 | Array.isArray(filename) ? 32 | filename.find(asset => /\.js$/.test(asset)) : 33 | filename 34 | ); 35 | } 36 | 37 | function installSourceMapSupport(fs) { 38 | const sourceMapSupport = Npm.require('source-map-support'); 39 | sourceMapSupport.install({ 40 | // NOTE: If https://github.com/evanw/node-source-map-support/pull/149 41 | // lands we can be less aggressive and explicitly invalidate the source 42 | // map cache when Webpack recompiles. 43 | emptyCacheBetweenOperations: true, 44 | retrieveFile(source) { 45 | try { 46 | return fs.readFileSync(source, 'utf8'); 47 | } catch (ex) { 48 | // Doesn't exist 49 | } 50 | } 51 | }); 52 | } 53 | 54 | /** 55 | * Passes the request to the most up to date 'server' bundle. 56 | * NOTE: This must be mounted after webpackDevMiddleware to ensure this 57 | * middleware doesn't get called until the compilation is complete. 58 | * @param {MultiCompiler} multiCompiler e.g webpack([clientConfig, serverConfig]) 59 | * @options {String} options.chunkName The name of the main server chunk. 60 | * @return {Function} Middleware fn. 61 | */ 62 | function webpackHotServerMiddleware(multiCompiler) { 63 | const debug = Npm.require(path.join(projectPath, 'node_modules/debug'))('webpack-hot-server-middleware'); 64 | debug('Using webpack-hot-server-middleware'); 65 | 66 | if (!isMultiCompiler(multiCompiler)) { 67 | throw new Error(`Expected webpack compiler to contain both a 'client' and/or 'server' config`); 68 | } 69 | 70 | const serverCompiler = findCompiler(multiCompiler, 'server')[0]; 71 | const clientCompilers = findCompiler(multiCompiler, 'client'); 72 | 73 | if (!serverCompiler) { 74 | throw new Error(`Expected a webpack compiler named 'server'`); 75 | } 76 | if (!clientCompilers.length) { 77 | debug(`Cannot find webpack compiler named 'client'. Starting without client compiler`); 78 | } 79 | 80 | const outputFs = serverCompiler.outputFileSystem; 81 | const outputPath = serverCompiler.outputPath; 82 | 83 | installSourceMapSupport(outputFs); 84 | 85 | let error = false; 86 | 87 | const doneHandler = (multiStats) => { 88 | // Iterate across opened sessions 89 | for (const sessionId in Meteor.server.sessions) { 90 | if (!Meteor.server.sessions.hasOwnProperty(sessionId)) { 91 | continue; 92 | } 93 | 94 | // This is flag means that currently worker do processing message 95 | // and each receiving message over ddp will be cached in queue 96 | Meteor.server.sessions[sessionId].workerRunning = true; 97 | } 98 | 99 | error = false; 100 | const serverStats = findStats(multiStats, 'server')[0]; 101 | // Server compilation errors need to be propagated to the client. 102 | if (serverStats.compilation.errors.length) { 103 | error = serverStats.compilation.errors[0]; 104 | return; 105 | } 106 | 107 | let clientStatsJson = null; 108 | 109 | if (clientCompilers.length) { 110 | const clientStats = findStats(multiStats, 'client'); 111 | clientStatsJson = clientStats.map(obj => obj.toJson()); 112 | 113 | if (clientStatsJson.length === 1) { 114 | clientStatsJson = clientStatsJson[0]; 115 | } 116 | } 117 | 118 | const filename = getFilename(serverStats, outputPath, 'main'); 119 | const buffer = outputFs.readFileSync(filename); 120 | 121 | /** 122 | * Delete all methods/publications that are set 123 | * by the code itself (e.g: anything defined by the developer) 124 | * so it can be re-injected on each hot-push, 125 | * but keep all handlers that are set by external packages 126 | * because they get injeted only on a "full" restart to the server. 127 | 128 | * For example if a publication is updated (Meteor.publish('todos')), 129 | * HMR cannot inject new publication without removing the existing one. 130 | */ 131 | 132 | // Define a key that is likely to stay unique 133 | const handlersCache = '____webpack_handlers_cache_____' 134 | const handlers = Meteor.server[handlersCache] 135 | 136 | if (!handlers) { 137 | // This code will run only upon a "full" restart. 138 | // On this time, the handlers contains only methods/publications 139 | // that were set by external packages. 140 | 141 | // We cant store the functions (passed by reference) so store the keys and check for existence later. 142 | const oldMethodHandlers = Object.keys(Meteor.server.method_handlers) 143 | const oldPublishHandlers = Object.keys(Meteor.server.publish_handlers) 144 | 145 | Meteor.server[handlersCache] = { 146 | methods: oldMethodHandlers, 147 | publications: oldPublishHandlers 148 | } 149 | 150 | } else { 151 | // If we already cached the "constant" handlers, keep them and delete the rest 152 | 153 | for (const methodHandlerName in Meteor.server.method_handlers) { 154 | if (!handlers.methods.includes(methodHandlerName)) { 155 | delete Meteor.server.method_handlers[methodHandlerName] 156 | } 157 | } 158 | 159 | for (const publishHandlerName in Meteor.server.publish_handlers) { 160 | if (!handlers.publications.includes(publishHandlerName)) { 161 | delete Meteor.server.publish_handlers[publishHandlerName] 162 | } 163 | } 164 | } 165 | 166 | try { 167 | const requireFromString = Npm.require('require-from-string'); 168 | interopRequireDefault( 169 | requireFromString(buffer.toString(), filename) 170 | ); 171 | } catch (e) { 172 | console.log(e) 173 | } finally { 174 | // Iterate across opened sessions 175 | for (const sessionId in Meteor.server.sessions) { 176 | if (!Meteor.server.sessions.hasOwnProperty(sessionId)) { 177 | continue; 178 | } 179 | 180 | // Reverted back flag to initial value 181 | Meteor.server.sessions[sessionId].workerRunning = false; 182 | // To replay cached messages need to send on processing some fake message 183 | Meteor.server.sessions[sessionId].processMessage({msg: 'test'}); 184 | } 185 | } 186 | }; 187 | 188 | if (multiCompiler.hooks) { 189 | // Webpack 4 190 | multiCompiler.hooks.done.tap('WebpackHotServerMiddleware', Meteor.bindEnvironment(doneHandler)); 191 | } else { 192 | // Webpack 3 193 | multiCompiler.plugin('done', doneHandler); 194 | } 195 | 196 | return function (req, res, next) { 197 | next(); 198 | }; 199 | } 200 | 201 | function arrangeConfig(webpackConfig) { 202 | if (!(webpackConfig instanceof Array)) { 203 | webpackConfig = [webpackConfig]; 204 | } 205 | webpackConfig = webpackConfig.filter(singleWebpackConfig => singleWebpackConfig.devServer); 206 | for (const singleWebpackConfig of webpackConfig) { 207 | const webpackPackageJson = Npm.require(path.join(projectPath, 'node_modules/webpack/package.json')); 208 | if (webpackPackageJson.version.split('.')[0] > 3) { 209 | singleWebpackConfig.mode = 'development'; 210 | } 211 | singleWebpackConfig.context = projectPath; 212 | singleWebpackConfig.name = singleWebpackConfig.target == 'node' ? 'server' : 'client'; 213 | if (singleWebpackConfig.target !== 'node' && singleWebpackConfig.devServer && singleWebpackConfig.devServer.hot) { 214 | if (singleWebpackConfig.entry instanceof Array || typeof singleWebpackConfig.entry === 'string') { 215 | if (!(singleWebpackConfig.entry instanceof Array)) { 216 | singleWebpackConfig.entry = [singleWebpackConfig.entry]; 217 | } 218 | singleWebpackConfig.entry = { 219 | app: singleWebpackConfig.entry 220 | }; 221 | } 222 | //singleWebpackConfig.devServer.serverSideRender = true; 223 | for (const key in singleWebpackConfig.entry) { 224 | singleWebpackConfig.entry[key].push('webpack-hot-middleware/client?reload=true'); 225 | } 226 | } 227 | } 228 | return webpackConfig; 229 | } 230 | 231 | if (Meteor.isServer && Meteor.isDevelopment) { 232 | 233 | const webpack = Npm.require(path.join(projectPath, 'node_modules/webpack')) 234 | const webpackConfig = arrangeConfig(Npm.require(path.join(projectPath, WEBPACK_CONFIG_FILE))); 235 | 236 | if (webpackConfig.length) { 237 | const webpackDevMiddleware = Npm.require(path.join(projectPath, 'node_modules/webpack-dev-middleware')); 238 | 239 | const compiler = webpack(webpackConfig); 240 | // Tell Meteor to use the webpack-dev-middleware and use the webpack.config.js 241 | // configuration file as a base. 242 | const clientConfig = webpackConfig.find(singleWebpackConfig => (singleWebpackConfig.target !== 'node')) 243 | const clientCompiler = compiler.compilers.find(compiler => (compiler.name == 'client')); 244 | const serverConfig = webpackConfig.find(singleWebpackConfig => (singleWebpackConfig.target == 'node')) 245 | clientConfig.devServer.contentBase = clientConfig.devServer.contentBase || clientCompiler.outputPath; 246 | clientConfig.devServer.publicPath = clientConfig.devServer.publicPath || (clientConfig.output && clientConfig.output.publicPath); 247 | const HEAD_REGEX = /]*>((.|[\n\r])*)<\/head>/im 248 | const BODY_REGEX = /]*>((.|[\n\r])*)<\/body>/im; 249 | 250 | WebApp.rawConnectHandlers.use(webpackDevMiddleware(compiler, { 251 | index: false, 252 | ...clientConfig.devServer, 253 | })); 254 | 255 | let head 256 | let body 257 | let css = [] 258 | let js = [] 259 | 260 | WebAppInternals.registerBoilerplateDataCallback('meteor/ardatan:webpack', (req, data) => { 261 | data.dynamicHead = data.dynamicHead || ''; 262 | data.dynamicHead = head 263 | data.dynamicBody = data.dynamicBody || ''; 264 | data.dynamicBody = body 265 | if(DYNAMIC_ASSETS) { 266 | data.js = data.js.concat(js) 267 | data.css = data.css.concat(css) 268 | } 269 | }) 270 | 271 | if (clientConfig && clientConfig.devServer && clientConfig.devServer.hot) { 272 | const webpackHotMiddleware = Npm.require(path.join(projectPath, 'node_modules/webpack-hot-middleware')); 273 | WebApp.rawConnectHandlers.use(webpackHotMiddleware(clientCompiler)); 274 | } 275 | if (serverConfig && serverConfig.devServer && serverConfig.devServer.hot) { 276 | WebApp.rawConnectHandlers.use(Meteor.bindEnvironment(webpackHotServerMiddleware(compiler))); 277 | } 278 | 279 | // Cache the initial state of the Meteor server before the application code is executed 280 | // We can't cache the connect handlers, the old functions are linked to old resources in memory which may or may not exist anymore 281 | // We could clear them, but that would remove any functionality added by packages 282 | let loginHandlers = [] 283 | let validateNewUserHooks = [] 284 | let _validateLoginHookCallbacks 285 | let accountsOptions = {} 286 | let nullPublications = Array.from(Meteor.server.universal_publish_handlers) 287 | 288 | if(Package['accounts-base']) { 289 | const { Accounts } = Package['accounts-base'] 290 | accountsOptions = Object.assign({}, Accounts._options) 291 | loginHandlers = Array.from(Accounts._loginHandlers) 292 | validateNewUserHooks = Array.from(Accounts._validateNewUserHooks) 293 | _validateLoginHookCallbacks = Object.assign({}, Accounts._validateLoginHook.callbacks) 294 | } 295 | 296 | // Restore the state of the Meteor server ahead of hot module replacement 297 | function cleanServer() { 298 | Meteor.server.universal_publish_handlers = nullPublications 299 | if(Package['server-render']) { 300 | Package['server-render'].onPageLoad.clear() 301 | } 302 | if(Package['staringatlights:fast-render']) { 303 | const FastRender = Package['staringatlights:fast-render'].FastRender 304 | FastRender._onAllRoutes = [FastRender._onAllRoutes[0]] 305 | } 306 | if(Package['accounts-base']) { 307 | const { Accounts } = Package['accounts-base'] 308 | Accounts._loginHandlers = loginHandlers 309 | Accounts._validateNewUserHooks = validateNewUserHooks 310 | Accounts._options = Object.assign({}, accountsOptions) 311 | Accounts._validateLoginHook.callbacks = Object.assign({}, _validateLoginHookCallbacks) 312 | delete Accounts._onCreateUserHook 313 | } 314 | } 315 | 316 | let assets; 317 | if (clientCompiler.hooks.assetEmitted /* Webpack 5 */) { 318 | assets = {}; 319 | clientCompiler.hooks.assetEmitted.tap('meteor-webpack', (path, { content }) => { 320 | assets[path] = { source() { return content } }; 321 | }); 322 | } 323 | 324 | compiler.hooks.done.tap('meteor-webpack', ({ 325 | stats 326 | }) => { 327 | assets = (assets || stats[0].compilation.assets); 328 | const index = clientConfig.devServer.index || 'index.html' 329 | const publicPath = clientConfig.output && clientConfig.output.publicPath || '/' 330 | 331 | if(assets[index]) { 332 | const content = assets[index].source().toString('utf8').split(' src="').join(' defer src="'); 333 | head = HEAD_REGEX.exec(content)[1]; 334 | body = BODY_REGEX.exec(content)[1]; 335 | } 336 | 337 | // Optional Merging assets into Meteor boilerplate 338 | // Use with `inject: false` option on HtmlWebpackPlugin 339 | if(DYNAMIC_ASSETS) { 340 | css = [] 341 | js = [] 342 | Object.keys(assets).forEach(key => { 343 | const url = publicPath + key 344 | if(key.endsWith('.js')) { 345 | js.push({ url }) 346 | } else if(key.endsWith('.css')) { 347 | css.push({ url }) 348 | } 349 | }) 350 | } 351 | 352 | // Remove any whitespace at the end of the body or server-render will mangle the HTML output 353 | body = body.replace(/[\t\n\r\s]+$/, '') 354 | 355 | // Close all websockets so test runners monitoring the DDP connection (like Chimpy) know when to re-run 356 | if (Meteor.isTest || Meteor.isAppTest) { 357 | Meteor.server.stream_server.open_sockets.forEach(function(socket) { 358 | socket.close() 359 | }) 360 | } 361 | 362 | cleanServer() 363 | }); 364 | 365 | 366 | 367 | } 368 | 369 | } 370 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack-dev-middleware/package.js: -------------------------------------------------------------------------------- 1 | Package.describe({ 2 | name: 'ardatan:webpack-dev-middleware', 3 | debugOnly: true, 4 | version: '0.0.14', 5 | summary: 'Webpack Dev Middleware for Meteor', 6 | git: 'https://github.com/ardatan/meteor-webpack', 7 | documentation: '../../README.md' 8 | }); 9 | 10 | Package.onUse(function (api) { 11 | api.use('webapp@1.5.0', 'server'); 12 | api.addFiles('dev-server.js', 'server'); 13 | }); 14 | 15 | Npm.depends({ 16 | debug: "4.3.2", 17 | "source-map-support": "0.5.19", 18 | "require-from-string": "2.0.2" 19 | }); 20 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack/.npm/plugin/webpack/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack/.npm/plugin/webpack/README: -------------------------------------------------------------------------------- 1 | This directory and the files immediately inside it are automatically generated 2 | when you change this package's NPM dependencies. Commit the files in this 3 | directory (npm-shrinkwrap.json, .gitignore, and this README) to source control 4 | so that others run the same versions of sub-dependencies. 5 | 6 | You should NOT check in the node_modules directory that Meteor automatically 7 | creates; if you are using git, the .gitignore file tells git to ignore it. 8 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack/.npm/plugin/webpack/npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1, 3 | "dependencies": { 4 | "abab": { 5 | "version": "1.0.4", 6 | "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", 7 | "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" 8 | }, 9 | "acorn": { 10 | "version": "5.5.3", 11 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", 12 | "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" 13 | }, 14 | "acorn-globals": { 15 | "version": "4.1.0", 16 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", 17 | "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==" 18 | }, 19 | "ajv": { 20 | "version": "5.5.2", 21 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 22 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=" 23 | }, 24 | "array-equal": { 25 | "version": "1.0.0", 26 | "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", 27 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 28 | }, 29 | "asn1": { 30 | "version": "0.2.3", 31 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 32 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 33 | }, 34 | "assert-plus": { 35 | "version": "1.0.0", 36 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 37 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 38 | }, 39 | "async-limiter": { 40 | "version": "1.0.0", 41 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 42 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 43 | }, 44 | "asynckit": { 45 | "version": "0.4.0", 46 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 47 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 48 | }, 49 | "aws-sign2": { 50 | "version": "0.7.0", 51 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 52 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 53 | }, 54 | "aws4": { 55 | "version": "1.6.0", 56 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 57 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 58 | }, 59 | "bcrypt-pbkdf": { 60 | "version": "1.0.1", 61 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 62 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=" 63 | }, 64 | "boom": { 65 | "version": "4.3.1", 66 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 67 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=" 68 | }, 69 | "browser-process-hrtime": { 70 | "version": "0.1.2", 71 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", 72 | "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=" 73 | }, 74 | "caseless": { 75 | "version": "0.12.0", 76 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 77 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 78 | }, 79 | "co": { 80 | "version": "4.6.0", 81 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 82 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 83 | }, 84 | "combined-stream": { 85 | "version": "1.0.6", 86 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 87 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=" 88 | }, 89 | "content-type-parser": { 90 | "version": "1.0.2", 91 | "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", 92 | "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==" 93 | }, 94 | "core-util-is": { 95 | "version": "1.0.2", 96 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 97 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 98 | }, 99 | "cryptiles": { 100 | "version": "3.1.2", 101 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 102 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 103 | "dependencies": { 104 | "boom": { 105 | "version": "5.2.0", 106 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 107 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==" 108 | } 109 | } 110 | }, 111 | "cssom": { 112 | "version": "0.3.2", 113 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", 114 | "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" 115 | }, 116 | "cssstyle": { 117 | "version": "0.2.37", 118 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", 119 | "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=" 120 | }, 121 | "dashdash": { 122 | "version": "1.14.1", 123 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 124 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=" 125 | }, 126 | "deep-is": { 127 | "version": "0.1.3", 128 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 129 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 130 | }, 131 | "delayed-stream": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 134 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 135 | }, 136 | "domexception": { 137 | "version": "1.0.1", 138 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", 139 | "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==" 140 | }, 141 | "ecc-jsbn": { 142 | "version": "0.1.1", 143 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 144 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=" 145 | }, 146 | "errno": { 147 | "version": "0.1.7", 148 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", 149 | "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==" 150 | }, 151 | "escodegen": { 152 | "version": "1.9.1", 153 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", 154 | "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==" 155 | }, 156 | "esprima": { 157 | "version": "3.1.3", 158 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 159 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 160 | }, 161 | "estraverse": { 162 | "version": "4.2.0", 163 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 164 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 165 | }, 166 | "esutils": { 167 | "version": "2.0.2", 168 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 169 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 170 | }, 171 | "extend": { 172 | "version": "3.0.1", 173 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 174 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 175 | }, 176 | "extsprintf": { 177 | "version": "1.3.0", 178 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 179 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 180 | }, 181 | "fast-deep-equal": { 182 | "version": "1.1.0", 183 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 184 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 185 | }, 186 | "fast-json-stable-stringify": { 187 | "version": "2.0.0", 188 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 189 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 190 | }, 191 | "fast-levenshtein": { 192 | "version": "2.0.6", 193 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 194 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 195 | }, 196 | "forever-agent": { 197 | "version": "0.6.1", 198 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 199 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 200 | }, 201 | "form-data": { 202 | "version": "2.3.2", 203 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 204 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=" 205 | }, 206 | "getpass": { 207 | "version": "0.1.7", 208 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 209 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=" 210 | }, 211 | "har-schema": { 212 | "version": "2.0.0", 213 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 214 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 215 | }, 216 | "har-validator": { 217 | "version": "5.0.3", 218 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 219 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=" 220 | }, 221 | "hawk": { 222 | "version": "6.0.2", 223 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 224 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==" 225 | }, 226 | "hoek": { 227 | "version": "4.2.1", 228 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", 229 | "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" 230 | }, 231 | "html-encoding-sniffer": { 232 | "version": "1.0.2", 233 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", 234 | "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==" 235 | }, 236 | "http-signature": { 237 | "version": "1.2.0", 238 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 239 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=" 240 | }, 241 | "iconv-lite": { 242 | "version": "0.4.19", 243 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 244 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 245 | }, 246 | "inherits": { 247 | "version": "2.0.3", 248 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 249 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 250 | }, 251 | "is-typedarray": { 252 | "version": "1.0.0", 253 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 254 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 255 | }, 256 | "isarray": { 257 | "version": "1.0.0", 258 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 259 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 260 | }, 261 | "isstream": { 262 | "version": "0.1.2", 263 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 264 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 265 | }, 266 | "jsbn": { 267 | "version": "0.1.1", 268 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 269 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 270 | }, 271 | "jsdom": { 272 | "version": "11.6.2", 273 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz", 274 | "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==" 275 | }, 276 | "json-schema": { 277 | "version": "0.2.3", 278 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 279 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 280 | }, 281 | "json-schema-traverse": { 282 | "version": "0.3.1", 283 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 284 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 285 | }, 286 | "json-stringify-safe": { 287 | "version": "5.0.1", 288 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 289 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 290 | }, 291 | "jsprim": { 292 | "version": "1.4.1", 293 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 294 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=" 295 | }, 296 | "left-pad": { 297 | "version": "1.2.0", 298 | "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz", 299 | "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=" 300 | }, 301 | "levn": { 302 | "version": "0.3.0", 303 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 304 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=" 305 | }, 306 | "lodash": { 307 | "version": "4.17.5", 308 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 309 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" 310 | }, 311 | "lodash.sortby": { 312 | "version": "4.7.0", 313 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 314 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 315 | }, 316 | "memory-fs": { 317 | "version": "0.4.1", 318 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", 319 | "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=" 320 | }, 321 | "mime-db": { 322 | "version": "1.33.0", 323 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 324 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 325 | }, 326 | "mime-types": { 327 | "version": "2.1.18", 328 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 329 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==" 330 | }, 331 | "nwmatcher": { 332 | "version": "1.4.3", 333 | "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", 334 | "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==" 335 | }, 336 | "oauth-sign": { 337 | "version": "0.8.2", 338 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 339 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 340 | }, 341 | "optionator": { 342 | "version": "0.8.2", 343 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 344 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=" 345 | }, 346 | "parse5": { 347 | "version": "4.0.0", 348 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", 349 | "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" 350 | }, 351 | "performance-now": { 352 | "version": "2.1.0", 353 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 354 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 355 | }, 356 | "pn": { 357 | "version": "1.1.0", 358 | "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", 359 | "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" 360 | }, 361 | "prelude-ls": { 362 | "version": "1.1.2", 363 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 364 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 365 | }, 366 | "process-nextick-args": { 367 | "version": "2.0.0", 368 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 369 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 370 | }, 371 | "prr": { 372 | "version": "1.0.1", 373 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 374 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" 375 | }, 376 | "punycode": { 377 | "version": "1.4.1", 378 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 379 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 380 | }, 381 | "qs": { 382 | "version": "6.5.1", 383 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 384 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 385 | }, 386 | "readable-stream": { 387 | "version": "2.3.5", 388 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", 389 | "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==" 390 | }, 391 | "request": { 392 | "version": "2.85.0", 393 | "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", 394 | "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==" 395 | }, 396 | "request-promise-core": { 397 | "version": "1.1.1", 398 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 399 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=" 400 | }, 401 | "request-promise-native": { 402 | "version": "1.0.5", 403 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", 404 | "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=" 405 | }, 406 | "require-from-string": { 407 | "version": "2.0.1", 408 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", 409 | "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=" 410 | }, 411 | "safe-buffer": { 412 | "version": "5.1.1", 413 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 414 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 415 | }, 416 | "sax": { 417 | "version": "1.2.4", 418 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 419 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 420 | }, 421 | "sntp": { 422 | "version": "2.1.0", 423 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 424 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==" 425 | }, 426 | "source-map": { 427 | "version": "0.6.1", 428 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 429 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 430 | }, 431 | "sshpk": { 432 | "version": "1.14.1", 433 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", 434 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=" 435 | }, 436 | "stealthy-require": { 437 | "version": "1.1.1", 438 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 439 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 440 | }, 441 | "string_decoder": { 442 | "version": "1.0.3", 443 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 444 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==" 445 | }, 446 | "stringstream": { 447 | "version": "0.0.5", 448 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 449 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 450 | }, 451 | "symbol-tree": { 452 | "version": "3.2.2", 453 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", 454 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 455 | }, 456 | "tough-cookie": { 457 | "version": "2.3.4", 458 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 459 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==" 460 | }, 461 | "tr46": { 462 | "version": "1.0.1", 463 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 464 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", 465 | "dependencies": { 466 | "punycode": { 467 | "version": "2.1.0", 468 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", 469 | "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" 470 | } 471 | } 472 | }, 473 | "tunnel-agent": { 474 | "version": "0.6.0", 475 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 476 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" 477 | }, 478 | "tweetnacl": { 479 | "version": "0.14.5", 480 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 481 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 482 | }, 483 | "type-check": { 484 | "version": "0.3.2", 485 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 486 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=" 487 | }, 488 | "util-deprecate": { 489 | "version": "1.0.2", 490 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 491 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 492 | }, 493 | "uuid": { 494 | "version": "3.2.1", 495 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 496 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 497 | }, 498 | "verror": { 499 | "version": "1.10.0", 500 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 501 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=" 502 | }, 503 | "w3c-hr-time": { 504 | "version": "1.0.1", 505 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", 506 | "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=" 507 | }, 508 | "webidl-conversions": { 509 | "version": "4.0.2", 510 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 511 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" 512 | }, 513 | "whatwg-encoding": { 514 | "version": "1.0.3", 515 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", 516 | "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==" 517 | }, 518 | "whatwg-url": { 519 | "version": "6.4.0", 520 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", 521 | "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==" 522 | }, 523 | "wordwrap": { 524 | "version": "1.0.0", 525 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 526 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 527 | }, 528 | "ws": { 529 | "version": "4.1.0", 530 | "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", 531 | "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==" 532 | }, 533 | "xml-name-validator": { 534 | "version": "3.0.0", 535 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", 536 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" 537 | } 538 | } 539 | } 540 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack/.versions: -------------------------------------------------------------------------------- 1 | ardatan:webpack@0.0.14 2 | meteor@1.9.3 3 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack/package.js: -------------------------------------------------------------------------------- 1 | Package.describe({ 2 | name: 'ardatan:webpack', 3 | version: '0.0.14', 4 | summary: 'Webpack Integration for Meteor', 5 | git: 'https://github.com/ardatan/meteor-webpack', 6 | documentation: '../../README.md' 7 | }); 8 | 9 | Package.registerBuildPlugin({ 10 | name: 'webpack', 11 | sources: ['plugin.js'], 12 | npmDependencies: { 13 | "jsdom": "11.6.2", 14 | "memory-fs": "0.4.1", 15 | "require-from-string": "2.0.1" 16 | } 17 | }); 18 | 19 | Package.onUse(function (api) { 20 | api.use('isobuild:compiler-plugin@1.0.0', 'server'); 21 | }); 22 | -------------------------------------------------------------------------------- /atmosphere-packages/webpack/plugin.js: -------------------------------------------------------------------------------- 1 | const WEBPACK_CONFIG_FILE = process.env.WEBPACK_CONFIG_FILE || 'webpack.config.js'; 2 | const ENABLE_LEGACY_BUILD = process.env.ENABLE_LEGACY_BUILD || false; 3 | Plugin.registerCompiler({ 4 | extensions: ['js', 'jsx', 'ts', 'tsx', 'html'], 5 | }, function () { 6 | 7 | const path = Npm.require('path'); 8 | const requireFromString = Npm.require('require-from-string'); 9 | let webpack; 10 | try { 11 | webpack = Npm.require('webpack'); 12 | } catch (e) { 13 | console.log('You have to install webpack to use this package!') 14 | } 15 | const MemoryFS = Npm.require('memory-fs'); 16 | const mfs = new MemoryFS(); 17 | const { 18 | JSDOM 19 | } = Npm.require('jsdom'); 20 | const compilerCache = { 21 | sourceHashes: {} 22 | }; 23 | return { 24 | 25 | constructNewCompilerForTarget(compilerCache, targetPlatform, targetFile) { 26 | let allWebpackConfigs = requireFromString(targetFile.getContentsAsString(), path.join(process.cwd(), './' + targetFile.getPathInPackage()), { 27 | prependPaths: [process.cwd()] 28 | }); 29 | if (!(allWebpackConfigs instanceof Array)) { 30 | allWebpackConfigs = [allWebpackConfigs]; 31 | } 32 | 33 | const webpackConfig = allWebpackConfigs.find(webpackConfig => { 34 | if (webpackConfig.target) { 35 | if (webpackConfig.target == targetPlatform) { 36 | return true; 37 | } else { 38 | return false; 39 | } 40 | } else if (targetPlatform == 'web') { 41 | return true; 42 | } 43 | }) 44 | 45 | if (process.env.NODE_ENV !== 'production' && webpackConfig.devServer) { 46 | compilerCache[targetPlatform] = null; 47 | return false; 48 | } 49 | 50 | if (webpackConfig) { 51 | const webpackPackageJson = Npm.require('webpack/package.json'); 52 | if (webpackPackageJson.version.split('.')[0] > 3) { 53 | webpackConfig.mode = process.env.NODE_ENV == 'production' ? 'production' : 'development'; 54 | } 55 | compilerCache[targetPlatform] = webpack(webpackConfig); 56 | compilerCache[targetPlatform].outputFileSystem = mfs; 57 | return true; 58 | } 59 | }, 60 | processFilesForTarget(inputFiles) { 61 | 62 | //Find Webpack Configuration File 63 | const targetFile = inputFiles.find(inputFile => inputFile.getPathInPackage().endsWith(WEBPACK_CONFIG_FILE)); 64 | //Get source hash in order to check if configuration is changed. 65 | const sourceHash = targetFile.getSourceHash(); 66 | 67 | // Disable legacy builds in development 68 | const arch = targetFile.getArch() 69 | if(arch === 'web.browser.legacy' && !ENABLE_LEGACY_BUILD && process.env.NODE_ENV === 'development') { 70 | return 71 | } 72 | 73 | const targetPlatform = targetFile.getArch().includes('web') ? 'web' : 'node'; 74 | 75 | //If source hash doesn't match the previous hash, clean the cache. 76 | if (compilerCache.sourceHashes[targetPlatform] !== sourceHash) { 77 | compilerCache.sourceHashes[targetPlatform] == sourceHash; 78 | delete compilerCache[targetPlatform]; 79 | } 80 | 81 | if (!compilerCache[targetPlatform] && 82 | !this.constructNewCompilerForTarget(compilerCache, targetPlatform, targetFile)) { 83 | return; 84 | } 85 | 86 | const compiler = compilerCache[targetPlatform]; 87 | 88 | let assets; 89 | const { 90 | compilation 91 | } = new Promise((resolve, reject) => { 92 | if (compiler.hooks.assetEmitted /* Webpack 5 */) { 93 | assets = {}; 94 | compiler.hooks.assetEmitted.tap('meteor-webpack', (path, { content }) => { 95 | assets[path] = { source() { return content } }; 96 | }); 97 | } 98 | compiler.hooks.done.tap('meteor-webpack', resolve) 99 | compiler.run((err, stats) => { 100 | if (err) { 101 | reject(err); 102 | } 103 | if (stats) { 104 | console.log(stats.toString({ 105 | colors: true 106 | })); 107 | } 108 | }); 109 | }).await(); 110 | 111 | assets = (assets || compilation.assets); 112 | 113 | const existsIndexHtml = 'index.html' in assets; 114 | let indexDoc; 115 | const jsFiles = {}; 116 | for (const path in assets) { 117 | const asset = assets[path]; 118 | const source = asset.source(); 119 | if (existsIndexHtml) { 120 | const data = source.toString('utf8'); 121 | if (path.endsWith('index.html')) { 122 | const { 123 | window: { 124 | document 125 | } 126 | } = new JSDOM(data); 127 | indexDoc = document; 128 | } else if (path.endsWith('.js')) { 129 | jsFiles[path] = { 130 | main: false, 131 | data: source.toString('utf8') 132 | }; 133 | } else { 134 | targetFile.addAsset({ 135 | path, 136 | data: source 137 | }); 138 | } 139 | } else { 140 | if (path.endsWith('.js')) { 141 | let data = source.toString('utf8'); 142 | if (targetPlatform == 'node') { 143 | data = 'const require = Npm.require;' + data; 144 | } 145 | targetFile.addJavaScript({ 146 | path, 147 | data, 148 | bare: true 149 | }); 150 | } else if (path.endsWith('.css')) { 151 | const data = source.toString('utf8'); 152 | targetFile.addStylesheet({ 153 | path, 154 | data 155 | }) 156 | } else { 157 | targetFile.addAsset({ 158 | path, 159 | data: source 160 | }); 161 | } 162 | } 163 | 164 | } 165 | if (existsIndexHtml) { 166 | const scriptElems = indexDoc.querySelectorAll('script[src]'); 167 | let cnt = -1; 168 | for (const scriptElem of scriptElems) { 169 | const srcPath = scriptElem.src; 170 | for (const path in jsFiles) { 171 | if (srcPath.includes(path)) { 172 | jsFiles[path].main = true; 173 | scriptElem.remove(); 174 | } 175 | } 176 | } 177 | for (const path in jsFiles) { 178 | const { 179 | main, 180 | data 181 | } = jsFiles[path]; 182 | if (main) { 183 | targetFile.addJavaScript({ 184 | path, 185 | data, 186 | bare: true 187 | }); 188 | } else { 189 | targetFile.addAsset({ 190 | path, 191 | data 192 | }); 193 | } 194 | } 195 | targetFile.addHtml({ 196 | data: indexDoc.head.innerHTML, 197 | section: 'head' 198 | }); 199 | targetFile.addHtml({ 200 | data: indexDoc.body.innerHTML, 201 | section: 'body' 202 | }); 203 | } 204 | 205 | 206 | } 207 | } 208 | }); 209 | -------------------------------------------------------------------------------- /examples/angular/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /examples/angular/.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | 1.3.0-split-minifiers-package 14 | 1.4.0-remove-old-dev-bundle-link 15 | 1.4.1-add-shell-server-package 16 | 1.4.3-split-account-service-packages 17 | 1.5-add-dynamic-import-package 18 | 1.7-split-underscore-from-meteor-base 19 | 1.8.3-split-jquery-from-blaze 20 | -------------------------------------------------------------------------------- /examples/angular/.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /examples/angular/.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | hhprphd5g9pk.zi4eqngh9jzs 8 | -------------------------------------------------------------------------------- /examples/angular/.meteor/packages: -------------------------------------------------------------------------------- 1 | # Meteor packages used by this project, one per line. 2 | # Check this file (and the other files in this directory) into your repository. 3 | # 4 | # 'meteor add' and 'meteor remove' will edit this file for you, 5 | # but you can also edit it by hand. 6 | 7 | meteor-base@1.5.1 # Packages every Meteor app needs to have 8 | mobile-experience@1.1.0 # Packages for a great mobile UX 9 | mongo@1.12.0 # The database Meteor supports right now 10 | 11 | standard-minifier-css@1.7.3 # CSS minifier run for production mode 12 | standard-minifier-js@2.6.1 # JS minifier run for production mode 13 | 14 | ardatan:webpack 15 | ardatan:webpack-dev-middleware 16 | -------------------------------------------------------------------------------- /examples/angular/.meteor/platforms: -------------------------------------------------------------------------------- 1 | server 2 | browser 3 | -------------------------------------------------------------------------------- /examples/angular/.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@2.3.4 2 | -------------------------------------------------------------------------------- /examples/angular/.meteor/versions: -------------------------------------------------------------------------------- 1 | allow-deny@1.1.0 2 | ardatan:webpack@0.0.13 3 | ardatan:webpack-dev-middleware@0.0.13 4 | autoupdate@1.7.0 5 | babel-compiler@7.6.2 6 | babel-runtime@1.5.0 7 | base64@1.0.12 8 | binary-heap@1.0.11 9 | boilerplate-generator@1.7.1 10 | callback-hook@1.3.1 11 | check@1.3.1 12 | ddp@1.4.0 13 | ddp-client@2.5.0 14 | ddp-common@1.4.0 15 | ddp-server@2.4.0 16 | diff-sequence@1.1.1 17 | dynamic-import@0.7.1 18 | ecmascript@0.15.2 19 | ecmascript-runtime@0.7.0 20 | ecmascript-runtime-client@0.11.1 21 | ecmascript-runtime-server@0.10.1 22 | ejson@1.1.1 23 | es5-shim@4.8.0 24 | fetch@0.1.1 25 | geojson-utils@1.0.10 26 | hot-code-push@1.0.4 27 | id-map@1.1.1 28 | inter-process-messaging@0.1.1 29 | launch-screen@1.3.0 30 | logging@1.2.0 31 | meteor@1.9.3 32 | meteor-base@1.5.1 33 | minifier-css@1.5.4 34 | minifier-js@2.6.1 35 | minimongo@1.7.0 36 | mobile-experience@1.1.0 37 | mobile-status-bar@1.1.0 38 | modern-browsers@0.1.5 39 | modules@0.16.0 40 | modules-runtime@0.12.0 41 | mongo@1.12.0 42 | mongo-decimal@0.1.2 43 | mongo-dev-server@1.1.0 44 | mongo-id@1.0.8 45 | npm-mongo@3.9.1 46 | ordered-dict@1.1.0 47 | promise@0.12.0 48 | random@1.2.0 49 | react-fast-refresh@0.1.1 50 | reload@1.3.1 51 | retry@1.1.0 52 | routepolicy@1.1.1 53 | socket-stream-client@0.4.0 54 | standard-minifier-css@1.7.3 55 | standard-minifier-js@2.6.1 56 | tracker@1.2.0 57 | underscore@1.0.10 58 | webapp@1.11.1 59 | webapp-hashing@1.1.0 60 | -------------------------------------------------------------------------------- /examples/angular/.meteorignore: -------------------------------------------------------------------------------- 1 | * 2 | !.meteor/ 3 | !node_modules/ 4 | !webpack.config.js 5 | -------------------------------------------------------------------------------- /examples/angular/client/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { Observable } from 'rxjs/Observable'; 3 | import { switchMap } from 'rxjs/operators'; 4 | import { Todo } from '../../imports/todo'; 5 | 6 | import { MeteorObservable } from 'meteor-rxjs'; 7 | import { Todos } from '../../imports/todos'; 8 | 9 | @Component({ 10 | selector: 'app', 11 | templateUrl: './app.html' 12 | }) 13 | export class AppComponent implements OnInit { 14 | newTodoValue: string; 15 | todos: Observable; 16 | greeting: Observable; 17 | ngOnInit() { 18 | this.todos = MeteorObservable.subscribe('todos').pipe(switchMap(() => Todos.find())); 19 | this.greeting = MeteorObservable.call('greeting'); 20 | } 21 | addTodo(todoValue) { 22 | Meteor.call('addTodo', todoValue); 23 | } 24 | removeTodo(todoId) { 25 | Meteor.call('removeTodo', todoId); 26 | } 27 | } -------------------------------------------------------------------------------- /examples/angular/client/app/app.html: -------------------------------------------------------------------------------- 1 |

{{greeting | async}}

2 |
3 | 4 | 5 |
6 |
    7 |
  • 8 | {{todo.value}} 9 | 12 |
  • 13 |
-------------------------------------------------------------------------------- /examples/angular/client/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { NgModule } from '@angular/core'; 4 | import { AppComponent } from './app.component'; 5 | 6 | @NgModule({ 7 | imports: [ 8 | BrowserModule, 9 | FormsModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | bootstrap: [ 15 | AppComponent 16 | ] 17 | }) 18 | export class AppModule { } -------------------------------------------------------------------------------- /examples/angular/client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Meteor Angular Example 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /examples/angular/client/index.ts: -------------------------------------------------------------------------------- 1 | import 'zone.js/dist/zone'; 2 | import { Meteor } from 'meteor/meteor'; 3 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 4 | import { AppModule } from './app/app.module'; 5 | import { enableProdMode } from '@angular/core'; 6 | 7 | Meteor.startup(() => { 8 | if(Meteor.isProduction){ 9 | enableProdMode(); 10 | } 11 | platformBrowserDynamic().bootstrapModule(AppModule); 12 | }); -------------------------------------------------------------------------------- /examples/angular/imports/todo.ts: -------------------------------------------------------------------------------- 1 | export interface Todo { 2 | _id?: string; 3 | value: string; 4 | } -------------------------------------------------------------------------------- /examples/angular/imports/todos.ts: -------------------------------------------------------------------------------- 1 | import { MongoObservable } from 'meteor-rxjs'; 2 | import { Todo } from './todo'; 3 | 4 | export const Todos = new MongoObservable.Collection('todos'); -------------------------------------------------------------------------------- /examples/angular/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular", 3 | "private": true, 4 | "scripts": { 5 | "start": "meteor run" 6 | }, 7 | "dependencies": { 8 | "@angular/common": "^5.2.9", 9 | "@angular/compiler": "^5.2.9", 10 | "@angular/compiler-cli": "^5.2.9", 11 | "@angular/core": "^5.2.9", 12 | "@angular/forms": "^5.2.9", 13 | "@angular/platform-browser": "^5.2.9", 14 | "@angular/platform-browser-dynamic": "^5.2.9", 15 | "@babel/runtime": "^7.0.0-beta.36", 16 | "meteor-node-stubs": "^0.3.2", 17 | "meteor-rxjs": "^0.4.8", 18 | "rxjs": "^5.5.7", 19 | "zone.js": "^0.8.20" 20 | }, 21 | "devDependencies": { 22 | "@ngtools/webpack": "^1.10.2", 23 | "@types/meteor": "^1.4.13", 24 | "fork-ts-checker-webpack-plugin": "^0.4.1", 25 | "html-webpack-plugin": "^3.0.7", 26 | "raw-loader": "^0.5.1", 27 | "ts-loader": "^4.1.0", 28 | "typescript": "2.4.2", 29 | "webpack": "^4.2.0", 30 | "webpack-dev-middleware": "^3.0.1", 31 | "webpack-meteor-externals": "0.0.4", 32 | "webpack-node-externals": "^1.7.2" 33 | } 34 | } -------------------------------------------------------------------------------- /examples/angular/server/addTodo.ts: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | import { Todos } from '../imports/todos'; 3 | 4 | Meteor.methods({ 5 | addTodo(todoValue) { 6 | Todos.insert({ 7 | value: todoValue 8 | }); 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /examples/angular/server/greeting.ts: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | 3 | Meteor.methods({ 4 | greeting() { 5 | return 'Hello From Meteor Method!'; 6 | } 7 | }) -------------------------------------------------------------------------------- /examples/angular/server/index.ts: -------------------------------------------------------------------------------- 1 | import './addTodo'; 2 | import './removeTodo'; 3 | import './todos'; 4 | import './greeting'; 5 | console.log('Hello World from Server'); -------------------------------------------------------------------------------- /examples/angular/server/removeTodo.ts: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | import { Todos } from '../imports/todos'; 3 | 4 | Meteor.methods({ 5 | removeTodo(todoId) { 6 | Todos.remove({ 7 | _id: todoId 8 | }); 9 | } 10 | }) -------------------------------------------------------------------------------- /examples/angular/server/todos.ts: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | import { Todos } from '../imports/todos'; 3 | 4 | Meteor.publish('todos', function () { 5 | return Todos.find(); 6 | }) -------------------------------------------------------------------------------- /examples/angular/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "sourceMap": true, 5 | "noImplicitAny": false, 6 | "module": "es2015", 7 | "moduleResolution": "node", 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "lib": [ 11 | "es2017", 12 | "dom" 13 | ], 14 | "types": [ 15 | "@types/meteor" 16 | ] 17 | } 18 | } -------------------------------------------------------------------------------- /examples/angular/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const { 4 | AngularCompilerPlugin 5 | } = require('@ngtools/webpack'); 6 | const webpack = require('webpack'); 7 | const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); 8 | const meteorExternals = require('webpack-meteor-externals'); 9 | const nodeExternals = require('webpack-node-externals'); 10 | 11 | const projectPath = path.resolve('.').split(path.sep + '.meteor')[0]; 12 | 13 | const clientConfig = { 14 | entry: './client/index.ts', 15 | devtool: 'nosources-source-map', 16 | devServer: { 17 | historyApiFallback: true 18 | }, 19 | module: { 20 | rules: [{ 21 | "test": /\.html$/, 22 | "loader": "raw-loader" 23 | }, 24 | { 25 | test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, 26 | loader: '@ngtools/webpack' 27 | } 28 | ] 29 | }, 30 | plugins: [ 31 | new AngularCompilerPlugin({ 32 | tsConfigPath: path.join(projectPath, './tsconfig.json'), 33 | mainPath: path.join(projectPath, './client/index.ts'), 34 | entryModule: path.join(projectPath, './client/app/app.module#AppModule'), 35 | sourceMap: true, 36 | skipCodeGeneration: process.env.NODE_ENV !== 'production' 37 | }), 38 | new HtmlWebpackPlugin({ 39 | template: './client/index.html' 40 | }), 41 | new webpack.ProgressPlugin() 42 | ], 43 | externals: [ 44 | meteorExternals() 45 | ], 46 | resolve: { 47 | extensions: ['.tsx', '.ts', '.js'] 48 | } 49 | }; 50 | const serverConfig = { 51 | entry: './server/index.ts', 52 | target: 'node', 53 | module: { 54 | rules: [{ 55 | test: /\.tsx?$/, 56 | loader: 'ts-loader', 57 | options: { 58 | transpileOnly: true, 59 | happyPackMode: true 60 | }, 61 | exclude: /node_modules/ 62 | }] 63 | }, 64 | resolve: { 65 | extensions: ['.tsx', '.ts', '.js'] 66 | }, 67 | plugins: [ 68 | new ForkTsCheckerWebpackPlugin(), 69 | new webpack.ProgressPlugin() 70 | ], 71 | externals: [ 72 | meteorExternals(), 73 | nodeExternals() 74 | ], 75 | devServer: { 76 | hot: true 77 | } 78 | } 79 | module.exports = [clientConfig, serverConfig]; -------------------------------------------------------------------------------- /examples/react/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "env", 4 | "react", 5 | "stage-2" 6 | ], 7 | "plugins": ["react-hot-loader/babel"] 8 | } -------------------------------------------------------------------------------- /examples/react/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.log -------------------------------------------------------------------------------- /examples/react/.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | 1.3.0-split-minifiers-package 14 | 1.4.0-remove-old-dev-bundle-link 15 | 1.4.1-add-shell-server-package 16 | 1.4.3-split-account-service-packages 17 | 1.5-add-dynamic-import-package 18 | 1.7-split-underscore-from-meteor-base 19 | 1.8.3-split-jquery-from-blaze 20 | -------------------------------------------------------------------------------- /examples/react/.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /examples/react/.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | rh08ovagj8lq.jq1vas19qru 8 | -------------------------------------------------------------------------------- /examples/react/.meteor/packages: -------------------------------------------------------------------------------- 1 | # Meteor packages used by this project, one per line. 2 | # Check this file (and the other files in this directory) into your repository. 3 | # 4 | # 'meteor add' and 'meteor remove' will edit this file for you, 5 | # but you can also edit it by hand. 6 | 7 | meteor-base@1.5.1 # Packages every Meteor app needs to have 8 | mobile-experience@1.1.0 # Packages for a great mobile UX 9 | mongo@1.12.0 # The database Meteor supports right now 10 | reactive-var@1.0.11 # Reactive variable for tracker 11 | tracker@1.2.0 # Meteor's client-side reactive programming library 12 | 13 | standard-minifier-css@1.7.3 # CSS minifier run for production mode 14 | standard-minifier-js@2.6.1 # JS minifier run for production mode 15 | shell-server@0.5.0 # Server-side component of the `meteor shell` command 16 | 17 | ardatan:webpack 18 | ardatan:webpack-dev-middleware 19 | 20 | react-meteor-data 21 | accounts-ui@1.4.0 22 | accounts-password@2.0.0 23 | -------------------------------------------------------------------------------- /examples/react/.meteor/platforms: -------------------------------------------------------------------------------- 1 | server 2 | browser 3 | -------------------------------------------------------------------------------- /examples/react/.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@2.3.4 2 | -------------------------------------------------------------------------------- /examples/react/.meteor/versions: -------------------------------------------------------------------------------- 1 | accounts-base@2.0.0 2 | accounts-password@2.0.0 3 | accounts-ui@1.4.0 4 | accounts-ui-unstyled@1.5.0 5 | allow-deny@1.1.0 6 | ardatan:webpack@0.0.13 7 | ardatan:webpack-dev-middleware@0.0.13 8 | autoupdate@1.7.0 9 | babel-compiler@7.6.2 10 | babel-runtime@1.5.0 11 | base64@1.0.12 12 | binary-heap@1.0.11 13 | blaze@2.5.0 14 | blaze-tools@1.1.2 15 | boilerplate-generator@1.7.1 16 | caching-compiler@1.2.2 17 | caching-html-compiler@1.2.1 18 | callback-hook@1.3.1 19 | check@1.3.1 20 | ddp@1.4.0 21 | ddp-client@2.5.0 22 | ddp-common@1.4.0 23 | ddp-rate-limiter@1.1.0 24 | ddp-server@2.4.0 25 | diff-sequence@1.1.1 26 | dynamic-import@0.7.1 27 | ecmascript@0.15.2 28 | ecmascript-runtime@0.7.0 29 | ecmascript-runtime-client@0.11.1 30 | ecmascript-runtime-server@0.10.1 31 | ejson@1.1.1 32 | email@2.1.1 33 | es5-shim@4.8.0 34 | fetch@0.1.1 35 | geojson-utils@1.0.10 36 | hot-code-push@1.0.4 37 | html-tools@1.1.2 38 | htmljs@1.1.1 39 | id-map@1.1.1 40 | inter-process-messaging@0.1.1 41 | launch-screen@1.3.0 42 | less@3.0.2 43 | localstorage@1.2.0 44 | logging@1.2.0 45 | meteor@1.9.3 46 | meteor-base@1.5.1 47 | minifier-css@1.5.4 48 | minifier-js@2.6.1 49 | minimongo@1.7.0 50 | mobile-experience@1.1.0 51 | mobile-status-bar@1.1.0 52 | modern-browsers@0.1.5 53 | modules@0.16.0 54 | modules-runtime@0.12.0 55 | mongo@1.12.0 56 | mongo-decimal@0.1.2 57 | mongo-dev-server@1.1.0 58 | mongo-id@1.0.8 59 | npm-mongo@3.9.1 60 | observe-sequence@1.0.19 61 | ordered-dict@1.1.0 62 | promise@0.12.0 63 | random@1.2.0 64 | rate-limit@1.0.9 65 | react-fast-refresh@0.1.1 66 | react-meteor-data@2.3.3 67 | reactive-dict@1.3.0 68 | reactive-var@1.0.11 69 | reload@1.3.1 70 | retry@1.1.0 71 | routepolicy@1.1.1 72 | service-configuration@1.1.0 73 | session@1.2.0 74 | sha@1.0.9 75 | shell-server@0.5.0 76 | socket-stream-client@0.4.0 77 | spacebars@1.2.0 78 | spacebars-compiler@1.3.0 79 | standard-minifier-css@1.7.3 80 | standard-minifier-js@2.6.1 81 | templating@1.4.1 82 | templating-compiler@1.4.1 83 | templating-runtime@1.5.0 84 | templating-tools@1.2.1 85 | tracker@1.2.0 86 | typescript@4.3.2 87 | underscore@1.0.10 88 | url@1.3.2 89 | webapp@1.11.1 90 | webapp-hashing@1.1.0 91 | -------------------------------------------------------------------------------- /examples/react/.meteorignore: -------------------------------------------------------------------------------- 1 | * 2 | !.meteor/ 3 | !node_modules/ 4 | !webpack.config.js 5 | -------------------------------------------------------------------------------- /examples/react/README.md: -------------------------------------------------------------------------------- 1 | # Simple Todo List Example with Meteor-Webpack 2 | 3 | This project includes Hot Module Replacement. -------------------------------------------------------------------------------- /examples/react/client/main.css: -------------------------------------------------------------------------------- 1 | /* CSS declarations go here */ 2 | body { 3 | font-family: sans-serif; 4 | background-color: #315481; 5 | background-image: linear-gradient(to bottom, #315481, #918e82 100%); 6 | background-attachment: fixed; 7 | 8 | position: absolute; 9 | top: 0; 10 | bottom: 0; 11 | left: 0; 12 | right: 0; 13 | 14 | padding: 0; 15 | margin: 0; 16 | 17 | font-size: 14px; 18 | } 19 | 20 | .container { 21 | max-width: 600px; 22 | margin: 0 auto; 23 | min-height: 100%; 24 | background: white; 25 | } 26 | 27 | header { 28 | background: #d2edf4; 29 | background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%); 30 | padding: 20px 15px 15px 15px; 31 | position: relative; 32 | } 33 | 34 | #login-buttons { 35 | display: block; 36 | } 37 | 38 | h1 { 39 | font-size: 1.5em; 40 | margin: 0; 41 | margin-bottom: 10px; 42 | display: inline-block; 43 | margin-right: 1em; 44 | } 45 | 46 | form { 47 | margin-top: 10px; 48 | margin-bottom: -10px; 49 | position: relative; 50 | } 51 | 52 | .new-task input { 53 | box-sizing: border-box; 54 | padding: 10px 0; 55 | background: transparent; 56 | border: none; 57 | width: 100%; 58 | padding-right: 80px; 59 | font-size: 1em; 60 | } 61 | 62 | .new-task input:focus{ 63 | outline: 0; 64 | } 65 | 66 | ul { 67 | margin: 0; 68 | padding: 0; 69 | background: white; 70 | } 71 | 72 | .delete { 73 | float: right; 74 | font-weight: bold; 75 | background: none; 76 | font-size: 1em; 77 | border: none; 78 | position: relative; 79 | } 80 | 81 | li { 82 | position: relative; 83 | list-style: none; 84 | padding: 15px; 85 | border-bottom: #eee solid 1px; 86 | } 87 | 88 | li .text { 89 | margin-left: 10px; 90 | } 91 | 92 | li.checked { 93 | color: #888; 94 | } 95 | 96 | li.checked .text { 97 | text-decoration: line-through; 98 | } 99 | 100 | li.private { 101 | background: #eee; 102 | border-color: #ddd; 103 | } 104 | 105 | header .hide-completed { 106 | float: right; 107 | } 108 | 109 | .toggle-private { 110 | margin-left: 5px; 111 | } 112 | 113 | @media (max-width: 600px) { 114 | li { 115 | padding: 12px 15px; 116 | } 117 | 118 | .search { 119 | width: 150px; 120 | clear: both; 121 | } 122 | 123 | .new-task input { 124 | padding-bottom: 5px; 125 | } 126 | } -------------------------------------------------------------------------------- /examples/react/client/main.html: -------------------------------------------------------------------------------- 1 | 2 | Todo List 3 | 4 | 5 | 6 |
7 | 8 | -------------------------------------------------------------------------------- /examples/react/client/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render } from 'react-dom'; 3 | 4 | import App from './ui/App'; 5 | import './main.css' 6 | import { Meteor } from 'meteor/meteor'; 7 | 8 | Meteor.startup(() => { 9 | render( 10 | , 11 | document.getElementById('render-target') 12 | ); 13 | }); 14 | -------------------------------------------------------------------------------- /examples/react/client/ui/AccountsUIWrapper.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import { Template } from 'meteor/templating'; 4 | import { Blaze } from 'meteor/blaze'; 5 | 6 | export default class AccountsUIWrapper extends Component { 7 | componentDidMount() { 8 | // Use Meteor Blaze to render login buttons 9 | this.view = Blaze.render(Template.loginButtons, 10 | ReactDOM.findDOMNode(this.refs.container)); 11 | } 12 | componentWillUnmount() { 13 | // Clean up Blaze view 14 | Blaze.remove(this.view); 15 | } 16 | render() { 17 | // Just render a placeholder container that will be filled in 18 | return ; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /examples/react/client/ui/App.jsx: -------------------------------------------------------------------------------- 1 | import { hot } from 'react-hot-loader' 2 | import React, { Component } from 'react'; 3 | import ReactDOM from 'react-dom'; 4 | import { Meteor } from 'meteor/meteor'; 5 | import { withTracker } from 'meteor/react-meteor-data'; 6 | 7 | import { Tasks } from '../../imports/api/tasks'; 8 | 9 | import Task from './Task'; 10 | import AccountsUIWrapper from './AccountsUIWrapper'; 11 | 12 | // App component - represents the whole app 13 | class App extends Component { 14 | constructor(props) { 15 | super(props); 16 | 17 | this.state = { 18 | hideCompleted: false, 19 | }; 20 | } 21 | 22 | handleSubmit(event) { 23 | event.preventDefault(); 24 | 25 | // Find the text field via the React ref 26 | const text = ReactDOM.findDOMNode(this.refs.textInput).value.trim(); 27 | 28 | Meteor.call('tasks.insert', text); 29 | 30 | // Clear form 31 | ReactDOM.findDOMNode(this.refs.textInput).value = ''; 32 | } 33 | 34 | toggleHideCompleted() { 35 | this.setState({ 36 | hideCompleted: !this.state.hideCompleted, 37 | }); 38 | } 39 | 40 | renderTasks() { 41 | let filteredTasks = this.props.tasks; 42 | if (this.state.hideCompleted) { 43 | filteredTasks = filteredTasks.filter(task => !task.checked); 44 | } 45 | return filteredTasks.map((task) => { 46 | const currentUserId = this.props.currentUser && this.props.currentUser._id; 47 | const showPrivateButton = task.owner === currentUserId; 48 | 49 | return ( 50 | 55 | ); 56 | }); 57 | } 58 | 59 | render() { 60 | return ( 61 |
62 |
63 |

Todo List ({this.props.incompleteCount})

64 | 65 | 74 | 75 | 76 | 77 | { this.props.currentUser ? 78 |
79 | 84 |
: '' 85 | } 86 |
87 | 88 |
    89 | {this.renderTasks()} 90 |
91 |
92 | ); 93 | } 94 | } 95 | 96 | export default withTracker(() => { 97 | Meteor.subscribe('tasks'); 98 | 99 | return { 100 | tasks: Tasks.find({}, { sort: { createdAt: -1 } }).fetch(), 101 | incompleteCount: Tasks.find({ checked: { $ne: true } }).count(), 102 | currentUser: Meteor.user(), 103 | }; 104 | })(hot(module)(App)); 105 | -------------------------------------------------------------------------------- /examples/react/client/ui/Task.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Meteor } from 'meteor/meteor'; 3 | import classnames from 'classnames'; 4 | 5 | import { Tasks } from '../../imports/api/tasks'; 6 | 7 | // Task component - represents a single todo item 8 | export default class Task extends Component { 9 | toggleChecked() { 10 | // Set the checked property to the opposite of its current value 11 | Meteor.call('tasks.setChecked', this.props.task._id, !this.props.task.checked); 12 | } 13 | 14 | deleteThisTask() { 15 | Meteor.call('tasks.remove', this.props.task._id); 16 | } 17 | 18 | togglePrivate() { 19 | Meteor.call('tasks.setPrivate', this.props.task._id, ! this.props.task.private); 20 | } 21 | 22 | render() { 23 | // Give tasks a different className when they are checked off, 24 | // so that we can style them nicely in CSS 25 | const taskClassName = classnames({ 26 | checked: this.props.task.checked, 27 | private: this.props.task.private, 28 | }); 29 | 30 | return ( 31 |
  • 32 | 35 | 36 | 42 | 43 | { this.props.showPrivateButton ? ( 44 | 47 | ) : ''} 48 | 49 | 50 | {this.props.task.username}: {this.props.task.text} 51 | 52 |
  • 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /examples/react/imports/api/tasks.js: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | import { Mongo } from 'meteor/mongo'; 3 | import { check } from 'meteor/check'; 4 | 5 | export const Tasks = new Mongo.Collection('tasks'); 6 | 7 | if (Meteor.isServer) { 8 | // This code only runs on the server 9 | // Only publish tasks that are public or belong to the current user 10 | Meteor.publish('tasks', function tasksPublication() { 11 | return Tasks.find({ 12 | $or: [ 13 | { private: { $ne: true } }, 14 | { owner: this.userId }, 15 | ], 16 | }); 17 | }); 18 | } 19 | 20 | Meteor.methods({ 21 | 'tasks.insert'(text) { 22 | check(text, String); 23 | 24 | // Make sure the user is logged in before inserting a task 25 | if (! this.userId) { 26 | throw new Meteor.Error('not-authorized'); 27 | } 28 | 29 | Tasks.insert({ 30 | text, 31 | createdAt: new Date(), 32 | owner: this.userId, 33 | username: Meteor.users.findOne(this.userId).username, 34 | }); 35 | }, 36 | 'tasks.remove'(taskId) { 37 | check(taskId, String); 38 | 39 | const task = Tasks.findOne(taskId); 40 | if (task.private && task.owner !== this.userId) { 41 | // If the task is private, make sure only the owner can delete it 42 | throw new Meteor.Error('not-authorized'); 43 | } 44 | 45 | Tasks.remove(taskId); 46 | }, 47 | 'tasks.setChecked'(taskId, setChecked) { 48 | check(taskId, String); 49 | check(setChecked, Boolean); 50 | 51 | const task = Tasks.findOne(taskId); 52 | if (task.private && task.owner !== this.userId) { 53 | // If the task is private, make sure only the owner can check it off 54 | throw new Meteor.Error('not-authorized'); 55 | } 56 | 57 | Tasks.update(taskId, { $set: { checked: setChecked } }); 58 | }, 59 | 'tasks.setPrivate'(taskId, setToPrivate) { 60 | check(taskId, String); 61 | check(setToPrivate, Boolean); 62 | 63 | const task = Tasks.findOne(taskId); 64 | 65 | // Make sure only the task owner can make a task private 66 | if (task.owner !== this.userId) { 67 | throw new Meteor.Error('not-authorized'); 68 | } 69 | 70 | Tasks.update(taskId, { $set: { private: setToPrivate } }); 71 | }, 72 | }); 73 | -------------------------------------------------------------------------------- /examples/react/imports/api/tasks.tests.js: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { Meteor } from 'meteor/meteor'; 4 | import { Random } from 'meteor/random'; 5 | import { assert } from 'chai'; 6 | 7 | import { Tasks } from './tasks.js'; 8 | 9 | if (Meteor.isServer) { 10 | describe('Tasks', () => { 11 | describe('methods', () => { 12 | const userId = Random.id(); 13 | let taskId; 14 | 15 | beforeEach(() => { 16 | Tasks.remove({}); 17 | taskId = Tasks.insert({ 18 | text: 'test task', 19 | createdAt: new Date(), 20 | owner: userId, 21 | username: 'tmeasday', 22 | }); 23 | }); 24 | 25 | it('can delete owned task', () => { 26 | // Find the internal implementation of the task method so we can 27 | // test it in isolation 28 | const deleteTask = Meteor.server.method_handlers['tasks.remove']; 29 | 30 | // Set up a fake method invocation that looks like what the method expects 31 | const invocation = { userId }; 32 | 33 | // Run the method with `this` set to the fake invocation 34 | deleteTask.apply(invocation, [taskId]); 35 | 36 | // Verify that the method does what we expected 37 | assert.equal(Tasks.find().count(), 0); 38 | }); 39 | }); 40 | }); 41 | } 42 | -------------------------------------------------------------------------------- /examples/react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple-todos", 3 | "private": true, 4 | "scripts": { 5 | "start": "meteor run" 6 | }, 7 | "dependencies": { 8 | "@babel/runtime": "7.0.0-beta.55", 9 | "bcrypt": "^5.0.0", 10 | "classnames": "^2.2.6", 11 | "meteor-node-stubs": "^0.4.1", 12 | "react": "^16.4.1", 13 | "react-dom": "^16.4.1", 14 | "react-hot-loader": "^4.3.4" 15 | }, 16 | "devDependencies": { 17 | "babel-core": "^6.26.3", 18 | "babel-loader": "^7.1.5", 19 | "babel-preset-env": "^1.7.0", 20 | "babel-preset-react": "^6.24.1", 21 | "babel-preset-stage-2": "^6.24.1", 22 | "chai": "^4.1.2", 23 | "css-loader": "^1.0.0", 24 | "html-webpack-plugin": "^3.2.0", 25 | "style-loader": "^0.21.0", 26 | "webpack": "^4.16.3", 27 | "webpack-dev-middleware": "^3.1.3", 28 | "webpack-hot-middleware": "^2.22.3", 29 | "webpack-hot-server-middleware": "^0.5.0", 30 | "webpack-meteor-externals": "0.0.5" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /examples/react/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ardatan/meteor-webpack/bb1de956f96c3980826b3d9bcfa9acf364a9c1de/examples/react/screenshot.png -------------------------------------------------------------------------------- /examples/react/server/main.js: -------------------------------------------------------------------------------- 1 | import '../imports/api/tasks.js'; 2 | -------------------------------------------------------------------------------- /examples/react/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const meteorExternals = require('webpack-meteor-externals'); 4 | 5 | const clientConfig = { 6 | entry: './client/main.jsx', 7 | module: { 8 | rules: [{ 9 | test: /\.(js|jsx)$/, 10 | exclude: /node_modules/, 11 | use: ['babel-loader'] 12 | }, 13 | { 14 | test: /\.css$/, 15 | use: ['style-loader', 'css-loader'] 16 | } 17 | ] 18 | }, 19 | plugins: [ 20 | new HtmlWebpackPlugin({ 21 | template: './client/main.html' 22 | }), 23 | new webpack.HotModuleReplacementPlugin() 24 | ], 25 | resolve: { 26 | extensions: ['*', '.js', '.jsx'] 27 | }, 28 | externals: [ 29 | meteorExternals() 30 | ], 31 | devServer: { 32 | hot: true 33 | } 34 | }; 35 | 36 | const serverConfig = { 37 | entry: [ 38 | './server/main.js' 39 | ], 40 | target: 'node', 41 | devServer: { 42 | hot: true 43 | }, 44 | externals: [ 45 | meteorExternals() 46 | ] 47 | }; 48 | 49 | module.exports = [clientConfig, serverConfig]; -------------------------------------------------------------------------------- /examples/vanilla/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /examples/vanilla/.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | 1.3.0-split-minifiers-package 14 | 1.4.0-remove-old-dev-bundle-link 15 | 1.4.1-add-shell-server-package 16 | 1.4.3-split-account-service-packages 17 | 1.5-add-dynamic-import-package 18 | 1.7-split-underscore-from-meteor-base 19 | 1.8.3-split-jquery-from-blaze 20 | -------------------------------------------------------------------------------- /examples/vanilla/.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /examples/vanilla/.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | r9g6hlzfagvr.l7an6q8jkwtj 8 | -------------------------------------------------------------------------------- /examples/vanilla/.meteor/packages: -------------------------------------------------------------------------------- 1 | # Meteor packages used by this project, one per line. 2 | # Check this file (and the other files in this directory) into your repository. 3 | # 4 | # 'meteor add' and 'meteor remove' will edit this file for you, 5 | # but you can also edit it by hand. 6 | 7 | meteor-base@1.5.1 # Packages every Meteor app needs to have 8 | mobile-experience@1.1.0 # Packages for a great mobile UX 9 | mongo@1.12.0 # The database Meteor supports right now 10 | reactive-var@1.0.11 # Reactive variable for tracker 11 | tracker@1.2.0 # Meteor's client-side reactive programming library 12 | 13 | standard-minifier-css@1.7.3 # CSS minifier run for production mode 14 | standard-minifier-js@2.6.1 # JS minifier run for production mode 15 | 16 | ardatan:webpack 17 | ardatan:webpack-dev-middleware 18 | -------------------------------------------------------------------------------- /examples/vanilla/.meteor/platforms: -------------------------------------------------------------------------------- 1 | server 2 | browser 3 | -------------------------------------------------------------------------------- /examples/vanilla/.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@2.3.4 2 | -------------------------------------------------------------------------------- /examples/vanilla/.meteor/versions: -------------------------------------------------------------------------------- 1 | allow-deny@1.1.0 2 | ardatan:webpack@0.0.13 3 | ardatan:webpack-dev-middleware@0.0.13 4 | autoupdate@1.7.0 5 | babel-compiler@7.6.2 6 | babel-runtime@1.5.0 7 | base64@1.0.12 8 | binary-heap@1.0.11 9 | boilerplate-generator@1.7.1 10 | callback-hook@1.3.1 11 | check@1.3.1 12 | ddp@1.4.0 13 | ddp-client@2.5.0 14 | ddp-common@1.4.0 15 | ddp-server@2.4.0 16 | diff-sequence@1.1.1 17 | dynamic-import@0.7.1 18 | ecmascript@0.15.2 19 | ecmascript-runtime@0.7.0 20 | ecmascript-runtime-client@0.11.1 21 | ecmascript-runtime-server@0.10.1 22 | ejson@1.1.1 23 | es5-shim@4.8.0 24 | fetch@0.1.1 25 | geojson-utils@1.0.10 26 | hot-code-push@1.0.4 27 | id-map@1.1.1 28 | inter-process-messaging@0.1.1 29 | launch-screen@1.3.0 30 | logging@1.2.0 31 | meteor@1.9.3 32 | meteor-base@1.5.1 33 | minifier-css@1.5.4 34 | minifier-js@2.6.1 35 | minimongo@1.7.0 36 | mobile-experience@1.1.0 37 | mobile-status-bar@1.1.0 38 | modern-browsers@0.1.5 39 | modules@0.16.0 40 | modules-runtime@0.12.0 41 | mongo@1.12.0 42 | mongo-decimal@0.1.2 43 | mongo-dev-server@1.1.0 44 | mongo-id@1.0.8 45 | npm-mongo@3.9.1 46 | ordered-dict@1.1.0 47 | promise@0.12.0 48 | random@1.2.0 49 | react-fast-refresh@0.1.1 50 | reactive-var@1.0.11 51 | reload@1.3.1 52 | retry@1.1.0 53 | routepolicy@1.1.1 54 | socket-stream-client@0.4.0 55 | standard-minifier-css@1.7.3 56 | standard-minifier-js@2.6.1 57 | tracker@1.2.0 58 | underscore@1.0.10 59 | webapp@1.11.1 60 | webapp-hashing@1.1.0 61 | -------------------------------------------------------------------------------- /examples/vanilla/.meteorignore: -------------------------------------------------------------------------------- 1 | * 2 | !.meteor/ 3 | !node_modules/ 4 | !webpack.config.js 5 | -------------------------------------------------------------------------------- /examples/vanilla/client/dynamicprint.js: -------------------------------------------------------------------------------- 1 | export function dynamicprint() { 2 | document.getElementById('dynamicprint').innerHTML = 'I am changing during runtime without reloading!!!'; 3 | } 4 | -------------------------------------------------------------------------------- /examples/vanilla/client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Meteor Webpack App 5 | 6 | 7 | 8 |
    9 |
    10 |
    11 | 12 | 13 |
    14 |
      15 | 16 | 17 | -------------------------------------------------------------------------------- /examples/vanilla/client/lazyprint.js: -------------------------------------------------------------------------------- 1 | export function lazyprint() { 2 | document.getElementById('lazyprint').innerHTML = "I am lazy loaded!"; 3 | } -------------------------------------------------------------------------------- /examples/vanilla/client/main.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import { 5 | dynamicprint 6 | } from './dynamicprint'; 7 | import { 8 | renderTodos 9 | } from './todo-list-renderer'; 10 | Meteor.startup(async () => { 11 | const { 12 | lazyprint 13 | } = await 14 | import ('./lazyprint'); 15 | lazyprint(); 16 | dynamicprint(); 17 | module.hot.accept('./dynamicprint', dynamicprint); 18 | renderTodos(); 19 | module.hot.accept('./todo-list-renderer', renderTodos); 20 | }) -------------------------------------------------------------------------------- /examples/vanilla/client/todo-list-renderer.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import { 5 | Tracker 6 | } from 'meteor/tracker'; 7 | import { 8 | Todos 9 | } from '../imports/todos'; 10 | 11 | export function renderTodos() { 12 | Meteor.subscribe('todos'); 13 | Tracker.autorun(() => { 14 | document.getElementById('todo-list').innerHTML = ''; 15 | const todos = Todos.find().fetch(); 16 | for (const todo of todos) { 17 | document.getElementById('todo-list').innerHTML += ` 18 |
    • ${todo.value}
    • 19 | `; 20 | const removeTodoButton = document.getElementById(`remove-todo-button-${todo._id}`); 21 | removeTodoButton.addEventListener('click', event => { 22 | event.preventDefault(); 23 | Meteor.call('removeTodo', todo._id); 24 | }); 25 | } 26 | }) 27 | document.getElementById('add-todo-form').addEventListener('submit', event => { 28 | event.preventDefault(); 29 | const form = event.target; 30 | const todoValue = form.todo.value; 31 | Meteor.call('addTodo', todoValue); 32 | }) 33 | } -------------------------------------------------------------------------------- /examples/vanilla/imports/todos.js: -------------------------------------------------------------------------------- 1 | import { 2 | Mongo 3 | } from 'meteor/mongo'; 4 | export const Todos = new Mongo.Collection('todos'); -------------------------------------------------------------------------------- /examples/vanilla/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webpack-meteor-boilerplate", 3 | "private": true, 4 | "scripts": { 5 | "start": "meteor run" 6 | }, 7 | "dependencies": { 8 | "@babel/runtime": "^7.0.0-beta.46", 9 | "html-webpack-plugin": "^3.2.0", 10 | "webpack": "^4.6.0", 11 | "webpack-dev-middleware": "^3.1.3", 12 | "webpack-hot-middleware": "^2.22.1", 13 | "webpack-hot-server-middleware": "^0.5.0", 14 | "webpack-meteor-externals": "0.0.4", 15 | "webpack-node-externals": "^1.7.2" 16 | } 17 | } -------------------------------------------------------------------------------- /examples/vanilla/server/addTodo.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import { 5 | Todos 6 | } from '../imports/todos'; 7 | 8 | Meteor.methods({ 9 | addTodo(todoValue) { 10 | Todos.insert({ 11 | value: todoValue 12 | }); 13 | } 14 | }) -------------------------------------------------------------------------------- /examples/vanilla/server/main.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import './addTodo'; 5 | import './removeTodo'; 6 | import './todos'; 7 | Meteor.startup(() => { 8 | console.log("Test Server12"); 9 | }); 10 | -------------------------------------------------------------------------------- /examples/vanilla/server/removeTodo.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import { 5 | Todos 6 | } from '../imports/todos'; 7 | 8 | Meteor.methods({ 9 | removeTodo(todoId) { 10 | Todos.remove({ 11 | _id: todoId 12 | }); 13 | } 14 | }) -------------------------------------------------------------------------------- /examples/vanilla/server/todos.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import { 5 | Todos 6 | } from '../imports/todos'; 7 | 8 | Meteor.publish('todos', function () { 9 | return Todos.find(); 10 | }) -------------------------------------------------------------------------------- /examples/vanilla/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const meteorExternals = require('webpack-meteor-externals'); 4 | const nodeExternals = require('webpack-node-externals'); 5 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 6 | const clientConfig = { 7 | target: 'web', 8 | entry: './client/main.js', 9 | devtool: 'inline-source-map', 10 | devServer: { 11 | hot: true 12 | }, 13 | output: { 14 | publicPath: '/' 15 | }, 16 | externals: [meteorExternals()], 17 | plugins: [ 18 | new webpack.HotModuleReplacementPlugin(), 19 | new HtmlWebpackPlugin({ 20 | template: './client/index.html', 21 | hash: true 22 | }) 23 | ] 24 | }; 25 | 26 | const serverConfig = { 27 | target: 'node', // in order to ignore built-in modules like path, fs, etc. 28 | externals: [meteorExternals(), nodeExternals()], // in order to ignore all modules in node_modules folder 29 | entry: './server/main.js', 30 | devServer: { 31 | hot: true 32 | }, 33 | }; 34 | 35 | module.exports = [clientConfig, serverConfig]; -------------------------------------------------------------------------------- /examples/vue/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { "modules": false }], 4 | "stage-3" 5 | ] 6 | } -------------------------------------------------------------------------------- /examples/vue/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | packages/ 3 | -------------------------------------------------------------------------------- /examples/vue/.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | 1.3.0-split-minifiers-package 14 | 1.4.0-remove-old-dev-bundle-link 15 | 1.4.1-add-shell-server-package 16 | 1.4.3-split-account-service-packages 17 | 1.5-add-dynamic-import-package 18 | 1.7-split-underscore-from-meteor-base 19 | 1.8.3-split-jquery-from-blaze 20 | -------------------------------------------------------------------------------- /examples/vue/.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /examples/vue/.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | d6ijk21m0253w173wx70 8 | -------------------------------------------------------------------------------- /examples/vue/.meteor/packages: -------------------------------------------------------------------------------- 1 | # Meteor packages used by this project, one per line. 2 | # Check this file (and the other files in this directory) into your repository. 3 | # 4 | # 'meteor add' and 'meteor remove' will edit this file for you, 5 | # but you can also edit it by hand. 6 | 7 | meteor-base@1.5.1 # Packages every Meteor app needs to have 8 | mobile-experience@1.1.0 # Packages for a great mobile UX 9 | mongo@1.12.0 # The database Meteor supports right now 10 | reactive-var@1.0.11 # Reactive variable for tracker 11 | jquery@1.11.10 # Helpful client-side library 12 | tracker@1.2.0 # Meteor's client-side reactive programming library 13 | 14 | standard-minifier-css@1.7.3 # CSS minifier run for production mode 15 | standard-minifier-js@2.6.1 # JS minifier run for production mode 16 | shell-server@0.5.0 # Server-side component of the `meteor shell` command 17 | 18 | ardatan:webpack 19 | ardatan:webpack-dev-middleware 20 | 21 | session@1.2.0 22 | accounts-password@2.0.0 23 | accounts-ui@1.4.0 24 | -------------------------------------------------------------------------------- /examples/vue/.meteor/platforms: -------------------------------------------------------------------------------- 1 | server 2 | browser 3 | -------------------------------------------------------------------------------- /examples/vue/.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@2.3.4 2 | -------------------------------------------------------------------------------- /examples/vue/.meteor/versions: -------------------------------------------------------------------------------- 1 | accounts-base@2.0.0 2 | accounts-password@2.0.0 3 | accounts-ui@1.4.0 4 | accounts-ui-unstyled@1.5.0 5 | allow-deny@1.1.0 6 | ardatan:webpack@0.0.14 7 | ardatan:webpack-dev-middleware@0.0.14 8 | autoupdate@1.7.0 9 | babel-compiler@7.6.2 10 | babel-runtime@1.5.0 11 | base64@1.0.12 12 | binary-heap@1.0.11 13 | blaze@2.5.0 14 | blaze-tools@1.1.2 15 | boilerplate-generator@1.7.1 16 | caching-compiler@1.2.2 17 | caching-html-compiler@1.2.1 18 | callback-hook@1.3.1 19 | check@1.3.1 20 | ddp@1.4.0 21 | ddp-client@2.5.0 22 | ddp-common@1.4.0 23 | ddp-rate-limiter@1.1.0 24 | ddp-server@2.4.0 25 | diff-sequence@1.1.1 26 | dynamic-import@0.7.1 27 | ecmascript@0.15.2 28 | ecmascript-runtime@0.7.0 29 | ecmascript-runtime-client@0.11.1 30 | ecmascript-runtime-server@0.10.1 31 | ejson@1.1.1 32 | email@2.1.1 33 | es5-shim@4.8.0 34 | fetch@0.1.1 35 | geojson-utils@1.0.10 36 | hot-code-push@1.0.4 37 | html-tools@1.1.2 38 | htmljs@1.1.1 39 | id-map@1.1.1 40 | inter-process-messaging@0.1.1 41 | jquery@1.11.11 42 | launch-screen@1.3.0 43 | less@3.0.2 44 | localstorage@1.2.0 45 | logging@1.2.0 46 | meteor@1.9.3 47 | meteor-base@1.5.1 48 | minifier-css@1.5.4 49 | minifier-js@2.6.1 50 | minimongo@1.7.0 51 | mobile-experience@1.1.0 52 | mobile-status-bar@1.1.0 53 | modern-browsers@0.1.5 54 | modules@0.16.0 55 | modules-runtime@0.12.0 56 | mongo@1.12.0 57 | mongo-decimal@0.1.2 58 | mongo-dev-server@1.1.0 59 | mongo-id@1.0.8 60 | npm-mongo@3.9.1 61 | observe-sequence@1.0.19 62 | ordered-dict@1.1.0 63 | promise@0.12.0 64 | random@1.2.0 65 | rate-limit@1.0.9 66 | react-fast-refresh@0.1.1 67 | reactive-dict@1.3.0 68 | reactive-var@1.0.11 69 | reload@1.3.1 70 | retry@1.1.0 71 | routepolicy@1.1.1 72 | service-configuration@1.1.0 73 | session@1.2.0 74 | sha@1.0.9 75 | shell-server@0.5.0 76 | socket-stream-client@0.4.0 77 | spacebars@1.2.0 78 | spacebars-compiler@1.3.0 79 | standard-minifier-css@1.7.3 80 | standard-minifier-js@2.6.1 81 | templating@1.4.1 82 | templating-compiler@1.4.1 83 | templating-runtime@1.5.0 84 | templating-tools@1.2.1 85 | tracker@1.2.0 86 | underscore@1.0.10 87 | url@1.3.2 88 | webapp@1.11.1 89 | webapp-hashing@1.1.0 90 | -------------------------------------------------------------------------------- /examples/vue/.meteorignore: -------------------------------------------------------------------------------- 1 | * 2 | !.meteor/ 3 | !node_modules/ 4 | !webpack.config.js 5 | -------------------------------------------------------------------------------- /examples/vue/README.md: -------------------------------------------------------------------------------- 1 | # meteor-vue-example -------------------------------------------------------------------------------- /examples/vue/client/main.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | } 4 | -------------------------------------------------------------------------------- /examples/vue/client/main.html: -------------------------------------------------------------------------------- 1 | 2 | Simple Meteor example using Vue 2.0 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /examples/vue/client/main.js: -------------------------------------------------------------------------------- 1 | // Libs 2 | import { Meteor } from 'meteor/meteor'; 3 | import Vue from 'vue'; 4 | import { Accounts } from 'meteor/accounts-base' 5 | 6 | import VueTracker from 'vue-meteor-tracker'; 7 | import VueMeta from 'vue-meta'; 8 | import '../imports/ui/blaze'; 9 | import App from '../imports/ui/App.vue'; 10 | 11 | window.AccountsConfigSet = window.AccountsConfigSet || true; 12 | if(!window.AccountsConfigSet){ 13 | Accounts.ui.config({ 14 | passwordSignupFields: 'USERNAME_AND_EMAIL', 15 | }) 16 | } 17 | 18 | 19 | Vue.use(VueTracker); 20 | 21 | Vue.use(VueMeta) 22 | 23 | // Main app 24 | 25 | Meteor.startup(() => { 26 | new Vue({ 27 | render: h => h(App), 28 | }).$mount('app'); 29 | }); 30 | -------------------------------------------------------------------------------- /examples/vue/imports/collections.js: -------------------------------------------------------------------------------- 1 | export const Messages = new Mongo.Collection('messages'); 2 | -------------------------------------------------------------------------------- /examples/vue/imports/ui/App.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 72 | 73 | 87 | -------------------------------------------------------------------------------- /examples/vue/imports/ui/Chat.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 60 | 61 | 85 | -------------------------------------------------------------------------------- /examples/vue/imports/ui/MyButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 39 | -------------------------------------------------------------------------------- /examples/vue/imports/ui/Test.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /examples/vue/imports/ui/Test2.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 15 | -------------------------------------------------------------------------------- /examples/vue/imports/ui/blaze.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { Blaze } from 'meteor/blaze' 3 | 4 | const vueVersion = parseInt(Vue.version.charAt(0)) 5 | 6 | if (vueVersion === 1) { 7 | Vue.directive('blaze', { 8 | update (newValue, oldValue) { 9 | if (newValue !== oldValue || !this.blazeView) { 10 | const templateName = newValue 11 | const template = Blaze._getTemplate(templateName, null) 12 | if (!template) { 13 | throw new Error(`Blaze template '${templateName}' not found.`) 14 | } 15 | if (this.blazeView) { 16 | Blaze.remove(this.blazeView) 17 | } 18 | this.blazeView = Blaze.render(template, this.el) 19 | } 20 | }, 21 | unbind () { 22 | if (this.blazeView) { 23 | Blaze.remove(this.blazeView) 24 | } 25 | }, 26 | }) 27 | } else if (vueVersion === 2) { 28 | Vue.directive('blaze', { 29 | bind (el, {value}) { 30 | renderTemplate(el, value) 31 | }, 32 | update (el, {value, oldValue}) { 33 | if (value !== oldValue || !el.blazeView) { 34 | if (el.blazeView) { 35 | Blaze.remove(el.blazeView) 36 | } 37 | renderTemplate(el, value) 38 | } 39 | }, 40 | unbind (el) { 41 | if (el.blazeView) { 42 | Blaze.remove(el.blazeView) 43 | } 44 | }, 45 | }) 46 | } 47 | 48 | function renderTemplate (el, templateName) { 49 | const template = Blaze._getTemplate(templateName, null) 50 | if (!template) { 51 | throw new Error(`Blaze template '${templateName}' not found.`) 52 | } 53 | el.blazeView = Blaze.render(template, el) 54 | } -------------------------------------------------------------------------------- /examples/vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "meteor-vue2-example", 3 | "private": true, 4 | "scripts": { 5 | "start": "meteor run" 6 | }, 7 | "dependencies": { 8 | "@babel/runtime": "^7.9.2", 9 | "babel-core": "^6.26.3", 10 | "babel-loader": "^8.1.0", 11 | "babel-preset-env": "^1.7.0", 12 | "babel-preset-stage-3": "^6.24.1", 13 | "bcrypt": "^5.0.0", 14 | "cross-env": "^7.0.2", 15 | "css-loader": "^3.4.2", 16 | "file-loader": "^6.0.0", 17 | "html-webpack-plugin": "^4.0.2", 18 | "meteor-node-stubs": "~1.0.0", 19 | "vue": "^2.6.11", 20 | "vue-loader": "^14.2.2", 21 | "vue-meta": "^2.3.3", 22 | "vue-meteor-tracker": "^1.2.3", 23 | "vue-style-loader": "^4.1.2", 24 | "vue-template-compiler": "^2.6.11", 25 | "webpack": "^4.42.1", 26 | "webpack-dev-middleware": "^3.7.2", 27 | "webpack-hot-middleware": "^2.25.0", 28 | "webpack-meteor-externals": "0.0.5" 29 | }, 30 | "devDependencies": { 31 | "@babel/core": "^7.9.0", 32 | "@babel/preset-env": "^7.9.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /examples/vue/server/main.js: -------------------------------------------------------------------------------- 1 | import { 2 | Meteor 3 | } from 'meteor/meteor'; 4 | import { 5 | Messages 6 | } from '../imports/collections'; 7 | 8 | Meteor.startup(() => { 9 | // code to run on server at startup 10 | }); 11 | 12 | Meteor.methods({ 13 | addMessage(message) { 14 | Messages.insert({ 15 | message, 16 | date: new Date(), 17 | }); 18 | }, 19 | removeMessage(_id) { 20 | Messages.remove(_id); 21 | }, 22 | }); 23 | 24 | 25 | Meteor.publish('messages', function () { 26 | return Messages.find(); 27 | }); -------------------------------------------------------------------------------- /examples/vue/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 3 | const meteorExternals = require('webpack-meteor-externals'); 4 | 5 | const clientConfig = { 6 | entry: './client/main.js', 7 | output: { 8 | publicPath: '/', 9 | filename: 'build.js' 10 | }, 11 | module: { 12 | rules: [{ 13 | test: /\.css$/, 14 | use: [ 15 | 'vue-style-loader', 16 | 'css-loader' 17 | ], 18 | }, 19 | { 20 | test: /\.vue$/, 21 | loader: 'vue-loader', 22 | options: { 23 | loaders: {} 24 | // other vue-loader options go here 25 | } 26 | }, 27 | { 28 | test: /\.js$/, 29 | loader: 'babel-loader', 30 | exclude: /node_modules/ 31 | }, 32 | { 33 | test: /\.(png|jpg|gif|svg)$/, 34 | loader: 'file-loader', 35 | options: { 36 | name: '[name].[ext]?[hash]' 37 | } 38 | } 39 | ] 40 | }, 41 | resolve: { 42 | alias: { 43 | 'vue$': 'vue/dist/vue.esm.js' 44 | }, 45 | extensions: ['*', '.js', '.vue', '.json'] 46 | }, 47 | externals: [meteorExternals()], 48 | devServer: { 49 | historyApiFallback: true, 50 | noInfo: true, 51 | overlay: true, 52 | hot: true 53 | }, 54 | performance: { 55 | hints: false 56 | }, 57 | devtool: '#eval-source-map', 58 | plugins: [ 59 | new webpack.HotModuleReplacementPlugin(), 60 | new HtmlWebpackPlugin({ 61 | template: './client/main.html' 62 | }) 63 | ] 64 | }; 65 | 66 | const serverConfig = { 67 | entry: './server/main.js', 68 | target: 'node', 69 | externals: [meteorExternals()], 70 | devServer: { 71 | hot: true 72 | }, 73 | }; 74 | 75 | module.exports = [clientConfig, serverConfig]; -------------------------------------------------------------------------------- /npm-packages/webpack-meteor-externals/index.js: -------------------------------------------------------------------------------- 1 | function resolveExternals(context, request, callback) { 2 | return resolveMeteor(request, callback) || 3 | callback(); 4 | } 5 | 6 | function resolveMeteor(request, callback) { 7 | request = request.replace('@types/', ''); 8 | var match = request.match(/^meteor\/(.+)$/); 9 | var package = match && match[1]; 10 | if (package) { 11 | callback(null, `Package['${package}']`); 12 | return true; 13 | } 14 | }; 15 | 16 | module.exports = function meteorExternals() { 17 | return resolveExternals; 18 | } -------------------------------------------------------------------------------- /npm-packages/webpack-meteor-externals/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webpack-meteor-externals", 3 | "version": "0.0.5", 4 | "description": "Meteor Externals for Webpack", 5 | "main": "index.js", 6 | "repository": "https://github.com/ardatan/meteor-webpack", 7 | "author": "Arda TANRIKULU", 8 | "license": "MIT" 9 | } 10 | -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | (cd atmosphere-packages/webpack && meteor publish) 2 | (cd atmosphere-packages/webpack-dev-middleware && meteor publish) 3 | (cd examples/angular && meteor update --all-packages --allow-incompatible-update) 4 | (cd examples/react && meteor update --all-packages --allow-incompatible-update) 5 | (cd examples/vanilla && meteor update --all-packages --allow-incompatible-update) 6 | (cd examples/vue && meteor update --all-packages --allow-incompatible-update) -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["config:js-lib", ":meteor"] 3 | } --------------------------------------------------------------------------------