feat(interfaces): add structured data models and discriminated check configs; migrate tooling and package metadata
This commit is contained in:
43
changelog.md
Normal file
43
changelog.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 2025-12-26 - 2.1.0 - feat(interfaces)
|
||||||
|
add structured data models and discriminated check configs; migrate tooling and package metadata
|
||||||
|
|
||||||
|
- Introduce TCheckConfig union and typed check config interfaces (IAssumptionCheckConfig, IFunctionCheckConfig, IPwaCheckConfig, IPageRankCheckConfig) and TExecutionTiming for runtimes
|
||||||
|
- Extend ICheckCollection to support a unified checks array while preserving legacy per-type arrays for backward compatibility
|
||||||
|
- Add service and status-page models (IServiceStatus, IOverallStatus, IServiceGroup, IStatusPageConfig) and richer incident types (IIncident, IIncidentUpdate) plus a legacy IIncidentLegacy shim
|
||||||
|
- Export central data index enhancements (re-exports for checks and types) and add new data files (types.ts, checks/index.ts, servicestatus.ts, statuspageconfig.ts)
|
||||||
|
- Migrate plugin and dependency namespaces (@apiglobal/... -> @api.global/..., @gitzone/* -> @git.zone/*) and update dependency versions
|
||||||
|
- Add npmextra release configuration (registries and accessLevel) and adjust tsconfig for NodeNext module resolution and verbatimModuleSyntax
|
||||||
|
|
||||||
|
## 2023-04-19 - 2.0.21 - core
|
||||||
|
Maintenance release with a series of core fixes and minor updates.
|
||||||
|
|
||||||
|
- Aggregated patch-level fixes and stability improvements applied across the 2.0.x line.
|
||||||
|
- Includes maintenance changes introduced in 2.0.4 through 2.0.21 (core updates, bug fixes, small adjustments).
|
||||||
|
- No breaking API changes.
|
||||||
|
|
||||||
|
## 2022-07-19 - 2.0.3 - core
|
||||||
|
Patch releases preparing and stabilizing the 2.0 series.
|
||||||
|
|
||||||
|
- Multiple small core updates and fixes delivered in 2.0.0 through 2.0.3.
|
||||||
|
- General maintenance and reliability improvements; no breaking changes.
|
||||||
|
|
||||||
|
## 2022-07-16 - 1.0.10 - core (BREAKING CHANGE)
|
||||||
|
Switch from CommonJS to ECMAScript Modules (ESM).
|
||||||
|
|
||||||
|
- BREAKING CHANGE: module system changed to ESM.
|
||||||
|
- Consumers must update imports/usage accordingly (CommonJS require() calls will need migration).
|
||||||
|
- Ensure build tools and runtime environments support ESM after this change.
|
||||||
|
|
||||||
|
## 2019-11-30 - 1.0.2 - interfaces
|
||||||
|
Introduce basic interface constructs for page checks.
|
||||||
|
|
||||||
|
- Implemented basic constructs for pagechecks under interfaces.
|
||||||
|
- Foundation for further interface-driven checks and validations.
|
||||||
|
|
||||||
|
## 2019-11-30 → 2021-03-08 - 1.0.3–1.0.9 - maintenance
|
||||||
|
Series of patch releases with minor fixes and updates.
|
||||||
|
|
||||||
|
- Multiple small fixes and maintenance updates across 1.0.3 through 1.0.9.
|
||||||
|
- General stability and housekeeping changes; no notable feature additions or breaking changes.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"gitzone": {
|
"@git.zone/cli": {
|
||||||
"projectType": "npm",
|
"projectType": "npm",
|
||||||
"module": {
|
"module": {
|
||||||
"githost": "gitlab.com",
|
"githost": "gitlab.com",
|
||||||
@@ -9,10 +9,16 @@
|
|||||||
"npmPackagename": "@uptime.link/interfaces",
|
"npmPackagename": "@uptime.link/interfaces",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"projectDomain": "uptime.link"
|
"projectDomain": "uptime.link"
|
||||||
|
},
|
||||||
|
"release": {
|
||||||
|
"registries": [
|
||||||
|
"https://verdaccio.lossless.digital",
|
||||||
|
"https://registry.npmjs.org"
|
||||||
|
],
|
||||||
|
"accessLevel": "public"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmci": {
|
"@ship.zone/szci": {
|
||||||
"npmGlobalTools": [],
|
"npmGlobalTools": []
|
||||||
"npmAccessLevel": "public"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
13
package.json
13
package.json
@@ -14,15 +14,14 @@
|
|||||||
"buildDocs": "tsdoc"
|
"buildDocs": "tsdoc"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@gitzone/tsbuild": "^2.1.65",
|
"@git.zone/tsbuild": "^4.0.2",
|
||||||
"@gitzone/tsrun": "^1.2.39",
|
"@git.zone/tsrun": "^2.0.1",
|
||||||
"@gitzone/tstest": "^1.0.74",
|
"@git.zone/tstest": "^3.1.3",
|
||||||
"@pushrocks/tapbundle": "^5.0.4",
|
"@types/node": "^25.0.3"
|
||||||
"@types/node": "^18.15.11"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apiglobal/typedrequest-interfaces": "^2.0.1",
|
"@api.global/typedrequest-interfaces": "^3.0.19",
|
||||||
"@tsclass/tsclass": "^4.0.38"
|
"@tsclass/tsclass": "^9.3.0"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/**/*",
|
||||||
|
|||||||
10860
pnpm-lock.yaml
generated
10860
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
import { expect, tap } from '@pushrocks/tapbundle';
|
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||||
import * as interfaces from '../ts/index.js';
|
import * as interfaces from '../ts/index.js';
|
||||||
|
|
||||||
tap.test('first test', async () => {
|
tap.test('first test', async () => {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* autocreated commitinfo by @pushrocks/commitinfo
|
* autocreated commitinfo by @push.rocks/commitinfo
|
||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@uptime.link/interfaces',
|
name: '@uptime.link/interfaces',
|
||||||
version: '2.0.21',
|
version: '2.1.0',
|
||||||
description: 'TypeScript interface for the uptime.link API and modules'
|
description: 'TypeScript interface for the uptime.link API and modules'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,24 @@
|
|||||||
import * as plugins from '../ul-interfaces.plugins.js';
|
import type * as checks from './checks/index.js';
|
||||||
import * as search from './search.js';
|
|
||||||
|
|
||||||
import * as checks from './checks/index.js';
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A collection of checks to run against a property/service.
|
||||||
|
*
|
||||||
|
* Two storage modes supported:
|
||||||
|
* 1. Legacy: Separate arrays for each check type (assumptionChecks, functionChecks, etc.)
|
||||||
|
* 2. Modern: Single unified array using discriminated union (checks)
|
||||||
|
*/
|
||||||
export interface ICheckCollection {
|
export interface ICheckCollection {
|
||||||
id: string;
|
id: string;
|
||||||
|
name?: string;
|
||||||
|
description?: string;
|
||||||
intervalMs: number;
|
intervalMs: number;
|
||||||
assumptionChecks?: Array<checks.IAssumptionCheck>;
|
|
||||||
functionChecks: Array<checks.IFunctionCheck>;
|
// Modern: Single array with discriminated union
|
||||||
pwaChecks?: Array<checks.IPwaCheck>;
|
checks?: checks.TCheckConfig[];
|
||||||
pageRankChecks: Array<checks.IPageRankCheck>;
|
|
||||||
|
// Legacy: Separate arrays by type (for backward compatibility)
|
||||||
|
assumptionChecks?: checks.IAssumptionCheck[];
|
||||||
|
functionChecks?: checks.IFunctionCheck[];
|
||||||
|
pwaChecks?: checks.IPwaCheck[];
|
||||||
|
pageRankChecks?: checks.IPageRankCheck[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import * as plugins from '../../ul-interfaces.plugins.js';
|
import type * as plugins from '../../ul-interfaces.plugins.js';
|
||||||
import { TCheckResultStatus, TExecutionTiming } from './index.js';
|
import type { TCheckResultStatus } from '../types.js';
|
||||||
|
import type { TExecutionTiming } from './index.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assumption check execution data.
|
||||||
|
* Used by check runners to store input and results.
|
||||||
|
*/
|
||||||
export interface IAssumptionCheck {
|
export interface IAssumptionCheck {
|
||||||
inputData: {
|
inputData: {
|
||||||
domain: string;
|
domain: string;
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
import { TCheckResultStatus, TExecutionTiming } from './index.js';
|
import type { TCheckResultStatus } from '../types.js';
|
||||||
|
import type { TExecutionTiming } from './index.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function check execution data.
|
||||||
|
* Used by check runners to store input and results.
|
||||||
|
*/
|
||||||
export interface IFunctionCheck {
|
export interface IFunctionCheck {
|
||||||
checkId: string;
|
checkId: string;
|
||||||
inputData: {
|
inputData: {
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
export type TCheckResultStatus = 'ok' | 'not ok' | 'timed out';
|
import type { TStatusType, TCheckResultStatus, TCheckLastResult } from '../types.js';
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Execution Timing (used by check runners)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
export interface TExecutionTiming {
|
export interface TExecutionTiming {
|
||||||
plannedTime: number;
|
plannedTime: number;
|
||||||
@@ -7,6 +11,106 @@ export interface TExecutionTiming {
|
|||||||
duration: number;
|
duration: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Re-export for backward compatibility
|
||||||
|
export type { TCheckResultStatus };
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Check Configuration Base Interface
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base interface for all check configurations.
|
||||||
|
* Extended by discriminated variants.
|
||||||
|
*/
|
||||||
|
export interface ICheckBase {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description?: string;
|
||||||
|
enabled: boolean;
|
||||||
|
intervalMs?: number;
|
||||||
|
lastRun?: number;
|
||||||
|
lastResult?: TCheckLastResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Discriminated Check Variants (Configuration)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assumption check - assumes a status without active verification
|
||||||
|
*/
|
||||||
|
export interface IAssumptionCheckConfig extends ICheckBase {
|
||||||
|
checkType: 'assumption';
|
||||||
|
assumedStatus: TStatusType;
|
||||||
|
domain?: string;
|
||||||
|
title?: string;
|
||||||
|
statusCode?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function check - calls a URL and validates response
|
||||||
|
*/
|
||||||
|
export interface IFunctionCheckConfig extends ICheckBase {
|
||||||
|
checkType: 'function';
|
||||||
|
functionUrl: string;
|
||||||
|
domain?: string;
|
||||||
|
expectedStatusCode?: number;
|
||||||
|
timeoutMs?: number;
|
||||||
|
headers?: Record<string, string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PWA check - validates Progressive Web App criteria
|
||||||
|
*/
|
||||||
|
export interface IPwaCheckConfig extends ICheckBase {
|
||||||
|
checkType: 'pwa';
|
||||||
|
targetUrl: string;
|
||||||
|
domain?: string;
|
||||||
|
lighthouseThreshold?: number;
|
||||||
|
categories?: ('performance' | 'accessibility' | 'best-practices' | 'seo')[];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PageRank check - validates search engine ranking
|
||||||
|
*/
|
||||||
|
export interface IPageRankCheckConfig extends ICheckBase {
|
||||||
|
checkType: 'pagerank';
|
||||||
|
targetUrl: string;
|
||||||
|
domain?: string;
|
||||||
|
searchTerm: string;
|
||||||
|
minimumRank?: number;
|
||||||
|
checkGoogle?: boolean;
|
||||||
|
checkBing?: boolean;
|
||||||
|
googleMinRank?: number;
|
||||||
|
bingMinRank?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Union Type (for UI and generic handling)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Union of all check configuration types.
|
||||||
|
* Use `checkType` discriminant for type narrowing.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* function handleCheck(check: TCheckConfig) {
|
||||||
|
* if (check.checkType === 'function') {
|
||||||
|
* console.log(check.functionUrl); // TypeScript knows this exists
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
export type TCheckConfig =
|
||||||
|
| IAssumptionCheckConfig
|
||||||
|
| IFunctionCheckConfig
|
||||||
|
| IPwaCheckConfig
|
||||||
|
| IPageRankCheckConfig;
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Execution Interfaces (Runtime Data)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
// Keep existing execution interfaces for backward compatibility
|
||||||
export * from './assumption.check.js';
|
export * from './assumption.check.js';
|
||||||
export * from './function.check.js';
|
export * from './function.check.js';
|
||||||
export * from './pagerank.check.js';
|
export * from './pagerank.check.js';
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
import * as search from '../search.js';
|
import type * as search from '../search.js';
|
||||||
import { TCheckResultStatus, TExecutionTiming } from './index.js';
|
import type { TCheckResultStatus } from '../types.js';
|
||||||
|
import type { TExecutionTiming } from './index.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PageRank check execution data.
|
||||||
|
* Used by check runners to store input and results.
|
||||||
|
*/
|
||||||
export interface IPageRankCheck {
|
export interface IPageRankCheck {
|
||||||
inputData: {
|
inputData: {
|
||||||
subId: string;
|
subId: string;
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
import { TCheckResultStatus } from './index.js';
|
import type { TCheckResultStatus } from '../types.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PWA check execution data.
|
||||||
|
* Used by check runners to store input and results.
|
||||||
|
*/
|
||||||
export interface IPwaCheck {
|
export interface IPwaCheck {
|
||||||
inputData: { domain: string };
|
inputData: {
|
||||||
|
domain: string;
|
||||||
|
};
|
||||||
executionResults: Array<{
|
executionResults: Array<{
|
||||||
subId: string;
|
subId: string;
|
||||||
timeStarted: number;
|
timeStarted: number;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as plugins from '../ul-interfaces.plugins.js';
|
import * as plugins from '../ul-interfaces.plugins.js';
|
||||||
import { ILinkSnapshot } from './linksnapshot.js';
|
import type { ILinkSnapshot } from './linksnapshot.js';
|
||||||
|
|
||||||
export interface IDomainSnapshot {
|
export interface IDomainSnapshot {
|
||||||
registration: {
|
registration: {
|
||||||
|
|||||||
@@ -1,21 +1,80 @@
|
|||||||
import * as plugins from '../ul-interfaces.plugins.js';
|
import type { TIncidentSeverity, TIncidentStatus } from './types.js';
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Incident Update
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A single update within an incident timeline.
|
||||||
|
*/
|
||||||
|
export interface IIncidentUpdate {
|
||||||
|
id: string;
|
||||||
|
incidentId: string;
|
||||||
|
status: TIncidentStatus;
|
||||||
|
message: string;
|
||||||
|
createdAt: number;
|
||||||
|
createdBy?: string;
|
||||||
|
type?: 'comment' | 'status_change' | 'automatic';
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Incident
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an incident affecting one or more services.
|
||||||
|
*/
|
||||||
export interface IIncident {
|
export interface IIncident {
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
severity: TIncidentSeverity;
|
||||||
|
status: TIncidentStatus;
|
||||||
|
|
||||||
|
// Affected services
|
||||||
|
affectedServiceIds: string[];
|
||||||
|
|
||||||
|
// Timeline
|
||||||
|
createdAt: number;
|
||||||
|
updatedAt: number;
|
||||||
|
resolvedAt?: number;
|
||||||
|
firstResponseAt?: number;
|
||||||
|
|
||||||
|
// Updates history
|
||||||
|
updates: IIncidentUpdate[];
|
||||||
|
|
||||||
|
// Metadata
|
||||||
|
createdBy?: string;
|
||||||
|
assignedUserId?: string;
|
||||||
|
creationMode?: 'monitor' | 'manual';
|
||||||
|
|
||||||
|
// Scheduled maintenance
|
||||||
|
isScheduled?: boolean;
|
||||||
|
scheduledStartTime?: number;
|
||||||
|
scheduledEndTime?: number;
|
||||||
|
|
||||||
|
// Post-incident
|
||||||
|
postMortemLink?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Legacy Interface (for backward compatibility)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use IIncident instead
|
||||||
|
*/
|
||||||
|
export interface IIncidentLegacy {
|
||||||
timestamp: number;
|
timestamp: number;
|
||||||
firstResponseTimestamp?: number;
|
firstResponseTimestamp?: number;
|
||||||
/**
|
|
||||||
* indicates
|
|
||||||
*/
|
|
||||||
status: 'discovered' | 'investigating' | 'fixing' | 'fixImplemented' | 'watching' | 'resolved';
|
status: 'discovered' | 'investigating' | 'fixing' | 'fixImplemented' | 'watching' | 'resolved';
|
||||||
creationMode: 'monitor' | 'manual';
|
creationMode: 'monitor' | 'manual';
|
||||||
assignedUserId?: string;
|
assignedUserId?: string;
|
||||||
postMortemLink?: string;
|
postMortemLink?: string;
|
||||||
|
|
||||||
updates: {
|
updates: {
|
||||||
markdownText: string;
|
markdownText: string;
|
||||||
type: 'comment' | 'manualUpdate' | 'automaticUpdate';
|
type: 'comment' | 'manualUpdate' | 'automaticUpdate';
|
||||||
}[];
|
}[];
|
||||||
|
|
||||||
justForLooks: {
|
justForLooks: {
|
||||||
isoTimestamp: string;
|
isoTimestamp: string;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,11 +1,32 @@
|
|||||||
|
// Core types
|
||||||
|
export * from './types.js';
|
||||||
|
|
||||||
|
// Check interfaces (configuration + execution)
|
||||||
|
export * from './checks/index.js';
|
||||||
|
|
||||||
|
// Collections
|
||||||
export * from './checkcollection.js';
|
export * from './checkcollection.js';
|
||||||
export * from './domainsnapshot.js';
|
|
||||||
|
// Incidents
|
||||||
export * from './incident.js';
|
export * from './incident.js';
|
||||||
|
|
||||||
|
// Service status
|
||||||
|
export * from './servicestatus.js';
|
||||||
|
|
||||||
|
// Status page configuration
|
||||||
|
export * from './statuspageconfig.js';
|
||||||
|
|
||||||
|
// Domain and link snapshots
|
||||||
|
export * from './domainsnapshot.js';
|
||||||
export * from './linksnapshot.js';
|
export * from './linksnapshot.js';
|
||||||
|
|
||||||
|
// Property and search
|
||||||
export * from './property.js';
|
export * from './property.js';
|
||||||
export * from './search.js';
|
export * from './search.js';
|
||||||
|
|
||||||
|
// Status (90-day history)
|
||||||
export * from './status.js';
|
export * from './status.js';
|
||||||
|
|
||||||
|
// Re-export checks namespace for convenience
|
||||||
import * as checks from './checks/index.js';
|
import * as checks from './checks/index.js';
|
||||||
|
|
||||||
export { checks };
|
export { checks };
|
||||||
|
|||||||
64
ts/data/servicestatus.ts
Normal file
64
ts/data/servicestatus.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import type { TStatusType, TStatusMode, TCheckType } from './types.js';
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Service Status
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the status of a monitored service.
|
||||||
|
*/
|
||||||
|
export interface IServiceStatus {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
displayName: string;
|
||||||
|
description?: string;
|
||||||
|
|
||||||
|
// Current state
|
||||||
|
currentStatus: TStatusType;
|
||||||
|
lastChecked: number;
|
||||||
|
responseTime: number;
|
||||||
|
|
||||||
|
// Uptime metrics
|
||||||
|
uptime30d: number;
|
||||||
|
uptime90d: number;
|
||||||
|
|
||||||
|
// Organization
|
||||||
|
category?: string;
|
||||||
|
dependencies?: string[];
|
||||||
|
|
||||||
|
// Status management
|
||||||
|
statusMode: TStatusMode;
|
||||||
|
manualStatus?: TStatusType;
|
||||||
|
paused: boolean;
|
||||||
|
|
||||||
|
// Check configuration
|
||||||
|
checkType?: TCheckType;
|
||||||
|
checkCollectionId?: string;
|
||||||
|
intervalMs?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Status History
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A point in the status history timeline.
|
||||||
|
*/
|
||||||
|
export interface IStatusHistoryPoint {
|
||||||
|
timestamp: number;
|
||||||
|
status: TStatusType;
|
||||||
|
responseTime?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Overall Status
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aggregate status for a group of services or entire status page.
|
||||||
|
*/
|
||||||
|
export interface IOverallStatus {
|
||||||
|
status: TStatusType;
|
||||||
|
message?: string;
|
||||||
|
lastUpdated: number;
|
||||||
|
}
|
||||||
57
ts/data/statuspageconfig.ts
Normal file
57
ts/data/statuspageconfig.ts
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import type { IOverallStatus } from './servicestatus.js';
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Service Group
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A group of related services displayed together.
|
||||||
|
*/
|
||||||
|
export interface IServiceGroup {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description?: string;
|
||||||
|
serviceIds: string[];
|
||||||
|
expanded: boolean;
|
||||||
|
order?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Status Page Configuration
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration for a public status page.
|
||||||
|
*/
|
||||||
|
export interface IStatusPageConfig {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
slug: string;
|
||||||
|
|
||||||
|
// Branding
|
||||||
|
logoUrl?: string;
|
||||||
|
faviconUrl?: string;
|
||||||
|
primaryColor?: string;
|
||||||
|
customCss?: string;
|
||||||
|
|
||||||
|
// Content
|
||||||
|
headerTitle: string;
|
||||||
|
headerDescription?: string;
|
||||||
|
footerText?: string;
|
||||||
|
|
||||||
|
// Features
|
||||||
|
showHistoricalUptime: boolean;
|
||||||
|
showResponseTime: boolean;
|
||||||
|
showSubscribeButton: boolean;
|
||||||
|
showIncidentHistory: boolean;
|
||||||
|
|
||||||
|
// Service grouping
|
||||||
|
serviceGroups: IServiceGroup[];
|
||||||
|
|
||||||
|
// Overall status override
|
||||||
|
overallStatus?: IOverallStatus;
|
||||||
|
|
||||||
|
// Custom domain
|
||||||
|
customDomain?: string;
|
||||||
|
sslEnabled?: boolean;
|
||||||
|
}
|
||||||
63
ts/data/types.ts
Normal file
63
ts/data/types.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* Shared type definitions for uptime.link
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Status Types
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status types for monitors/services
|
||||||
|
*/
|
||||||
|
export type TStatusType =
|
||||||
|
| 'operational'
|
||||||
|
| 'degraded'
|
||||||
|
| 'partial_outage'
|
||||||
|
| 'major_outage'
|
||||||
|
| 'maintenance'
|
||||||
|
| 'initializing'
|
||||||
|
| 'error'
|
||||||
|
| 'paused';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check types (discriminant values for TCheck union)
|
||||||
|
*/
|
||||||
|
export type TCheckType = 'assumption' | 'function' | 'pwa' | 'pagerank';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status mode for monitors - auto follows checks, manual is user-set
|
||||||
|
*/
|
||||||
|
export type TStatusMode = 'auto' | 'manual';
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Incident Types
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Incident severity levels
|
||||||
|
*/
|
||||||
|
export type TIncidentSeverity = 'critical' | 'major' | 'minor' | 'maintenance';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Incident status workflow
|
||||||
|
*/
|
||||||
|
export type TIncidentStatus =
|
||||||
|
| 'investigating'
|
||||||
|
| 'identified'
|
||||||
|
| 'monitoring'
|
||||||
|
| 'resolved'
|
||||||
|
| 'postmortem';
|
||||||
|
|
||||||
|
// ============================================
|
||||||
|
// Check Result Types (used by execution)
|
||||||
|
// ============================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result status for check execution
|
||||||
|
*/
|
||||||
|
export type TCheckResultStatus = 'ok' | 'not ok' | 'timed out';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last result state for a check
|
||||||
|
*/
|
||||||
|
export type TCheckLastResult = 'success' | 'failure' | 'pending';
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ICheckCollection } from '../data/checkcollection.js';
|
import type { ICheckCollection } from '../data/checkcollection.js';
|
||||||
import * as plugins from '../ul-interfaces.plugins.js';
|
import * as plugins from '../ul-interfaces.plugins.js';
|
||||||
|
|
||||||
export interface IRequest_CheckExchange
|
export interface IRequest_CheckExchange
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { IDomainSnapshot } from '../data/domainsnapshot.js';
|
import type { IDomainSnapshot } from '../data/domainsnapshot.js';
|
||||||
import { ILinkSnapshot } from '../data/linksnapshot.js';
|
import type { ILinkSnapshot } from '../data/linksnapshot.js';
|
||||||
import * as plugins from '../ul-interfaces.plugins.js';
|
import * as plugins from '../ul-interfaces.plugins.js';
|
||||||
|
|
||||||
export interface IReq_PerformDomainSnapshot
|
export interface IReq_PerformDomainSnapshot
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as plugins from '../ul-interfaces.plugins.js';
|
import * as plugins from '../ul-interfaces.plugins.js';
|
||||||
import * as data from '../data/index.js';
|
import * as data from '../data/index.js';
|
||||||
import { IStatus } from '../data/status.js';
|
import type { IStatus } from '../data/status.js';
|
||||||
|
|
||||||
export interface IRequest_Status_Get
|
export interface IRequest_Status_Get
|
||||||
extends plugins.typedRequestInterfaces.implementsTR<
|
extends plugins.typedRequestInterfaces.implementsTR<
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import * as typedRequestInterfaces from '@apiglobal/typedrequest-interfaces';
|
import * as typedRequestInterfaces from '@api.global/typedrequest-interfaces';
|
||||||
|
|
||||||
export { typedRequestInterfaces };
|
export { typedRequestInterfaces };
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"experimentalDecorators": true,
|
|
||||||
"useDefineForClassFields": false,
|
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"module": "ES2022",
|
"module": "NodeNext",
|
||||||
"moduleResolution": "nodenext",
|
"moduleResolution": "NodeNext",
|
||||||
"esModuleInterop": true
|
"esModuleInterop": true,
|
||||||
}
|
"verbatimModuleSyntax": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"dist_*/**/*.d.ts"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user