Coder Social home page Coder Social logo

contentful-export's Introduction

Contentful export tool

npm Build Status Dependency Status devDependency Status

semantic-release js-standard-style

Contentful provides a content infrastructure for digital teams to power content in websites, apps, and devices. Unlike a CMS, Contentful was built to integrate with the modern software stack. It offers a central hub for structured content, powerful management and delivery APIs, and a customizable web app that enable developers and content creators to ship digital products faster.

This is a library that helps you backup your Content Model, Content and Assets or move them to a new Contentful space. It will support Roles & Permissions in a future version.

To import your exported data, please refer to the contentful-import repository.

❗ Usage as CLI

We moved the CLI version of this tool into our Contentful CLI. This allows our users to use and install only one single CLI tool to get the full Contentful experience.

Please have a look at the Contentful CLI export command documentation to learn more about how to use this as command line tool.

☁️ Pre-requisites && Installation

Pre-requisites

  • Node LTS

☁️ Installation

npm install contentful-export

✋ Usage

const contentfulExport = require('contentful-export')

const options = {
  spaceId: '<space_id>',
  managementToken: '<content_management_api_key>',
  ...
}

contentfulExport(options)
  .then((result) => {
    console.log('Your space data:', result)
  })
  .catch((err) => {
    console.log('Oh no! Some errors occurred!', err)
  })

Querying

To scope your export, you are able to pass query parameters. All search parameters of our API are supported as documented in our API documentation.

const contentfulExport = require('contentful-export')

const options = {
  spaceId: '<space_id>',
  managementToken: '<content_management_api_key>',
  queryEntries: ['content_type=<content_type_id>']
}

contentfulExport(options)
...

The Export tool also support multiple inline queries.

const contentfulExport = require('contentful-export')

const options = {
  spaceId: '<space_id>',
  managementToken: '<content_management_api_key>',
  queryEntries: [
    'content_type=<content_type_id>',
    'sys.id=<entry_id>'
  ]
}

contentfulExport(options)
...

queryAssets uses the same syntax as queryEntries

Export an environment

const contentfulExport = require('contentful-export')

const options = {
  spaceId: '<space_id>',
  managementToken: '<content_management_api_key>',
  environmentId: '<environment_id>'
}

contentfulExport(options)
...

⚙️ Configuration options

Basics

spaceId [string] [required]

ID of the space with source data

environmentId [string] [default: 'master']

ID of the environment in the source space

managementToken [string] [required]

Contentful management API token for the space to be exported

deliveryToken [string]

Contentful Content Delivery API (CDA) token for the space to be exported.

Providing deliveryToken will export both entries and assets from the Contentful Delivery API, instead of the Contentful Management API. This may be useful if you want to export the latest published versions, as the management API always only exports the entirety of items, with the latest unpublished content. So if you want to make sure only to see the latest published changes, provide the deliveryToken.

Just to clarify: When Contentful Management API always returns the latest version (e.g. 50 in this case):

  "createdAt": "2020-01-06T12:00:00.000Z",
  "updatedAt": "2020-04-07T11:00:00.000Z",
  "publishedVersion": 23,
  "publishedAt": "2020-04-05T14:00:00.000Z",
  "publishedCounter": 1,
  "version": 50,

the Content Delivery API would return the publishedVersion (23). CDA responses don't include version number.

Note: Tags are only available on the Contentful Management API, so they will not be exported if you provide a Contenful Delivery Token. Tags is a new feature that not all users have access to.

Output

exportDir [string] [default: current process working directory]

Defines the path for storing the export JSON file

saveFile [boolean] [default: true]

Save the export as a JSON file

contentFile [string]

The filename for the exported data

Filtering

includeDrafts [boolean] [default: false]

Include drafts in the exported entries.

The deliveryToken option is ignored when includeDrafts has been set as true. If you want to include drafts, there's no point of getting them through the Content Delivery API.

includeArchived [boolean] [default: false]

Include archived entries in the exported entries

skipContentModel [boolean] [default: false]

Skip exporting content models

skipEditorInterfaces [boolean] [default: false]

Skip exporting editor interfaces

skipContent [boolean] [default: false]

Skip exporting assets and entries.

skipRoles [boolean] [default: false]

Skip exporting roles and permissions

skipTags [boolean] [default: false]

Skip exporting tags

skipWebhooks [boolean] [default: false]

Skip exporting webhooks

stripTags [boolean] [default: false]

Untag assets and entries

contentOnly [boolean] [default: false]

Only export entries and assets

queryEntries [array]

Only export entries that match these queries

queryAssets [array]

Only export assets that match these queries

downloadAssets [boolean]

Download actual asset files

Connection

host [string] [default: 'api.contentful.com']

The Management API host

proxy [string]

Proxy configuration in HTTP auth format: host:port or user:password@host:port

rawProxy [boolean]

Pass proxy config to Axios instead of creating a custom httpsAgent

maxAllowedLimit [number] [default: 1000]

The number of items per page per request

headers [object]

Additional headers to attach to the requests.

Other

errorLogFile [string]

Full path to the error log file

useVerboseRenderer [boolean] [default: false]

Display progress in new lines instead of displaying a busy spinner and the status in the same line. Useful for CI.

⛑️ Troubleshooting

Proxy

Unable to connect to Contentful through your proxy? Try to set the rawProxy option to true.

contentfulExport({
  proxy: 'https://cat:[email protected]:1234',
  rawProxy: true,
  ...
})

Error: 400 - Bad Request - Response size too big.

Contentful response sizes are limited (find more info in our technical limit docs). In order to resolve this issue, limit the amount of entities received within a single request by setting the maxAllowedLimit option:

contentfulExport({
  proxy: 'https://cat:[email protected]:1234',
  rawProxy: true,
  maxAllowedLimit: 50
  ...
})

🗃️ Exported data structure

This is an overview of the exported data:

{
  "contentTypes": [],
  "entries": [],
  "assets": [],
  "locales": [],
  "tags": [],
  "webhooks": [],
  "roles": [],
  "editorInterfaces": []
}

Note: Tags feature is not available for all users. If you do not have access to this feature, the tags array will always be empty.

⚠️ Limitations

  • This tool currently does not support the export of space memberships.
  • Exported webhooks with credentials will be exported as normal webhooks. Credentials should be added manually afterwards.
  • If you have custom UI extensions, you need to reinstall them manually in the new space.

📝 Changelog

Read the releases page for more information.

📜 License

This project is licensed under MIT license

contentful-export's People

Contributors

andreascful avatar anho avatar axe312ger avatar brad-turner avatar cachrisman avatar crissto avatar damienxy avatar dependabot-preview[bot] avatar dependabot[bot] avatar eshaibu avatar fkiriakos avatar jhilden avatar jjolton-contentful avatar jwhiles avatar khaledgarbaya avatar lkol avatar makinwab avatar marcolink avatar matthew-contentful avatar mgoudy91 avatar mugli avatar pciazynski avatar phoebeschmidt avatar rngadam avatar ruderngespra avatar t-col avatar veu avatar vinz93 avatar whitelisab avatar xavivars avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

contentful-export's Issues

--include-drafts should actually be --drafts-only?

A few thoughts regarding the --include-drafts flag:

  • I'm aware that draft exports aren't supported (as stated under limitations "Draft entries are not supported.") - should this argument be parsed at all in the current version if that is the case?

  • Passing --include-drafts actually filters all entries for type draft - should this flag be renamed to --drafts-only or perhaps instead introduce an entry type filter argument for filtering entries by type (draft, published, etc..)?

Heres where the filter is being applied : https://github.com/contentful/contentful-batch-libs/blob/master/lib/get/get-full-source-space.js#L28

Apologies if i'm missing something simple here or if this has already been discussed.

RangeError: Invalid string length error

Get the following error when I run the tool, in my config i have skipContentModel set to true, and maxAllowedLimit at 100.

ERR! export RangeError: Invalid string length
ERR! export     at JSON.stringify (<anonymous>)
ERR! export     at stringify (/usr/local/lib/node_modules/contentful-export/node_modules/json-stringify-safe/stringify.js:5:15)
ERR! export     at /usr/local/lib/node_modules/contentful-export/dist/index.js:148:80
ERR! export  Failed with
ERR! export  RangeError: Invalid string length
ERR! export     at JSON.stringify (<anonymous>)
ERR! export     at stringify (/usr/local/lib/node_modules/contentful-export/node_modules/json-stringify-safe/stringify.js:5:15)
ERR! export     at /usr/local/lib/node_modules/contentful-export/dist/index.js:148:80

Export promise does not include content

This was observed on 4.4.0 and 4.5.0.
It seems to be a regression of #43.

Running this:

const exportSpace = require('contentful-export');

exportSpace({
  managementToken: '...',
  spaceId: '...',
  saveFile: false
}).then(content => {
  console.log('content:', content);
});

yields output content: undefined.

Expected behavior is for content to be an object containing the space's content.

Remove max response size

I'm trying to export a backup of my content library and hitting the limit. "Response size too big, was: 15951862b. Maximum allowed response size: 7340032b.

Can't get contentful-export to run

With a vanilla node install, following the steps:

sudo npm install -g contentful-export

then:

contentful-export

I get the following response:

_$ contentful-export
module.js:471
throw err;
^

Error: Cannot find module 'babel-register'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at require (internal/module.js:20:19)
at Object. (/usr/local/lib/node_modules/contentful-export/index.js:5:5)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module.load (module.js:438:3)
at require (internal/module.js:20:19)

If I then do a global install of babel-register and re-run, I then get:

_$ contentful-export
module.js:471
throw err;
^

Error: Cannot find module './lib/run-contentful-export'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at require (internal/module.js:20:19)
at Object. (/usr/local/lib/node_modules/contentful-export/index.js:6:22)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module.load (module.js:438:3)
at require (internal/module.js:20:19)

[question] Is there a solution for exporting/backing up asset files?

Hi, we are currently archiving a couple of contentful spaces that are no longer used and this tool is coming in real handy. Thanks for that.
However, we also want to archive the asset files from these spaces and as far as I can tell, this tool is only exporting the textual data. Do you also have a prepared solution for downloading all the assets from a space for arachiving purposes?

Thanks

Cannot export large spaces

I am trying to export a very large space with over 160,000 entries.

I've noticed two issues during this experience:

Issue 1:

During the export, the tool hangs on these two lines for a particularly long time:
Fetching content entries data
Writing data to file

Then, the export fails and I get this error message:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

This happens for both myself and other users.

I did some research on this error and I'm guessing this is happening because the space has a large number of entries. It looks like you can set an option to Node to hopefully bypass this issue but I'm not sure how to configure it:
--max-old-space-size

Note: This only happens when I am trying to export very large spaces. All other exports work really well. 👍


Issue 2:

As a workaround, I would like to export the space in chunks.

I used the --query-entries option with two different queries (separately):
'content_type=contentTypeId'
'query-entries 'sys.id=<entry-id>'

So that my end command looks something like this:

contentful-export \
  --space-id spaceID \
  --management-token managementToken
  --query-entries 'content_type=contentTypeId'

However, these options aren't working for me. When I run the export, the export is still failing even when I am only trying to export one entry.

As a test, I added these options to an export command for a smaller space that is working and the exported .json file is still contains all content types, entries, etc.

Am I using the --query-entries option incorrectly or is there an issue with the option?

Thanks!

Attempting to export locales

I am currently attempting to export content from a space. When the tool attempts to export locales I receive a 404. I am not sure the tool has a defect, but I am trying to determine which piece of content has an invalid link or if I am not exporting correctly.

The error:
{
"ts": "2018-01-03T00:24:18.286Z",
"level": "error",
"error": {
"name": "NotFound",
"data": {
"status": 404,
"statusText": "Not Found",
"message": "The resource could not be found.",
"details": {
},
"request": {
"url": "https://api.contentful.com:443/spaces/<>/locales",
"headers": {
"Accept": "application/json, text/plain, /",
"Content-Type": "application/vnd.contentful.management.v1+json",
"X-Contentful-User-Agent": "app contentful.export/6.0.1; sdk contentful-management.js/4.1.2; platform node.js/6.9.3; os macOS/16.7.0;",
"Authorization": "Bearer ...b06a9",
"user-agent": "node.js/v6.9.3",
"Accept-Encoding": "gzip"
},
"method": "get"
},
"requestId": "be777c4a0e4e3cca1b585136eb64d1a7"
}
}
}

The command line

contentful-export --config ./wisdompanel-config.json --save-file true --download-assets true --export-dir ./export_from_breelib

The config file simply has my management token and space id.

Selective entry export by content type

It would be great if the user could configure which entries by content type or exported. For example, let's say I had content types called article, category and person and I only wanted to export category and person entries with a parameter like --include-content-types ["category", "person"].

Downloaded assets as a directory structure

Currently, using --download-assets leads to following structure:

info -> images.contentful.com-wrt0z7yqzgdv-5RcFxbAWHewIAUYyYICuMG-47338b8c1942f6dcea39c0516401925a-30623725952_3b69b32d19_z.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-46M4BUS6fugowgy00gqqMu-916d87aca80558c336b024feb0b228e4-Untitled-2.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-19JaQ3aMGuiSKUsI2KsAAM-eac8a3083554b653aa9ef9c14a2fce89-_MG_2331.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-6W2x4uDSKs80coyACEiGYW-61a385a17c3eba4ca279e9ae9b216c55-_MG_2374.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-4yfVijLvCU2eMqwgUu6WEA-a54f82dfd8fe81e8e774c811dd0b768c-IMG_0255.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-55fTahOv164w2amAo4SSwI-44ac695f7486e7c1c0869dc3e054ee61-Untitled-3.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-5vhzTJtFL2AGia0wqsYMow-ab20eb5fbcb29af2c4204f7fda606648-s.aolcdn-1.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-78WI8F6C76q68GgeiI4IMk-bec3ce147e29bbea98b5a093a8b5e107-s.aolcdn-1.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-2UquDPQ2EU2w6gAKoWSqUI-4f3416845457520fe19a3f76abd4f54f-_MG_2369.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-1b5mNrIy8s8UOcgssqGyuM-571abf178f6ea077692e348b58f19164-_MG_2355.jpg 
info -> images.contentful.com-wrt0z7yqzgdv-1Ff9CzUuOIy2IE2wEEG0wE-d3149a094cc08bc21cebfbceed5f732b-home4.gif 
info -> images.contentful.com-wrt0z7yqzgdv-5HGQOMyHZYMcA4ucigWUuC-4fefd4cf7793a22fac920aac3f0c976a-home1.gif 
info -> images.contentful.com-wrt0z7yqzgdv-4z7SRP4Jd6AUSUgSqGIqkO-763f00fb3513315b46e8b63a31d4f4bb-home2.gif 

would like an alternative where each parts is a directory structure:

images.contentful.com/
  wrt0z7yqzgdv/
    1b5mNrIy8s8UOcgssqGyuM/
      d3149a094cc08bc21cebfbceed5f732b/
         home4.gif 

...as I expect our CMS to grow to a large number of files, a proper directory structure would lead to better performance on the filesystem (large number of files in a single directory is generally bad and hard to manage).

403: The access token you sent could not be found or is invalid

Hi there

I try to export data from the space using this config in export.json:

{
    "spaceId": SPACE_ID,
    "managementToken": ACCESS_TOKEN,
    "queryEntries": NEEDED_TYPE
}

Export command:
contentful-export --config export.json

But I got this:
Error: Status: 403 - Forbidden - Message: The access token you sent could not be found or is invalid.

Though, I use the valid token (it works on my localhost) and contentful-export 6.0.4
OS: Mac

What could be wrong?

thanks

--query-entries doesn't apply conditions

Hello,
Am having an issue with --query-entries. Am trying to export a specific contentType by using --query-entries 'content_type=my contentType' but it export all contentType available in my space

Missing dependencies

> npm install -g contentful-export
/usr/local/bin/contentful-export -> /usr/local/lib/node_modules/contentful-export/bin/contentful-export
/usr/local/lib
└─┬ [email protected] 
  ├── [email protected] 
  ├─┬ [email protected] 
  │ ├─┬ [email protected] 
  │ │ ├── [email protected] 
  │ │ └── [email protected] 
  │ ├─┬ [email protected] 
  │ │ └─┬ [email protected] 
  │ │   ├─┬ [email protected] 
  │ │   │ ├─┬ [email protected] 
  │ │   │ │ └── [email protected] 
  │ │   │ └── [email protected] 
  │ │   └── [email protected] 
  │ ├── [email protected] 
  │ └─┬ [email protected] 
  │   ├── [email protected] 
  │   └─┬ [email protected] 
     ├── [email protected] 
  │     ├── [email protected] 
  │     └── [email protected] 
  ├─┬ [email protected] 
  │ ├── [email protected] 
  │ ├── [email protected] 
  │ ├── [email protected] 
  │ ├── [email protected] 
  │ └─┬ [email protected] 
  │   └─┬ [email protected] 
  │     ├── [email protected] 
  │     ├─┬ [email protected] 
  │     │ └── [email protected] 
  │     ├── [email protected] 
  │     ├─┬ [email protected] 
  │     │ └─┬ [email protected] 
  │     │   ├── [email protected] 
  │     │   └── [email protected] 
  │     └── [email protected] 
  ├── [email protected] 
  ├── [email protected] 
  ├─┬ [email protected] 
  │ ├─┬ [email protected] 
  │ │ ├── [email protected] 
  │ │ └─┬ [email protected] 
  │ │   ├── [email protected] 
  │ │   ├── [email protected] 
  │ │   ├── [email protected] 
  │ │   ├── [email protected] 
  │ │   ├── [email protected] 
  │ │   └── [email protected] 
  │ ├── [email protected] 
  │ ├─┬ [email protected] 
  │ │ ├── [email protected] 
  │ │ ├── [email protected] 
  │ │ ├── [email protected] 
  │ │ ├── [email protected] 
  │ │ ├── [email protected] 
  │ │ ├─┬ [email protected] 
  │ │ │ └── [email protected] 
  │ │ └── [email protected] 
  │ └── [email protected] 
  └─┬ [email protected] 
    ├─┬ [email protected] 
    │ └── [email protected] 
    ├── [email protected] 
    ├── [email protected] 
    ├── [email protected] 
    ├─┬ [email protected] 
    │ └─┬ [email protected] 
    │   └── [email protected] 
    ├─┬ [email protected] 
    │ ├─┬ [email protected] 
    │ │ ├── [email protected] 
    │ │ └─┬ [email protected] 
    │ │   └── [email protected] 
    │ └─┬ [email protected] 
    │   ├─┬ [email protected] 
    │   │ ├─┬ [email protected] 
    │   │ │ └─┬ [email protected] 
    │   │ │   └── [email protected] 
    │   │ ├── [email protected] 
    │   │ └─┬ [email protected] 
    │   │   └── [email protected] 
    │   ├─┬ [email protected] 
    │   │ ├── [email protected] 
    │   │ ├─┬ [email protected] 
    │   │ │ └── [email protected] 
    │   │ ├── [email protected] 
    │   │ └─┬ [email protected] 
    │   │   ├─┬ [email protected] 
    │   │   │ └── [email protected] 
    │   │   └── [email protected] 
    │   └── [email protected] 
    ├── [email protected] 
    ├── [email protected] 
    ├─┬ [email protected] 
    │ ├── [email protected] 
    │ └─┬ [email protected] 
    │   └── [email protected] 
    ├── [email protected] 
    ├── [email protected] 
    ├── [email protected] 
    └─┬ [email protected] 
      └── [email protected] 

fails:

module.js:442
    throw err;
    ^

Error: Cannot find module 'babel-register'
    at Function.Module._resolveFilename (module.js:440:15)
    at Function.Module._load (module.js:388:25)
    at Module.require (module.js:468:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/usr/local/lib/node_modules/contentful-export/index.js:5:5)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)

workaround:

npm install -g babel-register

then fails:

module.js:442
    throw err;
    ^

Error: Cannot find module './lib/run-contentful-export'
    at Function.Module._resolveFilename (module.js:440:15)
    at Function.Module._load (module.js:388:25)
    at Module.require (module.js:468:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/usr/local/lib/node_modules/contentful-export/index.js:6:22)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)

Not sure what's going on here. The repo seems to have dist/run-contentful-export.js.

NPM Error Path - .staging\trier-49b97969

Hi,

I'm attempting to leverage this code to spin up some test environments in Contentful. I have reinstalled all the way back down to Node locally and still running into this error on installation. Any thoughts? I swapped out my username below

npm ERR! path C:\Users<username>\AppData\Roaming\npm\node_modules.staging\trier-49
b97969\h

Let me know if you want the detailed log

Create folder if it doesn't exist already

Create folder if it doesn't exist already

CURRENT:

> contentful-export --space-id $SPACE_ID --management-token $MANAGEMENT_TOKEN --export-dir staging
info Contentful Export Tool:
Fetching Space data ... 
info Getting content from source space 
info Writing space data to json file at : staging/contentful-export-$SPACE_ID-1478489142094.json 
fs.js:95
      throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
      ^

Error: ENOENT: no such file or directory, open 'staging/contentful-export-wrt0z7yqzgdv-1478489142094.json'
    at Error (native)

EXPECTED

Create folder if it doesn't exist.

Different result on export vs CDN API

I have 2 entries in my space, with different content types.

spaceExport({
    managementToken,
    spaceId: FROM_SPACE_ID,
    saveFile: false,
    skipWebhooks: true,
    skipRoles: true,
    skipContentModel: false
})

and https://cdn.contentful.com/spaces/FROM_SPACE_ID/entries?select=fields&locale=* return different things. I'll paste the keys of the objects only:

NODEJS:

// Entry #1 fields keys
[ 'translations',
  'dislcaimers',
  'name',
  'locale',
  'globalContent',
  'navigation',
  'transitions',
  'disclaimers' ]
// Entry #2 fields keys
[ 'name', 'translations' ]

CDN API:

// Entry #1 fields keys
[ 'name',
  'locale',
  'globalContent',
  'navigation',
  'transitions',
  'disclaimers'
]
// Entry #2 fields keys
[ 'name', 'translations' ]

Also note how via NodeJS I'm getting a dislcaimers (typo) field on an entry that API doesn't have it at all. And I'm using include drafts false (default value)

defualt destination path returning error

Downloading and pasting my personal oAuth token (found in docs) and my SpaceId into the project returns the following. The readme says undefined should return in the same folder

info Contentful Export Tool:
Fetching Space data ...
info Getting content from source space
ERR!
The destination space was not found. This can happen for multiple reasons:
- If you haven't yet, you should create your space manually.
- If your destination space is in another organization, and your user from the source space does not have access to it, you'll need to specify separate sourceManagementToken and destinationManagementToken```

Include an option to specify filename?

Hi Contentful,

My name is Tom, I'm an engineer at Huge. I know that our engineers and Contentful have had an ongoing dialogue around this tool (along with the export tool) and that some of the 4.1 changes were the result of the conversation we had a few weeks ago. I'd find it really useful to be able to specify an output filename as an option, with the fallback being existing behavior. Would you guys be receptive to that? I have no problem submitting a PR including this feature if you'd like.

Best,
Tom Peduto (and Huge)

usage as a library doesn't work as expected

using the example given in the Readme:

var spaceExport = require('contentful-export')
var options = {
  maxAllowedItems: 100,
  errorLogFile: 'filename',
  ...
}
spaceExport(options)
.then((output) => {
  console.log('space data', output)
})
.catch((err) => {
  console.log('oh no! errors occurred!', err)
})

only returns space data undefined.

It seems the tool should know when it is being run as a library and directly return the data rather than write it to a json file.

Support for incremental backup

HI,

It would be awesome if this tool supported incremental backup, so we can run regular backup without exploding bandwidth and storage usage.

Thanks !

`spaceExport` Promise is Rejected when only "Warnings" are encountered

When encountering rate limits during export, the spaceExport Promise is rejected which makes using contentful-export as a library nearly impossible. Is there something wrong with my code below causing this error to be thrown?

async function main() {
  // Export the `Genuine` space
  try {
    const exportOptions = {
      spaceId: GENUINE_SPACE_ID,
      managementToken: CONTENTFUL_MANAGEMENT_TOKEN,
      skipRoles: true,
      skipWebhooks: true,
      saveFile: true,
      exportDir: path.join(__dirname, "exports")
    };

    const genuineContent = await spaceExport(exportOptions);
    console.log(JSON.stringify(genuineContent, null, 2));
  } catch (error) {
    console.error(error);
    console.log("Why does this throw an error");
  }
}

Full Output:

✔ Initialize clients
 ✔ Fetching data from space
   ✔ Connecting to space (1s)
   ✔ Fetching content types data (1s)
   ✔ Fetching editor interfaces data (4s)
   ✔ Fetching content entries data (1s)
   ✔ Fetching assets data (1s)
   ✔ Fetching locales data (1s)
   ↓ Fetching webhooks data [skipped]
   ↓ Fetching roles data [skipped]
 ↓ Download assets [skipped]
 ✔ Write export log file
   ✔ Lookup directory to store the logs
   ✔ Create log directory
   ✔ Writing data to file
┌────────────────────────┐
│ Exported entities      │
├───────────────────┬────┤
│ Content Types     │ 23 │
├───────────────────┼────┤
│ Editor Interfaces │ 23 │
├───────────────────┼────┤
│ Entries           │ 43 │
├───────────────────┼────┤
│ Assets            │ 2  │
├───────────────────┼────┤
│ Locales           │ 1  │
└───────────────────┴────┘
The export took a few seconds (5s)

Stored space data to json file at: /Users/kyle_pollich/Workspace/work/ntropic/ntropic/contentful/scripts/exports/contentful-export-miuu6vdtqk8r-2018-01-18T13-45-91.json


The following 0 errors and 5 warnings occurred:

13:45:99 - Rate limit error occurred. Waiting for 1658 ms before retrying...
13:45:03 - Rate limit error occurred. Waiting for 1540 ms before retrying...
13:45:57 - Rate limit error occurred. Waiting for 1631 ms before retrying...
13:45:68 - Rate limit error occurred. Waiting for 1535 ms before retrying...
13:45:68 - Rate limit error occurred. Waiting for 1558 ms before retrying...

Stored the detailed error log file at:
/Users/kyle_pollich/Workspace/work/ntropic/ntropic/contentful/scripts/exports/contentful-export-error-log-miuu6vdtqk8r-2018-01-18T13-45-91.json
{ ContentfulMultiError: Errors occured
    at /Users/kyle_pollich/Workspace/work/ntropic/ntropic/node_modules/contentful-batch-libs/dist/utils/logging.js:160:22
    at <anonymous>
  name: 'ContentfulMultiError',
  errors:
   [ { ts: '2018-01-18T18:45:02.993Z',
       level: 'warning',
       warning: 'Rate limit error occurred. Waiting for 1658 ms before retrying...' },
     { ts: '2018-01-18T18:45:03.030Z',
       level: 'warning',
       warning: 'Rate limit error occurred. Waiting for 1540 ms before retrying...' },
     { ts: '2018-01-18T18:45:03.575Z',
       level: 'warning',
       warning: 'Rate limit error occurred. Waiting for 1631 ms before retrying...' },
     { ts: '2018-01-18T18:45:03.686Z',
       level: 'warning',
       warning: 'Rate limit error occurred. Waiting for 1535 ms before retrying...' },
     { ts: '2018-01-18T18:45:03.688Z',
       level: 'warning',
       warning: 'Rate limit error occurred. Waiting for 1558 ms before retrying...' } ] }
Why does this throw an error

I wind up with an error log file containing the rate limit warnings, but I know the export was successful because I also have a contentful-export...json file that contains the full export from Contentful of my space as expected. Is there some way to squash this error output for warnings? I can work around this by squashing the error manually (maybe), but this seems like a design flaw for using this module as a Node library.

Thanks!

getFullSourceSpace.then is not a function

This was observed on 4.5.1.

It looks like the API of getFullSourceSpace changed to no longer return a promise in the recent version bump of contentful-batch-lib.
Let me know if you want me to re-file the issue on contentful-batch-lib, instead.

Running this:

const exportSpace = require('contentful-export');

exportSpace({
  managementToken: '...',
  spaceId: '...',
  saveFile: false
}).then(content => {
  console.log('content:', content);
});

yields output

 ✔ Initialize clients
 ✖ Fetching data from space
   → (0 , _getFullSourceSpace2.default)(...).then is not a function
   Download assets
   Writing data to file

Expected behavior is for the export to complete without error.

`management-host` renamed to `host` in 7.0.0

I was wondering why my code wouldn't work with spaces I've been using with this tool before.

Turns out the --management-host parameter got renamed to --host in 7.0.0. Same goes for the managementHost parameter in the options object when used as a npm package.

I'd suggest to re-introduce --management-host (cli) and managementHost (node) and keep host as an alias in both cases.

Export fails on 404 error

Export fails every time on a 404 error. It varies on what resource it fails on. I have experienced at least roles, locales, and webhook_definitions returning 404.

I have double checked that the space id is correct.

❯ contentful-export --config export-config.json 
info Contentful Export Tool:
Fetching Space data ... 
info Getting content from source space 
ERR! Failed with
 NotFound: {
ERR! Failed with
   "request": {
ERR! Failed with
     "url": "https://api.contentful.com:443/spaces/XXX/locales",
ERR! Failed with
     "headers": {
ERR! Failed with
       "Accept": "application/json, text/plain, */*",
ERR! Failed with
       "Content-Type": "application/vnd.contentful.management.v1+json",
ERR! Failed with
       "X-Contentful-User-Agent": "contentful-management.js/1.3.0",
ERR! Failed with
       "Authorization": "Bearer YYY",
ERR! Failed with
       "user-agent": "node.js/v6.5.0",
ERR! Failed with
       "Accept-Encoding": "gzip"
ERR! Failed with
     },
ERR! Failed with
     "method": "get"
ERR! Failed with
   },
ERR! Failed with
   "status": 404,
ERR! Failed with
   "statusText": "Not Found",
ERR! Failed with
   "requestId": "ea8efc9e7829d7f1c6d04c9c84faad4c",
ERR! Failed with
   "message": "The resource could not be found."
ERR! Failed with
 }
ERR! Failed with
     at errorHandler (/path/to/node_modules/contentful-management/dist/error-handler.js:67:15)
ERR! Failed with
     at process._tickCallback (internal/process/next_tick.js:103:7)
ERR! Failed with
  { NotFound: {
ERR! Failed with
   "request": {
ERR! Failed with
     "url": "https://api.contentful.com:443/spaces/XXX/locales",
ERR! Failed with
     "headers": {
ERR! Failed with
       "Accept": "application/json, text/plain, */*",
ERR! Failed with
       "Content-Type": "application/vnd.contentful.management.v1+json",
ERR! Failed with
       "X-Contentful-User-Agent": "contentful-management.js/1.3.0",
ERR! Failed with
       "Authorization": "Bearer YYY",
ERR! Failed with
       "user-agent": "node.js/v6.5.0",
ERR! Failed with
       "Accept-Encoding": "gzip"
ERR! Failed with
     },
ERR! Failed with
     "method": "get"
ERR! Failed with
   },
ERR! Failed with
   "status": 404,
ERR! Failed with
   "statusText": "Not Found",
ERR! Failed with
   "requestId": "ea8efc9e7829d7f1c6d04c9c84faad4c",
ERR! Failed with
   "message": "The resource could not be found."
ERR! Failed with
 }
ERR! Failed with
     at errorHandler (/path/to/node_modules/contentful-management/dist/error-handler.js:67:15)
ERR! Failed with
     at process._tickCallback (internal/process/next_tick.js:103:7)
ERR! Failed with
   name: 'NotFound',
ERR! Failed with
   message: '{\n  "request": {\n    "url": "https://api.contentful.com:443/spaces/XXX/locales",\n    "headers": {\n      "Accept": "application/json, text/plain, */*",\n      "Content-Type": "application/vnd.contentful.management.v1+json",\n      "X-Contentful-User-Agent": "contentful-management.js/1.3.0",\n      "Authorization": "Bearer YYY",\n      "user-agent": "node.js/v6.5.0",\n      "Accept-Encoding": "gzip"\n    },\n    "method": "get"\n  },\n  "status": 404,\n  "statusText": "Not Found",\n  "requestId": "ea8efc9e7829d7f1c6d04c9c84faad4c",\n  "message": "The resource could not be found."\n}' }

Config

{
  "spaceId": "XXX",
  "managementToken": "YYY",
  "previewToken": "ZZZ",
  "exportDir": "/tmp/contentful-export",
  "includeDrafts": "true",
  "downloadAssets": "true"
}

Edit: I noticed that in my config the includeDrafts and downloadAssets are strings when they probably should be boolean, but that doesn't affect the end result. In both cases I'm getting the 404.

How many API calls per export/import

As Contentful uses the number of API calls in its pricing model, it'd be very useful if it's described on README how we can calculate the number of API calls that will be made per export/import with contentful-export and contentful-import.

Query (on `next` branch) results in 400 error

I tried out the new --query functionality on the next branch. I ran ./bin/contentful-export --config config.json --query content_type=[contentType] and got an InvalidQuery error.

The code is passing the query parameters (content_type=[contentType]) to getFullSourceSpace. This content_type query parameter works with Entries, but not with Assets, which don't have a ContentType. getFullSourceSpace is passing the query parameter to the GET for Assets, which is resulting in the InvalidQuery error. The GET for Entries works just fine.

It seems that you'll have to filter out the content_type query param when setting up the query for Assets.

We need the --query flag to work so that we can filter the import of entries by ContentType.

@Khaledgarbaya

Package does not work as a library

Steps to reproduce the problem:

  • npm init a project on node 4.3.2
  • npm i --save-dev contentful-export

Then run the following code:

const spaceExport = require('contentful-export')

const options = {
  spaceId: 'a_valid_space_id',
  managementToken: 'a_valid_mgmnt_token',
};

spaceExport(options)
  .then((output) => {
    console.log('space data', output)
  })
  .catch((err) => {
    console.log('oh no! errors occurred!', err)
  })

Throws the following error:

/exporter/node_modules/contentful-export/node_modules/contentful-batch-libs/utils/create-clients.js:34
    spaceId: opts.sourceSpace
                 ^

TypeError: Cannot read property 'sourceSpace' of undefined
    at createClients (exporter/node_modules/contentful-export/node_modules/contentful-batch-libs/utils/create-clients.js:34:18)
    at runContentfulExport (exporter/node_modules/contentful-export/dist/run-contentful-export.js:41:45)
    at Object.<anonymous> (exporter/index.js:9:1)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:134:18)
    at node.js:962:3

Using the same SPACE_ID and MANAGEMENT_TOKEN in the CLI works correctly.

My use case is I'd like to create automatic backup AWS Lambdas to backup my Contentful spaces, and the CLI tool is not an option in this context.

--query-entries option does not work

The --query-entries option does not appear to work. I've tested both from the terminal and a Node app.

For the latter, when I add the --query-entries option to my script file, the export doesn't run and I get this error:
TypeError: options.queryEntries.join is not a function

I've tried with both single and double quotes (and also tried putting the value in an array).

This is what the line looks like:
queryEntries: 'content_type=blogPost',

When I run this tool via a Node app, I don't get any errors but the export file still contains all content types, not just the one I filtered for.

When I run the tool in the terminal, it stops at this line:
Fetching content entries data

And I get this error:

Error: Status: 400 - Bad Request - Message: The query you sent was invalid. Probably a filter or ordering specification is not applicable to the type of a field. - Details: The path "[content_type" is not recognized - Request ID: 88982417a5979a9b4b8d16b200b2eb29

This is the command I am using (per the documentation):

contentful-export \
  --space-id spaceID \
  --management-token managementToken \
  --query-entries 'content_type=blogPost'

I am using Mac OS v10.13.2.
Export tool version: 6.0.4
Node version: 8.9.4

Add proxy support

Under certain conditions, particularly in enterprise environments, it's sometimes required to pass requests through proxies. It would be useful for this tool to support http proxies.

TypeError: Cannot read property 'url' of undefined

Steps to reproduce:

  1. npm i -g contentful-export on Node 7.4.0.
  2. Create a config.json like so (tokens replaced):
{
  "spaceId": "...",
  "managementToken": "...",
  "includeDrafts": "true",
  "previewToken": "...",
  "maxAllowedLimit": "5000"
}
  1. run contentful-export --config config.json

It gets to "Getting content from source space" and then after about a minute I receive the following error message:

ERR! 
The destination space was not found. This can happen for multiple reasons:
- If you haven't yet, you should create your space manually.
- If your destination space is in another organization, and your user from the source space does not have access to it, you'll need to specify separate sourceManagementToken and destinationManagementToken

The readme says nothing regarding a destination space, and I'm not sure why that would even come up as this is simply exporting from a source space to a JSON file.

Process exits with status 0 on error; should be non-zero

The contentful-export script exits with status 0 even when there are errors. This is problematic if you are running this script via another script or in a CI tool like Jenkins.

It should return a non-zero error code on error.

I noticed this when I experienced the error described in #26

Socket hang up errors sometimes when exporting assets

I'm getting Error: socket hang up sometimes. It's not consistent. Most runs are with 0 errors. But I've gotten errors on at least three separate runs. The number of errors varies. Most errors I've gotten in a single run is 23.

As an end result the files exist but their size is 0

❯ contentful-export --config export-config.json 
info Contentful Export Tool:
Fetching Space data ... 
info Getting content from source space 
info Downloading 1912 assets 
WARN -> asset has no file(s) ...
#### cut off some warnings ####
info Writing space data to json file at : /tmp/contentful-export/contentful-export-XXX-1482330229644.json 
ERR! -> error downloading //images.contentful.com/XXX/5mkg8P3LdCMAi6WCsaAsie/9a5471c3763ff7897f484a447deee3a1/filename1.png => Error: socket hang up 
ERR! -> error downloading //images.contentful.com/XXX/6sLTuranBuA6ciooiMs4SI/37a46f720900b93b97676ae15c96d0ce/filename2.png => Error: socket hang up 
info -> /tmp/contentful-export/images.contentful.com/XXX/N8AhFEp7eE8yQa6IIQKCe/ceaa1a646e33860c358602f8600b2ab8/filename3.png 
#### cut off info lines ####
info All 1912 downloads finished 
info successes: 1889 
info warnings: 21 
info errors: 2 
❯ ls -l /tmp/contentful-export/images.contentful.com/XXX/5mkg8P3LdCMAi6WCsaAsie/9a5471c3763ff7897f484a447deee3a1/filename1.png 
-rw-r--r-- 1 antti antti 0 Dec 21 16:38 /tmp/contentful-export/images.contentful.com/XXX/5mkg8P3LdCMAi6WCsaAsie/9a5471c3763ff7897f484a447deee3a1/filename1.png

opts and errorLogFile are undefined in runContentfulExport

When runContentfulExport is called in bin, setTimeout(function () { runContentfulExport(usageParams)... it is called with only usageParams.

let {opts, errorLogFile} = usageParams is incorrectly set. ES6 interprets it as let opts = usageParams.opts, let errorLogFile = usageParams.errorLogFile

opts being undefined, maxAllowedLimit and includeDrafts can not be set. This issue was brought up here.

Additionally, errorLogFile being undefined is reflected in the issue here.

Working PR out as a patch here.

Export fails on 404 error

I tried to export the space with command
contentful-export --space-id=xxx --management-token=xxx

I have Administrator role for the source space.

Its giving following error
ERR! Failed with
NotFound: {
ERR! Failed with
"request": {
ERR! Failed with
"url": "https://api.contentful.com:443/spaces/xxx",
ERR! Failed with
"headers": {
ERR! Failed with
"Accept": "application/json, text/plain, /",
ERR! Failed with
"Content-Type": "application/vnd.contentful.management.v1+json",
ERR! Failed with
"X-Contentful-User-Agent": "contentful-management.js/1.3.1",
ERR! Failed with
"Authorization": "Bearer xyyy",
ERR! Failed with
"user-agent": "node.js/v5.10.1",
ERR! Failed with
"Accept-Encoding": "gzip"
ERR! Failed with
},
ERR! Failed with
"method": "get"
ERR! Failed with
},
ERR! Failed with
"status": 404,
ERR! Failed with
"statusText": "Not Found",
ERR! Failed with
"requestId": "1e005f504a5eeb9fa2e9c7653248f2d4",
ERR! Failed with
"message": "The resource could not be found."
ERR! Failed with
}
ERR! Failed with
at errorHandler (/path/to/node_modules\contentful-export\no
de_modules\contentful-management\dist\error-handler.js:65:15)
ERR! Failed with
at run (/path/to/node_modules\contentful-export\node_module
s\core-js\library\modules\es6.promise.js:87:22)
ERR! Failed with
at /path/to/node_modules\contentful-export\node_modules\cor
e-js\library\modules\es6.promise.js:100:28
ERR! Failed with
at flush (/path/to/node_modules\node_modules\contentful-export\node_modu
les\core-js\library\modules_microtask.js:18:9)
ERR! Failed with
at _combinedTickCallback (internal/process/next_tick.js:67:7)
ERR! Failed with
at process._tickCallback (internal/process/next_tick.js:98:9)
ERR! Failed with
{ [NotFound: {
ERR! Failed with
"request": {
ERR! Failed with
"url": "https://api.contentful.com:443/spaces/62i11p9ten5u",
ERR! Failed with
"headers": {
ERR! Failed with
"Accept": "application/json, text/plain, /",
ERR! Failed with
"Content-Type": "application/vnd.contentful.management.v1+json",
ERR! Failed with
"X-Contentful-User-Agent": "contentful-management.js/1.3.1",
ERR! Failed with
"Authorization": "Bearer xyxy",
ERR! Failed with
"user-agent": "node.js/v5.10.1",
ERR! Failed with
"Accept-Encoding": "gzip"
ERR! Failed with
},
ERR! Failed with
"method": "get"
ERR! Failed with
},
ERR! Failed with
"status": 404,
ERR! Failed with
"statusText": "Not Found",
ERR! Failed with
"requestId": "1e005f504a5eeb9fa2e9c7653248f2d4",
ERR! Failed with
"message": "The resource could not be found."
ERR! Failed with
}]
ERR! Failed with
name: 'NotFound',
ERR! Failed with
message: '{\n "request": {\n "url": "https://api.contentful.com:443/spaces/xxx",\n
"headers": {\n "Accept": "application/json, text/plain, /",\n "Content-Type": "applica
tion/vnd.contentful.management.v1+json",\n "X-Contentful-User-Agent": "contentful-management.js
/1.3.1",\n "Authorization": "Bearer xyx",\n "user-agent": "node.js/v5.10.1",\n "Accept-Encoding": "gzip"\n },\n "metho
d": "get"\n },\n "status": 404,\n "statusText": "Not Found",\n "requestId": "1e005f504a5eeb9fa2e
9c7653248f2d4",\n "message": "The resource could not be found."\n}' }

Kindly request for help.

--quiet parameter for no output

Especially when using this library as a node module, it would be great to have an option (e.g. --quiet) to suppress the progress output.

Right now I have to work around this by using e.g. intercept-stdout.

Does not work on Linux

Getting error /usr/bin/env: ‘node --harmony’: No such file or directory when trying to run on command line.

When I Google that error message, all results say that the arguments in hashbang just don't work on Linux.

I'm using contentful-export 2.2.0.

❯ uname -a
Linux a1 4.8.14-1-MANJARO #1 SMP PREEMPT Sat Dec 10 23:58:26 UTC 2016 x86_64 GNU/Linux
❯ bash --version
GNU bash, version 4.4.5(1)-release (x86_64-unknown-linux-gnu)
❯ node --version
v6.5.0
❯ npm --version
3.10.3
❯ contentful-export --version
/usr/bin/env: ‘node --harmony’: No such file or directory

Cannot run export tool

using Node v3.10.3 it appears that it cannot find the babel package.

Error: Cannot find module 'babel-register'
at Function.Module._resolveFilename (module.js:440:15)
at Function.Module._load (module.js:388:25)
at Module.require (module.js:468:17)
at require (internal/module.js:20:19)
at Object. (/usr/local/lib/node_modules/contentful-export/index.js:5:5)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)

Can't export without drafts

I've got the following config file:

{
  "spaceId": "xxx",
  "managementToken": "xxx",
  "includeDrafts": false,
  "downloadAssets": false
}

When I run contentful-export --config export-config.json, I'm getting the following error: Missing required argument: preview-token.

When I add it, so that my config file looks like:

{
  "spaceId": "xxx",
  "managementToken": "xxx",
  "previewToken": "xxx",
  "includeDrafts": false,
  "downloadAssets": false
}

I'm getting ERR! Please make sure to specify --include-drafts to be able to get drafts error.

export specific content types or models

A nice addition would be the ability to define a comma-separated list of models / entries to export from a specific space.

i.e. )
I have a space that has models X, Y, & Z.
I want to get all entries of type Y & Z only via the export utility.
I then want to import only entries of type Z to a new space on a daily basis.

A param like:
entry-content-types=Y,Z

Documentation for arguments to --query-entries lacking

The format for the arguments to --query-entries is not clear, it would be great to read more about it in

  1. README.md
  2. content-export --help

Both the json and the commandline versions would be great to describe, otherwise it takes a lot of poking around to figure it out.

Any plans for an import tool?

This tool allow me to export Contentful spaces and keep backups available.

Do you have any plans to make the same tool in reverse, to handle importing of a Space from a JSON dump generated using contentful-export?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.