@madebyseed/seed-cli-tools 2.2.1 → 2.3.1
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/lib/commands/watch.js +7 -2
- package/lib/tasks/build-css.js +29 -1
- package/lib/tasks/build-js.js +36 -2
- package/lib/tasks/includes/config.js +1 -0
- package/lib/tasks/shopify-cli.js +2 -1
- package/package.json +3 -2
- package/src/commands/watch.js +12 -1
- package/src/tasks/build-css.js +25 -1
- package/src/tasks/build-js.js +32 -4
- package/src/tasks/includes/config.js +1 -0
- package/src/tasks/shopify-cli.js +2 -1
package/lib/commands/watch.js
CHANGED
|
@@ -16,18 +16,23 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
|
|
|
16
16
|
var logger = (0, _debug["default"])("seed-tools:watch");
|
|
17
17
|
|
|
18
18
|
function _default(program) {
|
|
19
|
-
program.command("watch").alias("w").description("Watches files for code changes and immediately deploys updates to dev theme as they occur. " + "This uses shopify theme serve under the hood.").option("-s, --store <store>", "Used for multi-store projects, specify the store to run the watch command for.", false).option("-o, --optimize", "Optimizes assets by compressing, minifying and purging.", false).action(function () {
|
|
19
|
+
program.command("watch").alias("w").description("Watches files for code changes and immediately deploys updates to dev theme as they occur. " + "This uses shopify theme serve under the hood.").option("-s, --store <store>", "Used for multi-store projects, specify the store to run the watch command for.", false).option("-sp, --store-password <password>", "Used for store password protected stores.", false).option("-o, --optimize", "Optimizes assets by compressing, minifying and purging.", false).action(function () {
|
|
20
20
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
21
21
|
logger("--gulpfile ".concat(_config["default"].gulpFile));
|
|
22
22
|
logger("--cwd ".concat(_config["default"].themeRoot));
|
|
23
23
|
var gulpArgs = ["watch", "--gulpfile", _config["default"].gulpFile, "--cwd", _config["default"].themeRoot, "--environment", options.env];
|
|
24
|
-
if (!options.optimize) gulpArgs.push("--skip-optimizations");
|
|
25
24
|
|
|
26
25
|
if (options.store) {
|
|
27
26
|
gulpArgs.push("--store");
|
|
28
27
|
gulpArgs.push(options.store);
|
|
29
28
|
}
|
|
30
29
|
|
|
30
|
+
if (options.storePassword) {
|
|
31
|
+
gulpArgs.push("--store-password");
|
|
32
|
+
gulpArgs.push(options.storePassword);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!options.optimize) gulpArgs.push("--skip-optimizations");
|
|
31
36
|
process.env.NODE_ENV = options.optimize ? "production" : "development";
|
|
32
37
|
(0, _crossSpawn["default"])(_config["default"].gulp, gulpArgs, {
|
|
33
38
|
detached: false,
|
package/lib/tasks/build-css.js
CHANGED
|
@@ -12,6 +12,11 @@ var plumber = require("gulp-plumber");
|
|
|
12
12
|
|
|
13
13
|
var chokidar = require("chokidar");
|
|
14
14
|
|
|
15
|
+
var _require = require("glob"),
|
|
16
|
+
glob = _require.glob;
|
|
17
|
+
|
|
18
|
+
var fs = require("fs");
|
|
19
|
+
|
|
15
20
|
var config = require("./includes/config.js");
|
|
16
21
|
|
|
17
22
|
var messages = require("./includes/messages.js");
|
|
@@ -51,6 +56,25 @@ function processSass() {
|
|
|
51
56
|
}).pipe(plumber(utils.errorHandler)).pipe(sass()).pipe(postcss(config.plugins.postcss)).pipe(gulp.dest(config.dist.assets)).on('finish', resolve).on('error', reject);
|
|
52
57
|
});
|
|
53
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Touch CSS files to update their modification time
|
|
61
|
+
* This ensures Shopify's watcher detects the changes
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
function touchCssFiles() {
|
|
66
|
+
try {
|
|
67
|
+
var cssFiles = glob.sync("".concat(config.dist.assets, "*.css"));
|
|
68
|
+
cssFiles.forEach(function (file) {
|
|
69
|
+
// Update the file modification time to trigger Shopify's watcher
|
|
70
|
+
var now = new Date();
|
|
71
|
+
fs.utimesSync(file, now, now);
|
|
72
|
+
messages.logFileEvent("touch", file);
|
|
73
|
+
});
|
|
74
|
+
} catch (error) {
|
|
75
|
+
console.error("Error touching CSS files:", error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
54
78
|
/**
|
|
55
79
|
* Concatenate css via gulp-cssimport
|
|
56
80
|
*
|
|
@@ -82,6 +106,10 @@ gulp.task("watch:css", function () {
|
|
|
82
106
|
messages.logFileEvent(event, path);
|
|
83
107
|
}
|
|
84
108
|
|
|
85
|
-
processCss();
|
|
109
|
+
processCss(); // Important: Touch CSS files after processing to ensure Shopify detects changes
|
|
110
|
+
|
|
111
|
+
setTimeout(function () {
|
|
112
|
+
touchCssFiles();
|
|
113
|
+
}, 500);
|
|
86
114
|
});
|
|
87
115
|
});
|
package/lib/tasks/build-js.js
CHANGED
|
@@ -16,6 +16,11 @@ var chokidar = require('chokidar');
|
|
|
16
16
|
|
|
17
17
|
var minify = composer(uglifyjs, console);
|
|
18
18
|
|
|
19
|
+
var _require = require("glob"),
|
|
20
|
+
glob = _require.glob;
|
|
21
|
+
|
|
22
|
+
var fs = require("fs");
|
|
23
|
+
|
|
19
24
|
var utils = require("./includes/utilities");
|
|
20
25
|
|
|
21
26
|
var config = require('./includes/config.js');
|
|
@@ -40,6 +45,25 @@ function processVendorJs() {
|
|
|
40
45
|
compress: true
|
|
41
46
|
})).pipe(gulp.dest(config.dist.assets));
|
|
42
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Touch JS files to update their modification time
|
|
50
|
+
* This ensures Shopify's watcher detects the changes
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
function touchJsFiles() {
|
|
55
|
+
try {
|
|
56
|
+
var jsFiles = glob.sync("".concat(config.dist.assets, "*.js"));
|
|
57
|
+
jsFiles.forEach(function (file) {
|
|
58
|
+
// Update the file modification time to trigger Shopify's watcher
|
|
59
|
+
var now = new Date();
|
|
60
|
+
fs.utimesSync(file, now, now);
|
|
61
|
+
messages.logFileEvent("touch", file);
|
|
62
|
+
});
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error("Error touching JS files:", error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
43
67
|
|
|
44
68
|
gulp.task('build:js', function () {
|
|
45
69
|
return processThemeJs();
|
|
@@ -49,7 +73,12 @@ gulp.task('watch:js', function () {
|
|
|
49
73
|
ignoreInitial: true
|
|
50
74
|
}).on('all', function (event, path) {
|
|
51
75
|
messages.logFileEvent(event, path);
|
|
52
|
-
processThemeJs()
|
|
76
|
+
processThemeJs().then(function () {
|
|
77
|
+
// Touch JS files after processing to ensure Shopify detects changes
|
|
78
|
+
setTimeout(function () {
|
|
79
|
+
touchJsFiles();
|
|
80
|
+
}, 500);
|
|
81
|
+
});
|
|
53
82
|
});
|
|
54
83
|
});
|
|
55
84
|
gulp.task('build:vendor-js', function () {
|
|
@@ -60,6 +89,11 @@ gulp.task('watch:vendor-js', function () {
|
|
|
60
89
|
ignoreInitial: true
|
|
61
90
|
}).on('all', function (event, path) {
|
|
62
91
|
messages.logFileEvent(event, path);
|
|
63
|
-
processVendorJs()
|
|
92
|
+
processVendorJs().then(function () {
|
|
93
|
+
// Touch JS files after processing to ensure Shopify detects changes
|
|
94
|
+
setTimeout(function () {
|
|
95
|
+
touchJsFiles();
|
|
96
|
+
}, 500);
|
|
97
|
+
});
|
|
64
98
|
});
|
|
65
99
|
});
|
|
@@ -52,6 +52,7 @@ try {
|
|
|
52
52
|
var config = {
|
|
53
53
|
environment: argv.environment === "undefined" || !argv.environment ? "development" : argv.environment,
|
|
54
54
|
store: argv.store === "undefined" || !argv.store ? null : argv.store,
|
|
55
|
+
storePassword: argv['store-password'] === "undefined" || !argv['store-password'] ? null : argv['store-password'],
|
|
55
56
|
optimize: !argv["skip-optimizations"],
|
|
56
57
|
nodelete: !argv["delete"],
|
|
57
58
|
themeRoot: themeRoot,
|
package/lib/tasks/shopify-cli.js
CHANGED
|
@@ -17,6 +17,7 @@ var messages = require("./includes/messages");
|
|
|
17
17
|
|
|
18
18
|
var environment = config.environment.split(/\s*,\s*|\s+/)[0];
|
|
19
19
|
var store = config.store;
|
|
20
|
+
var storePassword = config.storePassword;
|
|
20
21
|
/**
|
|
21
22
|
* Initiates shopify's cli command 'shopify theme serve' on the dist folder,
|
|
22
23
|
* watching files and uploading them to development store
|
|
@@ -28,7 +29,7 @@ var store = config.store;
|
|
|
28
29
|
|
|
29
30
|
gulp.task("shopify:serve:dist", function () {
|
|
30
31
|
var domain = getStoreName(config.themeRoot, store);
|
|
31
|
-
messages.logChildProcess("'shopify theme dev --store ".concat(domain, "'
|
|
32
|
+
messages.logChildProcess("'shopify theme dev --store ".concat(domain).concat(storePassword ? " --store-password ".concat(storePassword) : '', "' on dist..."));
|
|
32
33
|
var childProcess = shopifyCLI.serve(domain, {
|
|
33
34
|
stdio: ["inherit", "pipe", "inherit"]
|
|
34
35
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@madebyseed/seed-cli-tools",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "Seed CLI Tools",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"fancy-log": "^1.3.3",
|
|
35
35
|
"figures": "^3.2.0",
|
|
36
36
|
"find-root": "^1.1.0",
|
|
37
|
+
"glob": "^11.0.2",
|
|
37
38
|
"gulp": "^4.0.2",
|
|
38
39
|
"gulp-ext-replace": "^0.3.0",
|
|
39
40
|
"gulp-if": "^3.0.0",
|
|
@@ -57,5 +58,5 @@
|
|
|
57
58
|
"webpack-stream": "^7.0.0",
|
|
58
59
|
"yargs": "^17.0.1"
|
|
59
60
|
},
|
|
60
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "018f1210f603f30c38dfb6cc17eb66967072e3b3"
|
|
61
62
|
}
|
package/src/commands/watch.js
CHANGED
|
@@ -17,6 +17,11 @@ export default function (program) {
|
|
|
17
17
|
"Used for multi-store projects, specify the store to run the watch command for.",
|
|
18
18
|
false
|
|
19
19
|
)
|
|
20
|
+
.option(
|
|
21
|
+
"-sp, --store-password <password>",
|
|
22
|
+
"Used for store password protected stores.",
|
|
23
|
+
false
|
|
24
|
+
)
|
|
20
25
|
.option(
|
|
21
26
|
"-o, --optimize",
|
|
22
27
|
"Optimizes assets by compressing, minifying and purging.",
|
|
@@ -36,13 +41,19 @@ export default function (program) {
|
|
|
36
41
|
options.env,
|
|
37
42
|
];
|
|
38
43
|
|
|
39
|
-
if (!options.optimize) gulpArgs.push("--skip-optimizations");
|
|
40
44
|
|
|
41
45
|
if (options.store) {
|
|
42
46
|
gulpArgs.push("--store");
|
|
43
47
|
gulpArgs.push(options.store);
|
|
44
48
|
}
|
|
45
49
|
|
|
50
|
+
if (options.storePassword) {
|
|
51
|
+
gulpArgs.push("--store-password");
|
|
52
|
+
gulpArgs.push(options.storePassword);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!options.optimize) gulpArgs.push("--skip-optimizations");
|
|
56
|
+
|
|
46
57
|
process.env.NODE_ENV = options.optimize ? "production" : "development";
|
|
47
58
|
|
|
48
59
|
spawn(config.gulp, gulpArgs, {
|
package/src/tasks/build-css.js
CHANGED
|
@@ -4,7 +4,8 @@ const sass = require("gulp-sass")(require("sass"));
|
|
|
4
4
|
const postcss = require("gulp-postcss");
|
|
5
5
|
const plumber = require("gulp-plumber");
|
|
6
6
|
const chokidar = require("chokidar");
|
|
7
|
-
|
|
7
|
+
const { glob } = require("glob");
|
|
8
|
+
const fs = require("fs");
|
|
8
9
|
const config = require("./includes/config.js");
|
|
9
10
|
const messages = require("./includes/messages.js");
|
|
10
11
|
const utils = require("./includes/utilities");
|
|
@@ -67,6 +68,24 @@ function processCss() {
|
|
|
67
68
|
.on('error', reject)
|
|
68
69
|
})
|
|
69
70
|
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Touch CSS files to update their modification time
|
|
75
|
+
* This ensures Shopify's watcher detects the changes
|
|
76
|
+
*/
|
|
77
|
+
function touchCssFiles() {
|
|
78
|
+
try {
|
|
79
|
+
const cssFiles = glob.sync(`${config.dist.assets}*.css`);
|
|
80
|
+
cssFiles.forEach((file) => {
|
|
81
|
+
// Update the file modification time to trigger Shopify's watcher
|
|
82
|
+
const now = new Date();
|
|
83
|
+
fs.utimesSync(file, now, now);
|
|
84
|
+
messages.logFileEvent("touch", file);
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error(`Error touching CSS files:`, error);
|
|
88
|
+
}
|
|
70
89
|
}
|
|
71
90
|
|
|
72
91
|
/**
|
|
@@ -98,5 +117,10 @@ gulp.task("watch:css", () => {
|
|
|
98
117
|
}
|
|
99
118
|
|
|
100
119
|
processCss();
|
|
120
|
+
|
|
121
|
+
// Important: Touch CSS files after processing to ensure Shopify detects changes
|
|
122
|
+
setTimeout(() => {
|
|
123
|
+
touchCssFiles();
|
|
124
|
+
}, 500);
|
|
101
125
|
});
|
|
102
126
|
});
|
package/src/tasks/build-js.js
CHANGED
|
@@ -6,8 +6,8 @@ const include = require('gulp-include');
|
|
|
6
6
|
const plumber = require('gulp-plumber');
|
|
7
7
|
const chokidar = require('chokidar');
|
|
8
8
|
const minify = composer(uglifyjs, console)
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const { glob } = require("glob");
|
|
10
|
+
const fs = require("fs");
|
|
11
11
|
const utils = require("./includes/utilities");
|
|
12
12
|
const config = require('./includes/config.js');
|
|
13
13
|
const messages = require('./includes/messages.js');
|
|
@@ -34,6 +34,24 @@ function processVendorJs() {
|
|
|
34
34
|
.pipe(gulp.dest(config.dist.assets));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Touch JS files to update their modification time
|
|
39
|
+
* This ensures Shopify's watcher detects the changes
|
|
40
|
+
*/
|
|
41
|
+
function touchJsFiles() {
|
|
42
|
+
try {
|
|
43
|
+
const jsFiles = glob.sync(`${config.dist.assets}*.js`);
|
|
44
|
+
jsFiles.forEach((file) => {
|
|
45
|
+
// Update the file modification time to trigger Shopify's watcher
|
|
46
|
+
const now = new Date();
|
|
47
|
+
fs.utimesSync(file, now, now);
|
|
48
|
+
messages.logFileEvent("touch", file);
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error(`Error touching JS files:`, error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
37
55
|
gulp.task('build:js', () => {
|
|
38
56
|
return processThemeJs();
|
|
39
57
|
});
|
|
@@ -42,7 +60,12 @@ gulp.task('watch:js', () => {
|
|
|
42
60
|
chokidar.watch([config.src.js, `!${config.roots.vendorJs}`, `!${config.src.vendorJs}`], {ignoreInitial: true})
|
|
43
61
|
.on('all', (event, path) => {
|
|
44
62
|
messages.logFileEvent(event, path);
|
|
45
|
-
processThemeJs()
|
|
63
|
+
processThemeJs().then(() => {
|
|
64
|
+
// Touch JS files after processing to ensure Shopify detects changes
|
|
65
|
+
setTimeout(() => {
|
|
66
|
+
touchJsFiles();
|
|
67
|
+
}, 500);
|
|
68
|
+
});
|
|
46
69
|
});
|
|
47
70
|
});
|
|
48
71
|
|
|
@@ -54,6 +77,11 @@ gulp.task('watch:vendor-js', () => {
|
|
|
54
77
|
chokidar.watch([config.roots.vendorJs, config.src.vendorJs], {ignoreInitial: true})
|
|
55
78
|
.on('all', (event, path) => {
|
|
56
79
|
messages.logFileEvent(event, path);
|
|
57
|
-
processVendorJs()
|
|
80
|
+
processVendorJs().then(() => {
|
|
81
|
+
// Touch JS files after processing to ensure Shopify detects changes
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
touchJsFiles();
|
|
84
|
+
}, 500);
|
|
85
|
+
});
|
|
58
86
|
});
|
|
59
87
|
});
|
|
@@ -40,6 +40,7 @@ try {
|
|
|
40
40
|
const config = {
|
|
41
41
|
environment: (argv.environment === "undefined" || !argv.environment) ? "development" : argv.environment,
|
|
42
42
|
store: (argv.store === "undefined" || !argv.store) ? null : argv.store,
|
|
43
|
+
storePassword: (argv['store-password'] === "undefined" || !argv['store-password']) ? null : argv['store-password'],
|
|
43
44
|
optimize: !argv["skip-optimizations"],
|
|
44
45
|
nodelete: !argv["delete"],
|
|
45
46
|
themeRoot,
|
package/src/tasks/shopify-cli.js
CHANGED
|
@@ -13,6 +13,7 @@ const config = require("./includes/config");
|
|
|
13
13
|
const messages = require("./includes/messages")
|
|
14
14
|
const environment = config.environment.split(/\s*,\s*|\s+/)[0];
|
|
15
15
|
const store = config.store;
|
|
16
|
+
const storePassword = config.storePassword;
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* Initiates shopify's cli command 'shopify theme serve' on the dist folder,
|
|
@@ -24,7 +25,7 @@ const store = config.store;
|
|
|
24
25
|
*/
|
|
25
26
|
gulp.task("shopify:serve:dist", () => {
|
|
26
27
|
const domain = getStoreName(config.themeRoot, store);
|
|
27
|
-
messages.logChildProcess(`'shopify theme dev --store ${domain}'
|
|
28
|
+
messages.logChildProcess(`'shopify theme dev --store ${domain}${storePassword ? ` --store-password ${storePassword}` : ''}' on dist...`);
|
|
28
29
|
const childProcess = shopifyCLI.serve(domain, {
|
|
29
30
|
stdio: ["inherit", "pipe", "inherit"],
|
|
30
31
|
});
|