Repository: Shopify/themekit
Pull request #719 (2020-06-17 15:42:35)

Refactor to pass Asset objects rather than strings
This change in preparation for some planned changes to add checksums to assets.


### Warn Checklist
- [x] ~This changes the interface and requires a Major/Minor version change.~ There are no externally observable changes in behaviour.

- [x] I have :tophat:'d these changes by using the commands I changed by hand.
- [x] ~I have added a dependancy to the project.~ No dependencies added.

---
🎩 steps:
- [x] Verify `deploy` for a single file
- [x] Verify `deploy` for all files
- [x] Verify `download`
- [x] Verify `watch`


Patch:
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 5f4549a..633b3d8 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -38,6 +38,18 @@ Helpful commands
 - `make test` will run linting/vetting/testing to make sure your code is of high standard
 - `make help` will tell you all the commands available to you.
 
+## Test Mocks
+
+If interfaces change, we need to regenerate the mocks with Mockery.
+
+To install Mockery:
+
+`go get github.com/vektra/mockery/...`
+
+Then cd into the directory of the interface and run:
+
+`mockery --name=InterfaceName --output=_mocks`
+
 # Debugging Requests
 
 A man in the middle proxy is the easiest way to introspect the requests that themekit makes. To start using it please do the following.
diff --git a/.gitignore b/.gitignore
index b6c11f6..3bf77f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,6 @@ coverage.txt
 docs/_site/
 docs/.sass-cache/
 docs/.jekyll-metadata
+
+# created when using mitm_proxy
+themekit_dump
diff --git a/cmd/deploy.go b/cmd/deploy.go
index b844fa2..8dadc70 100644
--- a/cmd/deploy.go
+++ b/cmd/deploy.go
@@ -86,8 +86,8 @@ func generateActions(ctx *cmdutil.Ctx) (map[string]file.Op, error) {
 		if err != nil {
 			return assetsActions, err
 		}
-		for _, filename := range remoteFiles {
-			assetsActions[filename] = file.Remove
+		for _, asset := range remoteFiles {
+			assetsActions[asset.Key] = file.Remove
 		}
 	}
 
diff --git a/cmd/download.go b/cmd/download.go
index be29d1b..411ae13 100644
--- a/cmd/download.go
+++ b/cmd/download.go
@@ -58,10 +58,17 @@ func download(ctx *cmdutil.Ctx) error {
 }
 
 func filesToDownload(ctx *cmdutil.Ctx) ([]string, error) {
-	allFilenames, err := ctx.Client.GetAllAssets()
+	assets, err := ctx.Client.GetAllAssets()
 	if err != nil {
-		return allFilenames, err
-	} else if len(ctx.Args) <= 0 {
+		return []string{}, err
+	}
+
+	allFilenames := make([]string, len(assets))
+	for i, asset := range assets {
+		allFilenames[i] = asset.Key
+	}
+
+	if len(ctx.Args) <= 0 {
 		return allFilenames, nil
 	}
 
diff --git a/cmd/static/generated-assets.go b/cmd/static/generated-assets.go
index 06aa45d..3ac43df 100644
--- a/cmd/static/generated-assets.go
+++ b/cmd/static/generated-assets.go
@@ -4,4 +4,4 @@ import "github.com/Shopify/themekit/src/static"
 
 func init() {
 	static.Register("PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00assets/application.js\xd2\xd7W\x08(-Q\xa8\xcc/-RH,(\xc8\xc9LN,\xc9\xcc\xcfS\xc8J,K,N.\xca,(Q\xc8H-J\xe5\x02\x04\x00\x00\xff\xffPK\x07\x08&\x9c\x7f\x96.\x00\x00\x00(\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00assets/application.scss.liquid\x1c\xccA\n\xc2@\x0cF\xe1}O\xf1\xd3\x03t\xf6\xae\x14\xf7\"\xe4\x04\xa5Mi \x9d\x84\x99\x0c2;\xaf\xe1\xf5<\x89\xd4\xed\x83\xf7\xa5\x84g\x0btk\x055\xbar\x85d\xc4.\x15\x9b(OCJ\xa0\xdd\\\xb6\x8e\x97\xa8b\xb1\xc3E\x19t'Jt#\x82e\xf0\xbc\xecX\xd9\xd5\xfa\xffxX\xf0\x05\xe3U\x0e\xb7\x12#J;\xe1\xb9p\xfe\xbe?\x81\xda\xfc\xec\xbcN\xc3/\x00\x00\xff\xffPK\x07\x08,\xff\xf7Hv\x00\x00\x00\x80\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00config/settings_data.json\xaa\xe6RPPJ.-*J\xcd+Q\xb2RPrIMK,\xcd)Q\xd2\x01\x89\x17\x14\xa5\x16\xa7\x96\x14+Y)\x80\x94) d\xad\x14\xaa\x15j\xb9\x14\x14j\xb9j\xb9\x00\x01\x00\x00\xff\xffPK\x07\x08s\x98U8<\x00\x00\x00B\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00config/settings_schema.json\x94\xce\xc1\x0e\xc2 \x0c\x06\xe0;O\xd1p6c^\xf7\x1az3f\xc1\xd9I\xe3\xa0\x04\x8a\x891\xbe\xbb\xc1\xcd\x03G\x8f\xed\xf7\xffMO\n\xe0\xa5\x00\x00t\xb0\x1e\xf5\x00Z\x1cz\x1c)\xcc\xacw\xab\xac\x9b\x9f\x1f\xebt'\x01A\x1f\x17+\x08_o\xc3\x0fL\x998\xd4\xfc\xbe\xeb\xbb\xbeU[\xc4q\xaaxp\x1ci~\xb6|\xe5\xa9x\x0cb\x858\x8c%-5\xe9Db\x1e\x8c\xb9\x91\xb8r\xe9&\xf6f+\x1b\xd9>j\xaf\xe4\x12#'\xf9\xa3o(\xe7\x82Y+\x80\xb7:\xabO\x00\x00\x00\xff\xffPK\x07\x08\x8e\x0b\x84\xc8\x97\x00\x00\x00\x1c\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00layout/theme.liquid\xa4T\xcd\x8e\x9b0\x10\xbe\xe7)f\x91\xa2\\\x96D{\xeb\x01\x90\xaa\xaaR\xfb\x00\x95*\xadV\xc81\x13\x98\xc6\xd8\xd4\x1ev\x95&\xbc{e\x1b\x08\xd9lO\xbd\x80g<\xdf\xf7\xcd\x8f\xed\xec\xa12\x92O\x1dB\xc3\xad*V\xd9\xf4CQ\x15+\x80\x8c\x89\x15\x16\xe73t\xa2\xc62X0\x0c\xd9.\xfa}D\x8b,@6\xc2:\xe4<\xe9\xf9\x90~J\xae\x1b\x0ds\x97\xe2\xef\x9e^\xf3\xe4g\xfa\xe3s\xfa\xc5\xb4\x9d`\xda+L@\x1a\xcd\xa89O\xbe\x7f\xcd\xb1\xaa\xf1Q6\xd6\xb4\x98?-\x08\xb4h1O*t\xd2R\xc7d\xf4\x026\xa5\xb5\xd8\x85\x0b\xa0\x93\xa2\xf3YF\x16E\xfa\x08\x16U\x9eH\xa1\x8d&)T\x02\x8d\xc5C\xc0\xcf\xbe\xb2\xb7j\xc6,\x94_	\xdf:cy!\xfbF\x157y\x85\xaf$1\x0d\xc6#ib\x12*uR(\xcc\x9f\x1e]cI\x1fS6\xe9\x818\xd7&\xd0z\xb9\xc8Q\x1e\x8c-}\x8f\xd1\xc20@\xf6\x90\xa6\xf0-\x9a\x8d1G8\x18\x0b\x9d\xeak\xd2\x0e\xd2t\xc4nD\xd7)\x92\xc2\x97\xb9u\xd2\xb9\xadtn\x03\x17\x10\xce!\x87\xfc/\xe0\xf8\xa4\xd05\x88\\\xb2\xa8a\x18>\xc0\xfe\xbaG\x85\xf6M\x88l\x17\xc7\x9f\xedMu*V\x9ea\x1dR\n\xad$\x1d\xfe\x8a\x1c\xbbm+H\xa7-\xea~\xeb}\x0e\xd6^/\xc4\x0b\xe7\xa8\xd6 \x1bRU\xe9\x83\xcbF\xe8J!\xe4\x01\xbe\x8dG\xe9\x02\xd1K\x7fp\x81\xa5\xc3U\xe2\xf9\x8e\xe1e\xd4z\xc8a\xaf\x84>N@\x80L\\\x07\x1bD\xa6\x99N\xf6\xf5\xfc\x8ab\xc4<\x8f\xb5\x05\x99\xbb\x02\xff\xad>\x8b\xde\xca\xce4K\xed\xabs\xaaz>\xa3\x8bL\xcek@]\xf9\\\xd6\xc3\xcb\xd4\nT\x0e\xff\xa7\xc0HJ\x87\xc8\xb1\x94\xf0s\x9d\xf9vRXN\n\xff\x0d\xd0\xd54\x07\xd7\x98n+{\xc7\xa6E[\n)M\xaf\xd9\x95\xa8\xc5^au;\xb3)\xec\x83|w#2)\xc6\xc5\xb2\xee3l\x94\xa9\xc1\xf4\xbc\x01\xb8\xcc4\xa52\xb5\xe9\xb9\x0cC\x19\x86\x8f;2\x81I\xc3\xe6\x1d\x96\xf4\x0d4\xc6Z\xac\xc91\xda\x9b\xe0\xc9y'\xf5\xbes\xd1\n/\x84 \x0d\xd6(\xcc\x13\xbfL\xc6n\xdf\xdep%N\xa6\xe7H\x98\xed|\\\xb1\xcav\xf1Ve\xbb\xf8\xd4\xfe\x0d\x00\x00\xff\xffPK\x07\x08	m\x0f\xc8P\x02\x00\x00\x82\x05\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00locales/en.default.json<\xcc\xb1\n\xc20\x14\x85\xe1=Oq\xb8\xb3\x83C\xa7>\x84\x93\xbbTz\x9a\x06\xe3\xbd\x92\xdc`E\xfa\xee\x12A\x873\xfc\x1c\xf8\xde\x01\x90He\x99\xb2\x8c\xe8	\xc8p\x1c\xfe\x01\x88'\xcf\x94\x11r2\xc7bMg9\xfc\xbe\xda\xae\xce\xcd/\xab\xdf; \xe7\x95xL\x91xY\xc3\x93\x85\xc8f\xb7\xa4\x11\x8b\x15\xcc\xc6\n5\x07\xb7T]\xbe\xc8\x1e\xfa\xf6\xf0	\x00\x00\xff\xffPK\x07\x08\xe5\xb4\xaacr\x00\x00\x00\x8b\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00templates/404.liquid\xb2\xc90\xb4\xab\xaeVPOO\xcdK-J\xcc\xd1310\xd1+\xc9,\xc9IUW\xa8Q(Q\xa8\xad\xb5\xd1\xcf0\xb4\xe3\xb2)\xc0PU\\\x9aT\x92ZQ\x12\x9fQ\x92\x9b\x83P\\`\xc7\x05\x08\x00\x00\xff\xffPK\x07\x08\xdc\xdb\xd3\x0fB\x00\x00\x00S\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00templates/article.liquid\xa4T\xddn\x9c<\x10\xbd\xcfS\x8c,\xa1\xbd\xf9\xb2Q\"}7\x11\xd0?\xf5!\xaa\xaaB\x06\x0f\x8b%l#\xdb$\xdd\x12\xde\xbd\xf2\x1f\xb0\xec6\xbd\xe8\x15\xf6\xf8x\xe6\x9c3\x83\xa7\x0c\xa81\xfc$A\x8e\xa2F]\xa9\xb6j\x94\x10(\xad\x81\x02\xa8\xb6\xbc\xe9\xf1\x98BU\xa3Fi!\x9b\xef\xa6\x0cx\x0b1\x0eT\xb2\xb4>6\x1a\xa9EVQ\x8f\x03\xf8\x97\x12(\x19o\xdd\xfa.\xef\x1e\xcbiZ\xd0\x96\xdb\x1ea\x9e\xf3\x87\xee\xb1t\xc8\x86\x0ev\xd4\x08t\xb4\x9d\xd2\x90\xcd\xb9\xb1Z\xc9\xd3\xf6R<s\xb7\xd2\xa1/\x91\xee\x86\x9ai\xc7\xa8u\xa1\xdcr\x116nQ\x90M\xbea\xac{n\xba\xa0\xf5\xcdc\x9e\xe1\x90}\xbb\xcf\xc4}\xc6\x0e0\xcf\xa4\xfc\x1b\xbcUZP\xfb\x0c\x07\xa1\xa4\xed*F\xcf\xd5\x19\xa9>x\x96\xae\xe2\x0d\x8e7\x14\xc1G\xd8\x847-\x98\x9dw\x8c\xbfl\x894JZ\xd75W\xc2\x1d\xc5f\xd6\xbd:\xadm@I\xeb\x1e\xd9\x87\xd0\xc4\xbc{r\x19ntp\x9eS\xe7M\xfe\xd0=\x95\xa1\xe3\x03=q\xe9\x0c\xdc\xb7\x17\xea3\xfc\x1frz`\xab\xf42E\\^\xc3#\x12\xc0\x8b\x88\xeb\xb8\x9b\xa6u\xe8\xf6\x92\x12p\x83\xd9\x99uc^\xe7\xa5\xd8\x9a$\xd8\xdf\xfa\x99J\x01\xde.\x02\x8f\x03=\xa1\x81\x12\x1eW\xaa\xd3\xb4\xea\x7f\x03\x86-\x1d{[\xc5\x10W2\xd5\xd9\x0ex\xda-\x17\xdd\xd0oU\x07\xaf\x04\x1c$\xbe&\xf7\x0f\xff%\xc3.\x8a;\xdc\x11\xb5V\xdal\xea\xc7\xc0\xaa\xb1\xa75\xf6\x0e\\\x90/!\xdf'\xef\x10)%\x15\x98?\xf8\xf3\xe4d\xce\xe50Z\xb0\xe7\x01\x0bb\xf1\xa7%\xe0P\x05\x89T\xbe\x07w\x7f\x10\xe0l\x9f\x0f\x86\x9e6\xd8\xa9\x9e\xa1.\x88\xbbF\xe0\x85\xf6c\xf8\x9b<\xdb\xa57\xc4\xfd\xc1\xaa\xa1\x03\xb7\xb4\xe7\xbf\xb0 \xafJ3C\xca\xbb?\xd3\xfe*(\xefI\x89\xee\xf3\x1em\x0f\xd8\xf3\xf6\xc1K\xda!\xdf%\xebxwG\xdbGW\xd6JkllAT\xdb^\xebp\xc1\xf7T|V\xecLJ\x81\xc6\xd0\xd3\x95\xfb\xceq\xaa\x91\xee\xc8\xd7\x8a\x9d/\xb9\xfb,\x97\xd4cJ\xff\x16y\xd6\xeeVx_b\xd6\x95\xd6\xd6.3\xd6\x82\xdbE\xf3\xa0\x8c%\xbb\x7fB\xc4\xd7ayF\x96y\xfe\x1d\x00\x00\xff\xffPK\x07\x08\xeed\xcdfN\x02\x00\x00Y\x06\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00templates/blog.liquid\\QK\x8e\xeb \x10\xdc\xfb\x14\xa5H\xde:q\xa4\xb7yb\xd0\xdc$\"v; 1\xd8\x82\xf6\xfc\x08w\x1f%\xe0\x04egw\xd7\xaf\xa9\xd8bQ\x17\xe3\x14\x13\xcev\xbet\xca\xb3\x19,\x05\x9c\x7f\xf0\x0fmj\x1a\xa1{\x19c\xde\xb2aKHI\xecu/\x9b\xd8b\x9a=\n\x05\xc6\xbdH\xb4\xa9\x01\xc4h>e\x03\x00B\x1f\xa5P\xd0\x9e\xa6\xb7]\x8c\x1b\xaf[\xbdEJ;Y\x8d\x9e>J\x8a\xbd>f\x81\n\xa0V\xd6\xb3GJx\xaf\xc7\x83'\xc54\x9e\x14#\xa5l\xfa\xb0\x07b\x0b3=\xb0\xf4=\x90_\xb8\x0b\xe6\x97 q\xc8q\x0b2\xbe\xc26\xbd\xbb\n\xd9@5\\,u\xf8avL\x8eqE`o\x96\x93\xe6\x0f\x8b+\xd8\xafnPL_\xb3\x1f\xc3\x7f\xf4\x87\xc3\xfd\xc0\xa5JGn4\xd3&,\xf6%z\xf9\xc8\xfb\xdb\x83\xdfZ\xc9\xb7l\xddu\x8b\xbaP\x80D\x9f\xd91>k\xbdb\xa4I\xad\x96Oedfw\xbb\xa6\xf6+?\x0fN\x9b\x9a\xbf\x00\x00\x00\xff\xffPK\x07\x08\xe3fQG\x0b\x01\x00\x00\x1a\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00templates/cart.liquid\x8cTMo\xdb<\x0c\xbe\xf7W\xf0\x15\x90\xb7\xb7\xa8\xed\xb1\x93\xbdC\xff@w\xd8i\x18\x02\xc5Rb\xa2\xfa\xf0$*[\x90\xfa\xbf\x0f\x92\xe3\xd8\xf9\x18\x90\x93MJ\x0f\xc9\xe7\x11\xc9\xc3\x02p\x03\x8d\x0c\xb4D\xd2v\xd5\xf8\xe4\x08jx\x82E\xff\x00 \xda\xe7:\x1f\n\xde>\xd7\xd9\xde\xf8`A6\x84\xdeU\x8c\xe7#\x06VS\xebU\xc5:\x1f\x89\x81\xf3;iPI\xd2\x19\x00 H\xae\xcd\xf1?[\xad\x96j\xb4\x8a\x0d\x8d7\xb1\x93\xaeb/\xac~\x0f^	N\xed\xd9\x8d\xfa=`\xa3\xaf\xdd\xdfh\x7f\xed$O\xd2\xcc\xdd\xf9\x7f\x96S\xd0\xda\xab\xfd\x849,`\xe3\x03d\xf6\x80n\x92\"\x0e\nL\xa1C=3\xb3C\x9d;\x00\x84\x846\xe8M\xc5\x0e\x87\x12o\x99\x82\x81O\xf8\x8d\xd4\xa2{\xcd<\x8d.\xd2\xc5\xa54\x06\xfa\x9e]F\x00\x10h\xb7\x10Cs\n\x02\x9f\x80v\xbbJ\xc1\xbc\xc2\xa3\xd5\n\x93}\xccP\x90\x86\xa6L\x84d4|\x82\x8e\x8d\xec\xf4\xad\xd0\x82\xcb\x0b\x02\xfc\x92\xc1\xbd\x94r\xf4\xd1\xee\x82W\xa9\xa1c\x01}\x7f\x95\x06`\xbc\xba\x93\x01\xa5\x9b\xae\xfe+Ui+\xde\xb4\xd2m\xf5W\x83NW\x87C~#\xe3}\xb7D\xa7\xf4\x1f\xe8\xfb\xff\xa5\xed\xbe\xfcJ\xd2\x11\xd2\xbezbu\xd0\xd6\xef\xf4\x9d,\xa7\xea\xb1\xc9\xb2Y\xef\xf4\xbeT\x7f\x8f&\xe8\xbaD@\xfbNW\xcc%\xbb\xd6\x81\x81\x93VW,u\xb9\xf1\xe3\x8f\x9f\x0cP\x9d\xcc\xd5\x98\xee\xa3$a\xb0\x93&\xe9I\xd3\x91F9\xb3\xe8*\xf6\xc4\xeeaq\xa9s\x99\xe5\x12\xd1\x07\xdc\xa2\x93f\x95\xe5[\x0d,\xff\xab\x86\xb3\x99k\xd1\x8f%\xdc\x02L\xb2\x1c\x16\xa0\x9d\xc2\xcd\xf9H\xc0\xecmo\xc2\xae\xeb\xcb\x93\xa60\x0e[\x06\xdd\x80\x1d\x1dq\xa8g4O}2d\xcf\xd0\x8b\xf4\x97\xaa\x08>\x1f\xd2\x1b0\xc1g\xc3/\xf8l3	\x85\xbb\xd3\x86\xe8\xea\x98\xd6P\x16	\xbcf\x8ae)\x14\xfb\x8a\xa3\xe0\xdd	\xb7ND\xde\x1d\x1b#\xa6\xb5E:o\x0cV\x7f/_\xc1\x87\xab\xf7 \x9bV7\x1f>\x11\xab\xdf\x8e\x7f\xe7h\xc1\x8f\xa5\x0b\x9e\x97s\xfd\x90y\x9b\xa8\xc7\x05\xfe2.\xf0\x97|\xe9M\x06\x02\x8c\xa0mG\xfb\x87\xf9\xbb\xfe\x0d\x00\x00\xff\xffPK\x07\x080\xb7G0C\x02\x00\x00\n\x06\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00templates/collection.liquid\x9c\x92\xcd\xaa\xdb0\x10\x85\xf7y\x8aC@dg\x93.\x83\xaaW	\x13yl\x0bd\xc9HrJ\x90\xf5\xee\xc5\x89\xed\xbap\xb9\x8b\xbb\x1bF\xe7;\x9a\xbf,0Rg\x1c%\x86\xf6\xd6\xb2N\xc6\xbbj\x0c\xbe\x99t\x8ax\xbc\xf0\x0b\xa2\x9c\x00\xd9_U\xceGQ2\xc92J\x91u\x7fU' \x0b\xb4>`ea\xdc\x97\x8eo3@6\xe6\xa9\xde\x11 	}\xe0\xf6\xf79\xe7\x8d\xae\xa6`1\xe3\x8fI\xbdq\xb7\x83\x11J9\xab\x83\xee_\x11\xb4\xd9\x1d^\xc7`4c\xc6\xe0\x1d\xbfP\xca\xa6\x10\x98\x9c\xe5\x18w!=\xc9XzX\x86(\xf2\x11\x94\x8c)x\xd7\xa9\xe8m\x03?%Y\xaf\x89,\xc0\xaeYiQ~\xda\xc1\xca\x01\xd2\x0c\x1db\xd0\xff\xa1-S\x9a\x027w3P\xc7U\x0c\x1a3\xcc\xd0\xdd\xa7`o\xb8X\n\x1d_\x16\x1f\x90M\xdf\x91d\x13fp\xd44\xf2\xf1\xdf}Z\xb2^\xf7\xb0\xf4e#\xef\xeb\x19\x95\xf3\x18(\xe9\x9e\xa3\xac\xc7M\xe2\x9ae\xc5oQ\x160\xed~=\xd5H\x1dG(\\7\x8b\xa5\xaa\xed\xb4f4\xdc\xd2d\xd3}M}\xe6\xb0\x9b\x9av\xa1>\xf1\x0e\x89r\xfa\x1b\x00\x00\xff\xffPK\x07\x08\xe1\x0c\x17n3\x01\x00\x00\x9f\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00templates/collection.list.liquid\x9c\x92\xcd\xaa\xdb0\x10\x85\xf7~\x8a\xc3\x05\x91\x9dM\xba\x0c\xaa^%L\xe4\xb1-\x90%#\xc9)A\xd6\xbb\x17'\xb6\xebB\xe9\xe2\xee\x86\xd19\x9f\xe6/\x0bL\xd4\x1bG\x89\xa1\xbd\xb5\xac\x93\xf1\xae\x9e\x82og\x9d\"\x1e/\xfc\x80(\x15 \x87\xab\xca\xf9,J&YF)\xb2\x19\xae\xaa\x02\xb2@\xe7\x036/\x8c\xfb'\xf1\x0d\x03dk\x9e\xea\x1d\x01\x920\x04\xee~~\xe5\xbc\xbb\xeb9X,\xf8e\xd2`\xdc\xed\x04B)_\xea\xa4\xfbS\x04\xed\xb8\xd3\xeb\x14\x8cf,\x18\xbd\xe3\x17J\xd9\x15\x02\xb3\xb3\x1c\xe3!\xa4'\x19K\x0f\xcb\x10E>\x82\x921\x05\xefz\x15\xbdm\xe1\xe7$\x9b-\x91\x05\xd8\xb5\x9b[\x94\xefv\xb0\xf9\x00i\xc6\x1e1\xe8\xbf\xac\x1dS\x9a\x03\xb7w3R\xcfu\x0c\x1a\x0b\xcc\xd8\xdf\xe7`o\xb8X\n=_V\x0e\xc8\xa6\xff9\xc9&,\xe0\xa8i\xe2\xf3\xbf\xc7\xb4d\xb3\xeda\xed\xcbF>\xd63)\xe71R\xd2\x03G\xd9L\xbb\xc4\xb5\xeb\x8a\xdf\xa2,`\xba\xe3z\xea\x89z\x8eP\xb8B\x94\xb5\xa0\xfd\xaa\x16\xb4\xdc\xd1l\xd3}K}F\xf0\x81\x99ne}\xe2\xc3!JU\xfd\x0e\x00\x00\xff\xffPK\x07\x08L\xb9{)4\x01\x00\x00\x98\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\"\x00\x00\x00templates/customers/account.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6OLN\xce/\xcd+\xd1\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08\x921\xff\xfa3\x00\x00\x00-\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00templates/customers/activate_account.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6OL.\xc9,K,I\x8dOLN\xce/\xcd+\xd1\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08\xeb\xdf\xdd|<\x00\x00\x006\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x00\x00templates/customers/addresses.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6OLI)J-.N-\xd6\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08\x1by!\xbf5\x00\x00\x00/\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00templates/customers/login.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6\xcf\xc9O\xcf\xcc\xd3\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08\xe03\xbf?1\x00\x00\x00+\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00templates/customers/order.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6\xcf/JI-\xd2\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08\xd6\xf0}\x961\x00\x00\x00+\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00#\x00\x00\x00templates/customers/register.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6/JM\xcf,.I-\xd2\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08\x99l8\x0d4\x00\x00\x00.\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00templates/customers/reset_password.liquid\xb2Q\xd4\xd5U\xd0/I\xcd-\xc8I,I-\xd6O.-.\xc9\xcfM-*\xd6/J-N-\x89/H,..\xcf/J\xd1\xcb\xc9,,\xcdLQ\xd0\xd5\xb5\xe3\x02\x04\x00\x00\xff\xffPK\x07\x08	\xdd\xe1\x8a:\x00\x00\x004\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00templates/gift_card.liquidl\x93_k\xdb0\x14\xc5\xdf\xf3)\xee\x04\xa1-Dq[\xf60:)\xd0\x95>\xf4qcc{\x0b\xaa\xee\xb5\xad!K\x8e|\xe3,x\xfe\xee\xc3r\xdaf\xd07\xf9\xfe\xf9\xe9\x9c#<,\xc1\x9bc\xdc3\x84\x18\x08\x96\xe3B}\xc0h\xf9\xd8\x12\xd4\xdc\xf8\xcdB\xd5dp\xb3\x00P\x0d\xb1\x01[\x9b\xd4\x11k\xb1\xe7R~\x12o\x8d\x9a\xb9\x95\xb4\xdb\xbb^\x8b_\xf2\xc7\xbd|\x88Mk\xd8={\x12`c`\n\xac\xc5\xd3\xa3&\xache\xeb\x14\x1b\xd27g\x80`\x1a\xd2\xa2wthc\xe2\xb3\x9d\x83C\xae5R\xef,\xc9\xfc\xb1r\xc1\xb13^v\xd6\xf8\xf7(eL\x8da\x89\xc4d\xd9\xc5pFc\xf2\xd4\xd61\x90\x0e1\xef\x0d\x03\\\xf4\x140\xa6b\x97lDZ\xff\xee.\xe0/tul]y\xdc\x9a\xae#\xde\xee\x93\x9fj6\xb9\x96\xb7l*\x18\xc7\x85*\xe6l\xd4s\xc4c\x96\x80\xae\x07\x87Z\xec\x92\x9cHb\xa3\nt}n\xcd\xab\xd3\x11 \xd0\x01\xbe~{\x88H\x97\x18\xed\xbe\xa1\xc0\xeb\x8a\xf8\xd1\xd3t\xfcr|\xc2\xcbW\xc4\xd5\n\x86\xbc\x04\xc0\xf4\x87\xef@\x0c\x03T\xae\xe4\xad5	\xd7\xbb\xb4uH\x81]\xe9(\xc18\x8a\xd5i8\x07u\x077\xb7\xd7/\x95\x9a\\Us.\xe5\xcax\xf5y\x12V\xbc)Se\x8cLi\x169,\xc1\x95g7\xb5\xa6\xebr\x0c\xcb1\xf7\x95\x81:Q\xa9\xff\xd7\xf3:5\x8ebs\xbaX\xb9\xa6\xca\xb1\x98\xb6\xf5$\x0f\xc6{b\xf9l\xb0\"\x01]\xb2\x19q11\xe4\xc4(\x0c\xa2\xe4(\xcf\xa7\xd7]_\xbd\xff(\xe3(f\xafZ\xdc\xdc^\x8b\x93K->^\x0b0\x9e\xb5\xb8G\x84\xef\x11\xee'\x1a\xfc\xcc\xb4\x932U\x98W\xab\x14\xd0\x95\xb35U\xbc\xc4\xa0\x8a\xf9eU1\xff\x0b\xff\x02\x00\x00\xff\xffPK\x07\x08\xf0\x94z\xf6\xd6\x01\x00\x00.\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00templates/index.liquid\x9c\x91\xb1n\xeb0\x0cE\xf7|\xc5E\x00![\xb2\xbc)\xd0\xf3\xaf\x04\x8aL;\x04h\xc9\xa0\xe8\x14\x85\xad\x7f/\x92\xb8\xad\xbbt\xe8*\xdes$]\xce\x0e]V\x8c\x9a\xdb)\x1a8!f\x11\x8a\xc69\x95c\xa79\xd9\x18z:\xae\x81\x02\xe1\x81\xed\xfc\x0f\xae\xee\x00\xdf\xf2\xbd\xd9\x01\x80\x0f\xb8)u\xff\xf7\xf3\xfc);N*X\xf0\xc6v\xe3t\xdexQ\xeb\xbe\xd9\xe4\x8cM\x08\xb5\xfaSx\xc96\xb3Q9\x12\x16\x0c9\xd1;j}\xcd\x1d\xa6$T\xcaW,\xdc\x03K\xb8\n\xc1U\x7f\xd5\xc6\x17\xd3\x9c\xfa\xa6di\x91'\xf3\xa7\xf5`v\xa0\xd4\xae\xb4\xab\x7f{\xfb\x93\x02<\x0f=\x8a\xc6\x1f`G\xc1&\xa5\xf6\xc2\xc3\xa3\xb7\xa2\x11\x0bx\xe8/\x93\xca\x19\x07	\xda\xd3\xe1aA\x10\xfb\x8d\x0cbX@%\x86\x91\xbeo];\xf2\xa7g\xf3\xaf\xdf<\x16\xe8\xea\xee#\x00\x00\xff\xffPK\x07\x08\xe5\xc8?\xa0\xec\x00\x00\x00\xcb\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00templates/list-collections.liquid\x9c\x92A\xae\x9c0\x0c\x86\xf7=\x85\xf5$\xcajfV\xddL\x19n\xd03 ?b\xc0RH\xa8\x93\xbcQ\xc5\xe4\xee\x15\x10\x98\xb0\xe9\xa2;\xb0\xfd;\xfe\xfc{.\xa0\xb3\x02\xad\xd5\x9aZ\xcf\xd6\x00\x9b\xec\xcfA\x11\xbf\x01\xcc\x05\x04\xa3\xc9\xb9,u\x1d\xd0(M\xf0x@\xd9\x895~\xc2\x9e\xca\xad~U\xb48\xf9 \x94I\x1a\xcf^\x13\x14q\x9e\xf3F[\xf4\x05\xe4Z\x9c\x08b\x9c\x0b \xa3v}\xeaX!\x0cB\xdd\xe3\xe3,\x0e\xa2!\xc6\x8f\xfa\x97\x15\x82S*\xbd\x16#|\x17\x87\xbf\x83\xfdY\xdd\xb0\xde\xa7[\xa8'\xb1*\xb4\xfe\x8c|MQ\x07\x9aG\xf6\xf7\x1f\xfb\x00\xab\x0c\x9d\xe3\xde@/\xac\x1a\xf646OV~\x80\x07\x94\x1a\xa5\xa7\xcb\xc5\x1a\xbat\xdc\xf9\x01FR\x1c\xc6-2\xa0\xee\xcaw\xa3J\xf1W\x9d\xbe\xcfd\xe9\xf1\x15\xeb\x05O\xf6\x03\x9b{n\xcf\xc2\x9a\xd5\xed\x8c\x07\xda:\xe7;?	\xb7\xcbnGk\xe8\x0f\xc4\xf8\xae9,\xddK\xf1\x0bY\xe3\xe7jP\xf5)u\xe5\xbcX\xd3\xd7\xcej\x056\xf8\xea\x96\x02\x9b=I]\xc4\xff\xe78\x94\x00\x15\x8f=8iO\xe2\x8ep\xb9\x00\xd5\xf0\x88=]\x9d\xb4\xf0\x02\x1e\xfb&\x88\xbe\xa7\x8d\x97K'@\xed\xff\xa5D\xed\xf3\xfb\xca^\xce\xf6V\xdd\x0eW6\xc2\xe5D\xf6\xf3?\x01\x9f\xd2\x7f\x03\x00\x00\xff\xffPK\x07\x08\n	\xee0b\x01\x00\x00B\x03\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00templates/page.contact.liquid|\x92Mk\xbb@\x10\xc6\xef\xf9\x14\xc3\x80\xe4\x96\xfcs\xd7\xfd\x1fJ{k\xe9\xa1\xb7\x12\xc2\xc6\x1d\xe3\xd2}\x91}i+\xd6\xef^v5P\"\xe64\x8e\xf3<\xcf\xcf\x91)\xdb\x03\x1b\x06\xe8\xf8\x85vA\x06E0\x8e\xe5\xbe=\xb0\xcdP@c\x9d\x86mmM\xe0u\xd8B1n\x00\x86\x02d\x93'\xbb\xce\xfa@\xe2\xe4c]\x93\xf7MT\xaa\xff\x0f\xc5\x08o-7\x1f\xd0\xdb\x98d\xa9:\x983\x92\x9b\x8c\x90\xcd\x9c5LA\xe4\x9cu\x1e~@P\xc3\xa3\n\xa7\xf9\xc5\x98D\xa5\xe2gRIX\xe1\xc3\x14\xf3d\x9d~\xe1\x9a\x90\x19\xae\xa9\xdcg\x05KZi\xba\x18 \xf4\x1dU\x18\xe8; H\xb1\xb4A\xb2U8\x7f\xd4{\xea\x8e\xc8\xd6Y\x8f\x9aK\x85\x8cRY\xa3\xe5\xe1\x0279oxYz\x17\xf8\xdaZC\xc8\xbaT\xd6\xd7[\xe2&\xdf\x0d.\xa7\xdc\xc5=\x93\xf7\xfcB\xc8\xf4\xf4\xf0\x17\x99\xfe\"w\xc4\xc1\xd9/_\xe1\xe1\xdf\x02zu\xdf`\xcfV\xf4Gd\xe5\xfe\x9a\xb0\xd8\xc0\xc7\xb3\x96\x01\xe1\x93\xab\x98Z2\x02\xf3\xdd\x91\x11\xf9\xf4\x8aq\xf3\x1b\x00\x00\xff\xffPK\x07\x08\xc1t\x0b,%\x01\x00\x00\xa0\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00templates/page.liquid\xb2\xc90\xb4\xab\xaeV(HLO\xd5+\xc9,\xc9IU\xa8\xad\xb5\xd1\xcf0\xb4\xe3\xb2I\xc9,\x83K%\xe7\xe7\x95\xa4\xe6\x95\x80%A\xe2\\\x80\x00\x00\x00\xff\xffPK\x07\x08\xc9\x06\xe5\x902\x00\x00\x008\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00templates/product.liquid\x8cSM\x8b\xdb0\x10\xbd\xfbW\x0c\x82eO\x1b\xb3\xd7\xc56,\x85Bo[\xda\xbb\x99Hr2\xa0\x0f\xaf4N	N\xfe{\x91e;\x1fMKOQ\xa47\xf3\xde\xbcy\x1e\x9f\x00c\xa4\x9d\x039\x84\xa0\x1d\xb7\x07\x0c\x84\x8e\xa1\x86>x5H\xdeDm\xb4d\xadZ\x1f\xda\x8eB\xe4\x16\x0fH\x06\xb7F\xaf\xe8\xa7sqi\xd5i\xe4!h\xd5\x92\xc5\x9d\x86\xfa\xbe\xf7\xe6\x0ep\x02\xa5;\x1c\x0c\xbf\xad\x9cw\x88\xa7sQ\x91\xddA\x0c\xb2\x16\xe3x\xcfp\x02\xb2\xbbv\x08\xe6\x0d\x9e\x0d\x86\x9d~\x86\xf3Y\x00\x1a~\x80\xde\xa0a8\x81\x8e\x12{=\xe1H\xd5\xe2#\x13\x7f\xec=\xfbov'\x9a4O\xe7\x03d\x06r\xab\xb4\xe9\"&I\x00\x15\xc2>\xe8nb\xc9\xcdc\x90\x7f\x91\xd3\x14\x00\x007c<.\x91\xde\xf6(\xf9v\x86\xc7\xd2S\xcf\xaa\xc4I\xacv*\xe9MV\xed_\x9bq\\\x053\xb1I\xe8\xaa\xdc\xbf6E\xd5\xf9`\x01%\x93w\xb5(%\x06.Q)\x01V\xf3\xde\xabZ\xf4>\xb2\x00\xed$\x1f{]\x0b;\x18\xa6>\xa1R\xe1\x8bB\xc6\xec\xd8\xbbR?\xfd\x17\x0c\xfc\xd5\x07\x9b\x95\xe4\xa4\x80C\xabkA*\xe3f\x19?\xa6\xb7\xd9\x85\xd9\xdb%=W\xee\xceW\xb3\xbf3\x96\xba\x05\xbaY\xa3w\x01\x00T\xbeO\xe3\xc0\x01\xcd\xa0'\xbb\x168\xa9\x8b\xf5s\xbb\xcb\xe3b\x0c\xbc\\\xdf\xf6\x81d\x8a\x94\xf5N\x1f\xdb_\xc4\xfb6\xe7W\x1e\xe1|\xc5Yf\xd2\xe6\"S\x9b\xf8P\x96\xa2\x98\x14\xabZ,\xa7\xffP\x14\xbdQ\xe0\x07\xfe'\xa1S\xd4-\x8c7\x11H\xf0\xbc\x8d\x04\x1f\xc7?>\xc1\x9b)\xf3\\\x95\xc1\xad6i1\xb5\xf8>\xa0c\xe2\xa3h>\xe7SUN\xcf\xd3\x9e\xc9\xf5\x03C\xce\x87\x1b\xecV\x87\xbc\xea\xb5j\x8e\xc0\xe7\xfa\x7f\xde\xcc\xab\x00K.\xfdN}\xb6\x03\xb3ws\xa38l-\xf1R:E\xf2&f\xa2yW\n\xd8C\x8alU\xe6\xda\xa6\xa8\xa6\\6E\xa5\xe8p\x9dz\xa5\xa3\x0c\x94\x17\x90\xb2\x9f\x9e\x8b\xdf\x01\x00\x00\xff\xffPK\x07\x08\xdd\xd6\x17\x14\x14\x02\x00\x00\xef\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00templates/search.liquidlR\xcb\x8e\xa40\x10\xbb\xf3\x15\x16\x12\x9a[3s\xe8\x0b\x02~\x05\xa5\xa1\x80h\xf3\xda\xa4\xb2\xa3\x11\xf0\xef+^Mk\xd47\x88]\x8e]\xce\x94\xc1\x89A\x1a\xc1\x84@\xc2\xb7\xe3\xcdS\x88\x8a\x03\x1e?\xf8\xfaD\xb6$@\xd9[\xaf!Z\x96\xd6Ti\xbe\x13Sh\xe2\xd1vU:\x10\xa7\xf0VQ\x95\x1eP\x9d\x00@)\x8d\x8b\x0c\xfeq\x17\x02#4U\xe9\xdf\x14\xff\x84\x8aT\xa5\xd3t^\xcc\xe4u\xc0\x0c\n\xadp\x84e9e\x1e\x91\xd9\x9aS'>\xb4\xe4\xb4\xde\x87\xca|\x07Wf\x99\xaf6\xeb$\x01\xa6\x0c\xb2?u\x1d\xf9\x15\xa0n\x0f\xb3\xa1\xbd\xf5\x90L\x1a\xd2\xfc\xce}\x90N\x91\x95u\xebIp\xf4\xd45R\x8b\x81.\nP\n\x8c\x9e\xfa-\xc7F\x8d^a\xc6\xb7\xe4Q\x9a\x02\xadU\x8a\xb6\xbd\xady\xc0\x92\x15]\xdc\xed\xf7M\xe2\xe3\xfe\xe9\xdd\xe5\xb7\xe0[\xcc\x90zh\xa2W\x05>4u2\xea\x8f\xe3\x8c\xc5P\xbc\x1d\x13\x8a\xb1\xbc\xf8\xceE}\xe5$\xd3\xc9\xfe\x8aU\x8e\xf7\xfa\xb7G%\xcd\x9f\x86mq\xa5\\\x962\x1f\xef\xa7J\xe9\x9e#\xad5L\x861#\xb0\x97\xae\x19Y\xaf;a\x1fM+\x98\xbe\xad\xefB\x81\xfb\xe7\xa6\xe0\xea\xb3\x13R\xe1e\xb5\xc6\xe2h$\xb9L\xae\xb5m\x8cW\xcf\xcf\xbe\xcf\x97|sb\xa0\x80\x1a_\xc8\x96i\xba^\xf8\x8c\x8ez\x11\x157\xc7\xd1\xde\xcb\xab\xd8\xfe\xfd\x9c\xc8\x96\xe4\x7f\x00\x00\x00\xff\xffPK\x07\x08@\x01a\xffx\x01\x00\x00#\x03\x00\x00PK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00&\x9c\x7f\x96.\x00\x00\x00(\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00assets/application.jsPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00,\xff\xf7Hv\x00\x00\x00\x80\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\x00\x00\x00assets/application.scss.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00s\x98U8<\x00\x00\x00B\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x01\x00\x00config/settings_data.jsonPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x8e\x0b\x84\xc8\x97\x00\x00\x00\x1c\x01\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x01\x00\x00config/settings_schema.jsonPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00	m\x0f\xc8P\x02\x00\x00\x82\x05\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x02\x00\x00layout/theme.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xe5\xb4\xaacr\x00\x00\x00\x8b\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x05\x00\x00locales/en.default.jsonPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xdc\xdb\xd3\x0fB\x00\x00\x00S\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x05\x00\x00templates/404.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xeed\xcdfN\x02\x00\x00Y\x06\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\x06\x00\x00templates/article.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xe3fQG\x0b\x01\x00\x00\x1a\x02\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x08\x00\x00templates/blog.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x000\xb7G0C\x02\x00\x00\n\x06\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\n\x00\x00templates/cart.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xe1\x0c\x17n3\x01\x00\x00\x9f\x02\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x0c\x00\x00templates/collection.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00L\xb9{)4\x01\x00\x00\x98\x02\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x0e\x00\x00templates/collection.list.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x921\xff\xfa3\x00\x00\x00-\x00\x00\x00\"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x0f\x00\x00templates/customers/account.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xeb\xdf\xdd|<\x00\x00\x006\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00K\x10\x00\x00templates/customers/activate_account.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x1by!\xbf5\x00\x00\x00/\x00\x00\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x10\x00\x00templates/customers/addresses.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xe03\xbf?1\x00\x00\x00+\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00g\x11\x00\x00templates/customers/login.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xd6\xf0}\x961\x00\x00\x00+\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x11\x00\x00templates/customers/order.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\x99l8\x0d4\x00\x00\x00.\x00\x00\x00#\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\x12\x00\x00templates/customers/register.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00	\xdd\xe1\x8a:\x00\x00\x004\x00\x00\x00)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x12\x00\x00templates/customers/reset_password.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xf0\x94z\xf6\xd6\x01\x00\x00.\x03\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\x13\x00\x00templates/gift_card.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xe5\xc8?\xa0\xec\x00\x00\x00\xcb\x01\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x15\x00\x00templates/index.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\n	\xee0b\x01\x00\x00B\x03\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x16\x00\x00templates/list-collections.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xc1t\x0b,%\x01\x00\x00\xa0\x02\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x18\x00\x00templates/page.contact.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xc9\x06\xe5\x902\x00\x00\x008\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x19\x00\x00templates/page.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00\xdd\xd6\x17\x14\x14\x02\x00\x00\xef\x04\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\x1a\x00\x00templates/product.liquidPK\x01\x02\x14\x00\x14\x00\x08\x00\x08\x00\x00\x00\x00\x00@\x01a\xffx\x01\x00\x00#\x03\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x1c\x00\x00templates/search.liquidPK\x05\x06\x00\x00\x00\x00\x1a\x00\x1a\x00}\x07\x00\x00v\x1e\x00\x00\x00\x00")
-}
\ No newline at end of file
+}
diff --git a/go.mod b/go.mod
index 50dbdcd..4c08d30 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,6 @@ require (
 	github.com/VividCortex/ewma v1.1.1 // indirect
 	github.com/aws/aws-sdk-go v0.0.0-20180731200658-1c16cd01d785
 	github.com/caarlos0/env v0.0.0-20161013201842-d0de832ed2fb
-	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/fatih/color v1.7.0
 	github.com/fsnotify/fsnotify v1.4.7 // indirect
 	github.com/hashicorp/go-version v0.0.0-20180716215031-270f2f71b1ee
@@ -14,22 +13,17 @@ require (
 	github.com/joho/godotenv v1.3.0
 	github.com/mattn/go-colorable v0.0.0-20180310133214-efa589957cd0
 	github.com/mattn/go-isatty v0.0.4 // indirect
-	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/radovskyb/watcher v1.0.6
 	github.com/ryanuber/go-glob v0.0.0-20160226084822-572520ed46db
 	github.com/shibukawa/configdir v0.0.0-20170330084843-e180dbdc8da0
 	github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c
 	github.com/spf13/cobra v0.0.0-20180722215644-7c4570c3ebeb
 	github.com/spf13/pflag v1.0.2 // indirect
-	github.com/stretchr/objx v0.1.1 // indirect
 	github.com/stretchr/testify v1.2.2
 	github.com/vbauerster/mpb v3.3.2+incompatible
-	golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
+	github.com/vektra/mockery v1.1.2 // indirect
 	golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect
-	golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 // indirect
-	golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f
-	golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca // indirect
-	golang.org/x/tools v0.0.0-20190319232107-3f1ed9edd1b4 // indirect
+	golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
 	gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0
 )
 
diff --git a/go.sum b/go.sum
index 1704c3f..d502150 100644
--- a/go.sum
+++ b/go.sum
@@ -50,28 +50,47 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/vbauerster/mpb v3.3.2+incompatible h1:IAXNkJBpRdoXCjjReAELWPon+JDp+7wpDUKKh6MyJdQ=
 github.com/vbauerster/mpb v3.3.2+incompatible/go.mod h1:zAHG26FUhVKETRu+MWqYXcI70POlC6N8up9p1dID7SU=
+github.com/vektra/mockery v1.1.2 h1:uc0Yn67rJpjt8U/mAZimdCKn9AeA97BOkjpmtBSlfP4=
+github.com/vektra/mockery v1.1.2/go.mod h1:VcfZjKaFOPO+MpN4ZvwPjs4c48lkq1o3Ym8yHZJu0jU=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b h1:2b9XGzhjiYsYPnKXoEfL7klWZQIt8IfyRCz62gCqqlQ=
 golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a h1:YX8ljsm6wXlHZO+aRz9Exqr0evNhKRNe5K/gi+zKh4U=
 golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3 h1:czFLhve3vsQetD6JOJ8NZZvGQIXlnN3/yXxbT6/awxI=
 golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 h1:kcXqo9vE6fsZY5X5Rd7R1l7fTgnWaDCVmln65REefiE=
 golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca h1:o2TLx1bGN3W+Ei0EMU5fShLupLmTOU95KvJJmfYhAzM=
 golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190319232107-3f1ed9edd1b4 h1:4oAPsdy/MJIeaCzEMEhYwYBU/gHkXH52Xa4M+0GBHfA=
 golang.org/x/tools v0.0.0-20190319232107-3f1ed9edd1b4/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU=
 gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
diff --git a/src/cmdutil/_mocks/ShopifyClient.go b/src/cmdutil/_mocks/ShopifyClient.go
index a78b2d7..798d3e8 100644
--- a/src/cmdutil/_mocks/ShopifyClient.go
+++ b/src/cmdutil/_mocks/ShopifyClient.go
@@ -1,37 +1,17 @@
-// Code generated by mockery v1.0.0. DO NOT EDIT.
+// Code generated by mockery v0.0.0-dev. DO NOT EDIT.
+
 package mocks
 
-import mock "github.com/stretchr/testify/mock"
-import shopify "github.com/Shopify/themekit/src/shopify"
+import (
+	shopify "github.com/Shopify/themekit/src/shopify"
+	mock "github.com/stretchr/testify/mock"
+)
 
-// ShopifyClient is an autogenerated mock type for the ShopifyClient type
+// ShopifyClient is an autogenerated mock type for the shopifyClient type
 type ShopifyClient struct {
 	mock.Mock
 }
 
-// CreateNewTheme provides a mock function with given fields: _a0, _a1
-func (_m *ShopifyClient) Themes() ([]shopify.Theme, error) {
-	ret := _m.Called()
-
-	var r0 []shopify.Theme
-	if rf, ok := ret.Get(0).(func() []shopify.Theme); ok {
-		r0 = rf()
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]shopify.Theme)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func() error); ok {
-		r1 = rf()
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
 // CreateNewTheme provides a mock function with given fields: _a0
 func (_m *ShopifyClient) CreateNewTheme(_a0 string) (shopify.Theme, error) {
 	ret := _m.Called(_a0)
@@ -68,15 +48,15 @@ func (_m *ShopifyClient) DeleteAsset(_a0 shopify.Asset) error {
 }
 
 // GetAllAssets provides a mock function with given fields:
-func (_m *ShopifyClient) GetAllAssets() ([]string, error) {
+func (_m *ShopifyClient) GetAllAssets() ([]shopify.Asset, error) {
 	ret := _m.Called()
 
-	var r0 []string
-	if rf, ok := ret.Get(0).(func() []string); ok {
+	var r0 []shopify.Asset
+	if rf, ok := ret.Get(0).(func() []shopify.Asset); ok {
 		r0 = rf()
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]string)
+			r0 = ret.Get(0).([]shopify.Asset)
 		}
 	}
 
@@ -132,11 +112,6 @@ func (_m *ShopifyClient) GetInfo() (shopify.Theme, error) {
 	return r0, r1
 }
 
-// PublishTheme provides a mock function with given fields:
-func (_m *ShopifyClient) PublishTheme() error {
-	return _m.Called().Error(0)
-}
-
 // GetShop provides a mock function with given fields:
 func (_m *ShopifyClient) GetShop() (shopify.Shop, error) {
 	ret := _m.Called()
@@ -158,6 +133,43 @@ func (_m *ShopifyClient) GetShop() (shopify.Shop, error) {
 	return r0, r1
 }
 
+// PublishTheme provides a mock function with given fields:
+func (_m *ShopifyClient) PublishTheme() error {
+	ret := _m.Called()
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func() error); ok {
+		r0 = rf()
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Themes provides a mock function with given fields:
+func (_m *ShopifyClient) Themes() ([]shopify.Theme, error) {
+	ret := _m.Called()
+
+	var r0 []shopify.Theme
+	if rf, ok := ret.Get(0).(func() []shopify.Theme); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]shopify.Theme)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
 // UpdateAsset provides a mock function with given fields: _a0
 func (_m *ShopifyClient) UpdateAsset(_a0 shopify.Asset) error {
 	ret := _m.Called(_a0)
diff --git a/src/cmdutil/interfaces.go b/src/cmdutil/interfaces.go
index 1878025..a371c27 100644
--- a/src/cmdutil/interfaces.go
+++ b/src/cmdutil/interfaces.go
@@ -11,7 +11,7 @@ type shopifyClient interface {
 	GetInfo() (shopify.Theme, error)
 	PublishTheme() error
 	Themes() ([]shopify.Theme, error)
-	GetAllAssets() ([]string, error)
+	GetAllAssets() ([]shopify.Asset, error)
 	GetAsset(string) (shopify.Asset, error)
 	UpdateAsset(shopify.Asset) error
 	DeleteAsset(shopify.Asset) error
diff --git a/src/shopify/theme_client.go b/src/shopify/theme_client.go
index cc94f0c..3e5b705 100644
--- a/src/shopify/theme_client.go
+++ b/src/shopify/theme_client.go
@@ -234,24 +234,24 @@ func (c Client) PublishTheme() error {
 // assets are sorted and any ignored files based on your config are filtered out.
 // The assets returned will not have any data, only ID and filenames. This is because
 // fetching all the assets at one time is not a good idea.
-func (c Client) GetAllAssets() ([]string, error) {
+func (c Client) GetAllAssets() ([]Asset, error) {
 	resp, err := c.http.Get(c.assetPath(map[string]string{"fields": "key"}))
 	if err != nil {
-		return []string{}, err
+		return []Asset{}, err
 	} else if resp.StatusCode == 404 {
-		return []string{}, ErrThemeNotFound
+		return []Asset{}, ErrThemeNotFound
 	}
 
 	var r assetsResponse
 	if err := unmarshalResponse(resp.Body, &r); err != nil {
-		return []string{}, err
+		return []Asset{}, err
 	}
 
-	filteredAssets := []string{}
+	filteredAssets := []Asset{}
 	sort.Slice(r.Assets, func(i, j int) bool { return r.Assets[i].Key < r.Assets[j].Key })
 	for index, asset := range r.Assets {
 		if !c.filter.Match(asset.Key) && (index == len(r.Assets)-1 || r.Assets[index+1].Key != asset.Key+".liquid") {
-			filteredAssets = append(filteredAssets, asset.Key)
+			filteredAssets = append(filteredAssets, asset)
 		}
 	}
 


Test patch:
diff --git a/cmd/deploy_test.go b/cmd/deploy_test.go
index 91ab4a3..63b7844 100644
--- a/cmd/deploy_test.go
+++ b/cmd/deploy_test.go
@@ -56,7 +56,7 @@ func TestReplace(t *testing.T) {
 	ctx, client, _, stdOut, _ := createTestCtx()
 	ctx.Flags.Verbose = true
 	ctx.Env.Directory = filepath.Join("_testdata", "projectdir")
-	client.On("GetAllAssets").Return([]string{"assets/logo.png"}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{{Key: "assets/logo.png"}}, nil)
 	client.On("UpdateAsset", mock.MatchedBy(func(shopify.Asset) bool { return true })).Return(nil).Times(2)
 	client.On("DeleteAsset", mock.MatchedBy(func(shopify.Asset) bool { return true })).Return(nil).Once()
 	err := deploy(ctx)
@@ -65,7 +65,7 @@ func TestReplace(t *testing.T) {
 	client.AssertExpectations(t)
 
 	ctx, client, _, _, _ = createTestCtx()
-	client.On("GetAllAssets").Return([]string{}, fmt.Errorf("server error"))
+	client.On("GetAllAssets").Return([]shopify.Asset{}, fmt.Errorf("server error"))
 	err = deploy(ctx)
 	if assert.NotNil(t, err) {
 		assert.Contains(t, err.Error(), "server error")
@@ -75,7 +75,7 @@ func TestReplace(t *testing.T) {
 func TestGenerateActions(t *testing.T) {
 	ctx, client, _, _, _ := createTestCtx()
 	ctx.Env.Directory = filepath.Join("_testdata", "projectdir")
-	client.On("GetAllAssets").Return([]string{"assets/logo.png"}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{{Key: "assets/logo.png"}}, nil)
 	actions, err := generateActions(ctx)
 	assert.Nil(t, err)
 	assert.Equal(t, actions["assets/logo.png"], file.Remove)
@@ -87,7 +87,7 @@ func TestGenerateActions(t *testing.T) {
 
 	ctx, client, _, _, _ = createTestCtx()
 	ctx.Env.Directory = filepath.Join("_testdata", "projectdir")
-	client.On("GetAllAssets").Return([]string{}, fmt.Errorf("server error"))
+	client.On("GetAllAssets").Return([]shopify.Asset{}, fmt.Errorf("server error"))
 	_, err = generateActions(ctx)
 	if assert.NotNil(t, err) {
 		assert.Contains(t, err.Error(), "server error")
@@ -95,14 +95,14 @@ func TestGenerateActions(t *testing.T) {
 
 	ctx, client, _, _, _ = createTestCtx()
 	ctx.Env.Directory = "not there"
-	client.On("GetAllAssets").Return([]string{}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{}, nil)
 	_, err = generateActions(ctx)
 	assert.NotNil(t, err)
 
 	ctx, client, _, _, _ = createTestCtx()
 	ctx.Env.Name = "development"
 	ctx.Env.Directory = filepath.Join("_testdata", "badprojectdir")
-	client.On("GetAllAssets").Return([]string{}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{}, nil)
 	actions, err = generateActions(ctx)
 	assert.NotNil(t, err)
 	var tpl bytes.Buffer
diff --git a/cmd/download_test.go b/cmd/download_test.go
index de3fa89..e83c275 100644
--- a/cmd/download_test.go
+++ b/cmd/download_test.go
@@ -11,31 +11,35 @@ import (
 )
 
 func TestDownload(t *testing.T) {
-	allFilenames := []string{"assets/logo.png", "templates/customers/test.liquid", "config/test.liquid", "layout/test.liquid", "snippets/test.liquid", "templates/test.liquid", "locales/test.liquid", "sections/test.liquid"}
+	allAssets := []shopify.Asset{{Key: "assets/logo.png"}, {Key: "templates/customers/test.liquid"}, {Key: "config/test.liquid"}, {Key: "layout/test.liquid"}, {Key: "snippets/test.liquid"}, {Key: "templates/test.liquid"}, {Key: "locales/test.liquid"}, {Key: "sections/test.liquid"}}
 
 	ctx, client, _, _, stdErr := createTestCtx()
-	client.On("GetAllAssets").Return(allFilenames, nil)
-	client.On("GetAsset", mock.MatchedBy(func(string) bool { return true })).Return(shopify.Asset{}, nil).Times(len(allFilenames))
+	client.On("GetAllAssets").Return(allAssets, nil)
+	client.On("GetAsset", mock.MatchedBy(func(string) bool { return true })).Return(shopify.Asset{}, nil).Times(len(allAssets))
 	err := download(ctx)
 	assert.Nil(t, err)
 	assert.Contains(t, stdErr.String(), "error writing assets/logo.png")
 
 	ctx, client, _, _, _ = createTestCtx()
-	client.On("GetAllAssets").Return(allFilenames, fmt.Errorf("server error"))
+	client.On("GetAllAssets").Return(allAssets, fmt.Errorf("server error"))
 	err = download(ctx)
 	if assert.NotNil(t, err) {
 		assert.Contains(t, err.Error(), "server error")
 	}
 
 	ctx, client, _, _, stdErr = createTestCtx()
-	client.On("GetAllAssets").Return(allFilenames, nil)
+	client.On("GetAllAssets").Return(allAssets, nil)
 	client.On("GetAsset", mock.MatchedBy(func(string) bool { return true })).Return(shopify.Asset{}, fmt.Errorf("asset err"))
 	assert.Nil(t, download(ctx))
 	assert.Contains(t, stdErr.String(), "error downloading assets/logo.png")
 }
 
 func TestFilesToDownload(t *testing.T) {
-	allFilenames := []string{"assets/logo.png", "templates/customers/test.liquid", "config/test.liquid", "layout/test.liquid", "snippets/test.liquid", "templates/test.liquid", "locales/test.liquid", "sections/test.liquid"}
+	allAssets := []shopify.Asset{{Key: "assets/logo.png"}, {Key: "templates/customers/test.liquid"}, {Key: "config/test.liquid"}, {Key: "layout/test.liquid"}, {Key: "snippets/test.liquid"}, {Key: "templates/test.liquid"}, {Key: "locales/test.liquid"}, {Key: "sections/test.liquid"}}
+	allFilenames := []string{}
+	for _, asset := range allAssets {
+		allFilenames = append(allFilenames, asset.Key)
+	}
 
 	testcases := []struct {
 		err       string
@@ -47,15 +51,15 @@ func TestFilesToDownload(t *testing.T) {
 		{args: []string{"assets/*"}, ret: []string{"assets/logo.png"}},
 		{args: []string{"templates"}, ret: []string{"templates/test.liquid"}},
 		{args: []string{"assets/nope.png"}, ret: []string{}, err: "No file paths matched the inputted arguments"},
-		{args: []string{"assets/nope.png"}, ret: allFilenames, respErr: fmt.Errorf("server error"), err: "server error"},
+		{args: []string{"assets/nope.png"}, ret: []string{}, respErr: fmt.Errorf("server error"), err: "server error"},
 	}
 
-	for _, testcase := range testcases {
+	for i, testcase := range testcases {
 		ctx, client, _, _, _ := createTestCtx()
 		ctx.Args = testcase.args
-		client.On("GetAllAssets").Return(allFilenames, testcase.respErr)
+		client.On("GetAllAssets").Return(allAssets, testcase.respErr)
 		filenames, err := filesToDownload(ctx)
-		assert.Equal(t, testcase.ret, filenames)
+		assert.Equal(t, testcase.ret, filenames, fmt.Sprintf("Failed to compare filenames in test case %d", i))
 		if testcase.err == "" {
 			assert.Nil(t, err)
 		} else if assert.NotNil(t, err) {
diff --git a/cmd/get_test.go b/cmd/get_test.go
index 7fcf39d..2297d3b 100644
--- a/cmd/get_test.go
+++ b/cmd/get_test.go
@@ -14,7 +14,7 @@ func TestGet(t *testing.T) {
 	ctx, client, conf, _, _ := createTestCtx()
 	conf.On("Set", "development", env.Env{}).Return(nil, nil)
 	conf.On("Save").Return(nil)
-	client.On("GetAllAssets").Return([]string{}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{}, nil)
 	assert.Error(t, getTheme(ctx), "No files to download")
 
 	ctx, _, conf, _, _ = createTestCtx()
@@ -38,7 +38,7 @@ func TestGet(t *testing.T) {
 	ctx.Env.Domain = "my.domain.com"
 	conf.On("Set", "test", env.Env{Domain: "my.domain.com"}).Return(nil, nil)
 	conf.On("Save").Return(nil)
-	client.On("GetAllAssets").Return([]string{}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{}, nil)
 	assert.Error(t, getTheme(ctx), "No files to download")
 
 	ctx, client, conf, _, _ = createTestCtx()
diff --git a/cmd/new_test.go b/cmd/new_test.go
index 0506a3b..c8527bf 100644
--- a/cmd/new_test.go
+++ b/cmd/new_test.go
@@ -20,7 +20,7 @@ func TestNewTheme(t *testing.T) {
 	client.On("CreateNewTheme", name).Return(shopify.Theme{ID: 42}, nil)
 	conf.On("Set", "development", env.Env{ThemeID: "42"}).Return(nil, nil)
 	conf.On("Save").Return(nil)
-	client.On("GetAllAssets").Return([]string{}, nil)
+	client.On("GetAllAssets").Return([]shopify.Asset{}, nil)
 	err := newTheme(ctx, func(ctx *cmdutil.Ctx) error { return nil })
 	assert.Error(t, err)
 
diff --git a/src/shopify/theme_client_test.go b/src/shopify/theme_client_test.go
index 76d6298..593fd49 100644
--- a/src/shopify/theme_client_test.go
+++ b/src/shopify/theme_client_test.go
@@ -271,20 +271,21 @@ func TestThemeClient_GetAllAssets(t *testing.T) {
 	}
 
 	filtertestcases := []struct {
-		input            string
-		ignore, expected []string
+		input    string
+		ignore   []string
+		expected []Asset
 	}{
 		{
 			input:    `{"assets":[{"key":"templates/foo.json.liquid"},{"key":"templates/foo.json"}]}`,
-			expected: []string{"templates/foo.json.liquid"},
+			expected: []Asset{{Key: "templates/foo.json.liquid"}},
 		},
 		{
 			input:    `{"assets":[{"key":"templates/foo.json"},{"key":"templates/foo.json.liquid"}]}`,
-			expected: []string{"templates/foo.json.liquid"},
+			expected: []Asset{{Key: "templates/foo.json.liquid"}},
 		},
 		{
 			input:    `{"assets":[{"key":"templates/ignore.html.liquid"},{"key":"templates/other.liquid"}]}`,
-			expected: []string{"templates/other.liquid"},
+			expected: []Asset{{Key: "templates/other.liquid"}},
 			ignore:   []string{"templates/ignore.html.liquid"},
 		},
 	}