shoplazza-cli 1.0.7 → 1.0.9
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 +179 -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
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
const fsExtra = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const AdmZip = require('adm-zip');
|
|
5
|
+
const md5 = require('md5');
|
|
6
|
+
const { table } = require('table');
|
|
7
|
+
const { WORKSPACE_PATH, THEME_APP_CONFIG_PATH } = require('./config');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 通用的占位符替换函数
|
|
11
|
+
*/
|
|
12
|
+
const replacePlaceholders = async (filePath, replacements) => {
|
|
13
|
+
if (!fsExtra.pathExistsSync(filePath)) {
|
|
14
|
+
console.warn(`File "${filePath}" does not exist, skipping replacement.`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let content = await fsExtra.readFile(filePath, 'utf-8');
|
|
18
|
+
// 替换占位符
|
|
19
|
+
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
20
|
+
const regex = new RegExp(`\\{\\{${placeholder}\\}\\}`, 'g'); // 匹配占位符格式:{{placeholder}}
|
|
21
|
+
content = content.replace(regex, value);
|
|
22
|
+
}
|
|
23
|
+
// 写回文件
|
|
24
|
+
await fsExtra.writeFile(filePath, content, 'utf-8');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 重命名指定文件
|
|
29
|
+
* @param {string} filePath - 原始文件的完整路径
|
|
30
|
+
* @param {string} targetName - 新的文件名
|
|
31
|
+
*/
|
|
32
|
+
const renameFile = async (filePath, targetName) => {
|
|
33
|
+
if (!fsExtra.pathExistsSync(filePath)) {
|
|
34
|
+
console.warn(`File "${filePath}" does not exist, skipping.`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const targetFilePath = path.resolve(path.dirname(filePath), `${targetName}${path.extname(filePath)}`);
|
|
38
|
+
await fsExtra.rename(filePath, targetFilePath);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 获取themeApp配置(信息)
|
|
43
|
+
* @returns {Promise<string>}
|
|
44
|
+
*/
|
|
45
|
+
async function getThemeExtensionConfig() {
|
|
46
|
+
if (!fsExtra.pathExistsSync(THEME_APP_CONFIG_PATH)) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`The current workspace is not a valid theme extension project, because "${WORKSPACE_PATH}" is missing the required "extension.config.json" file.`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
return fsExtra.readJson(THEME_APP_CONFIG_PATH);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 更新themeApp配置(信息)
|
|
56
|
+
* @param {Object} config 待更新的配置信息
|
|
57
|
+
*/
|
|
58
|
+
async function setThemeExtensionConfig(config) {
|
|
59
|
+
const oldThemeExtensionConfig = await getThemeExtensionConfig();
|
|
60
|
+
const newThemeExtensionConfig = { ...oldThemeExtensionConfig, ...config };
|
|
61
|
+
await fsExtra.writeJson(THEME_APP_CONFIG_PATH, newThemeExtensionConfig, { spaces: 2 });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 计算文件夹内容的哈希值
|
|
66
|
+
* @param {string} dirPath - 文件夹路径
|
|
67
|
+
* @returns {Promise<string>} 返回基于文件夹内容的哈希值
|
|
68
|
+
*/
|
|
69
|
+
async function calculateFolderHash(dirPath) {
|
|
70
|
+
if (!fsExtra.pathExistsSync(dirPath)) {
|
|
71
|
+
throw new Error(chalk.red(`Calculate folder hash path does not exist: ${dirPath}`));
|
|
72
|
+
}
|
|
73
|
+
const files = await fsExtra.readdir(dirPath);
|
|
74
|
+
let contentHash = '';
|
|
75
|
+
for (const file of files) {
|
|
76
|
+
const filePath = path.join(dirPath, file);
|
|
77
|
+
const fileStats = await fsExtra.stat(filePath);
|
|
78
|
+
|
|
79
|
+
if (fileStats.isDirectory()) {
|
|
80
|
+
// 如果是目录,递归计算文件夹内容的哈希值
|
|
81
|
+
contentHash += await calculateFolderHash(filePath);
|
|
82
|
+
} else {
|
|
83
|
+
// 如果是文件,读取文件内容并计算哈希
|
|
84
|
+
const fileContent = await fsExtra.readFile(filePath);
|
|
85
|
+
contentHash += md5(fileContent);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return md5(contentHash);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 通用的压缩函数(同目录生成zip压缩文件)
|
|
94
|
+
* @param {string} sourcePath - 需要压缩的目录或文件路径
|
|
95
|
+
* @returns {Promise<Object>} 返回压缩文件的生成路径&压碎文件名
|
|
96
|
+
*/
|
|
97
|
+
async function compress(sourcePath) {
|
|
98
|
+
if (!fsExtra.pathExistsSync(sourcePath)) {
|
|
99
|
+
throw new Error(chalk.red(`Compress path does not exist: ${sourcePath}`));
|
|
100
|
+
}
|
|
101
|
+
const sourceName = path.basename(sourcePath);
|
|
102
|
+
const outputDir = path.dirname(sourcePath);
|
|
103
|
+
const sourceHash = await calculateFolderHash(sourcePath);
|
|
104
|
+
const fileName = `${sourceName}-${sourceHash.substring(0, 8)}${Date.now().toString(16).substring(0, 8)}.zip`;
|
|
105
|
+
const outputPath = path.resolve(outputDir, fileName);
|
|
106
|
+
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const zip = new AdmZip();
|
|
109
|
+
if (fsExtra.statSync(sourcePath).isDirectory()) {
|
|
110
|
+
zip.addLocalFolder(sourcePath, sourceName);
|
|
111
|
+
} else {
|
|
112
|
+
zip.addLocalFile(sourcePath);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
zip.writeZip(outputPath, (err) => {
|
|
116
|
+
if (err) {
|
|
117
|
+
reject(err);
|
|
118
|
+
} else {
|
|
119
|
+
resolve({
|
|
120
|
+
zipPath: outputPath,
|
|
121
|
+
zipName: fileName
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 比较两个版本号的大小
|
|
130
|
+
* @param {String} version1 版本号1
|
|
131
|
+
* @param {String} version2 版本号2
|
|
132
|
+
* @returns version1 < version2 返回 -1,version1 > version2 返回 1,相等返回 0
|
|
133
|
+
*/
|
|
134
|
+
function compareVersions(version1, version2) {
|
|
135
|
+
const v1 = version1.split('.').map(Number);
|
|
136
|
+
const v2 = version2.split('.').map(Number);
|
|
137
|
+
|
|
138
|
+
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
|
|
139
|
+
const num1 = v1[i] || 0;
|
|
140
|
+
const num2 = v2[i] || 0;
|
|
141
|
+
|
|
142
|
+
if (num1 < num2) {
|
|
143
|
+
return -1;
|
|
144
|
+
}
|
|
145
|
+
if (num1 > num2) {
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* 获取文件名及其直接父目录名
|
|
154
|
+
* @param {string} filePath - 文件的绝对路径
|
|
155
|
+
* @returns {{ fileName: string, parentDirName: string }} 返回包含文件名和父目录名的对象
|
|
156
|
+
*/
|
|
157
|
+
function getFileInfo(filePath) {
|
|
158
|
+
const fileName = path.basename(filePath);
|
|
159
|
+
const parentDirName = path.basename(path.dirname(filePath));
|
|
160
|
+
return { fileName, parentDirName };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// 表格配置
|
|
164
|
+
const TABLE_CONFIG = {
|
|
165
|
+
border: {
|
|
166
|
+
topBody: '═',
|
|
167
|
+
topJoin: '╤',
|
|
168
|
+
topLeft: '╔',
|
|
169
|
+
topRight: '╗',
|
|
170
|
+
bottomBody: '═',
|
|
171
|
+
bottomJoin: '╧',
|
|
172
|
+
bottomLeft: '╚',
|
|
173
|
+
bottomRight: '╝',
|
|
174
|
+
bodyLeft: '║',
|
|
175
|
+
bodyRight: '║',
|
|
176
|
+
bodyJoin: '│',
|
|
177
|
+
joinBody: '─',
|
|
178
|
+
joinLeft: '╟',
|
|
179
|
+
joinRight: '╢',
|
|
180
|
+
joinJoin: '┼'
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* 图像化表格渲染数据
|
|
186
|
+
* @param {Array} data - 数据
|
|
187
|
+
* @param {Array} options - 配置项 [{ label:string, filed:string, color?:string}, ...]
|
|
188
|
+
* @example
|
|
189
|
+
* renderTable([{name:'Jack',age:20},{name:'Tom',age:30}],
|
|
190
|
+
* [{label:'姓名',filed:'name',color:''},{label:'年龄',filed:'age',color:''}]
|
|
191
|
+
* )
|
|
192
|
+
*/
|
|
193
|
+
function renderTable(data, options) {
|
|
194
|
+
const header = options.map((item) => chalk.bold(item.label));
|
|
195
|
+
const rows = data.map((item) => options.map((opt) => chalk[opt.color || 'whiteBright'](item[opt.filed])));
|
|
196
|
+
const tableData = [header, ...rows];
|
|
197
|
+
return table(tableData, {
|
|
198
|
+
border: Object.fromEntries(
|
|
199
|
+
Object.entries(TABLE_CONFIG.border).map(([key, val]) => [key, chalk.blueBright.bold(val)])
|
|
200
|
+
)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
module.exports = {
|
|
205
|
+
replacePlaceholders,
|
|
206
|
+
renameFile,
|
|
207
|
+
getThemeExtensionConfig,
|
|
208
|
+
setThemeExtensionConfig,
|
|
209
|
+
compress,
|
|
210
|
+
compareVersions,
|
|
211
|
+
getFileInfo,
|
|
212
|
+
renderTable
|
|
213
|
+
};
|
package/lib/auth/getCode.js
CHANGED
|
@@ -3,8 +3,8 @@ const { fork } = require('child_process');
|
|
|
3
3
|
const path = require('path');
|
|
4
4
|
const open = require('open');
|
|
5
5
|
const log = require('../log');
|
|
6
|
-
const { REDIRECT_URI } = require('../config');
|
|
7
|
-
const { getSSOAuthUrl, getClientId } = require('../utils');
|
|
6
|
+
const { REDIRECT_URI } = require('../utils/config');
|
|
7
|
+
const { getSSOAuthUrl, getClientId } = require('../utils/utils');
|
|
8
8
|
|
|
9
9
|
const openSSOPage = (store) => {
|
|
10
10
|
open(
|
package/lib/auth/index.js
CHANGED
|
@@ -4,8 +4,8 @@ const Sentry = require('@sentry/node');
|
|
|
4
4
|
const querystring = require('querystring');
|
|
5
5
|
const { get, set, empty } = require('../db/user');
|
|
6
6
|
const log = require('../log');
|
|
7
|
-
const { REDIRECT_URI } = require('../config');
|
|
8
|
-
const { getAccountUrl, getClientId, getSSOAuthUrl } = require('../utils');
|
|
7
|
+
const { REDIRECT_URI } = require('../utils/config');
|
|
8
|
+
const { getAccountUrl, getClientId, getSSOAuthUrl } = require('../utils/utils');
|
|
9
9
|
|
|
10
10
|
exports.postAccessToken = async (code, store) => {
|
|
11
11
|
try {
|
package/lib/check.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const { consoleWarn } = require("./utils/console");
|
|
2
|
+
|
|
3
|
+
const supportVersion = ['v20.9.0', 'v20.18.0'];
|
|
4
|
+
|
|
5
|
+
// 解析当前版本号
|
|
6
|
+
function parseVersion(versionStr) {
|
|
7
|
+
return versionStr.slice(1).split('.').slice(0, 3).map(Number);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function checkNodeVersion() {
|
|
11
|
+
const currentVersion = parseVersion(process.version);
|
|
12
|
+
// 检查当前版本是否在支持范围内
|
|
13
|
+
const isSupported = supportVersion
|
|
14
|
+
.map(parseVersion)
|
|
15
|
+
.some(
|
|
16
|
+
(version) =>
|
|
17
|
+
version[0] === currentVersion[0] && version[1] === currentVersion[1] && version[2] === currentVersion[2]
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
if (!isSupported) {
|
|
21
|
+
consoleWarn(
|
|
22
|
+
`[WARNING]the version of current Node.js is ${process.version},advise select the support version:`,
|
|
23
|
+
supportVersion.join(',')
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
checkNodeVersion();
|
package/lib/checkout/api.js
CHANGED
|
@@ -4,10 +4,10 @@ const fs = require('fs');
|
|
|
4
4
|
const FormData = require('form-data');
|
|
5
5
|
const loading = require('loading-cli');
|
|
6
6
|
const { openAipVersion } = require('./config');
|
|
7
|
-
const { isDebug } = require('
|
|
7
|
+
const { isDebug, consoleWarn } = require('../utils/console');
|
|
8
8
|
const { getProjectConfig } = require('./util');
|
|
9
9
|
const chalk = require('chalk');
|
|
10
|
-
const {
|
|
10
|
+
const { useOss } = require('../oss');
|
|
11
11
|
|
|
12
12
|
const FILE_SIGN_URL = '/checkout_extensions/file/sign';
|
|
13
13
|
const CREATE_URL = '/checkout_extensions/create';
|
|
@@ -19,6 +19,7 @@ const UNDEPLOY_URL = '/checkout_extensions/undeploy';
|
|
|
19
19
|
const PREVIEW_URL = '/checkout_extensions/preview';
|
|
20
20
|
|
|
21
21
|
let configJson = undefined;
|
|
22
|
+
let uploadOss = null;
|
|
22
23
|
|
|
23
24
|
const request = new Axios.create();
|
|
24
25
|
|
|
@@ -64,9 +65,6 @@ request.interceptors.response.use(
|
|
|
64
65
|
if (isDebug()) {
|
|
65
66
|
console.log(`\n<== error ${error.response.status}: ${error.response.config.url}`);
|
|
66
67
|
}
|
|
67
|
-
if (!error.response) {
|
|
68
|
-
throw chalk.red('Network error, please check your connection.');
|
|
69
|
-
}
|
|
70
68
|
if (error.response?.status == 403) {
|
|
71
69
|
return Promise.reject(new Error('Token permission failure'));
|
|
72
70
|
}
|
|
@@ -74,42 +72,20 @@ request.interceptors.response.use(
|
|
|
74
72
|
}
|
|
75
73
|
);
|
|
76
74
|
|
|
77
|
-
async function upload(path, name) {
|
|
78
|
-
const form = new FormData();
|
|
79
|
-
const url = await request(`${FILE_SIGN_URL}?key=${name}`)
|
|
80
|
-
.then((data) => {
|
|
81
|
-
return data.data;
|
|
82
|
-
})
|
|
83
|
-
.then(async (data) => {
|
|
84
|
-
const url = data.write_host;
|
|
85
|
-
form.append('policy', data.policy);
|
|
86
|
-
form.append('OSSAccessKeyId', data.access_id);
|
|
87
|
-
form.append('success_action_status', 200);
|
|
88
|
-
form.append('signature', data.sign);
|
|
89
|
-
form.append('x-oss-forbid-overwrite', 'true');
|
|
90
|
-
form.append('key', name);
|
|
91
|
-
form.append('file', fs.createReadStream(path));
|
|
92
|
-
await request.post(`https:${url}`, form, { headers: form.getHeaders() }).catch((error) => {
|
|
93
|
-
if (error.response?.data.includes('<Code>FileAlreadyExists</Code>')) {
|
|
94
|
-
consoleWarn('The current file already exists, not need to upload.');
|
|
95
|
-
return;
|
|
96
|
-
} else {
|
|
97
|
-
return Promise.reject(error);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
return `${data.read_host}${data.read_host.endsWith('/') ? '' : '/'}${name}`;
|
|
101
|
-
});
|
|
102
|
-
loading('succeed upload').succeed();
|
|
103
|
-
return url;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
75
|
async function uploadFile(dirPath, file) {
|
|
107
|
-
|
|
76
|
+
if (!uploadOss) {
|
|
77
|
+
uploadOss = useOss(
|
|
78
|
+
configJson.token,
|
|
79
|
+
new URL(configJson.store).hostname,
|
|
80
|
+
`✗ No store found. Please check your "extension.config.js" file.`
|
|
81
|
+
).uploadOss;
|
|
82
|
+
}
|
|
83
|
+
return uploadOss(`${dirPath}/${file}`);
|
|
108
84
|
}
|
|
109
85
|
async function uploadDir(dirPath, files) {
|
|
110
86
|
return Promise.all(
|
|
111
87
|
files.map((file) => {
|
|
112
|
-
return
|
|
88
|
+
return uploadOss(`${dirPath}/${file}`);
|
|
113
89
|
})
|
|
114
90
|
);
|
|
115
91
|
}
|
package/lib/checkout/build.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const { consoleError, consoleBlue } = require('
|
|
1
|
+
const { consoleError, consoleBlue } = require('../utils/console');
|
|
2
2
|
const { build } = require('vite');
|
|
3
3
|
const { viteConfig } = require('./build/vite.config');
|
|
4
4
|
const { getExtensionInfo, getDistPath } = require('./util');
|
package/lib/checkout/create.js
CHANGED
package/lib/checkout/deploy.js
CHANGED
|
@@ -2,7 +2,7 @@ const api = require('./api');
|
|
|
2
2
|
const { verifyConfig } = require('./verify');
|
|
3
3
|
const { useSelectExtensionMode } = require('./util');
|
|
4
4
|
const inquirer = require('inquirer');
|
|
5
|
-
const { consoleSuccess, consoleError, consoleBlue } = require('
|
|
5
|
+
const { consoleSuccess, consoleError, consoleBlue } = require('../utils/console');
|
|
6
6
|
|
|
7
7
|
module.exports = async () => {
|
|
8
8
|
try {
|
|
@@ -12,7 +12,7 @@ const path = require('path');
|
|
|
12
12
|
const chokidar = require('chokidar');
|
|
13
13
|
const fs = require('fs');
|
|
14
14
|
const { viteBuild } = require('../build');
|
|
15
|
-
const { consoleError, consoleBlue, consoleSuccess } = require('
|
|
15
|
+
const { consoleError, consoleBlue, consoleSuccess } = require('../../utils/console');
|
|
16
16
|
|
|
17
17
|
async function buildExtension(id) {
|
|
18
18
|
return viteBuild({ id })
|
package/lib/checkout/fields.js
CHANGED
package/lib/checkout/preview.js
CHANGED
|
@@ -2,7 +2,7 @@ const inquirer = require('inquirer');
|
|
|
2
2
|
const api = require('./api');
|
|
3
3
|
const { verifyConfig } = require('./verify');
|
|
4
4
|
const { useSelectExtensionMode, getProjectConfig } = require('./util');
|
|
5
|
-
const { consoleSuccess, consoleError } = require('
|
|
5
|
+
const { consoleSuccess, consoleError } = require('../utils/console');
|
|
6
6
|
|
|
7
7
|
module.exports = async () => {
|
|
8
8
|
try {
|
package/lib/checkout/pull.js
CHANGED
package/lib/checkout/push.js
CHANGED
|
@@ -12,7 +12,7 @@ const {
|
|
|
12
12
|
getProjectConfig
|
|
13
13
|
} = require('./util');
|
|
14
14
|
const fsExtra = require('fs-extra');
|
|
15
|
-
const { consoleBlue, consoleSuccess, consoleError, consoleWarn } = require('
|
|
15
|
+
const { consoleBlue, consoleSuccess, consoleError, consoleWarn } = require('../utils/console');
|
|
16
16
|
const { viteBuild } = require('./build');
|
|
17
17
|
const { verifyConfig } = require('./verify');
|
|
18
18
|
|
package/lib/checkout/undeploy.js
CHANGED
|
@@ -2,7 +2,7 @@ const api = require('./api');
|
|
|
2
2
|
const { verifyConfig } = require('./verify');
|
|
3
3
|
const { useSelectExtensionMode } = require('./util');
|
|
4
4
|
const inquirer = require('inquirer');
|
|
5
|
-
const { consoleSuccess, consoleBlue, consoleError } = require('
|
|
5
|
+
const { consoleSuccess, consoleBlue, consoleError } = require('../utils/console');
|
|
6
6
|
|
|
7
7
|
module.exports = async () => {
|
|
8
8
|
try {
|
package/lib/checkout/util.js
CHANGED
|
@@ -2,7 +2,7 @@ const AdmZip = require('adm-zip');
|
|
|
2
2
|
const { cwd, configFile } = require('./config');
|
|
3
3
|
const fs = require('fs');
|
|
4
4
|
const path = require('path');
|
|
5
|
-
const { consoleError, consoleBlue } = require('
|
|
5
|
+
const { consoleError, consoleBlue } = require('../utils/console');
|
|
6
6
|
const inquirer = require('inquirer');
|
|
7
7
|
|
|
8
8
|
const walkSync = (currentDirPath, callback) => {
|
package/lib/checkout/verify.js
CHANGED
package/lib/commands/login.js
CHANGED
|
@@ -8,7 +8,7 @@ const log = require('../log');
|
|
|
8
8
|
const { getShopDetail } = require('../openAPI/api');
|
|
9
9
|
const getCode = require('../auth/getCode');
|
|
10
10
|
const { postAccessToken, getUserInfo, postExchangeToken, postStoreToken } = require('../auth');
|
|
11
|
-
const { loginIntoPartner } = require('../
|
|
11
|
+
const { loginIntoPartner } = require('../common/login');
|
|
12
12
|
|
|
13
13
|
let spinner;
|
|
14
14
|
|
package/lib/commands/logout.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const Sentry = require('@sentry/node');
|
|
2
2
|
const chalk = require('chalk');
|
|
3
3
|
const { empty: emptyUser } = require('../db/user');
|
|
4
|
-
const { logoutPartner } = require('../
|
|
4
|
+
const { logoutPartner } = require('../common/logout');
|
|
5
5
|
const log = require('../log');
|
|
6
6
|
|
|
7
7
|
const logoutStore = () => {
|
|
@@ -5,7 +5,7 @@ const inquirer = require('inquirer');
|
|
|
5
5
|
const { getThemeDetail, getThemes, deleteTheme } = require('../../openAPI/api');
|
|
6
6
|
const { get } = require('../../db/user');
|
|
7
7
|
const log = require('../../log');
|
|
8
|
-
const { formatThemeList } = require('../../utils');
|
|
8
|
+
const { formatThemeList } = require('../../utils/utils');
|
|
9
9
|
|
|
10
10
|
const confirmAndDeleteTheme = async (themeName, themeId) => {
|
|
11
11
|
const answers = await inquirer.prompt([
|
|
@@ -3,7 +3,7 @@ const fs = require('fs-extra');
|
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const Sentry = require('@sentry/node');
|
|
5
5
|
const log = require('../../log');
|
|
6
|
-
const { zipTheme } = require('../../utils');
|
|
6
|
+
const { zipTheme } = require('../../utils/utils');
|
|
7
7
|
|
|
8
8
|
const checkAndZipThemes = () => {
|
|
9
9
|
const configPath = path.join(process.cwd(), 'config/settings_schema.json');
|
|
@@ -5,7 +5,7 @@ const Sentry = require('@sentry/node');
|
|
|
5
5
|
const { getThemeDetail, getThemes, publishTheme } = require('../../openAPI/api');
|
|
6
6
|
const { get } = require('../../db/user');
|
|
7
7
|
const log = require('../../log');
|
|
8
|
-
const { formatThemeList } = require('../../utils');
|
|
8
|
+
const { formatThemeList } = require('../../utils/utils');
|
|
9
9
|
|
|
10
10
|
const confirmAndExecPublish = async (themeName, themeId) => {
|
|
11
11
|
const answers = await inquirer.prompt([
|
|
@@ -7,7 +7,7 @@ const inquirer = require('inquirer');
|
|
|
7
7
|
const Sentry = require('@sentry/node');
|
|
8
8
|
const { get } = require('../../db/user');
|
|
9
9
|
const { pullTheme, getThemes, getDefaultThemeDetail } = require('../../openAPI/api');
|
|
10
|
-
const { unzipTheme, formatThemeList } = require('../../utils');
|
|
10
|
+
const { unzipTheme, formatThemeList } = require('../../utils/utils');
|
|
11
11
|
const log = require('../../log');
|
|
12
12
|
|
|
13
13
|
const pullThemeFiles = async (theme) => {
|
|
@@ -5,7 +5,7 @@ const Sentry = require('@sentry/node');
|
|
|
5
5
|
const fs = require('fs-extra');
|
|
6
6
|
const { get } = require('../../db/user');
|
|
7
7
|
const { getThemeDetail, getThemes, getDefaultThemeDetail, pushTheme, getPushTask } = require('../../openAPI/api');
|
|
8
|
-
const { sleep, formatThemeList } = require('../../utils');
|
|
8
|
+
const { sleep, formatThemeList } = require('../../utils/utils');
|
|
9
9
|
const { checkAndZipThemes } = require('./package');
|
|
10
10
|
const log = require('../../log');
|
|
11
11
|
|
|
@@ -11,8 +11,8 @@ const { get, set } = require('../../db/user');
|
|
|
11
11
|
const { pushThemeFiles } = require('./push');
|
|
12
12
|
const { getThemes, getDefaultThemeDetail, deleteFile, updateFile, addFile, getFileList } = require('../../openAPI/api');
|
|
13
13
|
const log = require('../../log');
|
|
14
|
-
const { THEME_DIRS } = require('../../config');
|
|
15
|
-
const { getThemeFilenameTypeAndLocation, formatThemeList } = require('../../utils');
|
|
14
|
+
const { THEME_DIRS } = require('../../utils/config');
|
|
15
|
+
const { getThemeFilenameTypeAndLocation, formatThemeList } = require('../../utils/utils');
|
|
16
16
|
|
|
17
17
|
const existInList = (filename, fileList) => {
|
|
18
18
|
const { type, location } = getThemeFilenameTypeAndLocation(filename);
|
|
@@ -7,7 +7,7 @@ const path = require('path');
|
|
|
7
7
|
|
|
8
8
|
const { set, PARTNER_KEYS, get, empty } = require('./db/partner');
|
|
9
9
|
const { PARNTER_URL, LOGIN_BASE_URL, CLIENT_ID } = require('./constants');
|
|
10
|
-
const { REDIRECT_URI } = require('../config');
|
|
10
|
+
const { REDIRECT_URI } = require('../utils/config');
|
|
11
11
|
const log = require('../log');
|
|
12
12
|
const { choosePartner } = require('./inquirers/choose-partner');
|
|
13
13
|
const { chooseApp } = require('./inquirers/choose-app');
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { getArchPlatform } = require('../../utils/platform');
|
|
4
|
+
|
|
5
|
+
function getLibPath(name) {
|
|
6
|
+
const archPlatform = getArchPlatform();
|
|
7
|
+
const supportedTargets = ['arm-linux', 'arm-macos', 'x86_64-macos', 'x86_64-windows', 'x86_64-linux'];
|
|
8
|
+
if (!supportedTargets.includes(archPlatform)) {
|
|
9
|
+
throw Error(`Unsupported platform/architecture combination ${processPlatform}/${processArch}`);
|
|
10
|
+
}
|
|
11
|
+
const libDir = fs.readdirSync(__dirname).find((n) => name === n);
|
|
12
|
+
const targetPath = fs.readdirSync(path.resolve(__dirname, libDir)).find((libName) => libName.includes(archPlatform));
|
|
13
|
+
const libPath = path.resolve(__dirname, name, targetPath);
|
|
14
|
+
fs.chmodSync(libPath, 0o755);
|
|
15
|
+
return libPath;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
module.exports = {
|
|
19
|
+
getLibPath
|
|
20
|
+
};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const { getConfigJson } = require('../../utils/file');
|
|
3
|
+
const { getLibPath } = require('../bin');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const loadingCli = require('loading-cli');
|
|
6
|
+
const { exec } = require('child_process');
|
|
7
|
+
|
|
8
|
+
function createDistIfNotExist() {
|
|
9
|
+
const distPath = path.resolve(process.cwd(), 'dist');
|
|
10
|
+
if (fs.existsSync(distPath)) {
|
|
11
|
+
fs.emptyDirSync(distPath);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
fs.mkdir(distPath);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function compileJsToWasm(command) {
|
|
18
|
+
const config = getConfigJson();
|
|
19
|
+
const javyPath = getLibPath('javy');
|
|
20
|
+
const loading = loadingCli('compile js to wasm');
|
|
21
|
+
try {
|
|
22
|
+
loading.start();
|
|
23
|
+
createDistIfNotExist();
|
|
24
|
+
await new Promise((resolve, reject) =>
|
|
25
|
+
exec(`"${javyPath}" build './src/index.js' -o "./dist/${config.extensionName}.wasm"`, (err, stdout, stderr) => {
|
|
26
|
+
if (err) {
|
|
27
|
+
reject(err);
|
|
28
|
+
} else {
|
|
29
|
+
resolve(stdout);
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
loading.succeed('✅ WASM compile success');
|
|
34
|
+
} catch (error) {
|
|
35
|
+
loading.error('❌ compile failed:' + error.message);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
compileJsToWasm
|
|
42
|
+
};
|