Skip to content

Commit 81337ac

Browse files
authored
refactor(superdoc): type #initCollaboration param as Modules (SD-2867 phase B) (#3060)
* refactor(superdoc): type createSuperdocVueApp return shape (SD-2867 phase B) `createSuperdocVueApp()` returned `Object` per its JSDoc, so the five fields SuperDoc.js destructures from the call (`app`, `pinia`, `superdocStore`, `commentsStore`, `highContrastModeStore`) all resolved to `Object` for any consumer enabling `// @ts-check`. Five TS2339 'Property does not exist on type Object' errors at SuperDoc.js line 464 — and inside the SD-2867 ratchet that turns each into a gate failure. Promotes the return type to a named `SuperdocVueAppRefs` typedef that imports `vue.App`, `pinia.Pinia`, and the store types via `ReturnType<typeof useSuperdocStore>` etc. The shape is internal-only (this typedef is not on the public Modules / Config surface), so adding it here doesn't widen the customer-visible surface. Verified: pnpm --filter superdoc run check:jsdoc passes (3 gated files clean); the consumer-typecheck matrix passes 31/31; the postbuild declaration audit reports no FAIL findings; pnpm --filter superdoc test passes 944/944. This is groundwork for SD-2867 phase B: closing each cluster of SuperDoc.js TS errors so the file can eventually enroll in `CHECKED_FILES`. Five errors closed; ~133 remain across implicit-any params, strict-null guards, and other type-not-assignable callsites. Each cluster will land as its own focused commit. * refactor(superdoc): add RuntimeDocument typedef for runtime doc shape (SD-2867 phase B) The internal `doc` parameter in SuperDoc.js's private methods (#applyDocumentMode, #attachExternalCollaboration, etc.) is shaped differently from the public `Document` interface: SuperDoc attaches a runtime `role`, `getEditor()`, and `getPresentationEditor()` to each entry during init. Today those methods are typed `@param {Object} doc`, so any attempt to enable `// @ts-check` on SuperDoc.js fails with TS2339 errors at every `doc.getEditor()` / `doc.getPresentationEditor()` / `doc.role` access (~10 sites). Adds a `RuntimeDocument` typedef in core/types/index.ts that extends the public `Document` with the runtime-attached fields. Updates #applyDocumentMode's `@param {Object} doc` to `@param {RuntimeDocument} doc` as the first call site to migrate. The typedef is internal-only and not on the public superdoc surface (not in the public typedef block of packages/superdoc/src/index.js), so consumers cannot import or pass these fields from outside. This is groundwork: subsequent SD-2867 phase B PRs will migrate the remaining `@param {Object} doc` sites and then enable @ts-check on the methods involved. Verified: pnpm --filter superdoc run check:jsdoc passes (3 gated files clean); consumer matrix passes 31/31; declaration audit reports no FAIL findings; published .d.ts surface unchanged (RuntimeDocument is not re-exported from the public superdoc entry). * refactor(superdoc): type #initCollaboration param as Modules (SD-2867 phase B) #initCollaboration's @param was typed `Object`, so any consumer that enables `// @ts-check` on SuperDoc.js fails at every destructure of the function's parameter (`{ collaboration, comments }`) and at every read of `collaborationModuleConfig.{ydoc,provider}` and `commentsConfig.*`. Two TS2339s on line 519, plus all the downstream property accesses up to line 605. The actual call site at line 295 passes `this.config.modules`, so the right shape is `Modules` (already publicly exported). Tightens the @param to `Modules` and the @returns to `Promise<Document[] | undefined>` (which is what the function actually returns; the value is informational, not consumed by the caller). Verified locally: with `// @ts-check` enabled on SuperDoc.js, `#initCollaboration`'s body (lines 519-605) is fully type-clean. The remaining error at line 606 is a downstream callsite (passing `User | undefined` to a function expecting `Object`) and belongs to the next phase B cluster, not this one. This is groundwork; SuperDoc.js does not enroll under the gate yet. Verified: pnpm --filter superdoc run check:jsdoc passes (3 gated files clean); consumer matrix passes 31/31; declaration audit reports no FAIL findings; published .d.ts surface unchanged.
1 parent 9b34e35 commit 81337ac

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

packages/superdoc/src/core/SuperDoc.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,11 @@ export class SuperDoc extends EventEmitter {
512512
}
513513

514514
/**
515-
* Initialize collaboration if configured
516-
* @param {Object} config
517-
* @returns {Promise<Object[]>} The processed documents with collaboration enabled
515+
* Initialize collaboration if configured. Accepts the full
516+
* `Config.modules` block so it can read both the collaboration
517+
* subkey and the comments subkey at once.
518+
* @param {Modules} [modules]
519+
* @returns {Promise<Document[] | undefined>} The processed documents with collaboration enabled. Caller awaits for side effects; the return value is informational.
518520
*/
519521
async #initCollaboration({ collaboration: collaborationModuleConfig, comments: commentsConfig = {} } = {}) {
520522
if (!collaborationModuleConfig) return this.config.documents;

0 commit comments

Comments
 (0)