├── .gitignore
├── _config.yml
├── examples
├── angular
│ ├── .gitignore
│ ├── .meteor
│ │ ├── .gitignore
│ │ ├── release
│ │ ├── platforms
│ │ ├── .id
│ │ ├── .finished-upgraders
│ │ ├── packages
│ │ └── versions
│ ├── .meteorignore
│ ├── imports
│ │ ├── todo.ts
│ │ └── todos.ts
│ ├── server
│ │ ├── index.ts
│ │ ├── greeting.ts
│ │ ├── todos.ts
│ │ ├── removeTodo.ts
│ │ └── addTodo.ts
│ ├── client
│ │ ├── index.html
│ │ ├── app
│ │ │ ├── app.html
│ │ │ ├── app.module.ts
│ │ │ └── app.component.ts
│ │ └── index.ts
│ ├── tsconfig.json
│ ├── package.json
│ └── webpack.config.js
├── react
│ ├── .meteor
│ │ ├── .gitignore
│ │ ├── release
│ │ ├── platforms
│ │ ├── .id
│ │ ├── .finished-upgraders
│ │ ├── packages
│ │ └── versions
│ ├── .gitignore
│ ├── server
│ │ └── main.js
│ ├── .meteorignore
│ ├── screenshot.png
│ ├── README.md
│ ├── client
│ │ ├── main.html
│ │ ├── main.jsx
│ │ ├── ui
│ │ │ ├── AccountsUIWrapper.jsx
│ │ │ ├── Task.jsx
│ │ │ └── App.jsx
│ │ └── main.css
│ ├── .babelrc
│ ├── package.json
│ ├── webpack.config.js
│ └── imports
│ │ └── api
│ │ ├── tasks.tests.js
│ │ └── tasks.js
├── vanilla
│ ├── .gitignore
│ ├── .meteor
│ │ ├── .gitignore
│ │ ├── release
│ │ ├── platforms
│ │ ├── .id
│ │ ├── .finished-upgraders
│ │ ├── packages
│ │ └── versions
│ ├── .meteorignore
│ ├── imports
│ │ └── todos.js
│ ├── client
│ │ ├── lazyprint.js
│ │ ├── dynamicprint.js
│ │ ├── index.html
│ │ ├── main.js
│ │ └── todo-list-renderer.js
│ ├── server
│ │ ├── todos.js
│ │ ├── main.js
│ │ ├── removeTodo.js
│ │ └── addTodo.js
│ ├── package.json
│ └── webpack.config.js
└── vue
│ ├── .meteor
│ ├── .gitignore
│ ├── release
│ ├── platforms
│ ├── .id
│ ├── .finished-upgraders
│ ├── packages
│ └── versions
│ ├── README.md
│ ├── .gitignore
│ ├── client
│ ├── main.css
│ ├── main.html
│ └── main.js
│ ├── .meteorignore
│ ├── imports
│ ├── collections.js
│ └── ui
│ │ ├── Test.vue
│ │ ├── Test2.vue
│ │ ├── MyButton.vue
│ │ ├── blaze.js
│ │ ├── Chat.vue
│ │ └── App.vue
│ ├── .babelrc
│ ├── server
│ └── main.js
│ ├── package.json
│ └── webpack.config.js
├── ROADMAP.md
├── .github
└── FUNDING.yml
├── renovate.json
├── .vscode
└── settings.json
├── atmosphere-packages
├── webpack
│ ├── .npm
│ │ └── plugin
│ │ │ └── webpack
│ │ │ ├── .gitignore
│ │ │ ├── README
│ │ │ └── npm-shrinkwrap.json
│ ├── .versions
│ ├── package.js
│ └── plugin.js
└── webpack-dev-middleware
│ ├── .npm
│ └── package
│ │ ├── .gitignore
│ │ ├── README
│ │ └── npm-shrinkwrap.json
│ ├── package.js
│ ├── .versions
│ └── dev-server.js
├── npm-packages
└── webpack-meteor-externals
│ ├── package.json
│ └── index.js
├── publish.sh
├── LICENSE
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/examples/angular/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/examples/react/.meteor/.gitignore:
--------------------------------------------------------------------------------
1 | local
2 |
--------------------------------------------------------------------------------
/examples/vanilla/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/examples/vue/.meteor/.gitignore:
--------------------------------------------------------------------------------
1 | local
2 |
--------------------------------------------------------------------------------
/examples/vue/README.md:
--------------------------------------------------------------------------------
1 | # meteor-vue-example
--------------------------------------------------------------------------------
/ROADMAP.md:
--------------------------------------------------------------------------------
1 | Add Polymer, Web Components examples
--------------------------------------------------------------------------------
/examples/angular/.meteor/.gitignore:
--------------------------------------------------------------------------------
1 | local
2 |
--------------------------------------------------------------------------------
/examples/react/.meteor/release:
--------------------------------------------------------------------------------
1 | METEOR@2.3.4
2 |
--------------------------------------------------------------------------------
/examples/vanilla/.meteor/.gitignore:
--------------------------------------------------------------------------------
1 | local
2 |
--------------------------------------------------------------------------------
/examples/vue/.meteor/release:
--------------------------------------------------------------------------------
1 | METEOR@2.3.4
2 |
--------------------------------------------------------------------------------
/examples/angular/.meteor/release:
--------------------------------------------------------------------------------
1 | METEOR@2.3.4
2 |
--------------------------------------------------------------------------------
/examples/react/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | *.log
--------------------------------------------------------------------------------
/examples/vanilla/.meteor/release:
--------------------------------------------------------------------------------
1 | METEOR@2.3.4
2 |
--------------------------------------------------------------------------------
/examples/vue/.meteor/platforms:
--------------------------------------------------------------------------------
1 | server
2 | browser
3 |
--------------------------------------------------------------------------------
/examples/angular/.meteor/platforms:
--------------------------------------------------------------------------------
1 | server
2 | browser
3 |
--------------------------------------------------------------------------------
/examples/react/.meteor/platforms:
--------------------------------------------------------------------------------
1 | server
2 | browser
3 |
--------------------------------------------------------------------------------
/examples/vanilla/.meteor/platforms:
--------------------------------------------------------------------------------
1 | server
2 | browser
3 |
--------------------------------------------------------------------------------
/examples/vue/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | packages/
3 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 |
2 | patreon: ardatan
3 | github: ardatan
4 |
--------------------------------------------------------------------------------
/examples/react/server/main.js:
--------------------------------------------------------------------------------
1 | import '../imports/api/tasks.js';
2 |
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["config:js-lib", ":meteor"]
3 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "git.ignoreLimitWarning": true
3 | }
--------------------------------------------------------------------------------
/atmosphere-packages/webpack/.npm/plugin/webpack/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/examples/vue/client/main.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: sans-serif;
3 | }
4 |
--------------------------------------------------------------------------------
/atmosphere-packages/webpack-dev-middleware/.npm/package/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/atmosphere-packages/webpack/.versions:
--------------------------------------------------------------------------------
1 | ardatan:webpack@0.0.14
2 | meteor@1.9.3
3 |
--------------------------------------------------------------------------------
/examples/vue/.meteorignore:
--------------------------------------------------------------------------------
1 | *
2 | !.meteor/
3 | !node_modules/
4 | !webpack.config.js
5 |
--------------------------------------------------------------------------------
/examples/angular/.meteorignore:
--------------------------------------------------------------------------------
1 | *
2 | !.meteor/
3 | !node_modules/
4 | !webpack.config.js
5 |
--------------------------------------------------------------------------------
/examples/react/.meteorignore:
--------------------------------------------------------------------------------
1 | *
2 | !.meteor/
3 | !node_modules/
4 | !webpack.config.js
5 |
--------------------------------------------------------------------------------
/examples/vanilla/.meteorignore:
--------------------------------------------------------------------------------
1 | *
2 | !.meteor/
3 | !node_modules/
4 | !webpack.config.js
5 |
--------------------------------------------------------------------------------
/examples/vue/imports/collections.js:
--------------------------------------------------------------------------------
1 | export const Messages = new Mongo.Collection('messages');
2 |
--------------------------------------------------------------------------------
/examples/angular/imports/todo.ts:
--------------------------------------------------------------------------------
1 | export interface Todo {
2 | _id?: string;
3 | value: string;
4 | }
--------------------------------------------------------------------------------
/examples/react/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ardatan/meteor-webpack/HEAD/examples/react/screenshot.png
--------------------------------------------------------------------------------
/examples/react/README.md:
--------------------------------------------------------------------------------
1 | # Simple Todo List Example with Meteor-Webpack
2 |
3 | This project includes Hot Module Replacement.
--------------------------------------------------------------------------------
/examples/vue/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", { "modules": false }],
4 | "stage-3"
5 | ]
6 | }
--------------------------------------------------------------------------------
/examples/vanilla/imports/todos.js:
--------------------------------------------------------------------------------
1 | import {
2 | Mongo
3 | } from 'meteor/mongo';
4 | export const Todos = new Mongo.Collection('todos');
--------------------------------------------------------------------------------
/examples/react/client/main.html:
--------------------------------------------------------------------------------
1 |
2 | Todo List
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/vanilla/client/lazyprint.js:
--------------------------------------------------------------------------------
1 | export function lazyprint() {
2 | document.getElementById('lazyprint').innerHTML = "I am lazy loaded!";
3 | }
--------------------------------------------------------------------------------
/examples/vue/client/main.html:
--------------------------------------------------------------------------------
1 |
2 | Simple Meteor example using Vue 2.0
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/examples/react/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "env",
4 | "react",
5 | "stage-2"
6 | ],
7 | "plugins": ["react-hot-loader/babel"]
8 | }
--------------------------------------------------------------------------------
/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/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Meteor Angular Example
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/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/server/greeting.ts:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 |
3 | Meteor.methods({
4 | greeting() {
5 | return 'Hello From Meteor Method!';
6 | }
7 | })
--------------------------------------------------------------------------------
/examples/vanilla/client/dynamicprint.js:
--------------------------------------------------------------------------------
1 | export function dynamicprint() {
2 | document.getElementById('dynamicprint').innerHTML = 'I am changing during runtime without reloading!!!';
3 | }
4 |
--------------------------------------------------------------------------------
/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/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/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/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/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/vue/imports/ui/Test.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ message }}
4 |
5 |
6 |
7 |
8 |
15 |
--------------------------------------------------------------------------------
/examples/vue/imports/ui/Test2.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ message }}
4 |
5 |
6 |
7 |
8 |
15 |
--------------------------------------------------------------------------------
/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/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 | })
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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/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/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/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/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Meteor Webpack App
5 |
6 |
7 |
8 |
9 |
10 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/examples/angular/client/app/app.html:
--------------------------------------------------------------------------------
1 | {{greeting | async}}
2 |
6 |
7 |
8 | {{todo.value}}
9 |
10 | Remove
11 |
12 |
13 |
--------------------------------------------------------------------------------
/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)
--------------------------------------------------------------------------------
/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/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 | }
--------------------------------------------------------------------------------
/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-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 |
--------------------------------------------------------------------------------
/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/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/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/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 | });
--------------------------------------------------------------------------------
/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 | }
--------------------------------------------------------------------------------
/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-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/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 |
--------------------------------------------------------------------------------
/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/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/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/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/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/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/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/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/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/vue/imports/ui/MyButton.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{label}}
4 |
5 |
6 |
7 |
17 |
18 |
39 |
--------------------------------------------------------------------------------
/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/.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/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/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/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 | }
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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/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} Remove
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/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/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/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/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 | }
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/examples/vue/imports/ui/Chat.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Chat
4 |
5 |
6 |
7 |
8 | Loading...
9 |
10 |
11 |
12 | {{ msg.message }}
13 | x
14 |
15 |
16 |
17 |
18 |
60 |
61 |
85 |
--------------------------------------------------------------------------------
/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 |
33 | ×
34 |
35 |
36 |
42 |
43 | { this.props.showPrivateButton ? (
44 |
45 | { this.props.task.private ? 'Private' : 'Public' }
46 |
47 | ) : ''}
48 |
49 |
50 | {this.props.task.username} : {this.props.task.text}
51 |
52 |
53 | );
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/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];
--------------------------------------------------------------------------------
/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/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/vue/imports/ui/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Simple Meteor example using Vue 2.x
4 |
5 |
6 | You are logged in as {{ user.username }} .
7 |
8 |
9 | You pressed the button {{count}} time(s).
10 |
11 |
12 |
13 | Learn more about the vue integration on GitHub .
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
72 |
73 |
87 |
--------------------------------------------------------------------------------
/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/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/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/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 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/.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 |
--------------------------------------------------------------------------------