├── .editorconfig ├── .eslintrc.yml ├── .gitignore ├── LICENSE ├── README.md ├── cli.js ├── command.js ├── docs └── usage.gif ├── lib.js ├── package.json ├── templates ├── android.js ├── example.js ├── general.js ├── index.js ├── ios.js └── windows.js ├── utils ├── createFile.js ├── createFolder.js ├── exec.js ├── hasPrefix.js ├── index.js ├── isUpperCase.js └── npmAddScriptSync.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*.md] 5 | trim_trailing_whitespace = false 6 | 7 | # Unix-style newlines with a newline ending every file 8 | [*] 9 | end_of_line = lf 10 | insert_final_newline = true 11 | 12 | [*.js] 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.json] 17 | indent_style = space 18 | indent_size = 2 19 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | extends: airbnb-base 2 | rules: 3 | no-tabs: 0 4 | prefer-rest-params: 0 5 | import/no-extraneous-dependencies: 0 6 | comma-dangle: 7 | - error 8 | - objects: only-multiline 9 | functions: never 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### macOS ### 2 | *.DS_Store 3 | .AppleDouble 4 | .LSOverride 5 | 6 | # Icon must end with two \r 7 | Icon 8 | 9 | # Thumbnails 10 | ._* 11 | 12 | # Files that might appear in the root of a volume 13 | .DocumentRevisions-V100 14 | .fseventsd 15 | .Spotlight-V100 16 | .TemporaryItems 17 | .Trashes 18 | .VolumeIcon.icns 19 | .com.apple.timemachine.donotpresent 20 | 21 | # Directories potentially created on remote AFP share 22 | .AppleDB 23 | .AppleDesktop 24 | Network Trash Folder 25 | Temporary Items 26 | .apdisk 27 | 28 | node_modules 29 | npm-debug.log 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Johannes Stein 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-create-library 2 | Tool to create a React Native library with a single command. 3 | 4 | ![](https://github.com/frostney/react-native-create-library/blob/master/docs/usage.gif) 5 | 6 | ### Why might you need this? 7 | If you are looking to create a native module for React Native, you need some native code for each platform you want to support and then some JavaScript code to bind it all together. Setting this up by yourself can be time-consuming. 8 | 9 | This is where this tool comes in. It creates a boilerplate with all current best practices in mind. 10 | Why not use `react-native new-library`? Unfortunately that command doesn't create an up-to-date library, requires an already initialized React Native project and only sets up the iOS side of things. 11 | 12 | Caution: This only creates native modules without a view component. 13 | 14 | ### Alternatives 15 | [react-native-create-bridge](https://github.com/peggyrayzis/react-native-create-bridge) 16 | 17 | ## Installation 18 | Requirements: Node 6.0+ 19 | ``` 20 | $ npm install -g react-native-create-library 21 | ``` 22 | 23 | ## Command-line usage 24 | 25 | Navigate into an empty directory to execute the command. 26 | ``` 27 | $ react-native-create-library MyFancyLibrary 28 | ``` 29 | 30 | This will create the folder `MyFancyLibrary` in which the library will be created in. 31 | 32 | Now install dependencies by running this command in the newly created library. 33 | ``` 34 | $ npm install 35 | ``` 36 | 37 | ``` 38 | Usage: react-native-create-library [options] 39 | 40 | Options: 41 | 42 | -h, --help output usage information 43 | -V, --version output the version number 44 | -p, --prefix The prefix for the library (Default: `RN`) 45 | --module-prefix The module prefix for the library (Default: `react-native`) 46 | --package-identifier (Android only!) The package name for the Android module (Default: `com.reactlibrary`) 47 | --namespace (Windows only!) The namespace for the Windows module 48 | (Default: The name as PascalCase) 49 | --platforms Platforms the library will be created for. (comma separated; default: `ios,android,windows`) 50 | --github-account The github account where the library is hosted (Default: `github_account`) 51 | --author-name The author's name (Default: `Your Name`) 52 | --author-email The author's email (Default: `yourname@email.com`) 53 | --license The license type of this library (Default: `Apache-2.0`) 54 | --generate-example Will generate a RN example project and link the new library to it (Default: `false`) 55 | ``` 56 | 57 | ## Programmatic usage 58 | ```javascript 59 | const createLibrary = require('react-native-create-library'); 60 | 61 | createLibrary({ 62 | name: 'MyFancyLibrary' 63 | }).then(() => { 64 | console.log('Oh yay! My library has been created!'); 65 | }) 66 | ``` 67 | 68 | #### Options 69 | ```javascript 70 | { 71 | name: String, /* The name of the library (Default: Library) */ 72 | prefix: String, /* The prefix for the library (Default: RN) */ 73 | modulePrefix: String, /* The module prefix for the library (Default: react-native) */ 74 | platforms: Array, /* Platforms the library will be created for. (Default: ['ios', 'android', 'windows']) */ 75 | packageIdentifier: String, /* (Android only!) The package name for the Android module (Default: com.reactlibrary) */ 76 | namespace: String, /* (Windows only!) The namespace for the Windows module (Default: The package identifier as PascalCase, which is `Com.Reactlibrary`) */ 77 | githubAccount: String, /* The github account where the library is hosted (Default: `github_account`) */ 78 | authorName: String, /* The author's name (Default: `Your Name`) */ 79 | authorEmail: String, /* The author's email (Default: `yourname@email.com`) */ 80 | license: String, /* The license type of this library (Default: `Apache-2.0`) */ 81 | generateExample: Boolean, /* Will generate a RN example project and link the new library to it (Default: `false`) */ 82 | } 83 | ``` 84 | 85 | ## Acknowledgements 86 | `react-native-share` (https://github.com/EstebanFuentealba/react-native-share) has been a great source of inspiration for this project. 87 | 88 | ## License 89 | MIT 90 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const program = require('commander'); 4 | const updateNotifier = require('update-notifier'); 5 | 6 | const command = require('./command'); 7 | const pkg = require('./package.json'); 8 | 9 | updateNotifier({ pkg }).notify(); 10 | 11 | program 12 | .usage(command.usage) 13 | .description(command.description) 14 | .action(function runAction() { 15 | command.func(arguments, {}, this.opts()); 16 | }); 17 | 18 | (command.options || []) 19 | .forEach(opt => 20 | program.option( 21 | opt.command, 22 | opt.description, 23 | opt.parse || (value => value), 24 | opt.default 25 | )); 26 | 27 | program.parse(process.argv); 28 | 29 | if (!program.args.length) { 30 | program.help(); 31 | } 32 | -------------------------------------------------------------------------------- /command.js: -------------------------------------------------------------------------------- 1 | const emoji = require('node-emoji'); 2 | 3 | const createLibrary = require('./lib'); 4 | 5 | module.exports = { 6 | name: 'create-library', 7 | description: 'creates a React Native library for different platforms', 8 | usage: '[options] ', 9 | func: (args, config, options) => { 10 | const name = args[0]; 11 | const prefix = options.prefix; 12 | const modulePrefix = options.modulePrefix; 13 | const packageIdentifier = options.packageIdentifier; 14 | const namespace = options.namespace; 15 | const platforms = (options.platforms) ? options.platforms.split(',') : options.platforms; 16 | const overridePrefix = options.overridePrefix; 17 | const githubAccount = options.githubAccount; 18 | const authorName = options.authorName; 19 | const authorEmail = options.authorEmail; 20 | const license = options.license; 21 | const generateExample = options.generateExample; 22 | 23 | const beforeCreation = Date.now(); 24 | createLibrary({ 25 | name, 26 | prefix, 27 | modulePrefix, 28 | packageIdentifier, 29 | platforms, 30 | namespace, 31 | overridePrefix, 32 | githubAccount, 33 | authorName, 34 | authorEmail, 35 | license, 36 | generateExample, 37 | }).then(() => { 38 | console.log(` 39 | ${emoji.get('books')} Created library ${name} in \`./${name}\`. 40 | ${emoji.get('clock9')} It took ${Date.now() - beforeCreation}ms. 41 | ${emoji.get('arrow_right')} To get started type \`cd ./${name}\` and run \`npm install\``); 42 | }).catch((err) => { 43 | console.error(`Error while creating library ${name}`); 44 | 45 | if (err.stack) { 46 | console.error(err.stack); 47 | } 48 | }); 49 | }, 50 | options: [{ 51 | command: '--prefix [prefix]', 52 | description: 'The prefix for the library (Default: `RN`)', 53 | default: 'RN', 54 | }, { 55 | command: '--override-prefix', 56 | description: 'Overrides the prefix check and allows the name to begin with uppercase characters', 57 | }, { 58 | command: '--module-prefix [modulePrefix]', 59 | description: 'The module prefix for the library (Default: `react-native`)', 60 | default: 'react-native', 61 | }, { 62 | command: '--package-identifier [packageIdentifier]', 63 | description: '(Android only!) The package name for the Android module (Default: `com.reactlibrary`)', 64 | default: 'com.reactlibrary', 65 | }, { 66 | command: '--namespace [namespace]', 67 | description: '(Windows only!) The namespace for the Windows module\n' + 68 | ' (Default: The name as PascalCase)' 69 | }, { 70 | command: '--platforms ', 71 | description: 'Platforms the library will be created for. (comma separated; default: `ios,android,windows`)', 72 | default: 'ios,android,windows', 73 | }, { 74 | command: '--github-account [githubAccount]', 75 | description: 'The github account where the library is hosted (Default: `github_account`)', 76 | default: 'github_account', 77 | }, { 78 | command: '--author-name [authorName]', 79 | description: 'The author\'s name (Default: `Your Name`)', 80 | default: 'Your Name', 81 | }, { 82 | command: '--author-email [authorEmail]', 83 | description: 'The author\'s email (Default: `yourname@email.com`)', 84 | default: 'yourname@email.com', 85 | }, { 86 | command: '--license [license]', 87 | description: 'The license type (Default: `Apache-2.0`)', 88 | default: 'Apache-2.0', 89 | }, { 90 | command: '--generate-example', 91 | description: 'Generates an example project for iOS and Android and links the library to it', 92 | }] 93 | }; 94 | -------------------------------------------------------------------------------- /docs/usage.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frostney/react-native-create-library/e08c03cadf417a9fcf6a1daba0193ea58959469e/docs/usage.gif -------------------------------------------------------------------------------- /lib.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | const pascalCase = require('pascal-case'); 4 | const paramCase = require('param-case'); 5 | 6 | const templates = require('./templates'); 7 | const { hasPrefix, createFile, createFolder, npmAddScriptSync, exec } = require('./utils'); 8 | const { execSync } = require('child_process'); 9 | 10 | const DEFAULT_NAME = 'Library'; 11 | const DEFAULT_PREFIX = 'RN'; 12 | const DEFAULT_MODULE_PREFIX = 'react-native'; 13 | const DEFAULT_PACKAGE_IDENTIFIER = 'com.reactlibrary'; 14 | const DEFAULT_PLATFORMS = ['android', 'ios', 'windows']; 15 | const DEFAULT_OVERRIDE_PREFIX = false; 16 | const DEFAULT_GITHUB_ACCOUNT = 'github_account'; 17 | const DEFAULT_AUTHOR_NAME = 'Your Name'; 18 | const DEFAULT_AUTHOR_EMAIL = 'yourname@email.com'; 19 | const DEFAULT_LICENSE = 'Apache-2.0'; 20 | const DEFAULT_GENERATE_EXAMPLE = false; 21 | 22 | const renderTemplate = (name, template, templateArgs) => { 23 | const filename = path.join(name, template.name(templateArgs)); 24 | const baseDir = filename.split(path.basename(filename))[0]; 25 | 26 | return createFolder(baseDir).then(() => 27 | createFile(filename, template.content(templateArgs)) 28 | ); 29 | } 30 | 31 | module.exports = ({ 32 | namespace, 33 | name = DEFAULT_NAME, 34 | prefix = DEFAULT_PREFIX, 35 | modulePrefix = DEFAULT_MODULE_PREFIX, 36 | packageIdentifier = DEFAULT_PACKAGE_IDENTIFIER, 37 | platforms = DEFAULT_PLATFORMS, 38 | overridePrefix = DEFAULT_OVERRIDE_PREFIX, 39 | githubAccount = DEFAULT_GITHUB_ACCOUNT, 40 | authorName = DEFAULT_AUTHOR_NAME, 41 | authorEmail = DEFAULT_AUTHOR_EMAIL, 42 | license = DEFAULT_LICENSE, 43 | generateExample = DEFAULT_GENERATE_EXAMPLE, 44 | }) => { 45 | if (!overridePrefix) { 46 | if (hasPrefix(name)) { 47 | throw new Error('Please don\'t include the prefix in the name'); 48 | } 49 | 50 | if (prefix === 'RCT') { 51 | throw new Error(`The \`RCT\` name prefix is reserved for core React modules. 52 | Please use a different prefix.`); 53 | } 54 | } 55 | 56 | if (platforms.length === 0) { 57 | throw new Error('Please specify at least one platform to generate the library.'); 58 | } 59 | 60 | if (prefix === DEFAULT_PREFIX) { 61 | console.warn(`While \`${DEFAULT_PREFIX}\` is the default prefix, 62 | it is recommended to customize the prefix.`); 63 | } 64 | 65 | if (packageIdentifier === DEFAULT_PACKAGE_IDENTIFIER) { 66 | console.warn(`While \`{DEFAULT_PACKAGE_IDENTIFIER}\` is the default package 67 | identifier, it is recommended to customize the package identifier.`); 68 | } 69 | 70 | const moduleName = `${modulePrefix}-${paramCase(name)}`; 71 | const rootFolderName = moduleName; 72 | return createFolder(rootFolderName) 73 | .then(() => { 74 | return Promise.all(templates.filter((template) => { 75 | if (template.platform) { 76 | return (platforms.indexOf(template.platform) >= 0); 77 | } 78 | 79 | return true; 80 | }).map((template) => { 81 | if (!template.name) { 82 | return Promise.resolve(); 83 | } 84 | const templateArgs = { 85 | name: `${prefix}${pascalCase(name)}`, 86 | moduleName, 87 | packageIdentifier, 88 | namespace: namespace || pascalCase(name).split(/(?=[A-Z])/).join('.'), 89 | platforms, 90 | githubAccount, 91 | authorName, 92 | authorEmail, 93 | license, 94 | generateExample, 95 | }; 96 | 97 | return renderTemplate(rootFolderName, template, templateArgs); 98 | })); 99 | }) 100 | .then(() => { 101 | // Generate the example if necessary 102 | if (!generateExample) { 103 | return Promise.resolve(); 104 | } 105 | 106 | const initExampleOptions = { cwd: `./${rootFolderName}`, stdio: 'inherit' }; 107 | return exec('react-native init example', initExampleOptions) 108 | .then(() => { 109 | // Execute the example template 110 | const exampleTemplates = require('./templates/example'); 111 | return Promise.all( 112 | exampleTemplates.map((template) => { 113 | return renderTemplate(rootFolderName, template); 114 | }) 115 | ); 116 | }) 117 | .then(() => { 118 | // Adds and link the new library 119 | return new Promise((resolve, reject) => { 120 | // Add postinstall script to example package.json 121 | const pathExampleApp = `./${rootFolderName}/example`; 122 | const moduleName = `${modulePrefix}-${paramCase(name)}`; 123 | npmAddScriptSync(`${pathExampleApp}/package.json`, { 124 | key: 'postinstall', 125 | value: `node ../scripts/examples_postinstall.js node_modules/${moduleName}` 126 | }); 127 | 128 | // Add and link the new library 129 | const addLinkLibraryOptions = { cwd: pathExampleApp, stdio: 'inherit' }; 130 | try { 131 | execSync('yarn add file:../', addLinkLibraryOptions); 132 | } catch (e) { 133 | execSync('npm install ../', addLinkLibraryOptions); 134 | execSync('npm install', addLinkLibraryOptions); 135 | } 136 | execSync('react-native link', addLinkLibraryOptions); 137 | 138 | return resolve(); 139 | }); 140 | }); 141 | }); 142 | }; 143 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-create-library", 3 | "version": "3.1.2", 4 | "description": "Tool to create a React Native library with a single command", 5 | "bin": "cli.js", 6 | "main": "lib.js", 7 | "scripts": { 8 | "lint": "eslint .", 9 | "test": "npm run lint" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/frostney/react-native-create-library.git" 14 | }, 15 | "keywords": [ 16 | "react-native", 17 | "react", 18 | "library", 19 | "create", 20 | "module", 21 | "native", 22 | "ios", 23 | "android", 24 | "windows" 25 | ], 26 | "files": [ 27 | "templates", 28 | "utils", 29 | "cli.js", 30 | "command.js", 31 | "lib.js", 32 | "README.md" 33 | ], 34 | "author": "Johannes Stein", 35 | "license": "MIT", 36 | "bugs": { 37 | "url": "https://github.com/frostney/react-native-create-library/issues" 38 | }, 39 | "homepage": "https://github.com/frostney/react-native-create-library#readme", 40 | "dependencies": { 41 | "commander": "^2.9.0", 42 | "jsonfile": "^4.0.0", 43 | "mkdirp": "^0.5.1", 44 | "node-emoji": "^1.5.1", 45 | "param-case": "^2.1.0", 46 | "pascal-case": "^2.0.0", 47 | "update-notifier": "^2.1.0", 48 | "uuid": "^3.0.1" 49 | }, 50 | "devDependencies": { 51 | "eslint": "^3.16.0", 52 | "eslint-config-airbnb-base": "^11.1.0", 53 | "eslint-plugin-import": "^2.2.0", 54 | "shelljs": "^0.7.6" 55 | }, 56 | "rnpm": { 57 | "plugin": "./command.js" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /templates/android.js: -------------------------------------------------------------------------------- 1 | module.exports = platform => [{ 2 | name: () => `${platform}/build.gradle`, 3 | content: ({ packageIdentifier }) => `buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | // Matches the RN Hello World template 10 | // https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/local-cli/templates/HelloWorld/android/build.gradle#L8 11 | classpath 'com.android.tools.build:gradle:2.2.3' 12 | } 13 | } 14 | 15 | apply plugin: 'com.android.library' 16 | apply plugin: 'maven' 17 | 18 | def safeExtGet(prop, fallback) { 19 | rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback 20 | } 21 | 22 | def DEFAULT_COMPILE_SDK_VERSION = 27 23 | def DEFAULT_BUILD_TOOLS_VERSION = "27.0.3" 24 | def DEFAULT_MIN_SDK_VERSION = 16 25 | def DEFAULT_TARGET_SDK_VERSION = 27 26 | 27 | android { 28 | compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION) 29 | buildToolsVersion safeExtGet('buildToolsVersion', DEFAULT_BUILD_TOOLS_VERSION) 30 | 31 | defaultConfig { 32 | minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION) 33 | targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION) 34 | versionCode 1 35 | versionName "1.0" 36 | } 37 | lintOptions { 38 | abortOnError false 39 | } 40 | } 41 | 42 | repositories { 43 | maven { 44 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 45 | // Matches the RN Hello World template 46 | // https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/local-cli/templates/HelloWorld/android/build.gradle#L21 47 | url "$projectDir/../node_modules/react-native/android" 48 | } 49 | mavenCentral() 50 | } 51 | 52 | dependencies { 53 | compile 'com.facebook.react:react-native:+' 54 | } 55 | 56 | def configureReactNativePom(def pom) { 57 | def packageJson = new groovy.json.JsonSlurper().parseText(file('../package.json').text) 58 | 59 | pom.project { 60 | name packageJson.title 61 | artifactId packageJson.name 62 | version = packageJson.version 63 | group = "${packageIdentifier}" 64 | description packageJson.description 65 | url packageJson.repository.baseUrl 66 | 67 | licenses { 68 | license { 69 | name packageJson.license 70 | url packageJson.repository.baseUrl + '/blob/master/' + packageJson.licenseFilename 71 | distribution 'repo' 72 | } 73 | } 74 | 75 | developers { 76 | developer { 77 | id packageJson.author.username 78 | name packageJson.author.name 79 | } 80 | } 81 | } 82 | } 83 | 84 | afterEvaluate { project -> 85 | 86 | task androidJavadoc(type: Javadoc) { 87 | source = android.sourceSets.main.java.srcDirs 88 | classpath += files(android.bootClasspath) 89 | classpath += files(project.getConfigurations().getByName('compile').asList()) 90 | include '**/*.java' 91 | } 92 | 93 | task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) { 94 | classifier = 'javadoc' 95 | from androidJavadoc.destinationDir 96 | } 97 | 98 | task androidSourcesJar(type: Jar) { 99 | classifier = 'sources' 100 | from android.sourceSets.main.java.srcDirs 101 | include '**/*.java' 102 | } 103 | 104 | android.libraryVariants.all { variant -> 105 | def name = variant.name.capitalize() 106 | task "jar$\{name\}"(type: Jar, dependsOn: variant.javaCompile) { 107 | from variant.javaCompile.destinationDir 108 | } 109 | } 110 | 111 | artifacts { 112 | archives androidSourcesJar 113 | archives androidJavadocJar 114 | } 115 | 116 | task installArchives(type: Upload) { 117 | configuration = configurations.archives 118 | repositories.mavenDeployer { 119 | // Deploy to react-native-event-bridge/maven, ready to publish to npm 120 | repository url: "file://$\{projectDir\}/../android/maven" 121 | 122 | configureReactNativePom pom 123 | } 124 | } 125 | } 126 | `, 127 | }, { 128 | name: () => `${platform}/src/main/AndroidManifest.xml`, 129 | content: ({ packageIdentifier }) => ` 131 | 132 | 133 | `, 134 | }, { 135 | name: ({ packageIdentifier, name }) => 136 | `${platform}/src/main/java/${packageIdentifier.split('.').join('/')}/${name}Module.java`, 137 | content: ({ packageIdentifier, name }) => `package ${packageIdentifier}; 138 | 139 | import com.facebook.react.bridge.ReactApplicationContext; 140 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 141 | import com.facebook.react.bridge.ReactMethod; 142 | import com.facebook.react.bridge.Callback; 143 | 144 | public class ${name}Module extends ReactContextBaseJavaModule { 145 | 146 | private final ReactApplicationContext reactContext; 147 | 148 | public ${name}Module(ReactApplicationContext reactContext) { 149 | super(reactContext); 150 | this.reactContext = reactContext; 151 | } 152 | 153 | @Override 154 | public String getName() { 155 | return "${name}"; 156 | } 157 | 158 | @ReactMethod 159 | public void sampleMethod(String stringArgument, int numberArgument, Callback callback) { 160 | // TODO: Implement 161 | } 162 | }`, 163 | }, { 164 | name: ({ packageIdentifier, name }) => 165 | `${platform}/src/main/java/${packageIdentifier.split('.').join('/')}/${name}Package.java`, 166 | content: ({ packageIdentifier, name }) => `package ${packageIdentifier}; 167 | 168 | import java.util.Arrays; 169 | import java.util.Collections; 170 | import java.util.List; 171 | 172 | import com.facebook.react.ReactPackage; 173 | import com.facebook.react.bridge.NativeModule; 174 | import com.facebook.react.bridge.ReactApplicationContext; 175 | import com.facebook.react.uimanager.ViewManager; 176 | import com.facebook.react.bridge.JavaScriptModule; 177 | public class ${name}Package implements ReactPackage { 178 | @Override 179 | public List createNativeModules(ReactApplicationContext reactContext) { 180 | return Arrays.asList(new ${name}Module(reactContext)); 181 | } 182 | 183 | // Deprecated from RN 0.47 184 | public List> createJSModules() { 185 | return Collections.emptyList(); 186 | } 187 | 188 | @Override 189 | public List createViewManagers(ReactApplicationContext reactContext) { 190 | return Collections.emptyList(); 191 | } 192 | } 193 | `, 194 | }, { 195 | name: () => `${platform}/README.md`, 196 | content: () => `README 197 | ====== 198 | 199 | If you want to publish the lib as a maven dependency, follow these steps before publishing a new version to npm: 200 | 201 | 1. Be sure to have the Android [SDK](https://developer.android.com/studio/index.html) and [NDK](https://developer.android.com/ndk/guides/index.html) installed 202 | 2. Be sure to have a \`local.properties\` file in this folder that points to the Android SDK and NDK 203 | \`\`\` 204 | ndk.dir=/Users/{username}/Library/Android/sdk/ndk-bundle 205 | sdk.dir=/Users/{username}/Library/Android/sdk 206 | \`\`\` 207 | 3. Delete the \`maven\` folder 208 | 4. Run \`sudo ./gradlew installArchives\` 209 | 5. Verify that latest set of generated files is in the maven folder with the correct version number 210 | ` 211 | }]; 212 | -------------------------------------------------------------------------------- /templates/example.js: -------------------------------------------------------------------------------- 1 | /* eslint max-len: 0 */ 2 | 3 | module.exports = [{ 4 | name: () => 'scripts/examples_postinstall.js', 5 | content: () => 6 | `#!/usr/bin/env node 7 | 8 | /* 9 | * Using libraries within examples and linking them within packages.json like: 10 | * "react-native-library-name": "file:../" 11 | * will cause problems with the metro bundler if the example will run via 12 | * \`react-native run-[ios|android]\`. This will result in an error as the metro 13 | * bundler will find multiple versions for the same module while resolving it. 14 | * The reason for that is that if the library is installed it also copies in the 15 | * example folder itself as well as the node_modules folder of the library 16 | * although their are defined in .npmignore and should be ignored in theory. 17 | * 18 | * This postinstall script removes the node_modules folder as well as all 19 | * entries from the libraries .npmignore file within the examples node_modules 20 | * folder after the library was installed. This should resolve the metro 21 | * bundler issue mentioned above. 22 | * 23 | * It is expected this scripts lives in the libraries root folder within a 24 | * scripts folder. As first parameter the relative path to the libraries 25 | * folder within the examples node_modules folder should be provided. 26 | * An example's package.json entry could look like: 27 | * "postinstall": "node ../scripts/examples_postinstall.js node_modules/react-native-library-name/" 28 | */ 29 | 30 | 'use strict'; 31 | 32 | const fs = require('fs'); 33 | const path = require('path'); 34 | 35 | /// Delete all files and directories for the given path 36 | const removeFileDirectoryRecursively = fileDirPath => { 37 | // Remove file 38 | if (!fs.lstatSync(fileDirPath).isDirectory()) { 39 | fs.unlinkSync(fileDirPath); 40 | return; 41 | } 42 | 43 | // Go down the directory an remove each file / directory recursively 44 | fs.readdirSync(fileDirPath).forEach(entry => { 45 | const entryPath = path.join(fileDirPath, entry); 46 | removeFileDirectoryRecursively(entryPath); 47 | }); 48 | fs.rmdirSync(fileDirPath); 49 | }; 50 | 51 | /// Remove example/node_modules/react-native-library-name/node_modules directory 52 | const removeLibraryNodeModulesPath = (libraryNodeModulesPath) => { 53 | const nodeModulesPath = path.resolve(libraryNodeModulesPath, 'node_modules') 54 | 55 | if (!fs.existsSync(nodeModulesPath)) { 56 | console.log(\`No node_modules path found at \${nodeModulesPath}. Skipping delete.\`) 57 | return; 58 | } 59 | 60 | console.log(\`Deleting: \${nodeModulesPath}\`) 61 | try { 62 | removeFileDirectoryRecursively(nodeModulesPath); 63 | console.log(\`Successfully deleted: \${nodeModulesPath}\`) 64 | } catch (err) { 65 | console.log(\`Error deleting \${nodeModulesPath}: \${err.message}\`); 66 | } 67 | }; 68 | 69 | /// Remove all entries from the .npmignore within example/node_modules/react-native-library-name/ 70 | const removeLibraryNpmIgnorePaths = (npmIgnorePath, libraryNodeModulesPath) => { 71 | if (!fs.existsSync(npmIgnorePath)) { 72 | console.log(\`No .npmignore path found at \${npmIgnorePath}. Skipping deleting content.\`); 73 | return; 74 | } 75 | 76 | fs.readFileSync(npmIgnorePath, 'utf8').split(/\\r?\\n/).forEach(entry => { 77 | if (entry.length === 0) { 78 | return 79 | } 80 | 81 | const npmIgnoreLibraryNodeModulesEntryPath = path.resolve(libraryNodeModulesPath, entry); 82 | if (!fs.existsSync(npmIgnoreLibraryNodeModulesEntryPath)) { 83 | return; 84 | } 85 | 86 | console.log(\`Deleting: \${npmIgnoreLibraryNodeModulesEntryPath}\`) 87 | try { 88 | removeFileDirectoryRecursively(npmIgnoreLibraryNodeModulesEntryPath); 89 | console.log(\`Successfully deleted: \${npmIgnoreLibraryNodeModulesEntryPath}\`) 90 | } catch (err) { 91 | console.log(\`Error deleting \${npmIgnoreLibraryNodeModulesEntryPath}: \${err.message}\`); 92 | } 93 | }); 94 | }; 95 | 96 | // Main start sweeping process 97 | (() => { 98 | // Read out dir of example project 99 | const exampleDir = process.cwd(); 100 | 101 | // Relative libraries path within the examples node_modules directory 102 | const relativeLibraryNodeModulesPath = process.argv[2]; 103 | const libraryNodeModulesPath = path.resolve(exampleDir, relativeLibraryNodeModulesPath); 104 | 105 | 106 | removeLibraryNodeModulesPath(libraryNodeModulesPath); 107 | 108 | const npmIgnorePath = path.resolve(__dirname, '../.npmignore'); 109 | removeLibraryNpmIgnorePaths(npmIgnorePath, libraryNodeModulesPath); 110 | })(); 111 | ` 112 | }]; 113 | -------------------------------------------------------------------------------- /templates/general.js: -------------------------------------------------------------------------------- 1 | /* eslint max-len: 0 */ 2 | 3 | module.exports = [{ 4 | name: () => 'README.md', 5 | content: ({ moduleName, packageIdentifier, name, namespace, platforms }) => { 6 | let manualInstallation = ''; 7 | 8 | if (platforms.indexOf('ios') >= 0) { 9 | manualInstallation += ` 10 | #### iOS 11 | 12 | 1. In XCode, in the project navigator, right click \`Libraries\` ➜ \`Add Files to [your project's name]\` 13 | 2. Go to \`node_modules\` ➜ \`${moduleName}\` and add \`${name}.xcodeproj\` 14 | 3. In XCode, in the project navigator, select your project. Add \`lib${name}.a\` to your project's \`Build Phases\` ➜ \`Link Binary With Libraries\` 15 | 4. Run your project (\`Cmd+R\`)< 16 | `; 17 | } 18 | 19 | if (platforms.indexOf('android') >= 0) { 20 | manualInstallation += ` 21 | #### Android 22 | 23 | 1. Open up \`android/app/src/main/java/[...]/MainApplication.java\` 24 | - Add \`import ${packageIdentifier}.${name}Package;\` to the imports at the top of the file 25 | - Add \`new ${name}Package()\` to the list returned by the \`getPackages()\` method 26 | 2. Append the following lines to \`android/settings.gradle\`: 27 | \`\`\` 28 | include ':${moduleName}' 29 | project(':${moduleName}').projectDir = new File(rootProject.projectDir, '../node_modules/${moduleName}/android') 30 | \`\`\` 31 | 3. Insert the following lines inside the dependencies block in \`android/app/build.gradle\`: 32 | \`\`\` 33 | compile project(':${moduleName}') 34 | \`\`\` 35 | `; 36 | } 37 | 38 | if (platforms.indexOf('windows') >= 0) { 39 | manualInstallation += ` 40 | #### Windows 41 | [Read it! :D](https://github.com/ReactWindows/react-native) 42 | 43 | 1. In Visual Studio add the \`${name}.sln\` in \`node_modules/${moduleName}/windows/${name}.sln\` folder to their solution, reference from their app. 44 | 2. Open up your \`MainPage.cs\` app 45 | - Add \`using ${namespace}.${name};\` to the usings at the top of the file 46 | - Add \`new ${name}Package()\` to the \`List\` returned by the \`Packages\` method 47 | `; 48 | } 49 | 50 | return `# ${moduleName} 51 | 52 | ## Getting started 53 | 54 | \`$ npm install ${moduleName} --save\` 55 | 56 | ### Mostly automatic installation 57 | 58 | \`$ react-native link ${moduleName}\` 59 | 60 | ### Manual installation 61 | 62 | ${manualInstallation} 63 | 64 | ## Usage 65 | \`\`\`javascript 66 | import ${name} from '${moduleName}'; 67 | 68 | // TODO: What to do with the module? 69 | ${name}; 70 | \`\`\` 71 | `; 72 | }, 73 | }, { 74 | name: () => 'package.json', 75 | content: ({ moduleName, platforms, githubAccount, authorName, authorEmail, license }) => { 76 | let dependencies = ` 77 | "react": "16.2.0", 78 | "react-native": "^0.52.0"`; 79 | if (platforms.indexOf('windows') >= 0) { 80 | dependencies += `, 81 | "react-native-windows": "0.52.0" 82 | `; 83 | } 84 | return `{ 85 | "name": "${moduleName}", 86 | "title": "${moduleName.split('-').map(word => word[0].toUpperCase() + word.substr(1)).join(' ')}", 87 | "version": "1.0.0", 88 | "description": "", 89 | "main": "index.js", 90 | "scripts": { 91 | "test": "echo \\"Error: no test specified\\" && exit 1" 92 | }, 93 | "repository": { 94 | "type": "git", 95 | "url": "git+https://github.com/${githubAccount}/${moduleName}.git", 96 | "baseUrl": "https://github.com/${githubAccount}/${moduleName}" 97 | }, 98 | "keywords": [ 99 | "react-native" 100 | ], 101 | "author": { 102 | "name": "${authorName}", 103 | "email": "${authorEmail}" 104 | }, 105 | "license": "${license}", 106 | "licenseFilename": "LICENSE", 107 | "readmeFilename": "README.md", 108 | "peerDependencies": { 109 | ${dependencies} 110 | }, 111 | "devDependencies": { 112 | ${dependencies} 113 | } 114 | } 115 | `; 116 | }, 117 | }, { 118 | name: () => 'index.js', 119 | content: ({ name }) =>`import { NativeModules } from 'react-native'; 120 | 121 | const { ${name} } = NativeModules; 122 | 123 | export default ${name}; 124 | `, 125 | }, { 126 | name: () => '.gitignore', 127 | content: ({ platforms }) => { 128 | let content =`# OSX 129 | # 130 | .DS_Store 131 | 132 | # node.js 133 | # 134 | node_modules/ 135 | npm-debug.log 136 | yarn-error.log 137 | `; 138 | 139 | if (platforms.indexOf('ios') >= 0) { 140 | content += ` 141 | 142 | # Xcode 143 | # 144 | build/ 145 | *.pbxuser 146 | !default.pbxuser 147 | *.mode1v3 148 | !default.mode1v3 149 | *.mode2v3 150 | !default.mode2v3 151 | *.perspectivev3 152 | !default.perspectivev3 153 | xcuserdata 154 | *.xccheckout 155 | *.moved-aside 156 | DerivedData 157 | *.hmap 158 | *.ipa 159 | *.xcuserstate 160 | project.xcworkspace 161 | `; 162 | } 163 | 164 | if (platforms.indexOf('android') >= 0) { 165 | content += ` 166 | 167 | # Android/IntelliJ 168 | # 169 | build/ 170 | .idea 171 | .gradle 172 | local.properties 173 | *.iml 174 | 175 | # BUCK 176 | buck-out/ 177 | \\.buckd/ 178 | *.keystore 179 | `; 180 | } 181 | 182 | return content; 183 | }, 184 | }, { 185 | name: () => '.gitattributes', 186 | content: ({ platforms }) => { 187 | if (platforms.indexOf('ios') >= 0) { 188 | return '*.pbxproj -text\n'; 189 | } 190 | 191 | return ''; 192 | } 193 | }, { 194 | name: () => '.npmignore', 195 | content: ({ generateExample }) => { 196 | if (generateExample) { 197 | return 'example\n'; 198 | } 199 | 200 | return ''; 201 | } 202 | }]; 203 | -------------------------------------------------------------------------------- /templates/index.js: -------------------------------------------------------------------------------- 1 | const android = require('./android')('android'); 2 | const ios = require('./ios')('ios'); 3 | const windows = require('./windows')('windows'); 4 | 5 | const general = require('./general'); 6 | 7 | const updatePlatformInFile = platform => file => Object.assign(file, { platform }); 8 | 9 | module.exports = [].concat( 10 | general, 11 | android.map(updatePlatformInFile('android')), 12 | ios.map(updatePlatformInFile('ios')), 13 | windows.map(updatePlatformInFile('windows')), 14 | ); 15 | -------------------------------------------------------------------------------- /templates/ios.js: -------------------------------------------------------------------------------- 1 | /* eslint max-len: 0 */ 2 | 3 | module.exports = platform => [{ 4 | name: ({ name }) => `${name}.podspec`, 5 | content: ({ name }) => `require "json" 6 | 7 | package = JSON.parse(File.read(File.join(__dir__, "package.json"))) 8 | 9 | Pod::Spec.new do |s| 10 | s.name = "${name}" 11 | s.version = package["version"] 12 | s.summary = package["description"] 13 | s.description = <<-DESC 14 | ${name} 15 | DESC 16 | s.homepage = "https://github.com/author/${name}" 17 | s.license = "MIT" 18 | # s.license = { :type => "MIT", :file => "FILE_LICENSE" } 19 | s.author = { "author" => "author@domain.cn" } 20 | s.platform = :ios, "7.0" 21 | s.source = { :git => "https://github.com/author/${name}.git", :tag => "#{s.version}" } 22 | 23 | s.source_files = "ios/**/*.{h,m}" 24 | s.requires_arc = true 25 | 26 | s.dependency "React" 27 | #s.dependency "others" 28 | end 29 | 30 | `, 31 | }, { 32 | name: ({ name }) => `${platform}/${name}.h`, 33 | content: ({ name }) => `#if __has_include() 34 | #import 35 | #else 36 | #import "RCTBridgeModule.h" 37 | #endif 38 | 39 | @interface ${name} : NSObject 40 | 41 | @end 42 | `, 43 | }, { 44 | name: ({ name }) => `${platform}/${name}.m`, 45 | content: ({ name }) => `#import "${name}.h" 46 | 47 | @implementation ${name} 48 | 49 | RCT_EXPORT_MODULE() 50 | 51 | - (dispatch_queue_t)methodQueue 52 | { 53 | return dispatch_get_main_queue(); 54 | } 55 | 56 | RCT_EXPORT_METHOD(sampleMethod:(NSString *)stringArgument numberParameter:(nonnull NSNumber *)numberArgument callback:(RCTResponseSenderBlock)callback) 57 | { 58 | // TODO: Implement 59 | } 60 | 61 | @end 62 | `, 63 | }, { 64 | name: ({ name }) => `${platform}/${name}.xcworkspace/contents.xcworkspacedata`, 65 | content: ({ name }) => ` 66 | 68 | 70 | 71 | 72 | `, 73 | }, { 74 | name: ({ name }) => `${platform}/${name}.xcodeproj/project.pbxproj`, 75 | content: ({ name }) => `// !$*UTF8*$! 76 | { 77 | archiveVersion = 1; 78 | classes = { 79 | }; 80 | objectVersion = 46; 81 | objects = { 82 | 83 | /* Begin PBXBuildFile section */ 84 | B3E7B58A1CC2AC0600A0062D /* ${name}.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* ${name}.m */; }; 85 | /* End PBXBuildFile section */ 86 | 87 | /* Begin PBXCopyFilesBuildPhase section */ 88 | 58B511D91A9E6C8500147676 /* CopyFiles */ = { 89 | isa = PBXCopyFilesBuildPhase; 90 | buildActionMask = 2147483647; 91 | dstPath = "include/$(PRODUCT_NAME)"; 92 | dstSubfolderSpec = 16; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXCopyFilesBuildPhase section */ 98 | 99 | /* Begin PBXFileReference section */ 100 | 134814201AA4EA6300B7C361 /* lib${name}.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = lib${name}.a; sourceTree = BUILT_PRODUCTS_DIR; }; 101 | B3E7B5881CC2AC0600A0062D /* ${name}.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ${name}.h; sourceTree = ""; }; 102 | B3E7B5891CC2AC0600A0062D /* ${name}.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ${name}.m; sourceTree = ""; }; 103 | /* End PBXFileReference section */ 104 | 105 | /* Begin PBXFrameworksBuildPhase section */ 106 | 58B511D81A9E6C8500147676 /* Frameworks */ = { 107 | isa = PBXFrameworksBuildPhase; 108 | buildActionMask = 2147483647; 109 | files = ( 110 | ); 111 | runOnlyForDeploymentPostprocessing = 0; 112 | }; 113 | /* End PBXFrameworksBuildPhase section */ 114 | 115 | /* Begin PBXGroup section */ 116 | 134814211AA4EA7D00B7C361 /* Products */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 134814201AA4EA6300B7C361 /* lib${name}.a */, 120 | ); 121 | name = Products; 122 | sourceTree = ""; 123 | }; 124 | 58B511D21A9E6C8500147676 = { 125 | isa = PBXGroup; 126 | children = ( 127 | B3E7B5881CC2AC0600A0062D /* ${name}.h */, 128 | B3E7B5891CC2AC0600A0062D /* ${name}.m */, 129 | 134814211AA4EA7D00B7C361 /* Products */, 130 | ); 131 | sourceTree = ""; 132 | }; 133 | /* End PBXGroup section */ 134 | 135 | /* Begin PBXNativeTarget section */ 136 | 58B511DA1A9E6C8500147676 /* ${name} */ = { 137 | isa = PBXNativeTarget; 138 | buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "${name}" */; 139 | buildPhases = ( 140 | 58B511D71A9E6C8500147676 /* Sources */, 141 | 58B511D81A9E6C8500147676 /* Frameworks */, 142 | 58B511D91A9E6C8500147676 /* CopyFiles */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | ); 148 | name = ${name}; 149 | productName = RCTDataManager; 150 | productReference = 134814201AA4EA6300B7C361 /* lib${name}.a */; 151 | productType = "com.apple.product-type.library.static"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | 58B511D31A9E6C8500147676 /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 0920; 160 | ORGANIZATIONNAME = Facebook; 161 | TargetAttributes = { 162 | 58B511DA1A9E6C8500147676 = { 163 | CreatedOnToolsVersion = 6.1.1; 164 | }; 165 | }; 166 | }; 167 | buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "${name}" */; 168 | compatibilityVersion = "Xcode 3.2"; 169 | developmentRegion = English; 170 | hasScannedForEncodings = 0; 171 | knownRegions = ( 172 | en, 173 | ); 174 | mainGroup = 58B511D21A9E6C8500147676; 175 | productRefGroup = 58B511D21A9E6C8500147676; 176 | projectDirPath = ""; 177 | projectRoot = ""; 178 | targets = ( 179 | 58B511DA1A9E6C8500147676 /* ${name} */, 180 | ); 181 | }; 182 | /* End PBXProject section */ 183 | 184 | /* Begin PBXSourcesBuildPhase section */ 185 | 58B511D71A9E6C8500147676 /* Sources */ = { 186 | isa = PBXSourcesBuildPhase; 187 | buildActionMask = 2147483647; 188 | files = ( 189 | B3E7B58A1CC2AC0600A0062D /* ${name}.m in Sources */, 190 | ); 191 | runOnlyForDeploymentPostprocessing = 0; 192 | }; 193 | /* End PBXSourcesBuildPhase section */ 194 | 195 | /* Begin XCBuildConfiguration section */ 196 | 58B511ED1A9E6C8500147676 /* Debug */ = { 197 | isa = XCBuildConfiguration; 198 | buildSettings = { 199 | ALWAYS_SEARCH_USER_PATHS = NO; 200 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 201 | CLANG_CXX_LIBRARY = "libc++"; 202 | CLANG_ENABLE_MODULES = YES; 203 | CLANG_ENABLE_OBJC_ARC = YES; 204 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 205 | CLANG_WARN_BOOL_CONVERSION = YES; 206 | CLANG_WARN_COMMA = YES; 207 | CLANG_WARN_CONSTANT_CONVERSION = YES; 208 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 209 | CLANG_WARN_EMPTY_BODY = YES; 210 | CLANG_WARN_ENUM_CONVERSION = YES; 211 | CLANG_WARN_INFINITE_RECURSION = YES; 212 | CLANG_WARN_INT_CONVERSION = YES; 213 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 214 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 215 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 216 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 217 | CLANG_WARN_STRICT_PROTOTYPES = YES; 218 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 219 | CLANG_WARN_UNREACHABLE_CODE = YES; 220 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 221 | COPY_PHASE_STRIP = NO; 222 | ENABLE_STRICT_OBJC_MSGSEND = YES; 223 | ENABLE_TESTABILITY = YES; 224 | GCC_C_LANGUAGE_STANDARD = gnu99; 225 | GCC_DYNAMIC_NO_PIC = NO; 226 | GCC_NO_COMMON_BLOCKS = YES; 227 | GCC_OPTIMIZATION_LEVEL = 0; 228 | GCC_PREPROCESSOR_DEFINITIONS = ( 229 | "DEBUG=1", 230 | "$(inherited)", 231 | ); 232 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 233 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 234 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 235 | GCC_WARN_UNDECLARED_SELECTOR = YES; 236 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 237 | GCC_WARN_UNUSED_FUNCTION = YES; 238 | GCC_WARN_UNUSED_VARIABLE = YES; 239 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 240 | MTL_ENABLE_DEBUG_INFO = YES; 241 | ONLY_ACTIVE_ARCH = YES; 242 | SDKROOT = iphoneos; 243 | }; 244 | name = Debug; 245 | }; 246 | 58B511EE1A9E6C8500147676 /* Release */ = { 247 | isa = XCBuildConfiguration; 248 | buildSettings = { 249 | ALWAYS_SEARCH_USER_PATHS = NO; 250 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 251 | CLANG_CXX_LIBRARY = "libc++"; 252 | CLANG_ENABLE_MODULES = YES; 253 | CLANG_ENABLE_OBJC_ARC = YES; 254 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 255 | CLANG_WARN_BOOL_CONVERSION = YES; 256 | CLANG_WARN_COMMA = YES; 257 | CLANG_WARN_CONSTANT_CONVERSION = YES; 258 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 259 | CLANG_WARN_EMPTY_BODY = YES; 260 | CLANG_WARN_ENUM_CONVERSION = YES; 261 | CLANG_WARN_INFINITE_RECURSION = YES; 262 | CLANG_WARN_INT_CONVERSION = YES; 263 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 264 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 266 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 267 | CLANG_WARN_STRICT_PROTOTYPES = YES; 268 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 269 | CLANG_WARN_UNREACHABLE_CODE = YES; 270 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 271 | COPY_PHASE_STRIP = YES; 272 | ENABLE_NS_ASSERTIONS = NO; 273 | ENABLE_STRICT_OBJC_MSGSEND = YES; 274 | GCC_C_LANGUAGE_STANDARD = gnu99; 275 | GCC_NO_COMMON_BLOCKS = YES; 276 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 277 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 278 | GCC_WARN_UNDECLARED_SELECTOR = YES; 279 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 280 | GCC_WARN_UNUSED_FUNCTION = YES; 281 | GCC_WARN_UNUSED_VARIABLE = YES; 282 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 283 | MTL_ENABLE_DEBUG_INFO = NO; 284 | SDKROOT = iphoneos; 285 | VALIDATE_PRODUCT = YES; 286 | }; 287 | name = Release; 288 | }; 289 | 58B511F01A9E6C8500147676 /* Debug */ = { 290 | isa = XCBuildConfiguration; 291 | buildSettings = { 292 | HEADER_SEARCH_PATHS = ( 293 | "$(inherited)", 294 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 295 | "$(SRCROOT)/../../../React/**", 296 | "$(SRCROOT)/../../react-native/React/**", 297 | ); 298 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 299 | OTHER_LDFLAGS = "-ObjC"; 300 | PRODUCT_NAME = ${name}; 301 | SKIP_INSTALL = YES; 302 | }; 303 | name = Debug; 304 | }; 305 | 58B511F11A9E6C8500147676 /* Release */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | HEADER_SEARCH_PATHS = ( 309 | "$(inherited)", 310 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 311 | "$(SRCROOT)/../../../React/**", 312 | "$(SRCROOT)/../../react-native/React/**", 313 | ); 314 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 315 | OTHER_LDFLAGS = "-ObjC"; 316 | PRODUCT_NAME = ${name}; 317 | SKIP_INSTALL = YES; 318 | }; 319 | name = Release; 320 | }; 321 | /* End XCBuildConfiguration section */ 322 | 323 | /* Begin XCConfigurationList section */ 324 | 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "${name}" */ = { 325 | isa = XCConfigurationList; 326 | buildConfigurations = ( 327 | 58B511ED1A9E6C8500147676 /* Debug */, 328 | 58B511EE1A9E6C8500147676 /* Release */, 329 | ); 330 | defaultConfigurationIsVisible = 0; 331 | defaultConfigurationName = Release; 332 | }; 333 | 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "${name}" */ = { 334 | isa = XCConfigurationList; 335 | buildConfigurations = ( 336 | 58B511F01A9E6C8500147676 /* Debug */, 337 | 58B511F11A9E6C8500147676 /* Release */, 338 | ); 339 | defaultConfigurationIsVisible = 0; 340 | defaultConfigurationName = Release; 341 | }; 342 | /* End XCConfigurationList section */ 343 | }; 344 | rootObject = 58B511D31A9E6C8500147676 /* Project object */; 345 | } 346 | `, 347 | }]; 348 | -------------------------------------------------------------------------------- /templates/windows.js: -------------------------------------------------------------------------------- 1 | /* eslint max-len: 0 */ 2 | const uuid = require('uuid').v1().toUpperCase(); 3 | 4 | module.exports = platform => [{ 5 | name: ({ name }) => `${platform}/${name}.sln`, 6 | content: ({ name }) => 7 | `Microsoft Visual Studio Solution File, Format Version 12.00 8 | # Visual Studio 14 9 | VisualStudioVersion = 14.0.25123.0 10 | MinimumVisualStudioVersion = 10.0.40219.1 11 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "${name}", "${name}\\${name}.csproj", "{${uuid}}" 12 | EndProject 13 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactNative", "..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj", "{C7673AD5-E3AA-468C-A5FD-FA38154E205C}" 14 | EndProject 15 | Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ReactNative.Shared", "..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.shproj", "{EEA8B852-4D07-48E1-8294-A21AB5909FE5}" 16 | EndProject 17 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraBridge", "..\\node_modules\\react-native-windows\\ReactWindows\\ChakraBridge\\ChakraBridge.vcxproj", "{4B72C796-16D5-4E3A-81C0-3E36F531E578}" 18 | EndProject 19 | Global 20 | GlobalSection(SharedMSBuildProjectFiles) = preSolution 21 | ..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4 22 | ..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13 23 | EndGlobalSection 24 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 25 | Debug|ARM = Debug|ARM 26 | Debug|x64 = Debug|x64 27 | Debug|x86 = Debug|x86 28 | Development|ARM = Development|ARM 29 | Development|x64 = Development|x64 30 | Development|x86 = Development|x86 31 | Release|ARM = Release|ARM 32 | Release|x64 = Release|x64 33 | Release|x86 = Release|x86 34 | EndGlobalSection 35 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 36 | {${uuid}}.Debug|ARM.ActiveCfg = Debug|ARM 37 | {${uuid}}.Debug|ARM.Build.0 = Debug|ARM 38 | {${uuid}}.Debug|x64.ActiveCfg = Debug|x64 39 | {${uuid}}.Debug|x64.Build.0 = Debug|x64 40 | {${uuid}}.Debug|x86.ActiveCfg = Debug|x86 41 | {${uuid}}.Debug|x86.Build.0 = Debug|x86 42 | {${uuid}}.Development|ARM.ActiveCfg = Development|ARM 43 | {${uuid}}.Development|ARM.Build.0 = Development|ARM 44 | {${uuid}}.Development|x64.ActiveCfg = Development|x64 45 | {${uuid}}.Development|x64.Build.0 = Development|x64 46 | {${uuid}}.Development|x86.ActiveCfg = Development|x86 47 | {${uuid}}.Development|x86.Build.0 = Development|x86 48 | {${uuid}}.Release|ARM.ActiveCfg = Release|ARM 49 | {${uuid}}.Release|ARM.Build.0 = Release|ARM 50 | {${uuid}}.Release|x64.ActiveCfg = Release|x64 51 | {${uuid}}.Release|x64.Build.0 = Release|x64 52 | {${uuid}}.Release|x86.ActiveCfg = Release|x86 53 | {${uuid}}.Release|x86.Build.0 = Release|x86 54 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM 55 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM 56 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64 57 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64 58 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86 59 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86 60 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.ActiveCfg = Debug|ARM 61 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.Build.0 = Debug|ARM 62 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.ActiveCfg = Debug|x64 63 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.Build.0 = Debug|x64 64 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.ActiveCfg = Debug|x86 65 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.Build.0 = Debug|x86 66 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM 67 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM 68 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64 69 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64 70 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86 71 | {C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86 72 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM 73 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM 74 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64 75 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64 76 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32 77 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32 78 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.ActiveCfg = Debug|ARM 79 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.Build.0 = Debug|ARM 80 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.ActiveCfg = Debug|x64 81 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.Build.0 = Debug|x64 82 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.ActiveCfg = Debug|Win32 83 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.Build.0 = Debug|Win32 84 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM 85 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM 86 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64 87 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64 88 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32 89 | {4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32 90 | EndGlobalSection 91 | GlobalSection(SolutionProperties) = preSolution 92 | HideSolutionNode = FALSE 93 | EndGlobalSection 94 | EndGlobal 95 | `, 96 | }, { 97 | name: () => `${platform}/.gitignore`, 98 | content: () => 99 | `*AppPackages* 100 | *BundleArtifacts* 101 | *ReactAssets* 102 | 103 | #OS junk files 104 | [Tt]humbs.db 105 | *.DS_Store 106 | 107 | #Visual Studio files 108 | *.[Oo]bj 109 | *.user 110 | *.aps 111 | *.pch 112 | *.vspscc 113 | *.vssscc 114 | *_i.c 115 | *_p.c 116 | *.ncb 117 | *.suo 118 | *.tlb 119 | *.tlh 120 | *.bak 121 | *.[Cc]ache 122 | *.ilk 123 | *.log 124 | *.lib 125 | *.sbr 126 | *.sdf 127 | *.opensdf 128 | *.opendb 129 | *.unsuccessfulbuild 130 | ipch/ 131 | [Oo]bj/ 132 | [Bb]in 133 | [Dd]ebug*/ 134 | [Rr]elease*/ 135 | Ankh.NoLoad 136 | 137 | #MonoDevelop 138 | *.pidb 139 | *.userprefs 140 | 141 | #Tooling 142 | _ReSharper*/ 143 | *.resharper 144 | [Tt]est[Rr]esult* 145 | *.sass-cache 146 | 147 | #Project files 148 | [Bb]uild/ 149 | 150 | #Subversion files 151 | .svn 152 | 153 | # Office Temp Files 154 | ~$* 155 | 156 | # vim Temp Files 157 | *~ 158 | 159 | #NuGet 160 | packages/ 161 | *.nupkg 162 | 163 | #ncrunch 164 | *ncrunch* 165 | *crunch*.local.xml 166 | 167 | # visual studio database projects 168 | *.dbmdl 169 | 170 | #Test files 171 | *.testsettings 172 | 173 | #Other files 174 | *.DotSettings 175 | .vs/ 176 | *project.lock.json 177 | `, 178 | }, { 179 | name: ({ name }) => `${platform}/.npmignore`, 180 | content: () => 181 | ` 182 | # Make sure we don't publish build artifacts to NPM 183 | ARM/ 184 | Debug/ 185 | x64/ 186 | x86/ 187 | bin/ 188 | obj/ 189 | .vs/ 190 | ` 191 | }, { 192 | name: ({ name }) => `${platform}/${name}/project.json`, 193 | content: () => 194 | `{ 195 | "dependencies": { 196 | "Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2" 197 | }, 198 | "frameworks": { 199 | "uap10.0": {} 200 | }, 201 | "runtimes": { 202 | "win10-arm": {}, 203 | "win10-arm-aot": {}, 204 | "win10-x86": {}, 205 | "win10-x86-aot": {}, 206 | "win10-x64": {}, 207 | "win10-x64-aot": {} 208 | } 209 | } 210 | `, 211 | }, { 212 | name: ({ name }) => `${platform}/${name}/${name}.csproj`, 213 | content: ({ name, namespace }) => 214 | ` 215 | 216 | 217 | 218 | Debug 219 | x86 220 | {${uuid}} 221 | Library 222 | Properties 223 | ${namespace} 224 | ${namespace} 225 | en-US 226 | UAP 227 | 10.0.10586.0 228 | 10.0.10240.0 229 | 14 230 | 512 231 | {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 232 | ..\\..\\node_modules 233 | 234 | 235 | ..\\.. 236 | 237 | 238 | x86 239 | true 240 | bin\\x86\\Debug\\ 241 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 242 | ;2008 243 | full 244 | x86 245 | false 246 | prompt 247 | 248 | 249 | x86 250 | bin\\x86\\Release\\ 251 | TRACE;NETFX_CORE;WINDOWS_UWP 252 | true 253 | ;2008 254 | pdbonly 255 | x86 256 | false 257 | prompt 258 | 259 | 260 | ARM 261 | true 262 | bin\\ARM\\Debug\\ 263 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 264 | ;2008 265 | full 266 | ARM 267 | false 268 | prompt 269 | 270 | 271 | ARM 272 | bin\\ARM\\Release\\ 273 | TRACE;NETFX_CORE;WINDOWS_UWP 274 | true 275 | ;2008 276 | pdbonly 277 | ARM 278 | false 279 | prompt 280 | 281 | 282 | x64 283 | true 284 | bin\\x64\\Debug\\ 285 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 286 | ;2008 287 | full 288 | x64 289 | false 290 | prompt 291 | 292 | 293 | x64 294 | bin\\x64\\Release\\ 295 | TRACE;NETFX_CORE;WINDOWS_UWP 296 | true 297 | ;2008 298 | pdbonly 299 | x64 300 | false 301 | prompt 302 | 303 | 304 | true 305 | bin\\x86\\Development\\ 306 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 307 | ;2008 308 | true 309 | full 310 | x86 311 | false 312 | prompt 313 | MinimumRecommendedRules.ruleset 314 | 315 | 316 | true 317 | bin\\ARM\\Development\\ 318 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 319 | ;2008 320 | true 321 | full 322 | ARM 323 | false 324 | prompt 325 | MinimumRecommendedRules.ruleset 326 | 327 | 328 | true 329 | bin\\x64\\Development\\ 330 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 331 | ;2008 332 | true 333 | full 334 | x64 335 | false 336 | prompt 337 | MinimumRecommendedRules.ruleset 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | {c7673ad5-e3aa-468c-a5fd-fa38154e205c} 352 | ReactNative 353 | 354 | 355 | 356 | 14.0 357 | 358 | 359 | 366 | 367 | `, 368 | }, { 369 | name: ({ name }) => `${platform}/${name}/${name}Module.cs`, 370 | content: ({ name, namespace }) => 371 | `using ReactNative.Bridge; 372 | using System; 373 | using System.Collections.Generic; 374 | using Windows.ApplicationModel.Core; 375 | using Windows.UI.Core; 376 | 377 | namespace ${namespace}.${name} 378 | { 379 | /// 380 | /// A module that allows JS to share data. 381 | /// 382 | class ${name}Module : NativeModuleBase 383 | { 384 | /// 385 | /// Instantiates the . 386 | /// 387 | internal ${name}Module() 388 | { 389 | 390 | } 391 | 392 | /// 393 | /// The name of the native module. 394 | /// 395 | public override string Name 396 | { 397 | get 398 | { 399 | return "${name}"; 400 | } 401 | } 402 | } 403 | } 404 | `, 405 | }, { 406 | name: ({ name }) => `${platform}/${name}/${name}Package.cs`, 407 | content: ({ name, namespace }) => 408 | `using ReactNative.Bridge; 409 | using ReactNative.Modules.Core; 410 | using ReactNative.UIManager; 411 | using System; 412 | using System.Collections.Generic; 413 | 414 | namespace ${namespace}.${name} 415 | { 416 | /// 417 | /// Package defining core framework modules (e.g., ). 418 | /// It should be used for modules that require special integration with 419 | /// other framework parts (e.g., with the list of packages to load view 420 | /// managers from). 421 | /// 422 | public class ${name}Package : IReactPackage 423 | { 424 | /// 425 | /// Creates the list of native modules to register with the react 426 | /// instance. 427 | /// 428 | /// The react application context. 429 | /// The list of native modules. 430 | public IReadOnlyList CreateNativeModules(ReactContext reactContext) 431 | { 432 | return new List 433 | { 434 | new ${name}Module(), 435 | }; 436 | } 437 | 438 | /// 439 | /// Creates the list of JavaScript modules to register with the 440 | /// react instance. 441 | /// 442 | /// The list of JavaScript modules. 443 | public IReadOnlyList CreateJavaScriptModulesConfig() 444 | { 445 | return new List(0); 446 | } 447 | 448 | /// 449 | /// Creates the list of view managers that should be registered with 450 | /// the . 451 | /// 452 | /// The react application context. 453 | /// The list of view managers. 454 | public IReadOnlyList CreateViewManagers( 455 | ReactContext reactContext) 456 | { 457 | return new List(0); 458 | } 459 | } 460 | } 461 | `, 462 | }, { 463 | name: ({ name }) => `${platform}/${name}/Properties/${name}.rd.xml`, 464 | content: ({ name }) => 465 | ` 466 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | `, 494 | }, { 495 | name: ({ name }) => `${platform}/${name}/Properties/AssemblyInfo.cs`, 496 | content: ({ name }) => 497 | `using System.Reflection; 498 | using System.Runtime.CompilerServices; 499 | using System.Runtime.InteropServices; 500 | 501 | // General Information about an assembly is controlled through the following 502 | // set of attributes. Change these attribute values to modify the information 503 | // associated with an assembly. 504 | [assembly: AssemblyTitle("${name}")] 505 | [assembly: AssemblyDescription("")] 506 | [assembly: AssemblyConfiguration("")] 507 | [assembly: AssemblyCompany("")] 508 | [assembly: AssemblyProduct("${name}")] 509 | [assembly: AssemblyCopyright("Copyright © 2016")] 510 | [assembly: AssemblyTrademark("")] 511 | [assembly: AssemblyCulture("")] 512 | 513 | // Version information for an assembly consists of the following four values: 514 | // 515 | // Major Version 516 | // Minor Version 517 | // Build Number 518 | // Revision 519 | // 520 | // You can specify all the values or you can default the Build and Revision Numbers 521 | // by using the '*' as shown below: 522 | // [assembly: AssemblyVersion("1.0.*")] 523 | [assembly: AssemblyVersion("1.0.0.0")] 524 | [assembly: AssemblyFileVersion("1.0.0.0")] 525 | [assembly: ComVisible(false)] 526 | `, 527 | }]; 528 | -------------------------------------------------------------------------------- /utils/createFile.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | module.exports = (filename, content) => 4 | new Promise((resolve, reject) => { 5 | fs.writeFile( 6 | filename, 7 | content, 8 | (err) => { 9 | if (err) { 10 | return reject(err); 11 | } 12 | 13 | return resolve(); 14 | } 15 | ); 16 | }); 17 | -------------------------------------------------------------------------------- /utils/createFolder.js: -------------------------------------------------------------------------------- 1 | const mkdirp = require('mkdirp'); 2 | 3 | module.exports = folder => 4 | new Promise((resolve, reject) => { 5 | if (!folder) { 6 | resolve(); 7 | return; 8 | } 9 | 10 | mkdirp(folder, (err) => { 11 | if (err) { 12 | return reject(err); 13 | } 14 | 15 | return resolve(); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /utils/exec.js: -------------------------------------------------------------------------------- 1 | var cp = require('child_process'); 2 | 3 | module.exports = (command, options) => { 4 | return new Promise((resolve, reject) => { 5 | try { 6 | // We use execSync in here to be able to output the stdout to standard out 7 | const stdout = cp.execSync(command, options); 8 | return resolve(stdout); 9 | } catch (e) { 10 | return reject(e); 11 | } 12 | }); 13 | }; 14 | -------------------------------------------------------------------------------- /utils/hasPrefix.js: -------------------------------------------------------------------------------- 1 | const isUpperCase = require('./isUpperCase'); 2 | 3 | module.exports = name => isUpperCase(name, 0) && isUpperCase(name, 1); 4 | -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | const hasPrefix = require('./hasPrefix'); 2 | const createFile = require('./createFile'); 3 | const createFolder = require('./createFolder'); 4 | const npmAddScriptSync = require('./npmAddScriptSync'); 5 | const exec = require('./exec'); 6 | 7 | module.exports = { 8 | hasPrefix, 9 | createFile, 10 | createFolder, 11 | npmAddScriptSync, 12 | exec, 13 | }; 14 | -------------------------------------------------------------------------------- /utils/isUpperCase.js: -------------------------------------------------------------------------------- 1 | module.exports = (str, index) => str[index].toUpperCase() === str[index]; 2 | -------------------------------------------------------------------------------- /utils/npmAddScriptSync.js: -------------------------------------------------------------------------------- 1 | const jsonfile = require('jsonfile') 2 | 3 | // Add a script entry to a package.json file at the packageJsonPath. 4 | // The script parameter shoud be of {key: key, value: value} 5 | module.exports = (packageJsonPath, script) => { 6 | try { 7 | var packageJson = jsonfile.readFileSync(packageJsonPath); 8 | if (!packageJson.scripts) packageJson.scripts = {}; 9 | if (!script.force && packageJson.scripts[script.key]) { 10 | throw new Error(`That script entry for key: ${script.key} already exists.`); 11 | } 12 | packageJson.scripts[script.key] = script.value; 13 | jsonfile.writeFileSync(packageJsonPath, packageJson, {spaces: 2}); 14 | } catch (e) { 15 | if (e.message === 'ENOENT, no such file or directory \'package.json\'') { 16 | throw new Error(`The package.json at path: ${packageJsonPath} does not exist.`); 17 | } else { 18 | throw e; 19 | } 20 | } 21 | }; 22 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@4.0.4: 12 | version "4.0.4" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" 14 | 15 | acorn@^3.0.4: 16 | version "3.3.0" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 18 | 19 | ajv-keywords@^1.0.0: 20 | version "1.5.1" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 22 | 23 | ajv@^4.7.0: 24 | version "4.11.3" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.3.tgz#ce30bdb90d1254f762c75af915fb3a63e7183d22" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | ansi-align@^1.1.0: 31 | version "1.1.0" 32 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" 33 | dependencies: 34 | string-width "^1.0.1" 35 | 36 | ansi-escapes@^1.1.0: 37 | version "1.4.0" 38 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 39 | 40 | ansi-regex@^2.0.0: 41 | version "2.1.1" 42 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 43 | 44 | ansi-styles@^2.2.1: 45 | version "2.2.1" 46 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 47 | 48 | argparse@^1.0.7: 49 | version "1.0.9" 50 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 51 | dependencies: 52 | sprintf-js "~1.0.2" 53 | 54 | array-union@^1.0.1: 55 | version "1.0.2" 56 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 57 | dependencies: 58 | array-uniq "^1.0.1" 59 | 60 | array-uniq@^1.0.1: 61 | version "1.0.3" 62 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 63 | 64 | arrify@^1.0.0: 65 | version "1.0.1" 66 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 67 | 68 | babel-code-frame@^6.16.0: 69 | version "6.22.0" 70 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 71 | dependencies: 72 | chalk "^1.1.0" 73 | esutils "^2.0.2" 74 | js-tokens "^3.0.0" 75 | 76 | balanced-match@^0.4.1: 77 | version "0.4.2" 78 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 79 | 80 | boxen@^1.0.0: 81 | version "1.0.0" 82 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.0.0.tgz#b2694baf1f605f708ff0177c12193b22f29aaaab" 83 | dependencies: 84 | ansi-align "^1.1.0" 85 | camelcase "^4.0.0" 86 | chalk "^1.1.1" 87 | cli-boxes "^1.0.0" 88 | string-width "^2.0.0" 89 | term-size "^0.1.0" 90 | widest-line "^1.0.0" 91 | 92 | brace-expansion@^1.0.0: 93 | version "1.1.6" 94 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 95 | dependencies: 96 | balanced-match "^0.4.1" 97 | concat-map "0.0.1" 98 | 99 | buffer-shims@^1.0.0: 100 | version "1.0.0" 101 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 102 | 103 | builtin-modules@^1.1.1: 104 | version "1.1.1" 105 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 106 | 107 | caller-path@^0.1.0: 108 | version "0.1.0" 109 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 110 | dependencies: 111 | callsites "^0.2.0" 112 | 113 | callsites@^0.2.0: 114 | version "0.2.0" 115 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 116 | 117 | camel-case@^3.0.0: 118 | version "3.0.0" 119 | resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" 120 | dependencies: 121 | no-case "^2.2.0" 122 | upper-case "^1.1.1" 123 | 124 | camelcase@^4.0.0: 125 | version "4.0.0" 126 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.0.0.tgz#8b0f90d44be5e281b903b9887349b92595ef07f2" 127 | 128 | capture-stack-trace@^1.0.0: 129 | version "1.0.0" 130 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 131 | 132 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 133 | version "1.1.3" 134 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 135 | dependencies: 136 | ansi-styles "^2.2.1" 137 | escape-string-regexp "^1.0.2" 138 | has-ansi "^2.0.0" 139 | strip-ansi "^3.0.0" 140 | supports-color "^2.0.0" 141 | 142 | circular-json@^0.3.1: 143 | version "0.3.1" 144 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 145 | 146 | cli-boxes@^1.0.0: 147 | version "1.0.0" 148 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 149 | 150 | cli-cursor@^1.0.1: 151 | version "1.0.2" 152 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 153 | dependencies: 154 | restore-cursor "^1.0.1" 155 | 156 | cli-width@^2.0.0: 157 | version "2.1.0" 158 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 159 | 160 | co@^4.6.0: 161 | version "4.6.0" 162 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 163 | 164 | code-point-at@^1.0.0: 165 | version "1.1.0" 166 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 167 | 168 | commander@^2.9.0: 169 | version "2.9.0" 170 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 171 | dependencies: 172 | graceful-readlink ">= 1.0.0" 173 | 174 | concat-map@0.0.1: 175 | version "0.0.1" 176 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 177 | 178 | concat-stream@^1.4.6: 179 | version "1.6.0" 180 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 181 | dependencies: 182 | inherits "^2.0.3" 183 | readable-stream "^2.2.2" 184 | typedarray "^0.0.6" 185 | 186 | configstore@^3.0.0: 187 | version "3.0.0" 188 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" 189 | dependencies: 190 | dot-prop "^4.1.0" 191 | graceful-fs "^4.1.2" 192 | mkdirp "^0.5.0" 193 | unique-string "^1.0.0" 194 | write-file-atomic "^1.1.2" 195 | xdg-basedir "^3.0.0" 196 | 197 | contains-path@^0.1.0: 198 | version "0.1.0" 199 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 200 | 201 | core-util-is@~1.0.0: 202 | version "1.0.2" 203 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 204 | 205 | create-error-class@^3.0.0: 206 | version "3.0.2" 207 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 208 | dependencies: 209 | capture-stack-trace "^1.0.0" 210 | 211 | cross-spawn-async@^2.1.1: 212 | version "2.2.5" 213 | resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" 214 | dependencies: 215 | lru-cache "^4.0.0" 216 | which "^1.2.8" 217 | 218 | crypto-random-string@^1.0.0: 219 | version "1.0.0" 220 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 221 | 222 | d@^0.1.1, d@~0.1.1: 223 | version "0.1.1" 224 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 225 | dependencies: 226 | es5-ext "~0.10.2" 227 | 228 | debug@2.2.0: 229 | version "2.2.0" 230 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 231 | dependencies: 232 | ms "0.7.1" 233 | 234 | debug@^2.1.1, debug@^2.2.0: 235 | version "2.6.1" 236 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" 237 | dependencies: 238 | ms "0.7.2" 239 | 240 | deep-extend@~0.4.0: 241 | version "0.4.1" 242 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 243 | 244 | deep-is@~0.1.3: 245 | version "0.1.3" 246 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 247 | 248 | del@^2.0.2: 249 | version "2.2.2" 250 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 251 | dependencies: 252 | globby "^5.0.0" 253 | is-path-cwd "^1.0.0" 254 | is-path-in-cwd "^1.0.0" 255 | object-assign "^4.0.1" 256 | pify "^2.0.0" 257 | pinkie-promise "^2.0.0" 258 | rimraf "^2.2.8" 259 | 260 | doctrine@1.5.0, doctrine@^1.2.2: 261 | version "1.5.0" 262 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 263 | dependencies: 264 | esutils "^2.0.2" 265 | isarray "^1.0.0" 266 | 267 | dot-prop@^4.1.0: 268 | version "4.1.1" 269 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" 270 | dependencies: 271 | is-obj "^1.0.0" 272 | 273 | duplexer3@^0.1.4: 274 | version "0.1.4" 275 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 276 | 277 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 278 | version "0.10.12" 279 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 280 | dependencies: 281 | es6-iterator "2" 282 | es6-symbol "~3.1" 283 | 284 | es6-iterator@2: 285 | version "2.0.0" 286 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 287 | dependencies: 288 | d "^0.1.1" 289 | es5-ext "^0.10.7" 290 | es6-symbol "3" 291 | 292 | es6-map@^0.1.3: 293 | version "0.1.4" 294 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 295 | dependencies: 296 | d "~0.1.1" 297 | es5-ext "~0.10.11" 298 | es6-iterator "2" 299 | es6-set "~0.1.3" 300 | es6-symbol "~3.1.0" 301 | event-emitter "~0.3.4" 302 | 303 | es6-set@~0.1.3: 304 | version "0.1.4" 305 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 306 | dependencies: 307 | d "~0.1.1" 308 | es5-ext "~0.10.11" 309 | es6-iterator "2" 310 | es6-symbol "3" 311 | event-emitter "~0.3.4" 312 | 313 | es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: 314 | version "3.1.0" 315 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 316 | dependencies: 317 | d "~0.1.1" 318 | es5-ext "~0.10.11" 319 | 320 | es6-weak-map@^2.0.1: 321 | version "2.0.1" 322 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 323 | dependencies: 324 | d "^0.1.1" 325 | es5-ext "^0.10.8" 326 | es6-iterator "2" 327 | es6-symbol "3" 328 | 329 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 330 | version "1.0.5" 331 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 332 | 333 | escope@^3.6.0: 334 | version "3.6.0" 335 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 336 | dependencies: 337 | es6-map "^0.1.3" 338 | es6-weak-map "^2.0.1" 339 | esrecurse "^4.1.0" 340 | estraverse "^4.1.1" 341 | 342 | eslint-config-airbnb-base@^11.1.0: 343 | version "11.1.0" 344 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.1.0.tgz#dc9b3ec70b8c74dcbe6d6257c9da3992c39ca2ca" 345 | 346 | eslint-import-resolver-node@^0.2.0: 347 | version "0.2.3" 348 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" 349 | dependencies: 350 | debug "^2.2.0" 351 | object-assign "^4.0.1" 352 | resolve "^1.1.6" 353 | 354 | eslint-module-utils@^2.0.0: 355 | version "2.0.0" 356 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" 357 | dependencies: 358 | debug "2.2.0" 359 | pkg-dir "^1.0.0" 360 | 361 | eslint-plugin-import@^2.2.0: 362 | version "2.2.0" 363 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" 364 | dependencies: 365 | builtin-modules "^1.1.1" 366 | contains-path "^0.1.0" 367 | debug "^2.2.0" 368 | doctrine "1.5.0" 369 | eslint-import-resolver-node "^0.2.0" 370 | eslint-module-utils "^2.0.0" 371 | has "^1.0.1" 372 | lodash.cond "^4.3.0" 373 | minimatch "^3.0.3" 374 | pkg-up "^1.0.0" 375 | 376 | eslint@^3.16.0: 377 | version "3.16.0" 378 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.16.0.tgz#4a468ab93618a9eb6e3f1499038b38851f828630" 379 | dependencies: 380 | babel-code-frame "^6.16.0" 381 | chalk "^1.1.3" 382 | concat-stream "^1.4.6" 383 | debug "^2.1.1" 384 | doctrine "^1.2.2" 385 | escope "^3.6.0" 386 | espree "^3.4.0" 387 | estraverse "^4.2.0" 388 | esutils "^2.0.2" 389 | file-entry-cache "^2.0.0" 390 | glob "^7.0.3" 391 | globals "^9.14.0" 392 | ignore "^3.2.0" 393 | imurmurhash "^0.1.4" 394 | inquirer "^0.12.0" 395 | is-my-json-valid "^2.10.0" 396 | is-resolvable "^1.0.0" 397 | js-yaml "^3.5.1" 398 | json-stable-stringify "^1.0.0" 399 | levn "^0.3.0" 400 | lodash "^4.0.0" 401 | mkdirp "^0.5.0" 402 | natural-compare "^1.4.0" 403 | optionator "^0.8.2" 404 | path-is-inside "^1.0.1" 405 | pluralize "^1.2.1" 406 | progress "^1.1.8" 407 | require-uncached "^1.0.2" 408 | shelljs "^0.7.5" 409 | strip-bom "^3.0.0" 410 | strip-json-comments "~2.0.1" 411 | table "^3.7.8" 412 | text-table "~0.2.0" 413 | user-home "^2.0.0" 414 | 415 | espree@^3.4.0: 416 | version "3.4.0" 417 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d" 418 | dependencies: 419 | acorn "4.0.4" 420 | acorn-jsx "^3.0.0" 421 | 422 | esprima@^3.1.1: 423 | version "3.1.3" 424 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 425 | 426 | esrecurse@^4.1.0: 427 | version "4.1.0" 428 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 429 | dependencies: 430 | estraverse "~4.1.0" 431 | object-assign "^4.0.1" 432 | 433 | estraverse@^4.1.1, estraverse@^4.2.0: 434 | version "4.2.0" 435 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 436 | 437 | estraverse@~4.1.0: 438 | version "4.1.1" 439 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 440 | 441 | esutils@^2.0.2: 442 | version "2.0.2" 443 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 444 | 445 | event-emitter@~0.3.4: 446 | version "0.3.4" 447 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 448 | dependencies: 449 | d "~0.1.1" 450 | es5-ext "~0.10.7" 451 | 452 | execa@^0.4.0: 453 | version "0.4.0" 454 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" 455 | dependencies: 456 | cross-spawn-async "^2.1.1" 457 | is-stream "^1.1.0" 458 | npm-run-path "^1.0.0" 459 | object-assign "^4.0.1" 460 | path-key "^1.0.0" 461 | strip-eof "^1.0.0" 462 | 463 | exit-hook@^1.0.0: 464 | version "1.1.1" 465 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 466 | 467 | fast-levenshtein@~2.0.4: 468 | version "2.0.6" 469 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 470 | 471 | figures@^1.3.5: 472 | version "1.7.0" 473 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 474 | dependencies: 475 | escape-string-regexp "^1.0.5" 476 | object-assign "^4.1.0" 477 | 478 | file-entry-cache@^2.0.0: 479 | version "2.0.0" 480 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 481 | dependencies: 482 | flat-cache "^1.2.1" 483 | object-assign "^4.0.1" 484 | 485 | find-up@^1.0.0: 486 | version "1.1.2" 487 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 488 | dependencies: 489 | path-exists "^2.0.0" 490 | pinkie-promise "^2.0.0" 491 | 492 | flat-cache@^1.2.1: 493 | version "1.2.2" 494 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 495 | dependencies: 496 | circular-json "^0.3.1" 497 | del "^2.0.2" 498 | graceful-fs "^4.1.2" 499 | write "^0.2.1" 500 | 501 | fs.realpath@^1.0.0: 502 | version "1.0.0" 503 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 504 | 505 | function-bind@^1.0.2: 506 | version "1.1.0" 507 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 508 | 509 | generate-function@^2.0.0: 510 | version "2.0.0" 511 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 512 | 513 | generate-object-property@^1.1.0: 514 | version "1.2.0" 515 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 516 | dependencies: 517 | is-property "^1.0.0" 518 | 519 | get-stream@^3.0.0: 520 | version "3.0.0" 521 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 522 | 523 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: 524 | version "7.1.1" 525 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 526 | dependencies: 527 | fs.realpath "^1.0.0" 528 | inflight "^1.0.4" 529 | inherits "2" 530 | minimatch "^3.0.2" 531 | once "^1.3.0" 532 | path-is-absolute "^1.0.0" 533 | 534 | globals@^9.14.0: 535 | version "9.16.0" 536 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80" 537 | 538 | globby@^5.0.0: 539 | version "5.0.0" 540 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 541 | dependencies: 542 | array-union "^1.0.1" 543 | arrify "^1.0.0" 544 | glob "^7.0.3" 545 | object-assign "^4.0.1" 546 | pify "^2.0.0" 547 | pinkie-promise "^2.0.0" 548 | 549 | got@^6.7.1: 550 | version "6.7.1" 551 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 552 | dependencies: 553 | create-error-class "^3.0.0" 554 | duplexer3 "^0.1.4" 555 | get-stream "^3.0.0" 556 | is-redirect "^1.0.0" 557 | is-retry-allowed "^1.0.0" 558 | is-stream "^1.0.0" 559 | lowercase-keys "^1.0.0" 560 | safe-buffer "^5.0.1" 561 | timed-out "^4.0.0" 562 | unzip-response "^2.0.1" 563 | url-parse-lax "^1.0.0" 564 | 565 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 566 | version "4.1.11" 567 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 568 | 569 | "graceful-readlink@>= 1.0.0": 570 | version "1.0.1" 571 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 572 | 573 | has-ansi@^2.0.0: 574 | version "2.0.0" 575 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 576 | dependencies: 577 | ansi-regex "^2.0.0" 578 | 579 | has@^1.0.1: 580 | version "1.0.1" 581 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 582 | dependencies: 583 | function-bind "^1.0.2" 584 | 585 | ignore@^3.2.0: 586 | version "3.2.4" 587 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.4.tgz#4055e03596729a8fabe45a43c100ad5ed815c4e8" 588 | 589 | imurmurhash@^0.1.4: 590 | version "0.1.4" 591 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 592 | 593 | inflight@^1.0.4: 594 | version "1.0.6" 595 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 596 | dependencies: 597 | once "^1.3.0" 598 | wrappy "1" 599 | 600 | inherits@2, inherits@^2.0.3, inherits@~2.0.1: 601 | version "2.0.3" 602 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 603 | 604 | ini@~1.3.0: 605 | version "1.3.4" 606 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 607 | 608 | inquirer@^0.12.0: 609 | version "0.12.0" 610 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 611 | dependencies: 612 | ansi-escapes "^1.1.0" 613 | ansi-regex "^2.0.0" 614 | chalk "^1.0.0" 615 | cli-cursor "^1.0.1" 616 | cli-width "^2.0.0" 617 | figures "^1.3.5" 618 | lodash "^4.3.0" 619 | readline2 "^1.0.1" 620 | run-async "^0.1.0" 621 | rx-lite "^3.1.2" 622 | string-width "^1.0.1" 623 | strip-ansi "^3.0.0" 624 | through "^2.3.6" 625 | 626 | interpret@^1.0.0: 627 | version "1.0.1" 628 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 629 | 630 | is-fullwidth-code-point@^1.0.0: 631 | version "1.0.0" 632 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 633 | dependencies: 634 | number-is-nan "^1.0.0" 635 | 636 | is-fullwidth-code-point@^2.0.0: 637 | version "2.0.0" 638 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 639 | 640 | is-my-json-valid@^2.10.0: 641 | version "2.15.0" 642 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 643 | dependencies: 644 | generate-function "^2.0.0" 645 | generate-object-property "^1.1.0" 646 | jsonpointer "^4.0.0" 647 | xtend "^4.0.0" 648 | 649 | is-npm@^1.0.0: 650 | version "1.0.0" 651 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 652 | 653 | is-obj@^1.0.0: 654 | version "1.0.1" 655 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 656 | 657 | is-path-cwd@^1.0.0: 658 | version "1.0.0" 659 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 660 | 661 | is-path-in-cwd@^1.0.0: 662 | version "1.0.0" 663 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 664 | dependencies: 665 | is-path-inside "^1.0.0" 666 | 667 | is-path-inside@^1.0.0: 668 | version "1.0.0" 669 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 670 | dependencies: 671 | path-is-inside "^1.0.1" 672 | 673 | is-property@^1.0.0: 674 | version "1.0.2" 675 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 676 | 677 | is-redirect@^1.0.0: 678 | version "1.0.0" 679 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 680 | 681 | is-resolvable@^1.0.0: 682 | version "1.0.0" 683 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 684 | dependencies: 685 | tryit "^1.0.1" 686 | 687 | is-retry-allowed@^1.0.0: 688 | version "1.1.0" 689 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 690 | 691 | is-stream@^1.0.0, is-stream@^1.1.0: 692 | version "1.1.0" 693 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 694 | 695 | isarray@^1.0.0, isarray@~1.0.0: 696 | version "1.0.0" 697 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 698 | 699 | isexe@^1.1.1: 700 | version "1.1.2" 701 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 702 | 703 | js-tokens@^3.0.0: 704 | version "3.0.1" 705 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 706 | 707 | js-yaml@^3.5.1: 708 | version "3.8.1" 709 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.1.tgz#782ba50200be7b9e5a8537001b7804db3ad02628" 710 | dependencies: 711 | argparse "^1.0.7" 712 | esprima "^3.1.1" 713 | 714 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 715 | version "1.0.1" 716 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 717 | dependencies: 718 | jsonify "~0.0.0" 719 | 720 | jsonfile@^4.0.0: 721 | version "4.0.0" 722 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 723 | optionalDependencies: 724 | graceful-fs "^4.1.6" 725 | 726 | jsonify@~0.0.0: 727 | version "0.0.0" 728 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 729 | 730 | jsonpointer@^4.0.0: 731 | version "4.0.1" 732 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 733 | 734 | latest-version@^3.0.0: 735 | version "3.0.0" 736 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.0.0.tgz#3104f008c0c391084107f85a344bc61e38970649" 737 | dependencies: 738 | package-json "^3.0.0" 739 | 740 | lazy-req@^2.0.0: 741 | version "2.0.0" 742 | resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" 743 | 744 | levn@^0.3.0, levn@~0.3.0: 745 | version "0.3.0" 746 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 747 | dependencies: 748 | prelude-ls "~1.1.2" 749 | type-check "~0.3.2" 750 | 751 | lodash.cond@^4.3.0: 752 | version "4.5.2" 753 | resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" 754 | 755 | lodash@^4.0.0, lodash@^4.3.0: 756 | version "4.17.4" 757 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 758 | 759 | lower-case@^1.1.1: 760 | version "1.1.3" 761 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.3.tgz#c92393d976793eee5ba4edb583cf8eae35bd9bfb" 762 | 763 | lowercase-keys@^1.0.0: 764 | version "1.0.0" 765 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 766 | 767 | lru-cache@^4.0.0: 768 | version "4.0.2" 769 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 770 | dependencies: 771 | pseudomap "^1.0.1" 772 | yallist "^2.0.0" 773 | 774 | minimatch@^3.0.2, minimatch@^3.0.3: 775 | version "3.0.3" 776 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 777 | dependencies: 778 | brace-expansion "^1.0.0" 779 | 780 | minimist@0.0.8: 781 | version "0.0.8" 782 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 783 | 784 | minimist@^1.2.0: 785 | version "1.2.0" 786 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 787 | 788 | mkdirp@^0.5.0, mkdirp@^0.5.1: 789 | version "0.5.1" 790 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 791 | dependencies: 792 | minimist "0.0.8" 793 | 794 | ms@0.7.1: 795 | version "0.7.1" 796 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 797 | 798 | ms@0.7.2: 799 | version "0.7.2" 800 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 801 | 802 | mute-stream@0.0.5: 803 | version "0.0.5" 804 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 805 | 806 | natural-compare@^1.4.0: 807 | version "1.4.0" 808 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 809 | 810 | no-case@^2.2.0: 811 | version "2.3.1" 812 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" 813 | dependencies: 814 | lower-case "^1.1.1" 815 | 816 | node-emoji@^1.5.1: 817 | version "1.5.1" 818 | resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" 819 | dependencies: 820 | string.prototype.codepointat "^0.2.0" 821 | 822 | npm-run-path@^1.0.0: 823 | version "1.0.0" 824 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" 825 | dependencies: 826 | path-key "^1.0.0" 827 | 828 | number-is-nan@^1.0.0: 829 | version "1.0.1" 830 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 831 | 832 | object-assign@^4.0.1, object-assign@^4.1.0: 833 | version "4.1.1" 834 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 835 | 836 | once@^1.3.0: 837 | version "1.4.0" 838 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 839 | dependencies: 840 | wrappy "1" 841 | 842 | onetime@^1.0.0: 843 | version "1.1.0" 844 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 845 | 846 | optionator@^0.8.2: 847 | version "0.8.2" 848 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 849 | dependencies: 850 | deep-is "~0.1.3" 851 | fast-levenshtein "~2.0.4" 852 | levn "~0.3.0" 853 | prelude-ls "~1.1.2" 854 | type-check "~0.3.2" 855 | wordwrap "~1.0.0" 856 | 857 | os-homedir@^1.0.0: 858 | version "1.0.2" 859 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 860 | 861 | package-json@^3.0.0: 862 | version "3.1.0" 863 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-3.1.0.tgz#ce281900fe8052150cc6709c6c006c18fdb2f379" 864 | dependencies: 865 | got "^6.7.1" 866 | registry-auth-token "^3.0.1" 867 | registry-url "^3.0.3" 868 | semver "^5.1.0" 869 | 870 | param-case@^2.1.0: 871 | version "2.1.0" 872 | resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.0.tgz#2619f90fd6c829ed0b958f1c84ed03a745a6d70a" 873 | dependencies: 874 | no-case "^2.2.0" 875 | 876 | pascal-case@^2.0.0: 877 | version "2.0.0" 878 | resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.0.tgz#39c248bde5a8dc02d5160696bdb01e044d016ee1" 879 | dependencies: 880 | camel-case "^3.0.0" 881 | upper-case-first "^1.1.0" 882 | 883 | path-exists@^2.0.0: 884 | version "2.1.0" 885 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 886 | dependencies: 887 | pinkie-promise "^2.0.0" 888 | 889 | path-is-absolute@^1.0.0: 890 | version "1.0.1" 891 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 892 | 893 | path-is-inside@^1.0.1: 894 | version "1.0.2" 895 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 896 | 897 | path-key@^1.0.0: 898 | version "1.0.0" 899 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" 900 | 901 | pify@^2.0.0: 902 | version "2.3.0" 903 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 904 | 905 | pinkie-promise@^2.0.0: 906 | version "2.0.1" 907 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 908 | dependencies: 909 | pinkie "^2.0.0" 910 | 911 | pinkie@^2.0.0: 912 | version "2.0.4" 913 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 914 | 915 | pkg-dir@^1.0.0: 916 | version "1.0.0" 917 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 918 | dependencies: 919 | find-up "^1.0.0" 920 | 921 | pkg-up@^1.0.0: 922 | version "1.0.0" 923 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" 924 | dependencies: 925 | find-up "^1.0.0" 926 | 927 | pluralize@^1.2.1: 928 | version "1.2.1" 929 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 930 | 931 | prelude-ls@~1.1.2: 932 | version "1.1.2" 933 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 934 | 935 | prepend-http@^1.0.1: 936 | version "1.0.4" 937 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 938 | 939 | process-nextick-args@~1.0.6: 940 | version "1.0.7" 941 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 942 | 943 | progress@^1.1.8: 944 | version "1.1.8" 945 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 946 | 947 | pseudomap@^1.0.1: 948 | version "1.0.2" 949 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 950 | 951 | rc@^1.0.1, rc@^1.1.6: 952 | version "1.1.7" 953 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" 954 | dependencies: 955 | deep-extend "~0.4.0" 956 | ini "~1.3.0" 957 | minimist "^1.2.0" 958 | strip-json-comments "~2.0.1" 959 | 960 | readable-stream@^2.2.2: 961 | version "2.2.3" 962 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" 963 | dependencies: 964 | buffer-shims "^1.0.0" 965 | core-util-is "~1.0.0" 966 | inherits "~2.0.1" 967 | isarray "~1.0.0" 968 | process-nextick-args "~1.0.6" 969 | string_decoder "~0.10.x" 970 | util-deprecate "~1.0.1" 971 | 972 | readline2@^1.0.1: 973 | version "1.0.1" 974 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 975 | dependencies: 976 | code-point-at "^1.0.0" 977 | is-fullwidth-code-point "^1.0.0" 978 | mute-stream "0.0.5" 979 | 980 | rechoir@^0.6.2: 981 | version "0.6.2" 982 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 983 | dependencies: 984 | resolve "^1.1.6" 985 | 986 | registry-auth-token@^3.0.1: 987 | version "3.1.0" 988 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" 989 | dependencies: 990 | rc "^1.1.6" 991 | 992 | registry-url@^3.0.3: 993 | version "3.1.0" 994 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 995 | dependencies: 996 | rc "^1.0.1" 997 | 998 | require-uncached@^1.0.2: 999 | version "1.0.3" 1000 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1001 | dependencies: 1002 | caller-path "^0.1.0" 1003 | resolve-from "^1.0.0" 1004 | 1005 | resolve-from@^1.0.0: 1006 | version "1.0.1" 1007 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1008 | 1009 | resolve@^1.1.6: 1010 | version "1.2.0" 1011 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" 1012 | 1013 | restore-cursor@^1.0.1: 1014 | version "1.0.1" 1015 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 1016 | dependencies: 1017 | exit-hook "^1.0.0" 1018 | onetime "^1.0.0" 1019 | 1020 | rimraf@^2.2.8: 1021 | version "2.6.0" 1022 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.0.tgz#89b8a0fe432b9ff9ec9a925a00b6cdb3a91bbada" 1023 | dependencies: 1024 | glob "^7.0.5" 1025 | 1026 | run-async@^0.1.0: 1027 | version "0.1.0" 1028 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 1029 | dependencies: 1030 | once "^1.3.0" 1031 | 1032 | rx-lite@^3.1.2: 1033 | version "3.1.2" 1034 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 1035 | 1036 | safe-buffer@^5.0.1: 1037 | version "5.0.1" 1038 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1039 | 1040 | semver-diff@^2.0.0: 1041 | version "2.1.0" 1042 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1043 | dependencies: 1044 | semver "^5.0.3" 1045 | 1046 | semver@^5.0.3, semver@^5.1.0: 1047 | version "5.3.0" 1048 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1049 | 1050 | shelljs@^0.7.5, shelljs@^0.7.6: 1051 | version "0.7.6" 1052 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" 1053 | dependencies: 1054 | glob "^7.0.0" 1055 | interpret "^1.0.0" 1056 | rechoir "^0.6.2" 1057 | 1058 | slice-ansi@0.0.4: 1059 | version "0.0.4" 1060 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1061 | 1062 | slide@^1.1.5: 1063 | version "1.1.6" 1064 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1065 | 1066 | sprintf-js@~1.0.2: 1067 | version "1.0.3" 1068 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1069 | 1070 | string-width@^1.0.1: 1071 | version "1.0.2" 1072 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1073 | dependencies: 1074 | code-point-at "^1.0.0" 1075 | is-fullwidth-code-point "^1.0.0" 1076 | strip-ansi "^3.0.0" 1077 | 1078 | string-width@^2.0.0: 1079 | version "2.0.0" 1080 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1081 | dependencies: 1082 | is-fullwidth-code-point "^2.0.0" 1083 | strip-ansi "^3.0.0" 1084 | 1085 | string.prototype.codepointat@^0.2.0: 1086 | version "0.2.0" 1087 | resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" 1088 | 1089 | string_decoder@~0.10.x: 1090 | version "0.10.31" 1091 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1092 | 1093 | strip-ansi@^3.0.0: 1094 | version "3.0.1" 1095 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1096 | dependencies: 1097 | ansi-regex "^2.0.0" 1098 | 1099 | strip-bom@^3.0.0: 1100 | version "3.0.0" 1101 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1102 | 1103 | strip-eof@^1.0.0: 1104 | version "1.0.0" 1105 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1106 | 1107 | strip-json-comments@~2.0.1: 1108 | version "2.0.1" 1109 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1110 | 1111 | supports-color@^2.0.0: 1112 | version "2.0.0" 1113 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1114 | 1115 | table@^3.7.8: 1116 | version "3.8.3" 1117 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 1118 | dependencies: 1119 | ajv "^4.7.0" 1120 | ajv-keywords "^1.0.0" 1121 | chalk "^1.1.1" 1122 | lodash "^4.0.0" 1123 | slice-ansi "0.0.4" 1124 | string-width "^2.0.0" 1125 | 1126 | term-size@^0.1.0: 1127 | version "0.1.1" 1128 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" 1129 | dependencies: 1130 | execa "^0.4.0" 1131 | 1132 | text-table@~0.2.0: 1133 | version "0.2.0" 1134 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1135 | 1136 | through@^2.3.6: 1137 | version "2.3.8" 1138 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1139 | 1140 | timed-out@^4.0.0: 1141 | version "4.0.1" 1142 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 1143 | 1144 | tryit@^1.0.1: 1145 | version "1.0.3" 1146 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1147 | 1148 | type-check@~0.3.2: 1149 | version "0.3.2" 1150 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1151 | dependencies: 1152 | prelude-ls "~1.1.2" 1153 | 1154 | typedarray@^0.0.6: 1155 | version "0.0.6" 1156 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1157 | 1158 | unique-string@^1.0.0: 1159 | version "1.0.0" 1160 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 1161 | dependencies: 1162 | crypto-random-string "^1.0.0" 1163 | 1164 | unzip-response@^2.0.1: 1165 | version "2.0.1" 1166 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 1167 | 1168 | update-notifier@^2.1.0: 1169 | version "2.1.0" 1170 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" 1171 | dependencies: 1172 | boxen "^1.0.0" 1173 | chalk "^1.0.0" 1174 | configstore "^3.0.0" 1175 | is-npm "^1.0.0" 1176 | latest-version "^3.0.0" 1177 | lazy-req "^2.0.0" 1178 | semver-diff "^2.0.0" 1179 | xdg-basedir "^3.0.0" 1180 | 1181 | upper-case-first@^1.1.0: 1182 | version "1.1.2" 1183 | resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" 1184 | dependencies: 1185 | upper-case "^1.1.1" 1186 | 1187 | upper-case@^1.1.1: 1188 | version "1.1.3" 1189 | resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" 1190 | 1191 | url-parse-lax@^1.0.0: 1192 | version "1.0.0" 1193 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1194 | dependencies: 1195 | prepend-http "^1.0.1" 1196 | 1197 | user-home@^2.0.0: 1198 | version "2.0.0" 1199 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 1200 | dependencies: 1201 | os-homedir "^1.0.0" 1202 | 1203 | util-deprecate@~1.0.1: 1204 | version "1.0.2" 1205 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1206 | 1207 | uuid@^3.0.1: 1208 | version "3.0.1" 1209 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1210 | 1211 | which@^1.2.8: 1212 | version "1.2.12" 1213 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 1214 | dependencies: 1215 | isexe "^1.1.1" 1216 | 1217 | widest-line@^1.0.0: 1218 | version "1.0.0" 1219 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 1220 | dependencies: 1221 | string-width "^1.0.1" 1222 | 1223 | wordwrap@~1.0.0: 1224 | version "1.0.0" 1225 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1226 | 1227 | wrappy@1: 1228 | version "1.0.2" 1229 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1230 | 1231 | write-file-atomic@^1.1.2: 1232 | version "1.3.1" 1233 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" 1234 | dependencies: 1235 | graceful-fs "^4.1.11" 1236 | imurmurhash "^0.1.4" 1237 | slide "^1.1.5" 1238 | 1239 | write@^0.2.1: 1240 | version "0.2.1" 1241 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1242 | dependencies: 1243 | mkdirp "^0.5.1" 1244 | 1245 | xdg-basedir@^3.0.0: 1246 | version "3.0.0" 1247 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 1248 | 1249 | xtend@^4.0.0: 1250 | version "4.0.1" 1251 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1252 | 1253 | yallist@^2.0.0: 1254 | version "2.0.0" 1255 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 1256 | --------------------------------------------------------------------------------