
Product
Introducing Tier 1 Reachability: Precision CVE Triage for Enterprise Teams
Socket’s new Tier 1 Reachability filters out up to 80% of irrelevant CVEs, so security teams can focus on the vulnerabilities that matter.
airtable-ts-native-node-fetch
Advanced tools
🗄️🧱 A type-safe Airtable SDK that makes developing apps on top of Airtable a breeze. We use it in multiple production applications and have found compared to the original SDK it:
If you've ever tried to build applications on top of the Airtable API, you know it can be a pain. The default SDK leads to:
All of these problems are solved with airtable-ts.
In development, you'll define the expected types for different fields: enabling you to leverage type hints in your code editor. After deployment, if people make breaking changes to your base schema you'll get clear runtime errors that pinpoint the problem (rather than your app silently failing, or worse: doing something dangerous!) We also fix unintuitive API behavior, like not being able to tell whether a checkbox field has been deleted or the values are just unticked.
filterByFormula
)Install it with npm install airtable-ts
. Then, use it like:
import { AirtableTs, Table } from 'airtable-ts';
const db = new AirtableTs({
// Create your own at https://airtable.com/create/tokens
// Recommended scopes: schema.bases:read, data.records:read, data.records:write
apiKey: 'pat1234.abcdef',
});
// Tip: use airtable-ts-codegen to autogenerate these from your Airtable base
export const studentTable: Table<{ id: string, firstName: string, classes: string[] }> = {
name: 'student',
baseId: 'app1234',
tableId: 'tbl1234',
schema: { firstName: 'string', classes: 'string[]' },
// optional: use mappings with field ids to prevent renamings breaking your app,
// or with field names to make handling renamings easy
mappings: { firstName: 'fld1234', classes: 'Classes student is enrolled in' },
};
export const classTable: Table<{ id: string, title: string }> = {
name: 'class',
baseId: 'app1234',
tableId: 'tbl4567',
schema: { title: 'string' },
};
// Now we can get all the records in a table (a scan)
const classes = await db.scan(classTable);
// Get, update and delete specific records:
const student = await db.get(studentTable, 'rec1234');
await db.update(studentTable, { id: 'rec1234', firstName: 'Adam' });
await db.remove(studentTable, 'rec5678');
// Or for a more involved example:
async function prefixTitleOfFirstClassOfFirstStudent(prefix: string) {
const students = await db.scan(studentTable);
if (!students[0]) throw new Error('There are no students');
if (!students[0].classes[0]) throw new Error('First student does not have a class');
const currentClass = await db.get(classTable, students[0].classes[0]);
const newTitle = prefix + currentClass.title;
await db.update(classTable, { id: currentClass.id, title: newTitle });
}
// And should you ever need it, access to the raw Airtable JS SDK
const rawSdk: Airtable = db.airtable;
The AirtableTs
class provides several methods to interact with your Airtable base:
new AirtableTs(options: AirtableTsOptions)
Creates a new instance of the AirtableTs client.
Parameters:
options
: Configuration options
apiKey
: Your Airtable API key (required)
baseSchemaCacheDurationMs
: Duration in milliseconds to cache base schema (default: 120,000ms = 2 minutes)apiVersion
, customHeaders
, endpointUrl
, noRetryIfRateLimited
, requestTimeout
Example:
const db = new AirtableTs({
apiKey: 'pat1234.abcdef',
baseSchemaCacheDurationMs: 300000, // 5 minutes
});
async get<T extends Item>(table: Table<T>, id: string): Promise<T>
Retrieves a single record from a table by its ID.
Parameters:
table
: Table definition objectid
: The ID of the record to retrieveExample:
const student = await db.get(studentTable, 'rec1234');
console.log(student.firstName); // Access fields with type safety
async scan<T extends Item>(table: Table<T>, params?: ScanParams): Promise<T[]>
Retrieves all records from a table, with optional filtering parameters.
Parameters:
table
: Table definition objectparams
(optional): Parameters for filtering, sorting, and limiting results
filterByFormula
: An Airtable formula to filter records
sort
: Array of sort objects (e.g., [{field: 'firstName', direction: 'asc'}]
)maxRecords
: Maximum number of records to returnview
: Name of a view to use for record selectiontimeZone
: Timezone for interpreting date valuesuserLocale
: Locale for formatting date valuesExample:
// Get all records
const allStudents = await db.scan(studentTable);
// Get records with filtering and sorting
const topStudents = await db.scan(studentTable, {
filterByFormula: '{grade} >= 90',
sort: [{field: 'grade', direction: 'desc'}],
maxRecords: 10
});
async insert<T extends Item>(table: Table<T>, data: Partial<Omit<T, 'id'>>): Promise<T>
Creates a new record in a table. Returns the new record.
Parameters:
table
: Table definition objectdata
: The data for the new record (without an ID, as Airtable will generate one)Example:
const newStudent = await db.insert(studentTable, {
firstName: 'Jane',
classes: ['rec5678', 'rec9012']
});
console.log(newStudent.id); // The new record ID generated by Airtable
async update<T extends Item>(table: Table<T>, data: Partial<T> & { id: string }): Promise<T>
Updates an existing record in a table. Returns the updated record.
Parameters:
table
: Table definition objectdata
: The data to update, must include the record IDExample:
const updatedStudent = await db.update(studentTable, {
id: 'rec1234',
firstName: 'John',
// Only include fields you want to update
});
async remove<T extends Item>(table: Table<T>, id: string): Promise<{ id: string }>
Deletes a record from a table.
Parameters:
table
: Table definition objectid
: The ID of the record to deleteExample:
await db.remove(studentTable, 'rec1234');
async table<T extends Item>(table: Table<T>): Promise<AirtableTsTable<T>>
Retrieves the AirtableTsTable object for the given table definition. This is the Airtable.js table, enriched with a fields
key that includes details of the Airtable schema for this table.
This is useful for advanced use cases where you need direct access to the Airtable table object.
Parameters:
table
: Table definition objectExample:
const airtableTsTable = await db.table(studentTable);
// Now you can use the raw Airtable table object with field information
console.log(airtableTsTable.fields); // Access the table's field definitions
The underlying Airtable.js SDK is exposed in the airtable
property.
const rawSdk: Airtable = db.airtable;
Pull requests are welcomed on GitHub! To get started:
npm install
npm run test
to run testsnpm run build
Versions follow the semantic versioning spec.
To release:
npm version <major | minor | patch>
to bump the versiongit push --follow-tags
to push with tagsFAQs
A type-safe Airtable SDK using node's built-in fetch
We found that airtable-ts-native-node-fetch demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket’s new Tier 1 Reachability filters out up to 80% of irrelevant CVEs, so security teams can focus on the vulnerabilities that matter.
Research
/Security News
Ongoing npm supply chain attack spreads to DuckDB: multiple packages compromised with the same wallet-drainer malware.
Security News
The MCP Steering Committee has launched the official MCP Registry in preview, a central hub for discovering and publishing MCP servers.