1
1
import { bold , brightBlue , cyan , green , red , yellow } from "@std/fmt/colors" ;
2
2
import { ValidationError } from "../_errors.ts" ;
3
3
import { Table } from "@cliffy/table" ;
4
+ import type { Logger } from "./logger.ts" ;
4
5
5
6
export interface Versions {
6
7
latest : string ;
7
8
versions : Array < string > ;
8
9
}
9
10
10
- export interface UpgradeOptions {
11
+ /** Shared provider options. */
12
+ export interface ProviderOptions {
13
+ main ?: string ;
14
+ logger ?: Logger ;
15
+ }
16
+
17
+ /** Provider upgrade options. */
18
+ export interface ProviderUpgradeOptions {
11
19
name : string ;
12
- from ?: string ;
13
20
to : string ;
14
- args ?: Array < string > ;
15
21
main ?: string ;
16
- importMap ?: string ;
22
+ args ?: Array < string > ;
23
+ from ?: string ;
24
+ force ?: boolean ;
25
+ verbose ?: boolean ;
17
26
}
18
27
28
+ /**
29
+ * Upgrade provider.
30
+ *
31
+ * The upgrade provider is an api wrapper for a javascript registry which is
32
+ * used by the upgrade command to upgrade the cli to a specific version.
33
+ *
34
+ * @example Upgrade provider example.
35
+ *
36
+ * ```
37
+ * import { Command } from "@cliffy/command";
38
+ * import { UpgradeCommand } from "@cliffy/command/upgrade";
39
+ * import { DenoLandProvider } from "@cliffy/command/upgrade/provider/deno-land";
40
+ * import { GithubProvider } from "@cliffy/command/upgrade/provider/github";
41
+ * import { JsrProvider } from "@cliffy/command/upgrade/provider/jsr";
42
+ * import { NestLandProvider } from "@cliffy/command/upgrade/provider/nest-land";
43
+ * import { NpmProvider } from "@cliffy/command/upgrade/provider/npm";
44
+ *
45
+ * const upgradeCommand = new UpgradeCommand({
46
+ * provider: [
47
+ * new JsrProvider({ package: "@examples /package" }),
48
+ * ],
49
+ * });
50
+ * ```
51
+ */
19
52
export abstract class Provider {
20
53
abstract readonly name : string ;
54
+ protected readonly main ?: string ;
21
55
protected readonly maxListSize : number = 25 ;
56
+ protected logger : Logger ;
22
57
private maxCols = 8 ;
23
58
59
+ protected constructor ( { main, logger = console } : ProviderOptions = { } ) {
60
+ this . main = main ;
61
+ this . logger = logger ;
62
+ }
63
+
24
64
abstract getVersions ( name : string ) : Promise < Versions > ;
25
65
26
- abstract getRepositoryUrl ( name : string ) : string ;
66
+ abstract getRepositoryUrl ( name : string , version ?: string ) : string ;
27
67
28
68
abstract getRegistryUrl ( name : string , version : string ) : string ;
29
69
70
+ upgrade ?( options : ProviderUpgradeOptions ) : Promise < void > ;
71
+
72
+ getSpecifier ( name : string , version : string , defaultMain ?: string ) : string {
73
+ return `${ this . getRegistryUrl ( name , version ) } ${ this . getMain ( defaultMain ) } ` ;
74
+ }
75
+
30
76
async isOutdated (
31
77
name : string ,
32
78
currentVersion : string ,
@@ -57,7 +103,7 @@ export abstract class Provider {
57
103
58
104
// Check if requested version is already the latest available version.
59
105
if ( latest && latest === currentVersion && latest === targetVersion ) {
60
- console . warn (
106
+ this . logger . warn (
61
107
yellow (
62
108
`You're already using the latest available version ${ currentVersion } of ${ name } .` ,
63
109
) ,
@@ -67,7 +113,7 @@ export abstract class Provider {
67
113
68
114
// Check if requested version is already installed.
69
115
if ( targetVersion && currentVersion === targetVersion ) {
70
- console . warn (
116
+ this . logger . warn (
71
117
yellow ( `You're already using version ${ currentVersion } of ${ name } .` ) ,
72
118
) ;
73
119
return false ;
@@ -76,62 +122,6 @@ export abstract class Provider {
76
122
return true ;
77
123
}
78
124
79
- async upgrade (
80
- { name, from, to, importMap, main, args = [ ] } : UpgradeOptions ,
81
- ) : Promise < void > {
82
- if ( to === "latest" ) {
83
- const { latest } = await this . getVersions ( name ) ;
84
- to = latest ;
85
- }
86
-
87
- const registryUrl = this . getRegistryUrl ( name , to ) ;
88
- const registry : string =
89
- registryUrl . startsWith ( "jsr:" ) || registryUrl . startsWith ( "npm:" )
90
- ? registryUrl
91
- : new URL ( main || `${ name } .ts` , registryUrl + "/" ) . href ;
92
-
93
- const cmdArgs = [ "install" ] ;
94
-
95
- if ( importMap ) {
96
- const importJson : string = new URL ( importMap , registryUrl + "/" ) . href ;
97
-
98
- cmdArgs . push ( "--import-map" , importJson ) ;
99
- }
100
-
101
- if ( args . length ) {
102
- cmdArgs . push ( ...args , "--force" , "--name" , name , registry ) ;
103
- } else {
104
- cmdArgs . push (
105
- "--no-check" ,
106
- "--quiet" ,
107
- "--force" ,
108
- "--name" ,
109
- name ,
110
- registry ,
111
- ) ;
112
- }
113
-
114
- const cmd = new Deno . Command ( Deno . execPath ( ) , {
115
- args : cmdArgs ,
116
- stdout : "piped" ,
117
- stderr : "piped" ,
118
- } ) ;
119
- const { success, stderr } = await cmd . output ( ) ;
120
-
121
- if ( ! success ) {
122
- await Deno . stderr . write ( stderr ) ;
123
- throw new Error (
124
- `Failed to upgrade ${ name } from ${ from } to version ${ to } !` ,
125
- ) ;
126
- }
127
-
128
- console . info (
129
- `Successfully upgraded ${ name } from ${ from } to version ${ to } ! (${
130
- this . getRegistryUrl ( name , to )
131
- } )`,
132
- ) ;
133
- }
134
-
135
125
public async listVersions (
136
126
name : string ,
137
127
currentVersion ?: string ,
@@ -177,4 +167,13 @@ export abstract class Provider {
177
167
}
178
168
}
179
169
}
170
+
171
+ setLogger ( logger : Logger ) : void {
172
+ this . logger = logger ;
173
+ }
174
+
175
+ private getMain ( defaultMain ?: string ) : string {
176
+ const main = this . main ?? defaultMain ;
177
+ return main ? `/${ main } ` : "" ;
178
+ }
180
179
}
0 commit comments