@abtnode/core 1.16.28-beta-8acda0e6 → 1.16.28-beta-6917161a

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.
@@ -95,9 +95,11 @@ const installComponentFromUrl = async ({
95
95
  const { dynamicComponents } = await parseComponents(newChild);
96
96
 
97
97
  const index = blocklet.children.findIndex((child) => child.meta.did === meta.did);
98
+
98
99
  if (index >= 0) {
99
100
  // if upgrade, do not update mountPoint and title
100
- newChild.mountPoint = blocklet.children[index].mountPoint;
101
+ newChild.mountPoint =
102
+ blocklet.children[index].mountPoint || formatName(newChildMeta.title) || formatName(newChildMeta.name);
101
103
  // 更新版本时, title 应该更新
102
104
  // newChild.meta.title = blocklet.children[index].meta.title;
103
105
  newChild.installedAt = blocklet.children[index].installedAt;
@@ -13,7 +13,7 @@ const { createRelease: createBlockletRelease } = require('@abtnode/util/lib/crea
13
13
  const urlPathFriendly = require('@blocklet/meta/lib/url-path-friendly').default;
14
14
  const { hasStartEngine } = require('@blocklet/meta/lib/util');
15
15
 
16
- const logger = require('@abtnode/logger')('create-resource-blocklet-pack');
16
+ const logger = require('@abtnode/logger')('blocklet-studio-pack');
17
17
 
18
18
  const { createReleaseSchema } = require('../../validators/project');
19
19
 
@@ -228,7 +228,7 @@ const createPackRelease = async ({
228
228
  if (fs.existsSync(extendedMetaFile)) {
229
229
  const extendedMeta = readMetaFile(extendedMetaFile);
230
230
  logger.info('merge extended blocklet.yml', extendedMeta);
231
- Object.assign(meta, pick(extendedMeta, ['environments', 'engine']));
231
+ Object.assign(meta, pick(extendedMeta, ['environments', 'engine', 'capabilities']));
232
232
  }
233
233
 
234
234
  // Reset group for blocklets with engine specified
@@ -10,7 +10,7 @@ const { titleSchema } = require('@blocklet/meta/lib/schema');
10
10
  const { validateNewDid } = require('@blocklet/meta/lib/name');
11
11
  const urlPathFriendly = require('@blocklet/meta/lib/url-path-friendly').default;
12
12
 
13
- const logger = require('@abtnode/logger')('create-resource-blocklet');
13
+ const logger = require('@abtnode/logger')('blocklet-studio');
14
14
 
15
15
  const { createReleaseSchema } = require('../../validators/project');
16
16
  const getIsMultipleTenant = require('./get-is-multiple-tenant');
@@ -19,8 +19,10 @@ const {
19
19
  getLogoFile,
20
20
  exportBlockletResources,
21
21
  getResourceList,
22
+ checkUploadExists,
22
23
  checkResourceExists,
23
24
  getExtendedMetaFile,
25
+ exportUploadedResources,
24
26
  } = require('./util');
25
27
  const createPackRelease = require('./create-pack-release');
26
28
  const connectToStore = require('./connect-to-store');
@@ -172,6 +174,7 @@ const createRelease = async ({
172
174
  blockletIntroduction,
173
175
  blockletLogo,
174
176
  blockletScreenshots,
177
+ uploadedResource,
175
178
  blockletComponents,
176
179
  note,
177
180
  manager,
@@ -196,6 +199,7 @@ const createRelease = async ({
196
199
  blockletLogo,
197
200
  blockletIntroduction,
198
201
  blockletScreenshots,
202
+ uploadedResource,
199
203
  note,
200
204
  };
201
205
 
@@ -235,16 +239,16 @@ const createRelease = async ({
235
239
  if (action === 'update') {
236
240
  const release = await releaseState.findOne({ projectId, id: releaseId });
237
241
  if (!release) {
238
- throw new Error('release not found');
242
+ throw new Error(`Blocklet release ${releaseId} not found for project ${projectId}`);
239
243
  }
240
244
  if (release.status !== 'draft') {
241
- throw new Error('Can not update a published release');
245
+ throw new Error(`Can not update a published release: ${releaseId}`);
242
246
  }
243
247
  }
244
248
 
245
249
  const existVersion = await releaseState.findOne({ projectId, blockletVersion });
246
250
  if (existVersion && (action === 'create' || existVersion.id !== releaseId)) {
247
- throw new Error(`blockletVersion ${blockletVersion} already exists`);
251
+ throw new Error(`Release version ${blockletVersion} already exists`);
248
252
  }
249
253
 
250
254
  const { blockletDid } = project0;
@@ -253,8 +257,14 @@ const createRelease = async ({
253
257
 
254
258
  const projectDir = path.join(blocklet.env.dataDir, PROJECT.DIR, `${projectId}`);
255
259
 
260
+ // validate resources
261
+ const isResourceFromUpload = !!uploadedResource;
256
262
  if (status !== PROJECT.RELEASE_STATUS.draft) {
257
- await checkResourceExists(projectDir, action, releaseId);
263
+ if (isResourceFromUpload) {
264
+ await checkUploadExists(projectDir, action, releaseId, uploadedResource);
265
+ } else {
266
+ await checkResourceExists(projectDir, action, releaseId);
267
+ }
258
268
  }
259
269
 
260
270
  const release = await releaseState.upsertRelease({
@@ -264,6 +274,7 @@ const createRelease = async ({
264
274
  releaseId,
265
275
  status,
266
276
  });
277
+ logger.info('release upsert done', release);
267
278
 
268
279
  const _releaseId = release.id;
269
280
  const releaseDir = path.join(projectDir, PROJECT.RELEASE_DIR, `${_releaseId}`);
@@ -301,7 +312,7 @@ const createRelease = async ({
301
312
  }
302
313
 
303
314
  if (fs.existsSync(releaseFile)) {
304
- logger.error('release file already exists, remove it', releaseFile);
315
+ logger.warn('release file exists, remove it', releaseFile);
305
316
  await fs.remove(releaseFile);
306
317
  }
307
318
 
@@ -338,17 +349,7 @@ const createRelease = async ({
338
349
  });
339
350
  await fs.outputFile(changelogDistFile, changelog.join('\n\n'));
340
351
 
341
- // create resource
342
- await exportBlockletResources({
343
- app: blocklet,
344
- projectId,
345
- releaseId: _releaseId,
346
- exportDir: releaseBundleDir,
347
- blockletDid,
348
- });
349
-
350
352
  // create blocklet.yml
351
- const resourceList = await getResourceList(resourceDir);
352
353
  const meta = {
353
354
  did: blockletDid,
354
355
  name: blockletDid,
@@ -356,20 +357,53 @@ const createRelease = async ({
356
357
  description: blockletDescription,
357
358
  version: blockletVersion,
358
359
  logo: logoFileName,
359
- resource: {
360
- bundles: resourceList.length ? resourceList : undefined,
361
- },
362
360
  components: [],
363
361
  files: project.blockletScreenshots?.length ? ['screenshots'] : [],
364
362
  screenshots: project.blockletScreenshots || [],
365
363
  };
366
364
 
365
+ // create resource
366
+ if (isResourceFromUpload) {
367
+ await exportUploadedResources({
368
+ app: blocklet,
369
+ projectId,
370
+ releaseId: _releaseId,
371
+ exportDir: releaseBundleDir,
372
+ });
373
+
374
+ meta.main = PROJECT.MAIN_DIR;
375
+ meta.engine = {
376
+ interpreter: 'blocklet',
377
+ source: {
378
+ // FIXME: @wangshijun publish this to production store
379
+ store: 'https://test.store.blocklet.dev',
380
+ name: 'z2qa2dGC9EmsjB2WJtUcmuRWx43zTwPUZQF7g',
381
+ version: 'latest',
382
+ },
383
+ };
384
+ } else {
385
+ await exportBlockletResources({
386
+ app: blocklet,
387
+ projectId,
388
+ releaseId: _releaseId,
389
+ exportDir: releaseBundleDir,
390
+ blockletDid,
391
+ });
392
+
393
+ const resourceList = await getResourceList(resourceDir);
394
+ if (resourceList) {
395
+ meta.resource = {
396
+ bundles: resourceList.length ? resourceList : undefined,
397
+ };
398
+ }
399
+ }
400
+
367
401
  // merge extended blocklet.yml
368
402
  const extendedMetaFile = getExtendedMetaFile({ app: blocklet, projectId, releaseId });
369
403
  if (fs.existsSync(extendedMetaFile)) {
370
404
  const extendedMeta = readMetaFile(extendedMetaFile);
371
- logger.info('merge extended blocklet.yml', extendedMeta);
372
- Object.assign(meta, pick(extendedMeta, ['environments', 'engine']));
405
+ logger.info('release extended blocklet.yml', extendedMeta);
406
+ Object.assign(meta, pick(extendedMeta, ['environments', 'engine', 'capabilities']));
373
407
  }
374
408
 
375
409
  // Enable mountPoint for blocklets with engine specified
@@ -411,7 +445,7 @@ const createRelease = async ({
411
445
  files: [releaseFileName],
412
446
  });
413
447
 
414
- logger.info('create release success', res2);
448
+ logger.info('release finalized', res2);
415
449
 
416
450
  return res2;
417
451
  } catch (error) {
@@ -3,6 +3,7 @@ const fs = require('fs-extra');
3
3
  const fg = require('fast-glob');
4
4
  const { isValid: isValidDid } = require('@arcblock/did');
5
5
  const { PROJECT, BLOCKLET_RESOURCE_DIR, BLOCKLET_META_FILE } = require('@blocklet/constant');
6
+ const { expandBundle } = require('../../util');
6
7
 
7
8
  const COMPONENT_CONFIG_MAP_DIR = '.component_config';
8
9
 
@@ -77,6 +78,15 @@ const exportBlockletResources = async ({
77
78
  }
78
79
  };
79
80
 
81
+ const exportUploadedResources = async ({ app, projectId, releaseId, exportDir }) => {
82
+ const projectDir = path.join(app.env.dataDir, PROJECT.DIR, `${projectId}`);
83
+ const releaseDir = path.join(projectDir, PROJECT.RELEASE_DIR, `${releaseId}`);
84
+ const sourceDir = path.join(releaseDir, PROJECT.RESOURCE_DIR, PROJECT.MAIN_DIR);
85
+ const destDir = path.join(exportDir, PROJECT.MAIN_DIR);
86
+ await fs.ensureDir(destDir);
87
+ await fs.copy(sourceDir, destDir);
88
+ };
89
+
80
90
  async function checkIfDirectory(file) {
81
91
  try {
82
92
  const stats = await fs.promises.stat(file);
@@ -135,6 +145,29 @@ const checkResourceExists = async (projectDir, action, releaseId) => {
135
145
  }
136
146
  };
137
147
 
148
+ const checkUploadExists = async (projectDir, action, releaseId, uploadedResource) => {
149
+ const uploadedFile = path.join(projectDir, PROJECT.ASSET_DIR, uploadedResource);
150
+ if (!fs.existsSync(uploadedFile)) {
151
+ throw new Error(`Uploaded resource does not exist: ${uploadedResource}`);
152
+ }
153
+
154
+ const resourceDir =
155
+ action === 'create'
156
+ ? path.join(projectDir, PROJECT.RESOURCE_DIR, PROJECT.MAIN_DIR)
157
+ : path.join(projectDir, PROJECT.RELEASE_DIR, `${releaseId}`, PROJECT.RESOURCE_DIR, PROJECT.MAIN_DIR);
158
+
159
+ if (fs.existsSync(resourceDir)) {
160
+ fs.rmSync(resourceDir, { recursive: true });
161
+ }
162
+ fs.ensureDirSync(resourceDir);
163
+
164
+ await expandBundle(uploadedFile, resourceDir);
165
+ const files = ['index.html', 'index.htm'];
166
+ if (files.every((file) => fs.existsSync(path.join(resourceDir, file)) === false)) {
167
+ throw new Error(`Uploaded resource does not contain index.html or index.htm: ${uploadedResource}`);
168
+ }
169
+ };
170
+
138
171
  const getExtendedMetaFile = ({ app, projectId, releaseId }) => {
139
172
  const { dataDir } = app.env;
140
173
  const dirArr = [dataDir, PROJECT.DIR, projectId || '/'];
@@ -148,7 +181,9 @@ const getExtendedMetaFile = ({ app, projectId, releaseId }) => {
148
181
  module.exports = {
149
182
  getLogoFile,
150
183
  exportBlockletResources,
184
+ exportUploadedResources,
151
185
  getResourceList,
186
+ checkUploadExists,
152
187
  checkResourceExists,
153
188
  getExtendedMetaFile,
154
189
  };
@@ -31,6 +31,7 @@ class Release extends BaseState {
31
31
  'blockletScreenshots',
32
32
  'publishedStoreIds',
33
33
  'blockletComponents',
34
+ 'uploadedResource',
34
35
  'note',
35
36
  'status',
36
37
  'files',
@@ -5,6 +5,7 @@ const note = Joi.string().min(1).max(PROJECT.MAX_NOTE_LENGTH);
5
5
  const blockletIntroduction = Joi.string().max(PROJECT.MAX_INTRO_LENGTH).allow('').allow(null);
6
6
  const blockletScreenshots = Joi.array().items(Joi.string().min(1).max(200));
7
7
  const blockletLogo = Joi.string().max(200).allow(null).allow('');
8
+ const uploadedResource = Joi.string().max(255).allow(null).allow('');
8
9
 
9
10
  const createReleaseSchema = (status) =>
10
11
  Joi.object({
@@ -24,6 +25,7 @@ const createReleaseSchema = (status) =>
24
25
  required: Joi.boolean().allow(null),
25
26
  })
26
27
  ),
28
+ uploadedResource,
27
29
  });
28
30
 
29
31
  module.exports = {
@@ -31,5 +33,6 @@ module.exports = {
31
33
  blockletIntroduction,
32
34
  blockletScreenshots,
33
35
  blockletLogo,
36
+ uploadedResource,
34
37
  createReleaseSchema,
35
38
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.28-beta-8acda0e6",
6
+ "version": "1.16.28-beta-6917161a",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,19 +19,19 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "@abtnode/analytics": "1.16.28-beta-8acda0e6",
23
- "@abtnode/auth": "1.16.28-beta-8acda0e6",
24
- "@abtnode/certificate-manager": "1.16.28-beta-8acda0e6",
25
- "@abtnode/constant": "1.16.28-beta-8acda0e6",
26
- "@abtnode/cron": "1.16.28-beta-8acda0e6",
27
- "@abtnode/logger": "1.16.28-beta-8acda0e6",
28
- "@abtnode/models": "1.16.28-beta-8acda0e6",
29
- "@abtnode/queue": "1.16.28-beta-8acda0e6",
30
- "@abtnode/rbac": "1.16.28-beta-8acda0e6",
31
- "@abtnode/router-provider": "1.16.28-beta-8acda0e6",
32
- "@abtnode/static-server": "1.16.28-beta-8acda0e6",
33
- "@abtnode/timemachine": "1.16.28-beta-8acda0e6",
34
- "@abtnode/util": "1.16.28-beta-8acda0e6",
22
+ "@abtnode/analytics": "1.16.28-beta-6917161a",
23
+ "@abtnode/auth": "1.16.28-beta-6917161a",
24
+ "@abtnode/certificate-manager": "1.16.28-beta-6917161a",
25
+ "@abtnode/constant": "1.16.28-beta-6917161a",
26
+ "@abtnode/cron": "1.16.28-beta-6917161a",
27
+ "@abtnode/logger": "1.16.28-beta-6917161a",
28
+ "@abtnode/models": "1.16.28-beta-6917161a",
29
+ "@abtnode/queue": "1.16.28-beta-6917161a",
30
+ "@abtnode/rbac": "1.16.28-beta-6917161a",
31
+ "@abtnode/router-provider": "1.16.28-beta-6917161a",
32
+ "@abtnode/static-server": "1.16.28-beta-6917161a",
33
+ "@abtnode/timemachine": "1.16.28-beta-6917161a",
34
+ "@abtnode/util": "1.16.28-beta-6917161a",
35
35
  "@arcblock/did": "1.18.123",
36
36
  "@arcblock/did-auth": "1.18.123",
37
37
  "@arcblock/did-ext": "^1.18.123",
@@ -42,12 +42,12 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.123",
44
44
  "@arcblock/vc": "1.18.123",
45
- "@blocklet/constant": "1.16.28-beta-8acda0e6",
46
- "@blocklet/env": "1.16.28-beta-8acda0e6",
47
- "@blocklet/meta": "1.16.28-beta-8acda0e6",
48
- "@blocklet/resolver": "1.16.28-beta-8acda0e6",
49
- "@blocklet/sdk": "1.16.28-beta-8acda0e6",
50
- "@blocklet/store": "1.16.28-beta-8acda0e6",
45
+ "@blocklet/constant": "1.16.28-beta-6917161a",
46
+ "@blocklet/env": "1.16.28-beta-6917161a",
47
+ "@blocklet/meta": "1.16.28-beta-6917161a",
48
+ "@blocklet/resolver": "1.16.28-beta-6917161a",
49
+ "@blocklet/sdk": "1.16.28-beta-6917161a",
50
+ "@blocklet/store": "1.16.28-beta-6917161a",
51
51
  "@did-space/client": "^0.5.1",
52
52
  "@fidm/x509": "^1.2.1",
53
53
  "@ocap/mcrypto": "1.18.123",
@@ -103,5 +103,5 @@
103
103
  "jest": "^29.7.0",
104
104
  "unzipper": "^0.10.11"
105
105
  },
106
- "gitHead": "a1a896a7d34abc6a1f24b855524c228c0b0a3ade"
106
+ "gitHead": "810be5d1a53e6947a524c4cfbd439aa737c14256"
107
107
  }