import {z} from 'zod' export type FilterItem = {column?: string | undefined, type?: string | undefined, value?: string | undefined}; export type Filters = Array; export type CreateApiSourceIdArgs = {id: number, offset?: number | undefined, limit: number, after?: string | undefined, sortby?: string | undefined, sortorder?: boolean | undefined, columns?: string | undefined, body: Filters}; export type CreateApiSourceIdOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const asset = z.object({app_updates: z.object({domaininfo: z.string().optional(), ipgeo: z.string().optional(), own_body: z.string().optional(), own_header: z.string().optional(), ports: z.string().optional(), rbls: z.string().optional(), screenshot: z.string().optional(), ssl: z.string().optional(), wtech: z.string().optional()}).optional(), "bd.addedtoportfolio": z.number().optional(), "bd.domain": z.string().optional(), "bd.hostname": z.string().optional(), "bd.ip_address": z.string().optional(), "bd.original_hostname": z.string().optional(), "bd.record_type": z.string().optional(), "bd.record_value": z.string().optional(), "bd.subdomain": z.boolean().optional(), "bd.tags": z.array(z.number()).optional(), "bd.tag__": z.string().optional(), "bd.string_custom_columns": z.array(z.unknown()).optional(), "bd.custom_columns": z.array(z.unknown()).optional(), "bd.sources": z.array(z.number()).optional(), "bd.severity_ranking": z.enum(["critical", "high", "medium", "low", "none"]).optional(), "bd.last_metadata_change": z.string().optional(), "domaininfo.administrativecontact_email": z.string().optional(), "domaininfo.administrativecontact_name": z.string().optional(), "domaininfo.administrativecontact_organization": z.string().optional(), "domaininfo.billingcontact_email": z.string().optional(), "domaininfo.contactemail": z.string().optional(), "domaininfo.expiresdate": z.string().optional(), "domaininfo.fdns_nameservers": z.array(z.string()).optional(), "domaininfo.registrant_city": z.string().optional(), "domaininfo.registrant_country": z.string().optional(), "domaininfo.registrant_email": z.string().optional(), "domaininfo.registrant_fax": z.string().optional(), "domaininfo.registrant_name": z.string().optional(), "domaininfo.registrant_postalcode": z.string().optional(), "domaininfo.registrant_state": z.string().optional(), "domaininfo.registrant_street1": z.string().optional(), "domaininfo.registrant_street2": z.string().optional(), "domaininfo.registrant_street3": z.string().optional(), "domaininfo.registrant_street4": z.string().optional(), "domaininfo.registrarname": z.string().optional(), "domaininfo.status": z.string().optional(), "domaininfo.technicalcontact_email": z.string().optional(), "domaininfo.zonecontact_email": z.string().optional(), "domaininfo.registrant_organization": z.string().optional(), "domaininfo.registrant_telephone": z.string().optional(), "domaininfo.administrativecontact_telephone": z.string().optional(), "domaininfo.technicalcontact_organization": z.string().optional(), "domaininfo.technicalcontact_name": z.string().optional(), hidden: z.boolean().optional(), id: z.string().optional(), "ipgeo.asn": z.string().optional(), "ipgeo.postal": z.string().optional(), "ipgeo.asn_number": z.number().optional(), "ipgeo.city": z.string().optional(), "ipgeo.cloud": z.string().optional(), "ipgeo.cloudhosted": z.boolean().optional(), "ipgeo.continent": z.string().optional(), "ipgeo.country": z.string().optional(), "ipgeo.insideeu": z.boolean().optional(), "ipgeo.latitude": z.number().optional(), "ipgeo.longitude": z.number().optional(), "ipgeo.registered_country": z.string().optional(), "ipgeo.subdivisions": z.array(z.string()).optional(), "ipgeo.time_zone": z.string().optional(), "own_body.contentlength": z.number().optional(), "own_body.html": z.string().optional(), "own_body.canonical": z.string().optional(), "own_header.content-type": z.string().optional(), "own_header.content-language": z.string().optional(), "own_header.names": z.array(z.string()).optional(), "own_header.secnames": z.array(z.string()).optional(), "own_header.responsecode": z.number().optional(), "own_header.server": z.string().optional(), "own_header.setsCookies": z.boolean().optional(), "own_header.vary": z.string().optional(), "own_header.values": z.array(z.string()).optional(), "own_header.secvalues": z.array(z.string()).optional(), "ports.banners": z.array(z.string()).optional(), "ports.ports": z.array(z.number()).optional(), "ports.verified_ports": z.array(z.number()).optional(), "ports.lastseen": z.array(z.string()).optional(), "ports.services": z.array(z.string()).optional(), "ports.cpes": z.array(z.string()).optional(), "ports.cves": z.array(z.string()).optional(), "ports.cvss3_scores": z.array(z.number()).optional(), "ports.cvss3_vectors": z.array(z.string()).optional(), "rbls.rbls": z.array(z.string()).optional(), "rbls.sampledate": z.array(z.string()).optional(), "screenshot.finalhtml": z.string().optional(), "screenshot.finalurl": z.string().optional(), "screenshot.final_response_code": z.number().int().optional(), "screenshot.screenshot": z.string().optional(), "screenshot.redirect_chain": z.array(z.string()).optional(), "ssl.available_suites": z.array(z.string()).optional(), "ssl.bits": z.number().optional(), "ssl.ev_cert": z.boolean().optional(), "ssl.fingerprint": z.string().optional(), "ssl.issuer_C": z.string().optional(), "ssl.issuer_CN": z.string().optional(), "ssl.issuer_O": z.string().optional(), "ssl.jarm": z.string().optional(), "ssl.protocol": z.array(z.string()).optional(), "ssl.subjectaltname": z.array(z.string()).optional(), "ssl.valid_from": z.string().optional(), "ssl.valid_to": z.string().optional(), "ssl.sslerror": z.string().optional(), "ssl.serial_number": z.string().optional(), "wtech.Content Management Systems": z.array(z.string()).optional(), "wtech.Message Boards": z.array(z.string()).optional(), "wtech.Database Managers": z.array(z.string()).optional(), "wtech.Documentation Tools": z.array(z.string()).optional(), "wtech.Widgets": z.array(z.string()).optional(), "wtech.Ecommerce": z.array(z.string()).optional(), "wtech.Photo Galleries": z.array(z.string()).optional(), "wtech.Wikis": z.array(z.string()).optional(), "wtech.Hosting Panels": z.array(z.string()).optional(), "wtech.Analytics": z.array(z.string()).optional(), "wtech.Blogs": z.array(z.string()).optional(), "wtech.JavaScript Frameworks": z.array(z.string()).optional(), "wtech.Issue Trackers": z.array(z.string()).optional(), "wtech.Video Players": z.array(z.string()).optional(), "wtech.Comment Systems": z.array(z.string()).optional(), "wtech.CAPTCHAs": z.array(z.string()).optional(), "wtech.Font Scripts": z.array(z.string()).optional(), "wtech.Web Frameworks": z.array(z.string()).optional(), "wtech.Miscellaneous": z.array(z.string()).optional(), "wtech.Editors": z.array(z.string()).optional(), "wtech.Learning Management Systems": z.array(z.string()).optional(), "wtech.Web Servers": z.array(z.string()).optional(), "wtech.Web Application Firewall": z.array(z.string()).optional(), "wtech.Cache Tools": z.array(z.string()).optional(), "wtech.Rich Text Editors": z.array(z.string()).optional(), "wtech.JavaScript Graphics": z.array(z.string()).optional(), "wtech.Mobile Frameworks": z.array(z.string()).optional(), "wtech.Programming Languages": z.array(z.string()).optional(), "wtech.Operating Systems": z.array(z.string()).optional(), "wtech.Search Engines": z.array(z.string()).optional(), "wtech.Web Mail": z.array(z.string()).optional(), "wtech.Content Delivery Networks": z.array(z.string()).optional(), "wtech.Marketing Automation": z.array(z.string()).optional(), "wtech.Web Server Extensions": z.array(z.string()).optional(), "wtech.Databases": z.array(z.string()).optional(), "wtech.Maps": z.array(z.string()).optional(), "wtech.Advertising Networks": z.array(z.string()).optional(), "wtech.Network Devices": z.array(z.string()).optional(), "wtech.Media Servers": z.array(z.string()).optional(), "wtech.Webcams": z.array(z.string()).optional(), "wtech.Printers": z.array(z.string()).optional(), "wtech.Payment Processors": z.array(z.string()).optional(), "wtech.Paywalls": z.array(z.string()).optional(), "wtech.Tag Managers": z.array(z.string()).optional(), "wtech.Build/Continuous Integration Systems": z.array(z.string()).optional(), "wtech.Control Systems": z.array(z.string()).optional(), "wtech.Remote Access": z.array(z.string()).optional(), "wtech.Reverse Proxy": z.array(z.string()).optional(), "wtech.Development Tools": z.array(z.string()).optional(), "wtech.Network Storage": z.array(z.string()).optional(), "wtech.Feed Readers": z.array(z.string()).optional(), "wtech.News Readers": z.array(z.string()).optional(), "wtech.Document Management Systems": z.array(z.string()).optional(), "wtech.Landing Page Builders": z.array(z.string()).optional(), "wtech.Live Chat": z.array(z.string()).optional(), "wtech.socialurls": z.array(z.string()).optional(), "wtech.gakeys": z.array(z.string()).optional(), "wtech.adsensekeys": z.array(z.string()).optional(), "wtech.mixedcontent": z.array(z.string()).optional(), "wtech.Customer Relationship Management Systems": z.array(z.string()).optional(), "wtech.Search Engine Optimization": z.array(z.string()).optional(), "wtech.Accounting Systems": z.array(z.string()).optional(), "wtech.Cryptomining": z.array(z.string()).optional(), "wtech.Static Site Generators": z.array(z.string()).optional(), "wtech.User Onboarding": z.array(z.string()).optional(), "wtech.JavaScript Libraries": z.array(z.string()).optional(), "wtech.Containers": z.array(z.string()).optional(), "wtech.SaaS": z.array(z.string()).optional(), "wtech.PaaS": z.array(z.string()).optional(), "wtech.IaaS": z.array(z.string()).optional(), "wtech.Load Balancer": z.array(z.string()).optional(), "wtech.Cookie compliance": z.array(z.string()).optional(), "wtech.Accessibility": z.array(z.string()).optional(), "wtech.Social logins": z.array(z.string()).optional(), "wtech.Affiliate programs": z.array(z.string()).optional(), "wtech.Appointment scheduling": z.array(z.string()).optional(), "wtech.Email": z.array(z.string()).optional(), "wtech.secretkeys": z.array(z.string()).optional(), "wtech.has_login": z.boolean().optional(), "wtech.document_title": z.string().optional(), "wtech.Browser fingerprinting": z.array(z.string()).optional(), "wtech.Buy now pay later": z.array(z.string()).optional(), "wtech.Cart abandonment": z.array(z.string()).optional(), "wtech.Content curation": z.array(z.string()).optional(), "wtech.Customer data platform": z.array(z.string()).optional(), "wtech.Digital asset management": z.array(z.string()).optional(), "wtech.Feature management": z.array(z.string()).optional(), "wtech.Geolocation": z.array(z.string()).optional(), "wtech.Hosting": z.array(z.string()).optional(), "wtech.Loyalty & rewards": z.array(z.string()).optional(), "wtech.Performance": z.array(z.string()).optional(), "wtech.Referral marketing": z.array(z.string()).optional(), "wtech.Reservations & delivery": z.array(z.string()).optional(), "wtech.Reviews": z.array(z.string()).optional(), "wtech.RUM": z.array(z.string()).optional(), "wtech.Segmentation": z.array(z.string()).optional(), "wtech.Shipping carriers": z.array(z.string()).optional(), "wtech.Translation": z.array(z.string()).optional(), "wtech.WordPress plugins": z.array(z.string()).optional(), "wtech.WordPress themes": z.array(z.string()).optional(), "wtech.Shopify apps": z.array(z.string()).optional(), "wtech.Recruitment & staffing": z.array(z.string()).optional(), "wtech.Returns": z.array(z.string()).optional(), "wtech.Livestreaming": z.array(z.string()).optional(), "wtech.Ticket booking": z.array(z.string()).optional(), "wtech.Augmented reality": z.array(z.string()).optional(), "wtech.Cross border ecommerce": z.array(z.string()).optional(), "wpscan.vulnerabilities": z.array(z.string()).optional(), "wpscan.plugins": z.array(z.string()).optional(), "wpscan.wpversion": z.string().optional()}); export const createApiSourceIdResponse = z.object({id: z.number().int().optional(), keyword: z.string().optional(), search_type: z.string().optional(), results_count: z.number().int().optional(), results_fetched: z.number().int().optional(), searchparams: z.string().optional(), dbdate: z.number().int().optional(), sortAfter: z.string().optional(), sortBefore: z.string().optional(), freeLimitReached: z.boolean().optional(), total: z.number().optional(), assets: z.array(asset).optional(), is_elastic: z.boolean().optional(), hiddenCount: z.number().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get the source by id * * POST /source/{id} */ export const createApiSourceId = async (args: CreateApiSourceIdArgs, options?: CreateApiSourceIdOptions) => { const {baseUrl = "https://asm.cloud.tenable.com/api/1.0", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.offset != null) query.append("offset", String(args.offset)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.after != null) query.append("after", String(args.after)) if (args.sortby != null) query.append("sortby", String(args.sortby)) if (args.sortorder != null) query.append("sortorder", String(args.sortorder)) if (args.columns != null) query.append("columns", String(args.columns)) if (ApiKeyAuth !== undefined) headers.set("Authorization", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/source/${encodeURIComponent(String(args.id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiSourceIdResponse, await res.json()) };