shoplazza-cli 1.0.6 → 1.0.7-beta.2
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/bin/shoplazza +5 -1
- package/lib/app/api/index.js +96 -0
- package/lib/app/commands/build.js +63 -36
- package/lib/app/commands/connect.js +73 -0
- package/lib/app/commands/create.js +15 -14
- package/lib/app/commands/deploy.js +22 -14
- package/lib/app/commands/list.js +15 -11
- package/lib/app/commands/release.js +59 -0
- package/lib/app/commands/serve.js +105 -51
- package/lib/app/commands/versions.js +36 -25
- package/lib/app/index.js +11 -7
- package/lib/app/template/basic-app/README.md +19 -5
- package/lib/app/template/basic-app/extension.config.json +4 -0
- package/lib/app/template/basic-app/package.json +6 -5
- package/lib/app/template/basic-app/theme-app/assets/index.css +2 -2
- package/lib/app/template/basic-app/theme-app/assets-manifest.json +1 -0
- package/lib/app/template/basic-app/theme-app/blocks/index.liquid +6 -4
- 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 +1 -1
- package/lib/app/template/embed-app/README.md +19 -6
- package/lib/app/template/embed-app/extension.config.json +4 -0
- package/lib/app/template/embed-app/package.json +6 -5
- package/lib/app/template/embed-app/theme-app/assets-manifest.json +1 -0
- package/lib/app/template/embed-app/theme-app/blocks/index.liquid +7 -4
- package/lib/app/template/embed-app/theme-app/locales/ar-SA.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/de-DE.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/en-US.json +4 -1
- package/lib/app/template/embed-app/theme-app/locales/es-ES.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/fr-FR.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/id-ID.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/it-IT.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/ja-JP.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/ko-KR.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/nl-NL.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/pl-PL.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/pt-PT.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/ru-RU.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/th-TH.json +1 -3
- package/lib/app/template/embed-app/theme-app/locales/zh-CN.json +4 -1
- package/lib/app/template/embed-app/theme-app/locales/zh-TW.json +1 -3
- package/lib/app/template/embed-app/theme-app/snippets/index.liquid +1 -1
- package/lib/app/template/embed-app/theme-app/snippets/index_css.liquid +6 -0
- package/lib/app/utils/config.js +7 -4
- package/lib/app/utils/index.js +16 -23
- package/lib/auth/getCode.js +2 -2
- package/lib/auth/index.js +2 -2
- package/lib/check.js +26 -0
- package/lib/checkout/api.js +1 -2
- 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/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/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/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 +0 -1
- package/lib/oss.js +0 -3
- 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} +3 -3
- package/package.json +1 -1
- package/lib/app/api/api.js +0 -93
- package/lib/app/api/request.js +0 -72
- package/lib/app/template/basic-app/.ci/k8s.yaml +0 -4
- package/lib/app/template/basic-app/theme-app.config.json +0 -4
- package/lib/app/template/embed-app/.ci/k8s.yaml +0 -4
- package/lib/app/template/embed-app/theme-app/assets/index.css +0 -4
- package/lib/app/template/embed-app/theme-app.config.json +0 -4
- /package/lib/{config.js → utils/config.js} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const inquirer = require('inquirer');
|
|
2
|
+
const chalk = require('chalk');
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const loadingCli = require('loading-cli');
|
|
6
|
+
const { requestAppSecretWhenNotExist } = require('../utils');
|
|
7
|
+
const { compileJsToWasm } = require('./compile');
|
|
8
|
+
const { getConfigJson, updateConfigJson } = require('../../utils/file');
|
|
9
|
+
const partnerAPI = require('../../partner-api');
|
|
10
|
+
const { consoleError } = require('../../utils/console');
|
|
11
|
+
const FormData = require('form-data');
|
|
12
|
+
|
|
13
|
+
async function createOrUpdateFuncExtension() {
|
|
14
|
+
const config = getConfigJson();
|
|
15
|
+
const functionId = config.extensionId;
|
|
16
|
+
const formData = new FormData();
|
|
17
|
+
formData.append('namespace', 'cart-transform');
|
|
18
|
+
formData.append('name', config.extensionName);
|
|
19
|
+
formData.append('source_code', fs.readFileSync(path.resolve(process.cwd(), 'src/index.js'), { encoding: 'utf-8' }));
|
|
20
|
+
formData.append('source_code', 'hello');
|
|
21
|
+
formData.append(
|
|
22
|
+
'file',
|
|
23
|
+
fs.createReadStream(path.resolve(process.cwd(), 'dist', `${config.extensionName}.wasm`), {
|
|
24
|
+
filename: `${config.extensionName}.wasm`,
|
|
25
|
+
contentType: 'application/wasm'
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
let data;
|
|
30
|
+
if (!functionId) {
|
|
31
|
+
const loading = loadingCli('create an new function extension');
|
|
32
|
+
loading.start();
|
|
33
|
+
data = await partnerAPI
|
|
34
|
+
.createFunctionExtension(formData)
|
|
35
|
+
.then((res) => {
|
|
36
|
+
loading.succeed();
|
|
37
|
+
return res;
|
|
38
|
+
})
|
|
39
|
+
.catch((err) => {
|
|
40
|
+
loading.fail();
|
|
41
|
+
consoleError(err, err.response.data);
|
|
42
|
+
});
|
|
43
|
+
} else {
|
|
44
|
+
const loading = loadingCli('update function extension');
|
|
45
|
+
loading.start();
|
|
46
|
+
formData.append('function_id', functionId);
|
|
47
|
+
data = await partnerAPI
|
|
48
|
+
.updateFunctionExtension(functionId, formData)
|
|
49
|
+
.then((res) => {
|
|
50
|
+
loading.succeed();
|
|
51
|
+
return res;
|
|
52
|
+
})
|
|
53
|
+
.catch((err) => {
|
|
54
|
+
loading.fail();
|
|
55
|
+
consoleError(err, err.response);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
data && updateConfigJson({ extensionId: data.function_id, version: data.version });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function releaseFunctionExtension(command) {
|
|
62
|
+
await requestAppSecretWhenNotExist();
|
|
63
|
+
await compileJsToWasm();
|
|
64
|
+
await createOrUpdateFuncExtension();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = {
|
|
68
|
+
releaseFunctionExtension
|
|
69
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function makeFunctionCommand(_program) {
|
|
2
|
+
const program = _program.command('function').description('Shoplazza function cli');
|
|
3
|
+
|
|
4
|
+
program
|
|
5
|
+
.command('create')
|
|
6
|
+
.description('create a extension project')
|
|
7
|
+
.action(require('./commands/create').createFuncExtension);
|
|
8
|
+
|
|
9
|
+
program
|
|
10
|
+
.command('list')
|
|
11
|
+
.description('list all function of current app')
|
|
12
|
+
.action(require('./commands/list').listFunctionExtension);
|
|
13
|
+
|
|
14
|
+
program.command('compile').description('compile js to wasm').action(require('./commands/compile').compileJsToWasm);
|
|
15
|
+
|
|
16
|
+
program
|
|
17
|
+
.command('release')
|
|
18
|
+
.description('release a version of function extension')
|
|
19
|
+
.action(require('./commands/release').releaseFunctionExtension);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
makeFunctionCommand
|
|
24
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Checkout Extension
|
|
2
|
+
## Getting started
|
|
3
|
+
|
|
4
|
+
1. 安装依赖
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
npm i
|
|
8
|
+
```
|
|
9
|
+
2. 绑定app
|
|
10
|
+
```
|
|
11
|
+
npm run connect
|
|
12
|
+
```
|
|
13
|
+
3. release extension
|
|
14
|
+
```
|
|
15
|
+
npm run release
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hello",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"dependencies": {},
|
|
7
|
+
"devDependencies": {},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"dev": "shoplazza function dev",
|
|
10
|
+
"connect": "shoplazza function connect",
|
|
11
|
+
"release": "shoplazza function release",
|
|
12
|
+
"list": "shoplazza function list"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [],
|
|
15
|
+
"author": "",
|
|
16
|
+
"license": "ISC"
|
|
17
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const input = readInput();
|
|
2
|
+
const result = run(input);
|
|
3
|
+
writeOutput(object);
|
|
4
|
+
|
|
5
|
+
function run(input) {
|
|
6
|
+
const runResult = {
|
|
7
|
+
operations: {
|
|
8
|
+
update: []
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
input.cart.line_items.forEach((lineItem) => {
|
|
13
|
+
lineItem.product.metafields.forEach((metafield) => {
|
|
14
|
+
// key是自己定义的metafield名。如果有同名的key,可用namespace用于区分
|
|
15
|
+
if (metafield.namespace === 'custom-option' && metafield.key === 'adjust-10-price') {
|
|
16
|
+
runResult.operations.update.push({
|
|
17
|
+
id: lineItem.id,
|
|
18
|
+
price: {
|
|
19
|
+
adjustment_fixed_price: '10' // 设置定制的价格10元
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
return runResult;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function readInput() {
|
|
29
|
+
const chunkSize = 1024;
|
|
30
|
+
const inputChunks = [];
|
|
31
|
+
let totalBytes = 0;
|
|
32
|
+
// Read all the available bytes
|
|
33
|
+
while (1) {
|
|
34
|
+
const buffer = new Uint8Array(chunkSize);
|
|
35
|
+
// Stdin file descriptor
|
|
36
|
+
const fd = 0;
|
|
37
|
+
const bytesRead = Javy.IO.readSync(fd, buffer);
|
|
38
|
+
totalBytes += bytesRead;
|
|
39
|
+
if (bytesRead === 0) {
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
inputChunks.push(buffer.subarray(0, bytesRead));
|
|
43
|
+
}
|
|
44
|
+
// Assemble input into a single Uint8Array
|
|
45
|
+
const { finalBuffer } = inputChunks.reduce(
|
|
46
|
+
(context, chunk) => {
|
|
47
|
+
context.finalBuffer.set(chunk, context.bufferOffset);
|
|
48
|
+
context.bufferOffset += chunk.length;
|
|
49
|
+
return context;
|
|
50
|
+
},
|
|
51
|
+
{ bufferOffset: 0, finalBuffer: new Uint8Array(totalBytes) }
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
return JSON.parse(new TextDecoder().decode(finalBuffer));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Write output to stdout
|
|
58
|
+
function writeOutput(output) {
|
|
59
|
+
const encodedOutput = new TextEncoder().encode(JSON.stringify(output));
|
|
60
|
+
const buffer = new Uint8Array(encodedOutput);
|
|
61
|
+
// Stdout file descriptor
|
|
62
|
+
const fd = 1;
|
|
63
|
+
Javy.IO.writeSync(fd, buffer);
|
|
64
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const inquirer = require('inquirer');
|
|
2
|
+
const { getConfigJson, updateConfigJson } = require('../utils/file');
|
|
3
|
+
|
|
4
|
+
async function requestAppSecretWhenNotExist() {
|
|
5
|
+
const config = getConfigJson();
|
|
6
|
+
if (!config.appId || !config.appSecret) {
|
|
7
|
+
const { appId, appSecret } = await inquirer.prompt([
|
|
8
|
+
{
|
|
9
|
+
type: 'input',
|
|
10
|
+
name: 'appId',
|
|
11
|
+
message: 'Enter client id of app:',
|
|
12
|
+
prefix: '*'
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
type: 'input',
|
|
16
|
+
name: 'appSecret',
|
|
17
|
+
message: 'Enter client secret of app:',
|
|
18
|
+
prefix: '*'
|
|
19
|
+
}
|
|
20
|
+
]);
|
|
21
|
+
config.appId = appId;
|
|
22
|
+
config.appSecret = appSecret;
|
|
23
|
+
updateConfigJson(config);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = {
|
|
28
|
+
requestAppSecretWhenNotExist
|
|
29
|
+
};
|
package/lib/openAPI/api.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const fs = require('fs-extra');
|
|
2
2
|
const FormData = require('form-data');
|
|
3
|
-
const { getThemeFilenameTypeAndLocation } = require('../utils');
|
|
3
|
+
const { getThemeFilenameTypeAndLocation } = require('../utils/utils');
|
|
4
4
|
const openAPI = require('./index');
|
|
5
5
|
|
|
6
6
|
exports.getShopDetail = (config = {}) => {
|
package/lib/openAPI/index.js
CHANGED
|
@@ -3,7 +3,6 @@ const fs = require('fs-extra');
|
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const Sentry = require('@sentry/node');
|
|
5
5
|
const { get, set } = require('../db/user');
|
|
6
|
-
const { getThemeFilenameTypeAndLocation } = require('../utils');
|
|
7
6
|
const { postExchangeToken } = require('../auth');
|
|
8
7
|
const log = require('../log');
|
|
9
8
|
|
package/lib/oss.js
CHANGED
|
@@ -3,7 +3,6 @@ const fs = require('fs');
|
|
|
3
3
|
const path = require('path');
|
|
4
4
|
const FormData = require('form-data');
|
|
5
5
|
const chalk = require('chalk');
|
|
6
|
-
const loading = require('loading-cli');
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* 获取OSS上传功能,适用于上传文件到店铺的OSS服务器
|
|
@@ -67,7 +66,6 @@ function useOss(accessToken, storeDomain, storeDomainTips) {
|
|
|
67
66
|
* console.log(ossUrl); // 输出文件的 OSS 地址
|
|
68
67
|
*/
|
|
69
68
|
async function uploadOss(filePath) {
|
|
70
|
-
console.log(chalk.green('正在上传文件到OSS...',filePath));
|
|
71
69
|
let fileName = path.basename(filePath);
|
|
72
70
|
const key = 'chick-extension/' + fileName;
|
|
73
71
|
const form = new FormData();
|
|
@@ -90,7 +88,6 @@ function useOss(accessToken, storeDomain, storeDomainTips) {
|
|
|
90
88
|
});
|
|
91
89
|
return `${data.read_host}${data.read_host.endsWith('/') ? '' : '/'}${key}`;
|
|
92
90
|
});
|
|
93
|
-
loading('succeed upload').succeed();
|
|
94
91
|
return url;
|
|
95
92
|
}
|
|
96
93
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
const { isDevDebug, isStgDebug } = require('../utils/env');
|
|
3
|
+
const { consoleError } = require('../utils/console');
|
|
4
|
+
const { updateConfigJson, getConfigJson } = require('../utils/file');
|
|
5
|
+
|
|
6
|
+
const baseUrl = `https://partners.${isDevDebug() ? 'dev.' : isStgDebug() ? 'stg.' : ''}shoplazza.com`;
|
|
7
|
+
|
|
8
|
+
const instance = axios.create({
|
|
9
|
+
baseURL: baseUrl + '/openapi/2024-07'
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
instance.interceptors.request.use(
|
|
13
|
+
async (config) => {
|
|
14
|
+
const extConfig = getConfigJson();
|
|
15
|
+
let token = extConfig.accessToken;
|
|
16
|
+
if (!token) {
|
|
17
|
+
token = await refreshAccessToken();
|
|
18
|
+
}
|
|
19
|
+
config.headers['Access-Token'] = token;
|
|
20
|
+
config.headers['app-client-id'] = extConfig.appId;
|
|
21
|
+
return config;
|
|
22
|
+
},
|
|
23
|
+
(error) => {
|
|
24
|
+
consoleError(`[REQUEST ERROR] ${error.message}`);
|
|
25
|
+
return Promise.reject(error);
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
instance.interceptors.response.use(
|
|
30
|
+
function (response) {
|
|
31
|
+
return response;
|
|
32
|
+
},
|
|
33
|
+
async function (error) {
|
|
34
|
+
const { config, response } = error || {};
|
|
35
|
+
if (response?.status === 403 && !config._retry) {
|
|
36
|
+
config._retry = true;
|
|
37
|
+
await refreshAccessToken();
|
|
38
|
+
return instance(config);
|
|
39
|
+
}
|
|
40
|
+
error.response &&
|
|
41
|
+
consoleError(
|
|
42
|
+
`[RESPONSE ERROR] ${error.response.status} ${error.response.config.baseURL}${error.response.config.url}`
|
|
43
|
+
);
|
|
44
|
+
return Promise.reject(error);
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
function refreshAccessToken() {
|
|
49
|
+
const extensionConfig = getConfigJson();
|
|
50
|
+
if (!extensionConfig.appId || !extensionConfig.appSecret) {
|
|
51
|
+
consoleError(`must provide 'appId' and 'appSecret' in extension.config.json `);
|
|
52
|
+
process.exit(-1);
|
|
53
|
+
}
|
|
54
|
+
return axios
|
|
55
|
+
.post(baseUrl + '/partner/oauth/token', {
|
|
56
|
+
client_id: extensionConfig.appId,
|
|
57
|
+
client_secret: extensionConfig.appSecret,
|
|
58
|
+
grant_type: 'client_credentials'
|
|
59
|
+
})
|
|
60
|
+
.then((res) => {
|
|
61
|
+
const token = res.data.access_token;
|
|
62
|
+
updateConfigJson({ accessToken: token });
|
|
63
|
+
return token;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = instance;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const axios = require('./axios');
|
|
2
|
+
// const Aaxios = require('axios');
|
|
3
|
+
|
|
4
|
+
// const axios = Aaxios.create({
|
|
5
|
+
// baseURL: 'http://igw-traefik.internal.svc.cluster.local/service/functions-api/api/partner-openapi/2025-03',
|
|
6
|
+
// headers: {
|
|
7
|
+
// 'x-rf': 'feature-ymq',
|
|
8
|
+
// 'app-client-id': '123123'
|
|
9
|
+
// }
|
|
10
|
+
// });
|
|
11
|
+
|
|
12
|
+
function createFunctionExtension(form) {
|
|
13
|
+
return axios
|
|
14
|
+
.post('/functions', form, {
|
|
15
|
+
headers: {
|
|
16
|
+
...form.getHeaders()
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
.then((res) => res.data?.data);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function updateFunctionExtension(functionId, form) {
|
|
23
|
+
return axios
|
|
24
|
+
.patch(`/functions/${functionId}`, form, {
|
|
25
|
+
headers: {
|
|
26
|
+
...form.getHeaders()
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
.then((res) => res.data?.data);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getFunctionList(params = { page: 1, limit: 1000 }) {
|
|
33
|
+
return axios
|
|
34
|
+
.get(
|
|
35
|
+
'/functions',
|
|
36
|
+
{ params },
|
|
37
|
+
{
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/ x-www-form-urlencoded',
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
.then((res) => res.data?.data);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 连接App
|
|
48
|
+
*/
|
|
49
|
+
async function toConnectApp(data) {
|
|
50
|
+
return axios.post(
|
|
51
|
+
'/theme-extensions/connection',
|
|
52
|
+
{
|
|
53
|
+
extension_id: data.extensionId,
|
|
54
|
+
type: data.type || 'link'
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 应用主题插件到App
|
|
61
|
+
*/
|
|
62
|
+
async function toReleaseApp(data) {
|
|
63
|
+
return axios.post(
|
|
64
|
+
'/theme-extensions/publications',
|
|
65
|
+
{
|
|
66
|
+
extension_id: data.extensionId,
|
|
67
|
+
version_id: data.versionId,
|
|
68
|
+
type: data.type || 'enable'
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = {
|
|
74
|
+
createFunctionExtension,
|
|
75
|
+
updateFunctionExtension,
|
|
76
|
+
getFunctionList,
|
|
77
|
+
toConnectApp,
|
|
78
|
+
toReleaseApp
|
|
79
|
+
};
|
|
@@ -6,9 +6,10 @@ function isDebug() {
|
|
|
6
6
|
|
|
7
7
|
function consoleError(...args) {
|
|
8
8
|
if (isDebug()) {
|
|
9
|
-
console.trace(args);
|
|
9
|
+
console.trace(colors.red(args));
|
|
10
|
+
} else {
|
|
11
|
+
console.log(colors.red(args.join(' ')));
|
|
10
12
|
}
|
|
11
|
-
console.log(colors.red(args.join(' ')));
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
function consoleBlue(...args) {
|
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
|
+
};
|
|
@@ -124,7 +124,7 @@ exports.getSSOAuthUrl = (store) => {
|
|
|
124
124
|
* @param {any} [options.xxx] - 其他chokidar.watch配置项
|
|
125
125
|
* @returns {Function} - 取消监听的函数
|
|
126
126
|
*/
|
|
127
|
-
exports.
|
|
127
|
+
exports.watchWorkspace = (workspace, options = {}) => {
|
|
128
128
|
if (!fsExtra.pathExistsSync(workspace)) {
|
|
129
129
|
console.error(chalk.red(`[ERROR] "${workspace}" does not exist.`));
|
|
130
130
|
return;
|
|
@@ -143,12 +143,12 @@ exports.initWatcher = (workspace, options = {}) => {
|
|
|
143
143
|
});
|
|
144
144
|
|
|
145
145
|
watcher.on('change', (filePath) => {
|
|
146
|
-
console.log(chalk.
|
|
146
|
+
console.log(chalk.cyan(`[CHANGE] ${filePath}`));
|
|
147
147
|
onChange(filePath);
|
|
148
148
|
});
|
|
149
149
|
|
|
150
150
|
watcher.on('unlink', (filePath) => {
|
|
151
|
-
console.log(chalk.
|
|
151
|
+
console.log(chalk.cyan(`[DELETE] ${filePath}`));
|
|
152
152
|
onDelete(filePath);
|
|
153
153
|
});
|
|
154
154
|
|
package/package.json
CHANGED
package/lib/app/api/api.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
const { get, post, put, del, patch } = require('./request');
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 获取主题列表
|
|
5
|
-
*/
|
|
6
|
-
async function getThemeList() {
|
|
7
|
-
return get('/themes');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* 获取店铺私有主题插件列表
|
|
12
|
-
* @returns
|
|
13
|
-
*/
|
|
14
|
-
async function getThemeAppList() {
|
|
15
|
-
return [
|
|
16
|
-
{
|
|
17
|
-
name: '主题插件1',
|
|
18
|
-
version: '1.0.0',
|
|
19
|
-
description: '主题插件1的描述'
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
name: '主题插件2',
|
|
23
|
-
version: '2.0.0',
|
|
24
|
-
description: '主题插件2的描述'
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: '主题插件3',
|
|
28
|
-
version: '3.0.0',
|
|
29
|
-
description: '主题插件3的描述'
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
// return get('/theme-extensions');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* 创建主题插件
|
|
37
|
-
*/
|
|
38
|
-
async function toCreateThemeApp(data) {
|
|
39
|
-
return put('/theme-extensions', data);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* 上传主题插件
|
|
44
|
-
*/
|
|
45
|
-
async function toUploadThemeApp(data) {
|
|
46
|
-
return patch(`theme-extensions/${data.appId}/dev-doctree`, data);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* 获取任务状态
|
|
51
|
-
*/
|
|
52
|
-
async function getTaskStatus(data) {
|
|
53
|
-
return get(`/theme-extensions/version-tasks/${data.taskId}`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* 获取主题插件版本列表
|
|
58
|
-
*/
|
|
59
|
-
async function getThemeAppVersionList(data) {
|
|
60
|
-
return [
|
|
61
|
-
{ version: '1.0.0', date: '2023-01-01', description: 'Initial release' },
|
|
62
|
-
{ version: '1.1.0', date: '2023-02-01', description: 'Added new features and bug fixes' },
|
|
63
|
-
{ version: '1.2.0', date: '2023-03-01', description: 'Fixed bugs and improved performance' },
|
|
64
|
-
{ version: '1.3.0', date: '2023-04-01', description: 'Optimized performance and added new features' },
|
|
65
|
-
{ version: '1.4.0', date: '2023-05-01', description: 'Fixed bugs and improved user experience' }
|
|
66
|
-
];
|
|
67
|
-
// return get(`/theme-extensions/:${data.appId}/versions`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 创建主题插件版本
|
|
72
|
-
*/
|
|
73
|
-
async function toCreateThemeAppVersion(data) {
|
|
74
|
-
return post(`/theme-extensions/version-tasks`, data);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* 部署主题插件
|
|
79
|
-
*/
|
|
80
|
-
async function toDeployThemeApp(data) {
|
|
81
|
-
return post(`theme-extensions/publications`, data);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
module.exports = {
|
|
85
|
-
getThemeList,
|
|
86
|
-
getThemeAppList,
|
|
87
|
-
toCreateThemeApp,
|
|
88
|
-
toUploadThemeApp,
|
|
89
|
-
getThemeAppVersionList,
|
|
90
|
-
toCreateThemeAppVersion,
|
|
91
|
-
toDeployThemeApp,
|
|
92
|
-
getTaskStatus
|
|
93
|
-
};
|