bookish-press 0.4.47 → 0.4.49
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.
- package/components/Auth.svelte +55 -0
- package/components/Auth.svelte.d.ts +16 -0
- package/{src/lib/components/Authentication.ts → components/Authentication.d.ts} +0 -2
- package/components/Authentication.js +1 -0
- package/{src/lib/components → components}/BookPreview.svelte +22 -27
- package/components/BookPreview.svelte.d.ts +18 -0
- package/{src/lib/components → components}/External.svelte +1 -2
- package/components/External.svelte.d.ts +18 -0
- package/components/Link.svelte +51 -0
- package/components/Link.svelte.d.ts +18 -0
- package/{src/lib/components → components}/app/BookList.svelte +3 -6
- package/components/app/BookList.svelte.d.ts +18 -0
- package/{src/lib/components → components}/app/Button.svelte +4 -5
- package/components/app/Button.svelte.d.ts +22 -0
- package/{src/lib/components → components}/app/Feedback.svelte +7 -11
- package/components/app/Feedback.svelte.d.ts +18 -0
- package/{src/lib/components → components}/app/Head.svelte +1 -2
- package/components/app/Head.svelte.d.ts +18 -0
- package/{src/lib/components → components}/app/Large.svelte +0 -0
- package/components/app/Large.svelte.d.ts +27 -0
- package/{src/lib/components → components}/app/Lead.svelte +0 -0
- package/components/app/Lead.svelte.d.ts +27 -0
- package/{src/lib/components → components}/app/Link.svelte +3 -4
- package/components/app/Link.svelte.d.ts +20 -0
- package/{src/lib/components → components}/app/Options.svelte +4 -5
- package/components/app/Options.svelte.d.ts +19 -0
- package/{src/lib/components → components}/app/Paragraph.svelte +1 -2
- package/components/app/Paragraph.svelte.d.ts +18 -0
- package/{src/lib/components → components}/app/Section.svelte +0 -0
- package/components/app/Section.svelte.d.ts +27 -0
- package/{src/lib/components → components}/app/Table.svelte +0 -0
- package/components/app/Table.svelte.d.ts +27 -0
- package/{src/lib/components → components}/app/TextInput.svelte +9 -12
- package/components/app/TextInput.svelte.d.ts +22 -0
- package/{src/lib/components → components}/chapter/Atom.svelte +12 -18
- package/components/chapter/Atom.svelte.d.ts +19 -0
- package/components/chapter/Block.svelte +37 -0
- package/components/chapter/Block.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Callout.svelte +3 -6
- package/components/chapter/Callout.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/CaptionedCode.svelte +13 -21
- package/components/chapter/CaptionedCode.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/ChapterBody.svelte +9 -13
- package/components/chapter/ChapterBody.svelte.d.ts +19 -0
- package/{src/lib/components → components}/chapter/Citations.svelte +33 -34
- package/components/chapter/Citations.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Code.svelte +60 -64
- package/components/chapter/Code.svelte.d.ts +22 -0
- package/{src/lib/components → components}/chapter/Comment.svelte +18 -30
- package/components/chapter/Comment.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Definition.svelte +17 -23
- package/components/chapter/Definition.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Embed.svelte +77 -97
- package/components/chapter/Embed.svelte.d.ts +20 -0
- package/components/chapter/ErrorMessage.svelte +9 -0
- package/components/chapter/ErrorMessage.svelte.d.ts +17 -0
- package/components/chapter/ExtendedPrism.d.ts +2 -0
- package/{src/lib/components → components}/chapter/ExtendedPrism.js +0 -0
- package/{src/lib/components → components}/chapter/Figure.svelte +26 -34
- package/components/chapter/Figure.svelte.d.ts +24 -0
- package/{src/lib/components → components}/chapter/Footnote.svelte +20 -32
- package/components/chapter/Footnote.svelte.d.ts +19 -0
- package/{src/lib/components → components}/chapter/Format.svelte +34 -39
- package/components/chapter/Format.svelte.d.ts +19 -0
- package/{src/lib/components → components}/chapter/InlineCode.svelte +5 -9
- package/components/chapter/InlineCode.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Label.svelte +14 -23
- package/components/chapter/Label.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Link.svelte +21 -27
- package/components/chapter/Link.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/List.svelte +3 -5
- package/components/chapter/List.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Marginal.svelte +41 -54
- package/components/chapter/Marginal.svelte.d.ts +22 -0
- package/{src/lib/components → components}/chapter/Paragraph.svelte +20 -25
- package/components/chapter/Paragraph.svelte.d.ts +18 -0
- package/{src/lib/components → components}/chapter/Positioned.svelte +1 -4
- package/components/chapter/Positioned.svelte.d.ts +19 -0
- package/{src/lib/components → components}/chapter/Problem.svelte +0 -0
- package/components/chapter/Problem.svelte.d.ts +27 -0
- package/components/chapter/Python.svelte +128 -0
- package/components/chapter/Python.svelte.d.ts +18 -0
- package/{src/lib/components → components}/chapter/Quote.svelte +19 -13
- package/components/chapter/Quote.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Rule.svelte +1 -4
- package/components/chapter/Rule.svelte.d.ts +17 -0
- package/{src/lib/components → components}/chapter/Table.svelte +7 -11
- package/components/chapter/Table.svelte.d.ts +17 -0
- package/components/chapter/Text.svelte +87 -0
- package/components/chapter/Text.svelte.d.ts +18 -0
- package/components/editor/BookishEditor.svelte +884 -0
- package/components/editor/BookishEditor.svelte.d.ts +25 -0
- package/components/editor/CalloutEditor.svelte +10 -0
- package/components/editor/CalloutEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/CaptionedCodeEditor.svelte +6 -10
- package/components/editor/CaptionedCodeEditor.svelte.d.ts +17 -0
- package/components/editor/CaretContext.d.ts +50 -0
- package/components/editor/CaretContext.js +1 -0
- package/{src/lib/components/editor/CaretState.ts → components/editor/CaretState.d.ts} +7 -6
- package/components/editor/CaretState.js +1 -0
- package/{src/lib/components/editor/CaretUtilities.ts → components/editor/CaretUtilities.d.ts} +0 -1
- package/components/editor/CaretUtilities.js +1 -0
- package/{src/lib/components → components}/editor/CaretView.svelte +20 -25
- package/components/editor/CaretView.svelte.d.ts +25 -0
- package/components/editor/CitationsEditor.svelte +53 -0
- package/components/editor/CitationsEditor.svelte.d.ts +17 -0
- package/{src/lib/components/editor/Clipboard.ts → components/editor/Clipboard.d.ts} +1 -2
- package/components/editor/Clipboard.js +1 -0
- package/{src/lib/components/editor/Command.ts → components/editor/Command.d.ts} +2 -8
- package/components/editor/Command.js +1 -0
- package/components/editor/Commands.d.ts +3 -0
- package/{src/lib/components/editor/Commands.ts → components/editor/Commands.js} +315 -730
- package/components/editor/ConfirmButton.svelte +49 -0
- package/components/editor/ConfirmButton.svelte.d.ts +19 -0
- package/components/editor/DefinitionEditor.svelte +36 -0
- package/components/editor/DefinitionEditor.svelte.d.ts +17 -0
- package/components/editor/EmbedEditor.svelte +137 -0
- package/components/editor/EmbedEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/Icon.svelte +1 -2
- package/components/editor/Icon.svelte.d.ts +16 -0
- package/{src/lib/components → components}/editor/ImageChooser.svelte +19 -24
- package/components/editor/ImageChooser.svelte.d.ts +18 -0
- package/components/editor/InlineCodeEditor.svelte +12 -0
- package/components/editor/InlineCodeEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/LabelEditor.svelte +9 -14
- package/components/editor/LabelEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/LanguageEditor.svelte +5 -8
- package/components/editor/LanguageEditor.svelte.d.ts +17 -0
- package/components/editor/LinkEditor.svelte +100 -0
- package/components/editor/LinkEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/Note.svelte +0 -0
- package/components/editor/Note.svelte.d.ts +27 -0
- package/{src/lib/components → components}/editor/Permissions.svelte +36 -43
- package/components/editor/Permissions.svelte.d.ts +20 -0
- package/components/editor/PositionEditor.svelte +17 -0
- package/components/editor/PositionEditor.svelte.d.ts +18 -0
- package/components/editor/QuoteEditor.svelte +10 -0
- package/components/editor/QuoteEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/Switch.svelte +11 -14
- package/components/editor/Switch.svelte.d.ts +20 -0
- package/components/editor/TableEditor.svelte +10 -0
- package/components/editor/TableEditor.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/TextEditor.svelte +89 -101
- package/components/editor/TextEditor.svelte.d.ts +24 -0
- package/components/editor/Toggle.svelte +41 -0
- package/components/editor/Toggle.svelte.d.ts +19 -0
- package/components/editor/Toolbar.svelte +249 -0
- package/components/editor/Toolbar.svelte.d.ts +17 -0
- package/{src/lib/components → components}/editor/ToolbarGroup.svelte +3 -5
- package/components/editor/ToolbarGroup.svelte.d.ts +18 -0
- package/{src/lib/components → components}/editor/ToolbarSpacer.svelte +0 -0
- package/components/editor/ToolbarSpacer.svelte.d.ts +23 -0
- package/components/editor/URLEditor.svelte +13 -0
- package/components/editor/URLEditor.svelte.d.ts +18 -0
- package/{src/lib/components/editor/UndoState.ts → components/editor/UndoState.d.ts} +2 -3
- package/components/editor/UndoState.js +1 -0
- package/{src/lib/components → components}/editor/icons/annotate.svg +0 -0
- package/{src/lib/components → components}/editor/icons/block.svg +0 -0
- package/{src/lib/components → components}/editor/icons/bold.svg +0 -0
- package/{src/lib/components → components}/editor/icons/bullets.svg +0 -0
- package/{src/lib/components → components}/editor/icons/callout.svg +0 -0
- package/{src/lib/components → components}/editor/icons/citation.svg +0 -0
- package/{src/lib/components → components}/editor/icons/clear.svg +0 -0
- package/{src/lib/components → components}/editor/icons/clipboard.svg +0 -0
- package/{src/lib/components → components}/editor/icons/code.svg +0 -0
- package/{src/lib/components → components}/editor/icons/columnafter.svg +0 -0
- package/{src/lib/components → components}/editor/icons/columnbefore.svg +0 -0
- package/{src/lib/components → components}/editor/icons/comment.svg +0 -0
- package/{src/lib/components → components}/editor/icons/copy.svg +0 -0
- package/{src/lib/components → components}/editor/icons/cut.svg +0 -0
- package/{src/lib/components → components}/editor/icons/define.svg +0 -0
- package/{src/lib/components → components}/editor/icons/deletecolumn.svg +0 -0
- package/{src/lib/components → components}/editor/icons/deleterow.svg +0 -0
- package/{src/lib/components → components}/editor/icons/footnote.svg +0 -0
- package/{src/lib/components → components}/editor/icons/header1.svg +0 -0
- package/{src/lib/components → components}/editor/icons/header2.svg +0 -0
- package/{src/lib/components → components}/editor/icons/header3.svg +0 -0
- package/{src/lib/components → components}/editor/icons/home.svg +0 -0
- package/{src/lib/components → components}/editor/icons/indent.svg +0 -0
- package/{src/lib/components → components}/editor/icons/italic.svg +0 -0
- package/{src/lib/components → components}/editor/icons/label.svg +0 -0
- package/{src/lib/components → components}/editor/icons/left.svg +0 -0
- package/{src/lib/components → components}/editor/icons/level.svg +0 -0
- package/{src/lib/components → components}/editor/icons/link.svg +0 -0
- package/{src/lib/components → components}/editor/icons/list.svg +0 -0
- package/{src/lib/components → components}/editor/icons/media.svg +0 -0
- package/{src/lib/components → components}/editor/icons/middle.svg +0 -0
- package/{src/lib/components → components}/editor/icons/numbers.svg +0 -0
- package/{src/lib/components → components}/editor/icons/paragraph.svg +0 -0
- package/{src/lib/components → components}/editor/icons/paste.svg +0 -0
- package/{src/lib/components → components}/editor/icons/quote.svg +0 -0
- package/{src/lib/components → components}/editor/icons/redo.svg +0 -0
- package/{src/lib/components → components}/editor/icons/right.svg +0 -0
- package/{src/lib/components → components}/editor/icons/rowabove.svg +0 -0
- package/{src/lib/components → components}/editor/icons/rowbelow.svg +0 -0
- package/{src/lib/components → components}/editor/icons/rule.svg +0 -0
- package/{src/lib/components → components}/editor/icons/sub.svg +0 -0
- package/{src/lib/components → components}/editor/icons/super.svg +0 -0
- package/{src/lib/components → components}/editor/icons/table.svg +0 -0
- package/{src/lib/components → components}/editor/icons/text.svg +0 -0
- package/{src/lib/components → components}/editor/icons/time.svg +0 -0
- package/{src/lib/components → components}/editor/icons/undo.svg +0 -0
- package/{src/lib/components → components}/editor/icons/unindent.svg +0 -0
- package/{src/lib/components → components}/editor/icons/unlink.svg +0 -0
- package/{src/lib/components → components}/page/Acknowledgements.svelte +10 -19
- package/components/page/Acknowledgements.svelte.d.ts +14 -0
- package/components/page/Authors.svelte +85 -0
- package/components/page/Authors.svelte.d.ts +21 -0
- package/components/page/BookLoader.svelte +59 -0
- package/components/page/BookLoader.svelte.d.ts +16 -0
- package/components/page/BulkReferenceEditor.svelte +63 -0
- package/components/page/BulkReferenceEditor.svelte.d.ts +14 -0
- package/components/page/Chapter.svelte +393 -0
- package/components/page/Chapter.svelte.d.ts +18 -0
- package/components/page/ChapterContext.d.ts +10 -0
- package/components/page/ChapterContext.js +1 -0
- package/{src/lib/components → components}/page/ChapterNumber.svelte +0 -0
- package/components/page/ChapterNumber.svelte.d.ts +27 -0
- package/{src/lib/components → components}/page/ChapterTitle.svelte +2 -4
- package/components/page/ChapterTitle.svelte.d.ts +18 -0
- package/components/page/Contexts.d.ts +47 -0
- package/components/page/Contexts.js +133 -0
- package/{src/lib/components → components}/page/DefinitionView.svelte +38 -53
- package/components/page/DefinitionView.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/Description.svelte +7 -15
- package/components/page/Description.svelte.d.ts +14 -0
- package/components/page/Edition.svelte +161 -0
- package/components/page/Edition.svelte.d.ts +20 -0
- package/components/page/EditionLoader.svelte +99 -0
- package/components/page/EditionLoader.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/Editions.svelte +18 -22
- package/components/page/Editions.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Glossary.svelte +28 -33
- package/components/page/Glossary.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Header.svelte +52 -59
- package/components/page/Header.svelte.d.ts +29 -0
- package/{src/lib/components → components}/page/Index.svelte +47 -50
- package/components/page/Index.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Instructions.svelte +1 -2
- package/components/page/Instructions.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/License.svelte +9 -17
- package/components/page/License.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Loading.svelte +0 -0
- package/components/page/Loading.svelte.d.ts +23 -0
- package/{src/lib/components → components}/page/Media.svelte +27 -44
- package/components/page/Media.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/MediaPreview.svelte +2 -3
- package/components/page/MediaPreview.svelte.d.ts +19 -0
- package/{src/lib/components → components}/page/Muted.svelte +0 -0
- package/components/page/Muted.svelte.d.ts +27 -0
- package/{src/lib/components → components}/page/Outline.svelte +110 -140
- package/components/page/Outline.svelte.d.ts +19 -0
- package/components/page/Page.svelte +84 -0
- package/components/page/Page.svelte.d.ts +19 -0
- package/{src/lib/components → components}/page/PageHeader.svelte +1 -2
- package/components/page/PageHeader.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/PageParagraph.svelte +0 -0
- package/components/page/PageParagraph.svelte.d.ts +27 -0
- package/components/page/PossibleChapter.svelte +14 -0
- package/components/page/PossibleChapter.svelte.d.ts +14 -0
- package/components/page/PossibleReference.svelte +11 -0
- package/components/page/PossibleReference.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/Print.svelte +3 -5
- package/components/page/Print.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Publish.svelte +52 -59
- package/components/page/Publish.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Reference.svelte +30 -39
- package/components/page/Reference.svelte.d.ts +17 -0
- package/{src/lib/components → components}/page/References.svelte +14 -18
- package/components/page/References.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Rows.svelte +0 -0
- package/components/page/Rows.svelte.d.ts +27 -0
- package/components/page/Search.svelte +133 -0
- package/components/page/Search.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/Status.svelte +3 -5
- package/components/page/Status.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/SubdomainEditor.svelte +13 -16
- package/components/page/SubdomainEditor.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/TableOfContents.svelte +68 -79
- package/components/page/TableOfContents.svelte.d.ts +14 -0
- package/components/page/TableOfContentsImage.svelte +18 -0
- package/components/page/TableOfContentsImage.svelte.d.ts +16 -0
- package/{src/lib/components → components}/page/TableOfContentsRow.svelte +24 -34
- package/components/page/TableOfContentsRow.svelte.d.ts +24 -0
- package/{src/lib/components → components}/page/ThemeEditor.svelte +33 -44
- package/components/page/ThemeEditor.svelte.d.ts +14 -0
- package/{src/lib/components → components}/page/ThemeEditorPreview.svelte +12 -21
- package/components/page/ThemeEditorPreview.svelte.d.ts +17 -0
- package/components/page/ThemeSetEditor.svelte +19 -0
- package/components/page/ThemeSetEditor.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/ThemeVariableEditor.svelte +14 -18
- package/components/page/ThemeVariableEditor.svelte.d.ts +18 -0
- package/{src/lib/components → components}/page/Title.svelte +0 -0
- package/components/page/Title.svelte.d.ts +27 -0
- package/{src/lib/components → components}/page/Unknown.svelte +8 -10
- package/components/page/Unknown.svelte.d.ts +16 -0
- package/components/page/margins.d.ts +2 -0
- package/{src/lib/components/page/margins.ts → components/page/margins.js} +46 -79
- package/index.d.ts +15 -0
- package/{src/lib/index.js → index.js} +0 -0
- package/models/CRUD.d.ts +27 -0
- package/models/CRUD.js +262 -0
- package/models/Firebase.d.ts +5 -0
- package/{src/lib/models/Firebase.ts → models/Firebase.js} +16 -26
- package/models/book/Book.d.ts +61 -0
- package/models/book/Book.js +135 -0
- package/models/book/BookMedia.d.ts +23 -0
- package/models/book/BookMedia.js +108 -0
- package/models/book/BookSaveStatus.d.ts +7 -0
- package/models/book/BookSaveStatus.js +8 -0
- package/models/book/Chapter.d.ts +81 -0
- package/models/book/Chapter.js +212 -0
- package/models/book/ChapterID.d.ts +10 -0
- package/{src/lib/models/book/ChapterID.ts → models/book/ChapterID.js} +0 -1
- package/models/book/Definition.d.ts +6 -0
- package/models/book/Definition.js +1 -0
- package/models/book/Edition.d.ts +139 -0
- package/models/book/Edition.js +620 -0
- package/models/book/Reference.d.ts +24 -0
- package/models/book/Reference.js +78 -0
- package/models/book/Schema.d.ts +174 -0
- package/{src/lib/models/book/Schema.ts → models/book/Schema.js} +0 -1
- package/models/book/Theme.d.ts +113 -0
- package/{src/lib/models/book/Theme.ts → models/book/Theme.js} +6 -110
- package/{src/lib/models/book/ThemeColors.ts → models/book/ThemeColors.d.ts} +0 -6
- package/models/book/ThemeColors.js +1 -0
- package/models/book/Words.d.ts +2 -0
- package/{src/lib/models/book/Words.ts → models/book/Words.js} +0 -1
- package/models/chapter/AtomNode.d.ts +18 -0
- package/{src/lib/models/chapter/AtomNode.ts → models/chapter/AtomNode.js} +10 -30
- package/models/chapter/BlockNode.d.ts +20 -0
- package/{src/lib/models/chapter/BlockNode.ts → models/chapter/BlockNode.js} +47 -80
- package/models/chapter/BlocksNode.d.ts +50 -0
- package/{src/lib/models/chapter/BlocksNode.ts → models/chapter/BlocksNode.js} +359 -571
- package/models/chapter/BlocksNode.test.d.ts +1 -0
- package/models/chapter/BlocksNode.test.js +568 -0
- package/{src/lib/models/chapter/Bookkeeping.ts → models/chapter/Bookkeeping.d.ts} +0 -0
- package/models/chapter/Bookkeeping.js +1 -0
- package/models/chapter/CalloutNode.d.ts +17 -0
- package/models/chapter/CalloutNode.js +58 -0
- package/models/chapter/Caret.d.ts +23 -0
- package/{src/lib/models/chapter/Caret.ts → models/chapter/Caret.js} +26 -50
- package/models/chapter/ChapterNode.d.ts +34 -0
- package/models/chapter/ChapterNode.js +117 -0
- package/models/chapter/CitationsNode.d.ts +16 -0
- package/{src/lib/models/chapter/CitationsNode.ts → models/chapter/CitationsNode.js} +10 -17
- package/models/chapter/CodeNode.d.ts +35 -0
- package/{src/lib/models/chapter/CodeNode.ts → models/chapter/CodeNode.js} +62 -125
- package/models/chapter/CommentNode.d.ts +18 -0
- package/models/chapter/CommentNode.js +48 -0
- package/models/chapter/DefinitionNode.d.ts +12 -0
- package/{src/lib/models/chapter/DefinitionNode.ts → models/chapter/DefinitionNode.js} +8 -14
- package/models/chapter/Edit.d.ts +7 -0
- package/models/chapter/Edit.js +1 -0
- package/models/chapter/EmbedNode.d.ts +45 -0
- package/models/chapter/EmbedNode.js +168 -0
- package/models/chapter/ErrorNode.d.ts +17 -0
- package/{src/lib/models/chapter/ErrorNode.ts → models/chapter/ErrorNode.js} +8 -15
- package/models/chapter/FootnoteNode.d.ts +18 -0
- package/models/chapter/FootnoteNode.js +47 -0
- package/models/chapter/FormatNode.d.ts +60 -0
- package/{src/lib/models/chapter/FormatNode.ts → models/chapter/FormatNode.js} +262 -443
- package/models/chapter/FormatNode.test.d.ts +1 -0
- package/models/chapter/FormatNode.test.js +96 -0
- package/models/chapter/InlineCodeNode.d.ts +12 -0
- package/{src/lib/models/chapter/InlineCodeNode.ts → models/chapter/InlineCodeNode.js} +9 -17
- package/models/chapter/LabelNode.d.ts +17 -0
- package/{src/lib/models/chapter/LabelNode.ts → models/chapter/LabelNode.js} +10 -26
- package/models/chapter/LinkNode.d.ts +12 -0
- package/{src/lib/models/chapter/LinkNode.ts → models/chapter/LinkNode.js} +7 -12
- package/models/chapter/ListNode.d.ts +51 -0
- package/{src/lib/models/chapter/ListNode.ts → models/chapter/ListNode.js} +200 -277
- package/models/chapter/ListNode.test.d.ts +1 -0
- package/{src/lib/models/chapter/ListNode.test.ts → models/chapter/ListNode.test.js} +20 -57
- package/models/chapter/MetadataNode.d.ts +17 -0
- package/models/chapter/MetadataNode.js +32 -0
- package/models/chapter/Node.d.ts +38 -0
- package/{src/lib/models/chapter/Node.ts → models/chapter/Node.js} +71 -155
- package/models/chapter/Node.test.d.ts +1 -0
- package/{src/lib/models → models}/chapter/Node.test.js +0 -0
- package/models/chapter/ParagraphNode.d.ts +33 -0
- package/{src/lib/models/chapter/ParagraphNode.ts → models/chapter/ParagraphNode.js} +58 -95
- package/models/chapter/ParagraphNode.test.d.ts +1 -0
- package/models/chapter/ParagraphNode.test.js +30 -0
- package/models/chapter/Parser.d.ts +75 -0
- package/{src/lib/models/chapter/Parser.ts → models/chapter/Parser.js} +184 -369
- package/models/chapter/Parser.test.d.ts +1 -0
- package/{src/lib/models/chapter/Parser.test.ts → models/chapter/Parser.test.js} +0 -7
- package/{src/lib/models/chapter/Position.ts → models/chapter/Position.d.ts} +0 -0
- package/models/chapter/Position.js +1 -0
- package/models/chapter/QuoteNode.d.ts +25 -0
- package/models/chapter/QuoteNode.js +99 -0
- package/{src/lib/models/chapter/RootNode.ts → models/chapter/RootNode.d.ts} +0 -2
- package/models/chapter/RootNode.js +1 -0
- package/models/chapter/RuleNode.d.ts +15 -0
- package/{src/lib/models/chapter/RuleNode.ts → models/chapter/RuleNode.js} +6 -9
- package/models/chapter/TableNode.d.ts +37 -0
- package/{src/lib/models/chapter/TableNode.ts → models/chapter/TableNode.js} +82 -141
- package/models/chapter/TableNode.test.d.ts +1 -0
- package/{src/lib/models/chapter/TableNode.test.ts → models/chapter/TableNode.test.js} +10 -27
- package/models/chapter/TextNode.d.ts +36 -0
- package/{src/lib/models/chapter/TextNode.ts → models/chapter/TextNode.js} +65 -117
- package/models/chapter/TextNode.test.d.ts +1 -0
- package/{src/lib/models/chapter/TextNode.test.ts → models/chapter/TextNode.test.js} +0 -2
- package/package.json +270 -53
- package/util/getSubdomain.d.ts +3 -0
- package/{src/lib/util/getSubdomain.ts → util/getSubdomain.js} +8 -14
- package/util/isMobile.d.ts +2 -0
- package/{src/lib/util/isMobile.ts → util/isMobile.js} +0 -1
- package/util/mineReference.d.ts +4 -0
- package/{src/lib/util/mineReference.ts → util/mineReference.js} +25 -45
- package/util/scrollToEyeLevel.d.ts +2 -0
- package/{src/lib/util/scrollToEyeLevel.ts → util/scrollToEyeLevel.js} +2 -4
- package/.env.example +0 -8
- package/.firebaserc +0 -8
- package/.prettierignore +0 -8
- package/.prettierrc.json +0 -5
- package/_update-notifier-last-checked +0 -0
- package/firebase.json +0 -46
- package/firestore.indexes.json +0 -4
- package/firestore.rules +0 -59
- package/functions/.eslintrc.js +0 -28
- package/functions/package-lock.json +0 -12595
- package/functions/package.json +0 -43
- package/functions/src/index.ts +0 -345
- package/functions/tsconfig.dev.json +0 -3
- package/functions/tsconfig.json +0 -15
- package/scripts/claims.cjs +0 -99
- package/src/app.d.ts +0 -9
- package/src/app.html +0 -24
- package/src/lib/components/Auth.svelte +0 -65
- package/src/lib/components/Link.svelte +0 -58
- package/src/lib/components/chapter/Block.svelte +0 -42
- package/src/lib/components/chapter/ErrorMessage.svelte +0 -12
- package/src/lib/components/chapter/Python.svelte +0 -144
- package/src/lib/components/chapter/Text.svelte +0 -109
- package/src/lib/components/editor/BookishEditor.svelte +0 -1101
- package/src/lib/components/editor/CalloutEditor.svelte +0 -14
- package/src/lib/components/editor/CaretContext.ts +0 -55
- package/src/lib/components/editor/CitationsEditor.svelte +0 -64
- package/src/lib/components/editor/ConfirmButton.svelte +0 -51
- package/src/lib/components/editor/DefinitionEditor.svelte +0 -44
- package/src/lib/components/editor/EmbedEditor.svelte +0 -152
- package/src/lib/components/editor/InlineCodeEditor.svelte +0 -16
- package/src/lib/components/editor/LinkEditor.svelte +0 -110
- package/src/lib/components/editor/PositionEditor.svelte +0 -21
- package/src/lib/components/editor/QuoteEditor.svelte +0 -14
- package/src/lib/components/editor/TableEditor.svelte +0 -14
- package/src/lib/components/editor/Toggle.svelte +0 -47
- package/src/lib/components/editor/Toolbar.svelte +0 -297
- package/src/lib/components/editor/URLEditor.svelte +0 -15
- package/src/lib/components/page/Authors.svelte +0 -92
- package/src/lib/components/page/BookLoader.svelte +0 -77
- package/src/lib/components/page/BulkReferenceEditor.svelte +0 -86
- package/src/lib/components/page/Chapter.svelte +0 -449
- package/src/lib/components/page/ChapterContext.ts +0 -13
- package/src/lib/components/page/Contexts.ts +0 -176
- package/src/lib/components/page/Edition.svelte +0 -189
- package/src/lib/components/page/EditionLoader.svelte +0 -123
- package/src/lib/components/page/Page.svelte +0 -94
- package/src/lib/components/page/PossibleChapter.svelte +0 -16
- package/src/lib/components/page/PossibleReference.svelte +0 -14
- package/src/lib/components/page/Search.svelte +0 -153
- package/src/lib/components/page/TableOfContentsImage.svelte +0 -22
- package/src/lib/components/page/ThemeSetEditor.svelte +0 -21
- package/src/lib/models/CRUD.ts +0 -469
- package/src/lib/models/book/Book.ts +0 -283
- package/src/lib/models/book/BookMedia.ts +0 -182
- package/src/lib/models/book/BookSaveStatus.ts +0 -8
- package/src/lib/models/book/Chapter.ts +0 -462
- package/src/lib/models/book/Definition.ts +0 -2
- package/src/lib/models/book/Edition.ts +0 -1216
- package/src/lib/models/book/Reference.ts +0 -171
- package/src/lib/models/chapter/BlocksNode.test.ts +0 -867
- package/src/lib/models/chapter/CalloutNode.ts +0 -79
- package/src/lib/models/chapter/ChapterNode.ts +0 -169
- package/src/lib/models/chapter/CommentNode.ts +0 -61
- package/src/lib/models/chapter/Edit.ts +0 -6
- package/src/lib/models/chapter/EmbedNode.ts +0 -257
- package/src/lib/models/chapter/FootnoteNode.ts +0 -59
- package/src/lib/models/chapter/FormatNode.test.ts +0 -137
- package/src/lib/models/chapter/MetadataNode.ts +0 -44
- package/src/lib/models/chapter/ParagraphNode.test.ts +0 -54
- package/src/lib/models/chapter/QuoteNode.ts +0 -135
- package/src/params/edition.ts +0 -3
- package/src/routes/+error.svelte +0 -12
- package/src/routes/+layout.svelte +0 -241
- package/src/routes/+page.svelte +0 -43
- package/src/routes/Footer.svelte +0 -0
- package/src/routes/Header.svelte +0 -112
- package/src/routes/[bookid]/+layout.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/+error.svelte +0 -14
- package/src/routes/[bookid]/[[editionid=edition]]/+layout.svelte +0 -7
- package/src/routes/[bookid]/[[editionid=edition]]/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/glossary/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/media/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/print/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/references/+page.svelte +0 -5
- package/src/routes/[bookid]/[[editionid=edition]]/search/+page.svelte +0 -5
- package/src/routes/[bookid]/editions/+page.svelte +0 -20
- package/src/routes/about/+page.svelte +0 -102
- package/src/routes/confirm/+page.svelte +0 -62
- package/src/routes/email/+page.svelte +0 -99
- package/src/routes/login/+page.svelte +0 -66
- package/src/routes/read/+page.svelte +0 -38
- package/src/routes/write/+error.svelte +0 -10
- package/src/routes/write/+layout.svelte +0 -11
- package/src/routes/write/+page.svelte +0 -114
- package/src/routes/write/[bookid]/+layout.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/+layout.svelte +0 -7
- package/src/routes/write/[bookid]/[[editionid=edition]]/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/[chapterid]/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/glossary/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/index/[[letter]]/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/media/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/print/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/references/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/search/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/theme/+page.svelte +0 -5
- package/src/routes/write/[bookid]/[[editionid=edition]]/unknown/+page.svelte +0 -5
- package/src/routes/write/[bookid]/editions/+page.svelte +0 -20
- package/src/vite-env.d.ts +0 -1
- package/static/icons/favicon.png +0 -0
- package/static/icons/icon.png +0 -0
- package/static/icons/ios-icon.png +0 -0
- package/storage.rules +0 -9
- package/svelte.config.js +0 -19
- package/tsconfig.json +0 -18
- package/tsconfig.node.json +0 -9
- package/vite.config.ts +0 -8
- package/vite.reader.config.ts +0 -32
package/functions/package.json
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "functions",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"scripts": {
|
|
5
|
-
"lint": "eslint --ext .js,.ts .",
|
|
6
|
-
"build": "tsc",
|
|
7
|
-
"build:watch": "tsc --watch",
|
|
8
|
-
"serve": "npm run build && firebase emulators:start --only functions",
|
|
9
|
-
"shell": "npm run build && firebase functions:shell",
|
|
10
|
-
"start": "npm run shell",
|
|
11
|
-
"deploy": "firebase deploy --only functions",
|
|
12
|
-
"logs": "firebase functions:log"
|
|
13
|
-
},
|
|
14
|
-
"engines": {
|
|
15
|
-
"node": "18"
|
|
16
|
-
},
|
|
17
|
-
"main": "lib/index.js",
|
|
18
|
-
"dependencies": {
|
|
19
|
-
"@google-cloud/storage": "^6.5.2",
|
|
20
|
-
"bookish-press": "latest",
|
|
21
|
-
"firebase-admin": "^11.4.1",
|
|
22
|
-
"firebase-functions": "^4.2.1",
|
|
23
|
-
"zip-a-folder": "^1.1.5",
|
|
24
|
-
"typescript": "^4.5.4",
|
|
25
|
-
"@sveltejs/adapter-static": "^1.0.6",
|
|
26
|
-
"@sveltejs/kit": "1.3.10",
|
|
27
|
-
"svelte": "^3.55.1",
|
|
28
|
-
"svelte-preprocess": "^5.0.1",
|
|
29
|
-
"vite": "^4.1.1"
|
|
30
|
-
},
|
|
31
|
-
"devDependencies": {
|
|
32
|
-
"@typescript-eslint/eslint-plugin": "^5.12.0",
|
|
33
|
-
"@typescript-eslint/parser": "^5.12.0",
|
|
34
|
-
"eslint": "^8.9.0",
|
|
35
|
-
"eslint-config-google": "^0.14.0",
|
|
36
|
-
"eslint-plugin-import": "^2.25.4",
|
|
37
|
-
"firebase-functions-test": "^0.2.0",
|
|
38
|
-
"typescript": "^4.5.4",
|
|
39
|
-
"svelte-check": "^3.0.3",
|
|
40
|
-
"tslib": "^2.5.0"
|
|
41
|
-
},
|
|
42
|
-
"private": true
|
|
43
|
-
}
|
package/functions/src/index.ts
DELETED
|
@@ -1,345 +0,0 @@
|
|
|
1
|
-
import functions from 'firebase-functions';
|
|
2
|
-
import { ObjectMetadata } from 'firebase-functions/v1/storage';
|
|
3
|
-
import admin from 'firebase-admin';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import os from 'os';
|
|
6
|
-
import fs from 'fs';
|
|
7
|
-
import { spawn } from 'child_process';
|
|
8
|
-
import { EditionSpecification } from 'bookish-press/models/book/Edition';
|
|
9
|
-
import { zip } from 'zip-a-folder';
|
|
10
|
-
import { build } from 'vite';
|
|
11
|
-
|
|
12
|
-
admin.initializeApp();
|
|
13
|
-
|
|
14
|
-
function getThumbnailPath(filePath: string) {
|
|
15
|
-
const fileName = path.basename(filePath);
|
|
16
|
-
const thumbFileName = `${fileName}`;
|
|
17
|
-
return path.join(path.dirname(filePath), 'thumbnails/', thumbFileName);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async function resizeImage(
|
|
21
|
-
filePath: string,
|
|
22
|
-
bucketID: string,
|
|
23
|
-
contentType: string | undefined
|
|
24
|
-
) {
|
|
25
|
-
const fileName = path.basename(filePath);
|
|
26
|
-
|
|
27
|
-
// Download file from bucket into a temporary location.
|
|
28
|
-
const bucket = admin.storage().bucket(bucketID);
|
|
29
|
-
const tempFilePath = path.join(os.tmpdir(), fileName);
|
|
30
|
-
console.log('Downloading image to', tempFilePath);
|
|
31
|
-
|
|
32
|
-
await bucket.file(filePath).download({ destination: tempFilePath });
|
|
33
|
-
|
|
34
|
-
// Generate a thumbnail using ImageMagick, which is installed by default in Google Cloud.
|
|
35
|
-
// Note: to test locally, ImageMagick has to be installed locally.
|
|
36
|
-
// If you're getting "Error: spawn convert ENOENT" when using the emu.ator, it's because it's not
|
|
37
|
-
// installed locally. On mac OS, "brew install imagemagick" should suffice.
|
|
38
|
-
console.log('Resizing downloaded image...');
|
|
39
|
-
await execute('convert', [
|
|
40
|
-
tempFilePath,
|
|
41
|
-
'-thumbnail',
|
|
42
|
-
'320x320>',
|
|
43
|
-
tempFilePath,
|
|
44
|
-
]);
|
|
45
|
-
|
|
46
|
-
const thumbFilePath = getThumbnailPath(filePath);
|
|
47
|
-
|
|
48
|
-
console.log('Uploading resized image to ', thumbFilePath);
|
|
49
|
-
|
|
50
|
-
// Uploading the thumbnail.
|
|
51
|
-
await bucket.upload(tempFilePath, {
|
|
52
|
-
destination: thumbFilePath,
|
|
53
|
-
metadata: { contentType: contentType },
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Once the thumbnail has been uploaded delete the local file to free up disk space.
|
|
57
|
-
return await fs.unlinkSync(tempFilePath);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export const createThumbnail = functions.storage
|
|
61
|
-
.object()
|
|
62
|
-
.onFinalize(async (object: ObjectMetadata) => {
|
|
63
|
-
if (object.name === undefined) {
|
|
64
|
-
console.log('Unknown file uploaded.');
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (!object.name.startsWith('images/')) {
|
|
68
|
-
console.log('Non-image uploaded, ignoring');
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (object.name.includes('thumbnails/')) {
|
|
72
|
-
console.log('Thumbnail uploaded, ignoring.');
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return resizeImage(object.name, object.bucket, object.contentType);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
export const deleteThumbnail = functions.storage
|
|
80
|
-
.object()
|
|
81
|
-
.onDelete(async (object: ObjectMetadata) => {
|
|
82
|
-
if (object.name === undefined) {
|
|
83
|
-
console.log('Unknown file uploaded.');
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (!object.name.startsWith('images/')) {
|
|
87
|
-
console.log('Non-image deleted, ignoring');
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
if (object.name.includes('thumbnails/')) {
|
|
91
|
-
console.log('Thumbnail deleted, ignoring.');
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Download file from bucket into a temporary location.
|
|
96
|
-
const bucket = admin.storage().bucket(object.bucket);
|
|
97
|
-
const thumbFilePath = getThumbnailPath(object.name);
|
|
98
|
-
|
|
99
|
-
console.log(`Deleting ${thumbFilePath}`);
|
|
100
|
-
|
|
101
|
-
return await bucket.file(thumbFilePath).delete();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
export const getUserEmails = functions.https.onCall(
|
|
105
|
-
async (data: { uids: string[] }): Promise<Record<string, string>> => {
|
|
106
|
-
const uids = data.uids;
|
|
107
|
-
|
|
108
|
-
const users = await admin.auth().getUsers(
|
|
109
|
-
uids.map((uid) => {
|
|
110
|
-
return { uid };
|
|
111
|
-
})
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
const map: Record<string, string> = {};
|
|
115
|
-
users.users.forEach((user) => {
|
|
116
|
-
map[user.uid] = user.email ?? '';
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
return map;
|
|
120
|
-
}
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
export const createUserWithEmail = functions.https.onCall(
|
|
124
|
-
async (data: { email: string }): Promise<string | null> => {
|
|
125
|
-
// First try to get the user, in case they already exist.
|
|
126
|
-
try {
|
|
127
|
-
const existingUser = await admin.auth().getUserByEmail(data.email);
|
|
128
|
-
return existingUser.uid;
|
|
129
|
-
} catch (_) {}
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
const user = await admin.auth().createUser({ email: data.email });
|
|
133
|
-
return user.uid;
|
|
134
|
-
} catch (error) {
|
|
135
|
-
console.log(error);
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
export const publishEdition = functions
|
|
142
|
-
// This takes some time and some memory -- testing showed that it regularly exceeded 256 MB and >1 minute.
|
|
143
|
-
.runWith({ timeoutSeconds: 300, memory: '1GB' })
|
|
144
|
-
.https.onCall(async (data: { bookID: string; editionID: string }) => {
|
|
145
|
-
const { bookID, editionID } = data;
|
|
146
|
-
|
|
147
|
-
// Move to a temporary folder workspace.
|
|
148
|
-
const tempDir = os.tmpdir();
|
|
149
|
-
process.chdir(tempDir);
|
|
150
|
-
|
|
151
|
-
console.log(`Created temporary folder at ${tempDir}`);
|
|
152
|
-
|
|
153
|
-
// If there's already something in /bookish-reader, remove it all for a fresh build.
|
|
154
|
-
if (fs.existsSync('bookish-reader')) {
|
|
155
|
-
console.log('Cleaning folder to prepare for build...');
|
|
156
|
-
await execute('rm', ['-rf', 'bookish-reader']);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Clone the reader repo
|
|
160
|
-
console.log('Cloning book template...');
|
|
161
|
-
await execute('git', [
|
|
162
|
-
'clone',
|
|
163
|
-
'https://github.com/amyjko/bookish-reader',
|
|
164
|
-
]);
|
|
165
|
-
|
|
166
|
-
// Move inside the reader
|
|
167
|
-
console.log('Changing to book folder...');
|
|
168
|
-
process.chdir(path.join(tempDir, 'bookish-reader'));
|
|
169
|
-
|
|
170
|
-
// Retrieve the edition
|
|
171
|
-
console.log('Retrieving edition from database...');
|
|
172
|
-
const editionDoc = admin
|
|
173
|
-
.firestore()
|
|
174
|
-
.doc(`books/${bookID}/editions/${editionID}`);
|
|
175
|
-
const editionData = await editionDoc.get();
|
|
176
|
-
if (!editionData.exists) {
|
|
177
|
-
console.log("Couldn't get ediition from firestore, bailing.");
|
|
178
|
-
return "Unknown book edition, can't publish.";
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const editionJSON = editionData.data() as EditionSpecification;
|
|
182
|
-
|
|
183
|
-
// Retrieve all edition's chapter text.
|
|
184
|
-
for (const chapter of editionJSON.chapters) {
|
|
185
|
-
console.log(
|
|
186
|
-
`Retrieving chapter ${chapter.id} text and creating its route...`
|
|
187
|
-
);
|
|
188
|
-
if (chapter.ref === undefined) {
|
|
189
|
-
console.log(
|
|
190
|
-
'No chapter ID in the chapter edition metadata, bailing.'
|
|
191
|
-
);
|
|
192
|
-
return "Missing chapter, can't published book.";
|
|
193
|
-
}
|
|
194
|
-
const chapterPath = `books/${bookID}/editions/${editionID}/chapters/${chapter.ref.id}`;
|
|
195
|
-
const chapterData = await admin.firestore().doc(chapterPath).get();
|
|
196
|
-
if (!chapterData.exists) {
|
|
197
|
-
console.log(`Couldn't resolve chapter "${chapterPath}"`);
|
|
198
|
-
return "Missing chapter text, can't publish.";
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const chapterText = chapterData.data()?.text;
|
|
202
|
-
if (chapterText === undefined) {
|
|
203
|
-
console.log(`Found chapter data, but it had no text."`);
|
|
204
|
-
return "Missing chapter text, can't publishing.";
|
|
205
|
-
}
|
|
206
|
-
chapter.text = chapterText;
|
|
207
|
-
|
|
208
|
-
// Create a route for the chapter and a page with renders its contents.
|
|
209
|
-
try {
|
|
210
|
-
const routePath = `src/routes/${chapter.id}`;
|
|
211
|
-
fs.mkdirSync(routePath);
|
|
212
|
-
// Copy the +page.svelte template from the assets folder.
|
|
213
|
-
fs.copyFileSync(
|
|
214
|
-
`src/lib/assets/+page.svelte`,
|
|
215
|
-
`${routePath}/+page.svelte`
|
|
216
|
-
);
|
|
217
|
-
console.log(`Created route for chapter ${chapter.id}`);
|
|
218
|
-
} catch (err) {
|
|
219
|
-
console.log(err);
|
|
220
|
-
return `Couldn't create chapter ${chapter.id} route.`;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Create a book.json that stores the edition data.
|
|
225
|
-
// the bookish-reader template uses this as a state asset to
|
|
226
|
-
// render the book.
|
|
227
|
-
try {
|
|
228
|
-
console.log('Writing edition.json to assets folder...');
|
|
229
|
-
fs.writeFileSync(
|
|
230
|
-
'src/lib/assets/edition.json',
|
|
231
|
-
JSON.stringify(editionJSON, null, 2)
|
|
232
|
-
);
|
|
233
|
-
} catch (err) {
|
|
234
|
-
console.log(err);
|
|
235
|
-
return `Couldn't create book metadata`;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Build a static version of the book for the web.
|
|
239
|
-
try {
|
|
240
|
-
console.log('Building book...');
|
|
241
|
-
|
|
242
|
-
await execute('npm', ['exec', 'svelte-kit', 'sync']);
|
|
243
|
-
|
|
244
|
-
// At this point, all of the Svelte, Sveltekit, Vite, and bookish-reader dependencies should already be installed.
|
|
245
|
-
const output = await build();
|
|
246
|
-
|
|
247
|
-
console.log(output);
|
|
248
|
-
|
|
249
|
-
console.log('Checking if build was successful...');
|
|
250
|
-
if (fs.existsSync('build')) console.log('Successfully built book.');
|
|
251
|
-
else {
|
|
252
|
-
console.log('It was not.');
|
|
253
|
-
console.log('Here are the files in the folder...');
|
|
254
|
-
fs.readdirSync('.').forEach((file) => {
|
|
255
|
-
console.log(file);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
return 'Could not build book.';
|
|
259
|
-
}
|
|
260
|
-
} catch (err) {
|
|
261
|
-
console.log('Build error: ' + err);
|
|
262
|
-
return 'Could not create book.';
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
const zipFileName = 'book.zip';
|
|
266
|
-
|
|
267
|
-
try {
|
|
268
|
-
console.log('Zipping book for download...');
|
|
269
|
-
await zip('build', zipFileName);
|
|
270
|
-
} catch (err) {
|
|
271
|
-
console.log("Couldn't zip book: " + err);
|
|
272
|
-
return "Couldn't compress book for download";
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
let downloadURL: string | undefined = undefined;
|
|
276
|
-
const bucket = admin.storage().bucket();
|
|
277
|
-
const zipFilePath = `${bookID}/${zipFileName}`;
|
|
278
|
-
try {
|
|
279
|
-
console.log('Compressed book. Uploading to cloud for download...');
|
|
280
|
-
|
|
281
|
-
await bucket.upload(zipFileName, {
|
|
282
|
-
destination: zipFilePath,
|
|
283
|
-
metadata: { contentType: 'application/zip' },
|
|
284
|
-
});
|
|
285
|
-
} catch (err) {
|
|
286
|
-
console.log(err);
|
|
287
|
-
return "Couldn't upload the book for download.";
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
try {
|
|
291
|
-
console.log('Uploaded zip. Requesting URL for download...');
|
|
292
|
-
[downloadURL] = await bucket.file(zipFilePath).getSignedUrl({
|
|
293
|
-
action: 'read',
|
|
294
|
-
expires: '03-09-2491',
|
|
295
|
-
});
|
|
296
|
-
} catch (err) {
|
|
297
|
-
console.log(err);
|
|
298
|
-
return "Couldn't get the URL for the download.";
|
|
299
|
-
}
|
|
300
|
-
// Upload everything to Firebase Hosting at the appropriate URL
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
*
|
|
304
|
-
* TODO I stopped here. Here's the proper API:
|
|
305
|
-
*
|
|
306
|
-
* https://firebase.google.com/docs/hosting/api-deploy.
|
|
307
|
-
*
|
|
308
|
-
* I got stuck on how to get an access token to call the Hosting API.
|
|
309
|
-
* I obviously can't follow the example of getting a service account key
|
|
310
|
-
* since there's no secure way to deploy one.
|
|
311
|
-
*/
|
|
312
|
-
|
|
313
|
-
console.log('Skipped hosting deploy :(');
|
|
314
|
-
|
|
315
|
-
return { url: downloadURL };
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
/** Turn spawn into a promise for comprehensibility */
|
|
319
|
-
async function execute(cmd: string, args: ReadonlyArray<string>) {
|
|
320
|
-
return new Promise<string>((resolve, reject) => {
|
|
321
|
-
try {
|
|
322
|
-
console.log(`Executing ${cmd} ${args.join(' ')}...`);
|
|
323
|
-
const process = spawn(cmd, args, { stdio: 'inherit' });
|
|
324
|
-
const error: string[] = [];
|
|
325
|
-
const stdout: string[] = [];
|
|
326
|
-
// Save each bit of standard output that comes out.
|
|
327
|
-
// process.stdout.on('data', (data) => {
|
|
328
|
-
// stdout.push(data.toString());
|
|
329
|
-
// });
|
|
330
|
-
|
|
331
|
-
// // Save the errors that come
|
|
332
|
-
// process.on('error', (e) => {
|
|
333
|
-
// error.push(e.toString());
|
|
334
|
-
// });
|
|
335
|
-
|
|
336
|
-
// When the process closes, resolve with the output or errors.
|
|
337
|
-
process.on('close', () => {
|
|
338
|
-
if (error.length) reject(error.join(''));
|
|
339
|
-
else resolve(stdout.join(''));
|
|
340
|
-
});
|
|
341
|
-
} catch (error) {
|
|
342
|
-
reject('' + error);
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
|
-
}
|
package/functions/tsconfig.json
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"module": "ESNext",
|
|
4
|
-
"esModuleInterop": true,
|
|
5
|
-
"moduleResolution": "node",
|
|
6
|
-
"noImplicitReturns": true,
|
|
7
|
-
"noUnusedLocals": true,
|
|
8
|
-
"outDir": "lib",
|
|
9
|
-
"sourceMap": true,
|
|
10
|
-
"strict": true,
|
|
11
|
-
"target": "es2017"
|
|
12
|
-
},
|
|
13
|
-
"compileOnSave": true,
|
|
14
|
-
"include": ["src"]
|
|
15
|
-
}
|
package/scripts/claims.cjs
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This script enables viewing and updating a user's claims.
|
|
3
|
-
* It's a bit clumsy, but there is no Firebase console support for this,
|
|
4
|
-
* so it's what we've got. Run it with `node claims.cjs`
|
|
5
|
-
*/
|
|
6
|
-
const admin = require('firebase-admin');
|
|
7
|
-
const { getAuth } = require('firebase-admin/auth');
|
|
8
|
-
|
|
9
|
-
// If there aren't any arguments, bail.
|
|
10
|
-
if (process.argv.length <= 2) {
|
|
11
|
-
console.log('usage:');
|
|
12
|
-
console.log('node claims.cjs [email] [dev|prod] [+|-] [publisher|admin]');
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Get the requested email and bail if none was provided.
|
|
17
|
-
const email = process.argv[2];
|
|
18
|
-
if (email === undefined) {
|
|
19
|
-
console.log('No email provided.');
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Get the project, either "dev" or "prod"
|
|
24
|
-
const project = process.argv[3];
|
|
25
|
-
if (project !== 'dev' && project !== 'prod') {
|
|
26
|
-
console.log(
|
|
27
|
-
`Expected 'dev' or 'prod' after email, but received ${project}`
|
|
28
|
-
);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Get the operation and bail if there wasn't one.
|
|
33
|
-
const operation = process.argv[4];
|
|
34
|
-
if (operation !== undefined && operation !== '+' && operation !== '-') {
|
|
35
|
-
console.log('Expected an + or - operation');
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Get the field
|
|
40
|
-
const privilege = process.argv[5];
|
|
41
|
-
if (
|
|
42
|
-
privilege !== undefined &&
|
|
43
|
-
privilege !== 'publisher' &&
|
|
44
|
-
privilege !== 'admin'
|
|
45
|
-
) {
|
|
46
|
-
console.log("Expected 'publisher' or 'admin' after the operation");
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
console.log('Reading service key...');
|
|
51
|
-
|
|
52
|
-
const serviceKeyPath = `../firebase-${project}-service-key.json`;
|
|
53
|
-
|
|
54
|
-
// Log in with the secret service key generated in the Firebase service accounts console.
|
|
55
|
-
const serviceAccount = require(`../bookish-${project}-firebase-service-key.json`);
|
|
56
|
-
|
|
57
|
-
if (serviceAccount === undefined) {
|
|
58
|
-
console.log(`Couldn't find service key at ${serviceKeyPath}`);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
console.log('Connecting to Firebase with key...');
|
|
63
|
-
|
|
64
|
-
// Initialize the SDK with the service account.
|
|
65
|
-
admin.initializeApp({
|
|
66
|
-
credential: admin.credential.cert(serviceAccount),
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// Add the publisher claim to the email address.
|
|
70
|
-
getAuth()
|
|
71
|
-
.getUserByEmail(email)
|
|
72
|
-
.then((user) => {
|
|
73
|
-
// Add incremental custom claim without overwriting existing claims.
|
|
74
|
-
let currentCustomClaims = user.customClaims;
|
|
75
|
-
|
|
76
|
-
// Reading? Just print.
|
|
77
|
-
if (operation === undefined) {
|
|
78
|
-
console.log(`${email}'s privileges are...`);
|
|
79
|
-
console.log(currentCustomClaims);
|
|
80
|
-
}
|
|
81
|
-
// Otherwise, update.
|
|
82
|
-
else {
|
|
83
|
-
if (currentCustomClaims === undefined) currentCustomClaims = {};
|
|
84
|
-
currentCustomClaims[privilege] = operation === '+';
|
|
85
|
-
// Add custom claims for additional privileges.
|
|
86
|
-
getAuth()
|
|
87
|
-
.setCustomUserClaims(user.uid, currentCustomClaims)
|
|
88
|
-
.then(() => {
|
|
89
|
-
console.log(
|
|
90
|
-
`Successfully ${
|
|
91
|
-
operation === '+' ? 'added' : 'removed'
|
|
92
|
-
} '${privilege}' privilege`
|
|
93
|
-
);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
})
|
|
97
|
-
.catch((error) => {
|
|
98
|
-
console.log(error);
|
|
99
|
-
});
|
package/src/app.d.ts
DELETED
package/src/app.html
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta
|
|
6
|
-
name="viewport"
|
|
7
|
-
content="width=device-width, initial-scale=1, shrink-to-fit=no"
|
|
8
|
-
/>
|
|
9
|
-
<link
|
|
10
|
-
rel="icon"
|
|
11
|
-
type="image/png"
|
|
12
|
-
href="%sveltekit.assets%/icons/favicon.png"
|
|
13
|
-
/>
|
|
14
|
-
<link
|
|
15
|
-
rel="apple-touch-icon"
|
|
16
|
-
sizes="180x180"
|
|
17
|
-
href="%sveltekit.assets%/icons/ios-icon.png"
|
|
18
|
-
/>
|
|
19
|
-
%sveltekit.head%
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
<div>%sveltekit.body%</div>
|
|
23
|
-
</body>
|
|
24
|
-
</html>
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { sendSignInLinkToEmail, type User } from 'firebase/auth';
|
|
3
|
-
import { onDestroy, setContext } from 'svelte';
|
|
4
|
-
import { writable, type Writable } from 'svelte/store';
|
|
5
|
-
import { auth } from '../models/Firebase';
|
|
6
|
-
import type Authentication from './Authentication';
|
|
7
|
-
import { USER, type UserStore } from './page/Contexts';
|
|
8
|
-
|
|
9
|
-
// Track the user and user loading status in state
|
|
10
|
-
let loading = true;
|
|
11
|
-
|
|
12
|
-
// The store that tracks the auth context.
|
|
13
|
-
const authentication: Writable<Authentication> = writable({
|
|
14
|
-
user: null,
|
|
15
|
-
loading: loading,
|
|
16
|
-
login,
|
|
17
|
-
logout,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// Login using Firebase's password-less email verification
|
|
21
|
-
async function login(email: string) {
|
|
22
|
-
// If connected to firebase...
|
|
23
|
-
if (auth) {
|
|
24
|
-
const actionCodeSettings = {
|
|
25
|
-
url: location.origin + '/confirm',
|
|
26
|
-
handleCodeInApp: true,
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
// Ask Firebase to log in with the given email
|
|
30
|
-
await sendSignInLinkToEmail(auth, email, actionCodeSettings);
|
|
31
|
-
// Remember the email in local storage so we don't have to ask for it again
|
|
32
|
-
// after returning to the link above.
|
|
33
|
-
window.localStorage.setItem('email', email);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function updateAuth(user: User | null) {
|
|
38
|
-
authentication.set({ user, loading: loading, login, logout });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Logout using Firebase's authentication framework.
|
|
42
|
-
function logout() {
|
|
43
|
-
if (auth) {
|
|
44
|
-
return auth.signOut().then(() => updateAuth(null));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// On mount, subscribe to authentication changes.
|
|
49
|
-
if (auth) {
|
|
50
|
-
const unsubscribe = auth.onAuthStateChanged((user) => {
|
|
51
|
-
loading = false;
|
|
52
|
-
updateAuth(user);
|
|
53
|
-
});
|
|
54
|
-
// On unmount, stop subscribing.
|
|
55
|
-
onDestroy(unsubscribe);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Expose the state and the login/logout functionality.
|
|
59
|
-
setContext<UserStore>(USER, authentication);
|
|
60
|
-
</script>
|
|
61
|
-
|
|
62
|
-
<!-- Wrap whatever children are given in this context. -->
|
|
63
|
-
{#if loading === false}
|
|
64
|
-
<slot />
|
|
65
|
-
{/if}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { page } from '$app/stores';
|
|
3
|
-
|
|
4
|
-
export let to: string;
|
|
5
|
-
|
|
6
|
-
let link: HTMLAnchorElement;
|
|
7
|
-
|
|
8
|
-
function scroll(event: MouseEvent) {
|
|
9
|
-
// No element? Bail.
|
|
10
|
-
if (link === undefined) return;
|
|
11
|
-
|
|
12
|
-
// No hash? No scroll.
|
|
13
|
-
const hash = new URL(link.href).hash;
|
|
14
|
-
if (hash === '') return;
|
|
15
|
-
|
|
16
|
-
// Prevent the browser from scrolling.
|
|
17
|
-
event.preventDefault();
|
|
18
|
-
|
|
19
|
-
// Get the anchor
|
|
20
|
-
const anchorId = new URL(link.href).hash.replace('#', '');
|
|
21
|
-
const anchor = document.getElementById(anchorId);
|
|
22
|
-
|
|
23
|
-
// No anchor? Bail.
|
|
24
|
-
if (anchor === null) return;
|
|
25
|
-
|
|
26
|
-
// Scroll to the anchor.
|
|
27
|
-
window.scrollTo({
|
|
28
|
-
top: anchor.offsetTop,
|
|
29
|
-
behavior: 'smooth',
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
// Update the hash (without scrolling)
|
|
33
|
-
history.pushState({}, '', hash);
|
|
34
|
-
}
|
|
35
|
-
</script>
|
|
36
|
-
|
|
37
|
-
{#if $page.url.pathname === (to.charAt(to.length - 1) === '/' ? to.substring(0, to.length - 1) : to)}
|
|
38
|
-
<slot />
|
|
39
|
-
{:else}
|
|
40
|
-
<a
|
|
41
|
-
href={to}
|
|
42
|
-
bind:this={link}
|
|
43
|
-
on:click={(event) => scroll(event)}
|
|
44
|
-
target={to.startsWith('http') ? '_blank' : null}><slot /></a
|
|
45
|
-
>
|
|
46
|
-
{/if}
|
|
47
|
-
|
|
48
|
-
<style>
|
|
49
|
-
a {
|
|
50
|
-
color: var(--bookish-link-color);
|
|
51
|
-
font-weight: var(--bookish-link-font-weight);
|
|
52
|
-
text-decoration: none;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
a:hover {
|
|
56
|
-
text-decoration: underline;
|
|
57
|
-
}
|
|
58
|
-
</style>
|