mirror of
https://github.com/zadam/trilium.git
synced 2025-10-26 07:46:30 +01:00
Compare commits
8 Commits
74a805056b
...
fix/resolv
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac73d4c47a | ||
|
|
e4006a83f2 | ||
|
|
5782f93824 | ||
|
|
c76e265b67 | ||
|
|
fefcd9457f | ||
|
|
72a779e695 | ||
|
|
f6c27f458a | ||
|
|
adfaa8b12c |
@@ -37,7 +37,10 @@ const config: ForgeConfig = {
|
||||
executableName: EXECUTABLE_NAME,
|
||||
name: PRODUCT_NAME,
|
||||
overwrite: true,
|
||||
asar: true,
|
||||
asar: {
|
||||
unpack: "node_modules/swagger-ui-dist/**",
|
||||
unpackDir: "assets"
|
||||
},
|
||||
icon: path.join(APP_ICON_PATH, "icon"),
|
||||
...macosSignConfiguration,
|
||||
windowsSign: windowsSignConfiguration,
|
||||
|
||||
@@ -3,16 +3,102 @@ import swaggerUi from "swagger-ui-express";
|
||||
import { join } from "path";
|
||||
import yaml from "js-yaml";
|
||||
import type { JsonObject } from "swagger-ui-express";
|
||||
import { readFileSync } from "fs";
|
||||
import { readFileSync, existsSync, readdirSync } from "fs";
|
||||
import { RESOURCE_DIR } from "../services/resource_dir";
|
||||
import log from "../services/log";
|
||||
|
||||
// Monkey patch fs.lstat to debug which files are causing the issue
|
||||
const originalFs = require('fs');
|
||||
const originalLstat = originalFs.lstat;
|
||||
originalFs.lstat = function(path: string, callback: any) {
|
||||
log.info(`[FS DEBUG] lstat called on: ${path}`);
|
||||
return originalLstat.call(this, path, (err: any, stats: any) => {
|
||||
if (err) {
|
||||
log.error(`[FS DEBUG] lstat error on ${path}: ${err.message}`);
|
||||
}
|
||||
callback(err, stats);
|
||||
});
|
||||
};
|
||||
|
||||
export default function register(app: Application) {
|
||||
const etapiDocument = yaml.load(readFileSync(join(RESOURCE_DIR, "etapi.openapi.yaml"), "utf8")) as JsonObject;
|
||||
const apiDocument = JSON.parse(readFileSync(join(RESOURCE_DIR, "openapi.json"), "utf-8"));
|
||||
log.info(`[DEBUG] Starting API docs registration`);
|
||||
log.info(`[DEBUG] RESOURCE_DIR: ${RESOURCE_DIR}`);
|
||||
|
||||
// Clean trailing slashes from RESOURCE_DIR to prevent path resolution issues in packaged Electron apps
|
||||
const cleanResourceDir = RESOURCE_DIR.replace(/[\\\/]+$/, '');
|
||||
log.info(`[DEBUG] cleanResourceDir: ${cleanResourceDir}`);
|
||||
|
||||
// Check what's in the resource directory
|
||||
try {
|
||||
if (existsSync(cleanResourceDir)) {
|
||||
const contents = readdirSync(cleanResourceDir);
|
||||
log.info(`[DEBUG] Contents of ${cleanResourceDir}: ${contents.join(', ')}`);
|
||||
} else {
|
||||
log.info(`[DEBUG] Resource directory doesn't exist: ${cleanResourceDir}`);
|
||||
}
|
||||
} catch (e) {
|
||||
log.error(`[DEBUG] Error reading resource directory: ${e}`);
|
||||
}
|
||||
|
||||
// In packaged Electron apps, check if we need to read from the unpacked directory
|
||||
let resourceDir = cleanResourceDir;
|
||||
if (resourceDir.includes('app.asar')) {
|
||||
log.info(`[DEBUG] Detected ASAR packaging`);
|
||||
const unpackedDir = cleanResourceDir.replace('app.asar', 'app.asar.unpacked');
|
||||
log.info(`[DEBUG] Checking unpacked dir: ${unpackedDir}`);
|
||||
|
||||
// Check what's in the unpacked directory
|
||||
try {
|
||||
if (existsSync(unpackedDir)) {
|
||||
const unpackedContents = readdirSync(unpackedDir);
|
||||
log.info(`[DEBUG] Contents of unpacked dir: ${unpackedContents.join(', ')}`);
|
||||
if (existsSync(join(unpackedDir, "etapi.openapi.yaml"))) {
|
||||
resourceDir = unpackedDir;
|
||||
log.info(`[DEBUG] Using unpacked directory: ${resourceDir}`);
|
||||
}
|
||||
} else {
|
||||
log.info(`[DEBUG] Unpacked directory doesn't exist: ${unpackedDir}`);
|
||||
}
|
||||
} catch (e) {
|
||||
log.error(`[DEBUG] Error checking unpacked directory: ${e}`);
|
||||
}
|
||||
}
|
||||
|
||||
log.info(`[DEBUG] Final resourceDir: ${resourceDir}`);
|
||||
log.info(`[DEBUG] About to load OpenAPI specs...`);
|
||||
|
||||
const etapiDocument = yaml.load(readFileSync(join(resourceDir, "etapi.openapi.yaml"), "utf8")) as JsonObject;
|
||||
const apiDocument = JSON.parse(readFileSync(join(resourceDir, "openapi.json"), "utf-8"));
|
||||
|
||||
log.info(`[DEBUG] Successfully loaded OpenAPI documents`);
|
||||
log.info(`[DEBUG] About to register swagger-ui endpoints...`);
|
||||
|
||||
// Check swagger-ui-dist location
|
||||
try {
|
||||
const swaggerPath = require.resolve('swagger-ui-dist/package.json');
|
||||
log.info(`[DEBUG] swagger-ui-dist package.json found at: ${swaggerPath}`);
|
||||
const swaggerDistPath = require.resolve('swagger-ui-dist');
|
||||
log.info(`[DEBUG] swagger-ui-dist main module at: ${swaggerDistPath}`);
|
||||
} catch (e) {
|
||||
log.error(`[DEBUG] Error finding swagger-ui-dist: ${e}`);
|
||||
}
|
||||
|
||||
app.use(
|
||||
"/etapi/docs/",
|
||||
swaggerUi.serveFiles(etapiDocument),
|
||||
(req, res, next) => {
|
||||
log.info(`[DEBUG] Request to /etapi/docs/: ${req.method} ${req.url}`);
|
||||
// Temporarily disable ASAR for swagger-ui file access
|
||||
const originalNoAsar = process.noAsar;
|
||||
process.noAsar = true;
|
||||
|
||||
// Restore ASAR setting after response
|
||||
res.on('finish', () => {
|
||||
process.noAsar = originalNoAsar;
|
||||
});
|
||||
|
||||
next();
|
||||
},
|
||||
swaggerUi.serve,
|
||||
swaggerUi.setup(etapiDocument, {
|
||||
explorer: true,
|
||||
customSiteTitle: "TriliumNext ETAPI Documentation"
|
||||
@@ -21,7 +107,19 @@ export default function register(app: Application) {
|
||||
|
||||
app.use(
|
||||
"/api/docs/",
|
||||
swaggerUi.serveFiles(apiDocument),
|
||||
(req, res, next) => {
|
||||
// Temporarily disable ASAR for swagger-ui file access
|
||||
const originalNoAsar = process.noAsar;
|
||||
process.noAsar = true;
|
||||
|
||||
// Restore ASAR setting after response
|
||||
res.on('finish', () => {
|
||||
process.noAsar = originalNoAsar;
|
||||
});
|
||||
|
||||
next();
|
||||
},
|
||||
swaggerUi.serve,
|
||||
swaggerUi.setup(apiDocument, {
|
||||
explorer: true,
|
||||
customSiteTitle: "TriliumNext Internal API Documentation"
|
||||
|
||||
Reference in New Issue
Block a user