@nocobase/plugin-multi-portal 2.2.0-alpha.10 → 2.2.0-alpha.11

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.
@@ -8,18 +8,18 @@
8
8
  */
9
9
 
10
10
  module.exports = {
11
- "@nocobase/flow-engine": "2.2.0-alpha.10",
12
- "@nocobase/client": "2.2.0-alpha.10",
13
- "@nocobase/client-v2": "2.2.0-alpha.10",
14
- "@nocobase/database": "2.2.0-alpha.10",
15
- "@nocobase/server": "2.2.0-alpha.10",
16
- "@nocobase/resourcer": "2.2.0-alpha.10",
17
- "@nocobase/utils": "2.2.0-alpha.10",
11
+ "@nocobase/flow-engine": "2.2.0-alpha.11",
12
+ "@nocobase/client": "2.2.0-alpha.11",
13
+ "@nocobase/client-v2": "2.2.0-alpha.11",
14
+ "@nocobase/database": "2.2.0-alpha.11",
15
+ "@nocobase/server": "2.2.0-alpha.11",
16
+ "@nocobase/resourcer": "2.2.0-alpha.11",
17
+ "@nocobase/utils": "2.2.0-alpha.11",
18
18
  "antd": "5.24.2",
19
19
  "ahooks": "3.7.8",
20
20
  "antd-style": "3.7.1",
21
21
  "react": "18.2.0",
22
- "@nocobase/plugin-ui-layout": "2.2.0-alpha.10",
22
+ "@nocobase/plugin-ui-layout": "2.2.0-alpha.11",
23
23
  "@ant-design/icons": "5.6.1",
24
24
  "sequelize": "6.35.2"
25
25
  };
@@ -1 +1 @@
1
- {"author":"Isaac Z. Schlueter","name":"tar","description":"tar for node","version":"7.5.15","repository":{"type":"git","url":"https://github.com/isaacs/node-tar.git"},"scripts":{"genparse":"node scripts/generate-parse-fixtures.js","snap":"tap","test":"tap","pretest":"npm run prepare","presnap":"npm run prepare","prepare":"tshy && bash scripts/build.sh","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","format":"prettier --write . --log-level warn","typedoc":"typedoc --tsconfig .tshy/esm.json ./src/*.ts","lint":"oxlint --fix src test","postsnap":"npm run lint","postlint":"npm run format"},"dependencies":{"@isaacs/fs-minipass":"^4.0.0","chownr":"^3.0.0","minipass":"^7.1.2","minizlib":"^3.1.0","yallist":"^5.0.0"},"devDependencies":{"@types/node":"^25.5.0","chmodr":"^2.0.2","end-of-stream":"^1.4.3","esbuild":"^0.27.4","events-to-array":"^2.0.3","mutate-fs":"^2.1.1","nock":"^13.5.4","oxlint":"^1.57.0","oxlint-tsgolint":"^0.17.3","prettier":"^3.8.1","rimraf":"^6.1.2","tap":"^21.6.2","tshy":"^3.3.2","typedoc":"^0.28.18"},"license":"BlueOak-1.0.0","engines":{"node":">=18"},"files":["dist"],"tshy":{"exports":{"./package.json":"./package.json",".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.min.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.min.js"}},"./raw":"./src/index.ts","./c":"./src/create.ts","./create":"./src/create.ts","./replace":"./src/create.ts","./r":"./src/create.ts","./list":"./src/list.ts","./t":"./src/list.ts","./update":"./src/update.ts","./u":"./src/update.ts","./extract":"./src/extract.ts","./x":"./src/extract.ts","./pack":"./src/pack.ts","./unpack":"./src/unpack.ts","./parse":"./src/parse.ts","./read-entry":"./src/read-entry.ts","./write-entry":"./src/write-entry.ts","./header":"./src/header.ts","./pax":"./src/pax.ts","./types":"./src/types.ts"}},"exports":{"./package.json":"./package.json",".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.min.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.min.js"}},"./raw":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./c":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./create":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./replace":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./r":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./list":{"import":{"types":"./dist/esm/list.d.ts","default":"./dist/esm/list.js"},"require":{"types":"./dist/commonjs/list.d.ts","default":"./dist/commonjs/list.js"}},"./t":{"import":{"types":"./dist/esm/list.d.ts","default":"./dist/esm/list.js"},"require":{"types":"./dist/commonjs/list.d.ts","default":"./dist/commonjs/list.js"}},"./update":{"import":{"types":"./dist/esm/update.d.ts","default":"./dist/esm/update.js"},"require":{"types":"./dist/commonjs/update.d.ts","default":"./dist/commonjs/update.js"}},"./u":{"import":{"types":"./dist/esm/update.d.ts","default":"./dist/esm/update.js"},"require":{"types":"./dist/commonjs/update.d.ts","default":"./dist/commonjs/update.js"}},"./extract":{"import":{"types":"./dist/esm/extract.d.ts","default":"./dist/esm/extract.js"},"require":{"types":"./dist/commonjs/extract.d.ts","default":"./dist/commonjs/extract.js"}},"./x":{"import":{"types":"./dist/esm/extract.d.ts","default":"./dist/esm/extract.js"},"require":{"types":"./dist/commonjs/extract.d.ts","default":"./dist/commonjs/extract.js"}},"./pack":{"import":{"types":"./dist/esm/pack.d.ts","default":"./dist/esm/pack.js"},"require":{"types":"./dist/commonjs/pack.d.ts","default":"./dist/commonjs/pack.js"}},"./unpack":{"import":{"types":"./dist/esm/unpack.d.ts","default":"./dist/esm/unpack.js"},"require":{"types":"./dist/commonjs/unpack.d.ts","default":"./dist/commonjs/unpack.js"}},"./parse":{"import":{"types":"./dist/esm/parse.d.ts","default":"./dist/esm/parse.js"},"require":{"types":"./dist/commonjs/parse.d.ts","default":"./dist/commonjs/parse.js"}},"./read-entry":{"import":{"types":"./dist/esm/read-entry.d.ts","default":"./dist/esm/read-entry.js"},"require":{"types":"./dist/commonjs/read-entry.d.ts","default":"./dist/commonjs/read-entry.js"}},"./write-entry":{"import":{"types":"./dist/esm/write-entry.d.ts","default":"./dist/esm/write-entry.js"},"require":{"types":"./dist/commonjs/write-entry.d.ts","default":"./dist/commonjs/write-entry.js"}},"./header":{"import":{"types":"./dist/esm/header.d.ts","default":"./dist/esm/header.js"},"require":{"types":"./dist/commonjs/header.d.ts","default":"./dist/commonjs/header.js"}},"./pax":{"import":{"types":"./dist/esm/pax.d.ts","default":"./dist/esm/pax.js"},"require":{"types":"./dist/commonjs/pax.d.ts","default":"./dist/commonjs/pax.js"}},"./types":{"import":{"types":"./dist/esm/types.d.ts","default":"./dist/esm/types.js"},"require":{"types":"./dist/commonjs/types.d.ts","default":"./dist/commonjs/types.js"}}},"type":"module","main":"./dist/commonjs/index.min.js","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.min.js","_lastModified":"2026-07-28T04:40:01.299Z"}
1
+ {"author":"Isaac Z. Schlueter","name":"tar","description":"tar for node","version":"7.5.15","repository":{"type":"git","url":"https://github.com/isaacs/node-tar.git"},"scripts":{"genparse":"node scripts/generate-parse-fixtures.js","snap":"tap","test":"tap","pretest":"npm run prepare","presnap":"npm run prepare","prepare":"tshy && bash scripts/build.sh","preversion":"npm test","postversion":"npm publish","prepublishOnly":"git push origin --follow-tags","format":"prettier --write . --log-level warn","typedoc":"typedoc --tsconfig .tshy/esm.json ./src/*.ts","lint":"oxlint --fix src test","postsnap":"npm run lint","postlint":"npm run format"},"dependencies":{"@isaacs/fs-minipass":"^4.0.0","chownr":"^3.0.0","minipass":"^7.1.2","minizlib":"^3.1.0","yallist":"^5.0.0"},"devDependencies":{"@types/node":"^25.5.0","chmodr":"^2.0.2","end-of-stream":"^1.4.3","esbuild":"^0.27.4","events-to-array":"^2.0.3","mutate-fs":"^2.1.1","nock":"^13.5.4","oxlint":"^1.57.0","oxlint-tsgolint":"^0.17.3","prettier":"^3.8.1","rimraf":"^6.1.2","tap":"^21.6.2","tshy":"^3.3.2","typedoc":"^0.28.18"},"license":"BlueOak-1.0.0","engines":{"node":">=18"},"files":["dist"],"tshy":{"exports":{"./package.json":"./package.json",".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.min.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.min.js"}},"./raw":"./src/index.ts","./c":"./src/create.ts","./create":"./src/create.ts","./replace":"./src/create.ts","./r":"./src/create.ts","./list":"./src/list.ts","./t":"./src/list.ts","./update":"./src/update.ts","./u":"./src/update.ts","./extract":"./src/extract.ts","./x":"./src/extract.ts","./pack":"./src/pack.ts","./unpack":"./src/unpack.ts","./parse":"./src/parse.ts","./read-entry":"./src/read-entry.ts","./write-entry":"./src/write-entry.ts","./header":"./src/header.ts","./pax":"./src/pax.ts","./types":"./src/types.ts"}},"exports":{"./package.json":"./package.json",".":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.min.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.min.js"}},"./raw":{"import":{"types":"./dist/esm/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/commonjs/index.d.ts","default":"./dist/commonjs/index.js"}},"./c":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./create":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./replace":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./r":{"import":{"types":"./dist/esm/create.d.ts","default":"./dist/esm/create.js"},"require":{"types":"./dist/commonjs/create.d.ts","default":"./dist/commonjs/create.js"}},"./list":{"import":{"types":"./dist/esm/list.d.ts","default":"./dist/esm/list.js"},"require":{"types":"./dist/commonjs/list.d.ts","default":"./dist/commonjs/list.js"}},"./t":{"import":{"types":"./dist/esm/list.d.ts","default":"./dist/esm/list.js"},"require":{"types":"./dist/commonjs/list.d.ts","default":"./dist/commonjs/list.js"}},"./update":{"import":{"types":"./dist/esm/update.d.ts","default":"./dist/esm/update.js"},"require":{"types":"./dist/commonjs/update.d.ts","default":"./dist/commonjs/update.js"}},"./u":{"import":{"types":"./dist/esm/update.d.ts","default":"./dist/esm/update.js"},"require":{"types":"./dist/commonjs/update.d.ts","default":"./dist/commonjs/update.js"}},"./extract":{"import":{"types":"./dist/esm/extract.d.ts","default":"./dist/esm/extract.js"},"require":{"types":"./dist/commonjs/extract.d.ts","default":"./dist/commonjs/extract.js"}},"./x":{"import":{"types":"./dist/esm/extract.d.ts","default":"./dist/esm/extract.js"},"require":{"types":"./dist/commonjs/extract.d.ts","default":"./dist/commonjs/extract.js"}},"./pack":{"import":{"types":"./dist/esm/pack.d.ts","default":"./dist/esm/pack.js"},"require":{"types":"./dist/commonjs/pack.d.ts","default":"./dist/commonjs/pack.js"}},"./unpack":{"import":{"types":"./dist/esm/unpack.d.ts","default":"./dist/esm/unpack.js"},"require":{"types":"./dist/commonjs/unpack.d.ts","default":"./dist/commonjs/unpack.js"}},"./parse":{"import":{"types":"./dist/esm/parse.d.ts","default":"./dist/esm/parse.js"},"require":{"types":"./dist/commonjs/parse.d.ts","default":"./dist/commonjs/parse.js"}},"./read-entry":{"import":{"types":"./dist/esm/read-entry.d.ts","default":"./dist/esm/read-entry.js"},"require":{"types":"./dist/commonjs/read-entry.d.ts","default":"./dist/commonjs/read-entry.js"}},"./write-entry":{"import":{"types":"./dist/esm/write-entry.d.ts","default":"./dist/esm/write-entry.js"},"require":{"types":"./dist/commonjs/write-entry.d.ts","default":"./dist/commonjs/write-entry.js"}},"./header":{"import":{"types":"./dist/esm/header.d.ts","default":"./dist/esm/header.js"},"require":{"types":"./dist/commonjs/header.d.ts","default":"./dist/commonjs/header.js"}},"./pax":{"import":{"types":"./dist/esm/pax.d.ts","default":"./dist/esm/pax.js"},"require":{"types":"./dist/commonjs/pax.d.ts","default":"./dist/commonjs/pax.js"}},"./types":{"import":{"types":"./dist/esm/types.d.ts","default":"./dist/esm/types.js"},"require":{"types":"./dist/commonjs/types.d.ts","default":"./dist/commonjs/types.js"}}},"type":"module","main":"./dist/commonjs/index.min.js","types":"./dist/commonjs/index.d.ts","module":"./dist/esm/index.min.js","_lastModified":"2026-07-28T07:40:30.166Z"}
@@ -197,6 +197,20 @@ function joinPortalStoragePublicPath(publicPath, pathname) {
197
197
  function isAbsoluteUrl(value) {
198
198
  return /^[a-z][a-z\d+\-.]*:\/\//i.test(value) || value.startsWith("//");
199
199
  }
200
+ function normalizePortalStorageUrlPathname(pathname) {
201
+ const normalized = pathname.replace(/\/+/g, "/");
202
+ return normalized === "/" ? normalized : normalized.replace(/\/+$/, "");
203
+ }
204
+ function resolvePortalStorageEnvApiUrl(apiUrl) {
205
+ try {
206
+ const parsedUrl = new URL(apiUrl.startsWith("//") ? `http:${apiUrl}` : apiUrl);
207
+ return normalizePortalStorageUrlPathname(parsedUrl.pathname);
208
+ } catch {
209
+ const [pathname] = apiUrl.split(/[?#]/, 1);
210
+ const withLeadingSlash = (pathname == null ? void 0 : pathname.startsWith("/")) ? pathname : `/${pathname || "api"}`;
211
+ return normalizePortalStorageUrlPathname(withLeadingSlash);
212
+ }
213
+ }
200
214
  function appendPortalStorageSubAppApiUrl(apiUrl, appName) {
201
215
  if (appName === MAIN_APP_NAME) {
202
216
  return apiUrl;
@@ -387,6 +401,73 @@ async function copyPortalTemplate(sourceDir, targetDir) {
387
401
  filter: (source) => !import_path.default.relative(sourceDir, source).split(import_path.default.sep).some((segment) => segment.startsWith("._") || ignoredSegments.has(segment))
388
402
  });
389
403
  }
404
+ function getPortalStorageConfig(options) {
405
+ const sourceOptions = isRecordLike(options) ? options : {};
406
+ const sourceStorage = trimString(sourceOptions.sourceStorage);
407
+ if (sourceStorage !== "git") {
408
+ return { sourceStorage: "nocobase" };
409
+ }
410
+ const gitOptions = isRecordLike(sourceOptions.git) ? sourceOptions.git : {};
411
+ return {
412
+ sourceStorage,
413
+ git: {
414
+ repo: trimString(gitOptions.repo),
415
+ branch: trimString(gitOptions.branch) || "main",
416
+ path: trimString(gitOptions.path) || "."
417
+ }
418
+ };
419
+ }
420
+ function upsertPortalEnvContent(content, values) {
421
+ const nextValues = { ...values };
422
+ const lines = content ? content.replace(/\r\n/g, "\n").split("\n") : [];
423
+ const result = [];
424
+ for (const line of lines) {
425
+ if (!line && result.length === lines.length - 1) {
426
+ continue;
427
+ }
428
+ const match = line.match(/^(\s*)([A-Za-z_][A-Za-z0-9_]*)\s*=/);
429
+ const key = match == null ? void 0 : match[2];
430
+ if (key && Object.prototype.hasOwnProperty.call(nextValues, key)) {
431
+ result.push(`${key}=${nextValues[key]}`);
432
+ delete nextValues[key];
433
+ continue;
434
+ }
435
+ result.push(line);
436
+ }
437
+ for (const [key, value] of Object.entries(nextValues)) {
438
+ result.push(`${key}=${value}`);
439
+ }
440
+ return `${result.join("\n").replace(/\n*$/, "")}
441
+ `;
442
+ }
443
+ async function upsertPortalEnvFile(filePath, values) {
444
+ let content = "";
445
+ try {
446
+ content = await import_fs.default.promises.readFile(filePath, "utf-8");
447
+ } catch {
448
+ content = "";
449
+ }
450
+ await import_fs.default.promises.writeFile(filePath, upsertPortalEnvContent(content, values), "utf-8");
451
+ }
452
+ async function ensurePortalStorageConfigFiles(portalDir, item) {
453
+ const apiUrl = getPortalStorageApiUrl(item.appName);
454
+ const portalBase = getPortalDeployBasePath(item.appName, item.portalName);
455
+ await import_fs.default.promises.mkdir(portalDir, { recursive: true });
456
+ await upsertPortalEnvFile(import_path.default.join(portalDir, ".env"), {
457
+ NOCOBASE_API_URL: resolvePortalStorageEnvApiUrl(apiUrl),
458
+ NOCOBASE_PORTAL_BASE: portalBase
459
+ });
460
+ await upsertPortalEnvFile(import_path.default.join(portalDir, ".env.local"), {
461
+ NOCOBASE_API_URL: apiUrl,
462
+ NOCOBASE_PORTAL_BASE: portalBase
463
+ });
464
+ await import_fs.default.promises.writeFile(
465
+ import_path.default.join(portalDir, "portal.config.json"),
466
+ `${JSON.stringify(item.config, null, 2)}
467
+ `,
468
+ "utf-8"
469
+ );
470
+ }
390
471
  function sanitizePortalStorageNodeOptions(value) {
391
472
  return trimString(value).split(/\s+/).filter((option) => option !== "--preserve-symlinks" && option !== "--preserve-symlinks-main").join(" ");
392
473
  }
@@ -1555,7 +1636,8 @@ class PluginMultiPortalServer extends import_server.Plugin {
1555
1636
  return {
1556
1637
  appName: this.getAppName(),
1557
1638
  portalName,
1558
- enabled: readField("enabled") === true
1639
+ enabled: readField("enabled") === true,
1640
+ config: getPortalStorageConfig(readField("options"))
1559
1641
  };
1560
1642
  }
1561
1643
  warnPortalStorageSyncFailed(error) {
@@ -1620,6 +1702,8 @@ class PluginMultiPortalServer extends import_server.Plugin {
1620
1702
  await copyPortalTemplate(template.dir, portalDir);
1621
1703
  await appendPortalStorageLog(logPath, `Default portal template copied to ${portalDir}.`);
1622
1704
  }
1705
+ await ensurePortalStorageConfigFiles(portalDir, item);
1706
+ await appendPortalStorageLog(logPath, `Portal configuration files updated in ${portalDir}.`);
1623
1707
  if (item.enabled) {
1624
1708
  await buildPortalStorageItem(portalDir, item);
1625
1709
  return;
@@ -1649,6 +1733,7 @@ class PluginMultiPortalServer extends import_server.Plugin {
1649
1733
  await this.schedulePortalTemplateCopyAndBuild(item, template, portalDir);
1650
1734
  return;
1651
1735
  }
1736
+ await ensurePortalStorageConfigFiles(portalDir, item);
1652
1737
  if (item.enabled) {
1653
1738
  if (!await pathExists(portalIndex)) {
1654
1739
  await buildPortalStorageItem(portalDir, item);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/plugin-multi-portal",
3
- "version": "2.2.0-alpha.10",
3
+ "version": "2.2.0-alpha.11",
4
4
  "main": "dist/server/index.js",
5
5
  "nocobase": {
6
6
  "supportedVersions": [
@@ -14,7 +14,7 @@
14
14
  "description.zh-CN": "提供多 Portal 管理能力,可为不同访问入口配置独立布局和菜单。",
15
15
  "devDependencies": {
16
16
  "@ant-design/icons": "5.x",
17
- "@nocobase/plugin-ui-layout": "2.2.0-alpha.10",
17
+ "@nocobase/plugin-ui-layout": "2.2.0-alpha.11",
18
18
  "ahooks": "3.x",
19
19
  "antd": "5.x",
20
20
  "react": "^18.2.0",
@@ -30,5 +30,5 @@
30
30
  "@nocobase/server": "2.x",
31
31
  "@nocobase/test": "2.x"
32
32
  },
33
- "gitHead": "b5a3f131bb0a4a2fbfd96852896bccadc933d834"
33
+ "gitHead": "c9ff1f51e5c33bc6437b64eb779212be71b78f58"
34
34
  }