This commit is contained in:
zino
2021-03-02 00:06:38 +01:00
parent 3a8aab0e9a
commit eeb745b013
3567 changed files with 1234741 additions and 0 deletions

70
client/node_modules/tsify/CONTRIBUTING.md generated vendored Normal file
View File

@@ -0,0 +1,70 @@
# Making a new release
Write release notes in `README.md`. Then,
```
npm version <major|minor|patch>
git push --follow-tags
npm publish
```
Enjoy life :heart: :rose:
# Debugging
Debug logging is enabled using the built in node `util`. We setup the `log` function as
```
var log = require('util').debuglog(require('./package').name);
```
If you want this function to actually do something just set the environment variable `NODE_DEBUG=tsify` e.g.
```
NODE_DEBUG=tsify browserify ... etc.
```
# Internals and processing flow
`tsify` is a implemented as a Browserify [plugin](https://github.com/substack/browserify-handbook#plugins) - not as a [transform](https://github.com/substack/browserify-handbook#writing-your-own) - because it needs access to the Browserify bundler - which is passed to plugins, but not to transforms. Access to the bundler is required so that `tsify` can include the TypeScript extensions in the `_extensions` array used by Browserify when resolving modules and so that `tsify` can listen to events associated with the Browserify pipeline. That's not possible with a transform, as a transform receives only a file path and a stream of content.
However, `tsify` does implement a transform that is wired up internally.
## `index.js` - the plugin
* It wires up internal transform.
* It wires up the `file` and `reset` events. (Note that the `file` is [informational nicety](https://github.com/substack/node-browserify#events); it's not a core part of the Browserify process.)
* It places `.ts(x)` extensions at the *head* of Browserify's extensions array.
* It gathers the Browserify entry point files.
## `lib/Tsifier.js` - the transform
* The `Tsifer` is a Browserify transform.
* It returns compiled content to Browserify.
* It parses the `tsconfig.json` for options and files.
* It configures the TypeScipt `rootDir` and `outDir` options to use an imaginary `/__tsify__` directory.
* It creates the `Host`, passing it to the TypeScript Compiler API to compile the program and check the syntax, semantics and output.
## `lib/Host.js` - the TypeScript host
* The `Host` is a TypeScript Compiler API host.
* It abstracts the reading and writing of files, etc.
* It parses and caches the parsed source files, reading them from disk.
* It caches the compiled files when the TypeScript Compiler API writes compiled content.
## Processing flow
* When Browserify's pipeline is prepared, the initial list of files to be compiled is obtained from the `tsconfig.json` and from the Browserify entry points.
* With the pipeline prepared, Browserify starts processing its entry points, passing their content through the `Tsifier` transform.
* To obtain the transformed content, the `Tsifier` transform looks in a cache for the compiled content.
* If the cache look up results in a miss, the transformed file is added to the list of files (if it's missing from the list) and a compilation of the list of files is performed.
* Note that with TypeScript using the same module resolution mechanism as Browserify (`"moduleResolution": "node"`) only a single compilation is required.
* Browserify then locates any `require` calls in the transformed content and passes the content for these dependencies through the `Tsifier` transform.
* This continues until all dependencies have been processed.
## Caveats
* The `Host` reads the source from disk; the content passed into the `Tsifier` transform is ignored. That means that any transforms added before the `tsify` plugin will be ineffectual.
* If `grunt-browserify` is used, declarative configurations will see transforms will be loaded before plugins. To avoid that, an imperative configuration that uses the [configure](https://github.com/jmreidy/grunt-browserify#configure) function would be necessary.

234
client/node_modules/tsify/README.md generated vendored Normal file
View File

@@ -0,0 +1,234 @@
# tsify
[Browserify](http://browserify.org/) plugin for compiling [TypeScript](http://www.typescriptlang.org/)
[![NPM version](https://img.shields.io/npm/v/tsify.svg)](https://www.npmjs.com/package/tsify)
[![Downloads](http://img.shields.io/npm/dm/tsify.svg)](https://npmjs.org/package/tsify)
[![Build status](https://img.shields.io/travis/TypeStrong/tsify.svg)](http://travis-ci.org/TypeStrong/tsify)
[![Dependency status](https://img.shields.io/david/TypeStrong/tsify.svg)](https://david-dm.org/TypeStrong/tsify)
[![devDependency Status](https://img.shields.io/david/dev/TypeStrong/tsify.svg)](https://david-dm.org/TypeStrong/tsify#info=devDependencies)
[![peerDependency Status](https://img.shields.io/david/peer/TypeStrong/tsify.svg)](https://david-dm.org/TypeStrong/tsify#info=peerDependencies)
# Example Usage
### Browserify API:
``` js
var browserify = require('browserify');
var tsify = require('tsify');
browserify()
.add('main.ts')
.plugin(tsify, { noImplicitAny: true })
.bundle()
.on('error', function (error) { console.error(error.toString()); })
.pipe(process.stdout);
```
### Command line:
``` sh
$ browserify main.ts -p [ tsify --noImplicitAny ] > bundle.js
```
Note that when using the Browserify CLI, compilation will always halt on the first error encountered, unlike the regular TypeScript CLI. This behavior can be overridden in the API, as shown in the API example.
Also note that the square brackets `[ ]` in the example above are *required* if you want to pass parameters to tsify; they don't denote an optional part of the command.
# Installation
Just plain ol' [npm](https://npmjs.org/) installation:
### 1. Install browserify
```sh
npm install browserify
```
### 2. Install typescript
``` sh
npm install typescript
```
### 3. Install tsify
``` sh
npm install tsify
```
For use on the command line, use the flag `npm install -g`.
# Options
* **tsify** will generate sourcemaps if the `--debug` option is set on Browserify.
* **tsify** supports almost all options from the TypeScript compiler. Notable exceptions:
* `-d, --declaration` - See [tsify#15](https://github.com/TypeStrong/tsify/issues/15)
* `--out, --outDir` - Use Browserify's file output options instead. These options are overridden because **tsify** writes to an internal memory store before bundling, instead of to the filesystem.
* **tsify** supports the TypeScript compiler's `-p, --project` option which allows you to specify the path that will be used when searching for the `tsconfig.json` file. You can pass either the path to a directory or to the `tsconfig.json` file itself. (When using the API, the `project` option can specify either a path to a directory or file, or the JSON content of a `tsconfig.json` file.)
* **tsify** supports overriding the `files`, `exclude` and `include` options. In particular, if `"files": []` is specified, only the Browserify entry points (and their dependencies) are passed to TypeScript for compilation.
* **tsify** supports the following extra options:
* `--global` - This will set up **tsify** as a global transform. See the [Browserify docs](https://github.com/substack/node-browserify#btransformtr-opts) for the implications of this flag.
* `--typescript` - By default we just do `require('typescript')` to pickup whichever version you installed. However, this option allows you to pass in a different TypeScript compiler, such as [NTypeScript](https://github.com/TypeStrong/ntypescript). Note that when using the API, you can pass either the name of the alternative compiler or a reference to it:
* `{ typescript: 'ntypescript' }`
* `{ typescript: require('ntypescript') }`
# Does this work with...
### tsconfig.json?
tsify will automatically read options from `tsconfig.json`. However, some options from this file will be ignored:
* `compilerOptions.declaration` - See [tsify#15](https://github.com/TypeStrong/tsify/issues/15)
* `compilerOptions.out`, `compilerOptions.outDir`, and `compilerOptions.noEmit` - Use Browserify's file output options instead. These options are overridden because **tsify** writes its intermediate JavaScript output to an internal memory store instead of to the filesystem.
* `files` - Use Browserify's file input options instead. This is necessary because Browserify needs to know which file(s) are the entry points to your program.
### Watchify?
Yes! **tsify** can do incremental compilation using [watchify](//github.com/substack/watchify), resulting in much faster incremental build times. Just follow the Watchify documentation, and add **tsify** as a plugin as indicated in the documentation above.
### Gulp?
No problem. See the Gulp recipes on using [browserify](https://github.com/gulpjs/gulp/blob/master/docs/recipes/browserify-uglify-sourcemap.md) and [watchify](https://github.com/gulpjs/gulp/blob/master/docs/recipes/fast-browserify-builds-with-watchify.md), and add **tsify** as a plugin as indicated in the documentation above.
### Grunt?
Use [grunt-browserify](https://github.com/jmreidy/grunt-browserify) and you should be good! Just add **tsify** as a plugin in your Grunt configuration.
### IE 11?
The inlined sourcemaps that Browserify generates [may not be readable by IE 11](//github.com/TypeStrong/tsify/issues/19) for debugging purposes. This is easy to fix by adding [exorcist](//github.com/thlorenz/exorcist) to your build workflow after Browserify.
### ES2015? *(formerly known as ES6)*
TypeScript's ES2015 output mode should work without too much additional setup. Browserify does not support ES2015 modules, so if you want to use ES2015 you still need some transpilation step. Make sure to add [babelify](//github.com/babel/babelify) to your list of transforms. Note that if you are using the API, you need to set up **tsify** before babelify:
``` js
browserify()
.plugin(tsify, { target: 'es6' })
.transform(babelify, { extensions: [ '.tsx', '.ts' ] })
```
# FAQ / Common issues
### SyntaxError: 'import' and 'export' may appear only with 'sourceType: module'
This error occurs when a TypeScript file is not compiled to JavaScript before being run through the Browserify bundler. There are a couple known reasons you might run into this.
* If you are trying to output in ES6 mode, then you have to use an additional transpilation step such as [babelify](//github.com/babel/babelify) because Browserify does not support bundling ES6 modules.
* Make sure that if you're using the API, your setup `.plugin('tsify')` is done *before* any transforms such as `.transform('babelify')`. **tsify** needs to run first!
* There is a known issue in Browserify regarding including files with `expose` set to the name of the included file. More details and a workaround are available in [#60](//github.com/TypeStrong/tsify/issues/60).
# Why a plugin?
There are several TypeScript compilation transforms available on npm, all with various issues. The TypeScript compiler automatically performs dependency resolution on module imports, much like Browserify itself. Browserify transforms are not flexible enough to deal with multiple file outputs given a single file input, which means that any working TypeScript compilation transform either skips the resolution step (which is necessary for complete type checking) or performs multiple compilations of source files further down the dependency graph.
**tsify** avoids this problem by using the power of plugins to perform a single compilation of the TypeScript source up-front, using Browserify to glue together the resulting files.
# License
MIT
# Changelog
* 5.0.2 - Remove `@types/browserify` and incorrect/undocumented use of TypeScript types in `tsify` signature.
* 5.0.1 - Remove default import from `index.d.ts` and add `@types/browserify` dependency.
* 5.0.0 - **Breaking**: Fix type declarations for TypeScript 4 compatibility. With this fix, the TypeScript version must be 2.8 or above.
* 4.0.2 - Add `types` to `package.json`.
* 4.0.1 - Fix so that `watchify` does not stop listening.
* 4.0.0 - Re-applied changes from 3.0.2: added support for the `forceConsistentCasingInFilenames` compiler option.
* 3.0.4 - Added support for overriding the `files`, `exclude` and `include` options.
* 3.0.3 - Reverted 3.0.2.
* 3.0.2 - Added support for the `forceConsistentCasingInFilenames` compiler option.
* 3.0.1 - Fixed an error with file system case sensitivity detection.
* 3.0.0 - **Breaking**: Dropped support for Browserify < 10.x. Re-instated changes from 2.0.4 to 2.0.7.
* 2.0.8 - Reverted to 2.0.3. Changes introduced from 2.0.4 to 2.0.7 have issues with early versions of Browserify.
* 2.0.7 - Tracked files for filtered stream and module-name 'rows'. Using `allowJs` no longer causes problems with streams.
* 2.0.6 - Filtered module-name 'rows', too, as filtering only source 'rows' re-broke Browserify's [require](https://github.com/substack/node-browserify#brequirefile-opts) option.
* 2.0.5 - The fix in 2.0.4 was too aggressive, as it filtered too many Browserify 'rows'. Now, only 'rows' from stream sources are filtered.
* 2.0.4 - Fixed a bug that broke Browserify's [require](https://github.com/substack/node-browserify#brequirefile-opts) option.
* 2.0.3 - Fixed a bug related to case-sensitive paths and normalized more path parameters.
* 2.0.2 - Added support for specifying the `project` option using the JSON content of a `tsconfig.json` file.
* 2.0.1 - Fixed a bug in which the `include` option was broken if `tsconfig.json` was not in the current directory.
* 2.0.0 - **Breaking**: updated to the latest `tsconfig`, so `filesGlob` is no longer supported. Use TypeScript 2's `exclude` and `include` options instead.
* 1.0.9 - Implemented additional compiler host methods to support the default inclusion of visible `@types` modules.
* 1.0.8 - Implemented file system case-sensitivity detection, fixing [#200](//github.com/TypeStrong/tsify/issues/200).
* 1.0.7 - Replaced `Object.assign` with [`object-assign`](https://github.com/sindresorhus/object-assign) for Node 0.12 compatibility.
* 1.0.6 - Fixed a bug in which TypeScript 2 libraries (specified using the `lib` option) were left out of the compilation when bundling on Windows.
* 1.0.5 - Fixed a bug where empty output resulted in an error.
* 1.0.4 - Fixed numerous bugs:
* Refactored to use canonical file names, fixing [#122](//github.com/TypeStrong/tsify/issues/122), [#135](//github.com/TypeStrong/tsify/issues/135), [#148](//github.com/TypeStrong/tsify/issues/148), [#150](//github.com/TypeStrong/tsify/issues/150) and [#161](//github.com/TypeStrong/tsify/issues/161).
* Refactored to avoid having to infer the TypeScript root, fixing [#152](//github.com/TypeStrong/tsify/issues/152).
* Misconfiguration of `tsify` as a transform now results in an explicit error.
* Internal errors that previously went unreported are now emitted to Browserify.
* 1.0.3 - Fixed a bug introduced in 1.0.2 (that resulted in the `target` being set to `ES3`).
* 1.0.2 - Added support for the TypeScript compiler's short-name, command-line options (e.g. `-p`).
* 1.0.1 - On Windows, sometimes, the Browserify `basedir` contains backslashes that need normalization for findConfigFile to work correctly.
* 1.0.0 - **Breaking**: TypeScript is now a `devDependency` so we don't install one for you. Please run `npm install typescript --save-dev` in your project to use whatever version you want.
* 0.16.0 - Reinstated changes from 0.15.5.
* 0.15.6 - Reverted 0.15.5 because of breaking changes.
* 0.15.5 - Used `TypeStrong/tsconfig` for parsing `tsconfig.json` to add support for `exclude` and more.
* 0.15.4 - Fixed some compilation failures introduced by v0.14.3.
* 0.15.3 - Added support for the `--global` flag to use **tsify** as a global transform.
* 0.15.2 - Added support for the `files` property of `tsconfig.json`.
* 0.15.1 - Added support for `--project` flag to use a custom location for `tsconfig.json`.
* 0.15.0 - Removed `debuglog` dependency.
* 0.14.8 - Reverted removal of `debuglog` dependency for compatibility with old versions of Node 0.12.
* 0.14.7 - Only generate sourcemap information in the compiler when `--debug` is set, for potential speed improvements when not using sourcemaps.
* 0.14.6 - Fixed output when `--jsx=preserve` is set.
* 0.14.5 - Removed `lodash` and `debuglog` dependencies.
* 0.14.4 - Fixed sourcemap paths when using Browserify's `basedir` option.
* 0.14.3 - Fixed `allowJs` option to enable transpiling ES6+ JS to ES5 or lower.
* 0.14.2 - Fixed `findConfigFile` for TypeScript 1.9 dev.
* 0.14.1 - Removed module mode override for ES6 mode (because CommonJS mode is now supported by TS 1.8).
* 0.14.0 - Updated to TypeScript 1.8 (thanks @joelday!)
* 0.13.2 - Fixed `findConfigFile` for use with the TypeScript 1.8 dev version.
* 0.13.1 - Fixed bug where `*.tsx` was not included in Browserify's list of extensions if the `jsx` option was set via `tsconfig.json`.
* 0.13.0 - Updated to TypeScript 1.7.
* 0.12.2 - Fixed resolution of entries outside of `process.cwd()` (thanks @pnlybubbles!)
* 0.12.1 - Updated `typescript` dependency to lock it down to version 1.6.x
* 0.12.0 - Updated to TypeScript 1.6.
* 0.11.16 - Updated `typescript` dependency to lock it down to version 1.5.x
* 0.11.15 - Added `*.tsx` to Browserify's list of extensions if `--jsx` is set (with priority *.ts > *.tsx > *.js).
* 0.11.14 - Override sourcemap settings with `--inlineSourceMap` and `--inlineSources` (because that's what Browserify expects).
* 0.11.13 - Fixed bug introduced in last change where non-entry point files were erroneously being excluded from the build.
* 0.11.12 - Fixed compilation when the current working directory is a symlink.
* 0.11.11 - Updated compiler host to support current TypeScript nightly.
* 0.11.10 - Updated resolution of `lib.d.ts` to support TypeScript 1.6 and to work with the `--typescript` option.
* 0.11.9 - Fixed dumb error.
* 0.11.8 - Handled JSX output from the TypeScript compiler to support `preserve`.
* 0.11.7 - Added `*.tsx` to the regex determining whether to run a file through the TypeScript compiler.
* 0.11.6 - Updated dependencies and devDependencies to latest.
* 0.11.5 - Fixed emit of `file` event to trigger watchify even when there are fatal compilation errors.
* 0.11.4 - Added `--typescript` option.
* 0.11.3 - Updated to TypeScript 1.5.
* 0.11.2 - Blacklisted `--out` and `--outDir` compiler options.
* 0.11.1 - Added `tsconfig.json` support.
* 0.11.0 - Altered behavior to pass through all compiler options to tsc by default.
* 0.10.2 - Fixed output of global error messages. Fixed code generation in ES6 mode.
* 0.10.1 - Fixed display of nested error messages, e.g. many typing errors.
* 0.10.0 - Added `stopOnError` option and changed default behavior to continue building when there are typing errors.
* 0.9.0 - Updated to use TypeScript from npm (thanks @hexaglow!)
* 0.8.2 - Updated peerDependency for Browserify to allow any version >= 6.x.
* 0.8.1 - Updated peerDependency for Browserify 9.x.
* 0.8.0 - Updated to TypeScript 1.4.1.
* 0.7.1 - Updated peerDependency for Browserify 8.x.
* 0.7.0 - Updated error handling for compatibility with Watchify.
* 0.6.5 - Updated peerDependency for Browserify 7.x.
* 0.6.4 - Included richer file position information in syntax error messages.
* 0.6.3 - Updated to TypeScript 1.3.
* 0.6.2 - Included empty *.d.ts compiled files in bundle for Karma compatibility.
* 0.6.1 - Fixed compilation cache miss when given absolute filenames.
* 0.6.0 - Updated to TypeScript 1.1.
* 0.5.2 - Bugfix for 0.5.1 for files not included with expose.
* 0.5.1 - Handled *.d.ts files passed as entries. Fix for files included with expose.
* 0.5.0 - Updated to Browserify 6.x.
* 0.4.1 - Added npmignore to clean up published package.
* 0.4.0 - Dropped Browserify 4.x support. Fixed race condition causing pathological performance with some usage patterns, e.g. when used with [karma-browserify](https://github.com/Nikku/karma-browserify).
* 0.3.1 - Supported adding files with `bundler.add()`.
* 0.3.0 - Added Browserify 5.x support.
* 0.2.1 - Fixed paths for sources in sourcemaps.
* 0.2.0 - Made Browserify prioritize *.ts files over *.js files in dependency resolution.
* 0.1.4 - Handled case where the entry point is not a TypeScript file.
* 0.1.3 - Automatically added *.ts to Browserify's list of file extensions to resolve.
* 0.1.2 - Added sourcemap support.
* 0.1.1 - Fixed issue where intermediate *.js files were being written to disk when using `watchify`.
* 0.1.0 - Initial version.

18
client/node_modules/tsify/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,18 @@
// Note that @types/browserify is not used for a reason:
// https://github.com/TypeStrong/tsify/issues/267
import * as typescript from "typescript";
export interface Options {
exclude?: string[];
files?: string[];
global?: boolean;
include?: string[];
m?: string;
p?: string | Record<string, any>;
project?: string | Record<string, any>;
t?: string;
typescript?: string | typeof typescript;
}
export default function tsify(b: any, opts: Options): any;

96
client/node_modules/tsify/index.js generated vendored Normal file
View File

@@ -0,0 +1,96 @@
'use strict';
var realpath = require('fs.realpath');
var log = require('util').debuglog(require('./package').name);
var through = require('through2');
var path = require('path');
function tsify(b, opts) {
if (typeof b === 'string') {
throw new Error('tsify appears to have been configured as a transform; it must be configured as a plugin.');
}
var ts = opts.typescript || require('typescript');
if (typeof ts === 'string' || ts instanceof String) {
ts = require(ts);
}
var Tsifier = require('./lib/Tsifier')(ts);
var tsifier = new Tsifier(opts, b._options);
tsifier.on('error', function (error) {
b.pipeline.emit('error', error);
});
tsifier.on('file', function (file, id) {
b.emit('file', file, id);
});
setupPipeline();
var transformOpts = {
global: opts.global
};
b.transform(tsifier.transform.bind(tsifier), transformOpts);
b.on('reset', function () {
setupPipeline();
});
function setupPipeline() {
if (tsifier.opts.jsx && b._extensions.indexOf('.tsx') === -1)
b._extensions.unshift('.tsx');
if (b._extensions.indexOf('.ts') === -1)
b._extensions.unshift('.ts');
b.pipeline.get('record').push(gatherEntryPoints());
}
function gatherEntryPoints() {
var rows = [];
return through.obj(transform, flush);
function transform(row, enc, next) {
rows.push(row);
next();
}
function flush(next) {
var self = this;
var ignoredFiles = [];
var entryFiles = rows
.map(function (row) {
var file = row.file || row.id;
if (file) {
if (row.source !== undefined) {
ignoredFiles.push(file);
} else if (row.basedir) {
return path.resolve(row.basedir, file);
} else if (path.isAbsolute(file)) {
return file;
} else {
ignoredFiles.push(file);
}
}
return null;
})
.filter(function (file) { return file; })
.map(function (file) { return realpath.realpathSync(file); });
if (entryFiles.length) {
log('Files from browserify entry points:');
entryFiles.forEach(function (file) { log(' %s', file); });
}
if (ignoredFiles.length) {
log('Ignored browserify entry points:');
ignoredFiles.forEach(function (file) { log(' %s', file); });
}
tsifier.reset();
tsifier.generateCache(entryFiles, ignoredFiles);
rows.forEach(function (row) { self.push(row); });
self.push(null);
next();
}
}
}
module.exports = tsify;

28
client/node_modules/tsify/lib/CompileError.js generated vendored Normal file
View File

@@ -0,0 +1,28 @@
'use strict';
var os = require('os');
module.exports = function (ts) {
function CompileError(diagnostic) {
SyntaxError.call(this);
this.message = '';
if (diagnostic.file) {
var loc = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
this.fileName = diagnostic.file.fileName;
this.line = loc.line + 1;
this.column = loc.character + 1;
this.message += this.fileName + '(' + this.line + ',' + this.column + '): ';
}
var category = ts.DiagnosticCategory[diagnostic.category];
this.name = 'TypeScript error';
this.message += category + ' TS' + diagnostic.code + ': ' +
ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL);
}
CompileError.prototype = Object.create(SyntaxError.prototype);
return CompileError;
};

294
client/node_modules/tsify/lib/Host.js generated vendored Normal file
View File

@@ -0,0 +1,294 @@
'use strict';
var events = require('events');
var fs = require('fs');
var realpath = require('fs.realpath');
var log = require('util').debuglog(require('../package').name);
var trace = require('util').debuglog(require('../package').name + '-trace');
var os = require('os');
var path = require('path');
var util = require('util');
var semver = require('semver');
module.exports = function (ts) {
var isCaseSensitiveFileSystem;
try {
fs.accessSync(path.join(__dirname, path.basename(__filename).toUpperCase()), fs.constants.R_OK);
isCaseSensitiveFileSystem = false;
} catch (error) {
trace('Case sensitive detection error: %s', error);
isCaseSensitiveFileSystem = true;
}
log('Detected case %s file system', isCaseSensitiveFileSystem ? 'sensitive' : 'insensitive');
function Host(currentDirectory, opts) {
this.isCaseSensitive = !!opts.forceConsistentCasingInFileNames || isCaseSensitiveFileSystem;
this.currentDirectory = this.getCanonicalFileName(path.resolve(currentDirectory));
this.outputDirectory = this.getCanonicalFileName(path.resolve(opts.outDir));
this.rootDirectory = this.getCanonicalFileName(path.resolve(opts.rootDir));
this.languageVersion = opts.target;
this.files = {};
this.previousFiles = {};
this.output = {};
this.version = 0;
this.error = false;
}
util.inherits(Host, events.EventEmitter);
Host.prototype._reset = function () {
this.previousFiles = this.files;
this.files = {};
this.output = {};
this.error = false;
++this.version;
log('Resetting (version %d)', this.version);
};
Host.prototype._addFile = function (filename, root) {
// Ensure that the relative file name is what's passed to
// 'createSourceFile', as that's the name that will be used in error
// messages, etc.
var relative = ts.normalizeSlashes(path.relative(
this.currentDirectory,
this.getCanonicalFileName(path.resolve(this.currentDirectory, filename))
));
var canonical = this._canonical(filename);
trace('Parsing %s', canonical);
var text;
try {
text = fs.readFileSync(filename, 'utf-8');
} catch (ex) {
return;
}
var file;
var current = this.files[canonical];
var previous = this.previousFiles[canonical];
var version;
if (current && current.contents === text) {
file = current.ts;
version = current.version;
trace('Reused current file %s (version %d)', canonical, version);
} else if (previous && previous.contents === text) {
file = previous.ts;
version = previous.version;
trace('Reused previous file %s (version %d)', canonical, version);
} else {
file = ts.createSourceFile(relative, text, this.languageVersion, true);
version = this.version;
trace('New version of source file %s (version %d)', canonical, version);
}
this.files[canonical] = {
filename: relative,
contents: text,
ts: file,
root: root,
version: version,
nodeModule: /\/node_modules\//i.test(canonical) && !/\.d\.ts$/i.test(canonical)
};
this.emit('file', canonical, relative);
return file;
};
Host.prototype.getSourceFile = function (filename) {
if (filename === '__lib.d.ts') {
return this.libDefault;
}
var canonical = this._canonical(filename);
if (this.files[canonical]) {
return this.files[canonical].ts;
}
return this._addFile(filename, false);
};
Host.prototype.getDefaultLibFileName = function () {
var libPath = path.dirname(ts.sys.getExecutingFilePath());
var libFile = ts.getDefaultLibFileName({ target: this.languageVersion });
return ts.normalizeSlashes(path.join(libPath, libFile));
};
Host.prototype.writeFile = function (filename, data) {
var outputCanonical = this._canonical(filename);
log('Cache write %s', outputCanonical);
this.output[outputCanonical] = data;
var sourceCanonical = this._inferSourceCanonical(outputCanonical);
var sourceFollowed = this._follow(path.dirname(sourceCanonical)) + '/' + path.basename(sourceCanonical);
if (sourceFollowed !== sourceCanonical) {
outputCanonical = this._inferOutputCanonical(sourceFollowed);
log('Cache write (followed) %s', outputCanonical);
this.output[outputCanonical] = data;
}
};
Host.prototype.getCurrentDirectory = function () {
return this.currentDirectory;
};
Host._getCanonicalFileName = function (filename) {
return ts.normalizeSlashes(isCaseSensitiveFileSystem ? filename : filename.toLowerCase());
}
Host.prototype.getCanonicalFileName = function (filename) {
return ts.normalizeSlashes(this.isCaseSensitive ? filename : filename.toLowerCase());
};
Host.prototype.useCaseSensitiveFileNames = function () {
return this.isCaseSensitive;
};
Host.prototype.getNewLine = function () {
return os.EOL;
};
Host.prototype.fileExists = function (filename) {
return ts.sys.fileExists(filename);
};
Host.prototype.readFile = function (filename) {
return ts.sys.readFile(filename);
};
Host.prototype.directoryExists = function (dirname) {
return ts.sys.directoryExists(dirname);
};
Host.prototype.getDirectories = function (dirname) {
return ts.sys.getDirectories(dirname);
};
Host.prototype.getEnvironmentVariable = function (name) {
return ts.sys.getEnvironmentVariable(name);
};
Host.prototype.realpath = function (name) {
return realpath.realpathSync(name);
};
Host.prototype.trace = function (message) {
ts.sys.write(message + this.getNewLine());
};
Host.prototype._rootFilenames = function () {
var rootFilenames = [];
for (var filename in this.files) {
if (!Object.hasOwnProperty.call(this.files, filename)) continue;
if (!this.files[filename].root) continue;
rootFilenames.push(filename);
}
return rootFilenames;
}
Host.prototype._nodeModuleFilenames = function () {
var nodeModuleFilenames = [];
for (var filename in this.files) {
if (!Object.hasOwnProperty.call(this.files, filename)) continue;
if (!this.files[filename].nodeModule) continue;
nodeModuleFilenames.push(filename);
}
return nodeModuleFilenames;
}
Host.prototype._compile = function (opts) {
var rootFilenames = this._rootFilenames();
var nodeModuleFilenames = [];
log('Compiling files:');
rootFilenames.forEach(function (file) { log(' %s', file); });
if (semver.gte(ts.version, '2.0.0')) {
ts.createProgram(rootFilenames, opts, this);
nodeModuleFilenames = this._nodeModuleFilenames();
log(' + %d file(s) found in node_modules', nodeModuleFilenames.length);
}
return ts.createProgram(rootFilenames.concat(nodeModuleFilenames), opts, this);
}
Host.prototype._output = function (filename) {
var outputCanonical = this._inferOutputCanonical(filename);
log('Cache read %s', outputCanonical);
var output = this.output[outputCanonical];
if (!output) {
log('Cache miss on %s', outputCanonical);
}
return output;
}
Host.prototype._canonical = function (filename) {
return this.getCanonicalFileName(path.resolve(
this.currentDirectory,
filename
));
}
Host.prototype._inferOutputCanonical = function (filename) {
var sourceCanonical = this._canonical(filename);
var outputRelative = path.relative(
this.rootDirectory,
sourceCanonical
);
var outputCanonical = this.getCanonicalFileName(path.resolve(
this.outputDirectory,
outputRelative
));
return outputCanonical;
}
Host.prototype._inferSourceCanonical = function (filename) {
var outputCanonical = this._canonical(filename);
var outputRelative = path.relative(
this.outputDirectory,
outputCanonical
);
var sourceCanonical = this.getCanonicalFileName(path.resolve(
this.rootDirectory,
outputRelative
));
return sourceCanonical;
}
Host.prototype._follow = function (filename) {
filename = this._canonical(filename);
var basename;
var parts = [];
do {
var stats = fs.lstatSync(filename);
if (stats.isSymbolicLink()) {
filename = realpath.realpathSync(filename);
} else {
basename = path.basename(filename);
if (basename) {
parts.unshift(basename);
filename = path.dirname(filename);
}
}
} while (basename);
return ts.normalizeSlashes(filename + parts.join('/'));
};
return Host;
};

344
client/node_modules/tsify/lib/Tsifier.js generated vendored Normal file
View File

@@ -0,0 +1,344 @@
'use strict';
var convert = require('convert-source-map');
var events = require('events');
var extend = require('util')._extend;
var fs = require('fs');
var realpath = require('fs.realpath');
var log = require('util').debuglog(require('../package').name);
var trace = require('util').debuglog(require('../package').name + '-trace');
var path = require('path');
var through = require('through2');
var time = require('./time');
var tsconfig = require('tsconfig');
var util = require('util');
var assign = require('object-assign');
module.exports = function (ts) {
var CompileError = require('./CompileError')(ts);
var Host = require('./Host')(ts);
var currentDirectory = ts.normalizeSlashes(realpath.realpathSync(process.cwd()));
var parseJsonConfigFileContent = ts.parseJsonConfigFileContent || ts.parseConfigFile;
function isTypescript(file) {
return (/\.tsx?$/i).test(file);
}
function isTsx(file) {
return (/\.tsx$/i).test(file);
}
function isJavascript(file) {
return (/\.jsx?$/i).test(file);
}
function isTypescriptDeclaration(file) {
return (/\.d\.ts$/i).test(file);
}
function replaceFileExtension(file, extension) {
return file.replace(/\.\w+$/i, extension);
}
function fileExists(file) {
try {
var stats = fs.lstatSync(file);
return stats.isFile();
} catch (e) {
return false;
}
}
function parseOptions(opts, bopts) {
// Expand any short-name, command-line options
var expanded = {};
if (opts.m) { expanded.module = opts.m; }
if (opts.p) { expanded.project = opts.p; }
if (opts.t) { expanded.target = opts.t; }
opts = assign(expanded, opts);
var config;
var configFile;
if (typeof opts.project === "object"){
log('Using inline tsconfig');
config = JSON.parse(JSON.stringify(opts.project));
config.compilerOptions = config.compilerOptions || {};
extend(config.compilerOptions, opts);
} else {
if (fileExists(opts.project)) {
configFile = opts.project;
} else {
configFile = ts.findConfigFile(
ts.normalizeSlashes(opts.project || bopts.basedir || currentDirectory),
fileExists
);
}
if (configFile) {
log('Using tsconfig file at %s', configFile);
config = tsconfig.readFileSync(configFile);
config.compilerOptions = config.compilerOptions || {};
extend(config.compilerOptions, opts);
} else {
config = {
files: [],
compilerOptions: opts
};
}
}
// Note that subarg parses command line arrays in its own peculiar way:
// https://github.com/substack/subarg
if (opts.exclude) {
config.exclude = opts.exclude._ || opts.exclude;
}
if (opts.files) {
config.files = opts.files._ || opts.files;
}
if (opts.include) {
config.include = opts.include._ || opts.include;
}
var parsed = parseJsonConfigFileContent(
config,
ts.sys,
configFile ? ts.normalizeSlashes(path.resolve(path.dirname(configFile))) : currentDirectory,
null,
configFile ? ts.normalizeSlashes(path.resolve(configFile)) : undefined
);
// Generate inline sourcemaps if Browserify's --debug option is set
parsed.options.sourceMap = false;
parsed.options.inlineSourceMap = bopts.debug;
parsed.options.inlineSources = bopts.debug;
// Default to CommonJS module mode
parsed.options.module = parsed.options.module || ts.ModuleKind.CommonJS;
// Blacklist --out/--outFile/--noEmit; these should definitely not be set, since we are doing
// concatenation with Browserify instead
delete parsed.options.out;
delete parsed.options.outFile;
delete parsed.options.noEmit;
// Set rootDir and outDir so we know exactly where the TS compiler will be trying to
// write files; the filenames will end up being the keys into our in-memory store.
// The output directory needs to be distinct from the input directory to prevent the TS
// compiler from thinking that it might accidentally overwrite source files, which would
// prevent it from outputting e.g. the results of transpiling ES6 JS files with --allowJs.
parsed.options.rootDir = path.relative('.', '/');
parsed.options.outDir = ts.normalizeSlashes(path.resolve('/__tsify__'));
log('Files from tsconfig parse:');
parsed.fileNames.forEach(function (filename) { log(' %s', filename); });
var result = {
options: parsed.options,
fileNames: parsed.fileNames
};
return result;
}
function Tsifier(opts, bopts) {
var self = this;
var parsedOptions = parseOptions(opts, bopts);
self.opts = parsedOptions.options;
self.files = parsedOptions.fileNames;
self.ignoredFiles = [];
self.bopts = bopts;
self.host = new Host(currentDirectory, self.opts);
self.host.on('file', function (file, id) {
self.emit('file', file, id);
});
}
util.inherits(Tsifier, events.EventEmitter);
Tsifier.prototype.reset = function () {
var self = this;
self.ignoredFiles = [];
self.host._reset();
self.addFiles(self.files);
};
Tsifier.prototype.generateCache = function (files, ignoredFiles) {
if (ignoredFiles) {
this.ignoredFiles = ignoredFiles;
}
this.addFiles(files);
this.compile();
};
Tsifier.prototype.addFiles = function (files) {
var self = this;
files.forEach(function (file) {
self.host._addFile(file, true);
});
};
Tsifier.prototype.compile = function () {
var self = this;
var createProgram_t0 = time.start();
var program = self.host._compile(self.opts);
time.stop(createProgram_t0, 'createProgram');
var syntaxDiagnostics = self.checkSyntax(program);
if (syntaxDiagnostics.length) {
log('Compilation encountered fatal syntax errors');
return;
}
var semanticDiagnostics = self.checkSemantics(program);
if (semanticDiagnostics.length && self.opts.noEmitOnError) {
log('Compilation encountered fatal semantic errors');
return;
}
var emit_t0 = time.start();
var emitOutput = program.emit();
time.stop(emit_t0, 'emit program');
var emittedDiagnostics = self.checkEmittedOutput(emitOutput);
if (emittedDiagnostics.length && self.opts.noEmitOnError) {
log('Compilation encountered fatal errors during emit');
return;
}
log('Compilation completed without errors');
};
Tsifier.prototype.checkSyntax = function (program) {
var self = this;
var syntaxCheck_t0 = time.start();
var syntaxDiagnostics = program.getSyntacticDiagnostics();
time.stop(syntaxCheck_t0, 'syntax checking');
syntaxDiagnostics.forEach(function (error) {
self.emit('error', new CompileError(error));
});
if (syntaxDiagnostics.length) {
self.host.error = true;
}
return syntaxDiagnostics;
};
Tsifier.prototype.checkSemantics = function (program) {
var self = this;
var semanticDiagnostics_t0 = time.start();
var semanticDiagnostics = program.getGlobalDiagnostics();
if (semanticDiagnostics.length === 0) {
semanticDiagnostics = program.getSemanticDiagnostics();
}
time.stop(semanticDiagnostics_t0, 'semantic checking');
semanticDiagnostics.forEach(function (error) {
self.emit('error', new CompileError(error));
});
if (semanticDiagnostics.length && self.opts.noEmitOnError) {
self.host.error = true;
}
return semanticDiagnostics;
};
Tsifier.prototype.checkEmittedOutput = function (emitOutput) {
var self = this;
var emittedDiagnostics = emitOutput.diagnostics;
emittedDiagnostics.forEach(function (error) {
self.emit('error', new CompileError(error));
});
if (emittedDiagnostics.length && self.opts.noEmitOnError) {
self.host.error = true;
}
return emittedDiagnostics;
};
Tsifier.prototype.transform = function (file) {
var self = this;
trace('Transforming %s', file);
if (self.ignoredFiles.indexOf(file) !== -1) {
return through();
}
if (isTypescriptDeclaration(file)) {
return through(transform);
}
if (isTypescript(file) || (isJavascript(file) && self.opts.allowJs)) {
return through(transform, flush);
}
return through();
function transform(chunk, enc, next) {
next();
}
function flush(next) {
if (self.host.error) {
next();
return;
}
var compiled = self.getCompiledFile(file);
if (compiled) {
this.push(compiled);
}
this.push(null);
next();
}
};
Tsifier.prototype.getCompiledFile = function (inputFile, alreadyMissedCache) {
var self = this;
var outputExtension = (ts.JsxEmit && self.opts.jsx === ts.JsxEmit.Preserve && isTsx(inputFile)) ? '.jsx' : '.js';
var output = self.host._output(replaceFileExtension(inputFile, outputExtension));
if (output === undefined) {
if (alreadyMissedCache) {
self.emit('error', new Error('tsify: no compiled file for ' + inputFile));
return;
}
self.generateCache([inputFile]);
if (self.host.error)
return;
return self.getCompiledFile(inputFile, true);
}
if (self.opts.inlineSourceMap) {
output = self.setSourcePathInSourcemap(output, inputFile);
}
return output;
};
Tsifier.prototype.setSourcePathInSourcemap = function (output, inputFile) {
var self = this;
var normalized = ts.normalizePath(path.relative(
self.bopts.basedir || currentDirectory,
inputFile
));
var sourcemap = convert.fromComment(output);
sourcemap.setProperty('sources', [normalized]);
return output.replace(convert.commentRegex, sourcemap.toComment());
}
var result = Tsifier;
result.isTypescript = isTypescript;
result.isTypescriptDeclaration = isTypescriptDeclaration;
return result;
};

13
client/node_modules/tsify/lib/time.js generated vendored Normal file
View File

@@ -0,0 +1,13 @@
'use strict';
var log = require('util').debuglog(require('../package').name);
function start() {
return process.hrtime();
}
function stop(t0, message) {
var tDiff = process.hrtime(t0);
log('%d sec -- %s', (tDiff[0] + (tDiff[1] / 1000000000)).toFixed(4), message);
}
module.exports = { start: start, stop: stop };

58
client/node_modules/tsify/package.json generated vendored Normal file
View File

@@ -0,0 +1,58 @@
{
"name": "tsify",
"version": "5.0.2",
"description": "Browserify plugin for compiling Typescript",
"main": "index.js",
"types": "index.d.ts",
"scripts": {
"lint": "eslint .",
"test-latest": "node test/test.js",
"test": "tav"
},
"repository": {
"type": "git",
"url": "git://github.com/TypeStrong/tsify"
},
"keywords": [
"browserify",
"browserify-plugin",
"typescript"
],
"author": "Greg Smith",
"license": "MIT",
"bugs": {
"url": "https://github.com/TypeStrong/tsify/issues"
},
"homepage": "https://github.com/TypeStrong/tsify",
"engines": {
"node": ">=0.12"
},
"dependencies": {
"convert-source-map": "^1.1.0",
"fs.realpath": "^1.0.0",
"object-assign": "^4.1.0",
"semver": "^6.1.0",
"through2": "^2.0.0",
"tsconfig": "^5.0.3"
},
"devDependencies": {
"babel-core": "^6.26.3",
"babel-preset-react": "^6.5.0",
"babelify": "^8.0.0",
"browserify": "^16.2.3",
"eslint": "^4.6.1",
"event-stream": "^3.3.1",
"fs-extra": "^5.0.0",
"node-foo": "^0.2.3",
"source-map": "^0.5.3",
"string-to-stream": "^1.1.1",
"tape": "^4.10.1",
"test-all-versions": "^3.3.3",
"typescript": "~2.0.3",
"watchify": "^3.11.1"
},
"peerDependencies": {
"browserify": ">= 10.x",
"typescript": ">= 2.8"
}
}