A simple CLI for scaffolding Storyblok projects and fieldtypes.
You found an issue?
Tell us about it - open an issue or look if it was already reported.
Make sure you've node >= 9.11.0
installed.
$ npm i storyblok -g
Usage to kickstart a boilerplate, fieldtype or theme
$ storyblok select
Download your space's components schema as json. This command will download 2 files: 1 for the components and 1 for the presets.
$ storyblok pull-components --space <SPACE_ID>
space
: your space id
Push your components file to your/another space
$ storyblok push-components <SOURCE> --space <SPACE_ID> --presets-source <PRESETS_SOURCE>
source
: can be a URL or path to JSON file.
Using an URL
$ storyblok push-components https://raw.githubusercontent.com/storyblok/nuxtdoc/master/seed.components.json --space 67819
Using a path to file
$ storyblok push-components ./components.json --space 67819
space
: your space idpresets-source
(optional): it can be a URL or path to JSON file with the presets
Using an URL for presets-source
$ storyblok push-components https://raw.githubusercontent.com/storyblok/nuxtdoc/master/seed.components.json --presets-source https://url-to-your-presets-file.json --space 67819
Using a path to file
$ storyblok push-components ./components.json --presets-source ./presets.json --space 67819
Sync components, folder, roles, datasources or stories between spaces
$ storyblok sync --type <COMMAND> --source <SPACE_ID> --target <SPACE_ID>
type
: describe the command type to execute. Can be:folders
,components
,stories
,datasources
orroles
. It's possible pass multiple types separated by comma (,
).source
: the source space to use to synctarget
: the target space to use to sync
# Sync components from `00001` space to `00002` space
$ storyblok sync --type components --source 00001 --target 00002
# Sync components and stories from `00001` space to `00002` space
$ storyblok sync --type components,stories --source 00001 --target 00002
Create a space in Storyblok and select the boilerplate to use
$ storyblok quickstart
Logout from the Storyblok cli
$ storyblok logout
Login to the Storyblok cli
$ storyblok login
Create a migration file (with the name change_<COMPONENT>_<FIELD>.js
) inside the migrations
folder. Check Migrations section to more details
$ storyblok generate-migration --space <SPACE_ID> --component <COMPONENT_NAME> --field <FIELD>
space
: space where the component iscomponent
: component name. It needs to be a valid componentfield
: name of field
Execute a specific migration file. Check Migrations section to more details
$ storyblok run-migration --space <SPACE_ID> --component <COMPONENT_NAME> --field <FIELD> --dryrun
Optionally you can provide the publish parameter to publish content after saving. Example:
$ storyblok run-migration --publish published --space 1234 --component article --field image
space
: the space you get from the space settings areacomponent
: component name. It needs to be a valid componentfield
: name of fielddryrun
: when passed as an argument, does not perform the migrationpublish
(optional): publish the content when updateall
: publish all stories, even if they have not yet been publishedpublished
: only publish stories that already are published and don't have unpublished changespublished-with-changes
: publish stories that are published and have unpublished changes
publish-languages
(optional): publish specific languages. You can publish more than one language at a time by separating the languages by,
The rollback-migration
command gives the possibility to undo the changes made from the execution of the last run-migrations
command.
$ storyblok rollback-migration --space 1234 --component Product --field title
Important: The rollback-migrations
command will only work if there where changes done with run-migrations
. Therefore running run-migrations
command with the --dryrun
flag will NOT create a rollback file.
space
: the space you get from the space settings areacomponent
: component name. It needs to be a valid componentfield
: name of field
List all spaces of the logged account
$ storyblok spaces
This command gives you the possibility to import flat content from .csv
, .xml
and .json
files coming from other systems.
The attributes path
and title
are required.
$ storyblok import --file <FILE_NAME> --type <TYPE_OF_CONTENT> --folder <FOLDER_ID> --delimiter <DELIMITER_TO_CSV_FILES> --space <SPACE_ID>
A xml file needs to have following format:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<path>this-is-my-title</path>
<title>This is my title</title>
<text>Lorem ipsum dolor sit amet</text>
<image>https://a.storyblok.com/f/51376/x/1502f01431/corporate-website.svg</image>
<category>press</category>
</row>
</root>
A csv file needs to have following format. The first row is used to identify the attribute names:
path;title;text;image;category
this-is-my-title;This is my title;"Lorem ipsum dolor sit amet";https://a.storyblok.com/f/51376/x/1502f01431/corporate-website.svg;press
A json file need to have following format:
[
{
"path": "this-is-my-title",
"title": "This is my title",
"text": "Lorem ipsum dolor sit amet",
"image": "https://a.storyblok.com/f/51376/x/1502f01431/corporate-website.svg",
"category": "press"
}
]
file
: name of the filetype
: name of the content type you want to use for the importspace
: id of your spacedelimiter
(optional): delimiter of the.cvs
files, only necessary if you are uploading a csv file (Default value is ; )folder
(optional): id of the folder where you want to store the content in Storyblok
For global help
$ storyblok --help
For command help
$ storyblok sync --help
For view the CLI version
$ storyblok -V # or --version
Content migrations are a convenient way to change fields of your content.
To execute a migration you first need to create a migration file. This file is a pure Javascript function where the content of a specific content type or compontent gets passed through.
To create a migration file, you need to execute the generate-migration
command:
# creating a migration file to product component to update the price
$ storyblok generate-migration --space 00000 --component product --field price
When you run this command a file called change_product_price.js
will be created inside a folder called migrations
.
The created file will have the following content:
// here, 'subtitle' is the name of the field defined when you execute the generate command
module.exports = function (block) {
// Example to change a string to boolean
// block.subtitle = !!(block.subtitle)
// Example to transfer content from other field
// block.subtitle = block.other_field
}
In the migration function you can manipulate the block variable to add or modify existing fields of the component.
To run the migration function you need to execute the run-migration
command. Pass the --dryrun option to not execute the updates and only show the changes in the terminal:
$ storyblok run-migration --space 00000 --component product --field price --dryrun
After checking the output of the dryrun you can execute the updates:
# you can use the --dryrun option to not execute the updates
$ storyblok run-migration --space 00000 --component product --field price
You can execute the migration and, when update the content, publish it using the --publish
and --publish-languages
options. When you use the publish
option, you need to specific one of these following options: 'all', 'published' or 'published-with-changes':
$ storyblok run-migration --space 00000 --component product --field price --publish all
You can specify the languages to update using --publish-languages=<LANGUAGE>
or update all languages using --publish-languages=ALL_LANGUAGES
:
# to update only one language
$ storyblok run-migration --space 00000 --component product --field price --publish all --publish-languages=de
# to update more than one language
$ storyblok run-migration --space 00000 --component product --field price --publish all --publish-languages=de,pt
Whenever you run a run-migrations
command a json file containing all the content before the change takes place will be generated. Important, this just doesn't apply if you add the --dryrun
flag.
Remembering that, the content that will be saved is always related to the last run-migrations
command, that is, if you run the run-migrations
command twice changing the same component, the content will only be saved before the last update.
Let's create an example to update all occurrences of the image field in product component. In the example we replace the url from //a.storyblok.com
to //my-custom-domain.com
.
First, you need to create the migration function:
$ storyblok generate-migration --space 00000 --component product --field image
Then let's update the default image field:
module.exports = function (block) {
block.image = block.image.replace('a.storyblok.com', 'my-custom-domain.com')
}
Now you can execute the migration file:
$ storyblok run-migration --space 00000 --component product --field image --dryrun
To transform a markdown or html field into a richtext field you first need to install a converter library.
$ npm install storyblok-markdown-richtext -g
Now check the path to the global node modules folder
$ npm root -g
Generate the migration with storyblok generate-migration --space 00000 --component blog --field intro
and apply the transformation:
var richtextConverter = require('/usr/local/lib/node_modules/storyblok-markdown-richtext')
module.exports = function (block) {
if (typeof block.intro == 'string') {
block.intro = richtextConverter.markdownToRichtext(block.intro)
}
}
Check out our guides for client side apps (VueJS, Angular, React, ...), static site (Jekyll, NuxtJs, ...), dynamic site examples (Node, PHP, Python, Laravel, ...) on our Getting Started page.