diff --git a/README.md b/README.md index 1b67381d9d..48cb97d005 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,14 @@ Parse Server is an [open source version of the Parse backend](http://blog.parsep Parse Server works with the Express web application framework. It can be added to existing web applications, or run by itself. - [Getting Started](#getting-started) - - [Running Parse Server](#running-parse-server) - - [Locally](#locally) - - [Docker](#inside-a-docker-container) - - [Saving an Object](#saving-your-first-object) - - [Connect an SDK](#connect-your-app-to-parse-server) + - [Creating your first application](#creating-your-first-application) + - [Saving an Object](#saving-your-first-object) + - [Connect an SDK](#connect-your-app-to-parse-server) - [Running elsewhere](#running-parse-server-elsewhere) - [Sample Application](#parse-server-sample-application) - [Parse Server + Express](#parse-server--express) - [Logging](#logging) + - [Docker](#inside-a-docker-container) - [Documentation](#documentation) - [Configuration](#configuration) - [Basic Options](#basic-options) @@ -40,35 +39,43 @@ Parse Server works with the Express web application framework. It can be added t # Getting Started -April 2016 - We created a series of video screencasts, please check them out here: [http://blog.parseplatform.org/learn/parse-server-video-series-april-2016/](http://blog.parseplatform.org/learn/parse-server-video-series-april-2016/) +Parse-Server is built on the top of node. Before you can get started, you should have the latest version of node and npm installed. +We always recommend you run your server on the LTS versions as we focus on providing the most stability on those versions. -The fastest and easiest way to get started is to run MongoDB and Parse Server locally. +You can find the latest versions of [node.js here](https://nodejs.org/en/). -## Running Parse Server +In order to be fully functional, `parse-server` requires a database to run. You'll need to either have [mongodb](https://www.mongodb.com/download-center) or [postgres](https://www.postgresql.org/download/) setup, locally or remotely. -### Locally -``` -$ npm install -g parse-server mongodb-runner -$ mongodb-runner start -$ parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://localhost/test -``` -***Note:*** *If installation with* `-g` *fails due to permission problems* (`npm ERR! code 'EACCES'`), *please refer to [this link](https://docs.npmjs.com/getting-started/fixing-npm-permissions).* - +There are many service providers that offer hosting of mongodb and postgres. + +:warning: Before creating your first app, your DB should be accessible and running. + +## Creating your first application -### Inside a Docker container +In order to create your first application, you can use the `@parse/init` project. + +The `@parse/init` project is an interactive command line tool that bootstraps a functional parse-server setup on your local machine. + +In order to create your first parse app in the `my-parse-app` folder, run the following command: + +```sh +$ npx @parse/init my-parse-app ``` -$ docker build --tag parse-server . -$ docker run --name my-mongo -d mongo -$ docker run --name my-parse-server --link my-mongo:mongo -d parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongo/test -``` -You can use any arbitrary string as your application id and master key. These will be used by your clients to authenticate with the Parse Server. +The script above will create a fully functional `parse-server` setup in `my-parse-app` folder with: -That's it! You are now running a standalone version of Parse Server on your machine. +- `package.json`: the nodejs package definition, that defines the dependencies for your project. +- `cloud`: the folder for your cloud code. +- `cloud/main.js`: the main entrypoint for cloud code. +- `public`: the folder for publicly accessible static contents. -**Using a remote MongoDB?** Pass the `--databaseURI DATABASE_URI` parameter when starting `parse-server`. Learn more about configuring Parse Server [here](#configuration). For a full list of available options, run `parse-server --help`. +You can start the server with the following command: -### Saving your first object +```sh +$ npm start +``` + +## Saving your first object Now that you're running Parse Server, it is time to save your first object. We'll use the [REST API](http://docs.parseplatform.org/rest/guide), but you can easily do the same using any of the [Parse SDKs](http://parseplatform.org/#sdks). Run the following: @@ -134,7 +141,7 @@ $ curl -X GET \ To learn more about using saving and querying objects on Parse Server, check out the [Parse documentation](http://docs.parseplatform.org). -### Connect your app to Parse Server +## Connect your app to Parse Server Parse provides SDKs for all the major platforms. Refer to the Parse Server guide to [learn how to connect your app to Parse Server](https://github.com/parse-community/parse-server/wiki/Parse-Server-Guide#using-parse-sdks-with-parse-server). @@ -201,6 +208,22 @@ Logs are also be viewable in Parse Dashboard. **Want new line delimited JSON error logs (for consumption by CloudWatch, Google Cloud Logging, etc.)?** Pass the `JSON_LOGS` environment variable when starting `parse-server`. Usage :- `JSON_LOGS='1' parse-server --appId APPLICATION_ID --masterKey MASTER_KEY` +## Inside a Docker container + +``` +$ git clone https://github.com/parse-community/parse-server +$ cd parse-server +$ docker build --tag parse-server . +$ docker run --name my-mongo -d mongo +$ docker run --name my-parse-server --link my-mongo:mongo -d parse-server --appId APPLICATION_ID --masterKey MASTER_KEY --databaseURI mongodb://mongo/test +``` + +You can use any arbitrary string as your application id and master key. These will be used by your clients to authenticate with the Parse Server. + +That's it! You are now running a standalone version of Parse Server on your machine. + +**Using a remote MongoDB?** Pass the `--databaseURI DATABASE_URI` parameter when starting `parse-server`. Learn more about configuring Parse Server [here](#configuration). For a full list of available options, run `parse-server --help`. + # Documentation The full documentation for Parse Server is available in the [wiki](https://github.com/parse-community/parse-server/wiki). The [Parse Server guide](http://docs.parseplatform.org/parse-server/guide/) is a good place to get started. If you're interested in developing for Parse Server, the [Development guide](http://docs.parseplatform.org/parse-server/guide/#development-guide) will help you get set up. diff --git a/parse-init/.eslintrc b/parse-init/.eslintrc new file mode 100644 index 0000000000..6f1285f834 --- /dev/null +++ b/parse-init/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "no-console": "off" + } +} diff --git a/parse-init/init.js b/parse-init/init.js new file mode 100644 index 0000000000..68de78f553 --- /dev/null +++ b/parse-init/init.js @@ -0,0 +1,182 @@ +#!/usr/bin/env node + +const shell = require("shelljs"); +const chalk = require("chalk"); +const fs = require("fs"); +const inquirer = require('inquirer'); +const path = require('path'); +const CWD = process.cwd(); +const crypto = require('crypto'); +const DEFAULT_MONGODB_URI = 'mongodb://127.0.0.1:27017/parse'; +const CHECK = '✓'; +const program = require('commander'); + +let useYarn = false; +if (shell.which("yarn")) { + useYarn = true; +} + +function generateKey() { + return crypto.randomBytes(16).toString('hex'); +} + +function ok(message) { + console.log(chalk.green(`${CHECK} ${message}`)); +} + +async function getInstallationsDir({ directory, interactive }) { + let target_directory; + if (directory) { + target_directory = directory; + } else if (interactive) { + const answer = await inquirer.prompt([ + { + type: 'input', + name: 'target_directory', + message: 'Enter an installation directory', + default: CWD, + }, + ]); + target_directory = answer.target_directory; + } else { + target_directory = './parse-server' + } + console.log(`This will setup parse-server in ${chalk.bold(target_directory)}`); + await confirm(`Do you want to continue?`); + console.log(`Setting up parse-server in ${chalk.bold(target_directory)}`); + return target_directory; +} + +function getAppConfiguration({ interactive }) { + if (!interactive) { + return { + appName: 'My Parse Server', + appId: generateKey(), + masterKey: generateKey(), + databaseURI: DEFAULT_MONGODB_URI + }; + } + const questions = [ + { + type: 'input', + name: 'appName', + message: 'Enter your Application Name', + validate: (value) => { + return value && value.length > 0 + } + }, + { + type: 'input', + name: 'appId', + message: 'Enter your Application Id (leave empty to generate)', + default: generateKey(), + }, + { + type: 'input', + name: 'masterKey', + message: 'Enter your Master Key (leave empty to generate)', + default: generateKey(), + }, + { + type: 'input', + name: 'databaseURI', + message: 'Enter your Database URL (valid mongodb or postgres)', + default: DEFAULT_MONGODB_URI, + } + ]; + + return inquirer.prompt(questions); +} + +function confirm(message, defaults = true) { + return inquirer.prompt([ + { + type: 'confirm', + name: 'continue', + message: message, + default: defaults, + } + ]).then(result => { + if (!result.continue) { + process.exit(1); + } + }); +} + +async function main({ + directory, + interactive, +}) { + let target_directory = await getInstallationsDir({ interactive, directory }); + target_directory = path.resolve(target_directory); + if (fs.existsSync(target_directory)) { + console.log(chalk.red(`${chalk.bold(target_directory)} already exists.\naborting...`)); + process.exit(1); + } + + shell.mkdir(target_directory); + + const config = await getAppConfiguration({ interactive }); + const { + masterKey, + databaseURI + } = config; + + // Cleanup sensitive info + delete config.masterKey; + delete config.databaseURI; + + shell.cd(target_directory); + + const packageContent = { + scripts: { + start: "node -r dotenv/config node_modules/.bin/parse-server config.js" + } + }; + fs.writeFileSync( + target_directory + "/package.json", + JSON.stringify(packageContent, null, 2) + '\n' + ); + ok('Added package.json'); + + fs.writeFileSync( + target_directory + '/config.js', + 'module.exports = ' + JSON.stringify(config, null, 2) + ';\n' + ); + ok('Added config.js'); + + fs.writeFileSync( + target_directory + '/.env', + `PORT=1337\nPARSE_SERVER_MASTER_KEY=${masterKey}\nPARSE_SERVER_DATABASE_URI=${databaseURI}\n` + ) + ok('Added .env'); + + shell.mkdir(target_directory + '/cloud'); + ok('Created cloud/'); + + fs.writeFileSync(target_directory + '/cloud/main.js', `// Cloud Code entry point\n`); + ok('Created cloud/main.js'); + shell.mkdir(target_directory + '/public'); + ok('Created public/'); + + if (useYarn) { + shell.exec("yarn add parse-server dotenv"); + } else { + shell.exec("npm install parse-server dotenv --save"); + } + + console.log(chalk.green(`parse-server is installed in \n\t${target_directory}!\n`)); + await confirm(`Do you want to start the server now?\nEnsure a database running on ${databaseURI}`); + if (useYarn) { + shell.exec("yarn start"); + } else { + shell.exec("npm start"); + } +} + +program + .option('-i, --interactive', 'Configure manually') + .option('-d, --directory [directory]', 'The target directory where to create a new parse-server') + .parse(process.argv); + +main(program); diff --git a/parse-init/package-lock.json b/parse-init/package-lock.json new file mode 100644 index 0000000000..d022ea0d8d --- /dev/null +++ b/parse-init/package-lock.json @@ -0,0 +1,357 @@ +{ + "name": "@parse/init", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.5.0.tgz", + "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "external-editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.1.tgz", + "integrity": "sha512-e1neqvSt5pSwQcFnYc6yfGuJD2Q4336cdbHs5VeUO0zTkqPbrHMyw2q1r47fpfLWbvIG8H8A6YO3sck7upTV6Q==", + "requires": { + "chardet": "^0.5.0", + "iconv-lite": "^0.4.22", + "tmp": "^0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.1.0.tgz", + "integrity": "sha512-f9K2MMx/G/AVmJSaZg2a+GVLRRmTdlGLbwxsibNd6yNTxXujqxPypjCnxnC0y4+Wb/rNY5KyKuq06AO5jrE+7w==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "shelljs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", + "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/parse-init/package.json b/parse-init/package.json new file mode 100644 index 0000000000..2b3c348093 --- /dev/null +++ b/parse-init/package.json @@ -0,0 +1,17 @@ +{ + "name": "@parse/init", + "version": "0.0.1", + "description": "Initialize easily new parse-servers", + "main": "init.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Florent Vilmart", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "commander": "^2.17.1", + "inquirer": "^6.1.0", + "shelljs": "^0.8.2" + } +}