shoplazza-cli 1.0.7-beta.1 → 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 +2 -2
- package/lib/app/commands/build.js +4 -4
- package/lib/app/commands/connect.js +73 -0
- package/lib/app/commands/create.js +1 -1
- package/lib/app/commands/deploy.js +4 -3
- package/lib/app/commands/release.js +59 -0
- package/lib/app/commands/serve.js +12 -11
- package/lib/app/commands/versions.js +10 -7
- package/lib/app/index.js +3 -0
- package/lib/app/template/basic-app/theme-app/blocks/index.liquid +3 -3
- 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/theme-app/blocks/index.liquid +4 -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/utils/config.js +3 -3
- package/lib/app/utils/index.js +8 -8
- 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/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} +2 -2
- package/package.json +1 -1
- /package/lib/app/template/basic-app/{theme-extension.config.json → extension.config.json} +0 -0
- /package/lib/app/template/embed-app/{theme-extension.config.json → extension.config.json} +0 -0
- /package/lib/{config.js → utils/config.js} +0 -0
package/lib/app/utils/index.js
CHANGED
|
@@ -42,10 +42,10 @@ const renameFile = async (filePath, targetName) => {
|
|
|
42
42
|
* 获取themeApp配置(信息)
|
|
43
43
|
* @returns {Promise<string>}
|
|
44
44
|
*/
|
|
45
|
-
async function
|
|
45
|
+
async function getThemeExtensionConfig() {
|
|
46
46
|
if (!fsExtra.pathExistsSync(THEME_APP_CONFIG_PATH)) {
|
|
47
47
|
throw new Error(
|
|
48
|
-
`The current workspace is not a valid theme extension project, because "${WORKSPACE_PATH}" is missing the required "
|
|
48
|
+
`The current workspace is not a valid theme extension project, because "${WORKSPACE_PATH}" is missing the required "extension.config.json" file.`
|
|
49
49
|
);
|
|
50
50
|
}
|
|
51
51
|
return fsExtra.readJson(THEME_APP_CONFIG_PATH);
|
|
@@ -55,10 +55,10 @@ async function getThemeAppConfig() {
|
|
|
55
55
|
* 更新themeApp配置(信息)
|
|
56
56
|
* @param {Object} config 待更新的配置信息
|
|
57
57
|
*/
|
|
58
|
-
async function
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
await fsExtra.writeJson(THEME_APP_CONFIG_PATH,
|
|
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
62
|
}
|
|
63
63
|
|
|
64
64
|
/**
|
|
@@ -204,8 +204,8 @@ function renderTable(data, options) {
|
|
|
204
204
|
module.exports = {
|
|
205
205
|
replacePlaceholders,
|
|
206
206
|
renameFile,
|
|
207
|
-
|
|
208
|
-
|
|
207
|
+
getThemeExtensionConfig,
|
|
208
|
+
setThemeExtensionConfig,
|
|
209
209
|
compress,
|
|
210
210
|
compareVersions,
|
|
211
211
|
getFileInfo,
|
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,26 @@
|
|
|
1
|
+
const supportVersion = ['v20.9.0', 'v20.18.0'];
|
|
2
|
+
|
|
3
|
+
// 解析当前版本号
|
|
4
|
+
function parseVersion(versionStr) {
|
|
5
|
+
return versionStr.slice(1).split('.').slice(0, 3).map(Number);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function checkNodeVersion() {
|
|
9
|
+
const currentVersion = parseVersion(process.version);
|
|
10
|
+
// 检查当前版本是否在支持范围内
|
|
11
|
+
const isSupported = supportVersion
|
|
12
|
+
.map(parseVersion)
|
|
13
|
+
.some(
|
|
14
|
+
(version) =>
|
|
15
|
+
version[0] === currentVersion[0] && version[1] === currentVersion[1] && version[2] === currentVersion[2]
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
if (!isSupported) {
|
|
19
|
+
console.error(
|
|
20
|
+
`❌ the version of current Node.js is ${process.version},advise select the support version:`,
|
|
21
|
+
supportVersion.join(',')
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
checkNodeVersion();
|
package/lib/checkout/api.js
CHANGED
|
@@ -4,10 +4,9 @@ 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 { consoleWarn } = require('./console');
|
|
11
10
|
const { useOss } = require('../oss');
|
|
12
11
|
|
|
13
12
|
const FILE_SIGN_URL = '/checkout_extensions/file/sign';
|
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/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
|
@@ -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);
|
package/lib/common/login.js
CHANGED
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const { consoleError, consoleSuccess } = require('../../utils/console');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const inquirer = require('inquirer');
|
|
5
|
+
const { copy } = require('../../utils/file');
|
|
6
|
+
|
|
7
|
+
const cwd = process.cwd();
|
|
8
|
+
|
|
9
|
+
const templateDir = path.resolve(__dirname, '../template');
|
|
10
|
+
|
|
11
|
+
const renameFiles = {
|
|
12
|
+
_gitignore: '.gitignore'
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 使用cli创建一个项目
|
|
17
|
+
* @param {} command 项目名
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
async function createFuncExtension(command) {
|
|
21
|
+
const { language, extensionName } = await inquirer.prompt([
|
|
22
|
+
{
|
|
23
|
+
type: 'input',
|
|
24
|
+
name: 'extensionName',
|
|
25
|
+
message: 'Enter the extension name:',
|
|
26
|
+
prefix: '*'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'list',
|
|
30
|
+
name: 'language',
|
|
31
|
+
message: 'Select a language:',
|
|
32
|
+
choices: [
|
|
33
|
+
{
|
|
34
|
+
name: 'javascript',
|
|
35
|
+
value: 'js'
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
prefix: '*'
|
|
39
|
+
}
|
|
40
|
+
]);
|
|
41
|
+
const projectDir = extensionName.replace(/\/+$/g, '');
|
|
42
|
+
const fullTempDir = path.join(templateDir, language);
|
|
43
|
+
const root = path.join(cwd, projectDir);
|
|
44
|
+
if (fs.existsSync(root)) {
|
|
45
|
+
consoleError(`the directory '${projectDir}' is exist.`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
fs.mkdirSync(root, { recursive: true });
|
|
49
|
+
|
|
50
|
+
const write = (file, content) => {
|
|
51
|
+
const targetPath = path.join(root, renameFiles[file] ?? file);
|
|
52
|
+
if (content) {
|
|
53
|
+
fs.writeFileSync(targetPath, content);
|
|
54
|
+
} else {
|
|
55
|
+
copy(path.join(fullTempDir, file), targetPath);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const files = fs.readdirSync(fullTempDir);
|
|
60
|
+
for (const file of files.filter((f) => !['package.json'].includes(f))) {
|
|
61
|
+
write(file);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(fullTempDir, `package.json`), 'utf-8'));
|
|
65
|
+
pkg.name = projectDir;
|
|
66
|
+
write('package.json', JSON.stringify(pkg, null, 2) + '\n');
|
|
67
|
+
|
|
68
|
+
const config = JSON.parse(fs.readFileSync(path.join(fullTempDir, `extension.config.json`), 'utf-8'));
|
|
69
|
+
config.extensionName = extensionName;
|
|
70
|
+
write('extension.config.json', JSON.stringify(config, null, 2) + '\n');
|
|
71
|
+
|
|
72
|
+
consoleSuccess(`Successfully created extension project '${extensionName}'.`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = {
|
|
76
|
+
createFuncExtension
|
|
77
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const partnerAPI = require('../../partner-api');
|
|
2
|
+
const { requestAppSecretWhenNotExist } = require('../utils');
|
|
3
|
+
|
|
4
|
+
async function getFunctions() {
|
|
5
|
+
const data = await partnerAPI.getFunctionList();
|
|
6
|
+
return data.functions;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async function listFunctionExtension() {
|
|
10
|
+
await requestAppSecretWhenNotExist();
|
|
11
|
+
const list = await getFunctions();
|
|
12
|
+
console.log(list.map(({ source_code, ...other }) => other));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module.exports = {
|
|
16
|
+
getFunctions,
|
|
17
|
+
listFunctionExtension
|
|
18
|
+
};
|
|
@@ -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
|
+
}
|