mirror of
https://github.com/docmost/docmost.git
synced 2026-05-10 00:13:36 +08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 206961e842 |
@@ -8,7 +8,6 @@ export const Feature = {
|
||||
AI: 'ai',
|
||||
CONFLUENCE_IMPORT: 'import:confluence',
|
||||
DOCX_IMPORT: 'import:docx',
|
||||
PDF_IMPORT: 'import:pdf',
|
||||
ATTACHMENT_INDEXING: 'attachment:indexing',
|
||||
SECURITY_SETTINGS: 'security:settings',
|
||||
MCP: 'mcp',
|
||||
|
||||
@@ -140,7 +140,7 @@ export function PagePermissionList({
|
||||
)}
|
||||
</Group>
|
||||
|
||||
<ScrollArea.Autosize mah={400} viewportRef={viewportRef}>
|
||||
<ScrollArea mah={250} viewportRef={viewportRef}>
|
||||
{sortedMembers.map((member) => (
|
||||
<PagePermissionItem
|
||||
key={`${member.type}-${member.id}`}
|
||||
@@ -158,7 +158,7 @@ export function PagePermissionList({
|
||||
<Loader size="xs" />
|
||||
</Center>
|
||||
)}
|
||||
</ScrollArea.Autosize>
|
||||
</ScrollArea>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -19,9 +19,7 @@ export const uploadAttachmentAction = handleAttachmentUpload({
|
||||
},
|
||||
validateFn: (file, allowMedia: boolean) => {
|
||||
if (
|
||||
(file.type.includes("image/") ||
|
||||
file.type.includes("video/") ||
|
||||
file.type === "application/pdf") &&
|
||||
(file.type.includes("image/") || file.type.includes("video/")) &&
|
||||
!allowMedia
|
||||
) {
|
||||
return false;
|
||||
|
||||
@@ -80,10 +80,12 @@ export const MarkdownClipboard = Extension.create({
|
||||
const { from, to } = view.state.selection;
|
||||
|
||||
const parsed = markdownToHtml(text.replace(/\n+$/, ""));
|
||||
const body = elementFromString(parsed);
|
||||
normalizeTableColumnWidths(body);
|
||||
|
||||
const contentNodes = DOMParser.fromSchema(
|
||||
this.editor.schema,
|
||||
).parseSlice(elementFromString(parsed), {
|
||||
).parseSlice(body, {
|
||||
preserveWhitespace: true,
|
||||
});
|
||||
|
||||
@@ -137,3 +139,92 @@ function elementFromString(value) {
|
||||
|
||||
return new window.DOMParser().parseFromString(wrappedValue, "text/html").body;
|
||||
}
|
||||
|
||||
const DEFAULT_PASTE_COL_WIDTH_PX = 150;
|
||||
|
||||
function parsePixelWidth(el: Element): number | null {
|
||||
const attr = el.getAttribute("width");
|
||||
if (attr) {
|
||||
const n = parseInt(attr, 10);
|
||||
if (Number.isFinite(n) && n > 0) return n;
|
||||
}
|
||||
const style = el.getAttribute("style") || "";
|
||||
const m = style.match(/(?:^|;)\s*width\s*:\s*([\d.]+)\s*px/i);
|
||||
if (m) {
|
||||
const n = parseInt(m[1], 10);
|
||||
if (Number.isFinite(n) && n > 0) return n;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getFirstRow(table: Element): Element | null {
|
||||
const tbodyRow = table.querySelector(":scope > tbody > tr");
|
||||
if (tbodyRow) return tbodyRow;
|
||||
const theadRow = table.querySelector(":scope > thead > tr");
|
||||
if (theadRow) return theadRow;
|
||||
return table.querySelector(":scope > tr");
|
||||
}
|
||||
|
||||
function deriveColumnWidths(table: Element): (number | null)[] | null {
|
||||
const cols = table.querySelectorAll(":scope > colgroup > col");
|
||||
if (cols.length > 0) {
|
||||
const widths: (number | null)[] = [];
|
||||
cols.forEach((col) => widths.push(parsePixelWidth(col)));
|
||||
if (widths.some((w) => w !== null)) return widths;
|
||||
}
|
||||
|
||||
const firstRow = getFirstRow(table);
|
||||
if (!firstRow) return null;
|
||||
|
||||
const widths: (number | null)[] = [];
|
||||
Array.from(firstRow.children)
|
||||
.filter((c) => c.tagName === "TD" || c.tagName === "TH")
|
||||
.forEach((cell) => {
|
||||
const colspan = parseInt(cell.getAttribute("colspan") || "1", 10) || 1;
|
||||
const w = parsePixelWidth(cell);
|
||||
for (let i = 0; i < colspan; i++) {
|
||||
widths.push(w !== null ? Math.round(w / colspan) : null);
|
||||
}
|
||||
});
|
||||
if (widths.length === 0 || widths.every((w) => w === null)) return null;
|
||||
return widths;
|
||||
}
|
||||
|
||||
// Mirror of server normalizeTableColumnWidths (see import/utils/table-utils.ts):
|
||||
// markdown source has no widths, so without this every pasted table renders
|
||||
// at table-layout:fixed/100% and squashes columns to fit the editor instead of
|
||||
// letting .tableWrapper's overflow-x: auto scroll.
|
||||
export function normalizeTableColumnWidths(root: Element): void {
|
||||
root.querySelectorAll("table").forEach((table) => {
|
||||
const firstRow = getFirstRow(table);
|
||||
if (!firstRow) return;
|
||||
|
||||
let colWidths = deriveColumnWidths(table);
|
||||
if (!colWidths) {
|
||||
let count = 0;
|
||||
Array.from(firstRow.children)
|
||||
.filter((c) => c.tagName === "TD" || c.tagName === "TH")
|
||||
.forEach((cell) => {
|
||||
count += parseInt(cell.getAttribute("colspan") || "1", 10) || 1;
|
||||
});
|
||||
if (count === 0) return;
|
||||
colWidths = new Array(count).fill(DEFAULT_PASTE_COL_WIDTH_PX);
|
||||
}
|
||||
|
||||
let col = 0;
|
||||
Array.from(firstRow.children)
|
||||
.filter((c) => c.tagName === "TD" || c.tagName === "TH")
|
||||
.forEach((cell) => {
|
||||
if (cell.getAttribute("colwidth")) {
|
||||
col += parseInt(cell.getAttribute("colspan") || "1", 10) || 1;
|
||||
return;
|
||||
}
|
||||
const colspan = parseInt(cell.getAttribute("colspan") || "1", 10) || 1;
|
||||
const slice = colWidths!.slice(col, col + colspan);
|
||||
col += colspan;
|
||||
if (slice.length === 0 || slice.every((w) => w === null)) return;
|
||||
const values = slice.map((w) => (w == null ? 100 : w));
|
||||
cell.setAttribute("colwidth", values.join(","));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ import {
|
||||
IconCheck,
|
||||
IconFileCode,
|
||||
IconFileTypeDocx,
|
||||
IconFileTypePdf,
|
||||
IconFileTypeZip,
|
||||
IconMarkdown,
|
||||
IconX,
|
||||
@@ -91,14 +90,12 @@ function ImportFormatSelection({ spaceId, onClose }: ImportFormatSelection) {
|
||||
const markdownFileRef = useRef<() => void>(null);
|
||||
const htmlFileRef = useRef<() => void>(null);
|
||||
const docxFileRef = useRef<() => void>(null);
|
||||
const pdfFileRef = useRef<() => void>(null);
|
||||
const notionFileRef = useRef<() => void>(null);
|
||||
const confluenceFileRef = useRef<() => void>(null);
|
||||
const zipFileRef = useRef<() => void>(null);
|
||||
|
||||
const canUseConfluence = useHasFeature(Feature.CONFLUENCE_IMPORT);
|
||||
const canUseDocx = useHasFeature(Feature.DOCX_IMPORT);
|
||||
const canUsePdf = useHasFeature(Feature.PDF_IMPORT);
|
||||
const upgradeLabel = useUpgradeLabel();
|
||||
|
||||
const handleZipUpload = async (selectedFile: File, source: string) => {
|
||||
@@ -247,7 +244,7 @@ function ImportFormatSelection({ spaceId, onClose }: ImportFormatSelection) {
|
||||
}, 3000);
|
||||
}, [fileTaskId]);
|
||||
|
||||
const maxSingleFileSize = bytes("30mb");
|
||||
const maxSingleFileSize = bytes("20mb");
|
||||
|
||||
const handleFileUpload = async (selectedFiles: File[]) => {
|
||||
if (!selectedFiles) {
|
||||
@@ -301,7 +298,6 @@ function ImportFormatSelection({ spaceId, onClose }: ImportFormatSelection) {
|
||||
if (markdownFileRef.current) markdownFileRef.current();
|
||||
if (htmlFileRef.current) htmlFileRef.current();
|
||||
if (docxFileRef.current) docxFileRef.current();
|
||||
if (pdfFileRef.current) pdfFileRef.current();
|
||||
|
||||
const pageCountText =
|
||||
pageCount === 1 ? `1 ${t("page")}` : `${pageCount} ${t("pages")}`;
|
||||
@@ -382,30 +378,6 @@ function ImportFormatSelection({ spaceId, onClose }: ImportFormatSelection) {
|
||||
)}
|
||||
</FileButton>
|
||||
|
||||
<FileButton
|
||||
onChange={handleFileUpload}
|
||||
accept=".pdf"
|
||||
multiple
|
||||
resetRef={pdfFileRef}
|
||||
>
|
||||
{(props) => (
|
||||
<Tooltip
|
||||
label={upgradeLabel}
|
||||
disabled={canUsePdf}
|
||||
>
|
||||
<Button
|
||||
disabled={!canUsePdf}
|
||||
justify="start"
|
||||
variant="default"
|
||||
leftSection={<IconFileTypePdf size={18} />}
|
||||
{...props}
|
||||
>
|
||||
PDF
|
||||
</Button>
|
||||
</Tooltip>
|
||||
)}
|
||||
</FileButton>
|
||||
|
||||
<FileButton
|
||||
onChange={(file) => handleZipUpload(file, "notion")}
|
||||
accept="application/zip"
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
"@aws-sdk/lib-storage": "3.1037.0",
|
||||
"@aws-sdk/s3-request-presigner": "3.1037.0",
|
||||
"@clickhouse/client": "^1.18.2",
|
||||
"@docmost/pdf-inspector": "1.9.4",
|
||||
"@fastify/cookie": "^11.0.2",
|
||||
"@fastify/multipart": "^10.0.0",
|
||||
"@fastify/static": "^9.1.3",
|
||||
@@ -101,6 +100,7 @@
|
||||
"p-limit": "^7.3.0",
|
||||
"passport-google-oauth20": "^2.0.0",
|
||||
"passport-jwt": "^4.0.1",
|
||||
"pdfjs-dist": "^5.5.207",
|
||||
"pg-tsquery": "^8.4.2",
|
||||
"pgvector": "^0.2.1",
|
||||
"pino-http": "^11.0.0",
|
||||
|
||||
@@ -8,7 +8,6 @@ export const Feature = {
|
||||
AI: 'ai',
|
||||
CONFLUENCE_IMPORT: 'import:confluence',
|
||||
DOCX_IMPORT: 'import:docx',
|
||||
PDF_IMPORT: 'import:pdf',
|
||||
ATTACHMENT_INDEXING: 'attachment:indexing',
|
||||
SECURITY_SETTINGS: 'security:settings',
|
||||
MCP: 'mcp',
|
||||
|
||||
+1
-1
Submodule apps/server/src/ee updated: 109829076c...4101fc427b
@@ -51,9 +51,9 @@ export class ImportController {
|
||||
@AuthUser() user: User,
|
||||
@AuthWorkspace() workspace: Workspace,
|
||||
) {
|
||||
const validFileExtensions = ['.md', '.html', '.docx', '.pdf'];
|
||||
const validFileExtensions = ['.md', '.html', '.docx'];
|
||||
|
||||
const maxFileSize = bytes('30mb');
|
||||
const maxFileSize = bytes('20mb');
|
||||
|
||||
let file = null;
|
||||
try {
|
||||
@@ -102,7 +102,6 @@ export class ImportController {
|
||||
'.md': 'markdown',
|
||||
'.html': 'html',
|
||||
'.docx': 'docx',
|
||||
'.pdf': 'pdf',
|
||||
};
|
||||
|
||||
if (createdPage) {
|
||||
|
||||
@@ -29,6 +29,8 @@ import { InjectQueue } from '@nestjs/bullmq';
|
||||
import { Queue } from 'bullmq';
|
||||
import { QueueJob, QueueName } from '../../queue/constants';
|
||||
import { ModuleRef } from '@nestjs/core';
|
||||
import { load } from 'cheerio';
|
||||
import { normalizeImportHtml } from '../utils/import-formatter';
|
||||
|
||||
@Injectable()
|
||||
export class ImportService {
|
||||
@@ -61,10 +63,7 @@ export class ImportService {
|
||||
let createdPage = null;
|
||||
|
||||
// For DOCX, we need the page ID upfront so images can reference it
|
||||
const pageId =
|
||||
fileExtension === '.docx' || fileExtension === '.pdf'
|
||||
? uuid7()
|
||||
: undefined;
|
||||
const pageId = fileExtension === '.docx' ? uuid7() : undefined;
|
||||
|
||||
try {
|
||||
if (fileExtension.endsWith('.md')) {
|
||||
@@ -79,14 +78,6 @@ export class ImportService {
|
||||
pageId,
|
||||
userId,
|
||||
);
|
||||
} else if (fileExtension.endsWith('.pdf')) {
|
||||
prosemirrorState = await this.processPdf(
|
||||
fileBuffer,
|
||||
workspaceId,
|
||||
spaceId,
|
||||
pageId,
|
||||
userId,
|
||||
);
|
||||
}
|
||||
} catch (err) {
|
||||
const message = 'Error processing file content';
|
||||
@@ -147,7 +138,9 @@ export class ImportService {
|
||||
|
||||
async processHTML(htmlInput: string): Promise<any> {
|
||||
try {
|
||||
return htmlToJson(htmlInput);
|
||||
const $ = load(htmlInput);
|
||||
normalizeImportHtml($, $.root());
|
||||
return htmlToJson($.html() || '');
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
@@ -163,7 +156,7 @@ export class ImportService {
|
||||
let DocxImportModule: any;
|
||||
try {
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
DocxImportModule = require('./../../../ee/document-import/docx-import.service');
|
||||
DocxImportModule = require('./../../../ee/docx-import/docx-import.service');
|
||||
} catch (err) {
|
||||
this.logger.error(
|
||||
'DOCX import requested but EE module not bundled in this build',
|
||||
@@ -189,42 +182,6 @@ export class ImportService {
|
||||
return this.processHTML(html);
|
||||
}
|
||||
|
||||
async processPdf(
|
||||
fileBuffer: Buffer,
|
||||
workspaceId: string,
|
||||
spaceId: string,
|
||||
pageId: string,
|
||||
userId: string,
|
||||
): Promise<any> {
|
||||
let PdfImportModule: any;
|
||||
try {
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
PdfImportModule = require('./../../../ee/document-import/pdf-import.service');
|
||||
} catch (err) {
|
||||
this.logger.error(
|
||||
'PDF import requested but EE module not bundled in this build',
|
||||
);
|
||||
throw new BadRequestException(
|
||||
'This feature requires a valid enterprise license.',
|
||||
);
|
||||
}
|
||||
|
||||
const pdfImportService = this.moduleRef.get(
|
||||
PdfImportModule.PdfImportService,
|
||||
{ strict: false },
|
||||
);
|
||||
|
||||
const html = await pdfImportService.convertPdfToHtml(
|
||||
fileBuffer,
|
||||
workspaceId,
|
||||
spaceId,
|
||||
pageId,
|
||||
userId,
|
||||
);
|
||||
|
||||
return this.processHTML(html);
|
||||
}
|
||||
|
||||
async createYdoc(prosemirrorJson: any): Promise<Buffer | null> {
|
||||
if (prosemirrorJson) {
|
||||
// this.logger.debug(`Converting prosemirror json state to ydoc`);
|
||||
|
||||
@@ -5,6 +5,7 @@ import { v7 } from 'uuid';
|
||||
import { InsertableBacklink } from '@docmost/db/types/entity.types';
|
||||
import { Cheerio, CheerioAPI, load } from 'cheerio';
|
||||
import slugify from '@sindresorhus/slugify';
|
||||
import { normalizeTableColumnWidths } from './table-utils';
|
||||
|
||||
// Check if text contains Unicode characters (for emojis/icons)
|
||||
function isUnicodeCharacter(text: string): boolean {
|
||||
@@ -51,9 +52,7 @@ export async function formatImportHtml(opts: {
|
||||
}
|
||||
}
|
||||
|
||||
notionFormatter($, $root);
|
||||
xwikiFormatter($, $root);
|
||||
defaultHtmlFormatter($, $root);
|
||||
normalizeImportHtml($, $root);
|
||||
|
||||
const backlinks = await rewriteInternalLinksToMentionHtml(
|
||||
$,
|
||||
@@ -73,6 +72,23 @@ export async function formatImportHtml(opts: {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Contextless HTML cleanup shared by every import path.
|
||||
* - notionFormatter: no-op on non-Notion HTML (class-selector-based).
|
||||
* - xwikiFormatter: no-op on non-XWiki HTML (looks for #xwikicontent).
|
||||
* - defaultHtmlFormatter: table column widths + provider auto-embeds.
|
||||
*
|
||||
* Does NOT run rewriteInternalLinksToMentionHtml — that requires zip context.
|
||||
*/
|
||||
export function normalizeImportHtml(
|
||||
$: CheerioAPI,
|
||||
$root: Cheerio<any>,
|
||||
): void {
|
||||
notionFormatter($, $root);
|
||||
xwikiFormatter($, $root);
|
||||
defaultHtmlFormatter($, $root);
|
||||
}
|
||||
|
||||
export function xwikiFormatter($: CheerioAPI, $root: Cheerio<any>) {
|
||||
const $content = $root.find('#xwikicontent');
|
||||
if ($content.length) {
|
||||
@@ -82,6 +98,8 @@ export function xwikiFormatter($: CheerioAPI, $root: Cheerio<any>) {
|
||||
}
|
||||
|
||||
export function defaultHtmlFormatter($: CheerioAPI, $root: Cheerio<any>) {
|
||||
normalizeTableColumnWidths($, $root);
|
||||
|
||||
$root.find('a[href]').each((_, el) => {
|
||||
const $el = $(el);
|
||||
const url = $el.attr('href')!;
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
import { CheerioAPI, Cheerio } from 'cheerio';
|
||||
|
||||
const DEFAULT_IMPORT_COL_WIDTH_PX = 150;
|
||||
|
||||
/**
|
||||
* Extracts a pixel-integer width from either the `width` attribute or
|
||||
* `style="width: Npx"` on a <col>/<td>/<th>. Returns null when absent,
|
||||
* non-numeric, or a non-px unit (em, %).
|
||||
*/
|
||||
function parsePixelWidth(el: Cheerio<any>): number | null {
|
||||
const attr = el.attr('width');
|
||||
if (attr) {
|
||||
const n = parseInt(attr, 10);
|
||||
if (Number.isFinite(n) && n > 0) return n;
|
||||
}
|
||||
const style = el.attr('style') || '';
|
||||
const m = style.match(/(?:^|;)\s*width\s*:\s*([\d.]+)\s*px/i);
|
||||
if (m) {
|
||||
const n = parseInt(m[1], 10);
|
||||
if (Number.isFinite(n) && n > 0) return n;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Derives per-column widths for a table, in visual column order.
|
||||
* Priority: <colgroup><col> → first-row cells' own width style.
|
||||
* Returns an array of length = number of columns, with null entries
|
||||
* for columns whose width couldn't be determined.
|
||||
*/
|
||||
function deriveColumnWidths(
|
||||
$: CheerioAPI,
|
||||
table: Cheerio<any>,
|
||||
): (number | null)[] | null {
|
||||
const cols = table.find('> colgroup > col');
|
||||
if (cols.length > 0) {
|
||||
const widths: (number | null)[] = [];
|
||||
cols.each(function () {
|
||||
widths.push(parsePixelWidth($(this)));
|
||||
});
|
||||
if (widths.some((w) => w !== null)) return widths;
|
||||
}
|
||||
|
||||
// Fallback: first row's cells.
|
||||
const firstRow = table.find('> tbody > tr, > thead > tr, > tr').first();
|
||||
if (!firstRow.length) return null;
|
||||
|
||||
const widths: (number | null)[] = [];
|
||||
firstRow.children('td, th').each(function () {
|
||||
const cell = $(this);
|
||||
const colspan = parseInt(cell.attr('colspan') || '1', 10) || 1;
|
||||
const w = parsePixelWidth(cell);
|
||||
for (let i = 0; i < colspan; i++) {
|
||||
widths.push(w !== null ? Math.round(w / colspan) : null);
|
||||
}
|
||||
});
|
||||
if (widths.every((w) => w === null)) return null;
|
||||
return widths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply colwidth attributes to the first row of each table based on
|
||||
* derived column widths. Accounts for colspan. Idempotent — re-running
|
||||
* on already-normalized markup is a no-op.
|
||||
*
|
||||
* This lives upstream of tiptap's generateJSON: tiptap reads
|
||||
* `colwidth="N[,N...]"` on <td>/<th> to build the runtime <colgroup>.
|
||||
*/
|
||||
export function normalizeTableColumnWidths(
|
||||
$: CheerioAPI,
|
||||
$root: Cheerio<any>,
|
||||
): void {
|
||||
$root.find('table').each(function () {
|
||||
const table = $(this);
|
||||
const firstRow = table.find('> tbody > tr, > thead > tr, > tr').first();
|
||||
if (!firstRow.length) return;
|
||||
|
||||
let colWidths = deriveColumnWidths($, table);
|
||||
if (!colWidths) {
|
||||
// No widths anywhere (e.g. markdown-sourced tables). Apply a default
|
||||
// per-column width so the table's intrinsic width can exceed the
|
||||
// editor container, letting .tableWrapper's overflow-x: auto scroll
|
||||
// instead of cramming columns into the available width.
|
||||
let count = 0;
|
||||
firstRow.children('td, th').each(function () {
|
||||
count += parseInt($(this).attr('colspan') || '1', 10) || 1;
|
||||
});
|
||||
if (count === 0) return;
|
||||
colWidths = new Array(count).fill(DEFAULT_IMPORT_COL_WIDTH_PX);
|
||||
}
|
||||
|
||||
let col = 0;
|
||||
firstRow.children('td, th').each(function () {
|
||||
const cell = $(this);
|
||||
if (cell.attr('colwidth')) {
|
||||
col += parseInt(cell.attr('colspan') || '1', 10) || 1;
|
||||
return;
|
||||
}
|
||||
const colspan = parseInt(cell.attr('colspan') || '1', 10) || 1;
|
||||
const slice = colWidths.slice(col, col + colspan);
|
||||
col += colspan;
|
||||
if (slice.length === 0 || slice.every((w) => w === null)) return;
|
||||
const values = slice.map((w) => (w == null ? 100 : w));
|
||||
cell.attr('colwidth', values.join(','));
|
||||
});
|
||||
});
|
||||
}
|
||||
Generated
+136
-9
@@ -479,9 +479,6 @@ importers:
|
||||
'@clickhouse/client':
|
||||
specifier: ^1.18.2
|
||||
version: 1.18.2
|
||||
'@docmost/pdf-inspector':
|
||||
specifier: 1.9.4
|
||||
version: 1.9.4
|
||||
'@fastify/cookie':
|
||||
specifier: ^11.0.2
|
||||
version: 11.0.2
|
||||
@@ -671,6 +668,9 @@ importers:
|
||||
passport-jwt:
|
||||
specifier: ^4.0.1
|
||||
version: 4.0.1
|
||||
pdfjs-dist:
|
||||
specifier: ^5.5.207
|
||||
version: 5.5.207
|
||||
pg-tsquery:
|
||||
specifier: ^8.4.2
|
||||
version: 8.4.2
|
||||
@@ -1820,9 +1820,6 @@ packages:
|
||||
resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@docmost/pdf-inspector@1.9.4':
|
||||
resolution: {integrity: sha512-G5DNyDtLNxybTXWakqi7PuOEuSb/A2ZjDlv2WCkOkiHszPeILdrC+G0a4e4UP10yxvzuLfb23pJ5jy8fUSYZPw==}
|
||||
|
||||
'@emnapi/core@1.8.1':
|
||||
resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
|
||||
|
||||
@@ -2759,6 +2756,76 @@ packages:
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@napi-rs/canvas-android-arm64@0.1.97':
|
||||
resolution: {integrity: sha512-V1c/WVw+NzH8vk7ZK/O8/nyBSCQimU8sfMsB/9qeSvdkGKNU7+mxy/bIF0gTgeBFmHpj30S4E9WHMSrxXGQuVQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@napi-rs/canvas-darwin-arm64@0.1.97':
|
||||
resolution: {integrity: sha512-ok+SCEF4YejcxuJ9Rm+WWunHHpf2HmiPxfz6z1a/NFQECGXtsY7A4B8XocK1LmT1D7P174MzwPF9Wy3AUAwEPw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@napi-rs/canvas-darwin-x64@0.1.97':
|
||||
resolution: {integrity: sha512-PUP6e6/UGlclUvAQNnuXCcnkpdUou6VYZfQOQxExLp86epOylmiwLkqXIvpFmjoTEDmPmXrI+coL/9EFU1gKPA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@napi-rs/canvas-linux-arm-gnueabihf@0.1.97':
|
||||
resolution: {integrity: sha512-XyXH2L/cic8eTNtbrXCcvqHtMX/nEOxN18+7rMrAM2XtLYC/EB5s0wnO1FsLMWmK+04ZSLN9FBGipo7kpIkcOw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@napi-rs/canvas-linux-arm64-gnu@0.1.97':
|
||||
resolution: {integrity: sha512-Kuq/M3djq0K8ktgz6nPlK7Ne5d4uWeDxPpyKWOjWDK2RIOhHVtLtyLiJw2fuldw7Vn4mhw05EZXCEr4Q76rs9w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@napi-rs/canvas-linux-arm64-musl@0.1.97':
|
||||
resolution: {integrity: sha512-kKmSkQVnWeqg7qdsiXvYxKhAFuHz3tkBjW/zyQv5YKUPhotpaVhpBGv5LqCngzyuRV85SXoe+OFj+Tv0a0QXkQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@napi-rs/canvas-linux-riscv64-gnu@0.1.97':
|
||||
resolution: {integrity: sha512-Jc7I3A51jnEOIAXeLsN/M/+Z28LUeakcsXs07FLq9prXc0eYOtVwsDEv913Gr+06IRo34gJJVgT0TXvmz+N2VA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
|
||||
'@napi-rs/canvas-linux-x64-gnu@0.1.97':
|
||||
resolution: {integrity: sha512-iDUBe7AilfuBSRbSa8/IGX38Mf+iCSBqoVKLSQ5XaY2JLOaqz1TVyPFEyIck7wT6mRQhQt5sN6ogfjIDfi74tg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@napi-rs/canvas-linux-x64-musl@0.1.97':
|
||||
resolution: {integrity: sha512-AKLFd/v0Z5fvgqBDqhvqtAdx+fHMJ5t9JcUNKq4FIZ5WH+iegGm8HPdj00NFlCSnm83Fp3Ln8I2f7uq1aIiWaA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@napi-rs/canvas-win32-arm64-msvc@0.1.97':
|
||||
resolution: {integrity: sha512-u883Yr6A6fO7Vpsy9YE4FVCIxzzo5sO+7pIUjjoDLjS3vQaNMkVzx5bdIpEL+ob+gU88WDK4VcxYMZ6nmnoX9A==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@napi-rs/canvas-win32-x64-msvc@0.1.97':
|
||||
resolution: {integrity: sha512-sWtD2EE3fV0IzN+iiQUqr/Q1SwqWhs2O1FKItFlxtdDkikpEj5g7DKQpY3x55H/MAOnL8iomnlk3mcEeGiUMoQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@napi-rs/canvas@0.1.97':
|
||||
resolution: {integrity: sha512-8cFniXvrIEnVwuNSRCW9wirRZbHvrD3JVujdS2P5n5xiJZNZMOZcfOvJ1pb66c7jXMKHHglJEDVJGbm8XWFcXQ==}
|
||||
engines: {node: '>= 10'}
|
||||
|
||||
'@napi-rs/wasm-runtime@0.2.12':
|
||||
resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
|
||||
|
||||
@@ -8478,6 +8545,9 @@ packages:
|
||||
node-int64@0.4.0:
|
||||
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
|
||||
|
||||
node-readable-to-web-readable-stream@0.4.2:
|
||||
resolution: {integrity: sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==}
|
||||
|
||||
node-releases@2.0.27:
|
||||
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
|
||||
|
||||
@@ -8769,6 +8839,10 @@ packages:
|
||||
pause@0.0.1:
|
||||
resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==}
|
||||
|
||||
pdfjs-dist@5.5.207:
|
||||
resolution: {integrity: sha512-WMqqw06w1vUt9ZfT0gOFhMf3wHsWhaCrxGrckGs5Cci6ybDW87IvPaOd2pnBwT6BJuP/CzXDZxjFgmSULLdsdw==}
|
||||
engines: {node: '>=20.19.0 || >=22.13.0 || >=24'}
|
||||
|
||||
peberminta@0.9.0:
|
||||
resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==}
|
||||
|
||||
@@ -10244,7 +10318,6 @@ packages:
|
||||
|
||||
uuid@10.0.0:
|
||||
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
|
||||
deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
|
||||
hasBin: true
|
||||
|
||||
uuid@11.1.0:
|
||||
@@ -12110,8 +12183,6 @@ snapshots:
|
||||
|
||||
'@csstools/css-tokenizer@3.0.3': {}
|
||||
|
||||
'@docmost/pdf-inspector@1.9.4': {}
|
||||
|
||||
'@emnapi/core@1.8.1':
|
||||
dependencies:
|
||||
'@emnapi/wasi-threads': 1.1.0
|
||||
@@ -13112,6 +13183,54 @@ snapshots:
|
||||
'@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-android-arm64@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-darwin-arm64@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-darwin-x64@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-linux-arm-gnueabihf@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-linux-arm64-gnu@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-linux-arm64-musl@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-linux-riscv64-gnu@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-linux-x64-gnu@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-linux-x64-musl@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-win32-arm64-msvc@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas-win32-x64-msvc@0.1.97':
|
||||
optional: true
|
||||
|
||||
'@napi-rs/canvas@0.1.97':
|
||||
optionalDependencies:
|
||||
'@napi-rs/canvas-android-arm64': 0.1.97
|
||||
'@napi-rs/canvas-darwin-arm64': 0.1.97
|
||||
'@napi-rs/canvas-darwin-x64': 0.1.97
|
||||
'@napi-rs/canvas-linux-arm-gnueabihf': 0.1.97
|
||||
'@napi-rs/canvas-linux-arm64-gnu': 0.1.97
|
||||
'@napi-rs/canvas-linux-arm64-musl': 0.1.97
|
||||
'@napi-rs/canvas-linux-riscv64-gnu': 0.1.97
|
||||
'@napi-rs/canvas-linux-x64-gnu': 0.1.97
|
||||
'@napi-rs/canvas-linux-x64-musl': 0.1.97
|
||||
'@napi-rs/canvas-win32-arm64-msvc': 0.1.97
|
||||
'@napi-rs/canvas-win32-x64-msvc': 0.1.97
|
||||
optional: true
|
||||
|
||||
'@napi-rs/wasm-runtime@0.2.12':
|
||||
dependencies:
|
||||
'@emnapi/core': 1.8.1
|
||||
@@ -19498,6 +19617,9 @@ snapshots:
|
||||
|
||||
node-int64@0.4.0: {}
|
||||
|
||||
node-readable-to-web-readable-stream@0.4.2:
|
||||
optional: true
|
||||
|
||||
node-releases@2.0.27: {}
|
||||
|
||||
nodemailer@8.0.5: {}
|
||||
@@ -19849,6 +19971,11 @@ snapshots:
|
||||
|
||||
pause@0.0.1: {}
|
||||
|
||||
pdfjs-dist@5.5.207:
|
||||
optionalDependencies:
|
||||
'@napi-rs/canvas': 0.1.97
|
||||
node-readable-to-web-readable-stream: 0.4.2
|
||||
|
||||
peberminta@0.9.0: {}
|
||||
|
||||
pend@1.2.0: {}
|
||||
|
||||
Reference in New Issue
Block a user