sideload wip, websockets, styling, multiple todos (#2865)

* sideload wip, websockets, styling, multiple todos

* sideload

* misc backend updates

* chore: comments

* prep for license and instructions display

* comment for Matt

* s9pk updates and 040 sdk

* fix dependency error for actions

* 0.4.0-beta.1

* beta.2

---------

Co-authored-by: Aiden McClelland <me@drbonez.dev>
Co-authored-by: waterplea <alexander@inkin.ru>
Co-authored-by: Aiden McClelland <3732071+dr-bonez@users.noreply.github.com>
This commit is contained in:
Matt Hill
2025-04-10 13:51:05 -06:00
committed by GitHub
parent ab4336cfd7
commit fc2be42418
88 changed files with 773 additions and 965 deletions

View File

@@ -935,26 +935,17 @@ export namespace Mock {
loggedIn: '2021-07-14T20:49:17.774Z',
lastActive: '2021-07-14T20:49:17.774Z',
userAgent: 'AppleWebKit/{WebKit Rev} (KHTML, like Gecko)',
metadata: {
platforms: ['iphone', 'mobileweb', 'mobile', 'ios'],
},
},
klndsfjhbwsajkdnaksj: {
loggedIn: '2021-07-14T20:49:17.774Z',
lastActive: '2019-07-14T20:49:17.774Z',
userAgent: 'AppleWebKit/{WebKit Rev} (KHTML, like Gecko)',
metadata: {
platforms: ['cli'],
},
},
b7b1a9cef4284f00af9e9dda6e676177: {
loggedIn: '2021-07-14T20:49:17.774Z',
lastActive: '2021-06-14T20:49:17.774Z',
userAgent:
'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0',
metadata: {
platforms: ['desktop'],
},
},
},
}
@@ -1500,7 +1491,6 @@ export namespace Mock {
},
{
spec: ISB.InputSpec.of({
/* TODO: Convert range for this value ([0, 2])*/
union: ISB.Value.union(
{
name: 'Preference',
@@ -1560,19 +1550,18 @@ export namespace Mock {
},
disabled: ['option2'],
})),
'favorite-number':
/* TODO: Convert range for this value ((-100,100])*/ ISB.Value.number(
{
name: 'Favorite Number',
description: 'Your favorite number of all time',
warning:
'Once you set this number, it can never be changed without severe consequences.',
required: false,
default: 7,
integer: false,
units: 'BTC',
},
),
'favorite-number': ISB.Value.number({
name: 'Favorite Number',
description: 'Your favorite number of all time',
warning:
'Once you set this number, it can never be changed without severe consequences.',
required: false,
default: 7,
integer: false,
units: 'BTC',
min: -100,
max: 100,
}),
rpcsettings: ISB.Value.object(
{
name: 'RPC Settings',
@@ -1906,7 +1895,7 @@ export namespace Mock {
name: 'View Properties',
description: 'view important information about Bitcoin',
warning: null,
visibility: 'enabled',
visibility: 'hidden',
allowedStatuses: 'any',
hasInput: false,
group: null,

View File

@@ -31,7 +31,6 @@ export namespace RR {
export type LoginReq = {
password: string
metadata: SessionMetadata
ephemeral?: boolean
} // auth.login - unauthed
export type loginRes = null
@@ -421,30 +420,8 @@ export type Session = {
loggedIn: string
lastActive: string
userAgent: string
metadata: SessionMetadata
}
export type SessionMetadata = {
platforms: PlatformType[]
}
export type PlatformType =
| 'cli'
| 'ios'
| 'ipad'
| 'iphone'
| 'android'
| 'phablet'
| 'tablet'
| 'cordova'
| 'capacitor'
| 'electron'
| 'pwa'
| 'mobile'
| 'mobileweb'
| 'desktop'
| 'hybrid'
export type BackupTarget = DiskBackupTarget | CifsBackupTarget
export interface DiskBackupTarget {
@@ -604,7 +581,7 @@ export type DependencyErrorTransitive = {
type: 'transitive'
}
// **** @TODO 041 ****
// @TODO 041
// export namespace RR041 {
// // ** domains **

View File

@@ -252,7 +252,7 @@ export const mockPatchData: DataModel = {
name: 'View Properties',
description: 'view important information about Bitcoin',
warning: null,
visibility: 'enabled',
visibility: 'hidden',
allowedStatuses: 'any',
hasInput: false,
group: null,

View File

@@ -357,11 +357,11 @@ export function listUnique(spec: IST.ValueSpecList): ValidatorFn {
const objSpec = spec.spec
let display1: string
let display2: string
let uniqueMessage = isObject(objSpec)
let uniqueMessage = isListObject(objSpec)
? uniqueByMessageWrapper(objSpec.uniqueBy, objSpec)
: ''
if (isObject(objSpec) && objSpec.displayAs) {
if (isListObject(objSpec) && objSpec.displayAs) {
display1 = `"${(Mustache as any).render(
objSpec.displayAs,
list[idx],
@@ -390,7 +390,6 @@ function listItemEquals(
val1: any,
val2: any,
): boolean {
// TODO: fix types
switch (spec.spec.type) {
case 'text':
return val1 == val2
@@ -402,45 +401,6 @@ function listItemEquals(
}
}
function itemEquals(spec: IST.ValueSpec, val1: any, val2: any): boolean {
switch (spec.type) {
case 'text':
case 'textarea':
case 'number':
case 'toggle':
case 'select':
return val1 == val2
case 'object':
// TODO: 'unique-by' does not exist on ValueSpecObject, fix types
return objEquals(
(spec as any)['unique-by'],
spec as IST.ValueSpecObject,
val1,
val2,
)
case 'union':
// TODO: 'unique-by' does not exist onIST.ValueSpecUnion, fix types
return unionEquals(
(spec as any)['unique-by'],
spec as IST.ValueSpecUnion,
val1,
val2,
)
case 'list':
if (val1.length !== val2.length) {
return false
}
for (let idx = 0; idx < val1.length; idx++) {
if (listItemEquals(spec, val1[idx], val2[idx])) {
return false
}
}
return true
default:
return false
}
}
function listObjEquals(
uniqueBy: IST.UniqueBy,
spec: IST.ListValueSpecObject,
@@ -450,17 +410,17 @@ function listObjEquals(
if (!uniqueBy) {
return false
} else if (typeof uniqueBy === 'string') {
return itemEquals(spec.spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
return uniqueByEquals(spec.spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
} else if ('any' in uniqueBy) {
for (let subSpec of uniqueBy.any) {
if (listObjEquals(subSpec, spec, val1, val2)) {
for (let unique of uniqueBy.any) {
if (listObjEquals(unique, spec, val1, val2)) {
return true
}
}
return false
} else if ('all' in uniqueBy) {
for (let subSpec of uniqueBy.all) {
if (!listObjEquals(subSpec, spec, val1, val2)) {
for (let unique of uniqueBy.all) {
if (!listObjEquals(unique, spec, val1, val2)) {
return false
}
}
@@ -469,66 +429,29 @@ function listObjEquals(
return false
}
function objEquals(
uniqueBy: IST.UniqueBy,
spec: IST.ValueSpecObject,
val1: any,
val2: any,
): boolean {
if (!uniqueBy) {
return false
} else if (typeof uniqueBy === 'string') {
// TODO: fix types
return itemEquals((spec as any)[uniqueBy], val1[uniqueBy], val2[uniqueBy])
} else if ('any' in uniqueBy) {
for (let subSpec of uniqueBy.any) {
if (objEquals(subSpec, spec, val1, val2)) {
return true
}
}
return false
} else if ('all' in uniqueBy) {
for (let subSpec of uniqueBy.all) {
if (!objEquals(subSpec, spec, val1, val2)) {
function uniqueByEquals(spec: IST.ValueSpec, val1: any, val2: any): boolean {
switch (spec.type) {
case 'text':
case 'textarea':
case 'number':
case 'toggle':
case 'select':
case 'color':
case 'datetime':
return val1 == val2
case 'list':
if (val1.length !== val2.length) {
return false
}
}
return true
}
return false
}
function unionEquals(
uniqueBy: IST.UniqueBy,
spec: IST.ValueSpecUnion,
val1: any,
val2: any,
): boolean {
const variantSpec = spec.variants[val1.selection].spec
if (!uniqueBy) {
return false
} else if (typeof uniqueBy === 'string') {
if (uniqueBy === 'selection') {
return val1.selection === val2.selection
} else {
return itemEquals(variantSpec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
}
} else if ('any' in uniqueBy) {
for (let subSpec of uniqueBy.any) {
if (unionEquals(subSpec, spec, val1, val2)) {
return true
for (let idx = 0; idx < val1.length; idx++) {
if (listItemEquals(spec, val1[idx], val2[idx])) {
return false
}
}
}
return false
} else if ('all' in uniqueBy) {
for (let subSpec of uniqueBy.all) {
if (!unionEquals(subSpec, spec, val1, val2)) {
return false
}
}
return true
return true
default:
return false
}
return false
}
function uniqueByMessageWrapper(
@@ -573,7 +496,7 @@ function uniqueByMessage(
: '(' + ret + ')'
}
function isObject(
function isListObject(
spec: IST.ListValueSpecOf<any>,
): spec is IST.ListValueSpecObject {
// only lists of objects have uniqueBy

View File

@@ -48,7 +48,6 @@ export class MarketplaceService {
this.registryUrl$.pipe(
switchMap(url => this.fetchRegistry$(url)),
filter(Boolean),
// @TODO is updateStoreName needed?
map(registry => {
registry.info.categories = {
all: {
@@ -217,7 +216,7 @@ export class MarketplaceService {
map(packages => {
return Object.entries(packages).flatMap(([id, pkgInfo]) =>
Object.keys(pkgInfo.best).map(version =>
this.convertToMarketplacePkg(
this.convertRegistryPkgToMarketplacePkg(
id,
version,
this.exver.getFlavor(version),
@@ -239,12 +238,12 @@ export class MarketplaceService {
this.api.getRegistryPackage(url, id, version ? `=${version}` : null),
).pipe(
map(pkgInfo =>
this.convertToMarketplacePkg(id, version, flavor, pkgInfo),
this.convertRegistryPkgToMarketplacePkg(id, version, flavor, pkgInfo),
),
)
}
private convertToMarketplacePkg(
private convertRegistryPkgToMarketplacePkg(
id: string,
version: string | null | undefined,
flavor: string | null,