instapaper-api 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/resources/bookmarks.ts","../src/resources/folders.ts","../src/resources/highlights.ts","../src/resources/tags.ts","../src/client.ts","../src/oauth.ts","../src/types.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/** Base class for every error this SDK throws. */\nexport class InstapaperError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'InstapaperError';\n Object.setPrototypeOf(this, new.target.prototype);\n if (options && 'cause' in options && this.cause === undefined) {\n this.cause = options.cause;\n }\n }\n}\n\n/** The API answered with an error status. */\nexport class APIError extends InstapaperError {\n /** HTTP status code. */\n readonly status: number;\n /** The parsed JSON body, the raw text if it wasn't JSON, or `undefined` if empty. */\n readonly body: unknown;\n\n constructor(message: string, status: number, body?: unknown) {\n super(message);\n this.name = 'APIError';\n this.status = status;\n this.body = body;\n }\n}\n\n/** 400: the request was malformed, or an argument was missing or invalid. */\nexport class BadRequestError extends APIError {\n constructor(message: string, status = 400, body?: unknown) {\n super(message, status, body);\n this.name = 'BadRequestError';\n }\n}\n\n/** 401: the access token is missing, unknown, or revoked. */\nexport class AuthenticationError extends APIError {\n constructor(message: string, status = 401, body?: unknown) {\n super(message, status, body);\n this.name = 'AuthenticationError';\n }\n}\n\n/** 402: an external content quota is exhausted (e.g. Instaparser credits). */\nexport class QuotaExceededError extends APIError {\n constructor(message: string, status = 402, body?: unknown) {\n super(message, status, body);\n this.name = 'QuotaExceededError';\n }\n}\n\n/** 403: authenticated, but not allowed (unapproved or suspended app, or a Premium feature). */\nexport class PermissionDeniedError extends APIError {\n constructor(message: string, status = 403, body?: unknown) {\n super(message, status, body);\n this.name = 'PermissionDeniedError';\n }\n}\n\n/** 404: no such endpoint. */\nexport class NotFoundError extends APIError {\n constructor(message: string, status = 404, body?: unknown) {\n super(message, status, body);\n this.name = 'NotFoundError';\n }\n}\n\n/** 429: rate limited. Back off and retry later. */\nexport class RateLimitError extends APIError {\n constructor(message: string, status = 429, body?: unknown) {\n super(message, status, body);\n this.name = 'RateLimitError';\n }\n}\n\n/** 5xx: something went wrong on Instapaper's side. Retry with backoff. */\nexport class ServerError extends APIError {\n constructor(message: string, status = 500, body?: unknown) {\n super(message, status, body);\n this.name = 'ServerError';\n }\n}\n\n/** The OAuth token endpoint rejected a request (RFC 6749 error response). */\nexport class OAuthError extends InstapaperError {\n readonly status: number;\n /** The OAuth error code, e.g. `invalid_grant`. */\n readonly error: string;\n readonly description: string;\n\n constructor(status: number, error: string, description: string) {\n super(`${error}: ${description}`);\n this.name = 'OAuthError';\n this.status = status;\n this.error = error;\n this.description = description;\n }\n}\n\n/** The request never got a response: a network failure or a timeout. */\nexport class InstapaperConnectionError extends InstapaperError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = 'InstapaperConnectionError';\n }\n}\n\nconst DEFAULT_MESSAGES: Record<number, string> = {\n 400: 'Bad request',\n 401: 'Authentication failed',\n 402: 'Quota exceeded',\n 403: 'Permission denied',\n 404: 'Not found',\n 429: 'Rate limit exceeded',\n};\n\n/** Build the right APIError subclass for a failed response. */\nexport function apiErrorFor(status: number, body: unknown): APIError {\n const message = errorMessage(body) ?? defaultMessage(status);\n switch (status) {\n case 400:\n return new BadRequestError(message, status, body);\n case 401:\n return new AuthenticationError(message, status, body);\n case 402:\n return new QuotaExceededError(message, status, body);\n case 403:\n return new PermissionDeniedError(message, status, body);\n case 404:\n return new NotFoundError(message, status, body);\n case 429:\n return new RateLimitError(message, status, body);\n default:\n if (status >= 500) return new ServerError(message, status, body);\n return new APIError(message, status, body);\n }\n}\n\nfunction defaultMessage(status: number): string {\n if (DEFAULT_MESSAGES[status]) return DEFAULT_MESSAGES[status];\n if (status >= 500) return 'Server error';\n return `Request failed with status ${status}`;\n}\n\nfunction errorMessage(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const error = (body as { error?: unknown }).error;\n if (error && typeof error === 'object') {\n const message = (error as { message?: unknown }).message;\n if (typeof message === 'string' && message) return message;\n }\n return undefined;\n}\n","/** The SDK version, sent in the User-Agent header where the runtime allows it. */\nexport const VERSION = '0.1.0';\n","import { APIError, InstapaperConnectionError, InstapaperError, apiErrorFor } from './errors';\nimport { VERSION } from './version';\n\nexport const DEFAULT_BASE_URL = 'https://www.instapaper.com';\nexport const DEFAULT_TIMEOUT = 30_000;\n\n/** The subset of `RequestInit` this SDK passes to `fetch`. */\nexport interface FetchInit {\n method: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n /** Always `manual`, so credentials are never resent to wherever a redirect points. */\n redirect: 'manual';\n}\n\n/** The subset of `Response` this SDK reads. */\nexport interface FetchResponse {\n status: number;\n ok: boolean;\n text(): Promise<string>;\n}\n\n/** A `fetch`-compatible function. The global `fetch` satisfies this. */\nexport type FetchLike = (url: string, init: FetchInit) => Promise<FetchResponse>;\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface TransportOptions {\n baseUrl?: string;\n /** Request timeout in milliseconds. `0` disables it. Defaults to 30 seconds. */\n timeout?: number;\n /** A custom `fetch`. Defaults to the global one. */\n fetch?: FetchLike;\n}\n\ninterface SendOptions {\n query?: Record<string, QueryValue>;\n headers?: Record<string, string>;\n body?: string;\n}\n\ninterface RawResponse {\n status: number;\n ok: boolean;\n text: string;\n}\n\n/** Low-level request plumbing shared by the API client and the OAuth helper. */\nexport class Transport {\n readonly baseUrl: string;\n readonly timeout: number;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: TransportOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n const globalFetch = (globalThis as { fetch?: FetchLike }).fetch;\n const fetchImpl = options.fetch ?? (globalFetch ? globalFetch.bind(globalThis) : undefined);\n if (!fetchImpl) {\n throw new InstapaperError(\n 'No fetch implementation is available. Use Node 18 or newer, or pass options.fetch.',\n );\n }\n this.fetchImpl = fetchImpl;\n }\n\n url(path: string, query?: Record<string, QueryValue>): string {\n let url = `${this.baseUrl}${path}`;\n if (query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n params.append(key, String(value));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n return url;\n }\n\n async send(method: string, path: string, options: SendOptions = {}): Promise<RawResponse> {\n const headers: Record<string, string> = { Accept: 'application/json', ...options.headers };\n if (canSetUserAgent()) headers['User-Agent'] = `instapaper-api-js/${VERSION}`;\n\n const controller = this.timeout > 0 ? new AbortController() : undefined;\n let timedOut = false;\n const timer = controller\n ? setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeout)\n : undefined;\n\n try {\n const init: FetchInit = { method, headers, redirect: 'manual' };\n if (options.body !== undefined) init.body = options.body;\n if (controller) init.signal = controller.signal;\n const response = await this.fetchImpl(this.url(path, options.query), init);\n // Read the body inside the timeout too, so a stalled body can't hang forever.\n const text = await response.text();\n return { status: response.status, ok: response.ok, text };\n } catch (err) {\n if (timedOut) {\n throw new InstapaperConnectionError(`Request timed out after ${this.timeout}ms`, {\n cause: err,\n });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new InstapaperConnectionError(`Network error: ${detail}`, { cause: err });\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }\n}\n\n/** Parse a body as JSON, returning the raw text if it isn't JSON and `undefined` if empty. */\nexport function parseBody(text: string): unknown {\n if (!text.trim()) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport interface RequestOptions {\n query?: Record<string, QueryValue>;\n json?: unknown;\n /** Whether a successful response must be a JSON object. `false` for empty-body endpoints. */\n expectJson?: boolean;\n}\n\n/** JSON API requests with bearer auth and error mapping. */\nexport class ApiClient {\n constructor(\n private readonly transport: Transport,\n private readonly accessToken: string,\n ) {}\n\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = { Authorization: `Bearer ${this.accessToken}` };\n let body: string | undefined;\n if (options.json !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.json);\n }\n\n const response = await this.transport.send(method, `/api/2${path}`, {\n query: options.query,\n headers,\n body,\n });\n const parsed = parseBody(response.text);\n\n if (isRedirect(response.status)) {\n // We never follow redirects: that would resend the bearer token elsewhere.\n throw new APIError(\n `Unexpected redirect (status ${response.status}); the request was not followed`,\n response.status,\n parsed,\n );\n }\n if (!response.ok) throw apiErrorFor(response.status, parsed);\n if (options.expectJson === false) return undefined as T;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new APIError('Expected a JSON object in the response', response.status, parsed);\n }\n return parsed as T;\n }\n}\n\n/**\n * With `redirect: 'manual'`, Node and most runtimes hand back the 3xx response\n * itself, while browsers return an opaque response with status 0.\n */\nexport function isRedirect(status: number): boolean {\n return status === 0 || (status >= 300 && status < 400);\n}\n\nfunction canSetUserAgent(): boolean {\n // Browsers either forbid or ignore a custom User-Agent; everywhere else it's fine.\n return typeof (globalThis as { document?: unknown }).document === 'undefined';\n}\n","import type { ApiClient } from '../http';\nimport type {\n Bookmark,\n BookmarkChanges,\n BookmarkList,\n BookmarkSection,\n ParsedArticle,\n TagChanges,\n} from '../types';\n\nexport interface ListBookmarksOptions {\n /** Defaults to `home`, or to the section implied by `folderId` or `tag`. */\n section?: BookmarkSection;\n folderId?: number;\n /** Tag name. Can't be combined with `folderId`. */\n tag?: string;\n /** 1 to 500. Defaults to 25. */\n limit?: number;\n offset?: number;\n}\n\nexport interface IterateBookmarksOptions {\n section?: BookmarkSection;\n folderId?: number;\n tag?: string;\n /** Bookmarks fetched per request, 1 to 500. Defaults to 100. */\n pageSize?: number;\n}\n\nexport interface ChangesOptions {\n /** 1 to 500. Defaults to 500. */\n limit?: number;\n offset?: number;\n}\n\nexport interface SyncOptions {\n /** Changes fetched per request, 1 to 500. Defaults to 500. */\n pageSize?: number;\n}\n\nexport interface SaveBookmarkOptions {\n /** Required unless `privateSource` is set. */\n url?: string;\n /** Send it if you have it; otherwise the title is looked up, which is slower. */\n title?: string;\n description?: string;\n folderId?: number;\n archived?: boolean;\n /** `false` skips resolving redirects and canonicalizing the URL. */\n canonicalize?: boolean;\n /** Tag names. Tags that don't exist yet are created. */\n tags?: string[];\n /** Full article HTML, if you already have it. Required with `privateSource`. */\n content?: string;\n /** A short label naming where private content came from. Used instead of `url`. */\n privateSource?: string;\n}\n\nexport interface UpdateBookmarkOptions {\n title?: string;\n description?: string;\n /** Reading progress from 0.0 to 1.0. */\n progress?: number;\n /** When the progress was recorded, as a Unix timestamp. Defaults to now. */\n progressTimestamp?: number;\n}\n\nexport interface UpdateTagsOptions {\n /** Tag names (created if needed) or tag IDs to add. */\n add?: Array<string | number>;\n /** Tag IDs to remove. */\n remove?: number[];\n}\n\nexport interface ParseOptions {\n /** `false` bypasses the parser cache. Defaults to `true`. */\n useCache?: boolean;\n /** Force a re-parse rather than serving a stored copy. Defaults to `false`. */\n force?: boolean;\n /** HTML you already have for the article, parsed instead of fetching the URL. */\n content?: string;\n /** Your Instaparser key, required for non-personal use. */\n instaparserApiKey?: string;\n}\n\nconst MAX_PAGE_SIZE = 500;\nconst SECTIONS: readonly BookmarkSection[] = ['home', 'archive', 'liked', 'folder', 'tag'];\n\n/** List, save, update, move, like, tag, delete, and parse bookmarks. */\nexport class Bookmarks {\n constructor(private readonly api: ApiClient) {}\n\n /** One page of bookmarks from a section. */\n async list(options: ListBookmarksOptions = {}): Promise<BookmarkList> {\n checkSection(options);\n if (options.limit !== undefined) checkPageSize(options.limit, 'limit');\n return this.api.request<BookmarkList>('GET', '/bookmarks', {\n query: {\n section: options.section,\n folder_id: options.folderId,\n tag: options.tag,\n limit: options.limit,\n offset: options.offset,\n },\n });\n }\n\n /** Every bookmark in a section, fetching pages as you go. */\n async *iterate(options: IterateBookmarksOptions = {}): AsyncIterableIterator<Bookmark> {\n const pageSize = options.pageSize ?? 100;\n checkPageSize(pageSize, 'pageSize');\n checkSection(options);\n let offset = 0;\n for (;;) {\n const page = await this.list({\n section: options.section,\n folderId: options.folderId,\n tag: options.tag,\n limit: pageSize,\n offset,\n });\n yield* page.bookmarks;\n offset += page.bookmarks.length;\n // A short page is the end. `total` can lag behind, so don't stop on it.\n if (page.bookmarks.length < pageSize) return;\n }\n }\n\n /** One page of bookmarks changed since a time, across every section, plus deleted IDs. */\n async changes(since: number | Date, options: ChangesOptions = {}): Promise<BookmarkChanges> {\n const limit = options.limit ?? MAX_PAGE_SIZE;\n checkPageSize(limit, 'limit');\n const response = await this.api.request<BookmarkChanges>('GET', '/bookmarks', {\n query: { since: toTimestamp(since), limit, offset: options.offset },\n });\n return {\n bookmarks: response.bookmarks,\n deleted_ids: response.deleted_ids ?? [],\n total: response.total,\n };\n }\n\n /**\n * Everything changed since a time, fetching every page. Record when you\n * started the sync and pass it as `since` next time.\n */\n async sync(since: number | Date, options: SyncOptions = {}): Promise<BookmarkChanges> {\n const pageSize = options.pageSize ?? MAX_PAGE_SIZE;\n checkPageSize(pageSize, 'pageSize');\n const result: BookmarkChanges = { bookmarks: [], deleted_ids: [], total: 0 };\n let offset = 0;\n for (;;) {\n const page = await this.changes(since, { limit: pageSize, offset });\n result.bookmarks.push(...page.bookmarks);\n result.deleted_ids.push(...page.deleted_ids);\n result.total = page.total;\n // A page holds up to `pageSize` entries, counting deleted IDs.\n const received = page.bookmarks.length + page.deleted_ids.length;\n offset += received;\n if (received < pageSize) return result;\n }\n }\n\n /** Save a URL, or private content. Saving a URL twice updates the existing bookmark. */\n async save(options: SaveBookmarkOptions): Promise<Bookmark> {\n if (options.url === undefined && options.privateSource === undefined) {\n throw new TypeError('url is required unless privateSource is set');\n }\n if (options.url !== undefined && options.privateSource !== undefined) {\n throw new TypeError('url and privateSource cannot be used together');\n }\n if (options.privateSource !== undefined && options.content === undefined) {\n throw new TypeError('privateSource requires content');\n }\n return this.api.request<Bookmark>('POST', '/bookmarks', {\n json: compact({\n url: options.url,\n title: options.title,\n description: options.description,\n folder_id: options.folderId,\n archived: options.archived,\n canonicalize: options.canonicalize,\n tags: options.tags?.map((name) => ({ name })),\n content: options.content,\n private_source: options.privateSource,\n }),\n });\n }\n\n /** Change a bookmark's title, description, or reading progress. */\n async update(bookmarkId: number, options: UpdateBookmarkOptions): Promise<Bookmark> {\n if (\n options.title === undefined &&\n options.description === undefined &&\n options.progress === undefined &&\n options.progressTimestamp === undefined\n ) {\n throw new TypeError('update needs a title, description, or progress');\n }\n if (options.progress === undefined && options.progressTimestamp !== undefined) {\n throw new TypeError('progressTimestamp requires progress');\n }\n let progress: { percentage: number; timestamp: number } | undefined;\n if (options.progress !== undefined) {\n if (!(options.progress >= 0 && options.progress <= 1)) {\n throw new RangeError('progress must be between 0 and 1');\n }\n progress = {\n percentage: options.progress,\n timestamp: options.progressTimestamp ?? Math.floor(Date.now() / 1000),\n };\n }\n return this.api.request<Bookmark>('POST', `/bookmarks/${id(bookmarkId)}`, {\n json: compact({ title: options.title, description: options.description, progress }),\n });\n }\n\n /** Permanently delete a bookmark. This is not the same as archiving. */\n async delete(bookmarkId: number): Promise<void> {\n await this.api.request<void>('DELETE', `/bookmarks/${id(bookmarkId)}`, { expectJson: false });\n }\n\n archive(bookmarkId: number): Promise<Bookmark> {\n return this.move(bookmarkId, 'archive');\n }\n\n /** Move a bookmark back to the home list. */\n unarchive(bookmarkId: number): Promise<Bookmark> {\n return this.move(bookmarkId, 'home');\n }\n\n moveToFolder(bookmarkId: number, folderId: number): Promise<Bookmark> {\n return this.move(bookmarkId, String(id(folderId)));\n }\n\n like(bookmarkId: number): Promise<Bookmark> {\n return this.api.request<Bookmark>('POST', `/bookmarks/${id(bookmarkId)}/like`);\n }\n\n unlike(bookmarkId: number): Promise<Bookmark> {\n return this.api.request<Bookmark>('DELETE', `/bookmarks/${id(bookmarkId)}/like`);\n }\n\n /** Add tags (by name or ID) to a bookmark and remove tags (by ID) from it. */\n async updateTags(bookmarkId: number, options: UpdateTagsOptions): Promise<TagChanges> {\n const add = options.add ?? [];\n const remove = options.remove ?? [];\n if (add.length === 0 && remove.length === 0) {\n throw new TypeError('updateTags needs at least one tag to add or remove');\n }\n for (const tag of add) {\n const validName = typeof tag === 'string' && tag.trim() !== '';\n if (!validName && !isPositiveInteger(tag)) {\n throw new TypeError('Tags to add must be non-empty names or positive integer IDs');\n }\n }\n if (!remove.every(isPositiveInteger)) {\n throw new TypeError('Tags to remove must be positive integer IDs');\n }\n return this.api.request<TagChanges>('POST', `/bookmarks/${id(bookmarkId)}/tags`, {\n json: {\n add_tags: add.map((tag) => (typeof tag === 'number' ? { id: tag } : { name: tag })),\n remove_tags: remove.map((tagId) => ({ id: tagId })),\n },\n });\n }\n\n /** Instapaper's parsed, reader-ready version of a saved article. */\n async parse(bookmarkId: number, options: ParseOptions = {}): Promise<ParsedArticle> {\n const path = `/bookmarks/${id(bookmarkId)}/parse`;\n const useCache = options.useCache ?? true;\n const force = options.force ?? false;\n if (options.content !== undefined) {\n return this.api.request<ParsedArticle>('POST', path, {\n json: compact({\n use_cache: useCache,\n force,\n content: options.content,\n instaparser_api_key: options.instaparserApiKey,\n }),\n });\n }\n return this.api.request<ParsedArticle>('GET', path, {\n query: {\n use_cache: useCache ? undefined : '0',\n force: force ? '1' : undefined,\n instaparser_api_key: options.instaparserApiKey,\n },\n });\n }\n\n private move(bookmarkId: number, section: string): Promise<Bookmark> {\n return this.api.request<Bookmark>('POST', `/bookmarks/${id(bookmarkId)}/move`, {\n json: { section },\n });\n }\n}\n\n/**\n * The API ignores folder_id and tag whenever section is sent, so a mismatched\n * section would quietly return the wrong list.\n */\nfunction checkSection(options: { section?: string; folderId?: number; tag?: string }): void {\n const { section, folderId, tag } = options;\n if (folderId !== undefined && tag !== undefined) {\n throw new TypeError('folderId and tag cannot be used together');\n }\n if (section === undefined) return;\n if (!SECTIONS.includes(section as BookmarkSection)) {\n throw new TypeError(`section must be one of: ${SECTIONS.join(', ')}`);\n }\n if (folderId !== undefined && section !== 'folder') {\n throw new TypeError(`folderId can't be used with section \"${section}\"`);\n }\n if (tag !== undefined && section !== 'tag') {\n throw new TypeError(`tag can't be used with section \"${section}\"`);\n }\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0;\n}\n\nfunction checkPageSize(value: number, name: string): void {\n if (!Number.isInteger(value) || value < 1 || value > MAX_PAGE_SIZE) {\n throw new RangeError(`${name} must be an integer from 1 to ${MAX_PAGE_SIZE}`);\n }\n}\n\nfunction toTimestamp(since: number | Date): number {\n const value = since instanceof Date ? Math.floor(since.getTime() / 1000) : since;\n // The API treats 0 as \"no timestamp\" and returns a normal list instead.\n if (!Number.isInteger(value) || value <= 0) {\n throw new RangeError('since must be a positive Unix timestamp or a Date');\n }\n return value;\n}\n\n/** Validate an ID used in a URL path. */\nexport function id(value: number): number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new TypeError(`Expected a positive integer ID, got ${String(value)}`);\n }\n return value;\n}\n\n/** Drop keys whose value is `undefined`. */\nexport function compact<T extends Record<string, unknown>>(value: T): Partial<T> {\n return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n","import type { ApiClient } from '../http';\nimport type { Folder } from '../types';\nimport { id } from './bookmarks';\n\nexport interface FolderPosition {\n folderId: number;\n position: number;\n}\n\n/** List, create, reorder, and delete a user's folders. */\nexport class Folders {\n constructor(private readonly api: ApiClient) {}\n\n /** The user's folders, in their own order. */\n async list(): Promise<Folder[]> {\n const response = await this.api.request<{ folders: Folder[] }>('GET', '/folders');\n return response.folders;\n }\n\n create(title: string): Promise<Folder> {\n return this.api.request<Folder>('POST', '/folders', { json: { title } });\n }\n\n /** Delete a folder. Its bookmarks move back to the home list. */\n async delete(folderId: number): Promise<void> {\n await this.api.request<void>('DELETE', `/folders/${id(folderId)}`, { expectJson: false });\n }\n\n /**\n * Set folder positions, as a `{ folderId: position }` map or a list. Folders\n * you leave out keep their positions. Returns every folder in its new order.\n */\n async reorder(positions: Record<number, number> | FolderPosition[]): Promise<Folder[]> {\n const entries: FolderPosition[] = Array.isArray(positions)\n ? positions\n : Object.entries(positions).map(([folderId, position]) => ({\n folderId: Number(folderId),\n position,\n }));\n if (entries.length === 0) throw new TypeError('reorder needs at least one folder');\n const order = entries.map(({ folderId, position }) => {\n // The API skips a position of 0, so positions start at 1.\n if (!Number.isInteger(position) || position < 1) {\n throw new RangeError('Folder positions must be positive integers');\n }\n return { folder_id: id(folderId), position };\n });\n const response = await this.api.request<{ folders: Folder[] }>('POST', '/folders/reorder', {\n json: { order },\n });\n return response.folders;\n }\n}\n","import type { ApiClient } from '../http';\nimport type { Highlight } from '../types';\nimport { compact, id } from './bookmarks';\n\nexport interface CreateHighlightOptions {\n /** The highlighted text. Leading and trailing whitespace is trimmed by the API. */\n text: string;\n note?: string;\n /**\n * Which occurrence of `text` in the article body to highlight, counting\n * from 0. Defaults to 0, the first occurrence.\n */\n position?: number;\n}\n\n/** Read, create, and delete highlights on a bookmark. */\nexport class Highlights {\n constructor(private readonly api: ApiClient) {}\n\n async list(bookmarkId: number): Promise<Highlight[]> {\n const response = await this.api.request<{ highlights: Highlight[] }>(\n 'GET',\n `/bookmarks/${id(bookmarkId)}/highlights`,\n );\n return response.highlights;\n }\n\n /**\n * Create a highlight. Accounts without Premium can create five per month;\n * past that this throws a `PermissionDeniedError`.\n */\n async create(bookmarkId: number, options: CreateHighlightOptions): Promise<Highlight> {\n if (typeof options?.text !== 'string' || options.text.trim() === '') {\n throw new TypeError('Highlight text cannot be blank');\n }\n return this.api.request<Highlight>('POST', `/bookmarks/${id(bookmarkId)}/highlights`, {\n json: compact({ text: options.text, note: options.note, position: options.position }),\n });\n }\n\n /**\n * Delete a highlight. Throws `BadRequestError` if the highlight doesn't\n * exist, belongs to someone else, or was already deleted.\n */\n async delete(highlightId: number): Promise<void> {\n await this.api.request<void>('DELETE', `/highlights/${id(highlightId)}`, {\n expectJson: false,\n });\n }\n}\n","import type { ApiClient } from '../http';\nimport type { Tag } from '../types';\nimport { id } from './bookmarks';\n\n/** List, create, and rename a user's tags. */\nexport class Tags {\n constructor(private readonly api: ApiClient) {}\n\n async list(): Promise<Tag[]> {\n const response = await this.api.request<{ tags: Tag[] }>('GET', '/tags');\n return response.tags;\n }\n\n create(name: string): Promise<Tag> {\n return this.api.request<Tag>('POST', '/tags', { json: { name } });\n }\n\n rename(tagId: number, name: string): Promise<Tag> {\n return this.api.request<Tag>('POST', `/tags/${id(tagId)}`, { json: { name } });\n }\n}\n","import { ApiClient, Transport, type TransportOptions } from './http';\nimport { Bookmarks } from './resources/bookmarks';\nimport { Folders } from './resources/folders';\nimport { Highlights } from './resources/highlights';\nimport { Tags } from './resources/tags';\nimport type { User } from './types';\n\nexport interface InstapaperOptions extends TransportOptions {\n /** A personal access token, or one issued through the OAuth flow. */\n accessToken: string;\n}\n\n/** Client for the Instapaper API v2. */\nexport class Instapaper {\n readonly bookmarks: Bookmarks;\n readonly folders: Folders;\n readonly tags: Tags;\n readonly highlights: Highlights;\n private readonly api: ApiClient;\n\n constructor(options: InstapaperOptions) {\n if (!options || typeof options.accessToken !== 'string' || !options.accessToken) {\n throw new TypeError('accessToken is required');\n }\n this.api = new ApiClient(new Transport(options), options.accessToken);\n this.bookmarks = new Bookmarks(this.api);\n this.folders = new Folders(this.api);\n this.tags = new Tags(this.api);\n this.highlights = new Highlights(this.api);\n }\n\n /** The account the access token belongs to. */\n me(): Promise<User> {\n return this.api.request<User>('GET', '/me');\n }\n}\n","import { InstapaperError, OAuthError } from './errors';\nimport { Transport, isRedirect, parseBody, type TransportOptions } from './http';\nimport type { AccessToken } from './types';\n\nexport interface OAuthOptions extends TransportOptions {\n clientId: string;\n clientSecret: string;\n /** Must match one of the application's registered callback URIs exactly. */\n redirectUri: string;\n}\n\nexport interface AuthorizationUrlOptions {\n /** An opaque value echoed back to your redirect URI. Use it to defend against CSRF. */\n state?: string;\n}\n\n/** Helpers for the OAuth 2 authorization code flow. */\nexport class OAuth {\n readonly clientId: string;\n readonly redirectUri: string;\n private readonly clientSecret: string;\n private readonly transport: Transport;\n\n constructor(options: OAuthOptions) {\n for (const key of ['clientId', 'clientSecret', 'redirectUri'] as const) {\n if (!options || typeof options[key] !== 'string' || !options[key]) {\n throw new TypeError(`${key} is required`);\n }\n }\n this.clientId = options.clientId;\n this.clientSecret = options.clientSecret;\n this.redirectUri = options.redirectUri;\n this.transport = new Transport(options);\n }\n\n /** The URL to send the user to so they can authorize your application. */\n authorizationUrl(options: AuthorizationUrlOptions = {}): string {\n return this.transport.url('/oauth2/authorize', {\n client_id: this.clientId,\n redirect_uri: this.redirectUri,\n response_type: 'code',\n state: options.state,\n });\n }\n\n /** Exchange the code from your redirect URI for an access token. Codes work once. */\n async exchangeCode(code: string): Promise<AccessToken> {\n if (typeof code !== 'string' || !code) throw new TypeError('code is required');\n const response = await this.transport.send('POST', '/oauth2/token', {\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: this.clientId,\n client_secret: this.clientSecret,\n redirect_uri: this.redirectUri,\n code,\n }).toString(),\n });\n const body = parseBody(response.text);\n\n if (isRedirect(response.status)) {\n // Never follow: the redirect would carry the client secret somewhere else.\n throw new OAuthError(\n response.status,\n 'unexpected_redirect',\n `The token endpoint redirected (status ${response.status}); the request was not followed`,\n );\n }\n if (!response.ok) {\n const fields = body && typeof body === 'object' ? (body as Record<string, unknown>) : {};\n const error = typeof fields.error === 'string' ? fields.error : 'unknown_error';\n const description =\n typeof fields.error_description === 'string'\n ? fields.error_description\n : `Token request failed with status ${response.status}`;\n throw new OAuthError(response.status, error, description);\n }\n\n const token = body as Partial<AccessToken> | undefined;\n if (!token || typeof token !== 'object' || typeof token.access_token !== 'string') {\n throw new InstapaperError('The token response did not include an access_token');\n }\n return token as AccessToken;\n }\n}\n","/**\n * Response types for the Instapaper API v2.\n *\n * Field names match the JSON the API returns exactly (snake_case), so there is\n * no mapping layer between what the server sends and what you get back.\n */\n\n/** Which list of bookmarks to read. */\nexport type BookmarkSection = 'home' | 'archive' | 'liked' | 'folder' | 'tag';\n\n/**\n * Known values of `Bookmark.category`. New categories may be added, so treat\n * an unknown value as an article.\n */\nexport const BookmarkCategory = {\n Article: 0,\n Email: 1,\n Video: 2,\n PDF: 3,\n Social: 4,\n} as const;\n\nexport type BookmarkCategory = (typeof BookmarkCategory)[keyof typeof BookmarkCategory];\n\nexport interface User {\n /** Stable numeric ID. Store this as your reference to the user. */\n id: number;\n /** Usually an email address. Display only; it can change. */\n username: string;\n /** Whether the account has an active Instapaper Premium subscription. */\n premium: boolean;\n}\n\nexport interface Tag {\n id: number;\n name: string;\n slug: string;\n count: number;\n /** Reserved for Instapaper's own clients; always `null` here. */\n baton: string | null;\n}\n\nexport interface Progress {\n /** Reading progress from 0.0 to 1.0. */\n percentage: number;\n /** When the progress was recorded, as a Unix timestamp. */\n timestamp: number;\n}\n\nexport interface Bookmark {\n id: number;\n /** `null` for private content saved without a URL. */\n url: string | null;\n title: string | null;\n description: string | null;\n image: string | null;\n progress: Progress;\n liked: boolean;\n archived: boolean;\n /** When the bookmark was saved, as a Unix timestamp. */\n time: number;\n /** When the article was published, as a Unix timestamp, if known. */\n pubtime: number | null;\n author: string | null;\n /** The folder it's in, or `null` when it's in the home list. */\n folder_id: number | null;\n tags: Tag[];\n private_source: string | null;\n /** See {@link BookmarkCategory}. May hold values this SDK doesn't know yet. */\n category: number;\n}\n\nexport interface Folder {\n id: number;\n title: string;\n slug: string;\n position: number;\n public: boolean;\n count: number;\n}\n\nexport interface Highlight {\n id: number;\n bookmark_id: number;\n text: string;\n note: string | null;\n /** Which occurrence of `text` in the article body this highlight marks, counting from 0. */\n position: number;\n /** When it was created, as a Unix timestamp. */\n time: number;\n}\n\nexport interface ArticleAuthor {\n name: string;\n url: string | null;\n}\n\nexport interface ArticleMetadata {\n title: string | null;\n author: ArticleAuthor | null;\n pubtime: number | null;\n thumbnail: string | null;\n description: string | null;\n private_source: string | null;\n category: number;\n}\n\nexport interface ArticleContent {\n /** Article HTML, UTF-8, with scripts stripped. */\n body: string | null;\n images: string[];\n words: number | null;\n paywalled: boolean;\n /** `ltr` or `rtl`. */\n direction: string | null;\n}\n\nexport interface ParsedArticle {\n metadata: ArticleMetadata;\n content: ArticleContent;\n}\n\nexport interface BookmarkList {\n bookmarks: Bookmark[];\n /** Size of the whole section, not of this page. */\n total: number;\n}\n\nexport interface BookmarkChanges {\n bookmarks: Bookmark[];\n /** IDs of bookmarks deleted since the timestamp. */\n deleted_ids: number[];\n /** Number of changed bookmarks. */\n total: number;\n}\n\nexport interface TagChanges {\n /** Tags this call created. */\n created_tags: Tag[];\n /** The bookmark's full tag list afterwards. */\n tags: Tag[];\n}\n\n/** The user included in a token response. */\nexport interface TokenUser {\n id: number;\n username: string;\n}\n\nexport interface AccessToken {\n access_token: string;\n token_type: string;\n user: TokenUser;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "instapaper-api",
3
+ "version": "0.1.0",
4
+ "description": "Official TypeScript client for the Instapaper API v2",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "sideEffects": false,
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "CHANGELOG.md",
27
+ "LICENSE"
28
+ ],
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest",
33
+ "test:coverage": "vitest run --coverage",
34
+ "smoke": "node scripts/smoke.mjs",
35
+ "lint": "eslint .",
36
+ "format": "prettier --write .",
37
+ "format:check": "prettier --check .",
38
+ "typecheck": "tsc --noEmit",
39
+ "prepublishOnly": "npm run build"
40
+ },
41
+ "keywords": [
42
+ "instapaper",
43
+ "instapaper-api",
44
+ "read-later",
45
+ "bookmarks",
46
+ "highlights",
47
+ "oauth2",
48
+ "sdk"
49
+ ],
50
+ "author": "Instapaper",
51
+ "license": "MIT",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/Instapaper/instapaper-api-js.git"
55
+ },
56
+ "homepage": "https://www.instapaper.com/developers",
57
+ "bugs": {
58
+ "url": "https://github.com/Instapaper/instapaper-api-js/issues"
59
+ },
60
+ "engines": {
61
+ "node": ">=18"
62
+ },
63
+ "devDependencies": {
64
+ "@eslint/js": "^10.0.1",
65
+ "@types/node": "^20.19.43",
66
+ "@vitest/coverage-v8": "^4.1.11",
67
+ "eslint": "^10.10.0",
68
+ "prettier": "^3.9.7",
69
+ "tsup": "^8.5.1",
70
+ "typescript": "~5.9",
71
+ "typescript-eslint": "^8.70.0",
72
+ "vitest": "^4.1.11"
73
+ }
74
+ }