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.
Files changed (116) hide show
  1. package/bin/shoplazza +5 -1
  2. package/lib/app/api/index.js +96 -0
  3. package/lib/app/commands/build.js +63 -36
  4. package/lib/app/commands/connect.js +73 -0
  5. package/lib/app/commands/create.js +15 -14
  6. package/lib/app/commands/deploy.js +22 -14
  7. package/lib/app/commands/list.js +15 -11
  8. package/lib/app/commands/release.js +59 -0
  9. package/lib/app/commands/serve.js +105 -51
  10. package/lib/app/commands/versions.js +36 -25
  11. package/lib/app/index.js +11 -7
  12. package/lib/app/template/basic-app/README.md +19 -5
  13. package/lib/app/template/basic-app/extension.config.json +4 -0
  14. package/lib/app/template/basic-app/package.json +6 -5
  15. package/lib/app/template/basic-app/theme-app/assets/index.css +2 -2
  16. package/lib/app/template/basic-app/theme-app/assets-manifest.json +1 -0
  17. package/lib/app/template/basic-app/theme-app/blocks/index.liquid +6 -4
  18. package/lib/app/template/basic-app/theme-app/locales/ar-SA.json +1 -0
  19. package/lib/app/template/basic-app/theme-app/locales/de-DE.json +1 -0
  20. package/lib/app/template/basic-app/theme-app/locales/en-US.json +6 -0
  21. package/lib/app/template/basic-app/theme-app/locales/es-ES.json +1 -0
  22. package/lib/app/template/basic-app/theme-app/locales/fr-FR.json +1 -0
  23. package/lib/app/template/basic-app/theme-app/locales/id-ID.json +1 -0
  24. package/lib/app/template/basic-app/theme-app/locales/it-IT.json +1 -0
  25. package/lib/app/template/basic-app/theme-app/locales/ja-JP.json +1 -0
  26. package/lib/app/template/basic-app/theme-app/locales/ko-KR.json +1 -0
  27. package/lib/app/template/basic-app/theme-app/locales/nl-NL.json +1 -0
  28. package/lib/app/template/basic-app/theme-app/locales/pl-PL.json +1 -0
  29. package/lib/app/template/basic-app/theme-app/locales/pt-PT.json +1 -0
  30. package/lib/app/template/basic-app/theme-app/locales/ru-RU.json +1 -0
  31. package/lib/app/template/basic-app/theme-app/locales/th-TH.json +1 -0
  32. package/lib/app/template/basic-app/theme-app/locales/zh-CN.json +6 -0
  33. package/lib/app/template/basic-app/theme-app/locales/zh-TW.json +1 -0
  34. package/lib/app/template/basic-app/theme-app/snippets/index.liquid +1 -1
  35. package/lib/app/template/embed-app/README.md +19 -6
  36. package/lib/app/template/embed-app/extension.config.json +4 -0
  37. package/lib/app/template/embed-app/package.json +6 -5
  38. package/lib/app/template/embed-app/theme-app/assets-manifest.json +1 -0
  39. package/lib/app/template/embed-app/theme-app/blocks/index.liquid +7 -4
  40. package/lib/app/template/embed-app/theme-app/locales/ar-SA.json +1 -3
  41. package/lib/app/template/embed-app/theme-app/locales/de-DE.json +1 -3
  42. package/lib/app/template/embed-app/theme-app/locales/en-US.json +4 -1
  43. package/lib/app/template/embed-app/theme-app/locales/es-ES.json +1 -3
  44. package/lib/app/template/embed-app/theme-app/locales/fr-FR.json +1 -3
  45. package/lib/app/template/embed-app/theme-app/locales/id-ID.json +1 -3
  46. package/lib/app/template/embed-app/theme-app/locales/it-IT.json +1 -3
  47. package/lib/app/template/embed-app/theme-app/locales/ja-JP.json +1 -3
  48. package/lib/app/template/embed-app/theme-app/locales/ko-KR.json +1 -3
  49. package/lib/app/template/embed-app/theme-app/locales/nl-NL.json +1 -3
  50. package/lib/app/template/embed-app/theme-app/locales/pl-PL.json +1 -3
  51. package/lib/app/template/embed-app/theme-app/locales/pt-PT.json +1 -3
  52. package/lib/app/template/embed-app/theme-app/locales/ru-RU.json +1 -3
  53. package/lib/app/template/embed-app/theme-app/locales/th-TH.json +1 -3
  54. package/lib/app/template/embed-app/theme-app/locales/zh-CN.json +4 -1
  55. package/lib/app/template/embed-app/theme-app/locales/zh-TW.json +1 -3
  56. package/lib/app/template/embed-app/theme-app/snippets/index.liquid +1 -1
  57. package/lib/app/template/embed-app/theme-app/snippets/index_css.liquid +6 -0
  58. package/lib/app/utils/config.js +7 -4
  59. package/lib/app/utils/index.js +16 -23
  60. package/lib/auth/getCode.js +2 -2
  61. package/lib/auth/index.js +2 -2
  62. package/lib/check.js +26 -0
  63. package/lib/checkout/api.js +1 -2
  64. package/lib/checkout/build.js +1 -1
  65. package/lib/checkout/create.js +1 -1
  66. package/lib/checkout/deploy.js +1 -1
  67. package/lib/checkout/dev/index.js +1 -1
  68. package/lib/checkout/fields.js +1 -1
  69. package/lib/checkout/preview.js +1 -1
  70. package/lib/checkout/push.js +1 -1
  71. package/lib/checkout/undeploy.js +1 -1
  72. package/lib/checkout/util.js +1 -1
  73. package/lib/checkout/verify.js +1 -1
  74. package/lib/commands/theme/delete.js +1 -1
  75. package/lib/commands/theme/package.js +1 -1
  76. package/lib/commands/theme/publish.js +1 -1
  77. package/lib/commands/theme/pull.js +1 -1
  78. package/lib/commands/theme/push.js +1 -1
  79. package/lib/commands/theme/serve.js +2 -2
  80. package/lib/common/login.js +1 -1
  81. package/lib/function/bin/index.js +20 -0
  82. package/lib/function/bin/javy/javy-arm-linux-v5.0.1 +0 -0
  83. package/lib/function/bin/javy/javy-arm-macos-v5.0.1 +0 -0
  84. package/lib/function/bin/javy/javy-x86_64-linux-v5.0.1 +0 -0
  85. package/lib/function/bin/javy/javy-x86_64-macos-v5.0.1 +0 -0
  86. package/lib/function/bin/javy/javy-x86_64-windows-v5.0.1 +0 -0
  87. package/lib/function/commands/compile.js +42 -0
  88. package/lib/function/commands/create.js +77 -0
  89. package/lib/function/commands/list.js +18 -0
  90. package/lib/function/commands/release.js +69 -0
  91. package/lib/function/index.js +24 -0
  92. package/lib/function/template/js/README.md +37 -0
  93. package/lib/function/template/js/_gitignore +4 -0
  94. package/lib/function/template/js/extension.config.json +5 -0
  95. package/lib/function/template/js/package.json +17 -0
  96. package/lib/function/template/js/src/index.js +64 -0
  97. package/lib/function/utils.js +29 -0
  98. package/lib/openAPI/api.js +1 -1
  99. package/lib/openAPI/index.js +0 -1
  100. package/lib/oss.js +0 -3
  101. package/lib/partner-api/axios.js +67 -0
  102. package/lib/partner-api/index.js +79 -0
  103. package/lib/{checkout → utils}/console.js +3 -2
  104. package/lib/utils/env.js +17 -0
  105. package/lib/utils/file.js +48 -0
  106. package/lib/utils/platform.js +37 -0
  107. package/lib/{utils.js → utils/utils.js} +3 -3
  108. package/package.json +1 -1
  109. package/lib/app/api/api.js +0 -93
  110. package/lib/app/api/request.js +0 -72
  111. package/lib/app/template/basic-app/.ci/k8s.yaml +0 -4
  112. package/lib/app/template/basic-app/theme-app.config.json +0 -4
  113. package/lib/app/template/embed-app/.ci/k8s.yaml +0 -4
  114. package/lib/app/template/embed-app/theme-app/assets/index.css +0 -4
  115. package/lib/app/template/embed-app/theme-app.config.json +0 -4
  116. /package/lib/{config.js → utils/config.js} +0 -0
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,3 +1,6 @@
1
1
  {
2
- "general": {}
2
+ "initial": {
3
+ "title": "SHOPLAZZA 主题插件",
4
+ "sub_title": "EMBED 类型"
5
+ }
3
6
  }
@@ -1,3 +1 @@
1
- {
2
- "general": {}
3
- }
1
+ {}
@@ -1,5 +1,5 @@
1
1
  <div>
2
- Shoplazza theme APP
2
+ <h3>{{ 'i18n.initial.sub_title' | t }}</h3>
3
3
  </div>
4
4
 
5
5
 
@@ -0,0 +1,6 @@
1
+ <style>
2
+ .container {
3
+ color: #da534d;
4
+ text-align: center;
5
+ }
6
+ </style>
@@ -3,7 +3,9 @@ const { get } = require('../../db/user');
3
3
 
4
4
  const WORKSPACE_PATH = process.cwd();
5
5
 
6
- const THEME_APP_PATH = path.resolve(WORKSPACE_PATH, 'theme-app');
6
+ const THEME_APP_DIR_PATH = path.resolve(WORKSPACE_PATH, 'theme-app');
7
+
8
+ const THEME_APP_CONFIG_PATH = path.resolve(WORKSPACE_PATH, 'extension.config.json')
7
9
 
8
10
  const STORE_DOMAIN = get('store_domain');
9
11
 
@@ -11,18 +13,19 @@ const EXCHANGE_TOKEN = get('exchange_token');
11
13
 
12
14
  const THEME_APP_TYPE = {
13
15
  BASIC_APP: {
14
- description: 'basic app(just an basic app)',
16
+ description: 'Basic Extension(a card storekeeper decide where it add)',
15
17
  templatePath: path.resolve(__dirname, '../template/basic-app')
16
18
  },
17
19
  EMBEDS_APP: {
18
- description: 'embed app(embed in a theme)',
20
+ description: 'Embed Extension(a card not need add)',
19
21
  templatePath: path.resolve(__dirname, '../template/embed-app')
20
22
  }
21
23
  };
22
24
 
23
25
  module.exports = {
24
26
  WORKSPACE_PATH,
25
- THEME_APP_PATH,
27
+ THEME_APP_DIR_PATH,
28
+ THEME_APP_CONFIG_PATH,
26
29
  STORE_DOMAIN,
27
30
  EXCHANGE_TOKEN,
28
31
  THEME_APP_TYPE,
@@ -4,13 +4,13 @@ const chalk = require('chalk');
4
4
  const AdmZip = require('adm-zip');
5
5
  const md5 = require('md5');
6
6
  const { table } = require('table');
7
- const { WORKSPACE_PATH } = require('./config');
7
+ const { WORKSPACE_PATH, THEME_APP_CONFIG_PATH } = require('./config');
8
8
 
9
9
  /**
10
10
  * 通用的占位符替换函数
11
11
  */
12
12
  const replacePlaceholders = async (filePath, replacements) => {
13
- if (!(await fsExtra.pathExists(filePath))) {
13
+ if (!fsExtra.pathExistsSync(filePath)) {
14
14
  console.warn(`File "${filePath}" does not exist, skipping replacement.`);
15
15
  return;
16
16
  }
@@ -30,7 +30,7 @@ const replacePlaceholders = async (filePath, replacements) => {
30
30
  * @param {string} targetName - 新的文件名
31
31
  */
32
32
  const renameFile = async (filePath, targetName) => {
33
- if (!(await fsExtra.pathExists(filePath))) {
33
+ if (!fsExtra.pathExistsSync(filePath)) {
34
34
  console.warn(`File "${filePath}" does not exist, skipping.`);
35
35
  return;
36
36
  }
@@ -42,24 +42,23 @@ const renameFile = async (filePath, targetName) => {
42
42
  * 获取themeApp配置(信息)
43
43
  * @returns {Promise<string>}
44
44
  */
45
- async function getThemeAppConfig() {
46
- const configFilePath = path.join(WORKSPACE_PATH, 'theme-app.config.json');
47
- if (!(await fsExtra.pathExists(configFilePath))) {
45
+ async function getThemeExtensionConfig() {
46
+ if (!fsExtra.pathExistsSync(THEME_APP_CONFIG_PATH)) {
48
47
  throw new Error(
49
- `The current workspace is not a valid theme app project, because "${WORKSPACE_PATH}" is missing the required "theme-app.config.json" file.`
48
+ `The current workspace is not a valid theme extension project, because "${WORKSPACE_PATH}" is missing the required "extension.config.json" file.`
50
49
  );
51
50
  }
52
- return fsExtra.readJson(configFilePath);
51
+ return fsExtra.readJson(THEME_APP_CONFIG_PATH);
53
52
  }
54
53
 
55
54
  /**
56
55
  * 更新themeApp配置(信息)
57
56
  * @param {Object} config 待更新的配置信息
58
57
  */
59
- async function setThemeAppConfig(config) {
60
- const oldThemeAppConfig = await getThemeAppConfig();
61
- const newThemeAppConfig = { ...oldThemeAppConfig, ...config };
62
- await fsExtra.writeJson(configFilePath, newThemeAppConfig, { spaces: 2 });
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 });
63
62
  }
64
63
 
65
64
  /**
@@ -68,7 +67,7 @@ async function setThemeAppConfig(config) {
68
67
  * @returns {Promise<string>} 返回基于文件夹内容的哈希值
69
68
  */
70
69
  async function calculateFolderHash(dirPath) {
71
- if (!(await fsExtra.pathExists(dirPath))) {
70
+ if (!fsExtra.pathExistsSync(dirPath)) {
72
71
  throw new Error(chalk.red(`Calculate folder hash path does not exist: ${dirPath}`));
73
72
  }
74
73
  const files = await fsExtra.readdir(dirPath);
@@ -96,7 +95,7 @@ async function calculateFolderHash(dirPath) {
96
95
  * @returns {Promise<Object>} 返回压缩文件的生成路径&压碎文件名
97
96
  */
98
97
  async function compress(sourcePath) {
99
- if (!(await fsExtra.pathExists(sourcePath))) {
98
+ if (!fsExtra.pathExistsSync(sourcePath)) {
100
99
  throw new Error(chalk.red(`Compress path does not exist: ${sourcePath}`));
101
100
  }
102
101
  const sourceName = path.basename(sourcePath);
@@ -117,7 +116,6 @@ async function compress(sourcePath) {
117
116
  if (err) {
118
117
  reject(err);
119
118
  } else {
120
- console.log(chalk.green(`Source path compressed successfully. File saved at: ${outputPath}`));
121
119
  resolve({
122
120
  zipPath: outputPath,
123
121
  zipName: fileName
@@ -156,10 +154,7 @@ function compareVersions(version1, version2) {
156
154
  * @param {string} filePath - 文件的绝对路径
157
155
  * @returns {{ fileName: string, parentDirName: string }} 返回包含文件名和父目录名的对象
158
156
  */
159
- async function getFileInfo(filePath) {
160
- if (!(await fsExtra.pathExists(filePath))) {
161
- throw new Error(chalk.red(`File path does not exist: ${filePath}`));
162
- }
157
+ function getFileInfo(filePath) {
163
158
  const fileName = path.basename(filePath);
164
159
  const parentDirName = path.basename(path.dirname(filePath));
165
160
  return { fileName, parentDirName };
@@ -206,13 +201,11 @@ function renderTable(data, options) {
206
201
  });
207
202
  }
208
203
 
209
-
210
-
211
204
  module.exports = {
212
205
  replacePlaceholders,
213
206
  renameFile,
214
- getThemeAppConfig,
215
- setThemeAppConfig,
207
+ getThemeExtensionConfig,
208
+ setThemeExtensionConfig,
216
209
  compress,
217
210
  compareVersions,
218
211
  getFileInfo,
@@ -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();
@@ -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('./console');
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';
@@ -1,4 +1,4 @@
1
- const { consoleError, consoleBlue } = require('./console');
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');
@@ -1,4 +1,4 @@
1
- const { consoleError, consoleSuccess } = require('./console');
1
+ const { consoleError, consoleSuccess } = require('../utils/console');
2
2
  const path = require('path');
3
3
  const fs = require('fs');
4
4
  const inquirer = require('inquirer');
@@ -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('./console');
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('../console');
15
+ const { consoleError, consoleBlue, consoleSuccess } = require('../../utils/console');
16
16
 
17
17
  async function buildExtension(id) {
18
18
  return viteBuild({ id })
@@ -1,5 +1,5 @@
1
1
  const api = require('./api');
2
- const { consoleError } = require('./console');
2
+ const { consoleError } = require('../utils/console');
3
3
  const { verifyConfig } = require('./verify');
4
4
  const { getExtensionInfo, getExtensionConfig } = require('./util');
5
5
 
@@ -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('./console');
5
+ const { consoleSuccess, consoleError } = require('../utils/console');
6
6
 
7
7
  module.exports = async () => {
8
8
  try {
@@ -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('./console');
15
+ const { consoleBlue, consoleSuccess, consoleError, consoleWarn } = require('../utils/console');
16
16
  const { viteBuild } = require('./build');
17
17
  const { verifyConfig } = require('./verify');
18
18
 
@@ -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('./console');
5
+ const { consoleSuccess, consoleBlue, consoleError } = require('../utils/console');
6
6
 
7
7
  module.exports = async () => {
8
8
  try {
@@ -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('./console');
5
+ const { consoleError, consoleBlue } = require('../utils/console');
6
6
  const inquirer = require('inquirer');
7
7
 
8
8
  const walkSync = (currentDirPath, callback) => {
@@ -1,5 +1,5 @@
1
1
  const api = require('./api');
2
- const { consoleError } = require('./console');
2
+ const { consoleError } = require('../utils/console');
3
3
  const { getProjectConfig } = require('./util');
4
4
 
5
5
  async function verifyConfig(commands) {
@@ -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
+ };
@@ -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
+ };