From 85c8621d4e77ce639a7cdd91d1cdcfd55c77c62f Mon Sep 17 00:00:00 2001
From: Nayam Amarshe <25067102+NayamAmarshe@users.noreply.github.com>
Date: Thu, 2 Nov 2023 20:33:21 +0530
Subject: [PATCH] Add mas build
---
common/feature-flags.ts | 4 +-
electron/commands/custom-models-select.ts | 14 +++++-
electron/commands/select-file.ts | 9 +++-
electron/commands/select-folder.ts | 13 ++++-
electron/index.ts | 15 ++++++
electron/utils/settings.ts | 36 +++++++++++++
mas-dev.json | 29 +++++++++++
mas.json | 50 +++++++++++++++++++
package-lock.json | 4 +-
package.json | 16 ++++--
renderer/components/settings-tab/index.tsx | 28 ++++++-----
.../upscayl-tab/config/LeftPaneImageSteps.tsx | 22 ++++++--
renderer/pages/index.tsx | 18 ++++---
resources/entitlements.mas.plist | 8 ++-
14 files changed, 231 insertions(+), 35 deletions(-)
create mode 100644 electron/utils/settings.ts
create mode 100644 mas-dev.json
create mode 100644 mas.json
diff --git a/common/feature-flags.ts b/common/feature-flags.ts
index 9ecff52..7436ffb 100644
--- a/common/feature-flags.ts
+++ b/common/feature-flags.ts
@@ -1,7 +1,9 @@
type FeatureFlags = {
APP_STORE_BUILD: boolean;
+ SHOW_UPSCAYL_CLOUD_INFO: boolean;
};
export const featureFlags: FeatureFlags = {
- APP_STORE_BUILD: false,
+ APP_STORE_BUILD: true,
+ SHOW_UPSCAYL_CLOUD_INFO: false,
};
diff --git a/electron/commands/custom-models-select.ts b/electron/commands/custom-models-select.ts
index 56e05cb..0f9ad48 100644
--- a/electron/commands/custom-models-select.ts
+++ b/electron/commands/custom-models-select.ts
@@ -8,16 +8,28 @@ import slash from "../utils/slash";
import COMMAND from "../constants/commands";
import getModels from "../utils/get-models";
import { getMainWindow } from "../main-window";
+import { settings } from "../utils/settings";
const customModelsSelect = async (event, message) => {
const mainWindow = getMainWindow();
if (!mainWindow) return;
- const { canceled, filePaths: folderPaths } = await dialog.showOpenDialog({
+ const {
+ canceled,
+ filePaths: folderPaths,
+ bookmarks,
+ } = await dialog.showOpenDialog({
properties: ["openDirectory"],
title: "Select Custom Models Folder",
defaultPath: customModelsFolderPath,
+ securityScopedBookmarks: true,
});
+
+ if (bookmarks && bookmarks.length > 0) {
+ logit("π Bookmarks: ", bookmarks);
+ settings.set("custom-models-bookmarks", bookmarks[0]);
+ }
+
if (canceled) {
logit("π« Select Custom Models Folder Operation Cancelled");
return null;
diff --git a/electron/commands/select-file.ts b/electron/commands/select-file.ts
index fbcdf21..9cb0026 100644
--- a/electron/commands/select-file.ts
+++ b/electron/commands/select-file.ts
@@ -2,16 +2,23 @@ import { MessageBoxOptions, dialog } from "electron";
import { getMainWindow } from "../main-window";
import { imagePath, setImagePath } from "../utils/config-variables";
import logit from "../utils/logit";
+import { settings } from "../utils/settings";
const selectFile = async () => {
const mainWindow = getMainWindow();
- const { canceled, filePaths } = await dialog.showOpenDialog({
+ const { canceled, filePaths, bookmarks } = await dialog.showOpenDialog({
properties: ["openFile", "multiSelections"],
title: "Select Image",
defaultPath: imagePath,
+ securityScopedBookmarks: true,
});
+ if (bookmarks && bookmarks.length > 0) {
+ logit("π Bookmarks: ", bookmarks);
+ settings.set("file-bookmarks", bookmarks[0]);
+ }
+
if (canceled) {
logit("π« File Operation Cancelled");
return null;
diff --git a/electron/commands/select-folder.ts b/electron/commands/select-folder.ts
index f92b01a..31c243c 100644
--- a/electron/commands/select-folder.ts
+++ b/electron/commands/select-folder.ts
@@ -1,13 +1,24 @@
import { dialog } from "electron";
import { folderPath, setFolderPath } from "../utils/config-variables";
import logit from "../utils/logit";
+import { settings } from "../utils/settings";
const selectFolder = async (event, message) => {
- const { canceled, filePaths: folderPaths } = await dialog.showOpenDialog({
+ const {
+ canceled,
+ filePaths: folderPaths,
+ bookmarks,
+ } = await dialog.showOpenDialog({
properties: ["openDirectory"],
defaultPath: folderPath,
+ securityScopedBookmarks: true,
});
+ if (bookmarks && bookmarks.length > 0) {
+ logit("π Bookmarks: ", bookmarks);
+ settings.set("folder-bookmarks", bookmarks[0]);
+ }
+
if (canceled) {
logit("π« Select Folder Operation Cancelled");
return null;
diff --git a/electron/index.ts b/electron/index.ts
index 0b7dc60..fc32cd8 100644
--- a/electron/index.ts
+++ b/electron/index.ts
@@ -19,12 +19,27 @@ import doubleUpscayl from "./commands/double-upscayl";
import autoUpdate from "./commands/auto-update";
import sharp from "sharp";
import { featureFlags } from "../common/feature-flags";
+import { settings } from "./utils/settings";
// INITIALIZATION
log.initialize({ preload: true });
sharp.cache(false);
logit("π App Path: ", app.getAppPath());
+// SECURITY SCOPED BOOKMARKS
+const fileBookmarks = settings.get("file-bookmarks", true);
+const folderBookmarks = settings.get("folder-bookmarks", true);
+const customModelsBookmarks = settings.get("custom-models-bookmarks", true);
+if (fileBookmarks) {
+ app.startAccessingSecurityScopedResource(fileBookmarks);
+}
+if (folderBookmarks) {
+ app.startAccessingSecurityScopedResource(folderBookmarks as string);
+}
+if (customModelsBookmarks) {
+ app.startAccessingSecurityScopedResource(customModelsBookmarks as string);
+}
+
app.on("ready", async () => {
await prepareNext("./renderer");
diff --git a/electron/utils/settings.ts b/electron/utils/settings.ts
new file mode 100644
index 0000000..b615dd7
--- /dev/null
+++ b/electron/utils/settings.ts
@@ -0,0 +1,36 @@
+import { getMainWindow } from "../main-window";
+
+/**
+ * @description LocalStorage wrapper for the main window
+ * @example
+ * import { settings } from "./utils/settings";
+ *
+ * // Get a value
+ * const value = settings.get("key", true);
+ *
+ * // Set a value
+ * settings.set("key", value);
+ */
+export const settings = {
+ get: (key: string, parse: boolean = false) => {
+ const mainWindow = getMainWindow();
+ if (!mainWindow) return;
+ let result = null;
+ mainWindow.webContents
+ .executeJavaScript(`localStorage.getItem("${key}");`, true)
+ .then((localStorageValue: any) => {
+ if (localStorageValue) {
+ result = parse ? JSON.parse(localStorageValue) : localStorageValue;
+ }
+ });
+ return result;
+ },
+ set: (key: string, value: any) => {
+ const mainWindow = getMainWindow();
+ if (!mainWindow) return;
+ mainWindow.webContents.executeJavaScript(
+ `localStorage.setItem("${key}", ${JSON.stringify(value)});`,
+ true
+ );
+ },
+};
diff --git a/mas-dev.json b/mas-dev.json
new file mode 100644
index 0000000..818989f
--- /dev/null
+++ b/mas-dev.json
@@ -0,0 +1,29 @@
+{
+ "appId": "org.upscayl.Upscayl",
+ "extraFiles": [
+ {
+ "from": "resources/${os}/bin",
+ "to": "resources/bin",
+ "filter": ["**/*"]
+ },
+ {
+ "from": "resources/models",
+ "to": "resources/models",
+ "filter": ["**/*"]
+ }
+ ],
+ "mac": {
+ "type": "development",
+ "identity": null,
+ "mergeASARs": false,
+ "x64ArchFiles": "*"
+ },
+ "masDev": {
+ "type": "development",
+ "artifactName": "${name}_${version}_macos.${ext}",
+ "category": "public.app-category.photography",
+ "hardenedRuntime": false,
+ "entitlements": "resources/entitlements.mas.plist",
+ "entitlementsInherit": "resources/entitlements.mas.plist"
+ }
+}
diff --git a/mas.json b/mas.json
new file mode 100644
index 0000000..2f09326
--- /dev/null
+++ b/mas.json
@@ -0,0 +1,50 @@
+{
+ "productName": "Upscayl",
+ "appId": "org.upscayl.Upscayl",
+ "afterSign": "./notarize.js",
+ "asar": true,
+ "asarUnpack": ["**/node_modules/sharp/**/*"],
+ "extraFiles": [
+ {
+ "from": "resources/${os}/bin",
+ "to": "resources/bin",
+ "filter": ["**/*"]
+ },
+ {
+ "from": "resources/models",
+ "to": "resources/models",
+ "filter": ["**/*"]
+ }
+ ],
+ "buildVersion": "3.11.23",
+ "mas": {
+ "type": "distribution",
+ "hardenedRuntime": false,
+ "electronLanguages": ["en"],
+ "category": "public.app-category.photography",
+ "entitlements": "resources/entitlements.mas.plist",
+ "entitlementsInherit": "resources/entitlements.mas.plist",
+ "provisioningProfile": "prod.provisionprofile",
+ "mergeASARs": false,
+ "gatekeeperAssess": false,
+ "icon": "build/icon.icns",
+ "x64ArchFiles": "*",
+ "target": [
+ {
+ "target": "mas",
+ "arch": ["universal"]
+ }
+ ]
+ },
+ "mac": {
+ "type": "distribution",
+ "mergeASARs": false,
+ "x64ArchFiles": "*",
+ "provisioningProfile": "prod.provisionprofile",
+ "category": "public.app-category.photography",
+ "hardenedRuntime": true,
+ "gatekeeperAssess": false,
+ "entitlements": "resources/entitlements.mac.plist",
+ "entitlementsInherit": "resources/entitlements.mac.plist"
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 73cfc56..2313531 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "upscayl",
- "version": "2.8.5",
+ "version": "2.9.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "upscayl",
- "version": "2.8.5",
+ "version": "2.9.3",
"license": "AGPL-3.0",
"dependencies": {
"dotenv": "^16.3.1",
diff --git a/package.json b/package.json
index b7fb41b..e32031b 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,13 @@
{
"name": "upscayl",
"private": true,
- "version": "2.9.1",
+ "version": "2.9.3",
"productName": "Upscayl",
+ "author": {
+ "name": "Nayam Amarshe",
+ "email": "nayam.emikx@aleeas.com",
+ "url": "https://github.com/NayamAmarshe"
+ },
"homepage": "https://github.com/TGS963/upscayl",
"contributors": [
{
@@ -49,7 +54,8 @@
"dist:pkg": "tsc && npm run build && cross-env DEBUG=* electron-builder build -m pkg",
"dist:mac": "tsc && npm run build && electron-builder --mac --universal",
"dist:mac-arm64": "tsc && npm run build && electron-builder --mac --arm64",
- "dist:mac-mas": "tsc && npm run build && electron-builder --mac mas --universal",
+ "dist:mas": "tsc && npm run build && electron-builder --mac mas --universal",
+ "dist:mas-dev": "tsc && npm run build && electron-builder --mac mas-dev --universal -c mas-dev.json",
"dist:win": "tsc && npm run build && electron-builder --win",
"dist:linux": "tsc && npm run build && electron-builder --linux",
"publish-app": "tsc && npm run build && electron-builder -wlm --publish always",
@@ -66,6 +72,7 @@
"artifactName": "${name}-${version}-${os}.${ext}",
"afterSign": "./notarize.js",
"asar": true,
+ "buildVersion": "23.11.3",
"asarUnpack": [
"**/node_modules/sharp/**/*"
],
@@ -99,7 +106,9 @@
],
"mas": {
"hardenedRuntime": false,
- "type": "distribution",
+ "electronLanguages": [
+ "en"
+ ],
"category": "public.app-category.photography",
"entitlements": "resources/entitlements.mas.plist",
"entitlementsInherit": "resources/entitlements.mas.inherit.plist",
@@ -123,6 +132,7 @@
"gatekeeperAssess": false,
"entitlements": "resources/entitlements.mac.plist",
"entitlementsInherit": "resources/entitlements.mac.plist",
+ "provisioningProfile": "embedded.provisionprofile",
"mergeASARs": false,
"target": [
{
diff --git a/renderer/components/settings-tab/index.tsx b/renderer/components/settings-tab/index.tsx
index 5e1ce1c..304408b 100644
--- a/renderer/components/settings-tab/index.tsx
+++ b/renderer/components/settings-tab/index.tsx
@@ -245,19 +245,23 @@ function SettingsTab({
{/* RESET SETTINGS */}
Step 3
-- Defaults to {!batchMode ? "Image's" : "Folder's"} path -
++ Defaults to {!batchMode ? "Image's" : "Folder's"} path +
+ )} @@ -263,7 +275,7 @@ function LeftPaneImageSteps({ diff --git a/renderer/pages/index.tsx b/renderer/pages/index.tsx index b7bf9cf..3ef8e82 100644 --- a/renderer/pages/index.tsx +++ b/renderer/pages/index.tsx @@ -292,7 +292,9 @@ const Home = () => { SetImagePath(path); var dirname = path.match(/(.*)[\/\\]/)[1] || ""; logit("π Selected Image Directory: ", dirname); - setOutputPath(dirname); + if (!featureFlags.APP_STORE_BUILD) { + setOutputPath(dirname); + } } }; @@ -495,17 +497,19 @@ const Home = () => { return (