From 38d4223cb298a485f68c6da7a6e4b68c20ed2821 Mon Sep 17 00:00:00 2001 From: Ori Erel <116876653+0rierel@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:41:30 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#73532=20init?= =?UTF-8?q?=20types=20and=20test=20for=20Net-snmp=20=20by=20@0rierel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- types/net-snmp/.npmignore | 5 + types/net-snmp/index.d.ts | 748 +++++++++++++++++++++++++++++++ types/net-snmp/net-snmp-tests.ts | 294 ++++++++++++ types/net-snmp/package.json | 20 + types/net-snmp/tsconfig.json | 19 + 5 files changed, 1086 insertions(+) create mode 100644 types/net-snmp/.npmignore create mode 100644 types/net-snmp/index.d.ts create mode 100644 types/net-snmp/net-snmp-tests.ts create mode 100644 types/net-snmp/package.json create mode 100644 types/net-snmp/tsconfig.json diff --git a/types/net-snmp/.npmignore b/types/net-snmp/.npmignore new file mode 100644 index 00000000000000..93e307400a5456 --- /dev/null +++ b/types/net-snmp/.npmignore @@ -0,0 +1,5 @@ +* +!**/*.d.ts +!**/*.d.cts +!**/*.d.mts +!**/*.d.*.ts diff --git a/types/net-snmp/index.d.ts b/types/net-snmp/index.d.ts new file mode 100644 index 00000000000000..587ced8f8a9d26 --- /dev/null +++ b/types/net-snmp/index.d.ts @@ -0,0 +1,748 @@ +/// +import { RemoteInfo } from "dgram"; + +export class Session { + constructor(target: string, authenticator: User, options: SessionOptionsV3); + constructor(target: string, authenticator: string, options: SessionOptions); + constructor(target: string, authenticator: undefined, options: SessionOptions); + + cancelRequests(error: any): void; + + close(): this; + + get(oids: string | string[], responseCb: GetSetCallback): Session; + + getBulk(oids: string[], nonRepeaters: number, maxRepetitions: number, responseCb: GetBulkCallback): this; + getBulk(oids: string[], nonRepeaters: number, responseCb: GetBulkCallback): this; + getBulk(oids: string[], responseCb: GetBulkCallback): this; + + getNext(oids: string[], responseCb: GetSetCallback): this; + + simpleGet( + pduClass: any, + feedCb: (req: Req, message: Message) => void, + varbinds: Varbind[], + responseCb: ResponseCallback, + options?: SimpleGetOptions, + ): void; + + inform(typeOrOid: string | number, varbinds: Varbind[], options: InformOptions, responseCb: ResponseCallback): this; + inform(typeOrOid: string | number, varbinds: Varbind[], responseCb: ResponseCallback): this; + inform(typeOrOid: string | number, options: InformOptions, responseCb: ResponseCallback): this; + inform(typeOrOid: string | number, responseCb: ResponseCallback): this; + onClose(): void; + + onError(error: any): void; + + onMsg(buffer: Buffer): void; + + onProxyResponse(req: Req, message: Message): void; + + onSimpleGetResponse(req: Req, message: Message): void; + + registerRequest(req: Req): void; + + send(req: Req, noWait: boolean): this; + + private sendV3Discovery( + originalPdu: any, + feedCb: (req: Req, message: Message) => void, + responseCb: (error: Error | null, result?: any) => void, + options?: RequestOptions, + ): void; + + private sendV3Req( + pdu: any, + feedCb: (req: Req, message: Message) => void, + responseCb: (error: Error | null, result?: any) => void, + options?: RequestOptions, + port?: number, + allowReport?: boolean, + ): void; + + set(varbinds: Varbind[], responseCb: GetSetCallback): this; + + subtree(oid: string, feedCb: FeedCallback, doneCb: DoneCallback): this; + subtree(oid: string, maxRepetitions: number, feedCb: FeedCallback, doneCb: DoneCallback): this; + + table(oid: string, responseCb: TableCallback): this; + table(oid: string, maxRepetitions: number, responseCb: TableCallback): this; + + tableColumns(oid: string, columns: string[], responseCb: TableColumnsCallback): this; + tableColumns(oid: string, columns: string[], maxRepetitions: number, responseCb: TableColumnsCallback): this; + + trap(typeOrOid: string | number, varbinds: Varbind[], options: TrapOptions, responseCb: TrapCallback): this; + trap(typeOrOid: string | number, varbinds: Varbind[], agentAddr: string, responseCb: TrapCallback): this; + trap(typeOrOid: string | number, varbinds: Varbind[], responseCb: TrapCallback): this; + trap(typeOrOid: string | number, agentAddr: string, responseCb: TrapCallback): this; + trap(typeOrOid: string | number, options: TrapOptions, responseCb: TrapCallback): this; + trap(typeOrOid: string | number, responseCb: TrapCallback): this; + + unregisterRequest(id: number): Req | null; + + userSecurityModelError(req: Req, oid: string): void; + + walk(oid: string, feedCb: FeedCallback, doneCb: DoneCallback): this; + walk(oid: string, maxRepetitions: number, feedCb: FeedCallback, doneCb: DoneCallback): this; + + static create(target: string, community: string, options: SessionOptions): Session; + + static createV3(target: string, user: User, options?: SessionOptionsV3): Session; + + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "message", listener: (buffer: Buffer) => void): this; +} + +export type TableColumnsCallback = (error: Error | null, table?: TableColumnsData) => void; + +export interface TableData { + [columnName: string]: { // e.g., "ifDescr", "ifOperStatus" + [instanceNumber: number]: VarbindValue; + }; +} + +// tableColumns() returns complete table with column numbers as keys +export interface TableColumnsData { + [columnNumber: string]: { // e.g., "2", "7", "8" (column suffixes) + [instanceNumber: number]: VarbindValue; + }; +} + +export type TableCallback = (error: RequestFailedError | null, table?: TableData) => void; +export type TrapCallback = (error: Error | null) => void; + +export interface TrapOptions { + upTime?: number; + agentAddr?: string; + port?: number; +} + +export interface SessionOptions { + version?: 0 | 1; // Version1 | Version2c + transport?: "udp4" | "udp6"; + port?: number; + trapPort?: number; + retries?: number; + timeout?: number; + backoff?: number; + sourceAddress?: string; + sourcePort?: number; + idBitsSize?: number; + context?: string; + backwardsGetNexts?: boolean; + reportOidMismatchErrors?: boolean; + debug?: boolean; + dgramModule?: any; +} +export interface InformOptions extends RequestOptions { + upTime?: number; +} +export type ResponseCallback = (error: RequestInvalidError | ResponseInvalidError | null, varbinds?: Varbind[]) => void; +export type GetSetCallback = (error: ResponseInvalidError | null, varbinds?: Varbind[]) => void; + +export type GetBulkCallback = (error: ResponseInvalidError | null, varbinds?: (Varbind | Varbind[])[]) => void; + +interface Req { + message: Message; + responseCb: ResponseCallback; + retries: number; + timeout: number; + backoff: number; + onResponse: ResponseHandler; + feedCb: FeedHandler; + port: number; + context: string; + originalPdu?: any; + allowReport?: boolean; + timer?: NodeJS.Timeout; + id?: number | string; + proxiedRinfo?: RemoteInfo; + proxiedPduId?: number; + proxiedUser?: User; + proxiedEngine?: any; + proxiedSocket?: any; + + getId(): number | string; +} + +export type ResponseHandler = (req: Req, message: Message) => void; +export type FeedHandler = (req: Req, message: Message) => void; + +export interface ReqConstructor { + new( + session: Session, + message: Message, + feedCb: FeedHandler, + responseCb: ResponseCallback, + options?: RequestOptions, + ): Req; +} +export interface RequestOptions { + port?: number; + context?: string; + timeout?: number; + retries?: number; + backoff?: number; +} +export interface Message { + version: number; + community?: string; + pdu: any; + buffer?: Buffer; + msgGlobalData?: { + msgID: number; + msgMaxSize: number; + msgFlags: number; + msgSecurityModel: number; + }; + msgSecurityParameters?: { + msgAuthoritativeEngineID: Buffer; + msgAuthoritativeEngineBoots: number; + msgAuthoritativeEngineTime: number; + msgUserName: string; + msgAuthenticationParameters: Buffer; + msgPrivacyParameters: Buffer; + }; + user?: User; + encryptedPdu?: Buffer; + disableAuthentication?: boolean; + + // Methods + getReqId(): number; + toBuffer(): Buffer; + toBufferCommunity(): Buffer; + toBufferV3(): Buffer; + processIncomingSecurity(user: User, responseCb: (error: Error | null) => void): boolean; + decryptPdu(user: User, responseCb: (error: Error | null) => void): boolean; + checkAuthentication(user: User, responseCb: (error: Error | null) => void): boolean; + setMsgFlags(bitPosition: number, flag: boolean): void; + hasAuthentication(): boolean; + setAuthentication(flag: boolean): void; + hasPrivacy(): boolean; + setPrivacy(flag: boolean): void; + isReportable(): boolean; + setReportable(flag: boolean): void; + isAuthenticationDisabled(): boolean; + hasAuthoritativeEngineID(): boolean; + createReportResponseMessage(engine: any, context: string): Message; + createResponseForRequest(responsePdu: any): Message; + createCommunityResponseFromRequest(responsePdu: any): Message; + createV3ResponseFromRequest(responsePdu: any): Message; +} +// to do fix buffer types TODO + +interface MessageConstructor { + new(): Message; + + createCommunity(version: number, community: string, pdu: any): Message; + createRequestV3(user: User, msgSecurityParameters: any, pdu: any): Message; + createV3(user: User, msgGlobalData: any, msgSecurityParameters: any, pdu: any): Message; + createDiscoveryV3(pdu: any): Message; + createFromBuffer(buffer: Buffer, user?: User): Message; +} + +// Declare the Message constructor +declare const Message: MessageConstructor; + +export interface SimpleGetOptions extends RequestOptions { + nonRepeaters?: number; + maxRepetitions?: number; +} +export interface User { + name: string; + level: SecurityLevel; + authProtocol?: AuthProtocols; + authKey?: string; + privProtocol?: PrivProtocols; + privKey?: string; +} + +export interface SessionOptionsV3 { + version?: 3; + transport?: "udp4" | "udp6"; + port?: number; + trapPort?: number; + retries?: number; + timeout?: number; + backoff?: number; + sourceAddress?: string; + sourcePort?: number; + idBitsSize?: number; + context?: string; + backwardsGetNexts?: boolean; + reportOidMismatchErrors?: boolean; + engineID?: string | Buffer; + debug?: boolean; + dgramModule?: any; +} + +export type FeedCallback = ((varbinds: Varbind[]) => true) | ((varbinds: Varbind[]) => void); + +export type DoneCallback = (error: Error | null) => void; +export enum AccessControlModelType { + None, + Simple, +} + +export enum AccessLevel { + None, + ReadOnly, + ReadWrite, +} + +export enum AgentXPduType { + Open = 1, + Close, + Register, + Unregister, + Get, + GetNext, + GetBulk, + TestSet, + CommitSet, + UndoSet, + CleanupSet, + Notify, + Ping, + IndexAllocate, + IndexDeallocate, + AddAgentCaps, + RemoveAgentCaps, + Response, +} + +export enum AuthProtocols { + none = 1, + md5 = 2, + sha = 3, + sha224 = 4, + sha256 = 5, + sha384 = 6, + sha512 = 7, +} + +export enum ErrorStatus { + NoError, + TooBig, + NoSuchName, + BadValue, + ReadOnly, + GeneralError, + NoAccess, + WrongType, + WrongLength, + WrongEncoding, + WrongValue, + NoCreation, + InconsistentValue, + ResourceUnavailable, + CommitFailed, + UndoFailed, + AuthorizationError, + NotWritable, + InconsistentName, +} + +export enum MaxAccess { + "not-accessible", + "accessible-for-notify", + "read-only", + "read-write", + "read-create", +} + +export enum MibProviderType { + Scalar, + Table, +} +export enum ObjectType { + Boolean = 1, + Integer, + INTEGER = 2, + Integer32 = 2, + BitString, + OctetString, + "OCTET STRING" = 4, + Null, + OID, + "OBJECT IDENTIFIER" = 7, + IpAddress = 64, + Counter = 65, + Counter32 = Counter, + Gauge = 66, + Gauge32 = Gauge, + Unsigned32 = Gauge32, + TimeTicks = 67, + Opaque = 68, + Counter64 = 70, + NoSuchObject = 128, + NoSuchInstance = 129, + EndOfMibView = 130, +} + +export const OidFormat: { + module: string; + oid: string; + path: string; +}; + +export enum PduType { + GetRequest = 160, + GetNextRequest, + GetResponse, + SetRequest, + Trap, + GetBulkRequest, + InformRequest, + TrapV2, + Report, +} + +export enum PrivProtocols { + none = 1, + des = 2, + aes = 4, + aes256b = 6, + aes256r = 8, +} + +export enum ResponseInvalidCode { + EIp4AddressSize = 1, + EUnknownObjectType, + EUnknownPduType, + ECouldNotDecrypt, + EAuthFailure, + EReqResOidNoMatch, + EOutOfOrder = 8, + EVersionNoMatch, + ECommunityNoMatch, + EUnexpectedReport, + EResponseNotHandled, + EUnexpectedResponse, +} + +export enum RowStatus { + active = 1, + notInService, + notReady, + createAndGo, + createAndWait, + destroy, +} + +export enum SecurityLevel { + noAuthNoPriv = 1, + authNoPriv, + authPriv, +} + +export enum TrapType { + ColdStart, + WarmStart, + LinkDown, + LinkUp, + AuthenticationFailure, + EgpNeighborLoss, + EnterpriseSpecific, +} +export const Version1: 0; + +export const Version2c: 1; + +export const Version3: 3; + +export const Version: { + "1": typeof Version1; + "2c": typeof Version2c; + "3": typeof Version3; +}; + +export interface RequestFailedError extends Error { + name: "RequestFailedError"; + message: string; + status: ErrorStatus; +} + +export const RequestFailedError: { + new(message: string, status: ErrorStatus): RequestFailedError; + prototype: RequestFailedError; +}; + +export interface RequestTimedOutError extends Error { + name: "RequestTimedOutError"; +} + +export interface ResponseInvalidError extends Error { + name: "ResponseInvalidError"; + code: ResponseInvalidCode; + info?: any; +} + +export interface RequestInvalidError extends Error { + name: "RequestInvalidError"; +} + +export const ResponseInvalidError: { + new(message: string, code: ResponseInvalidCode, info?: any): ResponseInvalidError; + prototype: ResponseInvalidError; +}; +export function createAgent(options: any, callback: any, mib?: any): any; + +export function createMib(options?: MibOptions): any; +export interface MibOptions { + addScalarDefaultsOnRegistration?: boolean; +} + +export function createModuleStore(options?: ModuleStoreOptions): any; + +export interface ModuleStoreOptions { + baseModules?: string[]; +} + +export function createReceiver(options: any, callback: any): any; + +declare function createSession(target?: string, community?: string, options?: SessionOptions): Session; +declare namespace createSession { + const prototype: {}; +} + +export { createSession }; + +export function createSubagent(options: any): any; + +declare function createV3Session(target: string, user: User, options?: SessionOptionsV3): Session; + +declare namespace createV3Session { + const prototype: {}; +} + +export { createV3Session }; +export function isVarbindError(varbind: Varbind): boolean; + +export function varbindError(varbind: Varbind): string; + +export interface Varbind { + oid: string; + type?: ObjectType; + value?: VarbindValue; + errorStatus?: ErrorStatus; +} + +export type VarbindValue = + | string // ifDescr, ifAlias, sysDescr + | number // ifOperStatus, ifAdminStatus, ifIndex + | bigint // ifHCInOctets, ifHCOutOctets (64-bit counters) + | boolean // TruthValue + | Buffer // Raw data + | null // Missing values + | undefined; + +export namespace Authentication { + const HMAC_BUFFER_SIZE: number; + + const algorithms: { + readonly [AuthProtocols.none]: undefined; // none has no algorithm + readonly [AuthProtocols.md5]: { + KEY_LENGTH: 16; + AUTHENTICATION_CODE_LENGTH: 12; + CRYPTO_ALGORITHM: "md5"; + }; + readonly [AuthProtocols.sha]: { + KEY_LENGTH: 20; + AUTHENTICATION_CODE_LENGTH: 12; + CRYPTO_ALGORITHMF: "sha1"; + }; + readonly [AuthProtocols.sha224]: { + KEY_LENGTH: 28; + AUTHENTICATION_CODE_LENGTH: 16; + CRYPTO_ALGORITHM: "sha224"; + }; + readonly [AuthProtocols.sha256]: { + KEY_LENGTH: 32; + AUTHENTICATION_CODE_LENGTH: 24; + CRYPTO_ALGORITHM: "sha256"; + }; + readonly [AuthProtocols.sha384]: { + KEY_LENGTH: 48; + AUTHENTICATION_CODE_LENGTH: 32; + CRYPTO_ALGORITHM: "sha384"; + }; + readonly [AuthProtocols.sha512]: { + KEY_LENGTH: 64; + AUTHENTICATION_CODE_LENGTH: 48; + CRYPTO_ALGORITHM: "sha512"; + }; + }; + + const authToKeyCache: { + [key: string]: Buffer; + }; + + function calculateDigest( + messageBuffer: Buffer, + authProtocol: Exclude, + authPassword: string, + engineID: Buffer, + ): Buffer; + + function computeCacheKey(authProtocol: AuthProtocols, authPasswordString: string, engineID: Buffer): string; + + function getParametersLength(authProtocol: Exclude): number; + + function isAuthentic( + messageBuffer: Buffer, + authProtocol: AuthProtocols, + authPassword: string, + engineID: Buffer, + digestInMessage: Buffer, + ): boolean; + + function passwordToKey( + authProtocol: Exclude, + authPasswordString: string, + engineID: Buffer, + ): Buffer; + + function writeParameters( + messageBuffer: Buffer, + authProtocol: Exclude, + authPassword: string, + engineID: Buffer, + digestInMessage: Buffer, + ): void; +} + +export namespace Encryption { + const algorithms: { + readonly [PrivProtocols.des]: { + BLOCK_LENGTH: 8; + CRYPTO_ALGORITHM: "des-cbc"; + KEY_LENGTH: 8; + decryptPdu: typeof Encryption.decryptPduDes; + encryptPdu: typeof Encryption.encryptPduDes; + localizationAlgorithm: typeof Encryption.generateLocalizedKey; + }; + readonly [PrivProtocols.aes]: { + BLOCK_LENGTH: 16; + CRYPTO_ALGORITHM: "aes-128-cfb"; + KEY_LENGTH: 16; + decryptPdu: typeof Encryption.decryptPduAes; + encryptPdu: typeof Encryption.encryptPduAes; + localizationAlgorithm: typeof Encryption.generateLocalizedKey; + }; + readonly [PrivProtocols.aes256b]: { + BLOCK_LENGTH: 16; + CRYPTO_ALGORITHM: "aes-256-cfb"; + KEY_LENGTH: 32; + decryptPdu: typeof Encryption.decryptPduAes; + encryptPdu: typeof Encryption.encryptPduAes; + localizationAlgorithm: typeof Encryption.generateLocalizedKeyBlumenthal; + }; + readonly [PrivProtocols.aes256r]: { + BLOCK_LENGTH: 16; + CRYPTO_ALGORITHM: "aes-256-cfb"; + KEY_LENGTH: 32; + decryptPdu: typeof Encryption.decryptPduAes; + encryptPdu: typeof Encryption.encryptPduAes; + localizationAlgorithm: typeof Encryption.generateLocalizedKeyReeder; + }; + }; + + function decryptPduDes( + encryptedPdu: Buffer, + privProtocol: PrivProtocols, + privParameters: Buffer, + privPassword: string, + authProtocol: AuthProtocols, + engine: Algorithm, + ): Buffer; + + function encryptPduDes( + scopedPdu: Buffer, + privProtocol: PrivProtocols, + privPassword: string, + authProtocol: AuthProtocols, + engine: Algorithm, + ): { encryptedPdu: Buffer; msgPrivacyParameters: Buffer }; + + function decryptPduAes( + encryptedPdu: Buffer, + privProtocol: PrivProtocols, + privParameters: Buffer, + privPassword: string, + authProtocol: AuthProtocols, + engine: Algorithm, + ): Buffer; + + function encryptPduAes( + scopedPdu: Buffer, + privProtocol: PrivProtocols, + privPassword: string, + authProtocol: AuthProtocols, + engine: Algorithm, + ): { encryptedPdu: Buffer; msgPrivacyParameters: Buffer }; + + function generateLocalizedKey( + algorithm: Algorithm, + authProtocol: AuthProtocols, + privPassword: string, + engineID: Buffer, + ): Buffer; + + function generateLocalizedKeyBlumenthal( + algorithm: Algorithm, + authProtocol: AuthProtocols, + privPassword: string, + engineID: Buffer, + ): Buffer; + + function generateLocalizedKeyReeder( + algorithm: Algorithm, + authProtocol: AuthProtocols, + privPassword: string, + engineID: Buffer, + ): Buffer; +} +interface Algorithm { + readonly BLOCK_LENGTH: number; + readonly CRYPTO_ALGORITHM: string; + readonly KEY_LENGTH: number; + readonly decryptPdu: typeof Encryption.decryptPduAes; + readonly encryptPdu: typeof Encryption.encryptPduAes; + readonly localizationAlgorithm: typeof Encryption.generateLocalizedKey; +} + +// module asn1-ber doesn't have type support so we to create completing type for the buffer used in Object Parser +declare class BerReader { + readInt(): number; + readString(type?: number, explicit?: boolean): string | Buffer; + readBoolean(): boolean; + readBitString(): string; + readOID(): string; + readByte(): number; + readSequence(): number; + peek(): number | null; + readBuffer(type: number, explicit?: boolean): Buffer; + readLength(): number; +} + +export namespace ObjectParser { + function readInt32(buffer: BerReader): number; + + function readUint32(buffer: BerReader): number; + + function readUint64(buffer: BerReader): bigint | string; +} + +export namespace ObjectTypeUtil { + function castSetValue(type: any, value: any, constraints: any): any; + + function doesIntegerMeetConstraints(value: any, constraints: any): boolean; + + function doesStringMeetConstraints(value: any, constraints: any): boolean; + + function getEnumerationNumberFromName(enumeration: any, name: any): any; + + function isValid(type: ObjectType, value: any, constraints: any): boolean; +} diff --git a/types/net-snmp/net-snmp-tests.ts b/types/net-snmp/net-snmp-tests.ts new file mode 100644 index 00000000000000..659953e3b49da3 --- /dev/null +++ b/types/net-snmp/net-snmp-tests.ts @@ -0,0 +1,294 @@ +import { + AccessControlModelType, + AccessLevel, + AgentXPduType, + Authentication, + AuthProtocols, + createAgent, + createMib, + createReceiver, + createSession, + createSubagent, + createV3Session, + Encryption, + ErrorStatus, + isVarbindError, + MaxAccess, + MibProviderType, + ObjectParser, + ObjectType, + ObjectTypeUtil, + OidFormat, + PduType, + PrivProtocols, + RequestFailedError, + ResponseInvalidError, + RowStatus, + SecurityLevel, + TrapType, + Varbind, + varbindError, + Version, + Version1, + Version2c, + Version3, +} from "net-snmp"; + +// Basic successful cases +const V3Session1 = createV3Session("127.0.0.1", { + name: "testuser", + level: SecurityLevel.authPriv, + authProtocol: AuthProtocols.sha, + authKey: "authkey123", + privProtocol: PrivProtocols.aes, + privKey: "privkey123", +}); + +const V3Session2 = createV3Session("localhost", { + name: "testuser2", + level: SecurityLevel.noAuthNoPriv, +}); + +// With options +const V3Session3 = createV3Session( + "192.168.1.1", + { + name: "testuser3", + level: SecurityLevel.authNoPriv, + authProtocol: AuthProtocols.md5, + authKey: "authkey456", + }, + { + port: 1610, + timeout: 3000, + retries: 2, + }, +); + +// Should error cases +// @ts-expect-error - missing required user properties +const sessionError1 = createV3Session("127.0.0.1", {}); + +const sessionError2 = createV3Session( + "127.0.0.1", + { + name: "testuser", + level: SecurityLevel.authPriv, + }, + // @ts-expect-error - invalid version in options + { version: 2 }, +); + +const sessionError3 = createV3Session( + "127.0.0.1", + { + name: "testuser", + level: SecurityLevel.authPriv, + }, + // @ts-expect-error - invalid transport + { transport: "tcp" }, +); + +const sessionError4 = createV3Session("127.0.0.1", { + name: "testuser", + level: SecurityLevel.authPriv, + // @ts-expect-error - invalid auth protocol + authProtocol: "invalid-protocol", +}); + +// Test that returned session has expected methods +V3Session1.get("1.3.6.1.2.1.1.1.0", (_error: ResponseInvalidError | null, _varbinds?: Varbind[]) => {}); +V3Session1.getBulk( + ["1.3.6.1.2.1.1.1.0"], + 0, + 10, + (_error: ResponseInvalidError | null, _varbinds?: (Varbind | Varbind[])[]) => {}, +); +V3Session1.getBulk( + ["1.3.6.1.2.1.1.1.0"], + // @ts-expect-error - invalid order + (_error: ResponseInvalidError | null, _varbinds?: (Varbind | Varbind[])[]) => {}, + 10, +); +V3Session1.getNext(["1.3.6.1.2.1.1.1.0"], (_error: ResponseInvalidError | null, _varbinds?: Varbind[]) => {}); +V3Session2.close(); +V3Session3.set( + [ + { + oid: "1.3.6.1.2.1.1.5.0", + type: ObjectType.OctetString, + value: "test", + }, + ], + (_error: any, _varbinds?: Varbind[]) => {}, +); + +// Minimal valid call - all optional parameters omitted +const session1 = createSession(); + +// Only target provided +const session2 = createSession("127.0.0.1"); + +// Target and community provided +const session3 = createSession("127.0.0.1", "public"); + +// All parameters provided +const session4 = createSession("localhost", "private", { + version: 1, // Version2c + timeout: 2000, +}); + +// Invalid cases +// @ts-expect-error - invalid version (must be 0 or 1) +createSession(undefined, undefined, { version: 3 }); + +// @ts-expect-error - invalid transport type +createSession(undefined, undefined, { transport: "tcp" }); + +// @ts-expect-error - community must be string if provided +createSession("127.0.0.1", 12345); + +// Verify returned Session type has expected methods +session1.get("1.3.6.1.2.1.1.1.0", (_error: any, _varbinds?: Varbind[]) => {}); +session4.close(); + +// Additional tests for higher coverage + +// Test Varbind validation +const validVarbind: Varbind = { + oid: "1.3.6.1.2.1.1.1.0", + type: ObjectType.OctetString, + value: "test value", +}; + +// @ts-expect-error - missing required oid +const invalidVarbind1: Varbind = { + type: ObjectType.OctetString, + value: "test value", +}; + +const invalidVarbind2: Varbind = { + // @ts-expect-error - wrong OID type + oid: 12345, + type: ObjectType.OctetString, + value: "test value", +}; + +// Test varbind utility functions +const isError = isVarbindError(validVarbind); +const errorMsg = varbindError(validVarbind); + +// Test Authentication namespace +const authDigest = Authentication.calculateDigest( + Buffer.from("test"), + AuthProtocols.sha, + "password", + Buffer.from("engine123"), +); + +const authKey = Authentication.passwordToKey(AuthProtocols.sha, "password", Buffer.from("engine123")); + +// Test Encryption namespace +const encryptedData = Encryption.encryptPduAes( + Buffer.from("test"), + PrivProtocols.aes, + "privpassword", + AuthProtocols.sha, + Encryption.algorithms[PrivProtocols.aes], +); + +// Test ObjectTypeUtil namespace +const isValid = ObjectTypeUtil.isValid(ObjectType.OctetString, "test", {}); +const castValue = ObjectTypeUtil.castSetValue(ObjectType.Integer, "123", {}); + +// Test enum values +const pduType: PduType = PduType.GetRequest; +const errorStatus: ErrorStatus = ErrorStatus.NoError; +const trapType: TrapType = TrapType.ColdStart; +const rowStatus: RowStatus = RowStatus.active; +const maxAccess: MaxAccess = MaxAccess["read-only"]; +const agentXPduType: AgentXPduType = AgentXPduType.Open; +const accessControlModel: AccessControlModelType = AccessControlModelType.Simple; +const accessLevel: AccessLevel = AccessLevel.ReadOnly; +const mibProviderType: MibProviderType = MibProviderType.Scalar; + +// Test version constants +const version1: 0 = Version1; +const version2c: 1 = Version2c; +const version3: 3 = Version3; +const versionObj = Version["2c"]; + +// Test OidFormat +const oidFormat = OidFormat; + +// Test error classes +const requestFailedError = new RequestFailedError("Test error", ErrorStatus.TooBig); +const responseInvalidError = new ResponseInvalidError("Test error", 1, { additional: "info" }); + +// Test other creation functions +const agent = createAgent({}, () => {}); +const mib = createMib(); +const receiver = createReceiver({}, () => {}); +const subagent = createSubagent({}); + +// Test session event handlers +session1.on("close", () => {}); +session1.on("error", (_err: Error) => {}); +session1.on("message", (_buffer: Buffer) => {}); + +// Test invalid callback signatures +// @ts-expect-error - wrong callback signature for get +session1.get("1.3.6.1.2.1.1.1.0", (_error: string) => {}); + +// @ts-expect-error - wrong callback signature for set +session1.set([{ oid: "1.3.6.1.2.1.1.1.0", value: "test" }], (_error: string, _result: number) => {}); + +// Test invalid options for createSession +// @ts-expect-error - invalid option +createSession("127.0.0.1", "public", { invalidOption: true }); + +// Test invalid options for createV3Session +// @ts-expect-error - invalid option +createV3Session("127.0.0.1", { name: "test", level: SecurityLevel.noAuthNoPriv }, { invalidOption: true }); + +session3.walk( + "1.3.6.1.2.1.1", + (varbinds) => { + console.log(varbinds); + return false; // continue walking + }, + (error) => { + if (error) console.error(error); + }, +); + +// Test all overloads +V3Session1.table("1.3.6.1.2.1.1", (_error, _table) => {}); + +V3Session1.table("1.3.6.1.2.1.1", 50, (_error, _table) => {}); + +// Invalid cases +// @ts-expect-error - missing callback +V3Session1.table("1.3.6.1.2.1.1"); + +// @ts-expect-error - invalid maxRepetitions type +V3Session1.table("1.3.6.1.2.1.1", "invalid", (_error, _table) => {}); + +V3Session1.subtree( + "1.3.6.1.2.1.1", + (_varbinds) => {}, + (_error) => {}, +); +V3Session1.subtree( + "1.3.6.1.2.1.1", + 30, + (_varbinds) => {}, + (_error) => {}, +); + +// Invalid cases +// @ts-expect-error - missing done callback +V3Session1.subtree("1.3.6.1.2.1.1", (_varbinds) => {}); + +// @ts-expect-error - missing feed callback +V3Session1.subtree("1.3.6.1.2.1.1", (_error) => {}); diff --git a/types/net-snmp/package.json b/types/net-snmp/package.json new file mode 100644 index 00000000000000..f753f364f4f9b4 --- /dev/null +++ b/types/net-snmp/package.json @@ -0,0 +1,20 @@ +{ + "private": true, + "name": "@types/net-snmp", + "version": "3.23.9999", + "projects": [ + "https://github.com/markabrahams/node-net-snmp#readme" + ], + "devDependencies": { + "@types/net-snmp": "workspace:." + }, + "dependencies": { + "@types/node": "^24.3.0" + }, + "owners": [ + { + "name": "Ori Erel", + "githubUsername": "0rierel" + } + ] +} diff --git a/types/net-snmp/tsconfig.json b/types/net-snmp/tsconfig.json new file mode 100644 index 00000000000000..3bd29be26fed8d --- /dev/null +++ b/types/net-snmp/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "node16", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "net-snmp-tests.ts" + ] +} From f68bc9a1d2266d17ea290838608cb1a33be4916b Mon Sep 17 00:00:00 2001 From: Jimmy Leung <43258070+hkleungai@users.noreply.github.com> Date: Wed, 3 Sep 2025 22:44:15 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#73409=20feat(s?= =?UTF-8?q?emver):=20identifierBase=20for=20inc()=20&=20throwErrors=20for?= =?UTF-8?q?=20parse()=20&=20jsdoc=20by=20@hkleungai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- types/semver/classes/semver.d.ts | 7 ++- types/semver/functions/compare-loose.d.ts | 3 ++ types/semver/functions/inc.d.ts | 7 +-- types/semver/functions/parse.d.ts | 15 +++++- types/semver/index.d.ts | 19 ++++--- types/semver/semver-tests.ts | 64 ++++++++++++++++++++--- 6 files changed, 95 insertions(+), 20 deletions(-) diff --git a/types/semver/classes/semver.d.ts b/types/semver/classes/semver.d.ts index 2112e2c9b7451e..4343d5ebda694c 100644 --- a/types/semver/classes/semver.d.ts +++ b/types/semver/classes/semver.d.ts @@ -1,4 +1,5 @@ import semver = require("../index"); +import inc = require("../functions/inc"); declare class SemVer { constructor(version: string | SemVer, optionsOrLoose?: boolean | semver.RangeOptions); @@ -56,7 +57,11 @@ declare class SemVer { */ compareBuild(other: string | SemVer): 1 | 0 | -1; - inc(release: semver.ReleaseType, identifier?: string): SemVer; + inc( + release: semver.ReleaseType, + identifier?: string, + identifierBase?: inc.IdentifierBase, + ): SemVer; toString(): string; } diff --git a/types/semver/functions/compare-loose.d.ts b/types/semver/functions/compare-loose.d.ts index 140d6cf14ae1c8..02de19af590a3d 100644 --- a/types/semver/functions/compare-loose.d.ts +++ b/types/semver/functions/compare-loose.d.ts @@ -1,5 +1,8 @@ import SemVer = require("../classes/semver"); +/** + * Short for compare(v1, v2, { loose: true }) + */ declare function compareLoose(v1: string | SemVer, v2: string | SemVer): 1 | 0 | -1; export = compareLoose; diff --git a/types/semver/functions/inc.d.ts b/types/semver/functions/inc.d.ts index 87ccf50509a21b..e556f5ac5c15b2 100644 --- a/types/semver/functions/inc.d.ts +++ b/types/semver/functions/inc.d.ts @@ -3,7 +3,7 @@ import semver = require("../index"); declare namespace inc { /** Base number to be used for the prerelease identifier */ - type IdentifierBase = "0" | "1"; + type IdentifierBase = "0" | "1" | false; } /** @@ -14,12 +14,13 @@ declare function inc( release: semver.ReleaseType, optionsOrLoose?: boolean | semver.Options, identifier?: string, + identifierBase?: inc.IdentifierBase, ): string | null; declare function inc( version: string | SemVer, release: semver.ReleaseType, - identifier?: string, - identifierBase?: inc.IdentifierBase | false, + identifier: string, + identifierBase?: inc.IdentifierBase, ): string | null; export = inc; diff --git a/types/semver/functions/parse.d.ts b/types/semver/functions/parse.d.ts index d333fd3a3b8db5..21ed06d3bc2ef3 100644 --- a/types/semver/functions/parse.d.ts +++ b/types/semver/functions/parse.d.ts @@ -2,11 +2,22 @@ import SemVer = require("../classes/semver"); import semver = require("../index"); /** - * Return the parsed version as a SemVer object, or null if it's not valid. + * Return the parsed version as a `SemVer` object. + * + * In case `version` is invalid, the function will + * - throw if `throwErrors` is `true`. + * - return `null` otherwise. */ +declare function parse(version?: string | SemVer | null): SemVer | null; declare function parse( version: string | SemVer | null | undefined, - optionsOrLoose?: boolean | semver.Options, + optionsOrLoose: boolean | semver.Options, + throwErrors: true, +): SemVer; +declare function parse( + version: string | SemVer | null | undefined, + optionsOrLoose: boolean | semver.Options, + throwErrors?: boolean, ): SemVer | null; export = parse; diff --git a/types/semver/index.d.ts b/types/semver/index.d.ts index 341d4cfb885f4b..eb0721baa54e8e 100644 --- a/types/semver/index.d.ts +++ b/types/semver/index.d.ts @@ -111,16 +111,23 @@ export interface RangeOptions extends Options { includePrerelease?: boolean | undefined; } export interface CoerceOptions extends Options { - includePrerelease?: boolean | undefined; /** - * Used by `coerce()` to coerce from right to left. + * If the `options.includePrerelease` flag is set, then the `coerce` result will contain + * prerelease and build parts of a version. For example, `1.2.3.4-rc.1+rev.2` + * will preserve prerelease `rc.1` and build `rev.2` in the result. * * @default false + * @since 7.6.0 + */ + includePrerelease?: boolean | undefined; + /** + * If the `options.rtl` flag is set, then `coerce` will return the right-most + * coercible tuple that does not share an ending index with a longer coercible + * tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not + * `4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of + * any other overlapping SemVer tuple. * - * @example - * coerce('1.2.3.4', { rtl: true }); - * // => SemVer { version: '2.3.4', ... } - * + * @default false * @since 6.2.0 */ rtl?: boolean | undefined; diff --git a/types/semver/semver-tests.ts b/types/semver/semver-tests.ts index 6988e73e9b360a..8c2220bf4deb9b 100644 --- a/types/semver/semver-tests.ts +++ b/types/semver/semver-tests.ts @@ -90,12 +90,12 @@ semverValid(semverCoerce("42.6.7.9.3-alpha")); // $ExpectType string | null // v6 tests -let bool: boolean; +declare let bool: boolean; let num: number; // $ExpectType string let str = String(Math.random()); // $ExpectType string | null -let strn: string | null = Math.random() < 0.5 ? null : str; +let strn: string | null = bool ? null : str; let diff: semver.ReleaseType | null; const op: semver.Operator = ""; // declare const arr: any[]; @@ -113,15 +113,47 @@ const version = ""; const versions: string[] = []; const loose = true; // $ExpectType SemVer | null -let sem: semver.SemVer | null = Math.random() < 0.5 ? new semver.SemVer(str, {}) : null; +let sem: semver.SemVer | null = bool ? new semver.SemVer(str, {}) : null; // $ExpectType string | SemVer | null | undefined -const anyVersion = Math.random() < 0.5 ? undefined : Math.random() < 0.5 ? strn : sem; +const anyVersion = bool ? undefined : bool ? strn : sem; sem = new semver.SemVer(str, { includePrerelease: false }); sem = new semver.SemVer(str, { loose: true }); -sem = semver.parse(str); +sem = sem.inc("prerelease", "beta"); +sem = sem.inc("prerelease", "beta", "0"); +sem = sem.inc("prerelease", "beta", "1"); +sem = sem.inc("prerelease", "beta", false); + +// $ExpectType SemVer | null +semver.parse( + bool ? str : bool ? sem : bool ? null : undefined, +); +// $ExpectType SemVer | null +semver.parse( + bool ? str : bool ? sem : bool ? null : undefined, + bool ? { loose: false } : false, +); +// $ExpectType SemVer | null +semver.parse( + bool ? str : bool ? sem : bool ? null : undefined, + bool ? { loose: false } : false, + false, +); +// $ExpectType SemVer +semver.parse( + bool ? str : bool ? sem : bool ? null : undefined, + bool ? { loose: false } : false, + true, +); +// $ExpectType SemVer | null +semver.parse( + bool ? str : bool ? sem : bool ? null : undefined, + bool ? { loose: false } : false, + bool, +); + strn = semver.valid(str); strn = semver.clean(str); @@ -129,46 +161,62 @@ strn = semver.valid(str, loose); strn = semver.valid(str, { loose: false }); // @ts-expect-error strn = semver.valid(str, { includePrerelease: false }); + strn = semver.clean(str, loose); strn = semver.clean(str, { loose: false }); // @ts-expect-error strn = semver.clean(str, { includePrerelease: false }); + strn = semver.inc(str, "major", loose); strn = semver.inc(str, "major", { loose: false }); // @ts-expect-error strn = semver.inc(str, "major", { includePrerelease: false }); + strn = semver.inc(str, "premajor", loose); strn = semver.inc(str, "premajor", { loose: false }); // @ts-expect-error strn = semver.inc(str, "premajor", { includePrerelease: false }); + strn = semver.inc(str, "minor", loose); strn = semver.inc(str, "minor", { loose: false }); // @ts-expect-error strn = semver.inc(str, "minor", { includePrerelease: false }); + strn = semver.inc(str, "preminor", loose); strn = semver.inc(str, "preminor", { loose: false }); // @ts-expect-error strn = semver.inc(str, "preminor", { includePrerelease: false }); + strn = semver.inc(str, "patch", loose); strn = semver.inc(str, "patch", { loose: false }); // @ts-expect-error strn = semver.inc(str, "patch", { includePrerelease: false }); + strn = semver.inc(str, "prepatch", loose); strn = semver.inc(str, "prepatch", { loose: false }); // @ts-expect-error strn = semver.inc(str, "prepatch", { includePrerelease: false }); + strn = semver.inc(str, "prerelease", loose); strn = semver.inc(str, "prerelease", { loose: false }); // @ts-expect-error strn = semver.inc(str, "prerelease", { includePrerelease: false }); + strn = semver.inc(str, "prerelease", loose, "alpha"); +strn = semver.inc(str, "prerelease", loose, "alpha", "0"); +strn = semver.inc(str, "prerelease", loose, "alpha", "1"); +strn = semver.inc(str, "prerelease", loose, "alpha", false); strn = semver.inc(str, "prerelease", { loose: false }, "alpha"); +strn = semver.inc(str, "prerelease", { loose: false }, "alpha", "0"); +strn = semver.inc(str, "prerelease", { loose: false }, "alpha", "1"); +strn = semver.inc(str, "prerelease", { loose: false }, "alpha", false); // @ts-expect-error strn = semver.inc(str, "prerelease", { includePrerelease: false }, "alpha"); strn = semver.inc(str, "prerelease", "beta"); -strn = semver.inc("1.2.3", "prerelease", "alpha", "0"); -strn = semver.inc("1.2.3", "prerelease", "alpha", "1"); -strn = semver.inc("1.2.3", "prerelease", "beta", false); +strn = semver.inc(str, "prerelease", "beta", "0"); +strn = semver.inc(str, "prerelease", "beta", "1"); +strn = semver.inc(str, "prerelease", "beta", false); + let res: string | null = semver.inc("1.2.3", "release"); // $ExpectType string | null num = semver.major(str, loose); num = semver.major(str, { loose: false }); From 76d86f768759ce611a02e97c28cee96b562cdceb Mon Sep 17 00:00:00 2001 From: Jimmy Leung <43258070+hkleungai@users.noreply.github.com> Date: Wed, 3 Sep 2025 22:44:45 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#73586=20feat(w?= =?UTF-8?q?indows-1251):=20remove=20types=20by=20@hkleungai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notNeededPackages.json | 4 ++++ types/windows-1251/.npmignore | 5 ----- types/windows-1251/index.d.ts | 19 ------------------- types/windows-1251/package.json | 17 ----------------- types/windows-1251/tsconfig.json | 19 ------------------- types/windows-1251/windows-1251-tests.ts | 15 --------------- 6 files changed, 4 insertions(+), 75 deletions(-) delete mode 100644 types/windows-1251/.npmignore delete mode 100644 types/windows-1251/index.d.ts delete mode 100644 types/windows-1251/package.json delete mode 100644 types/windows-1251/tsconfig.json delete mode 100644 types/windows-1251/windows-1251-tests.ts diff --git a/notNeededPackages.json b/notNeededPackages.json index a1615d5137b17e..85e01e2fac04c1 100644 --- a/notNeededPackages.json +++ b/notNeededPackages.json @@ -8051,6 +8051,10 @@ "libraryName": "wikidata-sdk", "asOfVersion": "6.1.0" }, + "windows-1251": { + "libraryName": "windows-1251", + "asOfVersion": "3.0.4" + }, "windows-foreground-love": { "libraryName": "windows-foreground-love", "asOfVersion": "0.3.1" diff --git a/types/windows-1251/.npmignore b/types/windows-1251/.npmignore deleted file mode 100644 index 93e307400a5456..00000000000000 --- a/types/windows-1251/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -* -!**/*.d.ts -!**/*.d.cts -!**/*.d.mts -!**/*.d.*.ts diff --git a/types/windows-1251/index.d.ts b/types/windows-1251/index.d.ts deleted file mode 100644 index 6ad8e2046c81e5..00000000000000 --- a/types/windows-1251/index.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare var windows1251: { - encode(input: string, options?: { mode?: windows1251.EncoderMode | undefined }): string; - decode(text: string, options?: { mode?: windows1251.DecoderMode | undefined }): string; - version: string; - labels: string[]; -}; - -export = windows1251; -export as namespace windows1251; - -declare namespace windows1251 { - type EncoderMode = "fatal" | "html"; - type DecoderMode = "replacement" | "fatal"; - - interface windows1251 { - encode(input: string, options?: { mode?: EncoderMode | undefined }): string; - decode(text: string, options?: { mode?: DecoderMode | undefined }): string; - } -} diff --git a/types/windows-1251/package.json b/types/windows-1251/package.json deleted file mode 100644 index 19cce2d8b5ef8b..00000000000000 --- a/types/windows-1251/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "private": true, - "name": "@types/windows-1251", - "version": "0.1.9999", - "projects": [ - "https://github.com/mathiasbynens/windows-1251" - ], - "devDependencies": { - "@types/windows-1251": "workspace:." - }, - "owners": [ - { - "name": "RomanGolovanov", - "githubUsername": "RomanGolovanov" - } - ] -} diff --git a/types/windows-1251/tsconfig.json b/types/windows-1251/tsconfig.json deleted file mode 100644 index 4f11991be92fd2..00000000000000 --- a/types/windows-1251/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "module": "node16", - "lib": [ - "es6" - ], - "noImplicitAny": true, - "noImplicitThis": true, - "strictNullChecks": true, - "strictFunctionTypes": true, - "types": [], - "noEmit": true, - "forceConsistentCasingInFileNames": true - }, - "files": [ - "index.d.ts", - "windows-1251-tests.ts" - ] -} diff --git a/types/windows-1251/windows-1251-tests.ts b/types/windows-1251/windows-1251-tests.ts deleted file mode 100644 index e39d3366a9ccb9..00000000000000 --- a/types/windows-1251/windows-1251-tests.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as windows1251 from "windows-1251"; - -var text: string = "some text", byteString: string, decodedText: string; - -var version: string = windows1251.version; - -var labels: string[] = windows1251.labels; - -byteString = windows1251.encode(text); -byteString = windows1251.encode(text, { mode: "html" }); -byteString = windows1251.encode(text, { mode: "fatal" }); - -decodedText = windows1251.decode(byteString); -decodedText = windows1251.decode(byteString, { mode: "fatal" }); -decodedText = windows1251.decode(byteString, { mode: "replacement" }); From 19965dbe356dfbf91709f8d5bbdc53e3b0b3a870 Mon Sep 17 00:00:00 2001 From: Jimmy Leung <43258070+hkleungai@users.noreply.github.com> Date: Wed, 3 Sep 2025 22:45:06 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#73587=20feat(r?= =?UTF-8?q?eact-timeago):=20remove=20types=20by=20@hkleungai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notNeededPackages.json | 4 ++ types/react-timeago/.npmignore | 5 -- types/react-timeago/index.d.ts | 42 ------------- types/react-timeago/package.json | 24 -------- types/react-timeago/react-timeago-tests.tsx | 66 --------------------- types/react-timeago/tsconfig.json | 22 ------- 6 files changed, 4 insertions(+), 159 deletions(-) delete mode 100644 types/react-timeago/.npmignore delete mode 100644 types/react-timeago/index.d.ts delete mode 100644 types/react-timeago/package.json delete mode 100644 types/react-timeago/react-timeago-tests.tsx delete mode 100644 types/react-timeago/tsconfig.json diff --git a/notNeededPackages.json b/notNeededPackages.json index 85e01e2fac04c1..757349c084669a 100644 --- a/notNeededPackages.json +++ b/notNeededPackages.json @@ -6419,6 +6419,10 @@ "libraryName": "react-time-picker", "asOfVersion": "6.0.0" }, + "react-timeago": { + "libraryName": "react-timeago", + "asOfVersion": "8.0.0" + }, "react-toast-notifications": { "libraryName": "react-toast-notifications", "asOfVersion": "2.4.1" diff --git a/types/react-timeago/.npmignore b/types/react-timeago/.npmignore deleted file mode 100644 index 93e307400a5456..00000000000000 --- a/types/react-timeago/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -* -!**/*.d.ts -!**/*.d.cts -!**/*.d.mts -!**/*.d.*.ts diff --git a/types/react-timeago/index.d.ts b/types/react-timeago/index.d.ts deleted file mode 100644 index 25388d2423dddb..00000000000000 --- a/types/react-timeago/index.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as React from "react"; - -declare namespace ReactTimeago { - type Unit = - | "second" - | "minute" - | "hour" - | "day" - | "week" - | "month" - | "year"; - - type Suffix = "ago" | "from now"; - - type Formatter = ( - value: number, - unit: Unit, - suffix: Suffix, - epochMiliseconds: number, - nextFormatter?: Formatter, - ) => React.ReactNode; - - interface ReactTimeagoProps { - readonly live?: boolean | undefined; - readonly minPeriod?: number | undefined; - readonly maxPeriod?: number | undefined; - readonly component?: T | undefined; - readonly title?: string | undefined; - readonly formatter?: Formatter | undefined; - readonly date: string | number | Date; - readonly now?: (() => number) | undefined; - } -} - -declare class ReactTimeago< - T extends React.ElementType

, - P = React.ComponentProps, -> extends React.Component< - ReactTimeago.ReactTimeagoProps & P -> {} - -export = ReactTimeago; diff --git a/types/react-timeago/package.json b/types/react-timeago/package.json deleted file mode 100644 index fa724eab022d61..00000000000000 --- a/types/react-timeago/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "private": true, - "name": "@types/react-timeago", - "version": "4.1.9999", - "projects": [ - "https://github.com/nmn/react-timeago" - ], - "dependencies": { - "@types/react": "*" - }, - "devDependencies": { - "@types/react-timeago": "workspace:." - }, - "owners": [ - { - "name": "Konstantin Lebedev", - "githubUsername": "koss-lebedev" - }, - { - "name": "Mike Martin", - "githubUsername": "mcmar" - } - ] -} diff --git a/types/react-timeago/react-timeago-tests.tsx b/types/react-timeago/react-timeago-tests.tsx deleted file mode 100644 index 702829be6f3030..00000000000000 --- a/types/react-timeago/react-timeago-tests.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import * as React from "react"; -import ReactTimeago, { Suffix, Unit } from "react-timeago"; - -const ReactTimeagoRequiredOptions: React.JSX.Element = ; - -const customFormatter = ( - value: number, - unit: Unit, - suffix: Suffix, - epochMiliseconds: number, -) => { - return epochMiliseconds > 300000 - ? `${value}${unit[0]} ${suffix}` - : "a really long time ago"; -}; - -const ReactTimeagoAllOptions: React.JSX.Element = ( -

} - title="Timeago" - formatter={customFormatter} - /> -); - -const ReactTimeagoDefaultComponentProps: React.JSX.Element = ( - // Note that the default component is