fix: fixing issue with missing better-litesql3.node in prod build

This commit is contained in:
Kacper Kula 2024-08-10 16:28:16 +01:00
parent 4ef23584b0
commit 7000b44fa4
7 changed files with 3065 additions and 3289 deletions

View file

@ -2,11 +2,18 @@ import esbuild from "esbuild";
import process from "process";
import builtins from "builtin-modules";
import replacePlugin from "esbuild-plugin-replace-regex";
import fs from "fs";
const nodeFileBase64 = fs.readFileSync("node_modules/better-sqlite3/build/Release/better_sqlite3.node", { encoding: "base64" });
const patchStr = `
const libPath = app.vault.adapter.getFullPath(app.vault.configDir)
let addonBuffer;
if (!fs.existsSync(path.resolve(libPath, "plugins/sqlseal/better_sqlite3.node"))) {
addonBuffer = Buffer.from("${nodeFileBase64.replaceAll('"', '\\"')}", "base64");
fs.writeFileSync(path.resolve(libPath, "plugins/sqlseal/better_sqlite3.node"), addonBuffer);
}
addon = DEFAULT_ADDON || (DEFAULT_ADDON = require(path.resolve(libPath, "plugins/sqlseal/better_sqlite3.node")));
`
`;
const banner =
`/*
@ -18,45 +25,45 @@ if you want to view the source, please visit the github repository of this plugi
const prod = (process.argv[2] === "production");
const context = await esbuild.context({
banner: {
js: banner,
},
entryPoints: ["main.ts"],
bundle: true,
external: [
"obsidian",
"electron",
"@codemirror/autocomplete",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/search",
"@codemirror/state",
"@codemirror/view",
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtins],
format: "cjs",
target: "es2018",
logLevel: "info",
sourcemap: prod ? false : "inline",
treeShaking: true,
outfile: "main.js",
plugins: [
replacePlugin({
filter: /.*/,
patterns: [
[/addon\s=\sDEFAULT_ADDON\s\|\|\s\(DEFAULT_ADDON\s=\srequire.*;/, patchStr]
]
})
]
banner: {
js: banner,
},
entryPoints: ["main.ts"],
bundle: true,
external: [
"obsidian",
"electron",
"@codemirror/autocomplete",
"@codemirror/collab",
"@codemirror/commands",
"@codemirror/language",
"@codemirror/lint",
"@codemirror/search",
"@codemirror/state",
"@codemirror/view",
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtins],
format: "cjs",
target: "es2018",
logLevel: "info",
sourcemap: prod ? false : "inline",
treeShaking: true,
outfile: "main.js",
plugins: [
replacePlugin({
filter: /.*/,
patterns: [
[/addon\s=\sDEFAULT_ADDON\s\|\|\s\(DEFAULT_ADDON\s=\srequire.*;/, patchStr]
]
})
]
});
if (prod) {
await context.rebuild();
process.exit(0);
await context.rebuild();
process.exit(0);
} else {
await context.watch();
await context.watch();
}

517
package-lock.json generated

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@ import { App, normalizePath } from "obsidian"
import path from 'path'
import Papa from 'papaparse'
import { prefixedIfNotGlobal } from "./sqlReparseTables"
import fs from 'fs'
import { camelCase } from 'lodash'
import { fetchBlobData } from "./utils"
function isNumeric(str: string) {
@ -12,6 +12,13 @@ function isNumeric(str: string) {
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
}
function dataToCamelCase(data: Array<Record<string, unknown>>) {
return data.map(d => Object.keys(d).reduce((acc, k) => ({
...acc,
[camelCase(k)]: Array.isArray(d[k]) ? d[k].join(', ') : d[k]
}), {}))
}
const toTypeStatements = (header: Array<string>, data: Array<Record<string, string>>) => {
let d: Array<Record<string, string | number>> = data
@ -163,8 +170,13 @@ export class SqlSealDatabase {
return deleteMany(data)
}
insertData(name: string, data: Array<Record<string, unknown>>) {
insertData(name: string, inData: Array<Record<string, unknown>>) {
const data = dataToCamelCase(inData)
const fields = Object.keys(data.reduce((acc, obj) => ({ ...acc, ...obj }), {}));
// FIXME: reworking all fields to be camel case
if (!fields || !fields.length) {
return
}
const insert = this.db.prepare(`INSERT INTO ${name} (${fields.join(', ')}) VALUES (${fields.map((key: string) => '@' + key).join(', ')})`);
const insertMany = this.db.transaction((pData: Array<Record<string, any>>) => {
pData.forEach(data => {
@ -177,7 +189,7 @@ export class SqlSealDatabase {
})
insert.run(data)
} catch (e) {
console.error(e)
console.error(e, insert, data)
}
})
})
@ -186,7 +198,7 @@ export class SqlSealDatabase {
}
async createTable(name: string, fields: Record<string, 'TEXT' | 'INTEGER' | 'REAL'>) {
const sqlFields = Object.entries(fields).map(([key, type]) => `${key} ${type}`)
const sqlFields = Object.entries(fields).map(([key, type]) => `${camelCase(key)} ${type}`)
// FIXME: probably use schema generator, for now create with hardcoded fields
await this.db.prepare(`DROP TABLE IF EXISTS ${name}`).run()
const createSQL = `CREATE TABLE IF NOT EXISTS ${name} (

View file

@ -4,7 +4,6 @@ import { App, MarkdownPostProcessorContext } from "obsidian";
import { updateTables } from "./sqlReparseTables";
import { hashString } from "./hash";
import { SealObserver } from "./SealObserver";
import { delay } from "./utils";
export class SqlSeal {
public db: SqlSealDatabase
@ -76,11 +75,10 @@ export class SqlSeal {
const selectStatement = selectMatch[0]
const { statement, tables } = updateTables(selectStatement, this.globalTables, prefix)
const renderSelect = async () => {
const stmt = await this.db.db.prepare(statement)
const columns = await stmt.columns().map(column => column.name);
const data = await stmt.all(frontmatter)
const data = await stmt.all(frontmatter ?? {})
displayData(el, columns, data)
}
@ -103,7 +101,7 @@ export class SqlSeal {
await renderSelect()
} catch (e) {
if (e instanceof RangeError && Object.keys(ctx.frontmatter).length === 0) {
if (e instanceof RangeError && ctx && Object.keys(ctx.frontmatter).length === 0) {
displayInfo(el, 'Cannot access frontmatter properties in Live Preview Mode. Switch to Reading Mode to see the results.')
} else {
displayError(el, e)

View file

@ -1,4 +1,5 @@
{
"0.1.0": "0.15.0",
"0.2.0": "0.15.0",
"0.3.0": "0.15.0"
}

1102
yarn.lock

File diff suppressed because it is too large Load diff