2016-11-22 12:10:23 -05:00
|
|
|
/**
|
|
|
|
* @license
|
2020-05-19 15:08:49 -04:00
|
|
|
* Copyright Google LLC All Rights Reserved.
|
2016-11-22 12:10:23 -05:00
|
|
|
*
|
|
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
|
|
* found in the LICENSE file at https://angular.io/license
|
|
|
|
*/
|
|
|
|
|
2021-02-23 13:51:23 -05:00
|
|
|
import * as ts from 'typescript/lib/tsserverlibrary';
|
2021-03-02 18:46:11 -05:00
|
|
|
import {NgLanguageService, PluginConfig} from './api';
|
2021-02-23 13:51:23 -05:00
|
|
|
|
|
|
|
interface PluginModule extends ts.server.PluginModule {
|
|
|
|
create(createInfo: ts.server.PluginCreateInfo): NgLanguageService;
|
2021-03-02 18:46:11 -05:00
|
|
|
onConfigurationChanged?(config: PluginConfig): void;
|
2021-02-23 13:51:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
const factory: ts.server.PluginModuleFactory = (tsModule): PluginModule => {
|
|
|
|
let plugin: PluginModule;
|
|
|
|
|
|
|
|
return {
|
|
|
|
create(info: ts.server.PluginCreateInfo): NgLanguageService {
|
2021-03-02 18:46:11 -05:00
|
|
|
const config: PluginConfig = info.config;
|
2021-02-23 13:51:23 -05:00
|
|
|
const bundleName = config.ivy ? 'ivy.js' : 'language-service.js';
|
|
|
|
plugin = require(`./bundles/${bundleName}`)(tsModule);
|
|
|
|
return plugin.create(info);
|
|
|
|
},
|
|
|
|
getExternalFiles(project: ts.server.Project): string[] {
|
|
|
|
return plugin?.getExternalFiles?.(project) ?? [];
|
|
|
|
},
|
2021-03-02 18:46:11 -05:00
|
|
|
onConfigurationChanged(config: PluginConfig): void {
|
2021-02-23 13:51:23 -05:00
|
|
|
plugin?.onConfigurationChanged?.(config);
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
build(language-service): use 'export =' syntax for default export (#41165)
Tsserver expects `@angular/language-service` to provide a factory function
as the default export (commonjs-style) of the package.
The current implementation side steps TypeScript's import syntax by using
`module.exports = factory`.
This allows the code to incorrectly re-export other symbols:
```ts
export * from './api';
```
which transpiles to:
```js
var tslib_1 = require("tslib");
tslib_1.__exportStar(require("@angular/language-service/api"), exports);
```
Doing this meant that the package now has a runtime dependency on `tslib`,
which is totally unnecessary.
With the proper `export =` syntax, `tslib` is removed, and no other exports
are allowed.
Output:
```js
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define("@angular/language-service", ["require", "exports"], factory);
}
})(function (require, exports) {
"use strict";
return function factory(tsModule) {
var plugin;
return {
create: function (info) {
var config = info.config;
var bundleName = config.ivy ? 'ivy.js' : 'language-service.js';
plugin = require("./bundles/" + bundleName)(tsModule);
return plugin.create(info);
},
getExternalFiles: function (project) {
var _a, _b;
return (_b = (_a = plugin === null || plugin === void 0 ? void 0 : plugin.getExternalFiles) === null || _a === void 0 ? void 0 : _a.call(plugin, project)) !== null && _b !== void 0 ? _b : [];
},
onConfigurationChanged: function (config) {
var _a;
(_a = plugin === null || plugin === void 0 ? void 0 : plugin.onConfigurationChanged) === null || _a === void 0 ? void 0 : _a.call(plugin, config);
},
};
};
});
```
PR Close #41165
2021-03-10 19:06:09 -05:00
|
|
|
/**
|
|
|
|
* Tsserver expects `@angular/language-service` to provide a factory function
|
|
|
|
* as the default export of the package. See
|
|
|
|
* https://github.com/microsoft/TypeScript/blob/f4d0ea6539edb6d8f70b626132d6f9ac1ac4281a/src/server/project.ts#L1611
|
|
|
|
*/
|
|
|
|
export = factory;
|