anylist
Version:
📋 a wrapper for AnyList's API (unoffical, reverse engineered)
123 lines (83 loc) • 3.83 kB
Markdown
# 📋 AnyList

## a wrapper for AnyList's API (unofficial, reverse engineered)
### Install
`npm i anylist`
### Getting Started
Here's an example script (replace `email` and `password` with your credentials):
```javascript
const AnyList = require('anylist');
const any = new AnyList({email: 'hi.com', password: 'password'});
any.on('lists-update', lists => {
console.log('Lists were updated!');
});
any.login().then(async () => {
await any.getLists();
// Add new item to the Walmart list
const walmart = any.getListByName('Walmart');
let chips = any.createItem({name: 'Chips'});
chips = await walmart.addItem(chips);
// Check off added item
chips.checked = true;
// And change the quantity
chips.quantity = '2';
// Save updated item
await chips.save();
// Delete item
await walmart.removeItem(chips);
// Add a new calendar event
const calEvent = any.createEvent({title: "Do Laundry"});
await calEvent.save();
any.teardown();
});
```
### Getting Started with Recipes
```javascript
const AnyList = require('anylist');
const any = new AnyList({email: 'hi.com', password: 'password'});
any.login().then(async () => {
const recipeName = 'Congee recipe';
const testRecipe = await any.createRecipe(
{
name: recipeName,
note: 'this is a test note',
preparationSteps: ['# heading 1', 'this is preparation step 1'],
servings: '2 servings as main dish',
sourceName: 'serious eats',
sourceUrl: 'https://seriouseats.com',
scaleFactor: 1,
rating: 5,
ingredients: [{
rawIngredient: '1 garlic, chopped',
name: 'garlic',
quantity: '1',
note: 'chopped'
}],
nutritionalInfo: 'this is nutritional info',
cookTime: 5 * 60, // seconds
prepTime: 5 * 60, // seconds
creationTimestamp: Date.now() / 1000,
timestamp: Date.now() / 1000
}
);
// Save test recipe
await testRecipe.save();
const collection = any.createRecipeCollection({ name: 'ONLINE RECIPES' })
await collection.save();
await collection.addRecipe(testRecipe.identifier);
await collection.removeRecipe(testRecipe.identifier);
// clean up / delete test recipe collection
await collection.delete();
// cleanup / delete test recipe
await testRecipe.delete();
any.teardown();
});
```
### Persistent Credentials Storage
By default, the client ID and authentications tokens are encrypted with AES-256 encryption using your account password and then stored to disk. The default storage location is the `.anylist_credentials` file in the user home directory. If you wish to change the storage location, set the `credentialsFile` parameter of the `AnyList` constructor to the desired path. If you wish to disable persistent credentials storage, set the `credentialsFile` parameter to `null`.
### Notes/Tips
- There is **much** more functionality in the AnyList API that is not captured in this package, I just implemented the functions that I would be using. If there is functionality missing that you want, please open a PR and I'm happy to merge it in.
- (This means that you can't currently add/remove/update lists.)
- When adding new items, you should reuse existing, checked-off items if possible like the official clients do. Search the list by the item name with `list.getItemByName('item-name')` to see if it exists before adding a new instance.
### 📖 Docs
[Documentation](https://codetheweb.github.io/anylist/)