shoplazza-cli 1.0.7 → 1.0.8
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/README.md +83 -2
- package/bin/shoplazza +8 -15
- package/lib/app/api/index.js +96 -0
- package/lib/app/commands/build.js +101 -53
- package/lib/app/commands/connect.js +73 -0
- package/lib/app/commands/create.js +105 -0
- package/lib/app/commands/deploy.js +45 -208
- package/lib/app/commands/list.js +35 -0
- package/lib/app/commands/release.js +59 -0
- package/lib/app/commands/serve.js +172 -0
- package/lib/app/commands/versions.js +55 -0
- package/lib/app/index.js +22 -30
- package/lib/app/template/basic-app/README.md +125 -0
- package/lib/app/template/basic-app/extension.config.json +4 -0
- package/lib/app/template/basic-app/package.json +18 -0
- package/lib/app/template/basic-app/theme-app/assets/index.css +4 -0
- package/lib/app/template/basic-app/theme-app/assets-manifest.json +1 -0
- package/lib/app/template/basic-app/theme-app/blocks/index.liquid +16 -0
- package/lib/app/template/basic-app/theme-app/locales/ar-SA.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/de-DE.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/en-US.json +6 -0
- package/lib/app/template/basic-app/theme-app/locales/es-ES.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/fr-FR.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/id-ID.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/it-IT.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/ja-JP.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/ko-KR.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/nl-NL.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/pl-PL.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/pt-PT.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/ru-RU.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/th-TH.json +1 -0
- package/lib/app/template/basic-app/theme-app/locales/zh-CN.json +6 -0
- package/lib/app/template/basic-app/theme-app/locales/zh-TW.json +1 -0
- package/lib/app/template/basic-app/theme-app/snippets/index.liquid +8 -0
- package/lib/app/template/embed-app/README.md +125 -0
- package/lib/app/template/embed-app/extension.config.json +4 -0
- package/lib/app/template/embed-app/package.json +18 -0
- package/lib/app/template/embed-app/theme-app/assets-manifest.json +1 -0
- package/lib/app/template/embed-app/theme-app/blocks/index.liquid +18 -0
- package/lib/app/template/embed-app/theme-app/locales/ar-SA.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/de-DE.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/en-US.json +6 -0
- package/lib/app/template/embed-app/theme-app/locales/es-ES.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/fr-FR.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/id-ID.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/it-IT.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/ja-JP.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/ko-KR.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/nl-NL.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/pl-PL.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/pt-PT.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/ru-RU.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/th-TH.json +1 -0
- package/lib/app/template/embed-app/theme-app/locales/zh-CN.json +6 -0
- package/lib/app/template/embed-app/theme-app/locales/zh-TW.json +1 -0
- package/lib/app/template/embed-app/theme-app/snippets/index.liquid +8 -0
- package/lib/app/template/embed-app/theme-app/snippets/index_css.liquid +6 -0
- package/lib/app/utils/config.js +32 -0
- package/lib/app/utils/index.js +213 -0
- package/lib/auth/getCode.js +2 -2
- package/lib/auth/index.js +2 -2
- package/lib/check.js +28 -0
- package/lib/checkout/api.js +12 -36
- package/lib/checkout/build.js +1 -1
- package/lib/checkout/create.js +1 -1
- package/lib/checkout/deploy.js +1 -1
- package/lib/checkout/dev/index.js +1 -1
- package/lib/checkout/fields.js +1 -1
- package/lib/checkout/preview.js +1 -1
- package/lib/checkout/pull.js +1 -0
- package/lib/checkout/push.js +1 -1
- package/lib/checkout/undeploy.js +1 -1
- package/lib/checkout/util.js +1 -1
- package/lib/checkout/verify.js +1 -1
- package/lib/commands/login.js +1 -1
- package/lib/commands/logout.js +1 -1
- package/lib/commands/theme/delete.js +1 -1
- package/lib/commands/theme/package.js +1 -1
- package/lib/commands/theme/publish.js +1 -1
- package/lib/commands/theme/pull.js +1 -1
- package/lib/commands/theme/push.js +1 -1
- package/lib/commands/theme/serve.js +2 -2
- package/lib/{app → common}/login.js +1 -1
- package/lib/function/bin/index.js +20 -0
- package/lib/function/bin/javy/javy-arm-linux-v5.0.1 +0 -0
- package/lib/function/bin/javy/javy-arm-macos-v5.0.1 +0 -0
- package/lib/function/bin/javy/javy-x86_64-linux-v5.0.1 +0 -0
- package/lib/function/bin/javy/javy-x86_64-macos-v5.0.1 +0 -0
- package/lib/function/bin/javy/javy-x86_64-windows-v5.0.1 +0 -0
- package/lib/function/commands/compile.js +42 -0
- package/lib/function/commands/create.js +77 -0
- package/lib/function/commands/list.js +18 -0
- package/lib/function/commands/release.js +69 -0
- package/lib/function/index.js +24 -0
- package/lib/function/template/js/README.md +37 -0
- package/lib/function/template/js/_gitignore +4 -0
- package/lib/function/template/js/extension.config.json +5 -0
- package/lib/function/template/js/package.json +17 -0
- package/lib/function/template/js/src/index.js +64 -0
- package/lib/function/utils.js +29 -0
- package/lib/openAPI/api.js +1 -1
- package/lib/openAPI/index.js +21 -11
- package/lib/oss.js +99 -0
- package/lib/partner-api/axios.js +67 -0
- package/lib/partner-api/index.js +79 -0
- package/lib/{checkout → utils}/console.js +3 -2
- package/lib/utils/env.js +17 -0
- package/lib/utils/file.js +48 -0
- package/lib/utils/platform.js +37 -0
- package/lib/{utils.js → utils/utils.js} +52 -0
- package/package.json +2 -2
- package/lib/app/commands/generate.js +0 -50
- package/lib/app/commands/publish.js +0 -52
- package/lib/app/extensions/index.js +0 -13
- package/lib/app/extensions/theme-app.js +0 -103
- package/lib/app/inquirers/version.js +0 -131
- /package/lib/{app → common}/constants.js +0 -0
- /package/lib/{app → common}/db/partner.js +0 -0
- /package/lib/{app → common}/inquirers/choose-app.js +0 -0
- /package/lib/{app → common}/inquirers/choose-partner.js +0 -0
- /package/lib/{app → common}/log.js +0 -0
- /package/lib/{app → common}/logout.js +0 -0
- /package/lib/{config.js → utils/config.js} +0 -0
package/lib/utils/env.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function isDebug() {
|
|
2
|
+
return process.argv.indexOf('--debug') >= 0;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
function isDevDebug() {
|
|
6
|
+
return process.argv.join('').indexOf('--debugdev') >= 0;
|
|
7
|
+
}
|
|
8
|
+
function isStgDebug() {
|
|
9
|
+
return process.argv.join('').indexOf('--debugstg') >= 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
isDebug,
|
|
14
|
+
isDevDebug,
|
|
15
|
+
isStgDebug
|
|
16
|
+
};
|
|
17
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const { getFileJson } = require('../checkout/util');
|
|
4
|
+
|
|
5
|
+
function copyDir(srcDir, destDir) {
|
|
6
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
7
|
+
for (const file of fs.readdirSync(srcDir)) {
|
|
8
|
+
const srcFile = path.resolve(srcDir, file);
|
|
9
|
+
const destFile = path.resolve(destDir, file);
|
|
10
|
+
copy(srcFile, destFile);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function copy(src, dest) {
|
|
15
|
+
const stat = fs.statSync(src);
|
|
16
|
+
if (stat.isDirectory()) {
|
|
17
|
+
copyDir(src, dest);
|
|
18
|
+
} else {
|
|
19
|
+
fs.copyFileSync(src, dest);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getJsonFileContent(file) {
|
|
24
|
+
const content = fs.readFileSync(file, { encoding: 'utf-8' });
|
|
25
|
+
return JSON.parse(content);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const CONFIG_FILE = 'extension.config.json';
|
|
29
|
+
|
|
30
|
+
function getConfigJson(name = CONFIG_FILE) {
|
|
31
|
+
const _path = path.join(process.cwd(), name);
|
|
32
|
+
return getJsonFileContent(_path);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function updateConfigJson(_config, name = CONFIG_FILE) {
|
|
36
|
+
const config = getConfigJson();
|
|
37
|
+
Object.assign(config, _config);
|
|
38
|
+
const _path = path.join(process.cwd(), name);
|
|
39
|
+
fs.writeFileSync(_path, JSON.stringify(config, null, 2), { encoding: 'utf-8' });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
copy,
|
|
44
|
+
copyDir,
|
|
45
|
+
getFileJson,
|
|
46
|
+
getConfigJson,
|
|
47
|
+
updateConfigJson
|
|
48
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
function getArchPlatform() {
|
|
2
|
+
let platform;
|
|
3
|
+
let arch;
|
|
4
|
+
switch (process.platform.toLowerCase()) {
|
|
5
|
+
case 'darwin':
|
|
6
|
+
platform = 'macos';
|
|
7
|
+
break;
|
|
8
|
+
case 'linux':
|
|
9
|
+
platform = 'linux';
|
|
10
|
+
break;
|
|
11
|
+
case 'win32':
|
|
12
|
+
platform = 'windows';
|
|
13
|
+
break;
|
|
14
|
+
default:
|
|
15
|
+
throw Error(`Unsupported platform ${processPlatform}`);
|
|
16
|
+
}
|
|
17
|
+
switch (process.arch.toLowerCase()) {
|
|
18
|
+
case 'arm':
|
|
19
|
+
case 'arm64':
|
|
20
|
+
arch = 'arm';
|
|
21
|
+
break;
|
|
22
|
+
// A 32 bit arch likely needs that someone has 32bit Node installed on a
|
|
23
|
+
// 64 bit system, and wasmtime doesn't support 32bit anyway.
|
|
24
|
+
case 'ia32':
|
|
25
|
+
case 'x64':
|
|
26
|
+
arch = 'x86_64';
|
|
27
|
+
break;
|
|
28
|
+
default:
|
|
29
|
+
throw Error(`Unsupported architecture ${processArch}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return `${arch}-${platform}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = {
|
|
36
|
+
getArchPlatform
|
|
37
|
+
};
|
|
@@ -2,6 +2,8 @@ const path = require('path');
|
|
|
2
2
|
const fs = require('fs-extra');
|
|
3
3
|
const AdmZip = require('adm-zip');
|
|
4
4
|
const chalk = require('chalk');
|
|
5
|
+
const chokidar = require('chokidar');
|
|
6
|
+
const fsExtra = require('fs-extra');
|
|
5
7
|
|
|
6
8
|
const {
|
|
7
9
|
SSO_AUTH_URL,
|
|
@@ -111,3 +113,53 @@ const SSO_AUTH_URL_MAP = {
|
|
|
111
113
|
exports.getSSOAuthUrl = (store) => {
|
|
112
114
|
return SSO_AUTH_URL_MAP[getEnv(store)];
|
|
113
115
|
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 监听文件夹变化
|
|
119
|
+
* @param {string} workspace - 需要监听的文件夹路径
|
|
120
|
+
* @param {Object} options - 配置项
|
|
121
|
+
* @param {Function} [options.onAdd] - 文件添加时的回调函数,接收文件路径作为参数
|
|
122
|
+
* @param {Function} [options.onChange] - 文件更改时的回调函数,接收文件路径作为参数
|
|
123
|
+
* @param {Function} [options.onDelete] - 文件删除时的回调函数,接收文件路径作为参数
|
|
124
|
+
* @param {any} [options.xxx] - 其他chokidar.watch配置项
|
|
125
|
+
* @returns {Function} - 取消监听的函数
|
|
126
|
+
*/
|
|
127
|
+
exports.watchWorkspace = (workspace, options = {}) => {
|
|
128
|
+
if (!fsExtra.pathExistsSync(workspace)) {
|
|
129
|
+
console.error(chalk.red(`[ERROR] "${workspace}" does not exist.`));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const defaultOptions = {
|
|
133
|
+
persistent: true,
|
|
134
|
+
ignoreInitial: true
|
|
135
|
+
};
|
|
136
|
+
const { onAdd = () => {}, onChange = () => {}, onDelete = () => {}, ...restOptions } = options;
|
|
137
|
+
const watcherOptions = { ...defaultOptions, ...restOptions };
|
|
138
|
+
const watcher = chokidar.watch(workspace, watcherOptions);
|
|
139
|
+
|
|
140
|
+
watcher.on('add', (filePath) => {
|
|
141
|
+
console.log(chalk.cyan(`[ADD] ${filePath}`));
|
|
142
|
+
onAdd(filePath);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
watcher.on('change', (filePath) => {
|
|
146
|
+
console.log(chalk.cyan(`[CHANGE] ${filePath}`));
|
|
147
|
+
onChange(filePath);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
watcher.on('unlink', (filePath) => {
|
|
151
|
+
console.log(chalk.cyan(`[DELETE] ${filePath}`));
|
|
152
|
+
onDelete(filePath);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
watcher.on('error', (error) => {
|
|
156
|
+
console.error(chalk.red(`[ERROR] ${error}`));
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const stopWatcher = () => {
|
|
160
|
+
console.log(chalk.green('[INFO] Stopping watcher...'));
|
|
161
|
+
watcher.close();
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
return stopWatcher;
|
|
165
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shoplazza-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "bin/shoplazza",
|
|
6
6
|
"engines": {
|
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
"@sentry/tracing": "^6.19.7",
|
|
27
27
|
"adm-zip": "^0.5.9",
|
|
28
28
|
"ali-oss": "^6.17.1",
|
|
29
|
-
"archiver": "^5.3.1",
|
|
30
29
|
"axios": "^1.6.8",
|
|
31
30
|
"better-sqlite3": "^11.5.0",
|
|
32
31
|
"chalk": "^4.1.2",
|
|
@@ -64,6 +63,7 @@
|
|
|
64
63
|
"semver": "~7.3.5",
|
|
65
64
|
"serve-static": "^1.15.0",
|
|
66
65
|
"spark-md5": "^3.0.2",
|
|
66
|
+
"table": "^6.9.0",
|
|
67
67
|
"uglify-js": "^3.17.4",
|
|
68
68
|
"update-notifier": "^5.1.0",
|
|
69
69
|
"vite": "~4.3.1",
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
const inquirer = require('inquirer');
|
|
2
|
-
const { set, PARTNER_KEYS } = require('../db/partner');
|
|
3
|
-
const { themeAppHandler, checkoutUIHandler } = require('../extensions');
|
|
4
|
-
const { line } = require('../log');
|
|
5
|
-
|
|
6
|
-
const EXTENSION_TYPES = {
|
|
7
|
-
CHECKOUT_UI: 'checkout_ui',
|
|
8
|
-
THEME_APP: 'theme_app'
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const generate = async () => {
|
|
12
|
-
line();
|
|
13
|
-
const answer = await inquirer.prompt([
|
|
14
|
-
{
|
|
15
|
-
type: 'list',
|
|
16
|
-
name: 'extensionType',
|
|
17
|
-
message: 'Choose your extension type ↓',
|
|
18
|
-
default: EXTENSION_TYPES.THEME_APP,
|
|
19
|
-
prefix: '*',
|
|
20
|
-
choices: [
|
|
21
|
-
{
|
|
22
|
-
name: 'Theme App Extension',
|
|
23
|
-
value: EXTENSION_TYPES.THEME_APP
|
|
24
|
-
}
|
|
25
|
-
]
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
type: 'input',
|
|
29
|
-
name: 'extensionName',
|
|
30
|
-
message: 'Input your extesion name: ',
|
|
31
|
-
default: 'my-extension',
|
|
32
|
-
prefix: '*'
|
|
33
|
-
}
|
|
34
|
-
]);
|
|
35
|
-
line();
|
|
36
|
-
|
|
37
|
-
set({ [PARTNER_KEYS.EXTENSION_TYPE]: answer.extensionType });
|
|
38
|
-
|
|
39
|
-
if (answer.extensionType === EXTENSION_TYPES.THEME_APP) {
|
|
40
|
-
await themeAppHandler(answer.extensionName);
|
|
41
|
-
} else if (answer.extensionType === EXTENSION_TYPES.CHECKOUT_UI) {
|
|
42
|
-
await checkoutUIHandler(answer.extensionName);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
line();
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
module.exports = {
|
|
49
|
-
generate
|
|
50
|
-
};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
const { default: axios } = require('axios');
|
|
2
|
-
const { selectVersion } = require('../inquirers/version');
|
|
3
|
-
const { PARNTER_URL } = require('../constants');
|
|
4
|
-
const { get, getValue, PARTNER_KEYS } = require('../db/partner');
|
|
5
|
-
const ora = require('ora');
|
|
6
|
-
const chalk = require('chalk');
|
|
7
|
-
const { getZipName } = require('./build');
|
|
8
|
-
const { done, line } = require('../log');
|
|
9
|
-
|
|
10
|
-
const publishVersion = async ({ version, appId, versionId, extensionId }) => {
|
|
11
|
-
const spinner = ora(chalk.cyan('Waiting publish ...'));
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
const partnerId = getValue(PARTNER_KEYS.PARTNER_ID);
|
|
15
|
-
if (!partnerId) {
|
|
16
|
-
spinner.fail(chalk.red('Please choose a partner first!'));
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const url = `${PARNTER_URL}/api/partner/apps/${appId}/theme_extensions/${extensionId}/publications`;
|
|
21
|
-
await axios.post(
|
|
22
|
-
url,
|
|
23
|
-
{
|
|
24
|
-
name: getZipName(),
|
|
25
|
-
version_id: versionId,
|
|
26
|
-
type: 'enable'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
headers: {
|
|
30
|
-
cookie: `awesomev2=${getValue(PARTNER_KEYS.SESSION_ID)};`,
|
|
31
|
-
'x-shoplazza-partner-id': partnerId
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
spinner.succeed();
|
|
37
|
-
return true;
|
|
38
|
-
} catch (e) {
|
|
39
|
-
spinner.fail(e.message || e);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const publish = async () => {
|
|
44
|
-
const versionData = await selectVersion();
|
|
45
|
-
await publishVersion(versionData);
|
|
46
|
-
done();
|
|
47
|
-
line();
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
module.exports = {
|
|
51
|
-
publish
|
|
52
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const { generateThemeDirectory } = require('./theme-app');
|
|
2
|
-
const { done } = require('../log');
|
|
3
|
-
|
|
4
|
-
const themeAppHandler = async (dirname = './') => {
|
|
5
|
-
(await generateThemeDirectory(dirname)) && done();
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
const checkoutUIHandler = async () => {};
|
|
9
|
-
|
|
10
|
-
module.exports = {
|
|
11
|
-
themeAppHandler,
|
|
12
|
-
checkoutUIHandler
|
|
13
|
-
};
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
const chalk = require('chalk');
|
|
2
|
-
const ora = require('ora');
|
|
3
|
-
const fs = require('fs-extra');
|
|
4
|
-
const glob = require('glob');
|
|
5
|
-
const repo = require('download-git-repo');
|
|
6
|
-
const CleanCSS = require('clean-css');
|
|
7
|
-
const UglifyJS = require('uglify-js');
|
|
8
|
-
|
|
9
|
-
const crypto = require('crypto');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
const { line } = require('../log');
|
|
12
|
-
|
|
13
|
-
const rev = (input) => crypto.createHash('md5').update(input).digest('hex').slice(0, 8);
|
|
14
|
-
const cleanCSS = new CleanCSS({
|
|
15
|
-
advanced: false,
|
|
16
|
-
aggressiveMerging: false
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const generateThemeDirectory = async (dirname = './') => {
|
|
20
|
-
const spinner = ora(chalk.cyan(`Waiting generate your theme app project...`)).start();
|
|
21
|
-
try {
|
|
22
|
-
await new Promise((resolve, reject) => {
|
|
23
|
-
repo('Shoplazza/theme-extension-template', dirname, {}, (err) => {
|
|
24
|
-
if (err) {
|
|
25
|
-
reject(JSON.stringify(err));
|
|
26
|
-
} else {
|
|
27
|
-
resolve(true);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
spinner.succeed(chalk.cyan(`Generate app successfully`));
|
|
33
|
-
return true;
|
|
34
|
-
} catch (e) {
|
|
35
|
-
spinner.fail();
|
|
36
|
-
console.log(chalk.red(e));
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const buildThemeAssets = async (outputDir = './dist', pathPrefix = '.') => {
|
|
41
|
-
line();
|
|
42
|
-
ora(chalk.cyan(`Prepare Build assets ...`)).succeed();
|
|
43
|
-
|
|
44
|
-
const manifest = {};
|
|
45
|
-
|
|
46
|
-
// build assets css
|
|
47
|
-
const spinner = ora(chalk.cyan(`Build assets ...`)).start();
|
|
48
|
-
try {
|
|
49
|
-
const cssPathnames = glob.sync('./assets/*.css');
|
|
50
|
-
const jsPathnames = glob.sync('./assets/*.js');
|
|
51
|
-
|
|
52
|
-
const pathnames = [...cssPathnames, ...jsPathnames];
|
|
53
|
-
for (const pathname of pathnames) {
|
|
54
|
-
const filename = path.basename(pathname);
|
|
55
|
-
const extname = path.extname(pathname);
|
|
56
|
-
const fileContent = fs.readFileSync(pathname, 'utf8');
|
|
57
|
-
const hash = rev(fileContent);
|
|
58
|
-
|
|
59
|
-
let minified = '';
|
|
60
|
-
let filenameWithHash = '';
|
|
61
|
-
if (extname.includes('css')) {
|
|
62
|
-
minified = cleanCSS.minify(fileContent);
|
|
63
|
-
if (minified.errors.length) {
|
|
64
|
-
spinner.fail(minified.errors);
|
|
65
|
-
process.exit(-1);
|
|
66
|
-
}
|
|
67
|
-
filenameWithHash = `${filename.split('.')[0]}-${hash}.css`;
|
|
68
|
-
const assetsPath = `${outputDir}/${filenameWithHash}`;
|
|
69
|
-
fs.ensureFileSync(assetsPath);
|
|
70
|
-
fs.writeFileSync(assetsPath, minified.styles);
|
|
71
|
-
} else if (extname.includes('js')) {
|
|
72
|
-
minified = UglifyJS.minify(fileContent);
|
|
73
|
-
if (minified.error) {
|
|
74
|
-
log.error(minified.error);
|
|
75
|
-
process.exit(-1);
|
|
76
|
-
}
|
|
77
|
-
filenameWithHash = `${filename.split('.')[0]}-${hash}.js`;
|
|
78
|
-
const assetsPath = `${outputDir}/${filenameWithHash}`;
|
|
79
|
-
fs.ensureFileSync(assetsPath);
|
|
80
|
-
fs.writeFileSync(assetsPath, minified.code);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
manifest[filename] = pathPrefix + '/assets/' + filenameWithHash;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
fs.writeFileSync(`./assets-manifest.json`, JSON.stringify(manifest));
|
|
87
|
-
spinner.succeed(chalk.cyan(`Build assets done`));
|
|
88
|
-
return true;
|
|
89
|
-
} catch (e) {
|
|
90
|
-
spinner.fail(chalk.red(e.message));
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// build assets js
|
|
94
|
-
const jsSpinner = ora(chalk.cyan(`Build js ...`)).start();
|
|
95
|
-
try {
|
|
96
|
-
jsSpinner.succeed(chalk.cyan(`Build js done`));
|
|
97
|
-
} catch (e) {}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
module.exports = {
|
|
101
|
-
generateThemeDirectory,
|
|
102
|
-
buildThemeAssets
|
|
103
|
-
};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
const axios = require('axios');
|
|
2
|
-
const chalk = require('chalk');
|
|
3
|
-
const inquirer = require('inquirer');
|
|
4
|
-
|
|
5
|
-
const { PARNTER_URL } = require('../constants');
|
|
6
|
-
const { getApp, getValue, PARTNER_KEYS } = require('../db/partner');
|
|
7
|
-
const { line } = require('../log');
|
|
8
|
-
|
|
9
|
-
const requestLastVersion = async () => {
|
|
10
|
-
try {
|
|
11
|
-
const app = getApp();
|
|
12
|
-
if (!app) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
const extensionId = getValue(PARTNER_KEYS.EXTENSION_ID);
|
|
16
|
-
const partnerId = getValue(PARTNER_KEYS.PARTNER_ID);
|
|
17
|
-
|
|
18
|
-
const url = `${PARNTER_URL}/api/partner/apps/${app.uid}/theme_extensions/${extensionId}/last_version`;
|
|
19
|
-
const res = await axios.get(url, {
|
|
20
|
-
headers: {
|
|
21
|
-
cookie: `awesomev2=${getValue(PARTNER_KEYS.SESSION_ID)};`,
|
|
22
|
-
'x-shoplazza-partner-id': partnerId
|
|
23
|
-
},
|
|
24
|
-
validateStatus(status) {
|
|
25
|
-
if (status === 404) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
return status >= 200 && status < 299;
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (res.data.errors) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return res.data.version;
|
|
37
|
-
} catch (e) {
|
|
38
|
-
console.log(chalk.red(e.message || e));
|
|
39
|
-
console.log(chalk.red(JSON.stringify(e.response?.data)));
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const requestVersionsData = async (params = {}) => {
|
|
44
|
-
try {
|
|
45
|
-
const app = getApp();
|
|
46
|
-
if (!app) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const extensionId = getValue(PARTNER_KEYS.EXTENSION_ID);
|
|
50
|
-
const partnerId = getValue(PARTNER_KEYS.PARTNER_ID);
|
|
51
|
-
|
|
52
|
-
const url = `${PARNTER_URL}/api/partner/apps/${app.uid}/theme_extensions/${extensionId}/versions`;
|
|
53
|
-
const res = await axios.get(url, {
|
|
54
|
-
params,
|
|
55
|
-
headers: {
|
|
56
|
-
cookie: `awesomev2=${getValue(PARTNER_KEYS.SESSION_ID)};`,
|
|
57
|
-
'x-shoplazza-partner-id': partnerId
|
|
58
|
-
},
|
|
59
|
-
validateStatus(status) {
|
|
60
|
-
if (status === 404) {
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
return status >= 200 && status < 299;
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
if (res.data.errors) {
|
|
68
|
-
throw new Error(JSON.stringify(res.data.errors));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return res.data.data;
|
|
72
|
-
} catch (e) {
|
|
73
|
-
console.log(chalk.red(e.message || e));
|
|
74
|
-
console.log(chalk.red(JSON.stringify(e.response?.data)));
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const inputVersion = async () => {
|
|
79
|
-
line();
|
|
80
|
-
const lastVersionData = await requestLastVersion({ limit: 1 });
|
|
81
|
-
const hint = lastVersionData ? chalk.gray(`(last version: ${lastVersionData.version})`) : '';
|
|
82
|
-
|
|
83
|
-
const answer = await inquirer.prompt([
|
|
84
|
-
{
|
|
85
|
-
type: 'input',
|
|
86
|
-
name: 'extensionVersion',
|
|
87
|
-
message: `${chalk.blue('Input your extension version')} ${hint}:`,
|
|
88
|
-
prefix: `${chalk.green('⭐️')}`
|
|
89
|
-
}
|
|
90
|
-
]);
|
|
91
|
-
|
|
92
|
-
return answer['extensionVersion'];
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const selectVersion = async () => {
|
|
96
|
-
line();
|
|
97
|
-
|
|
98
|
-
const versionDataList = await requestVersionsData();
|
|
99
|
-
if (!versionDataList) {
|
|
100
|
-
console.log(chalk.red('Please deploy a version first!'));
|
|
101
|
-
line();
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const answer = await inquirer.prompt([
|
|
105
|
-
{
|
|
106
|
-
type: 'list',
|
|
107
|
-
name: 'versionData',
|
|
108
|
-
message: `${chalk.blue('Choose a version to publish:')}`,
|
|
109
|
-
default: versionDataList[0].version,
|
|
110
|
-
prefix: `${chalk.blue('🐱')}`,
|
|
111
|
-
choices: versionDataList.map((v) => {
|
|
112
|
-
return {
|
|
113
|
-
name: `${v.version} ${v.published ? chalk.green('published') : ''}`,
|
|
114
|
-
value: {
|
|
115
|
-
version: v.version,
|
|
116
|
-
appId: v.app_id,
|
|
117
|
-
versionId: v.version_id,
|
|
118
|
-
extensionId: v.extension_id
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
})
|
|
122
|
-
}
|
|
123
|
-
]);
|
|
124
|
-
|
|
125
|
-
return answer['versionData'];
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
module.exports = {
|
|
129
|
-
inputVersion,
|
|
130
|
-
selectVersion
|
|
131
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|