Feature/fe new registry (#2647)

* bugfixes

* update fe types

* implement new registry types in marketplace and ui

* fix marketplace types to have default params

* add alt implementation toggle

* merge cleanup

* more cleanup and notes

* fix build

* cleanup sync with next/minor

* add exver JS parser

* parse ValidExVer to string

* update types to interface

* add VersionRange and comparative functions

* Parse ExtendedVersion from string

* add conjunction, disjunction, and inversion logic

* consider flavor in satisfiedBy fn

* consider prerelease for ordering

* add compare fn for sorting

* rename fns for consistency

* refactoring

* update compare fn to return null if flavors don't match

* begin simplifying dependencies

* under construction

* wip

* add dependency metadata to CurrentDependencyInfo

* ditch inheritance for recursive VersionRange constructor. Recursive 'satisfiedBy' fn wip

* preprocess manifest

* misc fixes

* use sdk version as osVersion in manifest

* chore: Change the type to just validate and not generate all solutions.

* add publishedAt

* fix pegjs exports

* integrate exver into sdk

* misc fixes

* complete satisfiedBy fn

* refactor - use greaterThanOrEqual and lessThanOrEqual fns

* fix tests

* update dependency details

* update types

* remove interim types

* rename alt implementation to flavor

* cleanup os update

* format exver.ts

* add s9pk parsing endpoints

* fix build

* update to exver

* exver and bug fixes

* update static endpoints + cleanup

* cleanup

* update static proxy verification

* make mocks more robust; fix dep icon fallback; cleanup

* refactor alert versions and update fixtures

* registry bugfixes

* misc fixes

* cleanup unused

* convert patchdb ui seed to camelCase

* update otherVersions type

* change otherVersions: null to 'none'

* refactor and complete feature

* improve static endpoints

* fix install params

* mask systemd-networkd-wait-online

* fix static file fetching

* include non-matching versions in otherVersions

* convert release notes to modal and clean up displayExver

* alert for no other versions

* Fix ack-instructions casing

* fix indeterminate loader on service install

---------

Co-authored-by: Aiden McClelland <me@drbonez.dev>
Co-authored-by: Shadowy Super Coder <musashidisciple@proton.me>
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
Co-authored-by: J H <dragondef@gmail.com>
Co-authored-by: Matt Hill <mattnine@protonmail.com>
This commit is contained in:
Lucy
2024-07-22 20:48:12 -04:00
committed by GitHub
parent 0fbb18b315
commit a535fc17c3
196 changed files with 7002 additions and 2162 deletions

View File

@@ -1,12 +0,0 @@
import { NgModule } from '@angular/core'
import {
EmverComparesPipe,
EmverDisplayPipe,
EmverSatisfiesPipe,
} from './emver.pipe'
@NgModule({
declarations: [EmverComparesPipe, EmverDisplayPipe, EmverSatisfiesPipe],
exports: [EmverComparesPipe, EmverDisplayPipe, EmverSatisfiesPipe],
})
export class EmverPipesModule {}

View File

@@ -1,52 +0,0 @@
import { Pipe, PipeTransform } from '@angular/core'
import { Emver } from '../../services/emver.service'
@Pipe({
name: 'satisfiesEmver',
})
export class EmverSatisfiesPipe implements PipeTransform {
constructor(private readonly emver: Emver) {}
transform(versionUnderTest?: string, range?: string): boolean {
return (
!!versionUnderTest &&
!!range &&
this.emver.satisfies(versionUnderTest, range)
)
}
}
@Pipe({
name: 'compareEmver',
})
export class EmverComparesPipe implements PipeTransform {
constructor(private readonly emver: Emver) {}
transform(first: string, second: string): SemverResult {
try {
return this.emver.compare(first, second) as SemverResult
} catch (e) {
console.error(`emver comparison failed`, e, first, second)
return 'comparison-impossible'
}
}
}
// left compared to right - if 1, version on left is higher; if 0, values the same; if -1, version on left is lower
type SemverResult = 0 | 1 | -1 | 'comparison-impossible'
@Pipe({
name: 'displayEmver',
})
export class EmverDisplayPipe implements PipeTransform {
constructor() {}
transform(version: string): string {
return displayEmver(version)
}
}
export function displayEmver(version: string): string {
const vs = version.split('.')
if (vs.length === 4) return `${vs[0]}.${vs[1]}.${vs[2]}~${vs[3]}`
return version
}

View File

@@ -0,0 +1,8 @@
import { NgModule } from '@angular/core'
import { ExverComparesPipe, ExverSatisfiesPipe } from './exver.pipe'
@NgModule({
declarations: [ExverComparesPipe, ExverSatisfiesPipe],
exports: [ExverComparesPipe, ExverSatisfiesPipe],
})
export class ExverPipesModule {}

View File

@@ -0,0 +1,35 @@
import { Pipe, PipeTransform } from '@angular/core'
import { Exver } from '../../services/exver.service'
@Pipe({
name: 'satisfiesExver',
})
export class ExverSatisfiesPipe implements PipeTransform {
constructor(private readonly exver: Exver) {}
transform(versionUnderTest?: string, range?: string): boolean {
return (
!!versionUnderTest &&
!!range &&
this.exver.satisfies(versionUnderTest, range)
)
}
}
@Pipe({
name: 'compareExver',
})
export class ExverComparesPipe implements PipeTransform {
constructor(private readonly exver: Exver) {}
transform(first: string, second: string): SemverResult {
try {
return this.exver.compareExver(first, second) as SemverResult
} catch (e) {
console.error(`exver comparison failed`, e, first, second)
return 'comparison-impossible'
}
}
}
// left compared to right - if 1, version on left is higher; if 0, values the same; if -1, version on left is lower
type SemverResult = 0 | 1 | -1 | 'comparison-impossible'

View File

@@ -30,8 +30,8 @@ export * from './directives/safe-links/safe-links.module'
export * from './directives/enter/enter.directive'
export * from './directives/enter/enter.module'
export * from './pipes/emver/emver.module'
export * from './pipes/emver/emver.pipe'
export * from './pipes/exver/exver.module'
export * from './pipes/exver/exver.pipe'
export * from './pipes/guid/guid.module'
export * from './pipes/guid/guid.pipe'
export * from './pipes/markdown/markdown.module'
@@ -44,7 +44,7 @@ export * from './pipes/unit-conversion/unit-conversion.module'
export * from './pipes/unit-conversion/unit-conversion.pipe'
export * from './services/download-html.service'
export * from './services/emver.service'
export * from './services/exver.service'
export * from './services/error.service'
export * from './services/http.service'

View File

@@ -1,18 +0,0 @@
import { Injectable } from '@angular/core'
import * as emver from '@start9labs/emver'
@Injectable({
providedIn: 'root',
})
export class Emver {
constructor() {}
compare(lhs: string, rhs: string): number | null {
if (!lhs || !rhs) return null
return emver.compare(lhs, rhs)
}
satisfies(version: string, range: string): boolean {
return emver.satisfies(version, range)
}
}

View File

@@ -0,0 +1,43 @@
import { Injectable } from '@angular/core'
import { VersionRange, ExtendedVersion, Version } from '@start9labs/start-sdk'
@Injectable({
providedIn: 'root',
})
export class Exver {
constructor() {}
compareExver(lhs: string, rhs: string): number | null {
if (!lhs || !rhs) return null
try {
return ExtendedVersion.parse(lhs).compareForSort(
ExtendedVersion.parse(rhs),
)
} catch (e) {
return null
}
}
greaterThanOrEqual(lhs: string, rhs: string): boolean | null {
if (!lhs || !rhs) return null
try {
return ExtendedVersion.parse(lhs).greaterThanOrEqual(
ExtendedVersion.parse(rhs),
)
} catch (e) {
return null
}
}
compareOsVersion(current: string, other: string) {
return Version.parse(current).compare(Version.parse(other))
}
satisfies(version: string, range: string): boolean {
return VersionRange.parse(range).satisfiedBy(ExtendedVersion.parse(version))
}
getFlavor(version: string): string | null {
return ExtendedVersion.parse(version).flavor
}
}

View File

@@ -5,6 +5,8 @@ export enum Method {
POST = 'POST',
}
type ParamPrimitive = string | number | boolean
export interface HttpOptions {
method: Method
url: string
@@ -12,7 +14,7 @@ export interface HttpOptions {
[header: string]: string | string[]
}
params?: {
[param: string]: string | string[]
[param: string]: ParamPrimitive | ParamPrimitive[]
}
responseType?: 'json' | 'text' | 'arrayBuffer'
body?: any
@@ -28,7 +30,7 @@ export interface HttpAngularOptions {
[header: string]: string | string[]
}
params?: {
[param: string]: string | string[]
[param: string]: ParamPrimitive | ParamPrimitive[]
}
responseType?: 'json' | 'text' | 'arrayBuffer'
}