@peers-app/peers-ui 0.28.1 → 0.28.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.
@@ -13,6 +13,13 @@ export declare function hostShellTools(): Promise<IHostShellConsumer["tools"]>;
13
13
  * @param target - Link or local path (`~` allowed).
14
14
  */
15
15
  export declare function openOnHost(target: string): Promise<void>;
16
+ /**
17
+ * Open a web link in the user's browser, or a `mailto:` link in their mail app. Package UIs use
18
+ * this: anything else (a local path, another scheme) is refused. Failures are logged and shown.
19
+ *
20
+ * @param url - An `http:`, `https:`, or `mailto:` URL.
21
+ */
22
+ export declare function openLink(url: string): Promise<void>;
16
23
  /**
17
24
  * Open a folder in a code editor (VS Code when installed), else with the OS.
18
25
  *
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hostShellContract = void 0;
4
4
  exports.hostShellTools = hostShellTools;
5
5
  exports.openOnHost = openOnHost;
6
+ exports.openLink = openLink;
6
7
  exports.openInEditorOnHost = openInEditorOnHost;
7
8
  const peers_sdk_1 = require("@peers-app/peers-sdk");
8
9
  /**
@@ -28,6 +29,28 @@ async function openOnHost(target) {
28
29
  reportHostShellError(`Could not open ${target}`, error);
29
30
  }
30
31
  }
32
+ /** Link schemes {@link openLink} opens. */
33
+ const LINK_SCHEMES = new Set(["http:", "https:", "mailto:"]);
34
+ /**
35
+ * Open a web link in the user's browser, or a `mailto:` link in their mail app. Package UIs use
36
+ * this: anything else (a local path, another scheme) is refused. Failures are logged and shown.
37
+ *
38
+ * @param url - An `http:`, `https:`, or `mailto:` URL.
39
+ */
40
+ async function openLink(url) {
41
+ let scheme;
42
+ try {
43
+ scheme = new URL(url).protocol;
44
+ }
45
+ catch {
46
+ // Not a URL; refused below.
47
+ }
48
+ if (!scheme || !LINK_SCHEMES.has(scheme)) {
49
+ reportHostShellError(`Could not open ${url}`, new Error("only http, https, and mailto links can be opened"));
50
+ return;
51
+ }
52
+ await openOnHost(url);
53
+ }
31
54
  /**
32
55
  * Open a folder in a code editor (VS Code when installed), else with the OS.
33
56
  *
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export * from "./components/tabs";
9
9
  export { Typeahead, type TypeaheadItem } from "./components/typeahead";
10
10
  export { isDesktop, mainContentPath } from "./globals";
11
11
  export * from "./hooks";
12
+ export { openLink } from "./host-shell/host-shell-consumer";
12
13
  export * from "./operator-console/operator-console";
13
14
  export * from "./operator-console/operator-console-state";
14
15
  export { type GlobalOverlay, globalOverlays, registerGlobalOverlay, unregisterGlobalOverlay, } from "./root-layout/global-overlays";
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.updateActiveTabTitle = exports.goToTabPath = exports.closeCurrentTab = exports.activeTabs = exports.activeTabId = exports.setRootLayout = exports.selectedRootLayoutId = exports.getRootLayouts = exports.getRootLayout = exports.DEFAULT_ROOT_LAYOUT_ID = exports.TabsLayoutApp = exports.RootLayoutHost = exports.LayoutPicker = exports.unregisterGlobalOverlay = exports.registerGlobalOverlay = exports.globalOverlays = exports.mainContentPath = exports.isDesktop = exports.Typeahead = exports.MarkdownEditor = void 0;
17
+ exports.updateActiveTabTitle = exports.goToTabPath = exports.closeCurrentTab = exports.activeTabs = exports.activeTabId = exports.setRootLayout = exports.selectedRootLayoutId = exports.getRootLayouts = exports.getRootLayout = exports.DEFAULT_ROOT_LAYOUT_ID = exports.TabsLayoutApp = exports.RootLayoutHost = exports.LayoutPicker = exports.unregisterGlobalOverlay = exports.registerGlobalOverlay = exports.globalOverlays = exports.openLink = exports.mainContentPath = exports.isDesktop = exports.Typeahead = exports.MarkdownEditor = void 0;
18
18
  __exportStar(require("./components/inverse-lazy-list"), exports);
19
19
  var editor_1 = require("./components/markdown-editor/editor");
20
20
  Object.defineProperty(exports, "MarkdownEditor", { enumerable: true, get: function () { return editor_1.MarkdownEditor; } });
@@ -29,6 +29,8 @@ var globals_1 = require("./globals");
29
29
  Object.defineProperty(exports, "isDesktop", { enumerable: true, get: function () { return globals_1.isDesktop; } });
30
30
  Object.defineProperty(exports, "mainContentPath", { enumerable: true, get: function () { return globals_1.mainContentPath; } });
31
31
  __exportStar(require("./hooks"), exports);
32
+ var host_shell_consumer_1 = require("./host-shell/host-shell-consumer");
33
+ Object.defineProperty(exports, "openLink", { enumerable: true, get: function () { return host_shell_consumer_1.openLink; } });
32
34
  __exportStar(require("./operator-console/operator-console"), exports);
33
35
  __exportStar(require("./operator-console/operator-console-state"), exports);
34
36
  var global_overlays_1 = require("./root-layout/global-overlays");
@@ -4,6 +4,9 @@ import { type DataContext, type IPackage, type IPackageVersion } from "@peers-ap
4
4
  * the group's, checked with `assertPackageVersionRunnable`. A refusal is logged and gives
5
5
  * undefined, so the package's app links, routes and screens are left out rather than loaded.
6
6
  *
7
+ * The check reads the package's stored row rather than using `pkg`: the loaders pass copies
8
+ * with fields added (`appNavs`), and the row's signature covers only the row as it was signed.
9
+ *
7
10
  * @param pkg - The package.
8
11
  */
9
12
  export declare function resolveRunnableVersion(pkg: IPackage): Promise<{
@@ -7,26 +7,32 @@ const peers_sdk_1 = require("@peers-app/peers-sdk");
7
7
  * the group's, checked with `assertPackageVersionRunnable`. A refusal is logged and gives
8
8
  * undefined, so the package's app links, routes and screens are left out rather than loaded.
9
9
  *
10
+ * The check reads the package's stored row rather than using `pkg`: the loaders pass copies
11
+ * with fields added (`appNavs`), and the row's signature covers only the row as it was signed.
12
+ *
10
13
  * @param pkg - The package.
11
14
  */
12
15
  async function resolveRunnableVersion(pkg) {
13
- let pvId = pkg.activePackageVersionId;
14
- try {
15
- const pvar = (0, peers_sdk_1.packagePrefsVar)(pkg.packageId);
16
- await pvar.loadingPromise;
17
- pvId = pvar()?.activePackageVersionId ?? pvId;
18
- }
19
- catch {
20
- /* use group default */
21
- }
22
- if (!pvId)
23
- return undefined;
24
16
  try {
25
17
  const dataContext = await (0, peers_sdk_1.getDefaultDataContext)();
18
+ const stored = await (0, peers_sdk_1.Packages)(dataContext).get(pkg.packageId);
19
+ if (!stored)
20
+ return undefined;
21
+ let pvId = stored.activePackageVersionId;
22
+ try {
23
+ const pvar = (0, peers_sdk_1.packagePrefsVar)(stored.packageId);
24
+ await pvar.loadingPromise;
25
+ pvId = pvar()?.activePackageVersionId ?? pvId;
26
+ }
27
+ catch {
28
+ /* use group default */
29
+ }
30
+ if (!pvId)
31
+ return undefined;
26
32
  const pv = await (0, peers_sdk_1.PackageVersions)(dataContext).get(pvId);
27
33
  if (!pv)
28
34
  return undefined;
29
- await (0, peers_sdk_1.assertPackageVersionRunnable)(pkg, pv, dataContext);
35
+ await (0, peers_sdk_1.assertPackageVersionRunnable)(stored, pv, dataContext);
30
36
  return { pv, dataContext };
31
37
  }
32
38
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peers-app/peers-ui",
3
- "version": "0.28.1",
3
+ "version": "0.28.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/peers-app/peers-ui.git"
@@ -36,7 +36,7 @@
36
36
  "lint:fix": "biome check --write ."
37
37
  },
38
38
  "peerDependencies": {
39
- "@peers-app/peers-sdk": "^0.28.1",
39
+ "@peers-app/peers-sdk": "^0.28.2",
40
40
  "bootstrap": "^5.3.3",
41
41
  "react": "^18.0.0",
42
42
  "react-dom": "^18.0.0"
@@ -47,7 +47,7 @@
47
47
  "@babel/preset-react": "^7.24.1",
48
48
  "@babel/preset-typescript": "^7.27.1",
49
49
  "@biomejs/biome": "2.3.11",
50
- "@peers-app/peers-sdk": "0.28.1",
50
+ "@peers-app/peers-sdk": "0.28.2",
51
51
  "@testing-library/dom": "^10.4.0",
52
52
  "@testing-library/jest-dom": "^6.6.3",
53
53
  "@testing-library/react": "^16.3.0",