Skip to content

Commit 20b7bc4

Browse files
fix: preferred pm logic enhancement (#1026)
* fix: package manager detecting * fix: change install command based on pm * chore: add logging in case info.version missing * refactor: pm detecting via project dir * chore: remove redundant log * test: getProjectDir tests
1 parent 27ef796 commit 20b7bc4

3 files changed

Lines changed: 37 additions & 5 deletions

File tree

packages/api/src/codegen/languages/typescript/index.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ function handleExecFailure(err: Error, opts: InstallerOptions = {}) {
8080
throw err;
8181
}
8282

83-
async function detectPackageManager(installDir: string) {
84-
const pm = await preferredPM(installDir);
83+
async function detectPackageManager() {
84+
const projectDir = Storage.getProjectDir();
85+
86+
const pm = await preferredPM(projectDir);
8587
if (pm) {
8688
return pm.name;
8789
}
@@ -162,7 +164,7 @@ export default class TSGenerator extends CodeGenerator {
162164
// eslint-disable-next-line class-methods-use-this
163165
async install(storage: Storage, opts: InstallerOptions = {}): Promise<void> {
164166
const installDir = storage.getIdentifierStorageDir();
165-
const packageManager = await detectPackageManager(installDir);
167+
const packageManager = await detectPackageManager();
166168

167169
const installCommand = ['install', '--save', opts.dryRun ? '--dry-run' : ''].filter(Boolean);
168170

@@ -189,8 +191,7 @@ export default class TSGenerator extends CodeGenerator {
189191

190192
static async uninstall(storage: Storage, opts: InstallerOptions = {}): Promise<void> {
191193
const pkgName = storage.getPackageName() as string;
192-
const installDir = storage.getIdentifierStorageDir();
193-
const packageManager = await detectPackageManager(installDir);
194+
const packageManager = await detectPackageManager();
194195

195196
const args = ['uninstall', pkgName, opts.dryRun ? '--dry-run' : ''].filter(Boolean);
196197
return execa(packageManager, args)

packages/api/src/storage.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,21 @@ export default class Storage {
7979
fs.mkdirSync(Storage.getAPIsDir(), { recursive: true });
8080
}
8181

82+
/**
83+
* Retrieves the project's root directory path.
84+
*
85+
* If a storage directory has not been explicitly set, this method will default it to
86+
* the current working directory. It then returns the directory name of the storage path.
87+
*
88+
*/
89+
static getProjectDir() {
90+
if (!Storage.dir) {
91+
Storage.setStorageDir();
92+
}
93+
94+
return path.dirname(Storage.dir);
95+
}
96+
8297
/**
8398
* Reset the state of the entire storage system.
8499
*

packages/api/test/storage.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,22 @@ describe('storage', () => {
6464
});
6565
});
6666

67+
describe('#getProjectDir', () => {
68+
it('should return the parent directory of the storage directory', () => {
69+
Storage.setStorageDir(uniqueTempDir());
70+
const projectDir = Storage.getProjectDir();
71+
expect(projectDir).toBe(path.dirname(Storage.dir));
72+
});
73+
74+
it('should set and return default storage directory if none is set', () => {
75+
Storage.dir = '';
76+
const projectDir = Storage.getProjectDir();
77+
expect(Storage.dir).toBe(path.join(process.cwd(), '.api'));
78+
expect(projectDir).toBe(path.dirname(Storage.dir));
79+
expect(projectDir).toBe(process.cwd());
80+
});
81+
});
82+
6783
describe('#generateIntegrityHash', () => {
6884
it('should generate an integrity hash for an API definition', () => {
6985
expect(Storage.generateIntegrityHash(petstoreSimple as OASDocument)).toBe(

0 commit comments

Comments
 (0)