From 2ee6a2c09f9719399b0d0dab5f7f01d2117171f6 Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Fri, 19 Jun 2026 06:03:53 +0100 Subject: [PATCH] Repo boundary breach detection on import normalise --- src/LiveSyncBaseCore.ts | 36 +++++++++++++++++----------------- src/deps.ts | 2 +- src/main.ts | 2 +- src/types.ts | 2 +- utilsdeno/normalise-imports.ts | 18 +++++++++++------ 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/LiveSyncBaseCore.ts b/src/LiveSyncBaseCore.ts index 301b143..ca4f6a2 100644 --- a/src/LiveSyncBaseCore.ts +++ b/src/LiveSyncBaseCore.ts @@ -1,22 +1,22 @@ import { LOG_LEVEL_INFO } from "octagonal-wheels/common/logger"; import type PouchDB from "pouchdb-core"; import type { SimpleStore } from "octagonal-wheels/databases/SimpleStoreBase"; -import type { HasSettings, ObsidianLiveSyncSettings, EntryDoc } from "./lib/src/common/types"; -import { __$checkInstanceBinding } from "./lib/src/dev/checks"; -import type { Confirm } from "./lib/src/interfaces/Confirm"; -import type { DatabaseFileAccess } from "./lib/src/interfaces/DatabaseFileAccess"; -import type { Rebuilder } from "./lib/src/interfaces/DatabaseRebuilder"; -import type { IFileHandler } from "./lib/src/interfaces/FileHandler"; -import type { StorageAccess } from "./lib/src/interfaces/StorageAccess"; -import type { LiveSyncLocalDBEnv } from "./lib/src/pouchdb/LiveSyncLocalDB"; -import type { LiveSyncCouchDBReplicatorEnv } from "./lib/src/replication/couchdb/LiveSyncReplicator"; -import type { CheckPointInfo } from "./lib/src/replication/journal/JournalSyncTypes"; -import type { LiveSyncJournalReplicatorEnv } from "./lib/src/replication/journal/LiveSyncJournalReplicatorEnv"; -import type { LiveSyncReplicatorEnv } from "./lib/src/replication/LiveSyncAbstractReplicator"; -import { useTargetFilters } from "./lib/src/serviceFeatures/targetFilter"; -import { useRemoteConfigurationMigration } from "./lib/src/serviceFeatures/remoteConfig"; -import type { ServiceContext } from "./lib/src/services/base/ServiceBase"; -import type { InjectableServiceHub } from "./lib/src/services/InjectableServices"; +import type { HasSettings, ObsidianLiveSyncSettings, EntryDoc } from "@lib/common/types"; +import { __$checkInstanceBinding } from "@lib/dev/checks"; +import type { Confirm } from "@lib/interfaces/Confirm"; +import type { DatabaseFileAccess } from "@lib/interfaces/DatabaseFileAccess"; +import type { Rebuilder } from "@lib/interfaces/DatabaseRebuilder"; +import type { IFileHandler } from "@lib/interfaces/FileHandler"; +import type { StorageAccess } from "@lib/interfaces/StorageAccess"; +import type { LiveSyncLocalDBEnv } from "@lib/pouchdb/LiveSyncLocalDB"; +import type { LiveSyncCouchDBReplicatorEnv } from "@lib/replication/couchdb/LiveSyncReplicator"; +import type { CheckPointInfo } from "@lib/replication/journal/JournalSyncTypes"; +import type { LiveSyncJournalReplicatorEnv } from "@lib/replication/journal/LiveSyncJournalReplicatorEnv"; +import type { LiveSyncReplicatorEnv } from "@lib/replication/LiveSyncAbstractReplicator"; +import { useTargetFilters } from "@lib/serviceFeatures/targetFilter"; +import { useRemoteConfigurationMigration } from "@lib/serviceFeatures/remoteConfig"; +import type { ServiceContext } from "@lib/services/base/ServiceBase"; +import type { InjectableServiceHub } from "@lib/services/InjectableServices"; import { AbstractModule } from "./modules/AbstractModule"; import { ModulePeriodicProcess } from "./modules/core/ModulePeriodicProcess"; import { ModuleReplicator } from "./modules/core/ModuleReplicator"; @@ -26,9 +26,9 @@ import { ModuleConflictChecker } from "./modules/coreFeatures/ModuleConflictChec import { ModuleConflictResolver } from "./modules/coreFeatures/ModuleConflictResolver"; import { ModuleResolvingMismatchedTweaks } from "./modules/coreFeatures/ModuleResolveMismatchedTweaks"; import { ModuleLiveSyncMain } from "./modules/main/ModuleLiveSyncMain"; -import type { ServiceModules } from "./lib/src/interfaces/ServiceModule"; +import type { ServiceModules } from "@lib/interfaces/ServiceModule"; import { ModuleBasicMenu } from "./modules/essential/ModuleBasicMenu"; -import { usePrepareDatabaseForUse } from "./lib/src/serviceFeatures/prepareDatabaseForUse"; +import { usePrepareDatabaseForUse } from "@lib/serviceFeatures/prepareDatabaseForUse"; import type { Constructor } from "@lib/common/utils.type"; export class LiveSyncBaseCore< diff --git a/src/deps.ts b/src/deps.ts index bc1414e..a81cf0c 100644 --- a/src/deps.ts +++ b/src/deps.ts @@ -1,4 +1,4 @@ -import { type FilePath } from "./lib/src/common/types.ts"; +import { type FilePath } from "@lib/common/types.ts"; export { addIcon, diff --git a/src/main.ts b/src/main.ts index d02a208..705e0ab 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,5 @@ import { getLanguage, Notice, Plugin, type App, type PluginManifest } from "./deps"; -import { setGetLanguage } from "./lib/src/common/coreEnvFunctions.ts"; +import { setGetLanguage } from "@lib/common/coreEnvFunctions.ts"; setGetLanguage(getLanguage); import { LiveSyncCommands } from "./features/LiveSyncCommands.ts"; import { HiddenFileSync } from "./features/HiddenFileSync/CmdHiddenFileSync.ts"; diff --git a/src/types.ts b/src/types.ts index cf404e2..b4c40bf 100644 --- a/src/types.ts +++ b/src/types.ts @@ -2,7 +2,7 @@ import type { DatabaseFileAccess } from "@lib/interfaces/DatabaseFileAccess"; import type { Rebuilder } from "@lib/interfaces/DatabaseRebuilder"; import type { IFileHandler } from "@lib/interfaces/FileHandler"; import type { StorageAccess } from "@lib/interfaces/StorageAccess"; -import type { IServiceHub } from "./lib/src/services/base/IService"; +import type { IServiceHub } from "@lib/services/base/IService"; export interface ServiceModules { storageAccess: StorageAccess; diff --git a/utilsdeno/normalise-imports.ts b/utilsdeno/normalise-imports.ts index 1fb51b0..11c3d15 100644 --- a/utilsdeno/normalise-imports.ts +++ b/utilsdeno/normalise-imports.ts @@ -40,6 +40,7 @@ function toPosixPath(filePath: string): string { const posixProjectRoot = toPosixPath(projectRoot); const posixSrc = `${posixProjectRoot}/src`; const posixLibSrc = `${posixProjectRoot}/src/lib/src`; +const posixSubrepo = `${posixProjectRoot}/src/lib`; console.log(`Project Root: ${posixProjectRoot}`); console.log(`Source Directory: ${posixSrc}`); @@ -93,12 +94,6 @@ for (const sourceFile of project.getSourceFiles()) { continue; } - // Keep relative sibling/child imports unchanged (e.g. ./utils) unless --all-alias is set. - const isSibling = isRelative && !moduleSpecifier.startsWith(".."); - if (isSibling && !allAlias) { - continue; - } - // Resolve path to an absolute POSIX path. let resolvedPath = ""; if (moduleSpecifier.startsWith("@lib/")) { @@ -112,6 +107,17 @@ for (const sourceFile of project.getSourceFiles()) { resolvedPath = toPosixPath(path.normalize(resolvedPath)); + // Keep relative sibling/child imports unchanged (e.g. ./utils) unless: + // 1. --all-alias is set, OR + // 2. the import crosses the subrepository boundary (src/lib/) + const isSibling = isRelative && !moduleSpecifier.startsWith(".."); + const importerInsideSubrepo = posixFilePath.startsWith(posixSubrepo + "/"); + const targetInsideSubrepo = resolvedPath.startsWith(posixSubrepo + "/"); + const crossesSubrepo = importerInsideSubrepo !== targetInsideSubrepo; + if (isSibling && !allAlias && !crossesSubrepo) { + continue; + } + // Determine correct normalised specifier. let newSpecifier = ""; const hasExtension =