@softlimit/theme-envy 0.1.2-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +26 -0
- package/.github/CODEOWNERS +1 -0
- package/.github/workflows/release-please.yml +19 -0
- package/LICENSE +21 -0
- package/README.md +259 -0
- package/build/functions/failed-hook-installs.js +18 -0
- package/build/functions/get-all.js +102 -0
- package/build/functions/index.js +7 -0
- package/build/functions/liquid/functions/extend-liquid.js +77 -0
- package/build/functions/liquid/functions/flatten-shopify-directory-structure.js +29 -0
- package/build/functions/liquid/functions/index.js +6 -0
- package/build/functions/liquid/functions/list-dependencies.js +47 -0
- package/build/functions/liquid/functions/section-schema-inject.js +26 -0
- package/build/functions/liquid/index.js +36 -0
- package/build/functions/parent-theme-files.js +25 -0
- package/build/functions/tailwind.js +31 -0
- package/build/functions/theme-envy.js +85 -0
- package/build/functions/webpack.js +44 -0
- package/build/index.js +45 -0
- package/build/requires/assets.js +22 -0
- package/build/requires/config.js +44 -0
- package/build/requires/globals/index.js +10 -0
- package/build/requires/globals/parent-theme.js +28 -0
- package/build/requires/globals/prepare-install-hooks-schema.js +58 -0
- package/build/requires/globals/progress-bar.js +52 -0
- package/build/requires/globals/theme-require.js +190 -0
- package/build/requires/index.js +21 -0
- package/build/requires/locales.js +16 -0
- package/build/requires/scripts/index.js +5 -0
- package/build/requires/scripts/public-path.js +9 -0
- package/build/requires/scripts/script-builders/elements.build.js +44 -0
- package/build/requires/scripts/script-builders/features.build.js +15 -0
- package/build/requires/scripts/theme-envy.js +7 -0
- package/build/requires/snippets/index.js +11 -0
- package/build/requires/snippets/liquid-builders/theme-envy.liquid.build.js +21 -0
- package/build/requires/styles/index.js +1 -0
- package/build/requires/styles/styles-builders/theme-envy.css.js +11 -0
- package/build/requires/styles/tailwind-base.css +3 -0
- package/build/requires/templates.js +20 -0
- package/build/theme-envy.config.js +71 -0
- package/convert/functions/convert-sections-to-features.js +56 -0
- package/convert/functions/detect-children.js +30 -0
- package/convert/functions/index.js +6 -0
- package/convert/functions/install-hooks.js +68 -0
- package/convert/functions/set-settings-schema-js.js +14 -0
- package/convert/index.js +50 -0
- package/helpers/functions/dev.js +15 -0
- package/helpers/functions/dist-clean.js +19 -0
- package/helpers/functions/ensure-directories.js +26 -0
- package/helpers/functions/find-orphans.js +20 -0
- package/helpers/functions/global-theme-envy.js +20 -0
- package/helpers/functions/liquid-prettify.js +24 -0
- package/helpers/functions/liquid-tree/functions/count-results.js +13 -0
- package/helpers/functions/liquid-tree/functions/get-depth.js +12 -0
- package/helpers/functions/liquid-tree/functions/get-file-info.js +11 -0
- package/helpers/functions/liquid-tree/functions/index.js +5 -0
- package/helpers/functions/liquid-tree/index.js +48 -0
- package/helpers/functions/liquid-tree/objects/dependencies.js +74 -0
- package/helpers/functions/liquid-tree/objects/index.js +3 -0
- package/helpers/functions/log-symbols.js +28 -0
- package/helpers/functions/pull-json.js +22 -0
- package/helpers/functions/scaffold-new/functions/element.js +15 -0
- package/helpers/functions/scaffold-new/functions/feature.js +76 -0
- package/helpers/functions/scaffold-new/functions/index.js +6 -0
- package/helpers/functions/scaffold-new/functions/load-dir.js +24 -0
- package/helpers/functions/scaffold-new/functions/starter-content.js +21 -0
- package/helpers/functions/scaffold-new/functions/upper-first-letter.js +3 -0
- package/helpers/functions/scaffold-new/index.js +28 -0
- package/helpers/functions/scaffold-new/objects/index.js +3 -0
- package/helpers/functions/scaffold-new/objects/starter-configs.js +7 -0
- package/helpers/functions/unicode-supported.js +21 -0
- package/helpers/index.js +10 -0
- package/index.js +190 -0
- package/init/functions/add-theme-envy-features/features/theme-envy/install.js +6 -0
- package/init/functions/add-theme-envy-features/index.js +21 -0
- package/init/functions/copy-example-feature/example-feature/config/_example-feature.js +8 -0
- package/init/functions/copy-example-feature/example-feature/index.js +5 -0
- package/init/functions/copy-example-feature/example-feature/install.js +10 -0
- package/init/functions/copy-example-feature/example-feature/partials/_example-feature-partial.liquid +3 -0
- package/init/functions/copy-example-feature/example-feature/schema/schema-example-feature-schema-partial.js +16 -0
- package/init/functions/copy-example-feature/example-feature/schema/schema-example-feature-section.js +14 -0
- package/init/functions/copy-example-feature/example-feature/scripts/example-feature.js +3 -0
- package/init/functions/copy-example-feature/example-feature/sections/example-feature-section.liquid +11 -0
- package/init/functions/copy-example-feature/example-feature/snippets/example-feature-snippet.liquid +1 -0
- package/init/functions/copy-example-feature/index.js +25 -0
- package/init/functions/copy-starter-config-files/configs/postcss.config.js +9 -0
- package/init/functions/copy-starter-config-files/configs/tailwind.config.js +16 -0
- package/init/functions/copy-starter-config-files/configs/theme.config.js +25 -0
- package/init/functions/copy-starter-config-files/index.js +28 -0
- package/init/functions/copy-starter-config-files/utils/starter-config.js +17 -0
- package/init/functions/copy-starter-config-files/utils/starter-element.js +16 -0
- package/init/functions/copy-starter-config-files/utils/starter-install.js +14 -0
- package/init/functions/copy-starter-config-files/utils/starter-schema.js +32 -0
- package/init/functions/copy-starter-config-files/utils/starter-section.js +16 -0
- package/init/functions/create-empty-settings-data.js +19 -0
- package/init/functions/create-settings-schema.js +29 -0
- package/init/functions/if-shopify-theme-exists.js +26 -0
- package/init/functions/import-from-git.js +21 -0
- package/init/functions/index.js +10 -0
- package/init/functions/validate-source-theme.js +28 -0
- package/init/index.js +87 -0
- package/package.json +88 -0
package/init/functions/copy-example-feature/example-feature/partials/_example-feature-partial.liquid
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Partial content gets output directly in the file it is referenced from, so it can use any variables already defined in that file without passing them like snippets.
|
|
2
|
+
|
|
3
|
+
Additionally, any variables defined in a partial can be used after its reference in the file it's referenced from, unlike the strict, one-way scope of snippets.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @private
|
|
3
|
+
* @file a schema partial that can be re-used in multiple schema files ThemeRequire('schema-example-feature-schema-partial.js')
|
|
4
|
+
*/
|
|
5
|
+
module.exports = [
|
|
6
|
+
{
|
|
7
|
+
type: 'Header',
|
|
8
|
+
content: 'Example Setting'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
type: 'text',
|
|
12
|
+
id: 'title',
|
|
13
|
+
label: 'Title',
|
|
14
|
+
default: 'Title'
|
|
15
|
+
}
|
|
16
|
+
]
|
package/init/functions/copy-example-feature/example-feature/schema/schema-example-feature-section.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @private
|
|
3
|
+
* @file The schema for the example feature, included in example-feature-section.liquid {% schema 'schema-example-feature-section' %}
|
|
4
|
+
*/
|
|
5
|
+
module.exports = {
|
|
6
|
+
name: 'Example Feature',
|
|
7
|
+
tag: 'div',
|
|
8
|
+
settings: [
|
|
9
|
+
...ThemeRequire('schema-example-feature-schema-partial.js')
|
|
10
|
+
],
|
|
11
|
+
presets: {
|
|
12
|
+
name: 'Example Feature'
|
|
13
|
+
}
|
|
14
|
+
}
|
package/init/functions/copy-example-feature/example-feature/sections/example-feature-section.liquid
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<div class="example-feature">
|
|
2
|
+
{% if section.settings.title != blank %}
|
|
3
|
+
<div class="w-full py-4 text-2xl text-center title">
|
|
4
|
+
{{ section.settings.title }}
|
|
5
|
+
</div>
|
|
6
|
+
{% endif %}
|
|
7
|
+
{% partial '_example-feature-partial' %}
|
|
8
|
+
{% snippet 'example-feature-snippet' %}
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
{% schema 'schema-example-feature-section.js' %}
|
package/init/functions/copy-example-feature/example-feature/snippets/example-feature-snippet.liquid
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Example snippet content.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @private
|
|
3
|
+
* @file Copy the example feature to the destination, used during init command
|
|
4
|
+
* @param {object} options - options object
|
|
5
|
+
* @param {string} options.dest - destination directory
|
|
6
|
+
*/
|
|
7
|
+
const path = require('path')
|
|
8
|
+
const fs = require('fs-extra')
|
|
9
|
+
const chalk = require('chalk')
|
|
10
|
+
const logSymbols = require('#LogSymbols')
|
|
11
|
+
|
|
12
|
+
module.exports = function({ dest }) {
|
|
13
|
+
// define and create the destination example-feature
|
|
14
|
+
const target = path.resolve(dest, './theme-envy/features/example-feature')
|
|
15
|
+
fs.ensureDirSync(target)
|
|
16
|
+
|
|
17
|
+
// define the src example-feature path
|
|
18
|
+
const exampleSrc = path.resolve(__dirname, './example-feature')
|
|
19
|
+
|
|
20
|
+
// now copy the files
|
|
21
|
+
fs.copy(exampleSrc, target, err => {
|
|
22
|
+
if (err) return console.error(err)
|
|
23
|
+
console.log(logSymbols.success, chalk.green.bold('Example Feature'), 'copied')
|
|
24
|
+
})
|
|
25
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @private
|
|
3
|
+
* @type {import('tailwindcss').Config}
|
|
4
|
+
*/
|
|
5
|
+
const theme = require('./theme.config.js')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
const ThemeEnvy = require('./theme.config.js')
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
content: [path.resolve(ThemeEnvy.themePath, '**/*.{liquid,js}')],
|
|
11
|
+
theme: {
|
|
12
|
+
extend: {},
|
|
13
|
+
},
|
|
14
|
+
screens: theme.breakpoints,
|
|
15
|
+
plugins: [],
|
|
16
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
entry: {
|
|
3
|
+
// main: './src/scripts/main.js',
|
|
4
|
+
},
|
|
5
|
+
store: 'my-store.myshopify.com',
|
|
6
|
+
themePath: 'src',
|
|
7
|
+
outputPath: 'dist',
|
|
8
|
+
// tailwind: false,
|
|
9
|
+
breakpoints: {
|
|
10
|
+
sm: '640px',
|
|
11
|
+
// => @media (min-width: 640px) { ... }
|
|
12
|
+
|
|
13
|
+
md: '768px',
|
|
14
|
+
// => @media (min-width: 768px) { ... }
|
|
15
|
+
|
|
16
|
+
lg: '1024px',
|
|
17
|
+
// => @media (min-width: 1024px) { ... }
|
|
18
|
+
|
|
19
|
+
xl: '1280px',
|
|
20
|
+
// => @media (min-width: 1280px) { ... }
|
|
21
|
+
|
|
22
|
+
'2xl': '1536px'
|
|
23
|
+
// => @media (min-width: 1536px) { ... }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Copies starter config files to target directory during init command
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const path = require('path')
|
|
6
|
+
const fs = require('fs-extra')
|
|
7
|
+
const logSymbols = require('#LogSymbols')
|
|
8
|
+
|
|
9
|
+
module.exports = function({ target, opts }) {
|
|
10
|
+
// copy config files
|
|
11
|
+
const configSrc = path.resolve(__dirname, './configs')
|
|
12
|
+
fs.copy(configSrc, target, err => {
|
|
13
|
+
if (err) return console.error(err)
|
|
14
|
+
console.log(`${logSymbols.success} Config files copied`
|
|
15
|
+
)
|
|
16
|
+
if (opts.store) {
|
|
17
|
+
const themeConfig = fs.readFileSync(path.resolve(target, 'theme.config.js'), 'utf8')
|
|
18
|
+
fs.writeFileSync(path.resolve(target, 'theme.config.js'), themeConfig.replace(/store: '.*'/, `store: '${opts.store}'`))
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
// copy util starter files
|
|
23
|
+
const utilsSrc = path.resolve(__dirname, './utils')
|
|
24
|
+
fs.copy(utilsSrc, path.resolve(target, 'utils'), err => {
|
|
25
|
+
if (err) return console.error(err)
|
|
26
|
+
console.log(`${logSymbols.success} Utils starter files copied`)
|
|
27
|
+
})
|
|
28
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Used as a template for a new config file for a new feature or element
|
|
3
|
+
* @param {string} readableName - The name of the feature or element
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
module.exports = (readableName) => {
|
|
7
|
+
return `module.exports = [
|
|
8
|
+
{
|
|
9
|
+
name: '${readableName}',
|
|
10
|
+
settings: [
|
|
11
|
+
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
`
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Used as a template for a new script file for a new element
|
|
3
|
+
* @param {string} elementName - The name of the element
|
|
4
|
+
* @param {string} elementClass - The class name of the element
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = (elementName, elementClass) => {
|
|
8
|
+
return `class ${elementClass} extends HTMLElement {
|
|
9
|
+
constructor() {
|
|
10
|
+
super()
|
|
11
|
+
console.log(this)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
customElements.define('${elementName}', ${elementClass})
|
|
15
|
+
`
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Used as a template for a new install.js file for a new feature or element
|
|
3
|
+
* @param {string} elementName - The name of the feature or element
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
module.exports = (elementName) => {
|
|
7
|
+
return `module.exports = [
|
|
8
|
+
{
|
|
9
|
+
hook: 'body-end',
|
|
10
|
+
content: "{% render '${elementName}' %}"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
`
|
|
14
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Used as a template for a new schema file for a new feature section
|
|
3
|
+
* @param {string} elementName - The name of the feature or element
|
|
4
|
+
* @param {string} readableName - The readable name of the feature or element
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = (elementName, readableName) => {
|
|
8
|
+
return `module.exports = {
|
|
9
|
+
name: '${readableName}',
|
|
10
|
+
tag: 'section',
|
|
11
|
+
class: '${elementName}',
|
|
12
|
+
settings: [
|
|
13
|
+
...ThemeRequire('schema-colors'),
|
|
14
|
+
...ThemeRequire('schema-full-width'),
|
|
15
|
+
{
|
|
16
|
+
type: 'header',
|
|
17
|
+
content: 'Section Vertical Spacing'
|
|
18
|
+
},
|
|
19
|
+
...ThemeRequire('schema-spacing-y'),
|
|
20
|
+
...ThemeRequire('schema-lazy'),
|
|
21
|
+
...ThemeRequire('schema-custom-classes'),
|
|
22
|
+
],
|
|
23
|
+
presets: [
|
|
24
|
+
{
|
|
25
|
+
name: '${readableName}',
|
|
26
|
+
category: 'General',
|
|
27
|
+
settings: {},
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
}
|
|
31
|
+
`
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Used as a template for a new section file for a new feature or element
|
|
3
|
+
* @param {string} extName - The name of the feature or element
|
|
4
|
+
* @param {string} tag - The tag name of the feature or element, e.g. 'section', 'div', or 'custom-element'
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
module.exports = (tag, extName) => {
|
|
8
|
+
return `<!-- softlimit { "action": "partial", "file": "section-spacing-y" } -->
|
|
9
|
+
<${tag} class="{{ sectionSpacingY }} {{ section.settings.custom_classes }}"{{ sectionColorStyle }}>
|
|
10
|
+
<div class="{% unless section.settings.full_width %}page-width {% endunless %}">
|
|
11
|
+
|
|
12
|
+
</div>
|
|
13
|
+
</${tag}>
|
|
14
|
+
{% schema 'schema-${extName}.js' %}
|
|
15
|
+
`
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Creates an empty settings_data.json file if it doesn't exist during init command
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const path = require('path')
|
|
6
|
+
const fs = require('fs-extra')
|
|
7
|
+
const chalk = require('chalk')
|
|
8
|
+
const logSymbols = require('#LogSymbols')
|
|
9
|
+
|
|
10
|
+
module.exports = function({ dest }) {
|
|
11
|
+
// create settings_data.json
|
|
12
|
+
const settingsData = path.join(dest, 'config/settings_data.json')
|
|
13
|
+
if (!fs.existsSync(settingsData)) {
|
|
14
|
+
fs.writeFile(settingsData, '{}', 'utf8', (err) => {
|
|
15
|
+
if (err) throw err
|
|
16
|
+
console.log(`${logSymbols.success} ${chalk.green.bold('settings_data.json')} created`)
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Creates basic settings_schema.js file during init command
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const path = require('path')
|
|
6
|
+
const fs = require('fs-extra')
|
|
7
|
+
const chalk = require('chalk')
|
|
8
|
+
const logSymbols = require('#LogSymbols')
|
|
9
|
+
|
|
10
|
+
module.exports = function({ dest }) {
|
|
11
|
+
// create settings_schema.js
|
|
12
|
+
const settingsSchema = path.join(dest, 'config/settings_schema.js')
|
|
13
|
+
const settingsSchemaMarkup = `module.exports = [
|
|
14
|
+
{
|
|
15
|
+
name: 'theme_info',
|
|
16
|
+
theme_name: 'Theme Envy',
|
|
17
|
+
theme_version: '1.0.0',
|
|
18
|
+
theme_author: 'Softlimit',
|
|
19
|
+
theme_documentation_url: 'http://www.softlimit.com',
|
|
20
|
+
theme_support_url: 'http://www.softlimit.com'
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
`
|
|
24
|
+
|
|
25
|
+
fs.writeFile(settingsSchema, settingsSchemaMarkup, 'utf8', (err) => {
|
|
26
|
+
if (err) throw err
|
|
27
|
+
console.log(`${logSymbols.success} ${chalk.green.bold('settings_schema.js')} created`)
|
|
28
|
+
})
|
|
29
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file check if a Shopify theme exists in the target directory and move it to the destination
|
|
3
|
+
* @description Used during the init process to move an existing Shopify theme to the new source folder
|
|
4
|
+
* @param {object} options - options object
|
|
5
|
+
* @param {string} options.target - target directory
|
|
6
|
+
* @param {string} options.dest - destination directory
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const path = require('path')
|
|
10
|
+
const fs = require('fs-extra')
|
|
11
|
+
const { directories } = require('#EnsureDirectories')
|
|
12
|
+
const chalk = require('chalk')
|
|
13
|
+
const logSymbols = require('#LogSymbols')
|
|
14
|
+
|
|
15
|
+
module.exports = function({ target, dest }) {
|
|
16
|
+
// if we have a valid Shopify theme structure in the target directory move those files to the dest
|
|
17
|
+
const rootDirs = fs.readdirSync(target).filter(res => !res.includes('.'))
|
|
18
|
+
const shopifyThemeExistsInRoot = directories.every(dir => rootDirs.includes(dir))
|
|
19
|
+
if (shopifyThemeExistsInRoot) {
|
|
20
|
+
console.log(logSymbols.info, chalk.cyan('Existing theme present, moving to new source folder'))
|
|
21
|
+
directories.forEach(dir => {
|
|
22
|
+
fs.moveSync(path.join(target, dir), path.join(dest, dir))
|
|
23
|
+
})
|
|
24
|
+
console.log(logSymbols.success, 'Existing theme moved')
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Helper function to import a git repo into the src directory
|
|
3
|
+
* @param {object} options - options object
|
|
4
|
+
* @param {string} options.source - git repo url
|
|
5
|
+
* @param {string} options.dest - destination directory
|
|
6
|
+
* @returns {string} - destination directory
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs-extra')
|
|
10
|
+
const path = require('path')
|
|
11
|
+
const git = require('simple-git')(process.cwd())
|
|
12
|
+
|
|
13
|
+
module.exports = async function({ source, dest }) {
|
|
14
|
+
await git.clone(source, dest)
|
|
15
|
+
// remove .git directory
|
|
16
|
+
const remove = ['.git', '.github', '.gitignore', '.vscode']
|
|
17
|
+
remove.forEach(dir => {
|
|
18
|
+
if (fs.existsSync(path.resolve(process.cwd(), dest, dir))) fs.removeSync(path.resolve(process.cwd(), dest, dir))
|
|
19
|
+
})
|
|
20
|
+
return dest
|
|
21
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
addThemeEnvyFeatures: require('./add-theme-envy-features'),
|
|
3
|
+
copyExampleFeature: require('./copy-example-feature'),
|
|
4
|
+
copyStarterConfigFiles: require('./copy-starter-config-files'),
|
|
5
|
+
createEmptySettingsData: require('./create-empty-settings-data'),
|
|
6
|
+
createSettingsSchema: require('./create-settings-schema'),
|
|
7
|
+
ifShopifyThemeExists: require('./if-shopify-theme-exists'),
|
|
8
|
+
importFromGit: require('./import-from-git'),
|
|
9
|
+
validateSourceTheme: require('./validate-source-theme'),
|
|
10
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Validates source theme directory structure
|
|
3
|
+
* @description Used during the init process to validate the source theme directory structure
|
|
4
|
+
* @param {object} options - options object
|
|
5
|
+
* @param {string} options.sourceTheme - source theme directory
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs-extra')
|
|
9
|
+
const path = require('path')
|
|
10
|
+
const { directories } = require('#EnsureDirectories')
|
|
11
|
+
const chalk = require('chalk')
|
|
12
|
+
const logSymbols = require('#LogSymbols')
|
|
13
|
+
|
|
14
|
+
module.exports = function({ sourceTheme }) {
|
|
15
|
+
// verify source theme exists
|
|
16
|
+
if (!fs.existsSync(sourceTheme)) {
|
|
17
|
+
console.error(`${logSymbols.error} ${chalk.red.bold('Error:')} Source theme directory not found: ${sourceTheme}`)
|
|
18
|
+
process.exit(1)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// validate directory structure of source theme
|
|
22
|
+
directories.forEach(dir => {
|
|
23
|
+
if (!fs.existsSync(path.resolve(sourceTheme, dir))) {
|
|
24
|
+
console.error(`${logSymbols.error} ${chalk.red.bold('Error:')} Source theme required directory not found: ${path.resolve(sourceTheme, dir)}`)
|
|
25
|
+
process.exit(1)
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
}
|
package/init/index.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*
|
|
2
|
+
@file init/index.js
|
|
3
|
+
@param [optional]: --example --e: outputs example feature structure and dummy files with readme documentation in each subdirectory
|
|
4
|
+
@description creates skeleton structure for src folder
|
|
5
|
+
- Shopify directories
|
|
6
|
+
- Adds theme-envy directories
|
|
7
|
+
- config files
|
|
8
|
+
@example npx theme-envy init [source|git] [options]
|
|
9
|
+
*/
|
|
10
|
+
const path = require('path')
|
|
11
|
+
const fs = require('fs-extra')
|
|
12
|
+
const chalk = require('chalk')
|
|
13
|
+
const logSymbols = require('#LogSymbols')
|
|
14
|
+
const { directories, ensureDirectories } = require('#EnsureDirectories')
|
|
15
|
+
const { setSettingsSchemaJs } = require('#Convert/functions')
|
|
16
|
+
const themeEnvyConvert = require('#Convert')
|
|
17
|
+
const {
|
|
18
|
+
ifShopifyThemeExists,
|
|
19
|
+
copyStarterConfigFiles,
|
|
20
|
+
addThemeEnvyFeatures,
|
|
21
|
+
createSettingsSchema,
|
|
22
|
+
createEmptySettingsData,
|
|
23
|
+
copyExampleFeature,
|
|
24
|
+
importFromGit,
|
|
25
|
+
validateSourceTheme
|
|
26
|
+
} = require('#Init/functions')
|
|
27
|
+
|
|
28
|
+
module.exports = async function(source, opts = {}) {
|
|
29
|
+
const target = path.resolve(process.cwd())
|
|
30
|
+
|
|
31
|
+
const dest = path.join(target, 'src')
|
|
32
|
+
fs.ensureDirSync(dest)
|
|
33
|
+
console.log(logSymbols.success, 'Destination directory created:', `\n${chalk.dim(dest)}\n`)
|
|
34
|
+
|
|
35
|
+
if (source) {
|
|
36
|
+
// we have a source directory, so we're importing a theme from a folder that is not the root
|
|
37
|
+
if (source.includes('.git')) {
|
|
38
|
+
console.log(
|
|
39
|
+
logSymbols.info,
|
|
40
|
+
chalk.cyan('Importing source from repo...')
|
|
41
|
+
)
|
|
42
|
+
source = await importFromGit({ source, dest })
|
|
43
|
+
console.log(`${logSymbols.success} ${chalk.green('Git repo cloned as source')}`)
|
|
44
|
+
}
|
|
45
|
+
const sourceTheme = path.resolve(process.cwd(), source)
|
|
46
|
+
const destTheme = path.resolve(process.cwd(), dest)
|
|
47
|
+
validateSourceTheme({ sourceTheme })
|
|
48
|
+
// Copy files from source to destination
|
|
49
|
+
if (sourceTheme !== destTheme) {
|
|
50
|
+
directories.forEach(dir => {
|
|
51
|
+
fs.copySync(path.resolve(sourceTheme, dir), path.resolve(destTheme, dir))
|
|
52
|
+
})
|
|
53
|
+
console.log(`${logSymbols.success} Source copied to destination folder`)
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
// if no source directory is provided, check if there is a Shopify theme in the current directory and move it to /src
|
|
57
|
+
ifShopifyThemeExists({ target, dest })
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// setup our Theme Envy directories
|
|
61
|
+
ensureDirectories({ root: dest, envy: true })
|
|
62
|
+
|
|
63
|
+
console.log(`${logSymbols.success} Directory structure set up`)
|
|
64
|
+
|
|
65
|
+
copyStarterConfigFiles({ target, opts })
|
|
66
|
+
|
|
67
|
+
addThemeEnvyFeatures({ dest })
|
|
68
|
+
|
|
69
|
+
// if settings_schema.json exists, convert it to settings_schema.js, else create empty settings_schema.js
|
|
70
|
+
if (fs.existsSync(path.join(dest, 'config/settings_schema.json'))) {
|
|
71
|
+
setSettingsSchemaJs({ sourceTheme: dest })
|
|
72
|
+
} else {
|
|
73
|
+
createSettingsSchema({ dest })
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// only runs if settings_data.json does not exist
|
|
77
|
+
createEmptySettingsData({ dest })
|
|
78
|
+
|
|
79
|
+
// if --example or --e flag is present, copy example-feature folder into theme-envy/features
|
|
80
|
+
if (opts.example) {
|
|
81
|
+
copyExampleFeature({ dest })
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (opts.convert) {
|
|
85
|
+
await themeEnvyConvert(dest, { addThemeEnvy: false })
|
|
86
|
+
}
|
|
87
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@softlimit/theme-envy",
|
|
3
|
+
"version": "0.1.2-alpha",
|
|
4
|
+
"description": "Softlimit Shopify Theme Development Environment",
|
|
5
|
+
"bin": {
|
|
6
|
+
"theme-envy": "./index.js"
|
|
7
|
+
},
|
|
8
|
+
"imports": {
|
|
9
|
+
"#Build": "./build/index.js",
|
|
10
|
+
"#Build/*": "./build/*",
|
|
11
|
+
"#Build/functions": "./build/functions/index.js",
|
|
12
|
+
"#Build/functions/*": "./build/functions/*",
|
|
13
|
+
"#Convert": "./convert/index.js",
|
|
14
|
+
"#Convert/*": "./convert/*",
|
|
15
|
+
"#Convert/functions": "./convert/functions/index.js",
|
|
16
|
+
"#Convert/functions/*": "./convert/functions/*",
|
|
17
|
+
"#Dev": "./dev/index.js",
|
|
18
|
+
"#Dev/*": "./dev/*",
|
|
19
|
+
"#Dev/functions": "./dev/functions/index.js",
|
|
20
|
+
"#Dev/functions/*": "./dev/functions/*",
|
|
21
|
+
"#EnsureDirectories": "./helpers/functions/ensure-directories.js",
|
|
22
|
+
"#Helpers": "./helpers/index.js",
|
|
23
|
+
"#Helpers/*": "./helpers/*",
|
|
24
|
+
"#Helpers/functions": "./helpers/functions/index.js",
|
|
25
|
+
"#Helpers/functions/*": "./helpers/functions/*",
|
|
26
|
+
"#Init": "./init/index.js",
|
|
27
|
+
"#Init/*": "./init/*",
|
|
28
|
+
"#Init/functions": "./init/functions/index.js",
|
|
29
|
+
"#Init/functions/*": "./init/functions/*",
|
|
30
|
+
"#LogSymbols": "./helpers/functions/log-symbols.js",
|
|
31
|
+
"#ParentTheme": "./parent-theme/index.js",
|
|
32
|
+
"#Root/*": "./*"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/softlimit/theme-envy"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"npm": "8.x"
|
|
40
|
+
},
|
|
41
|
+
"standard-version": {
|
|
42
|
+
"scripts": {
|
|
43
|
+
"posttag": "git push && git push --tags"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"version": "standard-version",
|
|
48
|
+
"jsdoc": "./node_modules/.bin/jsdoc ./{build,convert,helpers,init}/**/*.js"
|
|
49
|
+
},
|
|
50
|
+
"author": "Softlimit LLC",
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@shopify/prettier-plugin-liquid": "^1.0.6",
|
|
54
|
+
"ansi-colors": "^4.1.3",
|
|
55
|
+
"autoprefixer": "^10.4.13",
|
|
56
|
+
"chalk": "^4.1.2",
|
|
57
|
+
"chokidar": "^3.5.3",
|
|
58
|
+
"cli-progress": "^3.12.0",
|
|
59
|
+
"commander": "^10.0.0",
|
|
60
|
+
"css-loader": "^6.7.3",
|
|
61
|
+
"cssnano": "^5.1.15",
|
|
62
|
+
"esbuild-loader": "^3.0.1",
|
|
63
|
+
"fs-extra": "^11.1.0",
|
|
64
|
+
"glob": "^8.1.0",
|
|
65
|
+
"mini-css-extract-plugin": "^2.7.2",
|
|
66
|
+
"node-emoji": "^1.11.0",
|
|
67
|
+
"path": "^0.12.7",
|
|
68
|
+
"postcss-import": "^15.1.0",
|
|
69
|
+
"postcss-loader": "^7.0.2",
|
|
70
|
+
"prettier": "^2.8.4",
|
|
71
|
+
"promptly": "^3.2.0",
|
|
72
|
+
"simple-git": "^3.17.0",
|
|
73
|
+
"stmux": "^1.8.5",
|
|
74
|
+
"tailwindcss": "^3.2.7",
|
|
75
|
+
"terser-webpack-plugin": "^5.3.6",
|
|
76
|
+
"webpack": "^5.77.0",
|
|
77
|
+
"webpack-cli": "^5.0.1",
|
|
78
|
+
"webpack-remove-empty-scripts": "^1.0.1"
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"eslint": "^8.34.0",
|
|
82
|
+
"eslint-config-standard": "^17.0.0",
|
|
83
|
+
"eslint-plugin-import": "^2.27.5",
|
|
84
|
+
"eslint-plugin-n": "^15.6.1",
|
|
85
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
86
|
+
"jsdoc": "^4.0.2"
|
|
87
|
+
}
|
|
88
|
+
}
|