forked from panoply/vscode-liquid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsyncify.json
1 lines (1 loc) · 28.7 KB
/
syncify.json
1
{"$schema":"http://json-schema.org/draft-07/schema","$id":"syncify","version":1.1,"type":"object","definitions":{"path":{"type":["string","array"],"oneOf":[{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,}(\\/[!*a-zA-Z0-9_-]{1,}){1,}([.a-z]{1,})?$"},{"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,}(\\/[!*a-zA-Z0-9_-]{1,}){1,}([.a-z]{1,})?$"}}]},"paths":{"type":"object","additionalProperties":false,"markdownDescription":"Define the development theme structure of your project. You can create path maps to different locations within your project and Syncify will re-route them to the accepted theme structure imposed by Shopify. You cannot define reverse paths and globs must be relative to your root directory.\n\nAll paths must point to directories and files contained within the `input` directory defined. You can optionally omit the entry from paths as Syncify will normalize and prepend that to all values defined.","properties":{"assets":{"markdownDescription":"Paths to files to be published to theme `assets` directory. Accepts a glob (anymatch) pattern","$ref":"#/definitions/path","default":"assets/**/*"},"config":{"$ref":"#/definitions/path","markdownDescription":"Paths to files to be published to the theme `config` directory. These are typically the `settings_schema.json` and `settings_data.json` files.","default":"config/*.json"},"locales":{"markdownDescription":"Paths to files to be published to theme `locales` directory. These are the translation files used by your store.","$ref":"#/definitions/path","default":"locales/*.json"},"layout":{"markdownDescription":"Paths to files to be published to the theme `layout` directory. These are Liquid template files.","$ref":"#/definitions/path","default":"layout/*.liquid"},"snippets":{"markdownDescription":"Paths to files to be published to the theme `snippets` directory. These are Liquid template files.","$ref":"#/definitions/path","default":"snippets/**/*.liquid"},"schema":{"markdownDescription":"Paths to `.json` shared section schema files. Syncify supports external section schemas that can be reused in section `{% schema %}` tags across your theme projects.","$ref":"#/definitions/path","default":"schema/*.json"},"sections":{"markdownDescription":"Paths to files to be published to the theme `sections` directory. These are either going to be `.liquid` or `.json` (section group) file types. You can provide sub-directory references here and Syncify will re-path values.\n\nSee the `views.sections` options to control how sections should be output.\"","$ref":"#/definitions/path","default":["sections/**/*.liquid","sections/**/*.json"]},"templates":{"markdownDescription":"Paths to files to be published to the theme `templates` directory.. These can be either JSON or Liquid template files.","$ref":"#/definitions/path","default":["templates/*.json","templates/*.liquid"]},"customers":{"markdownDescription":"Paths to files to be published to the theme `templates/customers` directory. These can be either JSON or Liquid template files.","$ref":"#/definitions/path","default":["templates/customers/*.json","templates/customers*.liquid"]},"metaobject":{"markdownDescription":"Paths to files to be published to theme `templates/metaobject` directory.","$ref":"#/definitions/path","default":"metafields/**/*.json"},"metafields":{"markdownDescription":"The directory path to global shop metafields. Syncify provides a elegant approach to metafield synchronization using a `directory > file` based structure.","$ref":"#/definitions/path","default":"metafields/**/*.json"},"pages":{"markdownDescription":"The directory path to Markdown (`.md`) or HTML (`.html`) files. Shopify does not support Liquid code in Page body content. Syncify supports page body html content synchronization using frontmatter attribution.\n\n**Please note** Page html content cannot contain or reference Liquid objects and/or tags, Shopify will omit or escape them if they are found present. Syncify will validate the contents of your markdown pages are warn you when Liquid syntax is encountered.","$ref":"#/definitions/path","default":["pages/**/*.html","pages/**/*.md"]},"redirects":{"markdownDescription":"The directory path to redirect file, defaults to `redirects.yml`","type":"string","default":"redirects.yaml"}}},"spawn":{"type":"object","additionalProperties":false,"markdownDescription":"Spawned child processes to run in parallel with Syncify. Supply the CLI command of the process to execute in the relative running mode. You can leverage Syncify utilities and environment variables to conditionally execute different builds, eg: production or development.","properties":{"watch":{"type":"object","markdownDescription":"Supply the script commands you wish to spawn in watch mode. The `key` value will be used as the group reference in the CLI logs.","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"build":{"type":"object","markdownDescription":"Supply the script commands you wish to spawn in **build** mode. The `key` property value will be used as the group reference in the CLI logs.\n\n**Please Note** Build spawns will execute only once.","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}}},"stores":{},"views":{"type":"object","additionalProperties":false,"markdownDescription":"Transform options for Liquid/HTML files. In Syncify, **views** are considered files which will render markup.","properties":{"sections":{"type":"object","additionalProperties":false,"markdownDescription":"Section file handling (i.e: sub-directory grouping)","properties":{"prefixDir":{"type":"boolean","default":false,"markdownDescription":"Sections can be structured within sub-directories. If a section file is determined to be deeply nested in such a way then this option will enable parent directory name prefixing to be applied the filenames. Prefixing is helpful when you have a large number of sections and want to avoid name collisions. You can control what sub-directories should have pre-fixing applied using the `global[]` option or alternatively do not reference paths to sections which contain sub directories.\n\n**Example**\n\nIf this option is set to `true` and a section path is `source/sections/index/some-file.liquid` then the filename will be prefixed with `index` when it is being written to your defined **output** directory. When referencing it within themes you'd need to use `index_some-file.liquid`\n"},"separator":{"type":"string","default":"-","markdownDescription":"Define a separator character to be used when `prefixDir` is enabled.","oneOf":[{"description":"dash","enum":["-"]},{"description":"underscore","enum":["_"]},{"description":"colon","enum":[":"]},{"description":"at","enum":["@"]}]},"global":{"markdownDescription":"Global entries will skip prefixing when a sub-directory structure is detected.","type":"array","items":{"type":"string"}}}},"snippets":{"type":"object","additionalProperties":false,"description":"Snippet specific transform options when processing snippet files","properties":{"prefixDir":{"type":"boolean","default":false,"markdownDescription":"Snippets can be structured within sub-directories. If a snippet file is determined to be deeply nested in such a way then this option will enable parent directory name prefixing to be applied the filenames. Prefixing is helpful when you have a large number of snippets and want to avoid name collisions. You can control what sub-directories should have pre-fixing applied using the `global[]` option or alternatively do not reference paths to snippets which contain sub directories.\n\n**Example**\n\nIf this option is set to `true` and a snippet path is `source/snippets/index/some-file.liquid` then the filename will be prefixed with `index` when it is being written to your defined **output** directory. When referencing it within themes you'd need to use `index_some-file.liquid`\n"},"separator":{"type":"string","default":"-","markdownDescription":"Define a separator character to be used when `prefixDir` is enabled.","oneOf":[{"description":"dot","enum":["."]},{"description":"dash","enum":["-"]},{"description":"underscore","enum":["_"]},{"description":"colon","enum":[":"]},{"description":"at","enum":["@"]}]},"global":{"markdownDescription":"Global entries will skip prefixing when a sub-directory structure is detected.","type":"array","items":{"type":"string"}}}},"pages":{"type":"object","additionalProperties":false,"markdownDescription":"Static page handling.","properties":{"importLanguage":{"type":"string","markdownDescription":"Whether the pulled page content should be written as HTML or have the HTML converted to Markdown.","oneOf":[{"enum":["html"]},{"enum":["markdown"]}]},"suffixDir":{"type":"boolean","markdownDescription":"Whether pages contained in sub-directories should use their directory name as the `template_suffix` when publishing to stores","default":false},"author":{"markdownDescription":"","type":"string","default":""},"global":{"markdownDescription":"If suffixDir is `true` you can provide a list of page sub-directories or relative files that should pass through without applying the directory name as a template_suffix on the page.\n\n**Cannot contain glob (`*`) stars**\n\n```js\n\n// ✓ This is correct\n{ \"global\": ['some-dir/filename.md' ] }\n\n// ✗ This is incorrect\n{ \"global\": ['some-dir/*.md' ] }\n\n```","type":"array","items":{"type":"string"}}}}}},"hot":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","enum":["visible","hidden"],"markdownDescription":"Whether or not Syncify hot reloads UI labels should render."},"inject":{"type":"boolean","markdownDescription":"Whether or not Syncify should inject the required HOT snippet at runtime layout/s. When `false` you will need to manually place the `hot.js.liquid` snippet into your theme.\n\n**Please note** By default when running `--hot` Syncify will check your layout/s for the hot snippet and if it's not present then syncify will inject it and invoke an upload of the layouts."},"layouts":{"type":"array","items":{"type":"string"},"default":["theme.liquid"],"markdownDescription":"A string list of Liquid template layout names used in your theme which should have the hot snippet injected."},"server":{"type":"integer","default":3000,"markdownDescription":"The static server for assets - This will be written in the HOT snippet.\n\n**Example**\n\nWhen the server port is set to `3000` then assets will apply the following:\n\n```js\n'http://localhost:3000/some-asset.js'\n```"},"socket":{"type":"integer","default":8089,"markdownDescription":"Websocket port - This will be written in the HOT snippet\n\n**Example**\n\nWhen the server port is set to `8089` then the websocket will apply the following:\n\n```js\n'ws://localhost:8089/ws'\n```"},"method":{"type":"string","enum":["hot","refresh"],"default":"hot","markdownDescription":"Which live reload method should Syncify use?\n\n**hot**\n\nHot reloads assets and views with automatic refresh upon changes\n\n**refresh**\n\nInvokes a full page refresh after changes have been applied\n\n"},"strategy":{"type":"string","enum":["hydrate","replace"],"default":"hydrate","markdownDescription":"The HOT strategy to use. Syncify supports 2 different replacement strategies and you will need to choose which one to use depending on your project type.\n\n`hydrate`\n\nThe hydrate strategy will execute morph replacements. This is what Syncify will default to using, however, it is not always perfect and in cases where you leverage frameworks that use DOM Mutation observers, it is probably better to use `replace`.\n\n`replace`\n\nThe replace strategy will execute fragment swaps using `replaceWith` instead of morphs when executing HOT reloads. It works almost identically to `hydrate` but respects DOM mutations. If you are leveraging a framework like Stimulus or Alpine, then choose this strategy.\n\n"},"scroll":{"type":"string","enum":["preserved","top"],"default":"preserved","markdownDescription":"Scroll position between reloads"}}},{"type":"boolean","default":false}]},"log":{"type":"object","additionalProperties":false,"properties":{"stats":{"type":"boolean","default":true,"markdownDescription":"Whether or not file stats should print\n\n> Helpful when building for production (`--prod`)\n\n"},"warnings":{"type":"boolean","default":true,"markdownDescription":"Whether or not file stats should print\n\n> Helpful when building for production (`--prod`)\n\n"},"silent":{"type":"boolean","default":false,"markdownDescription":"Suppress CLI logs\n"},"clear":{"type":"boolean","markdownDescription":"Whether or not to clear the screen between changes.","default":true}}},"style":{"type":"object","required":["input"],"additionalProperties":false,"properties":{"input":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"markdownDescription":"Style input source paths. Accepts `string` or `string[]` glob patterns. Resolution is relative to your defined `input` directory.\n\n\n"},"watch":{"type":"array","items":{"type":"string"},"default":[],"markdownDescription":"Glob stylesheet paths/files to watch. When changes are applied to matched files, then the defined `input` will be compiled.\n\n"},"rename":{"type":"string","markdownDescription":"Rename the stylesheet file/s. The same name as the source file will be used when undefined. Accepts namespaces, `[file]`, `[dir]`, and `[ext]`.\n\n\n"},"snippet":{"type":"boolean","default":false,"markdownDescription":"Optionally output the CSS as a snippet. This will transform the stylesheet inline, wrap output within `<style></style>` tags, and write it to `snippets`.\n\n\n"},"tailwind":{"type":"boolean","markdownDescription":"**NOT YET AVAILABLE**\n\n[TailwindCSS](https://tailwindcss.com/) Override\n\nTailwind transforms will use the `tailwind.config.js` configuration file in your project's root (or defined `config` path). If you have not provided a tailwind config file, then Syncify will use options defined via `processor.tailwind`. You can optionally override configuration on a per-transform basis, and any options defined here will be merged with those defined in your `tailwind.config.js` or `processor.tailwind`.\n"},"postcss":{"oneOf":[{"type":"boolean"}],"default":true,"markdownDescription":"[PostCSS](https://postcss.org/) Override\n\nCSS File transforms will use the options provided to `processor.postcss` but you can optionally override those defaults on a per-transform basis. Any configuration options defined here will be merged with the options defined in `processor.postcss`.\n\nYou can also skip pre-processing with postcss by passing a _boolean_ `false`, which will inform Syncify to not pass output to PostCSS. By default, Syncify will pass all compiled SASS and files with `.css` extensions to PostCSS.\n"},"sass":{"type":"boolean","default":true,"markdownDescription":"[SASS Dart](https://sass-lang.com/documentation/js-api/) Override\n\nSASS File transforms will use the options provided to `processor.sass` but you can optionally override those defaults on a per-transform basis. Any configuration options defined here will be merged with the options defined in `processor.sass`.\n\nYou can also skip SASS transforms by passing a _boolean_ `false`, which will inform Syncify to not pass output to SASS, which is the default if SASS is not installed.\n\nBy default, Syncify will forward all input files using `.scss` or `.sass` or extension to SASS Dart. If you have PostCSS installed then Syncify will automatically pass SASS files to PostCSS in the post-process.\n\n"}}},"script":{"type":"object","required":["input"],"additionalProperties":false,"properties":{"input":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"markdownDescription":"JS/TS input source paths. Accepts `string` or `string[]` glob patterns. Resolution is relative to your defined `input` directory.\n\n"},"target":{"type":"array","items":{"type":"string","enum":["es3","es5","es6","es2015","es2016","es2017","es2018","es2019","es2020","es2021","es2022","esnext"]},"default":"es2016","markdownDescription":"This sets the target environment for the generated JavaScript. It tells esbuild to transform JavaScript syntax which is too new for these environments into older JavaScript syntax that works in this environment/s.\n"},"external":{"type":"array","items":{"type":"string"},"default":[],"markdownDescription":"Instructs ESBuild to treat these modules as external. The import/s will be preserved and evaluated at runtime instead.\n\nSee: [ESBuild External Modules](https://esbuild.github.io/api/#external)\n\n"},"rename":{"type":"string","markdownDescription":"Rename the JavaScript file/s. The same name as the source file will be used when undefined. Accepts namespaces, `[file]`, `[dir]`, and `[ext]`.\n\n"},"snippet":{"type":"boolean","default":false,"markdownDescription":"Optionally write the JavaScript file inline as a snippet. This will transform the JS, and contained code will be output within `<script></script>` tags as a `snippet.liquid` file.\n"},"format":{"type":"string","default":"esm","enum":["esm","iife"],"markdownDescription":"The format to be generated. Because we are targeting browser environments, Syncify does not allow for CJS (commonjs) bundles to be produced."},"sourcemap":{"type":"boolean","default":true,"markdownDescription":"Whether or not sourcemap's should be generated. Syncify will process sourcemap generation internally, so this option only accepts a boolean value.\n"},"watch":{"type":"array","items":{"type":"string"},"default":[],"markdownDescription":"Entry points (paths/files) to watch that will trigger rebuilds of the defined `input` file. By default, Syncify will watch all import entries imported by the `input`.\n\n"},"esbuild":{"type":"boolean","default":true,"markdownDescription":"[ESBuild Override](https://esbuild.github.io/)\n\nESBuild file transforms will use the options provided to `processor.esbuild`, but you can optionally override those defaults on a per-transform basis. Any configuration options defined here will be merged with the options defined in `processor.esbuild`.\n\nYou can also skip pre-processing with ESBuild by passing a _boolean_ `false`, which will inform Syncify to process scripts with ESBuild.\n\n\n"}}},"svg":{"type":"object","required":["input"],"properties":{"input":{"markdownDescription":"SVG input source paths. Accepts `string` or `string[]` glob patterns. Resolution is relative to your defined `input` directory.\n\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"rename":{"type":"string","markdownDescription":"Rename the SVG file/s. The same name as the source file will be used when undefined. Accepts namespaces, `[file]`, `[dir]`, and `[ext]`.\n\n**Example**\n\n```js\n'source/svg/arrow.svg' > 'arrow.svg' // if snippet is false\n'source/svg/check.svg' > 'check.liquid' // if snippet is true\n```\n"},"snippet":{"type":"boolean","default":false,"markdownDescription":"Rename the SVG file/s. The same name as the source file will be used when undefined. Accepts namespaces, `[file]`, `[dir]`, and `[ext]`.\n\n**Example**\n\n```js\n'source/svg/arrow.svg' > 'arrow.svg' // if snippet is false\n'source/svg/check.svg' > 'check.liquid' // if snippet is true\n```\n"},"format":{"oneOf":[{"type":"string","enum":["file","sprite"]},{"type":"null"}],"markdownDescription":"The SVG export format. Syncify can produce 2 different SVG formats:\n\nYou can omit this option when you have only 1 pre-processor installed or if you are applying a per-transfrom configuration override as it will default to the format which the inferred pre-processor produces. If you are using both the supported processors ([SVGO](https://github.com/svg/svgo) & [SVG Sprite](https://github.com/svg-sprite)) then you will need to inform Syncify on which format it should produce.\n\n\n- When no SVG pre-processor is installed: undefined\n- When both SVGO and SVG Sprite are installed (required): null\n- When SVGO is the only processor installed: 'file'\n- When SVG Sprite is the only processor installed: 'sprite'\n\n**File Format**\n\nSVG transforms using a `file` format require SVGO to be installed. File formats will produce individual `.svg` files that can be output as an `asset` or inlined into a `snippet`.\n\n**Sprite Format**\n\nSVG transforms using a `sprite` format require SVG Sprite to be installed. Sprite formats will produce an SVG Sprite that can be output as an `asset` or inlined into a `snippet`.\n"}}},"json":{"type":"object","properties":{"indent":{"type":"number","default":2,"description":"The indentation level.\n\nDefault: 2"},"useTab":{"type":"boolean","default":false,"description":"Whether to use '\\t' indentation characters.\n\nDefault: false"},"crlf":{"type":"boolean","default":false,"description":"If line termination should be Windows (CRLF) format. Unix (LF) format is the default.\n\nDefault: false"},"exclude":{"type":"array","items":{"type":"string"},"description":"An optional string list of paths/filenames to exclude from processing, i.e., pass through.\n\nDefault: false"}},"additionalProperties":false},"transform":{"type":"object","additionalProperties":false,"json":{"$ref":"#/definitions/json"},"script":{"oneOf":[{"$ref":"#/definitions/script"},{"type":"array","items":{"$ref":"#/definitions/script"}}]},"style":{"oneOf":[{"$ref":"#/definitions/style"},{"type":"array","items":{"$ref":"#/definitions/style"}}]},"svg":{"oneOf":[{"$ref":"#/definitions/svg"},{"type":"array","items":{"$ref":"#/definitions/svg"}}]}},"terser":{"type":["boolean","object"],"properties":{"json":{"type":["boolean","object"],"default":true,"properties":{"assets":{"type":"boolean","default":true,"description":"Minify `.json` files writing to `theme/assets`.\n\nDefault: true"},"config":{"type":"boolean","default":true,"description":"Minify `settings_schema.json` and `settings_data.json` config files.\n\nDefault: true"},"locales":{"type":"boolean","default":true,"description":"Minify `locale` and `.json` files.\n\nDefault: true"},"metafields":{"type":"boolean","default":true,"description":"Minify `metafield` and `.json` files.\n\nDefault: true"},"metaobject":{"type":"boolean","default":true,"description":"Minify `metaobject` and `.json` files.\n\nDefault: true"},"groups":{"type":"boolean","default":true,"description":"Minify section group `.json` files.\n\nDefault: true"},"templates":{"type":"boolean","default":true,"description":"Minify `template` and `.json` files.\n\nDefault: true"},"exclude":{"type":"array","items":{"type":"string"},"default":[],"description":"An optional list of paths/files to exclude from minification.\n\nDefault: []"}}},"script":{"type":["boolean","object"],"default":true,"properties":{"keepNames":{"type":"boolean","default":false,"description":"Whether to keep original variable and function names."},"legalComments":{"type":"string","enum":["external","none","inline","eof","linked"],"default":"inline","description":"Control the preservation of comments in the minified code. Possible values: 'all', 'some', 'none', 'inline'."},"minifyIdentifiers":{"type":"boolean","default":true,"description":"Whether to minify variable and function names."},"minifySyntax":{"type":"boolean","default":true,"description":"Whether to minify JavaScript syntax."},"minifyWhitespace":{"type":"boolean","default":true,"description":"Whether to minify whitespace."},"mangleQuoted":{"type":"boolean","default":true,"description":"Whether to mangle properties in quoted object literals."},"exclude":{"type":"array","items":{"type":"string"},"default":[],"description":"An optional list of paths/files to exclude from minification."}}},"liquid":{"type":["boolean","object"],"default":true,"properties":{"removeComments":{"type":"boolean","default":true,"description":"Whether to remove comments from the content."},"collapseInner":{"type":"boolean","default":false,"description":"Whether to collapse inner content (e.g: collapse whitespace and line breaks)."},"collapseWhitespace":{"type":"boolean","default":true,"description":"Whether to collapse whitespace (e.g: remove extra spaces and line breaks)."},"minifyJavascript":{"type":"boolean","default":false,"description":"Whether to minify JavaScript content."},"minifySchema":{"type":"boolean","default":false,"description":"Whether to minify schema content."},"minifyStyle":{"type":"boolean","default":false,"description":"Whether to minify style content."},"minifyStylesheet":{"type":"boolean","default":false,"description":"Whether to minify stylesheet content."},"stripDashes":{"type":"boolean","default":true,"description":"Whether to strip dashes (e.g., remove hyphens)."},"exclude":{"type":"array","items":{"type":"string"},"default":[],"description":"An optional list of paths/files to exclude from minification."}}},"markup":{"type":["boolean","object"],"default":true,"properties":{"collapseWhitespace":{"type":"boolean","default":true,"description":"Whether to collapse whitespace (e.g: remove extra spaces and line breaks)."},"minifyJS":{"type":"boolean","default":true,"description":"Whether to minify JavaScript content."},"minifyCSS":{"type":"boolean","default":true,"description":"Whether to minify CSS content."},"removeComments":{"type":"boolean","default":true,"description":"Whether to remove comments from the content."},"exclude":{"type":"array","items":{"type":"string"},"default":[],"description":"An optional list of paths/files to exclude from minification."}}}},"additionalProperties":false},"processors":{"type":"object","properties":{"esbuild":{"type":"object"},"sass":{"type":"object"},"svgo":{"type":"object"},"sprite":{"type":"object"},"postcss":{"type":"array"}}},"publish":{"type":"object","properties":{"tunnelPort":{"type":"number","default":80,"description":"The port address to publish on. In most cases, you can leave this to the default, unless port 80 is occupied. Use a different port in such a situation.\n\nDefault: 80"},"publishRole":{"type":"string","enum":["main","unpublished","development"],"default":"unpublished","description":"Set the publishment role to use. Defaults to 'unpublished', which means theme publishes will not be made pushed live.\n\n'main': The theme is published. Customers see it when they visit the online store.\n'unpublished': The theme is unpublished. Customers can't see it.\n'development': The theme is used for development. The theme can't be published and is temporary.\n\nDefault: 'unpublished'"},"bindVersion":{"type":"boolean","default":false,"description":"Bind theme version with the `settings_schema.json` version.\n\nDefault: false"},"themeLimit":{"type":"number","default":3,"description":"Limit the amount of new theme publishments.\n\nDefault: 3"}}}},"properties":{"syncify":{"type":"object","markdownDescription":"Syncify CLI - Configuration","required":["stores"],"properties":{"stores":{"markdownDescription":"List of Shopify stores to connect. Optionally provide this directly within your `syncify.config` file. If you are using Syncify publishing, then this where you will need to provide store references.","oneOf":[{"type":"array","items":{"$ref":"#/definitions/stores"}},{"type":"object","$ref":"#/definitions/stores"}]},"config":{"markdownDescription":"You can provide Syncify configuration here as an alternative to using an external `syncify.config` file. When Syncify detects the existence of a `syncify.config` file then configuration here will be ignored.\n\n**Example**\n\n```json\n{\n \"syncify\": {\n \"stores\": {},\n \"config\": {}\n }\n}\n```","type":"object","properties":{"input":{"type":"string","default":"source","pattern":"^[a-zA-Z0-9_-]{1,}(\\/[a-zA-Z0-9_-]{1,}){0,}$","markdownDescription":"The **source** build path is the directory where theme files exist. Syncify defaults this to `source` The value defined here will be prepended to any path you define within `paths`."},"output":{"type":"string","default":"theme","pattern":"^[a-zA-Z0-9_-]{1,}(\\/[a-zA-Z0-9_-]{1,}){0,}$","markdownDescription":"The **output** build path is the directory where transformed theme files will be written. This is typically called `dist` in most projects but Syncify defaults this to `theme`.\n\nThe **output** directory will reflect the theme files synced with your store online."},"import":{"type":"string","default":"import","pattern":"^[a-zA-Z0-9_-]{1,}(\\/[a-zA-Z0-9_-]{1,}){0,}$","markdownDescription":"The **import** build path is the directory where downloaded themes and files will be written. It is relative to your projects root directory and only used when running `import` (or download) mode."},"export":{"type":"string","default":"export","pattern":"^[a-zA-Z0-9_-]{1,}(\\/[a-zA-Z0-9_-]{1,}){0,}$","markdownDescription":"The **export** directory is where packaged `.zip` themes will be written when running the `export` mode. Exported themes will prepended with the version number defined in this `package.json` file."},"publish":{"$ref":"#/definitions/publish"},"paths":{"$ref":"#/definitions/paths"},"spawn":{"$ref":"#/definitions/spawn"},"log":{"$ref":"#/definitions/log"},"hot":{"$ref":"#/definitions/hot"},"views":{"$ref":"#/definitions/views"},"terser":{"$ref":"#/definitions/terser"},"transform":{"$ref":"#/definitions/transform"},"processors":{"$ref":"#/definitions/processors"}}}}}}}