|
1 | | -import * as https from "https"; |
2 | 1 | import * as core from "@actions/core"; |
3 | | -import * as cheerio from "cheerio"; |
4 | 2 | import { |
5 | 3 | type Installer, |
6 | 4 | RunnerOS, |
7 | 5 | LinuxInstaller, |
8 | 6 | MacOSInstaller, |
9 | 7 | WindowsInstaller, |
10 | 8 | } from "./cli-installer"; |
11 | | - |
12 | | -export enum VersionType { |
13 | | - Latest = "latest", |
14 | | - LatestBeta = "latest-beta", |
15 | | -} |
16 | | - |
17 | | -// Returns `true` if the versionType is one of the defined in VersionType enum, otherwise `false`. |
18 | | -const isValidVersionType = (versionType: string): boolean => |
19 | | - Object.values(VersionType).some((v) => v === versionType); |
20 | | - |
21 | | -// Loads the HTML content from the 1Password CLI product history page. |
22 | | -export const loadHtml = (): Promise<string> => { |
23 | | - return new Promise((resolve, reject) => { |
24 | | - https |
25 | | - .get("https://app-updates.agilebits.com/product_history/CLI2", (res) => { |
26 | | - let data = ""; |
27 | | - res.on("data", (chunk) => (data += chunk)); |
28 | | - res.on("end", () => { |
29 | | - core.debug("HTML loaded successfully"); |
30 | | - resolve(data) |
31 | | - }); |
32 | | - }) |
33 | | - .on("error", (e) => { |
34 | | - core.error(`Failed to load HTML: ${e.message}`); |
35 | | - reject(); |
36 | | - }); |
37 | | - }); |
38 | | -}; |
39 | | - |
40 | | -// Returns the latest version of the 1Password CLI based on the specified channel. |
41 | | -export const getLatestVersion = async (channel: VersionType): Promise<string> => { |
42 | | - core.debug(`Getting ${channel} version`); |
43 | | - const html = await loadHtml(); |
44 | | - const $ = cheerio.load(html); |
45 | | - const versions: string[] = []; |
46 | | - $("h3").each((_, el) => { |
47 | | - const text = $(el).text().trim(); |
48 | | - const match = text.match(/^([\d.]+(?:-beta\d+)?)/); |
49 | | - if (match) { |
50 | | - const version = match[1]; |
51 | | - if (!version) { |
52 | | - return |
53 | | - } |
54 | | - if ( |
55 | | - (channel === VersionType.Latest && !version.includes("-beta")) || |
56 | | - (channel === VersionType.LatestBeta && version.includes("-beta")) |
57 | | - ) { |
58 | | - versions.push(version); |
59 | | - } |
60 | | - } |
61 | | - }); |
62 | | - |
63 | | - if (versions.length === 0) { |
64 | | - core.error(`No ${channel} versions found`); |
65 | | - throw new Error(`No ${channel} versions found`); |
66 | | - } |
67 | | - |
68 | | - return versions[0]!; |
69 | | -}; |
| 9 | +import { VersionResolver } from "./version"; |
70 | 10 |
|
71 | 11 | async function run(): Promise<void> { |
72 | 12 | try { |
73 | | - const versionType = core.getInput("version") as VersionType; |
74 | | - // validate the version input. Should be one of the VersionTypes. |
75 | | - if (!isValidVersionType(versionType)) { |
76 | | - core.setFailed( |
77 | | - `Invalid version input: ${versionType}. Valid options are: ${Object.values(VersionType).join(", ")}. Defaulting to 'latest'.`, |
78 | | - ); |
79 | | - return; |
80 | | - } |
| 13 | + const versionResolver = new VersionResolver(core.getInput("version")); |
| 14 | + await versionResolver.resolve(); |
81 | 15 |
|
82 | | - const version = await getLatestVersion(versionType); |
83 | 16 | let installer: Installer; |
84 | 17 | switch (process.env.RUNNER_OS) { |
85 | 18 | case RunnerOS.Linux: |
86 | | - installer = new LinuxInstaller(version); |
| 19 | + installer = new LinuxInstaller(versionResolver.get()); |
87 | 20 | break; |
88 | 21 | case RunnerOS.MacOS: |
89 | | - installer = new MacOSInstaller(version); |
| 22 | + installer = new MacOSInstaller(versionResolver.get()); |
90 | 23 | break; |
91 | 24 | case RunnerOS.Windows: |
92 | | - installer = new WindowsInstaller(version); |
| 25 | + installer = new WindowsInstaller(versionResolver.get()); |
93 | 26 | break; |
94 | 27 | default: |
95 | 28 | core.setFailed(`Unsupported platform: ${process.env.RUNNER_OS}`); |
|
0 commit comments