diff --git a/package-lock.json b/package-lock.json index db3795b..b603b7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "typescript-hero", - "version": "1.1.0", + "version": "0.0.0-development", "lockfileVersion": 1, "dependencies": { "@semantic-release/commit-analyzer": { diff --git a/package.json b/package.json index 60fd777..b3326db 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "lint": "tslint -c tslint.json --project ./config/tsconfig.build.json", "build": "del-cli ./out && tsc -p ./config/tsconfig.build.json", "package": "npm run build && del-cli './*.vsix' && vsce package", - "semantic-release": "semantic-release pre && vsce package && vsce publish -p $VSCE_TOKEN && semantic-release post" + "semantic-release": "semantic-release pre && vsce package && vsce publish -p $VSCE_TOKEN && npm install semantic-release && semantic-release post" }, "devDependencies": { "@types/chai": "^4.0.1", diff --git a/prepare-release.js b/prepare-release.js deleted file mode 100755 index 3775302..0000000 --- a/prepare-release.js +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'), - exec = require('child_process').execSync; - -if (!process.argv || process.argv.length < 3) { - throw new Error('missing argument (ver nr)'); -} - -const versionNumber = process.argv[2]; - -console.log('Create release branch'); - -exec(`git checkout -b release/${versionNumber}`); - -console.log(`Update changelog`); - -let changelog = fs.readFileSync('./CHANGELOG.md', 'utf-8'); -changelog = changelog.replace(/## \[Unreleased\]/, `## [Unreleased]\n\n## [${versionNumber}]`); -changelog = changelog.replace(/\[Unreleased\]\:.*v(.*)\.\.\.master/, `[Unreleased]: https://github.com/buehler/typescript-hero/compare/v${versionNumber}...master -[${versionNumber}]: https://github.com/buehler/typescript-hero/compare/v$1...v${versionNumber}`); - -fs.writeFileSync('./CHANGELOG.md', changelog, { encoding: 'utf-8' }); - -console.log('Commit changelog'); - -exec('git add CHANGELOG.md'); -exec(`git commit -m "Update changelog to v${versionNumber}"`); - -console.log('Update package.json version'); - -exec(`npm --no-git-tag-version version ${versionNumber}`); -exec('git add package.json'); -exec('git add package-lock.json'); -exec(`git commit -m "Update package.json to v${versionNumber}"`); diff --git a/src/extension/IoC.ts b/src/extension/IoC.ts index a46ec5f..1311775 100644 --- a/src/extension/IoC.ts +++ b/src/extension/IoC.ts @@ -18,13 +18,14 @@ import { VscodeExtensionConfig } from './VscodeExtensionConfig'; const container = new IoCContainer(); +container.bind(iocSymbols.rootPath).toConstantValue(workspace.rootPath || ''); container.bind(TypeScriptHero).to(TypeScriptHero).inSingletonScope(); container.bind(iocSymbols.configuration).to(VscodeExtensionConfig).inSingletonScope(); container .bind(iocSymbols.declarationIndex) .toDynamicValue((context: interfaces.Context) => { const parser = context.container.get(iocSymbols.typescriptParser); - return new DeclarationIndex(parser, workspace.rootPath || ''); + return new DeclarationIndex(parser, context.container.get(iocSymbols.rootPath)); }) .inSingletonScope(); diff --git a/src/extension/IoCSymbols.ts b/src/extension/IoCSymbols.ts index 3b630d8..193dcec 100644 --- a/src/extension/IoCSymbols.ts +++ b/src/extension/IoCSymbols.ts @@ -10,4 +10,5 @@ export const iocSymbols = { codeActionCreators: Symbol('codeActionCreators'), declarationIndex: Symbol('declarationIndex'), typescriptParser: Symbol('typescriptParser'), + rootPath: Symbol('rootPath'), }; diff --git a/src/extension/code-actions/MissingImplementationInClassCreator.ts b/src/extension/code-actions/MissingImplementationInClassCreator.ts index 123f0e5..f0e1a3b 100644 --- a/src/extension/code-actions/MissingImplementationInClassCreator.ts +++ b/src/extension/code-actions/MissingImplementationInClassCreator.ts @@ -6,7 +6,7 @@ import { NamedImport, TypescriptParser, } from 'typescript-parser'; -import { Command, Diagnostic, TextDocument, workspace } from 'vscode'; +import { Command, Diagnostic, TextDocument } from 'vscode'; import { getAbsolutLibraryName } from '../../common/helpers'; import { iocSymbols } from '../IoCSymbols'; @@ -25,6 +25,7 @@ export class MissingImplementationInClassCreator extends CodeActionCreator { constructor( @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, @inject(iocSymbols.declarationIndex) private index: DeclarationIndex, + @inject(iocSymbols.rootPath) private rootPath: string, ) { super(); } @@ -77,7 +78,7 @@ export class MissingImplementationInClassCreator extends CodeActionCreator { const declaration = (parsedDocument.declarations.find(o => o.name === specifier) || (this.index.declarationInfos.find( o => o.declaration.name === specifier && - o.from === getAbsolutLibraryName(alreadyImported!.libraryName, document.fileName, workspace.rootPath), + o.from === getAbsolutLibraryName(alreadyImported!.libraryName, document.fileName, this.rootPath), ) || { declaration: undefined }).declaration) as (ClassLikeDeclaration & GenericDeclaration) | undefined; if (commands.some((o: Command) => o.title.indexOf(specifier) >= 0)) { diff --git a/src/extension/extensions/CodeCompletionExtension.ts b/src/extension/extensions/CodeCompletionExtension.ts index 70ea9e3..e1d874f 100644 --- a/src/extension/extensions/CodeCompletionExtension.ts +++ b/src/extension/extensions/CodeCompletionExtension.ts @@ -8,7 +8,6 @@ import { languages, Position, TextDocument, - workspace, } from 'vscode'; import { getDeclarationsFilteredByImports } from '../../common/helpers'; @@ -35,6 +34,7 @@ export class CodeCompletionExtension extends BaseExtension implements Completion @inject(iocSymbols.loggerFactory) loggerFactory: LoggerFactory, @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, @inject(iocSymbols.declarationIndex) private index: DeclarationIndex, + @inject(iocSymbols.rootPath) private rootPath: string, ) { super(context); this.logger = loggerFactory('CodeCompletionExtension'); @@ -109,7 +109,7 @@ export class CodeCompletionExtension extends BaseExtension implements Completion this.index.declarationInfos, document.fileName, parsed.imports, - workspace.rootPath, + this.rootPath, ) .filter(o => !parsed.declarations.some(d => d.name === o.declaration.name)) .filter(o => !parsed.usages.some(d => d === o.declaration.name)); diff --git a/src/extension/extensions/ImportResolveExtension.ts b/src/extension/extensions/ImportResolveExtension.ts index fce63f0..7ce02e7 100644 --- a/src/extension/extensions/ImportResolveExtension.ts +++ b/src/extension/extensions/ImportResolveExtension.ts @@ -55,7 +55,7 @@ function compareIgnorePatterns(local: string[], config: string[]): boolean { * @param {ExtensionConfig} config * @returns {Promise} */ -export async function findFiles(config: ExtensionConfig): Promise { +export async function findFiles(config: ExtensionConfig, rootPath: string): Promise { const searches: PromiseLike[] = [ workspace.findFiles( '{**/*.ts,**/*.tsx}', @@ -66,8 +66,8 @@ export async function findFiles(config: ExtensionConfig): Promise { let globs: string[] = []; let ignores = ['**/typings/**']; - if (workspace.rootPath && existsSync(join(workspace.rootPath, 'package.json'))) { - const packageJson = require(join(workspace.rootPath, 'package.json')); + if (rootPath && existsSync(join(rootPath, 'package.json'))) { + const packageJson = require(join(rootPath, 'package.json')); if (packageJson['dependencies']) { globs = globs.concat( Object.keys(packageJson['dependencies']).map(o => `**/node_modules/${o}/**/*.d.ts`), @@ -101,7 +101,7 @@ export async function findFiles(config: ExtensionConfig): Promise { uris = uris.map((o, idx) => idx === 0 ? o.filter( f => f.fsPath - .replace(workspace.rootPath || '', '') + .replace(rootPath || '', '') .split(/\\|\//) .every(p => excludePatterns.indexOf(p) < 0)) : o, @@ -136,6 +136,7 @@ export class ImportResolveExtension extends BaseExtension { @inject(iocSymbols.configuration) private config: ExtensionConfig, @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, @inject(iocSymbols.declarationIndex) private index: DeclarationIndex, + @inject(iocSymbols.rootPath) private rootPath: string, ) { super(context); this.logger = loggerFactory('ImportResolveExtension'); @@ -222,7 +223,7 @@ export class ImportResolveExtension extends BaseExtension { private async buildIndex(): Promise { this.statusBarItem.text = resolverSyncing; - const files = await findFiles(this.config); + const files = await findFiles(this.config, this.rootPath); this.logger.info(`Building index for ${files.length} files.`); try { await this.index.buildIndex(files); @@ -457,7 +458,7 @@ export class ImportResolveExtension extends BaseExtension { this.index.declarationInfos, documentPath, parsedSource.imports, - workspace.rootPath, + this.rootPath, ).filter(o => o.declaration.name.startsWith(cursorSymbol)); return [ @@ -486,7 +487,7 @@ export class ImportResolveExtension extends BaseExtension { this.index.declarationInfos, documentPath, parsedDocument.imports, - workspace.rootPath, + this.rootPath, ); for (const usage of parsedDocument.nonLocalUsages) { diff --git a/src/extension/managers/ImportManager.ts b/src/extension/managers/ImportManager.ts index acbb546..1b507c7 100644 --- a/src/extension/managers/ImportManager.ts +++ b/src/extension/managers/ImportManager.ts @@ -53,6 +53,10 @@ export class ImportManager implements ObjectManager { return Container.get<() => TypescriptCodeGenerator>(iocSymbols.generatorFactory)(); } + private static get rootPath(): string { + return Container.get(iocSymbols.rootPath); + } + private importGroups: ImportGroup[]; private imports: Import[] = []; private userImportDecisions: { [usage: string]: DeclarationInfo[] }[] = []; @@ -122,7 +126,7 @@ export class ImportManager implements ObjectManager { o => declarationInfo.from === getAbsolutLibraryName( o.libraryName, this.document.fileName, - workspace.rootPath, + ImportManager.rootPath, ) && o instanceof ImportProxy, ) as ImportProxy; @@ -145,14 +149,14 @@ export class ImportManager implements ObjectManager { imp = new ImportProxy(getRelativeLibraryName( declarationInfo.from, this.document.fileName, - workspace.rootPath, + ImportManager.rootPath, )); (imp as ImportProxy).defaultPurposal = declarationInfo.declaration.name; } else { imp = new ImportProxy(getRelativeLibraryName( declarationInfo.from, this.document.fileName, - workspace.rootPath, + ImportManager.rootPath, )); (imp as ImportProxy).specifiers.push(new SymbolSpecifier(declarationInfo.declaration.name)); } @@ -177,7 +181,7 @@ export class ImportManager implements ObjectManager { index.declarationInfos, this.document.fileName, this.imports, - workspace.rootPath, + ImportManager.rootPath, ); for (const usage of this._parsedDocument.nonLocalUsages) { diff --git a/test/extension/extensions/CodeActionExtension.test.ts b/test/extension/extensions/CodeActionExtension.test.ts index da7f914..6c9b50b 100644 --- a/test/extension/extensions/CodeActionExtension.test.ts +++ b/test/extension/extensions/CodeActionExtension.test.ts @@ -28,6 +28,7 @@ class SpyCodeAction implements CodeAction { describe('CodeActionExtension', () => { let extension: any; + const rootPath = Container.get(iocSymbols.rootPath); before(async () => { const ctx = Container.get(iocSymbols.extensionContext); @@ -38,19 +39,19 @@ describe('CodeActionExtension', () => { await index.buildIndex( [ join( - workspace.rootPath!, + rootPath, 'server/indices/MyClass.ts', ), join( - workspace.rootPath!, + rootPath, 'extension/extensions/codeActionExtension/exportedObjects.ts', ), join( - workspace.rootPath!, + rootPath, 'extension/extensions/codeActionExtension/implementInterfaceOrAbstract.ts', ), join( - workspace.rootPath!, + rootPath, 'node_modules/fancy-library/FancierLibraryClass.d.ts', ), ], @@ -58,7 +59,7 @@ describe('CodeActionExtension', () => { const creators = [ new MissingImportCreator(index as any), - new MissingImplementationInClassCreator(parser, index as any), + new MissingImplementationInClassCreator(parser, index as any, rootPath), ]; extension = new CodeActionExtension(ctx, logger, creators, index as any); @@ -67,7 +68,7 @@ describe('CodeActionExtension', () => { describe('executeCodeAction', () => { const file = join( - workspace.rootPath!, + rootPath, 'extension/extensions/codeActionExtension/empty.ts', ); let document: TextDocument; @@ -110,7 +111,7 @@ describe('CodeActionExtension', () => { describe('missingImport', () => { const file = join( - workspace.rootPath!, + rootPath, 'extension/extensions/codeActionExtension/empty.ts', ); let document: TextDocument; @@ -143,7 +144,7 @@ describe('CodeActionExtension', () => { }); describe('missingPolymorphicElements', () => { - const file = join(workspace.rootPath!, 'extension/extensions/codeActionExtension/implementInterfaceOrAbstract.ts'); + const file = join(rootPath, 'extension/extensions/codeActionExtension/implementInterfaceOrAbstract.ts'); let document: TextDocument; let documentText: string; @@ -428,7 +429,7 @@ describe('CodeActionExtension', () => { describe('provideCodeActions', () => { const file = join( - workspace.rootPath!, + rootPath, 'extension/extensions/codeActionExtension/empty.ts', ); let document: TextDocument; diff --git a/test/extension/extensions/CodeCompletionExtension.test.ts b/test/extension/extensions/CodeCompletionExtension.test.ts index f3eb5b0..b83f18f 100644 --- a/test/extension/extensions/CodeCompletionExtension.test.ts +++ b/test/extension/extensions/CodeCompletionExtension.test.ts @@ -17,8 +17,10 @@ describe('CodeCompletionExtension', () => { let extension: CodeCompletionExtension; before(async () => { + const rootPath = Container.get(iocSymbols.rootPath); + const file = join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/codeCompletionExtension/codeCompletionFile.ts', ); document = await vscode.workspace.openTextDocument(file); @@ -32,17 +34,17 @@ describe('CodeCompletionExtension', () => { await index.buildIndex( [ join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/codeCompletionExtension/codeCompletionImports.ts', ), join( - vscode.workspace.rootPath!, + rootPath, 'server/indices/MyClass.ts', ), ], ); - extension = new CodeCompletionExtension(ctx, logger, parser, index as any); + extension = new CodeCompletionExtension(ctx, logger, parser, index as any, rootPath); }); it('shoud resolve to null if typing in a string', async () => { diff --git a/test/extension/extensions/DocumentSymbolStructureExtension.test.ts b/test/extension/extensions/DocumentSymbolStructureExtension.test.ts index e4713a3..44e0c47 100644 --- a/test/extension/extensions/DocumentSymbolStructureExtension.test.ts +++ b/test/extension/extensions/DocumentSymbolStructureExtension.test.ts @@ -25,8 +25,9 @@ describe('DocumentSymbolStructureExtension', () => { let document: vscode.TextDocument; before(async () => { + const rootPath = Container.get(iocSymbols.rootPath); const file = join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/documentSymbolStructureExtension/documentSymbolFile.ts', ); document = await vscode.workspace.openTextDocument(file); @@ -52,8 +53,9 @@ describe('DocumentSymbolStructureExtension', () => { }); it('should return a "file not parsable" if it is no ts file', async () => { + const rootPath = Container.get(iocSymbols.rootPath); const file = join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/documentSymbolStructureExtension/notParsable.txt', ); const txtDocument = await vscode.workspace.openTextDocument(file); diff --git a/test/extension/extensions/ImportResolveExtension.test.ts b/test/extension/extensions/ImportResolveExtension.test.ts index 12b73f4..97428da 100644 --- a/test/extension/extensions/ImportResolveExtension.test.ts +++ b/test/extension/extensions/ImportResolveExtension.test.ts @@ -13,11 +13,13 @@ chai.should(); describe('ImportResolveExtension', () => { + let rootPath: string; let extension: any; before(async () => { + rootPath = Container.get(iocSymbols.rootPath); const file = join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/importResolveExtension/addImportToDocument.ts', ); const document = await vscode.workspace.openTextDocument(file); @@ -33,31 +35,31 @@ describe('ImportResolveExtension', () => { await index.buildIndex( [ join( - vscode.workspace.rootPath!, + rootPath, 'typings/globals/body-parser/index.d.ts', ), join( - vscode.workspace.rootPath!, + rootPath, 'server/indices/MyClass.ts', ), join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/importResolveExtension/sub1/sub2/sub3/subFile.ts', ), join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/importResolveExtension/sameDirectory.ts', ), ], ); - extension = new ImportResolveExtension(ctx, logger, config, parser, index); + extension = new ImportResolveExtension(ctx, logger, config, parser, index, rootPath); }); describe('addImportToDocument', () => { - + const rootPath = Container.get(iocSymbols.rootPath); const file = join( - vscode.workspace.rootPath!, + rootPath, 'extension/extensions/importResolveExtension/addImportToDocument.ts', ); let document: vscode.TextDocument; @@ -141,7 +143,7 @@ describe('ImportResolveExtension', () => { describe('organizeImports', () => { - const file = join(vscode.workspace.rootPath!, 'extension/extensions/importResolveExtension/organizeImports.ts'); + const file = join(rootPath, 'extension/extensions/importResolveExtension/organizeImports.ts'); let document: vscode.TextDocument; let documentText: string; diff --git a/test/extension/import-grouping/KeywordImportGroup.test.ts b/test/extension/import-grouping/KeywordImportGroup.test.ts index 4347f91..65ed0c4 100644 --- a/test/extension/import-grouping/KeywordImportGroup.test.ts +++ b/test/extension/import-grouping/KeywordImportGroup.test.ts @@ -1,7 +1,6 @@ import * as chai from 'chai'; import { join } from 'path'; import { File, TypescriptCodeGenerator, TypescriptParser } from 'typescript-parser'; -import { workspace } from 'vscode'; import { ExtensionConfig } from '../../../src/common/config'; import { TypescriptCodeGeneratorFactory } from '../../../src/common/factories'; @@ -19,15 +18,16 @@ describe('KeywordImportGroup', () => { let generator: TypescriptCodeGenerator; before(async () => { + const rootPath = Container.get(iocSymbols.rootPath); const parser = Container.get(iocSymbols.typescriptParser); config = Container.get(iocSymbols.configuration); generator = Container.get(iocSymbols.generatorFactory)(); file = await parser.parseFile( join( - workspace.rootPath!, + rootPath, 'extension/import-grouping/imports.ts', ), - workspace.rootPath!, + rootPath, ); }); diff --git a/test/extension/import-grouping/RegexImportGroup.test.ts b/test/extension/import-grouping/RegexImportGroup.test.ts index 8d97966..b769228 100644 --- a/test/extension/import-grouping/RegexImportGroup.test.ts +++ b/test/extension/import-grouping/RegexImportGroup.test.ts @@ -1,7 +1,6 @@ import * as chai from 'chai'; import { join } from 'path'; import { File, NamedImport, TypescriptCodeGenerator, TypescriptParser } from 'typescript-parser'; -import { workspace } from 'vscode'; import { ExtensionConfig } from '../../../src/common/config'; import { TypescriptCodeGeneratorFactory } from '../../../src/common/factories'; @@ -20,14 +19,15 @@ describe('RegexImportGroup', () => { before(async () => { const parser = Container.get(iocSymbols.typescriptParser); + const rootPath = Container.get(iocSymbols.rootPath); config = Container.get(iocSymbols.configuration); generator = Container.get(iocSymbols.generatorFactory)(); file = await parser.parseFile( join( - workspace.rootPath!, + rootPath, 'extension/import-grouping/imports.ts', ), - workspace.rootPath!, + rootPath, ); }); diff --git a/test/extension/import-grouping/RemainImportGroup.test.ts b/test/extension/import-grouping/RemainImportGroup.test.ts index ea43185..4c56ea6 100644 --- a/test/extension/import-grouping/RemainImportGroup.test.ts +++ b/test/extension/import-grouping/RemainImportGroup.test.ts @@ -1,7 +1,6 @@ import * as chai from 'chai'; import { join } from 'path'; import { File, TypescriptCodeGenerator, TypescriptParser } from 'typescript-parser'; -import { workspace } from 'vscode'; import { ExtensionConfig } from '../../../src/common/config'; import { TypescriptCodeGeneratorFactory } from '../../../src/common/factories'; @@ -20,14 +19,15 @@ describe('RemainImportGroup', () => { before(async () => { const parser = Container.get(iocSymbols.typescriptParser); + const rootPath = Container.get(iocSymbols.rootPath); config = Container.get(iocSymbols.configuration); generator = Container.get(iocSymbols.generatorFactory)(); file = await parser.parseFile( join( - workspace.rootPath!, + rootPath, 'extension/import-grouping/imports.ts', ), - workspace.rootPath!, + rootPath, ); }); diff --git a/test/extension/managers/ClassManager.test.ts b/test/extension/managers/ClassManager.test.ts index 1b2b4f7..6c07b95 100644 --- a/test/extension/managers/ClassManager.test.ts +++ b/test/extension/managers/ClassManager.test.ts @@ -21,7 +21,8 @@ chai.use(sinonChai); describe('ClassManager', () => { - const file = join(workspace.rootPath!, 'extension/managers/ClassManagerFile.ts'); + const rootPath = Container.get(iocSymbols.rootPath); + const file = join(rootPath, 'extension/managers/ClassManagerFile.ts'); let document: TextDocument; let documentText: string; let index: DeclarationIndex; @@ -29,7 +30,7 @@ describe('ClassManager', () => { before(async () => { const config = new VscodeExtensionConfig(); - files = await findFiles(config); + files = await findFiles(config, rootPath); index = Container.get(iocSymbols.declarationIndex); await index.buildIndex(files); diff --git a/test/extension/managers/ImportManager.test.ts b/test/extension/managers/ImportManager.test.ts index a269481..c6f1a68 100644 --- a/test/extension/managers/ImportManager.test.ts +++ b/test/extension/managers/ImportManager.test.ts @@ -38,7 +38,8 @@ function restoreInputBox(stub: sinon.SinonStub): void { describe('ImportManager', () => { - const file = join(workspace.rootPath!, 'extension/managers/ImportManagerFile.ts'); + const rootPath = Container.get(iocSymbols.rootPath); + const file = join(rootPath, 'extension/managers/ImportManagerFile.ts'); let document: TextDocument; let documentText: string; let index: DeclarationIndex; @@ -46,7 +47,7 @@ describe('ImportManager', () => { before(async () => { const config = new VscodeExtensionConfig(); - files = await findFiles(config); + files = await findFiles(config, rootPath); index = index = Container.get(iocSymbols.declarationIndex); await index.buildIndex(files);