
Research
Malicious fezbox npm Package Steals Browser Passwords from Cookies via Innovative QR Code Steganographic Technique
A malicious package uses a QR code as steganography in an innovative technique.
@skynetxbt/flow-airtable
Advanced tools
A comprehensive Airtable integration flow for SkynetXBT that provides full CRUD (Create, Read, Update, Delete) operations with advanced filtering, sorting, and data manipulation capabilities.
npm install @skynetxbt/flow-airtable
Set the following environment variables:
AIRTABLE_API_KEY=your_airtable_api_key
AIRTABLE_BASE_ID=your_airtable_base_id
import AirtableFlow from '@skynetxbt/flow-airtable';
// Initialize with environment variables
const airtableFlow = new AirtableFlow();
// Or initialize with explicit credentials
const airtableFlow = new AirtableFlow({
apiKey: 'your-api-key',
baseId: 'your-base-id'
});
// Read all records from a table
const result = await airtableFlow.readAll('Customers', {
maxRecords: 100,
sort: [{ field: 'Name', direction: 'asc' }]
});
console.log(result.data); // Array of records
console.log(result.recordCount); // Number of records returned
// Filter active customers in New York
const result = await airtableFlow.readWithFilter(
'Customers',
"AND({Status} = 'Active', {City} = 'New York')",
{ maxRecords: 50 }
);
// Filter using helper methods
import { AirtableFormulas } from '@skynetxbt/flow-airtable';
const filter = AirtableFormulas.and(
AirtableFormulas.exactMatch('Status', 'Active'),
AirtableFormulas.exactMatch('City', 'New York')
);
const result = await airtableFlow.readWithFilter('Customers', filter);
// Date range filter
const dateFilter = "AND(IS_AFTER({Created}, '2024-01-01'), IS_BEFORE({Created}, '2024-12-31'))";
// Numeric range filter
const priceFilter = "AND({Price} >= 100, {Price} <= 500)";
// Text search filter
const searchFilter = "SEARCH('premium', LOWER({Product Name}))";
// Multiple conditions
const complexFilter = `
AND(
OR({Status} = 'Pending', {Status} = 'Processing'),
{Amount} > 100,
NOT({Customer} = '')
)
`;
// Create a single record
const result = await airtableFlow.create('Customers', {
'Name': 'John Doe',
'Email': 'john@example.com',
'Status': 'Active',
'City': 'San Francisco'
});
console.log(result.recordId); // ID of created record
// Update an existing record
const result = await airtableFlow.update('Customers', 'recXXXXXXXXXXXXXX', {
'Status': 'Inactive',
'Notes': 'Customer requested deactivation'
});
// Delete a record
const result = await airtableFlow.delete('Customers', 'recXXXXXXXXXXXXXX');
// Create a flow with predefined operations
const customerReaderFlow = new AirtableFlow({
operation: {
action: 'read',
tableName: 'Customers',
filterByFormula: "AND({Status} = 'Active', {City} = '${{input}}')",
maxRecords: 10
}
});
// Execute with dynamic input
const context = {
agentId: { generation: 0, familyCode: "", serialNumber: "" },
userPublicKey: "user123",
message: "New York", // This replaces ${{input}} in the filter
variables: {}
};
const result = await customerReaderFlow.execute(context);
import { AirtableFormulas, AirtableFilters } from '@skynetxbt/flow-airtable';
// Use built-in filter presets
const activeCustomersFilter = AirtableFilters.activeCustomers();
const recentOrdersFilter = AirtableFilters.recentOrders();
const highValueOrdersFilter = AirtableFilters.highValueOrders(1000);
// Create custom filters with formula helpers
const customFilter = AirtableFormulas.and(
AirtableFormulas.exactMatch('Status', 'Active'),
AirtableFormulas.textSearch('Name', 'john'),
AirtableFormulas.numericRange('Age', 25, 65)
);
// Use the filters
const result = await airtableFlow.readWithFilter('Customers', customFilter);
// Create multiple records
const customers = [
{ 'Name': 'Alice Johnson', 'Email': 'alice@example.com' },
{ 'Name': 'Bob Wilson', 'Email': 'bob@example.com' },
{ 'Name': 'Carol Brown', 'Email': 'carol@example.com' }
];
const createdRecords = [];
for (const customer of customers) {
const result = await airtableFlow.create('Customers', customer);
if (result.success) {
createdRecords.push(result);
}
}
The flow includes comprehensive TypeScript types:
import {
AirtableOperation,
AirtableResponse,
CustomerFields,
OrderFields,
ProductFields,
AirtableFormulas,
AirtableFilters
} from '@skynetxbt/flow-airtable';
// Use typed field definitions
const customer: CustomerFields = {
'Name': 'John Doe',
'Email': 'john@example.com',
'Status': 'Active'
};
try {
const result = await airtableFlow.readAll('Customers');
if (result.success) {
console.log('Data:', result.data);
} else {
console.error('Error:', result.error);
}
} catch (error) {
console.error('Exception:', error.message);
}
// Get all active customers
const activeCustomers = await airtableFlow.readWithFilter(
'Customers',
AirtableFilters.activeCustomers()
);
// Create new customer
const newCustomer = await airtableFlow.create('Customers', {
'Name': 'Jane Smith',
'Email': 'jane@example.com',
'Status': 'Active'
});
// Get recent high-value orders
const filter = AirtableFormulas.and(
AirtableFilters.recentOrders(),
AirtableFilters.highValueOrders(500)
);
const orders = await airtableFlow.readWithFilter('Orders', filter);
// Update order status
await airtableFlow.update('Orders', orderId, {
'Status': 'Shipped',
'Tracking Number': 'TRK123456789'
});
// Get low stock products
const lowStockFilter = "{In Stock} <= {Reorder Level}";
const lowStockProducts = await airtableFlow.readWithFilter('Products', lowStockFilter);
// Update stock levels
await airtableFlow.update('Products', productId, {
'In Stock': newStockLevel,
'Last Updated': new Date().toISOString()
});
readAll(tableName, options?)
: Read all records from a tablereadWithFilter(tableName, filter, options?)
: Read records with filtercreate(tableName, fields)
: Create a new recordupdate(tableName, recordId, fields)
: Update an existing recorddelete(tableName, recordId)
: Delete a recordexecute(context)
: Execute with FlowContext (for use in flow system)AirtableOperation
: Operation configuration interfaceAirtableResponse
: Response format interfaceCustomerFields
, OrderFields
, ProductFields
: Common field type definitionsAirtableFormulas
: Static class with formula helper methodsAirtableFilters
: Static class with common filter presetsContributions are welcome! Please read the contributing guidelines and submit pull requests for any improvements.
FAQs
Airtable integration for Skynet
The npm package @skynetxbt/flow-airtable receives a total of 349 weekly downloads. As such, @skynetxbt/flow-airtable popularity was classified as not popular.
We found that @skynetxbt/flow-airtable demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers 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.
Research
A malicious package uses a QR code as steganography in an innovative technique.
Research
/Security News
Socket identified 80 fake candidates targeting engineering roles, including suspected North Korean operators, exposing the new reality of hiring as a security function.
Application Security
/Research
/Security News
Socket detected multiple compromised CrowdStrike npm packages, continuing the "Shai-Hulud" supply chain attack that has now impacted nearly 500 packages.