├── .gitignore
├── .prettierignore
├── README.md
├── package-lock.json
├── package.json
├── patch
├── 2.9.1.patch
├── 3.2.1.patch
└── 3.5.1.patch
├── public
├── examples
│ ├── adding-types.ts
│ ├── async-await.ts
│ ├── async-generators.ts
│ ├── bounded-polymorphism.ts
│ ├── building-a-raytracer.ts
│ ├── classic-javascript.ts
│ ├── conditional-types.ts
│ ├── decorators.ts
│ ├── jsx.ts
│ ├── mapped-types.ts
│ ├── type-alias.ts
│ ├── type-casts.ts
│ ├── unions-and-type-guards.ts
│ ├── using-classes.ts
│ ├── using-generics.ts
│ └── using-inheritance.ts
├── favicon.ico
├── index.html
├── main.js
├── schema
│ └── .gitkeep
├── style.css
└── worker.js
└── scripts
└── get-typescript.sh
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | monaco-typescript
3 | public/schema/*
4 | !public/schema/.gitkeep
5 | public/env.js
6 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | patch/*
2 | package.json
3 | package-lock.json
4 | monaco-typescript/*
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | ⚠️ **Please use [the offical TypeScript playground](http://www.typescriptlang.org/play/index.html), now it has all the same features and even more. Use https://github.com/microsoft/TypeScript-Website/issues for issues and questions.**
3 |
4 |
5 |
6 |
7 | # [TypeScript playground](https://typescript-play.js.org)
8 |
9 | A better TypeScript playground.
10 |
11 | Website: https://typescript-play.js.org.
12 |
13 | Differences from https://www.typescriptlang.org/play:
14 |
15 | * All strict options turned on by default
16 | * More available compiler options
17 | * Ability to switch TypeScript version
18 | * More space for code
19 | * More examples
20 | * Quicker sharing, URL updates as you type
21 | * Shorter sharing URLs
22 |
23 | ## Getting started
24 |
25 | ```
26 | npm install
27 | npm run setup
28 | npm start
29 | ```
30 |
31 | ## Updating TypeScript
32 |
33 | Playground relies on [UNPKG](https://unpkg.com) to fetch `monaco-editor` (contains `typescript` through [`monaco-typescript`](https://github.com/Microsoft/monaco-typescript) package).
34 |
35 | In case if `monaco-editor` is not updated to the latest TypeScript, the latest version can be built with `npm run get-typescript latest` and served locally.
36 | If you run into errors, the latest monaco version may be incompatible with the latest typescript version,
37 | in which case you'll need to update monaco-typescript upstream, or apply a patch locally (see the `# Patches` section in [get-typescript.sh](scripts/get-typescript.sh).
38 |
39 | In case you want to serve some specific version of TypeScript locally you should run `npm run get-typescript `. For example, to serve TypeScript version 2.8.3 you should run `npm run get-typescript 2.8.3; npm start`
40 |
41 | ## Browser compatibility
42 |
43 | Tested with:
44 |
45 | * Chrome 65
46 | * Safari 11
47 | * Firefox 58
48 | * Microsoft Edge 41
49 |
50 | ## Prior art
51 |
52 | * https://fabiandev.github.io/typescript-playground/
53 | * http://hi104.github.io/typescript-playground-on-ace/
54 | * http://drake7707.github.io/Typescript-Editor/
55 | * http://niutech.github.io/typescript-interpret/
56 |
57 | ## Other useful links
58 |
59 | * https://typescript-api-playground.glitch.me/ – exlore TS transforms
60 | * https://ts-ast-viewer.com/ – TS AST viewer
61 | * https://ts-creator.js.org/ - turn TypeScript code into AST builder expressions
62 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "typescript-play",
3 | "version": "0.0.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@zeit/check-updates": {
8 | "version": "1.1.0",
9 | "resolved": "https://unpm.uberinternal.com/@zeit%2fcheck-updates/-/check-updates-1.1.0.tgz",
10 | "integrity": "sha512-HoAzBs/w1V72BV8t+DVdqb/0Us+sx37En3mVL5u4lPMlZjESDNq5Z/ZnvDTtVg2OkarcES5gTAFzt5vWTvj0Lg==",
11 | "requires": {
12 | "chalk": "2.3.0",
13 | "ms": "2.1.1",
14 | "update-notifier": "2.3.0"
15 | },
16 | "dependencies": {
17 | "chalk": {
18 | "version": "2.3.0",
19 | "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.3.0.tgz",
20 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
21 | "requires": {
22 | "ansi-styles": "3.2.1",
23 | "escape-string-regexp": "1.0.5",
24 | "supports-color": "4.5.0"
25 | }
26 | }
27 | }
28 | },
29 | "accepts": {
30 | "version": "1.3.5",
31 | "resolved": "https://unpm.uberinternal.com/accepts/-/accepts-1.3.5.tgz",
32 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
33 | "requires": {
34 | "mime-types": "2.1.18",
35 | "negotiator": "0.6.1"
36 | }
37 | },
38 | "address": {
39 | "version": "1.0.3",
40 | "resolved": "https://unpm.uberinternal.com/address/-/address-1.0.3.tgz",
41 | "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
42 | },
43 | "align-text": {
44 | "version": "0.1.4",
45 | "resolved": "https://unpm.uberinternal.com/align-text/-/align-text-0.1.4.tgz",
46 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
47 | "requires": {
48 | "kind-of": "3.2.2",
49 | "longest": "1.0.1",
50 | "repeat-string": "1.6.1"
51 | }
52 | },
53 | "amdefine": {
54 | "version": "1.0.1",
55 | "resolved": "https://unpm.uberinternal.com/amdefine/-/amdefine-1.0.1.tgz",
56 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
57 | },
58 | "ansi-align": {
59 | "version": "2.0.0",
60 | "resolved": "https://unpm.uberinternal.com/ansi-align/-/ansi-align-2.0.0.tgz",
61 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
62 | "requires": {
63 | "string-width": "2.1.1"
64 | }
65 | },
66 | "ansi-regex": {
67 | "version": "3.0.0",
68 | "resolved": "https://unpm.uberinternal.com/ansi-regex/-/ansi-regex-3.0.0.tgz",
69 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
70 | },
71 | "ansi-styles": {
72 | "version": "3.2.1",
73 | "resolved": "https://unpm.uberinternal.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
74 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
75 | "requires": {
76 | "color-convert": "1.9.1"
77 | }
78 | },
79 | "arch": {
80 | "version": "2.1.0",
81 | "resolved": "https://unpm.uberinternal.com/arch/-/arch-2.1.0.tgz",
82 | "integrity": "sha1-NhOqRhSQZLPB8GB5Gb8dR4boKIk="
83 | },
84 | "args": {
85 | "version": "3.0.8",
86 | "resolved": "https://unpm.uberinternal.com/args/-/args-3.0.8.tgz",
87 | "integrity": "sha512-yZ9pTP1UzoR04R2iusf2H3UG70O7mo55O5DjOS/MPKMTvxAFZenVCgi+JP8Q/dI+18qiM/m4r8En9j5/WlsBjQ==",
88 | "requires": {
89 | "camelcase": "4.1.0",
90 | "chalk": "2.1.0",
91 | "mri": "1.1.0",
92 | "pkginfo": "0.4.1",
93 | "string-similarity": "1.2.0"
94 | },
95 | "dependencies": {
96 | "chalk": {
97 | "version": "2.1.0",
98 | "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.1.0.tgz",
99 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
100 | "requires": {
101 | "ansi-styles": "3.2.1",
102 | "escape-string-regexp": "1.0.5",
103 | "supports-color": "4.5.0"
104 | }
105 | }
106 | }
107 | },
108 | "array-union": {
109 | "version": "1.0.2",
110 | "resolved": "https://unpm.uberinternal.com/array-union/-/array-union-1.0.2.tgz",
111 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
112 | "dev": true,
113 | "requires": {
114 | "array-uniq": "1.0.3"
115 | }
116 | },
117 | "array-uniq": {
118 | "version": "1.0.3",
119 | "resolved": "https://unpm.uberinternal.com/array-uniq/-/array-uniq-1.0.3.tgz",
120 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
121 | "dev": true
122 | },
123 | "async": {
124 | "version": "1.5.2",
125 | "resolved": "https://unpm.uberinternal.com/async/-/async-1.5.2.tgz",
126 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
127 | },
128 | "balanced-match": {
129 | "version": "1.0.0",
130 | "resolved": "https://unpm.uberinternal.com/balanced-match/-/balanced-match-1.0.0.tgz",
131 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
132 | "dev": true
133 | },
134 | "base64url": {
135 | "version": "2.0.0",
136 | "resolved": "https://unpm.uberinternal.com/base64url/-/base64url-2.0.0.tgz",
137 | "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=",
138 | "dev": true
139 | },
140 | "basic-auth": {
141 | "version": "2.0.0",
142 | "resolved": "https://unpm.uberinternal.com/basic-auth/-/basic-auth-2.0.0.tgz",
143 | "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=",
144 | "requires": {
145 | "safe-buffer": "5.1.1"
146 | }
147 | },
148 | "bluebird": {
149 | "version": "3.5.1",
150 | "resolved": "https://unpm.uberinternal.com/bluebird/-/bluebird-3.5.1.tgz",
151 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
152 | },
153 | "boxen": {
154 | "version": "1.3.0",
155 | "resolved": "https://unpm.uberinternal.com/boxen/-/boxen-1.3.0.tgz",
156 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
157 | "requires": {
158 | "ansi-align": "2.0.0",
159 | "camelcase": "4.1.0",
160 | "chalk": "2.3.2",
161 | "cli-boxes": "1.0.0",
162 | "string-width": "2.1.1",
163 | "term-size": "1.2.0",
164 | "widest-line": "2.0.0"
165 | }
166 | },
167 | "brace-expansion": {
168 | "version": "1.1.11",
169 | "resolved": "https://unpm.uberinternal.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
170 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
171 | "dev": true,
172 | "requires": {
173 | "balanced-match": "1.0.0",
174 | "concat-map": "0.0.1"
175 | }
176 | },
177 | "bytes": {
178 | "version": "3.0.0",
179 | "resolved": "https://unpm.uberinternal.com/bytes/-/bytes-3.0.0.tgz",
180 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
181 | },
182 | "camelcase": {
183 | "version": "4.1.0",
184 | "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-4.1.0.tgz",
185 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
186 | },
187 | "capture-stack-trace": {
188 | "version": "1.0.0",
189 | "resolved": "https://unpm.uberinternal.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
190 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0="
191 | },
192 | "center-align": {
193 | "version": "0.1.3",
194 | "resolved": "https://unpm.uberinternal.com/center-align/-/center-align-0.1.3.tgz",
195 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
196 | "optional": true,
197 | "requires": {
198 | "align-text": "0.1.4",
199 | "lazy-cache": "1.0.4"
200 | }
201 | },
202 | "chalk": {
203 | "version": "2.3.2",
204 | "resolved": "https://unpm.uberinternal.com/chalk/-/chalk-2.3.2.tgz",
205 | "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
206 | "requires": {
207 | "ansi-styles": "3.2.1",
208 | "escape-string-regexp": "1.0.5",
209 | "supports-color": "5.3.0"
210 | },
211 | "dependencies": {
212 | "has-flag": {
213 | "version": "3.0.0",
214 | "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-3.0.0.tgz",
215 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
216 | },
217 | "supports-color": {
218 | "version": "5.3.0",
219 | "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-5.3.0.tgz",
220 | "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
221 | "requires": {
222 | "has-flag": "3.0.0"
223 | }
224 | }
225 | }
226 | },
227 | "cli-boxes": {
228 | "version": "1.0.0",
229 | "resolved": "https://unpm.uberinternal.com/cli-boxes/-/cli-boxes-1.0.0.tgz",
230 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM="
231 | },
232 | "clipboardy": {
233 | "version": "1.2.3",
234 | "resolved": "https://unpm.uberinternal.com/clipboardy/-/clipboardy-1.2.3.tgz",
235 | "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==",
236 | "requires": {
237 | "arch": "2.1.0",
238 | "execa": "0.8.0"
239 | },
240 | "dependencies": {
241 | "execa": {
242 | "version": "0.8.0",
243 | "resolved": "https://unpm.uberinternal.com/execa/-/execa-0.8.0.tgz",
244 | "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
245 | "requires": {
246 | "cross-spawn": "5.1.0",
247 | "get-stream": "3.0.0",
248 | "is-stream": "1.1.0",
249 | "npm-run-path": "2.0.2",
250 | "p-finally": "1.0.0",
251 | "signal-exit": "3.0.2",
252 | "strip-eof": "1.0.0"
253 | }
254 | }
255 | }
256 | },
257 | "cliui": {
258 | "version": "2.1.0",
259 | "resolved": "https://unpm.uberinternal.com/cliui/-/cliui-2.1.0.tgz",
260 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
261 | "optional": true,
262 | "requires": {
263 | "center-align": "0.1.3",
264 | "right-align": "0.1.3",
265 | "wordwrap": "0.0.2"
266 | },
267 | "dependencies": {
268 | "wordwrap": {
269 | "version": "0.0.2",
270 | "resolved": "https://unpm.uberinternal.com/wordwrap/-/wordwrap-0.0.2.tgz",
271 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
272 | "optional": true
273 | }
274 | }
275 | },
276 | "color-convert": {
277 | "version": "1.9.1",
278 | "resolved": "https://unpm.uberinternal.com/color-convert/-/color-convert-1.9.1.tgz",
279 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
280 | "requires": {
281 | "color-name": "1.1.3"
282 | }
283 | },
284 | "color-name": {
285 | "version": "1.1.3",
286 | "resolved": "https://unpm.uberinternal.com/color-name/-/color-name-1.1.3.tgz",
287 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
288 | },
289 | "commander": {
290 | "version": "2.11.0",
291 | "resolved": "https://unpm.uberinternal.com/commander/-/commander-2.11.0.tgz",
292 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
293 | "dev": true
294 | },
295 | "compressible": {
296 | "version": "2.0.13",
297 | "resolved": "https://unpm.uberinternal.com/compressible/-/compressible-2.0.13.tgz",
298 | "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
299 | "requires": {
300 | "mime-db": "1.33.0"
301 | }
302 | },
303 | "compression": {
304 | "version": "1.7.2",
305 | "resolved": "https://unpm.uberinternal.com/compression/-/compression-1.7.2.tgz",
306 | "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
307 | "requires": {
308 | "accepts": "1.3.5",
309 | "bytes": "3.0.0",
310 | "compressible": "2.0.13",
311 | "debug": "2.6.9",
312 | "on-headers": "1.0.1",
313 | "safe-buffer": "5.1.1",
314 | "vary": "1.1.2"
315 | }
316 | },
317 | "concat-map": {
318 | "version": "0.0.1",
319 | "resolved": "https://unpm.uberinternal.com/concat-map/-/concat-map-0.0.1.tgz",
320 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
321 | "dev": true
322 | },
323 | "configstore": {
324 | "version": "3.1.2",
325 | "resolved": "https://unpm.uberinternal.com/configstore/-/configstore-3.1.2.tgz",
326 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
327 | "requires": {
328 | "dot-prop": "4.2.0",
329 | "graceful-fs": "4.1.11",
330 | "make-dir": "1.2.0",
331 | "unique-string": "1.0.0",
332 | "write-file-atomic": "2.3.0",
333 | "xdg-basedir": "3.0.0"
334 | }
335 | },
336 | "content-type": {
337 | "version": "1.0.4",
338 | "resolved": "https://unpm.uberinternal.com/content-type/-/content-type-1.0.4.tgz",
339 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
340 | },
341 | "create-error-class": {
342 | "version": "3.0.2",
343 | "resolved": "https://unpm.uberinternal.com/create-error-class/-/create-error-class-3.0.2.tgz",
344 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
345 | "requires": {
346 | "capture-stack-trace": "1.0.0"
347 | }
348 | },
349 | "cross-spawn": {
350 | "version": "5.1.0",
351 | "resolved": "https://unpm.uberinternal.com/cross-spawn/-/cross-spawn-5.1.0.tgz",
352 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
353 | "requires": {
354 | "lru-cache": "4.1.2",
355 | "shebang-command": "1.2.0",
356 | "which": "1.3.0"
357 | }
358 | },
359 | "crypto-random-string": {
360 | "version": "1.0.0",
361 | "resolved": "https://unpm.uberinternal.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
362 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
363 | },
364 | "dargs": {
365 | "version": "5.1.0",
366 | "resolved": "https://unpm.uberinternal.com/dargs/-/dargs-5.1.0.tgz",
367 | "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk="
368 | },
369 | "debug": {
370 | "version": "2.6.9",
371 | "resolved": "https://unpm.uberinternal.com/debug/-/debug-2.6.9.tgz",
372 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
373 | "requires": {
374 | "ms": "2.0.0"
375 | },
376 | "dependencies": {
377 | "ms": {
378 | "version": "2.0.0",
379 | "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.0.0.tgz",
380 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
381 | }
382 | }
383 | },
384 | "decamelize": {
385 | "version": "1.2.0",
386 | "resolved": "https://unpm.uberinternal.com/decamelize/-/decamelize-1.2.0.tgz",
387 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
388 | "optional": true
389 | },
390 | "deep-extend": {
391 | "version": "0.4.2",
392 | "resolved": "https://unpm.uberinternal.com/deep-extend/-/deep-extend-0.4.2.tgz",
393 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
394 | },
395 | "depd": {
396 | "version": "1.1.1",
397 | "resolved": "https://unpm.uberinternal.com/depd/-/depd-1.1.1.tgz",
398 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
399 | },
400 | "destroy": {
401 | "version": "1.0.4",
402 | "resolved": "https://unpm.uberinternal.com/destroy/-/destroy-1.0.4.tgz",
403 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
404 | },
405 | "detect-port": {
406 | "version": "1.2.2",
407 | "resolved": "https://unpm.uberinternal.com/detect-port/-/detect-port-1.2.2.tgz",
408 | "integrity": "sha512-06H99JMCwgbYbA+codm97aBhFLAjABftetp+v+Z88Pvvlkawp2N+1bP/9J24+mihrvk9yBvUYTyIj3NixG1CsA==",
409 | "requires": {
410 | "address": "1.0.3",
411 | "debug": "2.6.9"
412 | }
413 | },
414 | "dot-prop": {
415 | "version": "4.2.0",
416 | "resolved": "https://unpm.uberinternal.com/dot-prop/-/dot-prop-4.2.0.tgz",
417 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
418 | "requires": {
419 | "is-obj": "1.0.1"
420 | }
421 | },
422 | "duplexer3": {
423 | "version": "0.1.4",
424 | "resolved": "https://unpm.uberinternal.com/duplexer3/-/duplexer3-0.1.4.tgz",
425 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
426 | },
427 | "ee-first": {
428 | "version": "1.1.1",
429 | "resolved": "https://unpm.uberinternal.com/ee-first/-/ee-first-1.1.1.tgz",
430 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
431 | },
432 | "encodeurl": {
433 | "version": "1.0.2",
434 | "resolved": "https://unpm.uberinternal.com/encodeurl/-/encodeurl-1.0.2.tgz",
435 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
436 | },
437 | "escape-html": {
438 | "version": "1.0.3",
439 | "resolved": "https://unpm.uberinternal.com/escape-html/-/escape-html-1.0.3.tgz",
440 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
441 | },
442 | "escape-string-regexp": {
443 | "version": "1.0.5",
444 | "resolved": "https://unpm.uberinternal.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
445 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
446 | },
447 | "etag": {
448 | "version": "1.8.1",
449 | "resolved": "https://unpm.uberinternal.com/etag/-/etag-1.8.1.tgz",
450 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
451 | },
452 | "execa": {
453 | "version": "0.7.0",
454 | "resolved": "https://unpm.uberinternal.com/execa/-/execa-0.7.0.tgz",
455 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
456 | "requires": {
457 | "cross-spawn": "5.1.0",
458 | "get-stream": "3.0.0",
459 | "is-stream": "1.1.0",
460 | "npm-run-path": "2.0.2",
461 | "p-finally": "1.0.0",
462 | "signal-exit": "3.0.2",
463 | "strip-eof": "1.0.0"
464 | }
465 | },
466 | "filesize": {
467 | "version": "3.6.0",
468 | "resolved": "https://unpm.uberinternal.com/filesize/-/filesize-3.6.0.tgz",
469 | "integrity": "sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw=="
470 | },
471 | "fresh": {
472 | "version": "0.5.2",
473 | "resolved": "https://unpm.uberinternal.com/fresh/-/fresh-0.5.2.tgz",
474 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
475 | },
476 | "fs-extra": {
477 | "version": "5.0.0",
478 | "resolved": "https://unpm.uberinternal.com/fs-extra/-/fs-extra-5.0.0.tgz",
479 | "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
480 | "requires": {
481 | "graceful-fs": "4.1.11",
482 | "jsonfile": "4.0.0",
483 | "universalify": "0.1.1"
484 | }
485 | },
486 | "fs.realpath": {
487 | "version": "1.0.0",
488 | "resolved": "https://unpm.uberinternal.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
489 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
490 | "dev": true
491 | },
492 | "get-stream": {
493 | "version": "3.0.0",
494 | "resolved": "https://unpm.uberinternal.com/get-stream/-/get-stream-3.0.0.tgz",
495 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
496 | },
497 | "gh-pages": {
498 | "version": "1.1.0",
499 | "resolved": "https://unpm.uberinternal.com/gh-pages/-/gh-pages-1.1.0.tgz",
500 | "integrity": "sha512-ZpDkeOVmIrN5mz+sBWDz5zmTqcbNJzI/updCwEv/7rrSdpTNlj1B5GhBqG7f4Q8p5sJOdnBV0SIqxJrxtZQ9FA==",
501 | "dev": true,
502 | "requires": {
503 | "async": "2.6.0",
504 | "base64url": "2.0.0",
505 | "commander": "2.11.0",
506 | "fs-extra": "4.0.3",
507 | "globby": "6.1.0",
508 | "graceful-fs": "4.1.11",
509 | "rimraf": "2.6.2"
510 | },
511 | "dependencies": {
512 | "async": {
513 | "version": "2.6.0",
514 | "resolved": "https://unpm.uberinternal.com/async/-/async-2.6.0.tgz",
515 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
516 | "dev": true,
517 | "requires": {
518 | "lodash": "4.17.5"
519 | }
520 | },
521 | "fs-extra": {
522 | "version": "4.0.3",
523 | "resolved": "https://unpm.uberinternal.com/fs-extra/-/fs-extra-4.0.3.tgz",
524 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
525 | "dev": true,
526 | "requires": {
527 | "graceful-fs": "4.1.11",
528 | "jsonfile": "4.0.0",
529 | "universalify": "0.1.1"
530 | }
531 | }
532 | }
533 | },
534 | "glob": {
535 | "version": "7.1.2",
536 | "resolved": "https://unpm.uberinternal.com/glob/-/glob-7.1.2.tgz",
537 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
538 | "dev": true,
539 | "requires": {
540 | "fs.realpath": "1.0.0",
541 | "inflight": "1.0.6",
542 | "inherits": "2.0.3",
543 | "minimatch": "3.0.4",
544 | "once": "1.4.0",
545 | "path-is-absolute": "1.0.1"
546 | }
547 | },
548 | "global-dirs": {
549 | "version": "0.1.1",
550 | "resolved": "https://unpm.uberinternal.com/global-dirs/-/global-dirs-0.1.1.tgz",
551 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
552 | "requires": {
553 | "ini": "1.3.5"
554 | }
555 | },
556 | "globby": {
557 | "version": "6.1.0",
558 | "resolved": "https://unpm.uberinternal.com/globby/-/globby-6.1.0.tgz",
559 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
560 | "dev": true,
561 | "requires": {
562 | "array-union": "1.0.2",
563 | "glob": "7.1.2",
564 | "object-assign": "4.1.1",
565 | "pify": "2.3.0",
566 | "pinkie-promise": "2.0.1"
567 | },
568 | "dependencies": {
569 | "pify": {
570 | "version": "2.3.0",
571 | "resolved": "https://unpm.uberinternal.com/pify/-/pify-2.3.0.tgz",
572 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
573 | "dev": true
574 | }
575 | }
576 | },
577 | "got": {
578 | "version": "6.7.1",
579 | "resolved": "https://unpm.uberinternal.com/got/-/got-6.7.1.tgz",
580 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
581 | "requires": {
582 | "create-error-class": "3.0.2",
583 | "duplexer3": "0.1.4",
584 | "get-stream": "3.0.0",
585 | "is-redirect": "1.0.0",
586 | "is-retry-allowed": "1.1.0",
587 | "is-stream": "1.1.0",
588 | "lowercase-keys": "1.0.1",
589 | "safe-buffer": "5.1.1",
590 | "timed-out": "4.0.1",
591 | "unzip-response": "2.0.1",
592 | "url-parse-lax": "1.0.0"
593 | }
594 | },
595 | "graceful-fs": {
596 | "version": "4.1.11",
597 | "resolved": "https://unpm.uberinternal.com/graceful-fs/-/graceful-fs-4.1.11.tgz",
598 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
599 | },
600 | "handlebars": {
601 | "version": "4.0.11",
602 | "resolved": "https://unpm.uberinternal.com/handlebars/-/handlebars-4.0.11.tgz",
603 | "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
604 | "requires": {
605 | "async": "1.5.2",
606 | "optimist": "0.6.1",
607 | "source-map": "0.4.4",
608 | "uglify-js": "2.8.29"
609 | }
610 | },
611 | "has-flag": {
612 | "version": "2.0.0",
613 | "resolved": "https://unpm.uberinternal.com/has-flag/-/has-flag-2.0.0.tgz",
614 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
615 | },
616 | "http-errors": {
617 | "version": "1.6.2",
618 | "resolved": "https://unpm.uberinternal.com/http-errors/-/http-errors-1.6.2.tgz",
619 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
620 | "requires": {
621 | "depd": "1.1.1",
622 | "inherits": "2.0.3",
623 | "setprototypeof": "1.0.3",
624 | "statuses": "1.5.0"
625 | }
626 | },
627 | "iconv-lite": {
628 | "version": "0.4.19",
629 | "resolved": "https://unpm.uberinternal.com/iconv-lite/-/iconv-lite-0.4.19.tgz",
630 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
631 | },
632 | "import-lazy": {
633 | "version": "2.1.0",
634 | "resolved": "https://unpm.uberinternal.com/import-lazy/-/import-lazy-2.1.0.tgz",
635 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
636 | },
637 | "imurmurhash": {
638 | "version": "0.1.4",
639 | "resolved": "https://unpm.uberinternal.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
640 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
641 | },
642 | "inflight": {
643 | "version": "1.0.6",
644 | "resolved": "https://unpm.uberinternal.com/inflight/-/inflight-1.0.6.tgz",
645 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
646 | "dev": true,
647 | "requires": {
648 | "once": "1.4.0",
649 | "wrappy": "1.0.2"
650 | }
651 | },
652 | "inherits": {
653 | "version": "2.0.3",
654 | "resolved": "https://unpm.uberinternal.com/inherits/-/inherits-2.0.3.tgz",
655 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
656 | },
657 | "ini": {
658 | "version": "1.3.5",
659 | "resolved": "https://unpm.uberinternal.com/ini/-/ini-1.3.5.tgz",
660 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
661 | },
662 | "ip": {
663 | "version": "1.1.5",
664 | "resolved": "https://unpm.uberinternal.com/ip/-/ip-1.1.5.tgz",
665 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
666 | },
667 | "is-buffer": {
668 | "version": "1.1.6",
669 | "resolved": "https://unpm.uberinternal.com/is-buffer/-/is-buffer-1.1.6.tgz",
670 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
671 | },
672 | "is-fullwidth-code-point": {
673 | "version": "2.0.0",
674 | "resolved": "https://unpm.uberinternal.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
675 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
676 | },
677 | "is-installed-globally": {
678 | "version": "0.1.0",
679 | "resolved": "https://unpm.uberinternal.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
680 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
681 | "requires": {
682 | "global-dirs": "0.1.1",
683 | "is-path-inside": "1.0.1"
684 | }
685 | },
686 | "is-npm": {
687 | "version": "1.0.0",
688 | "resolved": "https://unpm.uberinternal.com/is-npm/-/is-npm-1.0.0.tgz",
689 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ="
690 | },
691 | "is-obj": {
692 | "version": "1.0.1",
693 | "resolved": "https://unpm.uberinternal.com/is-obj/-/is-obj-1.0.1.tgz",
694 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
695 | },
696 | "is-path-inside": {
697 | "version": "1.0.1",
698 | "resolved": "https://unpm.uberinternal.com/is-path-inside/-/is-path-inside-1.0.1.tgz",
699 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
700 | "requires": {
701 | "path-is-inside": "1.0.2"
702 | }
703 | },
704 | "is-redirect": {
705 | "version": "1.0.0",
706 | "resolved": "https://unpm.uberinternal.com/is-redirect/-/is-redirect-1.0.0.tgz",
707 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
708 | },
709 | "is-retry-allowed": {
710 | "version": "1.1.0",
711 | "resolved": "https://unpm.uberinternal.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
712 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
713 | },
714 | "is-stream": {
715 | "version": "1.1.0",
716 | "resolved": "https://unpm.uberinternal.com/is-stream/-/is-stream-1.1.0.tgz",
717 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
718 | },
719 | "is-wsl": {
720 | "version": "1.1.0",
721 | "resolved": "https://unpm.uberinternal.com/is-wsl/-/is-wsl-1.1.0.tgz",
722 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
723 | },
724 | "isexe": {
725 | "version": "2.0.0",
726 | "resolved": "https://unpm.uberinternal.com/isexe/-/isexe-2.0.0.tgz",
727 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
728 | },
729 | "jsonfile": {
730 | "version": "4.0.0",
731 | "resolved": "https://unpm.uberinternal.com/jsonfile/-/jsonfile-4.0.0.tgz",
732 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
733 | "requires": {
734 | "graceful-fs": "4.1.11"
735 | }
736 | },
737 | "kind-of": {
738 | "version": "3.2.2",
739 | "resolved": "https://unpm.uberinternal.com/kind-of/-/kind-of-3.2.2.tgz",
740 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
741 | "requires": {
742 | "is-buffer": "1.1.6"
743 | }
744 | },
745 | "latest-version": {
746 | "version": "3.1.0",
747 | "resolved": "https://unpm.uberinternal.com/latest-version/-/latest-version-3.1.0.tgz",
748 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
749 | "requires": {
750 | "package-json": "4.0.1"
751 | }
752 | },
753 | "lazy-cache": {
754 | "version": "1.0.4",
755 | "resolved": "https://unpm.uberinternal.com/lazy-cache/-/lazy-cache-1.0.4.tgz",
756 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
757 | "optional": true
758 | },
759 | "lodash": {
760 | "version": "4.17.5",
761 | "resolved": "https://unpm.uberinternal.com/lodash/-/lodash-4.17.5.tgz",
762 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
763 | },
764 | "longest": {
765 | "version": "1.0.1",
766 | "resolved": "https://unpm.uberinternal.com/longest/-/longest-1.0.1.tgz",
767 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
768 | },
769 | "lowercase-keys": {
770 | "version": "1.0.1",
771 | "resolved": "https://unpm.uberinternal.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
772 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
773 | },
774 | "lru-cache": {
775 | "version": "4.1.2",
776 | "resolved": "https://unpm.uberinternal.com/lru-cache/-/lru-cache-4.1.2.tgz",
777 | "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
778 | "requires": {
779 | "pseudomap": "1.0.2",
780 | "yallist": "2.1.2"
781 | }
782 | },
783 | "make-dir": {
784 | "version": "1.2.0",
785 | "resolved": "https://unpm.uberinternal.com/make-dir/-/make-dir-1.2.0.tgz",
786 | "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
787 | "requires": {
788 | "pify": "3.0.0"
789 | }
790 | },
791 | "micro": {
792 | "version": "9.1.0",
793 | "resolved": "https://unpm.uberinternal.com/micro/-/micro-9.1.0.tgz",
794 | "integrity": "sha512-0Ap4bXS9MyInYSLBe/5u+qEBY3VgcOTQlAt5wGc3DN/Rk4IH+PdRI47x3/xWBxQWt0ISRgmE4+U72sfm4ksthg==",
795 | "requires": {
796 | "content-type": "1.0.4",
797 | "is-stream": "1.1.0",
798 | "mri": "1.1.0",
799 | "raw-body": "2.3.2"
800 | }
801 | },
802 | "micro-compress": {
803 | "version": "1.0.0",
804 | "resolved": "https://unpm.uberinternal.com/micro-compress/-/micro-compress-1.0.0.tgz",
805 | "integrity": "sha1-U/WoC0rQMgyhZaVZtuPfFF1PcE8=",
806 | "requires": {
807 | "compression": "1.7.2"
808 | }
809 | },
810 | "mime": {
811 | "version": "1.4.1",
812 | "resolved": "https://unpm.uberinternal.com/mime/-/mime-1.4.1.tgz",
813 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
814 | },
815 | "mime-db": {
816 | "version": "1.33.0",
817 | "resolved": "https://unpm.uberinternal.com/mime-db/-/mime-db-1.33.0.tgz",
818 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
819 | },
820 | "mime-types": {
821 | "version": "2.1.18",
822 | "resolved": "https://unpm.uberinternal.com/mime-types/-/mime-types-2.1.18.tgz",
823 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
824 | "requires": {
825 | "mime-db": "1.33.0"
826 | }
827 | },
828 | "minimatch": {
829 | "version": "3.0.4",
830 | "resolved": "https://unpm.uberinternal.com/minimatch/-/minimatch-3.0.4.tgz",
831 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
832 | "dev": true,
833 | "requires": {
834 | "brace-expansion": "1.1.11"
835 | }
836 | },
837 | "minimist": {
838 | "version": "1.2.0",
839 | "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-1.2.0.tgz",
840 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
841 | },
842 | "mri": {
843 | "version": "1.1.0",
844 | "resolved": "https://unpm.uberinternal.com/mri/-/mri-1.1.0.tgz",
845 | "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o="
846 | },
847 | "ms": {
848 | "version": "2.1.1",
849 | "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.1.1.tgz",
850 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
851 | },
852 | "negotiator": {
853 | "version": "0.6.1",
854 | "resolved": "https://unpm.uberinternal.com/negotiator/-/negotiator-0.6.1.tgz",
855 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
856 | },
857 | "node-version": {
858 | "version": "1.1.0",
859 | "resolved": "https://unpm.uberinternal.com/node-version/-/node-version-1.1.0.tgz",
860 | "integrity": "sha512-t1V2RFiaTavaW3jtQO0A2nok6k7/Gghuvx2rjvICuT0B0dYaObBQ4U0xHL+ZTPFZodt1LMYG2Vi2nypfz4/AJg=="
861 | },
862 | "npm-run-path": {
863 | "version": "2.0.2",
864 | "resolved": "https://unpm.uberinternal.com/npm-run-path/-/npm-run-path-2.0.2.tgz",
865 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
866 | "requires": {
867 | "path-key": "2.0.1"
868 | }
869 | },
870 | "object-assign": {
871 | "version": "4.1.1",
872 | "resolved": "https://unpm.uberinternal.com/object-assign/-/object-assign-4.1.1.tgz",
873 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
874 | "dev": true
875 | },
876 | "on-finished": {
877 | "version": "2.3.0",
878 | "resolved": "https://unpm.uberinternal.com/on-finished/-/on-finished-2.3.0.tgz",
879 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
880 | "requires": {
881 | "ee-first": "1.1.1"
882 | }
883 | },
884 | "on-headers": {
885 | "version": "1.0.1",
886 | "resolved": "https://unpm.uberinternal.com/on-headers/-/on-headers-1.0.1.tgz",
887 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
888 | },
889 | "once": {
890 | "version": "1.4.0",
891 | "resolved": "https://unpm.uberinternal.com/once/-/once-1.4.0.tgz",
892 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
893 | "dev": true,
894 | "requires": {
895 | "wrappy": "1.0.2"
896 | }
897 | },
898 | "openssl-self-signed-certificate": {
899 | "version": "1.1.6",
900 | "resolved": "https://unpm.uberinternal.com/openssl-self-signed-certificate/-/openssl-self-signed-certificate-1.1.6.tgz",
901 | "integrity": "sha1-nTpHdrGlfphHNQOSEUrS+RWoPdQ="
902 | },
903 | "opn": {
904 | "version": "5.2.0",
905 | "resolved": "https://unpm.uberinternal.com/opn/-/opn-5.2.0.tgz",
906 | "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==",
907 | "requires": {
908 | "is-wsl": "1.1.0"
909 | }
910 | },
911 | "optimist": {
912 | "version": "0.6.1",
913 | "resolved": "https://unpm.uberinternal.com/optimist/-/optimist-0.6.1.tgz",
914 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
915 | "requires": {
916 | "minimist": "0.0.10",
917 | "wordwrap": "0.0.3"
918 | },
919 | "dependencies": {
920 | "minimist": {
921 | "version": "0.0.10",
922 | "resolved": "https://unpm.uberinternal.com/minimist/-/minimist-0.0.10.tgz",
923 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
924 | }
925 | }
926 | },
927 | "p-finally": {
928 | "version": "1.0.0",
929 | "resolved": "https://unpm.uberinternal.com/p-finally/-/p-finally-1.0.0.tgz",
930 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
931 | },
932 | "package-json": {
933 | "version": "4.0.1",
934 | "resolved": "https://unpm.uberinternal.com/package-json/-/package-json-4.0.1.tgz",
935 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
936 | "requires": {
937 | "got": "6.7.1",
938 | "registry-auth-token": "3.3.2",
939 | "registry-url": "3.1.0",
940 | "semver": "5.5.0"
941 | }
942 | },
943 | "path-is-absolute": {
944 | "version": "1.0.1",
945 | "resolved": "https://unpm.uberinternal.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
946 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
947 | "dev": true
948 | },
949 | "path-is-inside": {
950 | "version": "1.0.2",
951 | "resolved": "https://unpm.uberinternal.com/path-is-inside/-/path-is-inside-1.0.2.tgz",
952 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
953 | },
954 | "path-key": {
955 | "version": "2.0.1",
956 | "resolved": "https://unpm.uberinternal.com/path-key/-/path-key-2.0.1.tgz",
957 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
958 | },
959 | "path-type": {
960 | "version": "3.0.0",
961 | "resolved": "https://unpm.uberinternal.com/path-type/-/path-type-3.0.0.tgz",
962 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
963 | "requires": {
964 | "pify": "3.0.0"
965 | }
966 | },
967 | "pify": {
968 | "version": "3.0.0",
969 | "resolved": "https://unpm.uberinternal.com/pify/-/pify-3.0.0.tgz",
970 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
971 | },
972 | "pinkie": {
973 | "version": "2.0.4",
974 | "resolved": "https://unpm.uberinternal.com/pinkie/-/pinkie-2.0.4.tgz",
975 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
976 | "dev": true
977 | },
978 | "pinkie-promise": {
979 | "version": "2.0.1",
980 | "resolved": "https://unpm.uberinternal.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
981 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
982 | "dev": true,
983 | "requires": {
984 | "pinkie": "2.0.4"
985 | }
986 | },
987 | "pkginfo": {
988 | "version": "0.4.1",
989 | "resolved": "https://unpm.uberinternal.com/pkginfo/-/pkginfo-0.4.1.tgz",
990 | "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8="
991 | },
992 | "prepend-http": {
993 | "version": "1.0.4",
994 | "resolved": "https://unpm.uberinternal.com/prepend-http/-/prepend-http-1.0.4.tgz",
995 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
996 | },
997 | "pseudomap": {
998 | "version": "1.0.2",
999 | "resolved": "https://unpm.uberinternal.com/pseudomap/-/pseudomap-1.0.2.tgz",
1000 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
1001 | },
1002 | "range-parser": {
1003 | "version": "1.2.0",
1004 | "resolved": "https://unpm.uberinternal.com/range-parser/-/range-parser-1.2.0.tgz",
1005 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
1006 | },
1007 | "raw-body": {
1008 | "version": "2.3.2",
1009 | "resolved": "https://unpm.uberinternal.com/raw-body/-/raw-body-2.3.2.tgz",
1010 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
1011 | "requires": {
1012 | "bytes": "3.0.0",
1013 | "http-errors": "1.6.2",
1014 | "iconv-lite": "0.4.19",
1015 | "unpipe": "1.0.0"
1016 | }
1017 | },
1018 | "rc": {
1019 | "version": "1.2.6",
1020 | "resolved": "https://unpm.uberinternal.com/rc/-/rc-1.2.6.tgz",
1021 | "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=",
1022 | "requires": {
1023 | "deep-extend": "0.4.2",
1024 | "ini": "1.3.5",
1025 | "minimist": "1.2.0",
1026 | "strip-json-comments": "2.0.1"
1027 | }
1028 | },
1029 | "registry-auth-token": {
1030 | "version": "3.3.2",
1031 | "resolved": "https://unpm.uberinternal.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
1032 | "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
1033 | "requires": {
1034 | "rc": "1.2.6",
1035 | "safe-buffer": "5.1.1"
1036 | }
1037 | },
1038 | "registry-url": {
1039 | "version": "3.1.0",
1040 | "resolved": "https://unpm.uberinternal.com/registry-url/-/registry-url-3.1.0.tgz",
1041 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
1042 | "requires": {
1043 | "rc": "1.2.6"
1044 | }
1045 | },
1046 | "repeat-string": {
1047 | "version": "1.6.1",
1048 | "resolved": "https://unpm.uberinternal.com/repeat-string/-/repeat-string-1.6.1.tgz",
1049 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
1050 | },
1051 | "right-align": {
1052 | "version": "0.1.3",
1053 | "resolved": "https://unpm.uberinternal.com/right-align/-/right-align-0.1.3.tgz",
1054 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
1055 | "optional": true,
1056 | "requires": {
1057 | "align-text": "0.1.4"
1058 | }
1059 | },
1060 | "rimraf": {
1061 | "version": "2.6.2",
1062 | "resolved": "https://unpm.uberinternal.com/rimraf/-/rimraf-2.6.2.tgz",
1063 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1064 | "dev": true,
1065 | "requires": {
1066 | "glob": "7.1.2"
1067 | }
1068 | },
1069 | "safe-buffer": {
1070 | "version": "5.1.1",
1071 | "resolved": "https://unpm.uberinternal.com/safe-buffer/-/safe-buffer-5.1.1.tgz",
1072 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
1073 | },
1074 | "semver": {
1075 | "version": "5.5.0",
1076 | "resolved": "https://unpm.uberinternal.com/semver/-/semver-5.5.0.tgz",
1077 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
1078 | },
1079 | "semver-diff": {
1080 | "version": "2.1.0",
1081 | "resolved": "https://unpm.uberinternal.com/semver-diff/-/semver-diff-2.1.0.tgz",
1082 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
1083 | "requires": {
1084 | "semver": "5.5.0"
1085 | }
1086 | },
1087 | "send": {
1088 | "version": "0.16.2",
1089 | "resolved": "https://unpm.uberinternal.com/send/-/send-0.16.2.tgz",
1090 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1091 | "requires": {
1092 | "debug": "2.6.9",
1093 | "depd": "1.1.2",
1094 | "destroy": "1.0.4",
1095 | "encodeurl": "1.0.2",
1096 | "escape-html": "1.0.3",
1097 | "etag": "1.8.1",
1098 | "fresh": "0.5.2",
1099 | "http-errors": "1.6.2",
1100 | "mime": "1.4.1",
1101 | "ms": "2.0.0",
1102 | "on-finished": "2.3.0",
1103 | "range-parser": "1.2.0",
1104 | "statuses": "1.4.0"
1105 | },
1106 | "dependencies": {
1107 | "depd": {
1108 | "version": "1.1.2",
1109 | "resolved": "https://unpm.uberinternal.com/depd/-/depd-1.1.2.tgz",
1110 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
1111 | },
1112 | "ms": {
1113 | "version": "2.0.0",
1114 | "resolved": "https://unpm.uberinternal.com/ms/-/ms-2.0.0.tgz",
1115 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1116 | },
1117 | "statuses": {
1118 | "version": "1.4.0",
1119 | "resolved": "https://unpm.uberinternal.com/statuses/-/statuses-1.4.0.tgz",
1120 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
1121 | }
1122 | }
1123 | },
1124 | "serve": {
1125 | "version": "6.5.3",
1126 | "resolved": "https://unpm.uberinternal.com/serve/-/serve-6.5.3.tgz",
1127 | "integrity": "sha512-b8Sx7Zbx1lBfR2/DuJMN0Sh2evrblS1aBcKsdb77w/sSwxa7Np7iuQ2zL5NEovkvJAkCvn0Q/EQe4ovdJUPuZQ==",
1128 | "requires": {
1129 | "@zeit/check-updates": "1.1.0",
1130 | "args": "3.0.8",
1131 | "basic-auth": "2.0.0",
1132 | "bluebird": "3.5.1",
1133 | "boxen": "1.3.0",
1134 | "chalk": "2.3.2",
1135 | "clipboardy": "1.2.3",
1136 | "dargs": "5.1.0",
1137 | "detect-port": "1.2.2",
1138 | "filesize": "3.6.0",
1139 | "fs-extra": "5.0.0",
1140 | "handlebars": "4.0.11",
1141 | "ip": "1.1.5",
1142 | "micro": "9.1.0",
1143 | "micro-compress": "1.0.0",
1144 | "mime-types": "2.1.18",
1145 | "node-version": "1.1.0",
1146 | "openssl-self-signed-certificate": "1.1.6",
1147 | "opn": "5.2.0",
1148 | "path-is-inside": "1.0.2",
1149 | "path-type": "3.0.0",
1150 | "send": "0.16.2"
1151 | }
1152 | },
1153 | "setprototypeof": {
1154 | "version": "1.0.3",
1155 | "resolved": "https://unpm.uberinternal.com/setprototypeof/-/setprototypeof-1.0.3.tgz",
1156 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
1157 | },
1158 | "shebang-command": {
1159 | "version": "1.2.0",
1160 | "resolved": "https://unpm.uberinternal.com/shebang-command/-/shebang-command-1.2.0.tgz",
1161 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1162 | "requires": {
1163 | "shebang-regex": "1.0.0"
1164 | }
1165 | },
1166 | "shebang-regex": {
1167 | "version": "1.0.0",
1168 | "resolved": "https://unpm.uberinternal.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
1169 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
1170 | },
1171 | "signal-exit": {
1172 | "version": "3.0.2",
1173 | "resolved": "https://unpm.uberinternal.com/signal-exit/-/signal-exit-3.0.2.tgz",
1174 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
1175 | },
1176 | "source-map": {
1177 | "version": "0.4.4",
1178 | "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.4.4.tgz",
1179 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
1180 | "requires": {
1181 | "amdefine": "1.0.1"
1182 | }
1183 | },
1184 | "statuses": {
1185 | "version": "1.5.0",
1186 | "resolved": "https://unpm.uberinternal.com/statuses/-/statuses-1.5.0.tgz",
1187 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
1188 | },
1189 | "string-similarity": {
1190 | "version": "1.2.0",
1191 | "resolved": "https://unpm.uberinternal.com/string-similarity/-/string-similarity-1.2.0.tgz",
1192 | "integrity": "sha1-11FTyzg4RjGLejmo2SkrtNtOnDA=",
1193 | "requires": {
1194 | "lodash": "4.17.5"
1195 | }
1196 | },
1197 | "string-width": {
1198 | "version": "2.1.1",
1199 | "resolved": "https://unpm.uberinternal.com/string-width/-/string-width-2.1.1.tgz",
1200 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1201 | "requires": {
1202 | "is-fullwidth-code-point": "2.0.0",
1203 | "strip-ansi": "4.0.0"
1204 | }
1205 | },
1206 | "strip-ansi": {
1207 | "version": "4.0.0",
1208 | "resolved": "https://unpm.uberinternal.com/strip-ansi/-/strip-ansi-4.0.0.tgz",
1209 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1210 | "requires": {
1211 | "ansi-regex": "3.0.0"
1212 | }
1213 | },
1214 | "strip-eof": {
1215 | "version": "1.0.0",
1216 | "resolved": "https://unpm.uberinternal.com/strip-eof/-/strip-eof-1.0.0.tgz",
1217 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
1218 | },
1219 | "strip-json-comments": {
1220 | "version": "2.0.1",
1221 | "resolved": "https://unpm.uberinternal.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1222 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
1223 | },
1224 | "supports-color": {
1225 | "version": "4.5.0",
1226 | "resolved": "https://unpm.uberinternal.com/supports-color/-/supports-color-4.5.0.tgz",
1227 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
1228 | "requires": {
1229 | "has-flag": "2.0.0"
1230 | }
1231 | },
1232 | "term-size": {
1233 | "version": "1.2.0",
1234 | "resolved": "https://unpm.uberinternal.com/term-size/-/term-size-1.2.0.tgz",
1235 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
1236 | "requires": {
1237 | "execa": "0.7.0"
1238 | }
1239 | },
1240 | "timed-out": {
1241 | "version": "4.0.1",
1242 | "resolved": "https://unpm.uberinternal.com/timed-out/-/timed-out-4.0.1.tgz",
1243 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
1244 | },
1245 | "uglify-js": {
1246 | "version": "2.8.29",
1247 | "resolved": "https://unpm.uberinternal.com/uglify-js/-/uglify-js-2.8.29.tgz",
1248 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
1249 | "optional": true,
1250 | "requires": {
1251 | "source-map": "0.5.7",
1252 | "uglify-to-browserify": "1.0.2",
1253 | "yargs": "3.10.0"
1254 | },
1255 | "dependencies": {
1256 | "source-map": {
1257 | "version": "0.5.7",
1258 | "resolved": "https://unpm.uberinternal.com/source-map/-/source-map-0.5.7.tgz",
1259 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
1260 | "optional": true
1261 | }
1262 | }
1263 | },
1264 | "uglify-to-browserify": {
1265 | "version": "1.0.2",
1266 | "resolved": "https://unpm.uberinternal.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
1267 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
1268 | "optional": true
1269 | },
1270 | "unique-string": {
1271 | "version": "1.0.0",
1272 | "resolved": "https://unpm.uberinternal.com/unique-string/-/unique-string-1.0.0.tgz",
1273 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
1274 | "requires": {
1275 | "crypto-random-string": "1.0.0"
1276 | }
1277 | },
1278 | "universalify": {
1279 | "version": "0.1.1",
1280 | "resolved": "https://unpm.uberinternal.com/universalify/-/universalify-0.1.1.tgz",
1281 | "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
1282 | },
1283 | "unpipe": {
1284 | "version": "1.0.0",
1285 | "resolved": "https://unpm.uberinternal.com/unpipe/-/unpipe-1.0.0.tgz",
1286 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1287 | },
1288 | "unzip-response": {
1289 | "version": "2.0.1",
1290 | "resolved": "https://unpm.uberinternal.com/unzip-response/-/unzip-response-2.0.1.tgz",
1291 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
1292 | },
1293 | "update-notifier": {
1294 | "version": "2.3.0",
1295 | "resolved": "https://unpm.uberinternal.com/update-notifier/-/update-notifier-2.3.0.tgz",
1296 | "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
1297 | "requires": {
1298 | "boxen": "1.3.0",
1299 | "chalk": "2.3.2",
1300 | "configstore": "3.1.2",
1301 | "import-lazy": "2.1.0",
1302 | "is-installed-globally": "0.1.0",
1303 | "is-npm": "1.0.0",
1304 | "latest-version": "3.1.0",
1305 | "semver-diff": "2.1.0",
1306 | "xdg-basedir": "3.0.0"
1307 | }
1308 | },
1309 | "url-parse-lax": {
1310 | "version": "1.0.0",
1311 | "resolved": "https://unpm.uberinternal.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
1312 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
1313 | "requires": {
1314 | "prepend-http": "1.0.4"
1315 | }
1316 | },
1317 | "vary": {
1318 | "version": "1.1.2",
1319 | "resolved": "https://unpm.uberinternal.com/vary/-/vary-1.1.2.tgz",
1320 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1321 | },
1322 | "which": {
1323 | "version": "1.3.0",
1324 | "resolved": "https://unpm.uberinternal.com/which/-/which-1.3.0.tgz",
1325 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
1326 | "requires": {
1327 | "isexe": "2.0.0"
1328 | }
1329 | },
1330 | "widest-line": {
1331 | "version": "2.0.0",
1332 | "resolved": "https://unpm.uberinternal.com/widest-line/-/widest-line-2.0.0.tgz",
1333 | "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
1334 | "requires": {
1335 | "string-width": "2.1.1"
1336 | }
1337 | },
1338 | "window-size": {
1339 | "version": "0.1.0",
1340 | "resolved": "https://unpm.uberinternal.com/window-size/-/window-size-0.1.0.tgz",
1341 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
1342 | "optional": true
1343 | },
1344 | "wordwrap": {
1345 | "version": "0.0.3",
1346 | "resolved": "https://unpm.uberinternal.com/wordwrap/-/wordwrap-0.0.3.tgz",
1347 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
1348 | },
1349 | "wrappy": {
1350 | "version": "1.0.2",
1351 | "resolved": "https://unpm.uberinternal.com/wrappy/-/wrappy-1.0.2.tgz",
1352 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1353 | "dev": true
1354 | },
1355 | "write-file-atomic": {
1356 | "version": "2.3.0",
1357 | "resolved": "https://unpm.uberinternal.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
1358 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
1359 | "requires": {
1360 | "graceful-fs": "4.1.11",
1361 | "imurmurhash": "0.1.4",
1362 | "signal-exit": "3.0.2"
1363 | }
1364 | },
1365 | "xdg-basedir": {
1366 | "version": "3.0.0",
1367 | "resolved": "https://unpm.uberinternal.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
1368 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
1369 | },
1370 | "yallist": {
1371 | "version": "2.1.2",
1372 | "resolved": "https://unpm.uberinternal.com/yallist/-/yallist-2.1.2.tgz",
1373 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
1374 | },
1375 | "yargs": {
1376 | "version": "3.10.0",
1377 | "resolved": "https://unpm.uberinternal.com/yargs/-/yargs-3.10.0.tgz",
1378 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
1379 | "optional": true,
1380 | "requires": {
1381 | "camelcase": "1.2.1",
1382 | "cliui": "2.1.0",
1383 | "decamelize": "1.2.0",
1384 | "window-size": "0.1.0"
1385 | },
1386 | "dependencies": {
1387 | "camelcase": {
1388 | "version": "1.2.1",
1389 | "resolved": "https://unpm.uberinternal.com/camelcase/-/camelcase-1.2.1.tgz",
1390 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
1391 | "optional": true
1392 | }
1393 | }
1394 | }
1395 | }
1396 | }
1397 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "typescript-play",
3 | "version": "0.0.1",
4 | "description": "Better TypeScript playground",
5 | "main": "main.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "serve ./public",
9 | "setup": "npm run fetch-schema",
10 | "clean": "rm -rf monaco-typescript && rm -rf public/monaco-typescript",
11 | "get-typescript": "./scripts/get-typescript.sh",
12 | "deploy": "gh-pages --dist=public",
13 | "fetch-schema": "curl http://json.schemastore.org/tsconfig > public/schema/tsconfig.json"
14 | },
15 | "keywords": [],
16 | "author": "",
17 | "license": "ISC",
18 | "dependencies": {
19 | "serve": "^6.5.3"
20 | },
21 | "devDependencies": {
22 | "gh-pages": "^1.1.0"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/patch/2.9.1.patch:
--------------------------------------------------------------------------------
1 | diff --git a/src/tsWorker.ts b/src/tsWorker.ts
2 | index 89cc368..289ffd8 100644
3 | --- a/src/tsWorker.ts
4 | +++ b/src/tsWorker.ts
5 | @@ -144,7 +144,7 @@ export class TypeScriptWorker implements ts.LanguageServiceHost {
6 | }
7 |
8 | getCompletionEntryDetails(fileName: string, position: number, entry: string): Promise {
9 | - return Promise.as(this._languageService.getCompletionEntryDetails(fileName, position, entry, undefined, undefined));
10 | + return Promise.as(this._languageService.getCompletionEntryDetails(fileName, position, entry, undefined, undefined, undefined));
11 | }
12 |
13 | getSignatureHelpItems(fileName: string, position: number): Promise {
14 |
--------------------------------------------------------------------------------
/patch/3.2.1.patch:
--------------------------------------------------------------------------------
1 | diff --git a/src/tsWorker.ts b/src/tsWorker.ts
2 | index 9cafc6d..6247a98 100644
3 | --- a/src/tsWorker.ts
4 | +++ b/src/tsWorker.ts
5 | @@ -166,11 +166,11 @@ export class TypeScriptWorker implements ts.LanguageServiceHost {
6 | return Promise.as(this._languageService.getQuickInfoAtPosition(fileName, position));
7 | }
8 |
9 | - getOccurrencesAtPosition(fileName: string, position: number): Promise {
10 | + getOccurrencesAtPosition(fileName: string, position: number): Promise> {
11 | return Promise.as(this._languageService.getOccurrencesAtPosition(fileName, position));
12 | }
13 |
14 | - getDefinitionAtPosition(fileName: string, position: number): Promise {
15 | + getDefinitionAtPosition(fileName: string, position: number): Promise> {
16 | return Promise.as(this._languageService.getDefinitionAtPosition(fileName, position));
17 | }
18 |
19 |
--------------------------------------------------------------------------------
/patch/3.5.1.patch:
--------------------------------------------------------------------------------
1 | diff --git a/src/tsconfig.esm.json b/src/tsconfig.esm.json
2 | index b95798a..6efc6a0 100644
3 | --- a/src/tsconfig.esm.json
4 | +++ b/src/tsconfig.esm.json
5 | @@ -8,6 +8,7 @@
6 | "dom",
7 | "es5",
8 | "es2015.collection",
9 | + "es2015.iterable",
10 | "es2015.promise"
11 | ]
12 | },
13 | diff --git a/src/tsconfig.json b/src/tsconfig.json
14 | index f4ff52f..778087c 100644
15 | --- a/src/tsconfig.json
16 | +++ b/src/tsconfig.json
17 | @@ -8,6 +8,7 @@
18 | "dom",
19 | "es5",
20 | "es2015.collection",
21 | + "es2015.iterable",
22 | "es2015.promise"
23 | ]
24 | },
25 |
--------------------------------------------------------------------------------
/public/examples/adding-types.ts:
--------------------------------------------------------------------------------
1 | function Greeter(greeting: string) {
2 | this.greeting = greeting;
3 | }
4 |
5 | Greeter.prototype.greet = function() {
6 | return "Hello, " + this.greeting;
7 | };
8 |
9 | let greeter = new Greeter("world");
10 |
11 | let button = document.createElement("button");
12 | button.textContent = "Say Hello";
13 | button.onclick = function() {
14 | alert(greeter.greet());
15 | };
16 |
17 | document.body.appendChild(button);
18 |
--------------------------------------------------------------------------------
/public/examples/async-await.ts:
--------------------------------------------------------------------------------
1 | // Target: ES2015^
2 |
3 | async function delay(ms: number): Promise {
4 | return new Promise(resolve => {
5 | setTimeout(resolve, ms);
6 | });
7 | }
8 |
9 | async function main() {
10 | const ms = 1000;
11 | console.log(`Waiting for ${ms}ms...`);
12 | await delay(ms);
13 | console.log("Done!");
14 | }
15 |
16 | main();
17 |
--------------------------------------------------------------------------------
/public/examples/async-generators.ts:
--------------------------------------------------------------------------------
1 | // https://github.com/tc39/proposal-async-iteration
2 |
3 | async function* gen(limit = 10) {
4 | let i = 0;
5 | while (i < limit) {
6 | yield new Promise(resolve => setTimeout(() => resolve(i++), 100));
7 | }
8 | }
9 |
10 | async function main() {
11 | for await (const n of gen()) {
12 | console.log(n);
13 | }
14 | console.log("Done!");
15 | }
16 |
17 | main();
18 |
--------------------------------------------------------------------------------
/public/examples/bounded-polymorphism.ts:
--------------------------------------------------------------------------------
1 | function logFoo(obj: T): T {
2 | console.log(obj.foo);
3 | return obj;
4 | }
5 |
6 | logFoo({ foo: "foo", bar: "bar" }).bar;
7 |
8 | logFoo({ bar: "bar" }); // Expected error
9 |
--------------------------------------------------------------------------------
/public/examples/building-a-raytracer.ts:
--------------------------------------------------------------------------------
1 | class Vector {
2 | constructor(public x: number, public y: number, public z: number) {}
3 |
4 | static times(k: number, v: Vector) {
5 | return new Vector(k * v.x, k * v.y, k * v.z);
6 | }
7 |
8 | static minus(v1: Vector, v2: Vector) {
9 | return new Vector(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
10 | }
11 |
12 | static plus(v1: Vector, v2: Vector) {
13 | return new Vector(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
14 | }
15 |
16 | static dot(v1: Vector, v2: Vector) {
17 | return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
18 | }
19 |
20 | static mag(v: Vector) {
21 | return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
22 | }
23 |
24 | static norm(v: Vector) {
25 | let mag = Vector.mag(v);
26 | let div = mag === 0 ? Infinity : 1.0 / mag;
27 | return Vector.times(div, v);
28 | }
29 |
30 | static cross(v1: Vector, v2: Vector) {
31 | return new Vector(
32 | v1.y * v2.z - v1.z * v2.y,
33 | v1.z * v2.x - v1.x * v2.z,
34 | v1.x * v2.y - v1.y * v2.x,
35 | );
36 | }
37 | }
38 |
39 | class Color {
40 | constructor(public r: number, public g: number, public b: number) {}
41 |
42 | static scale(k: number, v: Color) {
43 | return new Color(k * v.r, k * v.g, k * v.b);
44 | }
45 |
46 | static plus(v1: Color, v2: Color) {
47 | return new Color(v1.r + v2.r, v1.g + v2.g, v1.b + v2.b);
48 | }
49 |
50 | static times(v1: Color, v2: Color) {
51 | return new Color(v1.r * v2.r, v1.g * v2.g, v1.b * v2.b);
52 | }
53 |
54 | static white = new Color(1.0, 1.0, 1.0);
55 | static grey = new Color(0.5, 0.5, 0.5);
56 | static black = new Color(0.0, 0.0, 0.0);
57 | static background = Color.black;
58 | static defaultColor = Color.black;
59 |
60 | static toDrawingColor(c: Color) {
61 | let legalize = d => (d > 1 ? 1 : d);
62 | return {
63 | r: Math.floor(legalize(c.r) * 255),
64 | g: Math.floor(legalize(c.g) * 255),
65 | b: Math.floor(legalize(c.b) * 255),
66 | };
67 | }
68 | }
69 |
70 | class Camera {
71 | forward: Vector;
72 | right: Vector;
73 | up: Vector;
74 |
75 | constructor(public pos: Vector, lookAt: Vector) {
76 | let down = new Vector(0.0, -1.0, 0.0);
77 | this.forward = Vector.norm(Vector.minus(lookAt, this.pos));
78 | this.right = Vector.times(
79 | 1.5,
80 | Vector.norm(Vector.cross(this.forward, down)),
81 | );
82 | this.up = Vector.times(
83 | 1.5,
84 | Vector.norm(Vector.cross(this.forward, this.right)),
85 | );
86 | }
87 | }
88 |
89 | interface Ray {
90 | start: Vector;
91 | dir: Vector;
92 | }
93 |
94 | interface Intersection {
95 | thing: Thing;
96 | ray: Ray;
97 | dist: number;
98 | }
99 |
100 | interface Surface {
101 | diffuse: (pos: Vector) => Color;
102 | specular: (pos: Vector) => Color;
103 | reflect: (pos: Vector) => number;
104 | roughness: number;
105 | }
106 |
107 | interface Thing {
108 | intersect: (ray: Ray) => Intersection;
109 | normal: (pos: Vector) => Vector;
110 | surface: Surface;
111 | }
112 |
113 | interface Light {
114 | pos: Vector;
115 | color: Color;
116 | }
117 |
118 | interface Scene {
119 | things: Thing[];
120 | lights: Light[];
121 | camera: Camera;
122 | }
123 |
124 | class Sphere implements Thing {
125 | radius2: number;
126 |
127 | constructor(public center: Vector, radius: number, public surface: Surface) {
128 | this.radius2 = radius * radius;
129 | }
130 |
131 | normal(pos: Vector): Vector {
132 | return Vector.norm(Vector.minus(pos, this.center));
133 | }
134 |
135 | intersect(ray: Ray) {
136 | let eo = Vector.minus(this.center, ray.start);
137 | let v = Vector.dot(eo, ray.dir);
138 | let dist = 0;
139 | if (v >= 0) {
140 | let disc = this.radius2 - (Vector.dot(eo, eo) - v * v);
141 | if (disc >= 0) {
142 | dist = v - Math.sqrt(disc);
143 | }
144 | }
145 | if (dist === 0) {
146 | return null;
147 | } else {
148 | return { thing: this, ray: ray, dist: dist };
149 | }
150 | }
151 | }
152 |
153 | class Plane implements Thing {
154 | normal: (pos: Vector) => Vector;
155 | intersect: (ray: Ray) => Intersection;
156 |
157 | constructor(norm: Vector, offset: number, public surface: Surface) {
158 | this.normal = function(pos: Vector) {
159 | return norm;
160 | };
161 | this.intersect = function(ray: Ray): Intersection {
162 | let denom = Vector.dot(norm, ray.dir);
163 |
164 | if (denom > 0) {
165 | return null;
166 | } else {
167 | let dist = (Vector.dot(norm, ray.start) + offset) / -denom;
168 | return { thing: this, ray: ray, dist: dist };
169 | }
170 | };
171 | }
172 | }
173 |
174 | namespace Surfaces {
175 | export let shiny: Surface = {
176 | diffuse: function(pos) {
177 | return Color.white;
178 | },
179 | specular: function(pos) {
180 | return Color.grey;
181 | },
182 | reflect: function(pos) {
183 | return 0.7;
184 | },
185 | roughness: 250,
186 | };
187 |
188 | export let checkerboard: Surface = {
189 | diffuse: function(pos) {
190 | if ((Math.floor(pos.z) + Math.floor(pos.x)) % 2 !== 0) {
191 | return Color.white;
192 | } else {
193 | return Color.black;
194 | }
195 | },
196 | specular: function(pos) {
197 | return Color.white;
198 | },
199 | reflect: function(pos) {
200 | if ((Math.floor(pos.z) + Math.floor(pos.x)) % 2 !== 0) {
201 | return 0.1;
202 | } else {
203 | return 0.7;
204 | }
205 | },
206 | roughness: 150,
207 | };
208 | }
209 |
210 | class RayTracer {
211 | private maxDepth = 5;
212 |
213 | private intersections(ray: Ray, scene: Scene) {
214 | let closest = +Infinity;
215 | let closestInter: Intersection = undefined;
216 | for (let i in scene.things) {
217 | let inter = scene.things[i].intersect(ray);
218 | if (inter != null && inter.dist < closest) {
219 | closestInter = inter;
220 | closest = inter.dist;
221 | }
222 | }
223 | return closestInter;
224 | }
225 |
226 | private testRay(ray: Ray, scene: Scene) {
227 | let isect = this.intersections(ray, scene);
228 | if (isect != null) {
229 | return isect.dist;
230 | } else {
231 | return undefined;
232 | }
233 | }
234 |
235 | private traceRay(ray: Ray, scene: Scene, depth: number): Color {
236 | let isect = this.intersections(ray, scene);
237 | if (isect === undefined) {
238 | return Color.background;
239 | } else {
240 | return this.shade(isect, scene, depth);
241 | }
242 | }
243 |
244 | private shade(isect: Intersection, scene: Scene, depth: number) {
245 | let d = isect.ray.dir;
246 | let pos = Vector.plus(Vector.times(isect.dist, d), isect.ray.start);
247 | let normal = isect.thing.normal(pos);
248 | let reflectDir = Vector.minus(
249 | d,
250 | Vector.times(2, Vector.times(Vector.dot(normal, d), normal)),
251 | );
252 | let naturalColor = Color.plus(
253 | Color.background,
254 | this.getNaturalColor(isect.thing, pos, normal, reflectDir, scene),
255 | );
256 | let reflectedColor =
257 | depth >= this.maxDepth
258 | ? Color.grey
259 | : this.getReflectionColor(
260 | isect.thing,
261 | pos,
262 | normal,
263 | reflectDir,
264 | scene,
265 | depth,
266 | );
267 | return Color.plus(naturalColor, reflectedColor);
268 | }
269 |
270 | private getReflectionColor(
271 | thing: Thing,
272 | pos: Vector,
273 | normal: Vector,
274 | rd: Vector,
275 | scene: Scene,
276 | depth: number,
277 | ) {
278 | return Color.scale(
279 | thing.surface.reflect(pos),
280 | this.traceRay({ start: pos, dir: rd }, scene, depth + 1),
281 | );
282 | }
283 |
284 | private getNaturalColor(
285 | thing: Thing,
286 | pos: Vector,
287 | norm: Vector,
288 | rd: Vector,
289 | scene: Scene,
290 | ) {
291 | let addLight = (col, light) => {
292 | let ldis = Vector.minus(light.pos, pos);
293 | let livec = Vector.norm(ldis);
294 | let neatIsect = this.testRay({ start: pos, dir: livec }, scene);
295 | let isInShadow =
296 | neatIsect === undefined ? false : neatIsect <= Vector.mag(ldis);
297 | if (isInShadow) {
298 | return col;
299 | } else {
300 | let illum = Vector.dot(livec, norm);
301 | let lcolor =
302 | illum > 0 ? Color.scale(illum, light.color) : Color.defaultColor;
303 | let specular = Vector.dot(livec, Vector.norm(rd));
304 | let scolor =
305 | specular > 0
306 | ? Color.scale(
307 | Math.pow(specular, thing.surface.roughness),
308 | light.color,
309 | )
310 | : Color.defaultColor;
311 | return Color.plus(
312 | col,
313 | Color.plus(
314 | Color.times(thing.surface.diffuse(pos), lcolor),
315 | Color.times(thing.surface.specular(pos), scolor),
316 | ),
317 | );
318 | }
319 | };
320 | return scene.lights.reduce(addLight, Color.defaultColor);
321 | }
322 |
323 | render(scene, ctx, screenWidth, screenHeight) {
324 | let getPoint = (x, y, camera) => {
325 | let recenterX = x => (x - screenWidth / 2.0) / 2.0 / screenWidth;
326 | let recenterY = y => -(y - screenHeight / 2.0) / 2.0 / screenHeight;
327 | return Vector.norm(
328 | Vector.plus(
329 | camera.forward,
330 | Vector.plus(
331 | Vector.times(recenterX(x), camera.right),
332 | Vector.times(recenterY(y), camera.up),
333 | ),
334 | ),
335 | );
336 | };
337 | for (let y = 0; y < screenHeight; y++) {
338 | for (let x = 0; x < screenWidth; x++) {
339 | let color = this.traceRay(
340 | { start: scene.camera.pos, dir: getPoint(x, y, scene.camera) },
341 | scene,
342 | 0,
343 | );
344 | let c = Color.toDrawingColor(color);
345 | ctx.fillStyle =
346 | "rgb(" + String(c.r) + ", " + String(c.g) + ", " + String(c.b) + ")";
347 | ctx.fillRect(x, y, x + 1, y + 1);
348 | }
349 | }
350 | }
351 | }
352 |
353 | function defaultScene(): Scene {
354 | return {
355 | things: [
356 | new Plane(new Vector(0.0, 1.0, 0.0), 0.0, Surfaces.checkerboard),
357 | new Sphere(new Vector(0.0, 1.0, -0.25), 1.0, Surfaces.shiny),
358 | new Sphere(new Vector(-1.0, 0.5, 1.5), 0.5, Surfaces.shiny),
359 | ],
360 | lights: [
361 | { pos: new Vector(-2.0, 2.5, 0.0), color: new Color(0.49, 0.07, 0.07) },
362 | { pos: new Vector(1.5, 2.5, 1.5), color: new Color(0.07, 0.07, 0.49) },
363 | { pos: new Vector(1.5, 2.5, -1.5), color: new Color(0.07, 0.49, 0.071) },
364 | { pos: new Vector(0.0, 3.5, 0.0), color: new Color(0.21, 0.21, 0.35) },
365 | ],
366 | camera: new Camera(new Vector(3.0, 2.0, 4.0), new Vector(-1.0, 0.5, 0.0)),
367 | };
368 | }
369 |
370 | function exec() {
371 | let canv = document.createElement("canvas");
372 | canv.width = 256;
373 | canv.height = 256;
374 | document.body.appendChild(canv);
375 | let ctx = canv.getContext("2d");
376 | let rayTracer = new RayTracer();
377 | return rayTracer.render(defaultScene(), ctx, 256, 256);
378 | }
379 |
380 | exec();
381 |
--------------------------------------------------------------------------------
/public/examples/classic-javascript.ts:
--------------------------------------------------------------------------------
1 | function Greeter(greeting) {
2 | this.greeting = greeting;
3 | }
4 |
5 | Greeter.prototype.greet = function() {
6 | return "Hello, " + this.greeting;
7 | };
8 |
9 | // Oops, we're passing an object when we want a string. This will print
10 | // "Hello, [object Object]" instead of "Hello, world" without error.
11 | let greeter = new Greeter({ message: "world" });
12 |
13 | let button = document.createElement("button");
14 | button.textContent = "Say Hello";
15 | button.onclick = function() {
16 | alert(greeter.greet());
17 | };
18 |
19 | document.body.appendChild(button);
20 |
--------------------------------------------------------------------------------
/public/examples/conditional-types.ts:
--------------------------------------------------------------------------------
1 | // TypeScript ^2.8
2 |
3 | type TypeName = T extends string
4 | ? "string"
5 | : T extends number
6 | ? "number"
7 | : T extends boolean
8 | ? "boolean"
9 | : T extends undefined
10 | ? "undefined"
11 | : T extends Function ? "function" : "object";
12 |
13 | type T0 = TypeName; // "string"
14 | type T1 = TypeName<"a">; // "string"
15 | type T2 = TypeName; // "boolean"
16 | type T3 = TypeName<() => void>; // "function"
17 | type T4 = TypeName; // "object"
18 |
--------------------------------------------------------------------------------
/public/examples/decorators.ts:
--------------------------------------------------------------------------------
1 | // Requires `experimentalDecorators` enabled
2 |
3 | // http://www.typescriptlang.org/docs/handbook/decorators.html
4 |
5 | @sealed
6 | class Greeter {
7 | greeting: string;
8 | constructor(message: string) {
9 | this.greeting = message;
10 | }
11 | greet() {
12 | return "Hello, " + this.greeting;
13 | }
14 | }
15 |
16 | function sealed(constructor: Function) {
17 | Object.seal(constructor);
18 | Object.seal(constructor.prototype);
19 | }
20 |
--------------------------------------------------------------------------------
/public/examples/jsx.ts:
--------------------------------------------------------------------------------
1 | // set JSX to "React" or "Preserve"
2 |
3 | // fake bindings
4 | declare namespace React {
5 | function createElement(): any;
6 | }
7 |
8 | declare function View(props: { text: string }): any;
9 |
10 | const dom = ;
11 |
--------------------------------------------------------------------------------
/public/examples/mapped-types.ts:
--------------------------------------------------------------------------------
1 | interface State {
2 | text: string;
3 | counter: number;
4 | }
5 |
6 | const state: Readonly = {
7 | text: "hello world",
8 | counter: 42,
9 | };
10 |
11 | state.text = "update"; // Expected error: state is readonly
12 |
13 | const stateUpdate1: Partial = {
14 | counter: 70,
15 | };
16 |
17 | const stateUpdate2: Partial = {
18 | text: "update",
19 | flag: true, // Expected error: no `flag` in State
20 | };
21 |
--------------------------------------------------------------------------------
/public/examples/type-alias.ts:
--------------------------------------------------------------------------------
1 | type Name = string;
2 |
3 | type IdentityCallback = (p: T) => T;
4 |
5 | const callback: IdentityCallback = (p: Name) => p;
6 |
--------------------------------------------------------------------------------
/public/examples/type-casts.ts:
--------------------------------------------------------------------------------
1 | type TypeA = string;
2 |
3 | let obj: TypeA;
4 | let otherObject: any;
5 |
6 | obj = otherObject;
7 | obj = otherObject as TypeA;
8 |
--------------------------------------------------------------------------------
/public/examples/unions-and-type-guards.ts:
--------------------------------------------------------------------------------
1 | type NameOrNameArray = string | string[];
2 |
3 | function createName(name: NameOrNameArray) {
4 | if (typeof name === "string") {
5 | return name;
6 | } else {
7 | return name.join(" ");
8 | }
9 | }
10 |
11 | var greetingMessage = `Greetings, ${createName(["Sam", "Smith"])}`;
12 | alert(greetingMessage);
13 |
--------------------------------------------------------------------------------
/public/examples/using-classes.ts:
--------------------------------------------------------------------------------
1 | class Greeter {
2 | greeting: string;
3 | constructor(message: string) {
4 | this.greeting = message;
5 | }
6 | greet() {
7 | return "Hello, " + this.greeting;
8 | }
9 | }
10 |
11 | let greeter = new Greeter("world");
12 |
13 | let button = document.createElement("button");
14 | button.textContent = "Say Hello";
15 | button.onclick = function() {
16 | alert(greeter.greet());
17 | };
18 |
19 | document.body.appendChild(button);
20 |
--------------------------------------------------------------------------------
/public/examples/using-generics.ts:
--------------------------------------------------------------------------------
1 | class Greeter {
2 | greeting: T;
3 | constructor(message: T) {
4 | this.greeting = message;
5 | }
6 | greet() {
7 | return this.greeting;
8 | }
9 | }
10 |
11 | let greeter = new Greeter("Hello, world");
12 |
13 | let button = document.createElement("button");
14 | button.textContent = "Say Hello";
15 | button.onclick = function() {
16 | alert(greeter.greet());
17 | };
18 |
19 | document.body.appendChild(button);
20 |
--------------------------------------------------------------------------------
/public/examples/using-inheritance.ts:
--------------------------------------------------------------------------------
1 | class Animal {
2 | constructor(public name: string) {}
3 | move(distanceInMeters: number = 0) {
4 | console.log(`${this.name} moved ${distanceInMeters}m.`);
5 | }
6 | }
7 |
8 | class Snake extends Animal {
9 | constructor(name: string) {
10 | super(name);
11 | }
12 | move(distanceInMeters = 5) {
13 | console.log("Slithering...");
14 | super.move(distanceInMeters);
15 | }
16 | }
17 |
18 | class Horse extends Animal {
19 | constructor(name: string) {
20 | super(name);
21 | }
22 | move(distanceInMeters = 45) {
23 | console.log("Galloping...");
24 | super.move(distanceInMeters);
25 | }
26 | }
27 |
28 | let sam = new Snake("Sammy the Python");
29 | let tom: Animal = new Horse("Tommy the Palomino");
30 |
31 | sam.move();
32 | tom.move(34);
33 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/agentcooper/typescript-play/a42d10e8d9f7d48deb0c68b3dc8c96f46dce374c/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | TypeScript playground
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
103 |
104 |
105 |
106 |
109 |
110 |
111 |
160 |
170 |
171 |
180 |
181 |
206 |
207 |
243 |
244 |
245 | TS changelog
251 |
252 |
253 | TS docs
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
272 |
273 |
274 |
--------------------------------------------------------------------------------
/public/main.js:
--------------------------------------------------------------------------------
1 | // whoa, no typescript and no compilation!
2 |
3 | const LibManager = {
4 | libs: {},
5 |
6 | coreLibPath: `https://unpkg.com/typescript@${window.CONFIG.TSVersion}/lib/`,
7 |
8 | getReferencePaths(input) {
9 | const rx = //;
10 | return (input.match(new RegExp(rx.source, "g")) || []).map(s => {
11 | const match = s.match(rx);
12 | if (match && match.length >= 2) {
13 | return match[1];
14 | } else {
15 | throw new Error(`Error parsing: "${s}".`);
16 | }
17 | });
18 | },
19 |
20 | basename(url) {
21 | const parts = url.split("/");
22 | if (parts.length === 0) {
23 | throw new Error(`Bad url: "${url}"`);
24 | }
25 | return parts[parts.length - 1];
26 | },
27 |
28 | addLib: async function(path, ...args) {
29 | if (path.indexOf("http") === 0) {
30 | return this._addRemoteLib(path, ...args);
31 | }
32 | return this._addCoreLib(path, ...args);
33 | },
34 |
35 | _addCoreLib: async function(fileName, ...args) {
36 | return this._addRemoteLib(`${this.coreLibPath}${fileName}`, ...args);
37 | },
38 |
39 | _addRemoteLib: async function(
40 | url,
41 | stripNoDefaultLib = true,
42 | followReferences = true,
43 | ) {
44 | const fileName = this.basename(url);
45 |
46 | if (this.libs[fileName]) {
47 | return;
48 | }
49 |
50 | UI.toggleSpinner(true);
51 | const res = await fetch(url);
52 | if (res.status === 404) {
53 | console.log(
54 | `Check https://unpkg.com/typescript@${window.CONFIG.TSVersion}/lib/`,
55 | );
56 | }
57 | const rawText = await res.text();
58 |
59 | UI.toggleSpinner(false);
60 |
61 | const text = stripNoDefaultLib
62 | ? rawText.replace('/// ', "")
63 | : rawText;
64 |
65 | if (followReferences) {
66 | const paths = this.getReferencePaths(text);
67 | if (paths.length > 0) {
68 | console.log(`${fileName} depends on ${paths.join(", ")}`);
69 | for (const path of paths) {
70 | await this._addCoreLib(path, stripNoDefaultLib, followReferences);
71 | }
72 | }
73 | }
74 |
75 | const lib = monaco.languages.typescript.typescriptDefaults.addExtraLib(
76 | text,
77 | fileName,
78 | );
79 |
80 | console.groupCollapsed(`Added '${fileName}'`);
81 | console.log(text);
82 | console.groupEnd();
83 |
84 | this.libs[fileName] = lib;
85 |
86 | return lib;
87 | },
88 | };
89 |
90 | async function main() {
91 | const defaultCompilerOptions = {
92 | noImplicitAny: true,
93 | strictNullChecks: true,
94 | strictFunctionTypes: true,
95 | strictPropertyInitialization: true,
96 | noImplicitThis: true,
97 | noImplicitReturns: true,
98 |
99 | alwaysStrict: true,
100 | allowUnreachableCode: false,
101 | allowUnusedLabels: false,
102 |
103 | downlevelIteration: false,
104 | noEmitHelpers: false,
105 | noLib: false,
106 | noStrictGenericChecks: false,
107 | noUnusedLocals: false,
108 | noUnusedParameters: false,
109 |
110 | esModuleInterop: false,
111 | preserveConstEnums: false,
112 | removeComments: false,
113 | skipLibCheck: false,
114 |
115 | experimentalDecorators: false,
116 | emitDecoratorMetadata: false,
117 |
118 | target: monaco.languages.typescript.ScriptTarget.ES2017,
119 | jsx: monaco.languages.typescript.JsxEmit.None,
120 | };
121 |
122 | const urlDefaults = Object.entries(defaultCompilerOptions).reduce(
123 | (acc, [key, value]) => {
124 | if (params.has(key)) {
125 | const urlValue = params.get(key);
126 |
127 | if (urlValue === "true") {
128 | acc[key] = true;
129 | } else if (urlValue === "false") {
130 | acc[key] = false;
131 | } else if (!isNaN(parseInt(urlValue, 10))) {
132 | acc[key] = parseInt(params.get(key), 10);
133 | }
134 | }
135 |
136 | return acc;
137 | },
138 | {},
139 | );
140 |
141 | console.log("Url defaults", urlDefaults);
142 |
143 | const compilerOptions = Object.assign(
144 | {},
145 | defaultCompilerOptions,
146 | urlDefaults,
147 | );
148 |
149 | const sharedEditorOptions = {
150 | minimap: { enabled: false },
151 | automaticLayout: true,
152 | scrollBeyondLastLine: false,
153 | };
154 |
155 | const State = {
156 | inputModel: null,
157 | outputModel: null,
158 | };
159 |
160 | let inputEditor, outputEditor;
161 |
162 | function createSelect(obj, globalPath, title, compilerOption) {
163 | return ``;
182 | }
183 |
184 | function createFile(compilerOptions) {
185 | return monaco.Uri.file(
186 | "input." +
187 | (compilerOptions.jsx === monaco.languages.typescript.JsxEmit.None
188 | ? "ts"
189 | : "tsx")
190 | )
191 | }
192 |
193 | window.UI = {
194 | tooltips: {},
195 |
196 | shouldUpdateHash: false,
197 |
198 | showFlashMessage(message) {
199 | const node = document.querySelector(".flash");
200 | const messageNode = node.querySelector(".flash__message");
201 |
202 | messageNode.textContent = message;
203 |
204 | node.classList.toggle("flash--hidden", false);
205 | setTimeout(() => {
206 | node.classList.toggle("flash--hidden", true);
207 | }, 1000);
208 | },
209 |
210 | fetchTooltips: async function() {
211 | try {
212 | this.toggleSpinner(true);
213 | const res = await fetch(`${window.CONFIG.baseUrl}schema/tsconfig.json`);
214 | const json = await res.json();
215 | this.toggleSpinner(false);
216 |
217 | for (const [propertyName, property] of Object.entries(
218 | json.definitions.compilerOptionsDefinition.properties.compilerOptions
219 | .properties,
220 | )) {
221 | this.tooltips[propertyName] = property.description;
222 | }
223 | } catch (e) {
224 | console.error(e);
225 | // not critical
226 | }
227 | },
228 |
229 | renderAvailableVersions() {
230 | const node = document.querySelector("#version-popup");
231 | const html = `
232 |
233 | ${Object.keys(window.CONFIG.availableTSVersions)
234 | .sort()
235 | .reverse()
236 | .map(version => {
237 | return `- ${version}
`;
238 | })
239 | .join("\n")}
240 |
241 | `;
242 |
243 | node.innerHTML = html;
244 | },
245 |
246 | renderVersion() {
247 | const node = document.querySelector("#version");
248 | const childNode = node.querySelector("#version-current");
249 |
250 | childNode.textContent = `${window.CONFIG.TSVersion}`;
251 |
252 | node.style.opacity = 1;
253 | node.classList.toggle("popup-on-hover", true);
254 |
255 | this.toggleSpinner(false);
256 | },
257 |
258 | toggleSpinner(shouldShow) {
259 | document
260 | .querySelector(".spinner")
261 | .classList.toggle("spinner--hidden", !shouldShow);
262 | },
263 |
264 | renderSettings() {
265 | const node = document.querySelector("#settings-popup");
266 |
267 | const html = `
268 | ${createSelect(
269 | monaco.languages.typescript.ScriptTarget,
270 | "monaco.languages.typescript.ScriptTarget",
271 | "Target",
272 | "target",
273 | )}
274 |
275 | ${createSelect(
276 | monaco.languages.typescript.JsxEmit,
277 | "monaco.languages.typescript.JsxEmit",
278 | "JSX",
279 | "jsx",
280 | )}
281 |
292 |
293 |
294 | Compiler options reference
295 |
296 |
297 | `;
298 |
299 | node.innerHTML = html;
300 | },
301 |
302 | console() {
303 | if (!window.ts) {
304 | return;
305 | }
306 |
307 | console.log(`Using TypeScript ${window.ts.version}`);
308 |
309 | console.log("Available globals:");
310 | console.log("\twindow.ts", window.ts);
311 | console.log("\twindow.client", window.client);
312 | },
313 |
314 | selectVersion(version) {
315 | if (version === window.CONFIG.getLatestVersion()) {
316 | location.href = `${window.CONFIG.baseUrl}${location.hash}`;
317 | return false;
318 | }
319 |
320 | location.href = `${window.CONFIG.baseUrl}?ts=${version}${location.hash}`;
321 | return false;
322 | },
323 |
324 | selectExample: async function(exampleName) {
325 | try {
326 | const res = await fetch(
327 | `${window.CONFIG.baseUrl}examples/${exampleName}.ts`,
328 | );
329 | const code = await res.text();
330 | UI.shouldUpdateHash = false;
331 | State.inputModel.setValue(code.trim());
332 | location.hash = `example/${exampleName}`;
333 | UI.shouldUpdateHash = true;
334 | } catch (e) {
335 | console.log(e);
336 | }
337 | },
338 |
339 | setCodeFromHash: async function() {
340 | if (location.hash.startsWith("#example")) {
341 | const exampleName = location.hash.replace("#example/", "").trim();
342 | UI.selectExample(exampleName);
343 | }
344 | },
345 |
346 | refreshOutput() {
347 | UI.shouldUpdateHash = false;
348 | State.inputModel.setValue(State.inputModel.getValue());
349 | UI.shouldUpdateHash = true;
350 | },
351 |
352 | updateURL() {
353 | const diff = Object.entries(defaultCompilerOptions).reduce(
354 | (acc, [key, value]) => {
355 | if (value !== compilerOptions[key]) {
356 | acc[key] = compilerOptions[key];
357 | }
358 |
359 | return acc;
360 | },
361 | {},
362 | );
363 |
364 | const hash = `code/${LZString.compressToEncodedURIComponent(
365 | State.inputModel.getValue(),
366 | )}`;
367 |
368 | const urlParams = Object.assign({}, diff);
369 |
370 | ["lib", "ts"].forEach(param => {
371 | if (params.has(param)) {
372 | urlParams[param] = params.get(param);
373 | }
374 | });
375 |
376 | if (Object.keys(urlParams).length > 0) {
377 | const queryString = Object.entries(urlParams)
378 | .map(([key, value]) => {
379 | return `${key}=${encodeURIComponent(value)}`;
380 | })
381 | .join("&");
382 |
383 | window.history.replaceState(
384 | {},
385 | "",
386 | `${window.CONFIG.baseUrl}?${queryString}#${hash}`,
387 | );
388 | } else {
389 | window.history.replaceState({}, "", `${window.CONFIG.baseUrl}#${hash}`);
390 | }
391 | },
392 |
393 | updateCompileOptions(name, value) {
394 | console.log(`${name} = ${value}`);
395 |
396 | Object.assign(compilerOptions, {
397 | [name]: value,
398 | });
399 |
400 | console.log("Updaring compiler options to", compilerOptions);
401 | monaco.languages.typescript.typescriptDefaults.setCompilerOptions(
402 | compilerOptions,
403 | );
404 |
405 | let inputCode = inputEditor.getValue();
406 | State.inputModel.dispose();
407 | State.inputModel = monaco.editor.createModel(
408 | inputCode,
409 | "typescript",
410 | createFile(compilerOptions)
411 | );
412 | inputEditor.setModel(State.inputModel);
413 |
414 | UI.refreshOutput();
415 |
416 | UI.renderSettings();
417 |
418 | UI.updateURL();
419 | },
420 |
421 | getInitialCode() {
422 | if (location.hash.startsWith("#code")) {
423 | const code = location.hash.replace("#code/", "").trim();
424 | return LZString.decompressFromEncodedURIComponent(code);
425 | }
426 |
427 | return `
428 | const message: string = 'hello world';
429 | console.log(message);
430 | `.trim();
431 | },
432 | };
433 |
434 | window.MonacoEnvironment = {
435 | getWorkerUrl: function(workerId, label) {
436 | return `worker.js?version=${window.CONFIG.getMonacoVersion()}`;
437 | },
438 | };
439 |
440 | for (const path of window.CONFIG.extraLibs) {
441 | await LibManager.addLib(path);
442 | }
443 |
444 | monaco.languages.typescript.typescriptDefaults.setCompilerOptions(
445 | compilerOptions,
446 | );
447 |
448 | State.inputModel = monaco.editor.createModel(
449 | UI.getInitialCode(),
450 | "typescript",
451 | createFile(compilerOptions)
452 | );
453 |
454 | State.outputModel = monaco.editor.createModel(
455 | "",
456 | "javascript",
457 | monaco.Uri.file("output.js"),
458 | );
459 |
460 | inputEditor = monaco.editor.create(
461 | document.getElementById("input"),
462 | Object.assign({ model: State.inputModel }, sharedEditorOptions),
463 | );
464 |
465 | outputEditor = monaco.editor.create(
466 | document.getElementById("output"),
467 | Object.assign({ model: State.outputModel }, sharedEditorOptions),
468 | );
469 |
470 | function updateOutput() {
471 | monaco.languages.typescript.getTypeScriptWorker().then(worker => {
472 | worker(State.inputModel.uri).then((client, a) => {
473 | if (typeof window.client === "undefined") {
474 | UI.renderVersion();
475 |
476 | // expose global
477 | window.client = client;
478 | UI.console();
479 | }
480 |
481 | client.getEmitOutput(State.inputModel.uri.toString()).then(result => {
482 | State.outputModel.setValue(result.outputFiles[0].text);
483 | });
484 | });
485 | });
486 |
487 | if (UI.shouldUpdateHash) {
488 | UI.updateURL();
489 | }
490 | }
491 |
492 | UI.setCodeFromHash();
493 |
494 | UI.renderSettings();
495 | UI.fetchTooltips().then(() => {
496 | UI.renderSettings();
497 | });
498 |
499 | updateOutput();
500 | inputEditor.onDidChangeModelContent(() => {
501 | updateOutput();
502 | });
503 | UI.shouldUpdateHash = true;
504 |
505 | UI.renderAvailableVersions();
506 |
507 | /* Run */
508 |
509 | function runJavaScript() {
510 | console.clear();
511 | // to hide the stack trace
512 | setTimeout(() => {
513 | eval(State.outputModel.getValue());
514 | }, 0);
515 | }
516 |
517 | inputEditor.addCommand(
518 | monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter,
519 | runJavaScript,
520 | );
521 |
522 | outputEditor.addCommand(
523 | monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter,
524 | runJavaScript,
525 | );
526 |
527 | inputEditor.addCommand(
528 | monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KEY_F,
529 | prettier,
530 | );
531 |
532 | // if the focus is outside the editor
533 | window.addEventListener(
534 | "keydown",
535 | event => {
536 | const S_KEY = 83;
537 | if (event.keyCode == S_KEY && (event.metaKey || event.ctrlKey)) {
538 | event.preventDefault();
539 |
540 | window.clipboard.writeText(location.href.toString()).then(
541 | () => UI.showFlashMessage("URL is copied to the clipboard!"),
542 | e => {
543 | alert(e);
544 | },
545 | );
546 | }
547 |
548 | if (
549 | event.keyCode === 13 &&
550 | (event.metaKey || event.ctrlKey) &&
551 | event.target instanceof Node &&
552 | event.target === document.body
553 | ) {
554 | event.preventDefault();
555 | runJavaScript();
556 | }
557 | },
558 | false,
559 | );
560 |
561 | function prettier() {
562 | const PRETTIER_VERSION = "1.14.3";
563 |
564 | require([
565 | `https://unpkg.com/prettier@${PRETTIER_VERSION}/standalone.js`,
566 | `https://unpkg.com/prettier@${PRETTIER_VERSION}/parser-typescript.js`,
567 | ], function(prettier, { parsers }) {
568 | const cursorOffset = State.inputModel.getOffsetAt(
569 | inputEditor.getPosition(),
570 | );
571 |
572 | const formatResult = prettier.formatWithCursor(
573 | State.inputModel.getValue(),
574 | {
575 | parser: parsers.typescript.parse,
576 | cursorOffset,
577 | },
578 | );
579 |
580 | State.inputModel.setValue(formatResult.formatted);
581 | const newPosition = State.inputModel.getPositionAt(
582 | formatResult.cursorOffset,
583 | );
584 | inputEditor.setPosition(newPosition);
585 | });
586 | }
587 | }
588 |
--------------------------------------------------------------------------------
/public/schema/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/agentcooper/typescript-play/a42d10e8d9f7d48deb0c68b3dc8c96f46dce374c/public/schema/.gitkeep
--------------------------------------------------------------------------------
/public/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | width: 100vw;
5 | height: 100vh;
6 | overflow: hidden;
7 | font: normal 16px/1.4em -apple-system, system-ui, BlinkMacSystemFont,
8 | "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans",
9 | "Helvetica Neue", Arial, sans-serif;
10 | text-rendering: optimizeLegibility;
11 | }
12 |
13 | header {
14 | display: flex;
15 | background-color: #294e80;
16 | color: white;
17 | }
18 |
19 | header a {
20 | color: white;
21 | text-decoration: none;
22 | border-bottom: 1px solid;
23 | }
24 |
25 | #app {
26 | display: flex;
27 | flex-direction: column;
28 | margin: 0;
29 | padding: 0;
30 | width: 100vw;
31 | height: 100vh;
32 | overflow: hidden;
33 | }
34 |
35 | #playground {
36 | display: flex;
37 | flex: 1;
38 | }
39 |
40 | #input {
41 | flex: 1;
42 | }
43 |
44 | #output {
45 | flex: 1;
46 | }
47 |
48 | #version {
49 | transition: opacity 0.3s;
50 | margin-left: 0.3em;
51 | width: 3em;
52 | }
53 |
54 | .popup {
55 | display: none;
56 | position: absolute;
57 | left: -1em;
58 | padding: 0 1em 1em;
59 |
60 | z-index: 100;
61 | background-color: #294e80;
62 | color: white;
63 | font-size: 80%;
64 | }
65 |
66 | .popup ul {
67 | padding: 0;
68 | margin: 0;
69 | list-style: none;
70 | }
71 |
72 | .popup li {
73 | padding: 0.5em 0;
74 | }
75 |
76 | .button {
77 | cursor: pointer;
78 | }
79 | .button:hover {
80 | color: #ffa700;
81 | }
82 |
83 | .popup-on-hover {
84 | position: relative;
85 | }
86 |
87 | .popup-on-hover:hover .popup {
88 | display: inline-block;
89 | }
90 |
91 | .popup-on-hover:hover .popup-header {
92 | color: #ffa700;
93 | cursor: pointer;
94 | }
95 |
96 | .pointer {
97 | cursor: pointer;
98 | }
99 |
100 | .header-item {
101 | margin-left: 1em;
102 | }
103 |
104 | .header-item--extra-padding {
105 | margin-left: 0;
106 | padding-right: 1em;
107 | }
108 |
109 | .compact-list li {
110 | padding-top: 0.2em;
111 | padding-bottom: 0.2em;
112 | }
113 |
114 | .spinner {
115 | width: 0.5rem;
116 | height: 0.5rem;
117 | border: 0.25rem solid white;
118 | border-bottom: 0.25rem solid rgba(0, 0, 0, 0);
119 | border-radius: 50%;
120 | animation: spin 0.7s linear infinite;
121 |
122 | opacity: 1;
123 | transition: 0.3s opacity;
124 | }
125 |
126 | .spinner--hidden {
127 | opacity: 0;
128 | }
129 |
130 | @keyframes spin {
131 | to {
132 | transform: rotate(360deg);
133 | }
134 | }
135 |
136 | .select-label {
137 | display: inline-block;
138 | width: 3em;
139 | }
140 |
141 | .select select {
142 | display: inline-block;
143 | width: 7em;
144 | margin-left: 1em;
145 | }
146 |
147 | .flash {
148 | top: 0;
149 | left: 0;
150 | right: 0;
151 | bottom: 0;
152 | position: fixed;
153 | z-index: 42;
154 | display: flex;
155 | justify-content: center;
156 | align-items: center;
157 | pointer-events: none;
158 | }
159 |
160 | .flash__message {
161 | border-radius: 1.5em;
162 | padding: 1em 2em;
163 | background-color: black;
164 | color: white;
165 | opacity: 0.7;
166 | transition: opacity 0.1s ease-in-out;
167 |
168 | /* help Safari with blurred text */
169 | transform: translateZ(0);
170 | }
171 |
172 | .flash--hidden .flash__message {
173 | opacity: 0;
174 | transition: opacity 0.3s ease-in-out;
175 | }
176 |
177 | #settings-popup {
178 | overflow-y: auto;
179 | max-height: calc( 100vh - 5rem );
180 | }
181 |
--------------------------------------------------------------------------------
/public/worker.js:
--------------------------------------------------------------------------------
1 | const params = new URLSearchParams(location.search);
2 |
3 | const version = params.get("version");
4 |
5 | if (!version) {
6 | throw new Error(`Pass ?version= to worker.js.`);
7 | }
8 |
9 | self.MonacoEnvironment = {
10 | baseUrl: `https://unpkg.com/monaco-editor@${version}/min`,
11 | };
12 | importScripts(
13 | `https://unpkg.com/monaco-editor@${version}/min/vs/base/worker/workerMain.js`,
14 | );
15 |
--------------------------------------------------------------------------------
/scripts/get-typescript.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | VERSION="$1"
4 | MONACO_VERSION="${2:-latest}"
5 | rm -rf monaco-typescript
6 |
7 | set -o nounset
8 | set -o errexit
9 |
10 | git clone https://github.com/Microsoft/monaco-typescript
11 |
12 | pushd monaco-typescript
13 |
14 | if [ ! -z "$VERSION" ]; then
15 | # https://github.com/Microsoft/monaco-typescript#updating-typescript
16 | npm install typescript@$VERSION --save-dev
17 | # Continued below after applying patches
18 | fi
19 |
20 | npm install
21 | INSTALLED_VERSION=`node -p "require('typescript').version"`
22 |
23 | if [ ! -z "$VERSION" ]; then
24 | # Patches
25 | if [ $INSTALLED_VERSION = "2.9.1" ]; then
26 | git apply ../patch/2.9.1.patch
27 | fi
28 | if [ $INSTALLED_VERSION = "3.2.1" ]; then
29 | git apply ../patch/3.2.1.patch
30 | fi
31 | if [ $INSTALLED_VERSION = "3.5.1" ]; then
32 | git apply ../patch/3.5.1.patch
33 | fi
34 |
35 | npm run import-typescript
36 | npm run prepublishOnly
37 | fi
38 |
39 | popd
40 |
41 | mkdir -vp ./public/monaco-typescript/${INSTALLED_VERSION}
42 | cp -vr ./monaco-typescript/release/min/ ./public/monaco-typescript/${INSTALLED_VERSION}
43 |
44 | echo "window.localTSVersion = { '$INSTALLED_VERSION': { monaco: '$MONACO_VERSION', lib: '/monaco-typescript/$INSTALLED_VERSION' } }" > public/env.js
45 |
46 | echo
47 | echo "Added typescript version '$INSTALLED_VERSION' with monaco version '$MONACO_VERSION'. Make sure they are compatible!"
48 | echo "(You can customize them via arguments to this script.)"
49 |
--------------------------------------------------------------------------------