From 7ec769268c6a5082add59bc2e58379538b1a2764 Mon Sep 17 00:00:00 2001 From: Kacper Kula Date: Thu, 9 Jan 2025 12:32:24 +0000 Subject: [PATCH] feat: organising project --- esbuild.config.mjs | 4 +- .../CodeblockProcessor.ts} | 37 ++++---------- .../SqlSealCodeblockHandler.ts | 31 ++++++++++++ src/{ => database}/database.ts | 5 +- .../worker/database.ts} | 8 +-- .../repository/abstractRepository.ts | 2 +- src/datamodel/sync.ts | 4 +- main.ts => src/main.ts | 10 ++-- src/renderer/GridRenderer.ts | 4 +- src/renderer/MarkdownRenderer.ts | 4 +- src/renderer/TableRenderer.ts | 4 +- src/{ => renderer}/rendererRegistry.ts | 0 src/sqlSeal.ts | 8 +-- src/{ => utils}/logger.ts | 0 .../typePredictions.test.ts} | 3 +- src/{utils.ts => utils/typePredictions.ts} | 49 ------------------- src/{ => utils}/ui.ts | 3 -- src/{ => vaultSync}/SealFileSync.ts | 8 +-- .../tables}/abstractFileSyncTable.ts | 2 +- .../tables}/filesTable.ts | 4 +- .../tables}/tagsTable.ts | 0 .../tables}/tasksTable.ts | 0 22 files changed, 74 insertions(+), 116 deletions(-) rename src/{SqlSealCodeblockHandler.ts => codeblockHandler/CodeblockProcessor.ts} (72%) create mode 100644 src/codeblockHandler/SqlSealCodeblockHandler.ts rename src/{ => database}/database.ts (96%) rename src/{database-worker.ts => database/worker/database.ts} (95%) rename main.ts => src/main.ts (93%) rename src/{ => renderer}/rendererRegistry.ts (100%) rename src/{ => utils}/logger.ts (100%) rename src/{utils.unit.test.ts => utils/typePredictions.test.ts} (89%) rename src/{utils.ts => utils/typePredictions.ts} (60%) rename src/{ => utils}/ui.ts (96%) rename src/{ => vaultSync}/SealFileSync.ts (93%) rename src/{fileSyncTable => vaultSync/tables}/abstractFileSyncTable.ts (90%) rename src/{fileSyncTable => vaultSync/tables}/filesTable.ts (95%) rename src/{fileSyncTable => vaultSync/tables}/tagsTable.ts (100%) rename src/{fileSyncTable => vaultSync/tables}/tasksTable.ts (100%) diff --git a/esbuild.config.mjs b/esbuild.config.mjs index c8c6577..775d0b8 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -51,7 +51,7 @@ const workerPlugin = { build.onLoad({ filter: /.*/, namespace: 'worker-code' }, async () => { // Build worker code const result = await esbuild.build({ - entryPoints: ['src/database-worker.ts'], + entryPoints: ['src/database/worker/database.ts'], bundle: true, write: false, format: 'iife', @@ -83,7 +83,7 @@ const context = await esbuild.context({ banner: { js: banner, }, - entryPoints: ["main.ts"], + entryPoints: ["src/main.ts"], bundle: true, external: [ "obsidian", diff --git a/src/SqlSealCodeblockHandler.ts b/src/codeblockHandler/CodeblockProcessor.ts similarity index 72% rename from src/SqlSealCodeblockHandler.ts rename to src/codeblockHandler/CodeblockProcessor.ts index 3919c6e..69900f8 100644 --- a/src/SqlSealCodeblockHandler.ts +++ b/src/codeblockHandler/CodeblockProcessor.ts @@ -1,14 +1,13 @@ -import { App, MarkdownPostProcessorContext, MarkdownRenderChild, normalizePath, Vault } from "obsidian" -import { displayError, displayNotice } from "./ui" -import { SqlSealDatabase } from "./database" -import { Logger } from "./logger" -import { parseLanguage, Table } from "./grammar/newParser" -import { RendererRegistry, RenderReturn } from "./rendererRegistry" -import { Sync } from "./datamodel/sync" -import { OmnibusRegistrator } from "@hypersphere/omnibus" -import { transformQuery } from "./datamodel/transformer" +import { OmnibusRegistrator } from "@hypersphere/omnibus"; +import { App, MarkdownPostProcessorContext, MarkdownRenderChild } from "obsidian"; +import { SqlSealDatabase } from "src/database/database"; +import { Sync } from "src/datamodel/sync"; +import { transformQuery } from "src/datamodel/transformer"; +import { parseLanguage, Table } from "src/grammar/newParser"; +import { RendererRegistry, RenderReturn } from "src/renderer/rendererRegistry"; +import { displayError, displayNotice } from "src/utils/ui"; -class CodeblockProcessor extends MarkdownRenderChild { +export class CodeblockProcessor extends MarkdownRenderChild { registrator: OmnibusRegistrator renderer: RenderReturn @@ -95,22 +94,4 @@ class CodeblockProcessor extends MarkdownRenderChild { }) })) } -} - - -export class SqlSealCodeblockHandler { - constructor( - private readonly app: App, - private readonly db: SqlSealDatabase, - private sync: Sync, - private rendererRegistry: RendererRegistry - ) { - } - - getHandler() { - return async (source: string, el: HTMLElement, ctx: MarkdownPostProcessorContext) => { - const processor = new CodeblockProcessor(el, source, ctx, this.rendererRegistry, this.db, this.app, this.sync) - ctx.addChild(processor) - } - } } \ No newline at end of file diff --git a/src/codeblockHandler/SqlSealCodeblockHandler.ts b/src/codeblockHandler/SqlSealCodeblockHandler.ts new file mode 100644 index 0000000..c955926 --- /dev/null +++ b/src/codeblockHandler/SqlSealCodeblockHandler.ts @@ -0,0 +1,31 @@ +import { App, MarkdownPostProcessorContext } from "obsidian" +import { SqlSealDatabase } from "../database/database" +import { RendererRegistry } from "../renderer/rendererRegistry" +import { Sync } from "../datamodel/sync" +import { CodeblockProcessor } from "./CodeblockProcessor" + + +export class SqlSealCodeblockHandler { + constructor( + private readonly app: App, + private readonly db: SqlSealDatabase, + private sync: Sync, + private rendererRegistry: RendererRegistry + ) { + } + + getHandler() { + return async (source: string, el: HTMLElement, ctx: MarkdownPostProcessorContext) => { + const processor = new CodeblockProcessor( + el, + source, + ctx, + this.rendererRegistry, + this.db, + this.app, + this.sync + ) + ctx.addChild(processor) + } + } +} \ No newline at end of file diff --git a/src/database.ts b/src/database/database.ts similarity index 96% rename from src/database.ts rename to src/database/database.ts index 46f5d64..eb3868f 100644 --- a/src/database.ts +++ b/src/database/database.ts @@ -1,9 +1,8 @@ import { App } from "obsidian" -import { FieldTypes, toTypeStatements } from "./utils" +import { FieldTypes, toTypeStatements } from "../utils/typePredictions" import * as Comlink from 'comlink' import workerCode from 'virtual:worker-code' -import { WorkerDatabase } from "./database-worker" - +import { WorkerDatabase } from "./worker/database"; export interface FieldDefinition { name: string; diff --git a/src/database-worker.ts b/src/database/worker/database.ts similarity index 95% rename from src/database-worker.ts rename to src/database/worker/database.ts index c04d7b8..5ddcf37 100644 --- a/src/database-worker.ts +++ b/src/database/worker/database.ts @@ -1,11 +1,11 @@ import * as Comlink from "comlink" import initSqlJs from '@jlongster/sql.js'; -import wasmBinary from '../node_modules/@jlongster/sql.js/dist/sql-wasm.wasm' +import wasmBinary from '../../../node_modules/@jlongster/sql.js/dist/sql-wasm.wasm' import { SQLiteFS } from 'absurd-sql'; -import IndexedDBBackend from '../node_modules/absurd-sql/dist/indexeddb-backend.js'; +import IndexedDBBackend from '../../../node_modules/absurd-sql/dist/indexeddb-backend.js'; import type { BindParams, Database, Statement } from "sql.js"; -import { sanitise } from "./utils/sanitiseColumn"; -import { FieldTypes } from "./utils"; +import { sanitise } from "../../utils/sanitiseColumn"; +import { FieldTypes } from "../../utils/typePredictions"; function toObjectArray(stmt: Statement) { diff --git a/src/datamodel/repository/abstractRepository.ts b/src/datamodel/repository/abstractRepository.ts index a38132a..b60ed6b 100644 --- a/src/datamodel/repository/abstractRepository.ts +++ b/src/datamodel/repository/abstractRepository.ts @@ -1,4 +1,4 @@ -import { SqlSealDatabase } from "src/database"; +import { SqlSealDatabase } from "src/database/database"; export abstract class Repository { constructor(protected readonly db: SqlSealDatabase) { } diff --git a/src/datamodel/sync.ts b/src/datamodel/sync.ts index 0b155b9..b483511 100644 --- a/src/datamodel/sync.ts +++ b/src/datamodel/sync.ts @@ -1,10 +1,10 @@ -import { SqlSealDatabase } from "src/database"; +import { SqlSealDatabase } from "src/database/database"; import { FileLog, FileLogRepository } from "./repository/fileLog"; import { TableMapLogRepository } from "./repository/tableMapLog"; import { TAbstractFile, TFile, Vault } from "obsidian"; import { parse } from "papaparse"; import { sanitise } from "src/utils/sanitiseColumn"; -import { FieldTypes, toTypeStatements } from "src/utils"; +import { FieldTypes, toTypeStatements } from "src/utils/typePredictions"; import { FilepathHasher } from "./hasher"; import { Omnibus } from "@hypersphere/omnibus"; diff --git a/main.ts b/src/main.ts similarity index 93% rename from main.ts rename to src/main.ts index b75b588..67cc3f5 100644 --- a/main.ts +++ b/src/main.ts @@ -1,14 +1,14 @@ import { Menu, Plugin, TAbstractFile, Tasks, TFile } from 'obsidian'; -import { FilesFileSyncTable } from 'src/fileSyncTable/filesTable'; -import { TagsFileSyncTable } from 'src/fileSyncTable/tagsTable'; -import { TasksFileSyncTable } from 'src/fileSyncTable/tasksTable'; import { GridRenderer } from 'src/renderer/GridRenderer'; import { MarkdownRenderer } from 'src/renderer/MarkdownRenderer'; import { TableRenderer } from 'src/renderer/TableRenderer'; -import { RendererConfig, RendererRegistry } from 'src/rendererRegistry'; -import { SealFileSync } from 'src/SealFileSync'; +import { RendererConfig, RendererRegistry } from 'src/renderer/rendererRegistry'; import { DEFAULT_SETTINGS, SQLSealSettings, SQLSealSettingsTab } from 'src/settings/SQLSealSettingsTab'; import { SqlSeal } from 'src/sqlSeal'; +import { SealFileSync } from 'src/vaultSync/SealFileSync'; +import { FilesFileSyncTable } from 'src/vaultSync/tables/filesTable'; +import { TagsFileSyncTable } from 'src/vaultSync/tables/tagsTable'; +import { TasksFileSyncTable } from 'src/vaultSync/tables/tasksTable'; import { CSV_VIEW_TYPE, CSVView } from 'src/view/CSVView'; const GLOBAL_KEY = 'sqlSealApi' diff --git a/src/renderer/GridRenderer.ts b/src/renderer/GridRenderer.ts index 26ba3e4..275b330 100644 --- a/src/renderer/GridRenderer.ts +++ b/src/renderer/GridRenderer.ts @@ -1,9 +1,9 @@ import { createGrid, GridApi, GridOptions, themeQuartz } from "ag-grid-community"; import { merge } from "lodash"; import { App } from "obsidian"; -import { RendererConfig } from "src/rendererRegistry"; +import { RendererConfig } from "src/renderer/rendererRegistry"; import { parse } from 'json5' -import { displayError, displayNotice, parseCell } from "src/ui"; +import { parseCell } from "src/utils/ui"; const getCurrentTheme = () => { return document.body.classList.contains('theme-dark') ? 'dark' : 'light'; diff --git a/src/renderer/MarkdownRenderer.ts b/src/renderer/MarkdownRenderer.ts index 63d5b38..fc28f81 100644 --- a/src/renderer/MarkdownRenderer.ts +++ b/src/renderer/MarkdownRenderer.ts @@ -1,8 +1,8 @@ // This is renderer for a very basic Table view. import { getMarkdownTable } from "markdown-table-ts"; import { App } from "obsidian"; -import { RendererConfig } from "src/rendererRegistry"; -import { displayError, parseCell } from "src/ui"; +import { RendererConfig } from "src/renderer/rendererRegistry"; +import { displayError, parseCell } from "src/utils/ui"; const mapDataFromHeaders = (columns: string[], data: Record[]) => { return data.map(d => columns.map(c => String(d[c]))) diff --git a/src/renderer/TableRenderer.ts b/src/renderer/TableRenderer.ts index a761cb5..cdfe022 100644 --- a/src/renderer/TableRenderer.ts +++ b/src/renderer/TableRenderer.ts @@ -1,7 +1,7 @@ // This is renderer for a very basic Table view. import { App } from "obsidian"; -import { RendererConfig } from "src/rendererRegistry"; -import { displayError, parseCell } from "src/ui"; +import { RendererConfig } from "src/renderer/rendererRegistry"; +import { displayError, parseCell } from "src/utils/ui"; export class TableRenderer implements RendererConfig { diff --git a/src/rendererRegistry.ts b/src/renderer/rendererRegistry.ts similarity index 100% rename from src/rendererRegistry.ts rename to src/renderer/rendererRegistry.ts diff --git a/src/sqlSeal.ts b/src/sqlSeal.ts index 6788321..a83e3d6 100644 --- a/src/sqlSeal.ts +++ b/src/sqlSeal.ts @@ -1,8 +1,8 @@ -import { SqlSealDatabase } from "./database"; +import { SqlSealDatabase } from "./database/database"; import { App } from "obsidian"; -import { SqlSealCodeblockHandler } from "./SqlSealCodeblockHandler"; -import { Logger } from "./logger"; -import { RendererRegistry } from "./rendererRegistry"; +import { SqlSealCodeblockHandler } from "./codeblockHandler/SqlSealCodeblockHandler"; +import { Logger } from "./utils/logger"; +import { RendererRegistry } from "./renderer/rendererRegistry"; import { Sync } from "./datamodel/sync"; export class SqlSeal { diff --git a/src/logger.ts b/src/utils/logger.ts similarity index 100% rename from src/logger.ts rename to src/utils/logger.ts diff --git a/src/utils.unit.test.ts b/src/utils/typePredictions.test.ts similarity index 89% rename from src/utils.unit.test.ts rename to src/utils/typePredictions.test.ts index b70b363..99a96e0 100644 --- a/src/utils.unit.test.ts +++ b/src/utils/typePredictions.test.ts @@ -1,8 +1,7 @@ import { describe, it, expect } from '@jest/globals' -import { predictJson, predictType } from './utils' +import { predictJson, predictType } from './typePredictions' describe('Utils', () => { - it('should properly predict TEXT type', () => { expect(predictType('xxx', [{ 'xxx': 'dhjkafhkjafhkfas' }])).toEqual('TEXT') }) diff --git a/src/utils.ts b/src/utils/typePredictions.ts similarity index 60% rename from src/utils.ts rename to src/utils/typePredictions.ts index cbe6a32..16b19a0 100644 --- a/src/utils.ts +++ b/src/utils/typePredictions.ts @@ -1,56 +1,7 @@ -import { get } from "https" import { parse } from 'json5' -import * as fs from 'fs' import { camelCase } from "lodash"; -export const fetchBlobData = async (url: string, filePath: string) => { - return new Promise((resolve, reject) => { - get(url, (response) => { - const statusCode = response.statusCode; - const contentType = response.headers['content-type']; - - let error; - if (statusCode === 301 || statusCode === 302) { - // Handle redirect - const redirectUrl = response.headers.location; - if (!redirectUrl) { - reject('Redirect URL not found') - return; - } - fetchBlobData(redirectUrl, filePath).then(resolve).catch(reject); - return; - } - if (statusCode !== 200) { - error = new Error(`Request Failed. Status Code: ${statusCode}`); - } else if (!/^application\/octet-stream/.test(contentType ?? '')) { - error = new Error(`Invalid content-type. Expected application/octet-stream but received ${contentType}`); - } - if (error) { - console.error(error.message); - // Consume response data to free up memory - response.resume(); - return; - } - - const fileStream = fs.createWriteStream(filePath); - response.pipe(fileStream); - - fileStream.on('finish', () => { - resolve() - fileStream.close() - }); - - fileStream.on('error', (err) => { - console.error(`Error writing to ${filePath}: ${err}`); - reject(`Error writing to ${filePath}: ${err}`) - }); - }).on('error', (err) => { - console.error(`Error fetching blob data: ${err.message}`); - reject(`Error writing to ${filePath}: ${err}`) - }); - }) - }; export const predictType = (field: string, data: Array>) => { if (field === 'id') { diff --git a/src/ui.ts b/src/utils/ui.ts similarity index 96% rename from src/ui.ts rename to src/utils/ui.ts index 1a32ab4..2e6675c 100644 --- a/src/ui.ts +++ b/src/utils/ui.ts @@ -1,6 +1,4 @@ import { App } from "obsidian" -import { createGrid, GridOptions } from 'ag-grid-community'; -import { themeQuartz } from '@ag-grid-community/theming'; export const displayNotice = (el: HTMLElement, text: string) => { el.empty() @@ -51,7 +49,6 @@ const generateLink = (config: SqlSealAnchorElement, app: App) => { link.addEventListener('click', (event) => { event.preventDefault(); - // Open the file in the active leaf (same tab) const leaf = app.workspace.getLeaf(); const file = app.vault.getFileByPath(config.href) diff --git a/src/SealFileSync.ts b/src/vaultSync/SealFileSync.ts similarity index 93% rename from src/SealFileSync.ts rename to src/vaultSync/SealFileSync.ts index 78e31aa..7a0ac13 100644 --- a/src/SealFileSync.ts +++ b/src/vaultSync/SealFileSync.ts @@ -1,7 +1,7 @@ -import { App, Plugin, TAbstractFile, TFile } from "obsidian"; -import { FieldTypes } from "./utils"; -import { sanitise } from "./utils/sanitiseColumn"; -import { AFileSyncTable } from "./fileSyncTable/abstractFileSyncTable"; +import { App, Plugin, TFile } from "obsidian"; +import { FieldTypes } from "src/utils/typePredictions"; +import { sanitise } from "src/utils/sanitiseColumn"; +import { AFileSyncTable } from "./tables/abstractFileSyncTable"; const extractFrontmatterFromFile = async (file: TFile, plugin: Plugin) => { const frontmatter = plugin.app.metadataCache.getFileCache(file)?.frontmatter || {} diff --git a/src/fileSyncTable/abstractFileSyncTable.ts b/src/vaultSync/tables/abstractFileSyncTable.ts similarity index 90% rename from src/fileSyncTable/abstractFileSyncTable.ts rename to src/vaultSync/tables/abstractFileSyncTable.ts index 4d3fedf..71d9ccc 100644 --- a/src/fileSyncTable/abstractFileSyncTable.ts +++ b/src/vaultSync/tables/abstractFileSyncTable.ts @@ -1,5 +1,5 @@ import { App, TFile } from "obsidian"; -import { SqlSealDatabase } from "src/database"; +import { SqlSealDatabase } from "src/database/database"; export abstract class AFileSyncTable { constructor( diff --git a/src/fileSyncTable/filesTable.ts b/src/vaultSync/tables/filesTable.ts similarity index 95% rename from src/fileSyncTable/filesTable.ts rename to src/vaultSync/tables/filesTable.ts index 2d6384f..e8e1dd9 100644 --- a/src/fileSyncTable/filesTable.ts +++ b/src/vaultSync/tables/filesTable.ts @@ -1,8 +1,8 @@ import { App, Plugin, TAbstractFile, TFile } from "obsidian"; import { AFileSyncTable } from "./abstractFileSyncTable"; import { sanitise } from "src/utils/sanitiseColumn"; -import { SqlSealDatabase } from "src/database"; -import { predictType } from "src/utils"; +import { SqlSealDatabase } from "src/database/database"; +import { predictType } from "src/utils/typePredictions"; const extractFrontmatterFromFile = async (file: TFile, plugin: Plugin) => { diff --git a/src/fileSyncTable/tagsTable.ts b/src/vaultSync/tables/tagsTable.ts similarity index 100% rename from src/fileSyncTable/tagsTable.ts rename to src/vaultSync/tables/tagsTable.ts diff --git a/src/fileSyncTable/tasksTable.ts b/src/vaultSync/tables/tasksTable.ts similarity index 100% rename from src/fileSyncTable/tasksTable.ts rename to src/vaultSync/tables/tasksTable.ts