@teriusu/rich-editor 0.6.4 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -113,6 +113,7 @@
113
113
  placeholder = "'/'를 눌러 명령어를 입력하세요...",
114
114
  onUploadFile,
115
115
  onResolveFile,
116
+ fileDownloadBaseUrl,
116
117
  onPromptLink,
117
118
  onPromptImage,
118
119
  extensions: extraExtensions = [],
@@ -125,6 +126,7 @@
125
126
  placeholder?: string;
126
127
  onUploadFile?: UploadHandler;
127
128
  onResolveFile?: FileResolver;
129
+ fileDownloadBaseUrl?: string;
128
130
  onPromptLink?: PromptHandler;
129
131
  onPromptImage?: PromptHandler;
130
132
  extensions?: AnyExtension[];
@@ -370,7 +372,10 @@
370
372
  CustomTableHeader,
371
373
  CustomTableCell,
372
374
  PdfBlock,
373
- FileAttachment,
375
+ FileAttachment.configure({
376
+ resolver: onResolveFile ?? null,
377
+ ...(fileDownloadBaseUrl ? { downloadBaseUrl: fileDownloadBaseUrl } : {}),
378
+ }),
374
379
  VideoBlock,
375
380
  Columns,
376
381
  Column,
@@ -496,14 +501,6 @@
496
501
  },
497
502
  });
498
503
 
499
- // File resolver를 storage에 등록
500
- if (onResolveFile) {
501
- editor.storage.fileAttachment = {
502
- ...editor.storage.fileAttachment,
503
- resolver: onResolveFile,
504
- };
505
- }
506
-
507
504
  editor.on("update", handleUpdate);
508
505
  editor.on("selectionUpdate", handleSelectionUpdate);
509
506
 
@@ -7,6 +7,7 @@ type $$ComponentProps = {
7
7
  placeholder?: string;
8
8
  onUploadFile?: UploadHandler;
9
9
  onResolveFile?: FileResolver;
10
+ fileDownloadBaseUrl?: string;
10
11
  onPromptLink?: PromptHandler;
11
12
  onPromptImage?: PromptHandler;
12
13
  extensions?: AnyExtension[];
@@ -1 +1 @@
1
- {"version":3,"file":"TipTapEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.svelte.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAa5D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEhE,KAAK,gBAAgB,GAAI;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AA+mBJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"TipTapEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/components/TipTapEditor.svelte.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAa5D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEhE,KAAK,gBAAgB,GAAI;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AA2mBJ,QAAA,MAAM,YAAY,sDAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -1,13 +1,15 @@
1
1
  import { Node } from "@tiptap/core";
2
- export interface FileAttachmentOptions {
3
- HTMLAttributes: Record<string, unknown>;
4
- }
5
2
  export type FileResolveResult = {
6
3
  src: string;
7
4
  name?: string;
8
5
  size?: number;
9
6
  };
10
7
  export type FileResolver = (fileId: string) => Promise<FileResolveResult>;
8
+ export interface FileAttachmentOptions {
9
+ HTMLAttributes: Record<string, unknown>;
10
+ resolver: FileResolver | null;
11
+ downloadBaseUrl: string;
12
+ }
11
13
  declare module "@tiptap/core" {
12
14
  interface Commands<ReturnType> {
13
15
  fileAttachment: {
@@ -1 +1 @@
1
- {"version":3,"file":"FileAttachment.d.ts","sourceRoot":"","sources":["../../src/extensions/FileAttachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,MAAM,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE1E,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,cAAc,EAAE;YACd,iBAAiB,EAAE,CAAC,KAAK,EAAE;gBACzB,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,KAAK,UAAU,CAAC;SAClB,CAAC;KACH;CACF;AAkCD,eAAO,MAAM,cAAc,kCAqNzB,CAAC"}
1
+ {"version":3,"file":"FileAttachment.d.ts","sourceRoot":"","sources":["../../src/extensions/FileAttachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,cAAc,EAAE;YACd,iBAAiB,EAAE,CAAC,KAAK,EAAE;gBACzB,GAAG,CAAC,EAAE,MAAM,CAAC;gBACb,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,KAAK,UAAU,CAAC;SAClB,CAAC;KACH;CACF;AAkCD,eAAO,MAAM,cAAc,kCAiNzB,CAAC"}
@@ -8,7 +8,7 @@ function formatFileSize(bytes) {
8
8
  }
9
9
  function isInlineable(name) {
10
10
  const ext = name.split(".").pop()?.toLowerCase() || "";
11
- return ["pdf", "png", "jpg", "jpeg", "gif", "webp", "svg"].includes(ext);
11
+ return ["pdf", "png", "jpg", "jpeg", "gif", "webp", "svg", "txt", "html", "htm"].includes(ext);
12
12
  }
13
13
  function getFileIcon(name) {
14
14
  const ext = name.split(".").pop()?.toLowerCase() || "";
@@ -36,7 +36,7 @@ export const FileAttachment = Node.create({
36
36
  atom: true,
37
37
  draggable: true,
38
38
  addOptions() {
39
- return { HTMLAttributes: {} };
39
+ return { HTMLAttributes: {}, resolver: null, downloadBaseUrl: "/api/upload" };
40
40
  },
41
41
  addAttributes() {
42
42
  return {
@@ -168,15 +168,14 @@ export const FileAttachment = Node.create({
168
168
  sizeEl.textContent = formatFileSize(node.attrs.size);
169
169
  }
170
170
  else if (node.attrs.fileId) {
171
- // ID만 있으면 resolver로 해결 시도
172
- nameEl.disabled = true;
173
- sizeEl.textContent = "loading...";
171
+ // fileId만 있어도 proxy URL로 다운로드 가능 — 버튼은 항상 활성.
172
+ // resolver가 있으면 이름/크기 메타데이터를 채운다.
174
173
  const resolver = editor.storage.fileAttachment?.resolver;
175
174
  if (resolver) {
175
+ sizeEl.textContent = "loading...";
176
176
  resolver(node.attrs.fileId)
177
177
  .then((result) => {
178
178
  resolvedSrc = result.src;
179
- nameEl.disabled = false;
180
179
  if (result.name) {
181
180
  resolvedName = result.name;
182
181
  nameEl.textContent = result.name;
@@ -185,12 +184,9 @@ export const FileAttachment = Node.create({
185
184
  sizeEl.textContent = result.size ? formatFileSize(result.size) : "";
186
185
  })
187
186
  .catch(() => {
188
- sizeEl.textContent = "resolve failed";
187
+ sizeEl.textContent = "";
189
188
  });
190
189
  }
191
- else {
192
- sizeEl.textContent = `ID: ${node.attrs.fileId}`;
193
- }
194
190
  }
195
191
  dom.appendChild(icon);
196
192
  dom.appendChild(nameEl);
@@ -220,8 +216,8 @@ export const FileAttachment = Node.create({
220
216
  },
221
217
  addStorage() {
222
218
  return {
223
- resolver: null,
224
- downloadBaseUrl: "/api/upload",
219
+ resolver: this.options.resolver,
220
+ downloadBaseUrl: this.options.downloadBaseUrl,
225
221
  };
226
222
  },
227
223
  addCommands() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teriusu/rich-editor",
3
- "version": "0.6.4",
3
+ "version": "0.6.5",
4
4
  "description": "TipTap 기반 Notion-style 리치 텍스트 에디터 (Svelte)",
5
5
  "type": "module",
6
6
  "svelte": "./dist/index.js",