@fc3/mmcadi 0.1.0
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/LICENSE +673 -0
- package/README.md +5 -0
- package/bin/compile +63 -0
- package/bin/copy-static-files +13 -0
- package/bin/install +5 -0
- package/bin/precompile +55 -0
- package/bin/prepublish +7 -0
- package/bin/remap-paths +113 -0
- package/bin/test +9 -0
- package/config/tsconfig.json +37 -0
- package/package.json +33 -0
- package/src/bootstrap/start.ts +12 -0
- package/src/client/bootstrap.ts +5 -0
- package/src/client/client.ts +54 -0
- package/src/client/enum/key-code.ts +34 -0
- package/src/client/enum/page-type.ts +19 -0
- package/src/client/factory/page.ts +61 -0
- package/src/client/page/confirm-delete-block.ts +30 -0
- package/src/client/page/create-block.ts +6 -0
- package/src/client/page/day.ts +8 -0
- package/src/client/page/edit-block.ts +43 -0
- package/src/client/page/edit-custom.ts +16 -0
- package/src/client/page/home.ts +8 -0
- package/src/client/page/login.ts +8 -0
- package/src/client/page/logout.ts +8 -0
- package/src/client/page/month.ts +8 -0
- package/src/client/page/move-block.ts +8 -0
- package/src/client/page/select-block-type.ts +56 -0
- package/src/client/page/settings.ts +8 -0
- package/src/client/page/view-custom.ts +665 -0
- package/src/client/page/week.ts +8 -0
- package/src/client/page/year.ts +8 -0
- package/src/client/page.ts +128 -0
- package/src/client/shim/execute.ts +5 -0
- package/src/client/shim/logger.ts +44 -0
- package/src/client/utility/get-meta-value.ts +23 -0
- package/src/common/builder/block/background.ts +25 -0
- package/src/common/builder/block/folder.ts +43 -0
- package/src/common/builder/block/header.ts +15 -0
- package/src/common/builder/block/link.ts +32 -0
- package/src/common/builder/block/multicolumn.ts +16 -0
- package/src/common/builder/block/note.ts +13 -0
- package/src/common/builder/block/whitespace.ts +13 -0
- package/src/common/utility/get-parent-path.ts +29 -0
- package/src/constant/month-names.ts +16 -0
- package/src/enum/action-type.ts +11 -0
- package/src/enum/block-type.ts +18 -0
- package/src/enum/calendar-view-mode.ts +9 -0
- package/src/enum/color.ts +15 -0
- package/src/enum/default-role.ts +6 -0
- package/src/enum/directory-item-type.ts +6 -0
- package/src/enum/emoji.ts +94 -0
- package/src/enum/field-type.ts +8 -0
- package/src/enum/header-size.ts +7 -0
- package/src/enum/permission-type.ts +8 -0
- package/src/enum/time-place-visibility.ts +8 -0
- package/src/enum/tool-type.ts +14 -0
- package/src/index.ts +8 -0
- package/src/interface/hydration-callback.ts +7 -0
- package/src/interface/provider.ts +8 -0
- package/src/interface/repository.ts +12 -0
- package/src/lib/array/add.ts +10 -0
- package/src/lib/array/assert-is-empty.ts +23 -0
- package/src/lib/array/clone.ts +5 -0
- package/src/lib/array/difference.ts +8 -0
- package/src/lib/array/empty.ts +6 -0
- package/src/lib/array/equal.ts +24 -0
- package/src/lib/array/get-first-value.ts +5 -0
- package/src/lib/array/get-last-value.ts +5 -0
- package/src/lib/array/get-max-value.ts +5 -0
- package/src/lib/array/get-value-after.ts +23 -0
- package/src/lib/array/get-value-before.ts +23 -0
- package/src/lib/array/get-values-between.ts +18 -0
- package/src/lib/array/index.ts +5 -0
- package/src/lib/array/is-empty.ts +6 -0
- package/src/lib/array/remove.ts +19 -0
- package/src/lib/array/sum.ts +11 -0
- package/src/lib/array/unique.ts +13 -0
- package/src/lib/environment/bootstrap.ts +1 -0
- package/src/lib/environment/enum/environment-type.ts +8 -0
- package/src/lib/environment/enum/service-type.ts +5 -0
- package/src/lib/environment/index.ts +7 -0
- package/src/lib/environment/utility/get-environment-type.ts +28 -0
- package/src/lib/environment/utility/is-browser.ts +5 -0
- package/src/lib/environment/utility/is-development.ts +10 -0
- package/src/lib/environment/utility/is-production-or-staging.ts +8 -0
- package/src/lib/environment/utility/is-production.ts +10 -0
- package/src/lib/environment/utility/is-staging.ts +10 -0
- package/src/lib/errors/enum/error-type.ts +13 -0
- package/src/lib/errors/error/base.ts +40 -0
- package/src/lib/errors/error/conflict.ts +16 -0
- package/src/lib/errors/error/generic.ts +23 -0
- package/src/lib/errors/error/invalid.ts +14 -0
- package/src/lib/errors/error/invariant-violation.ts +5 -0
- package/src/lib/errors/error/not-allowed.ts +14 -0
- package/src/lib/errors/error/not-found.ts +16 -0
- package/src/lib/errors/error/not-implemented.ts +20 -0
- package/src/lib/errors/error/omitted.ts +14 -0
- package/src/lib/errors/error/timeout.ts +14 -0
- package/src/lib/errors/error/unauthorized.ts +14 -0
- package/src/lib/errors/index.ts +18 -0
- package/src/lib/errors/sugar/invariant.ts +7 -0
- package/src/lib/errors/type/coded-error.ts +7 -0
- package/src/lib/errors/type/error-data.ts +11 -0
- package/src/lib/errors/utility/create-error-for-error-type.ts +60 -0
- package/src/lib/errors/utility/create-error-from-ambiguous-json-data.ts +26 -0
- package/src/lib/errors/utility/error-matches.ts +28 -0
- package/src/lib/errors/utility/get-error-type-for-posix-error-code.ts +37 -0
- package/src/lib/errors/utility/get-error-type-for-status-code.ts +38 -0
- package/src/lib/errors/utility/get-message-for-error-type.ts +29 -0
- package/src/lib/errors/utility/matches-posix-error-code.ts +11 -0
- package/src/lib/errors/utility/wrap-error.ts +39 -0
- package/src/lib/event-emitter/index.ts +63 -0
- package/src/lib/execution-context/execution-context.ts +90 -0
- package/src/lib/execution-context/index.ts +8 -0
- package/src/lib/execution-context/type/session.ts +7 -0
- package/src/lib/feature/feature.ts +108 -0
- package/src/lib/feature/index.ts +3 -0
- package/src/lib/filesystem/bootstrap.ts +1 -0
- package/src/lib/filesystem/enum/file-extension.ts +19 -0
- package/src/lib/filesystem/index.ts +4 -0
- package/src/lib/filesystem/utility/exists.ts +21 -0
- package/src/lib/filesystem/utility/get-extension-for-filepath.ts +20 -0
- package/src/lib/filesystem/utility/strip-extension.ts +26 -0
- package/src/lib/grammar/index.ts +3 -0
- package/src/lib/grammar/noun-inflector.ts +104 -0
- package/src/lib/grammar/utility/get-words-from-identifier.ts +9 -0
- package/src/lib/grammar/verb-inflector.ts +344 -0
- package/src/lib/http/buffer-stream.ts +76 -0
- package/src/lib/http/enum/content-type.ts +19 -0
- package/src/lib/http/enum/cookie-attribute.ts +11 -0
- package/src/lib/http/enum/header.ts +29 -0
- package/src/lib/http/enum/method.ts +11 -0
- package/src/lib/http/enum/same-site-policy.ts +7 -0
- package/src/lib/http/enum/status-code.ts +9 -0
- package/src/lib/http/factory/body-parser.ts +55 -0
- package/src/lib/http/index.ts +24 -0
- package/src/lib/http/interface/client-request.ts +15 -0
- package/src/lib/http/interface/incoming-message.ts +24 -0
- package/src/lib/http/interface/network-library.ts +9 -0
- package/src/lib/http/interface/request-callback.ts +7 -0
- package/src/lib/http/isomorphic/request.ts +77 -0
- package/src/lib/http/isomorphic/response.ts +77 -0
- package/src/lib/http/isomorphic.ts +20 -0
- package/src/lib/http/parser/accept-header.ts +35 -0
- package/src/lib/http/parser/basic-auth-header.ts +48 -0
- package/src/lib/http/parser/body/json.ts +14 -0
- package/src/lib/http/parser/body/multipart.ts +89 -0
- package/src/lib/http/parser/body/url-encoded.ts +16 -0
- package/src/lib/http/parser/body.ts +44 -0
- package/src/lib/http/parser/cookie.ts +114 -0
- package/src/lib/http/parser/querystring.ts +92 -0
- package/src/lib/http/parser/url.ts +76 -0
- package/src/lib/http/request/incoming.ts +299 -0
- package/src/lib/http/request/outgoing.ts +276 -0
- package/src/lib/http/request.ts +26 -0
- package/src/lib/http/response/incoming.ts +243 -0
- package/src/lib/http/response/outgoing.ts +160 -0
- package/src/lib/http/response.ts +74 -0
- package/src/lib/http/serializer/basic-auth-header.ts +27 -0
- package/src/lib/http/serializer/cookie.ts +90 -0
- package/src/lib/http/serializer/query-data.ts +54 -0
- package/src/lib/http/transaction.ts +320 -0
- package/src/lib/http/type/basic-auth-credentials.ts +6 -0
- package/src/lib/http/type/header-map.ts +5 -0
- package/src/lib/http/type/log-attributes.ts +12 -0
- package/src/lib/http/type/path-parameters.ts +5 -0
- package/src/lib/http/type/query-data.ts +7 -0
- package/src/lib/http/type/query-value.ts +11 -0
- package/src/lib/http/type/request-options.ts +16 -0
- package/src/lib/http/type/transaction-data.ts +4 -0
- package/src/lib/http/utility/get-content-type-for-extension.ts +47 -0
- package/src/lib/http/utility/get-library-for-protocol.ts +25 -0
- package/src/lib/http/utility/get-status-code-for-error-type.ts +37 -0
- package/src/lib/http/utility/get-status-code-for-error.ts +13 -0
- package/src/lib/http/utility/is-client-error-status.ts +15 -0
- package/src/lib/http/utility/is-error-status.ts +9 -0
- package/src/lib/http/utility/is-server-error-status.ts +7 -0
- package/src/lib/http/utility/is-success-status.ts +7 -0
- package/src/lib/http/utility/proxy-request.ts +58 -0
- package/src/lib/http/utility/serialize-request-options.ts +9 -0
- package/src/lib/http/utility/slug-generator.ts +20 -0
- package/src/lib/key-generator/index.ts +3 -0
- package/src/lib/key-generator/key-generator.ts +7 -0
- package/src/lib/logger/enum/ansi-escape-code.ts +14 -0
- package/src/lib/logger/enum/log-level.ts +8 -0
- package/src/lib/logger/formatter.ts +59 -0
- package/src/lib/logger/index.ts +7 -0
- package/src/lib/logger/interface/error-reporter.ts +7 -0
- package/src/lib/logger/interface/logger.ts +13 -0
- package/src/lib/logger/logger.ts +239 -0
- package/src/lib/logger/type/error-parameters.ts +9 -0
- package/src/lib/logger/type/loggable-data.ts +5 -0
- package/src/lib/logger/type/loggable-value.ts +1 -0
- package/src/lib/metrics/dispatcher.ts +264 -0
- package/src/lib/metrics/enum/dispatch-mode.ts +6 -0
- package/src/lib/metrics/index.ts +2 -0
- package/src/lib/metrics/settings-hydrator.ts +51 -0
- package/src/lib/metrics/type/dispatcher-settings.ts +12 -0
- package/src/lib/metrics/type/tag-map.ts +5 -0
- package/src/lib/network/bootstrap.ts +1 -0
- package/src/lib/network/enum/connection-status.ts +14 -0
- package/src/lib/network/enum/http-status-code.ts +75 -0
- package/src/lib/network/enum/network-protocol.ts +10 -0
- package/src/lib/network/event-emitter.ts +63 -0
- package/src/lib/network/index.ts +7 -0
- package/src/lib/network/interface/socket.ts +42 -0
- package/src/lib/network/type/socket-options.ts +6 -0
- package/src/lib/network/utility/get-protocol-from-url.ts +15 -0
- package/src/lib/operation/index.ts +6 -0
- package/src/lib/operation/operation/auto-logging.ts +94 -0
- package/src/lib/operation/operation/silent.ts +17 -0
- package/src/lib/operation/operation.ts +80 -0
- package/src/lib/process/bootstrap.ts +1 -0
- package/src/lib/process/enum/posix-error-code.ts +138 -0
- package/src/lib/process/enum/process-signal.ts +68 -0
- package/src/lib/process/error.ts +6 -0
- package/src/lib/process/execute.ts +77 -0
- package/src/lib/process/index.ts +4 -0
- package/src/lib/process/type/command-options.ts +9 -0
- package/src/lib/process/utility/bind-process-lifespan-to.ts +10 -0
- package/src/lib/promise-wrapper/index.ts +3 -0
- package/src/lib/promise-wrapper/promise-wrapper.ts +51 -0
- package/src/lib/random/chance.ts +5 -0
- package/src/lib/random/element.ts +7 -0
- package/src/lib/random/elements.ts +12 -0
- package/src/lib/random/enum.ts +34 -0
- package/src/lib/random/enums.ts +11 -0
- package/src/lib/random/index.ts +3 -0
- package/src/lib/random/number.ts +8 -0
- package/src/lib/server/base.ts +194 -0
- package/src/lib/server/enum/server-event.ts +5 -0
- package/src/lib/server/enum/server-status.ts +10 -0
- package/src/lib/server/http/endpoint/ping.ts +21 -0
- package/src/lib/server/http/endpoint.ts +345 -0
- package/src/lib/server/http/interface/endpoint-constructor.ts +12 -0
- package/src/lib/server/http/interface/result-serializer.ts +5 -0
- package/src/lib/server/http/middleware.ts +18 -0
- package/src/lib/server/http/result-serializer/html.ts +92 -0
- package/src/lib/server/http/result-serializer/json.ts +23 -0
- package/src/lib/server/http/route.ts +104 -0
- package/src/lib/server/http/router.ts +125 -0
- package/src/lib/server/http/type/session-resolver.ts +8 -0
- package/src/lib/server/http/utility/create-server.ts +34 -0
- package/src/lib/server/http/utility/path-parser.ts +49 -0
- package/src/lib/server/http/utility/standardize-html-indentation.ts +54 -0
- package/src/lib/server/http/websocket-wrapper.ts +83 -0
- package/src/lib/server/http.ts +301 -0
- package/src/lib/server/index.ts +5 -0
- package/src/lib/server/tcp.ts +53 -0
- package/src/lib/server/type/server-options.ts +10 -0
- package/src/lib/string/calculate-length.ts +17 -0
- package/src/lib/string/capitalize.ts +8 -0
- package/src/lib/string/create-slug.ts +14 -0
- package/src/lib/string/enum/ansi-escape-code.ts +14 -0
- package/src/lib/string/enum/string-encoding.ts +9 -0
- package/src/lib/string/hyphenate.ts +5 -0
- package/src/lib/string/index.ts +3 -0
- package/src/lib/string/pad.ts +14 -0
- package/src/lib/string/trim-multiline.ts +21 -0
- package/src/lib/string/trim.ts +8 -0
- package/src/lib/tcp/channel.ts +13 -0
- package/src/lib/tcp/connection/incoming.ts +72 -0
- package/src/lib/tcp/connection/outgoing.ts +219 -0
- package/src/lib/tcp/connection.ts +360 -0
- package/src/lib/tcp/enum/connection-event.ts +12 -0
- package/src/lib/tcp/enum/message-type.ts +9 -0
- package/src/lib/tcp/index.ts +1 -0
- package/src/lib/tcp/type/connection-parameters.ts +6 -0
- package/src/lib/tcp/type/message/channel-close.ts +9 -0
- package/src/lib/tcp/type/message/channel-open.ts +9 -0
- package/src/lib/tcp/type/message.ts +10 -0
- package/src/lib/test/index.ts +2 -0
- package/src/lib/test/utility/build-config.ts +17 -0
- package/src/lib/test/utility/build-execution-context.ts +11 -0
- package/src/lib/time/bootstrap.ts +1 -0
- package/src/lib/time/enum/time-interval.ts +12 -0
- package/src/lib/time/index.ts +4 -0
- package/src/lib/time/utility/format-duration.ts +139 -0
- package/src/lib/time/utility/format-relative-duration.ts +22 -0
- package/src/lib/time/utility/sleep.ts +9 -0
- package/src/operation.ts +18 -0
- package/src/server/endpoint/abstract-page.ts +126 -0
- package/src/server/endpoint/action/create.ts +545 -0
- package/src/server/endpoint/action/get.ts +231 -0
- package/src/server/endpoint/base.ts +51 -0
- package/src/server/endpoint/day.ts +13 -0
- package/src/server/endpoint/generic-page.ts +14 -0
- package/src/server/endpoint/index.ts +11 -0
- package/src/server/endpoint/login.ts +45 -0
- package/src/server/endpoint/logout.ts +38 -0
- package/src/server/endpoint/month.ts +35 -0
- package/src/server/endpoint/robots.ts +18 -0
- package/src/server/endpoint/session/create.ts +62 -0
- package/src/server/endpoint/settings/get.ts +40 -0
- package/src/server/endpoint/settings/update.ts +44 -0
- package/src/server/endpoint/today.ts +15 -0
- package/src/server/endpoint/week.ts +34 -0
- package/src/server/endpoint/year.ts +34 -0
- package/src/server/enum/custom-page-type.ts +10 -0
- package/src/server/factory/block-result-serializer.ts +115 -0
- package/src/server/middleware/base.ts +6 -0
- package/src/server/middleware/error-handler.ts +177 -0
- package/src/server/middleware/static-file.ts +83 -0
- package/src/server/operation/add-block.ts +110 -0
- package/src/server/operation/create-session.ts +43 -0
- package/src/server/operation/delete-block.ts +96 -0
- package/src/server/operation/demote-block.ts +108 -0
- package/src/server/operation/destroy-session.ts +26 -0
- package/src/server/operation/load-account.ts +30 -0
- package/src/server/operation/load-block.ts +48 -0
- package/src/server/operation/load-directory-items.ts +75 -0
- package/src/server/operation/load-page.ts +368 -0
- package/src/server/operation/promote-block.ts +104 -0
- package/src/server/operation/save-page.ts +60 -0
- package/src/server/operation/update-account-settings.ts +52 -0
- package/src/server/operation/update-block.ts +124 -0
- package/src/server/repository/memory.ts +112 -0
- package/src/server/result-serializer/action.ts +939 -0
- package/src/server/result-serializer/base.ts +1267 -0
- package/src/server/result-serializer/block/audio.ts +33 -0
- package/src/server/result-serializer/block/background.ts +20 -0
- package/src/server/result-serializer/block/calendar.ts +148 -0
- package/src/server/result-serializer/block/directory.ts +57 -0
- package/src/server/result-serializer/block/ephemeral.ts +14 -0
- package/src/server/result-serializer/block/folder.ts +106 -0
- package/src/server/result-serializer/block/header.ts +31 -0
- package/src/server/result-serializer/block/image.ts +46 -0
- package/src/server/result-serializer/block/link.ts +40 -0
- package/src/server/result-serializer/block/list.ts +140 -0
- package/src/server/result-serializer/block/multi-column.ts +97 -0
- package/src/server/result-serializer/block/note.ts +44 -0
- package/src/server/result-serializer/block/todo.ts +78 -0
- package/src/server/result-serializer/block/whitespace.ts +15 -0
- package/src/server/result-serializer/block.ts +248 -0
- package/src/server/result-serializer/common/time-place-options.ts +33 -0
- package/src/server/result-serializer/login.ts +58 -0
- package/src/server/result-serializer/month.ts +170 -0
- package/src/server/result-serializer/page.ts +548 -0
- package/src/server/result-serializer/settings.ts +85 -0
- package/src/server/result-serializer/week.ts +195 -0
- package/src/server/result-serializer/year.ts +160 -0
- package/src/server/utility/accepts-content-type.ts +16 -0
- package/src/server/utility/accepts-html.ts +9 -0
- package/src/server/utility/accepts-json.ts +9 -0
- package/src/server/utility/add-days.ts +11 -0
- package/src/server/utility/create-date.ts +23 -0
- package/src/server/utility/create-index-path.ts +5 -0
- package/src/server/utility/create-slug.ts +9 -0
- package/src/server/utility/create-toast-path.ts +19 -0
- package/src/server/utility/date-less-than.ts +5 -0
- package/src/server/utility/date-occurs-before.ts +22 -0
- package/src/server/utility/date-to-key.ts +7 -0
- package/src/server/utility/date-to-label.ts +5 -0
- package/src/server/utility/date-to-path.ts +9 -0
- package/src/server/utility/dates-are-equal.ts +22 -0
- package/src/server/utility/dates-are-in-order.ts +9 -0
- package/src/server/utility/dates-are-on-the-same-day.ts +9 -0
- package/src/server/utility/dates-in-same-month.ts +8 -0
- package/src/server/utility/day-to-date.ts +40 -0
- package/src/server/utility/decrement-date.ts +11 -0
- package/src/server/utility/get-block-at-index-path.ts +32 -0
- package/src/server/utility/get-block-permissions.ts +15 -0
- package/src/server/utility/get-compact-label-for-date.ts +8 -0
- package/src/server/utility/get-custom-page-type-for-path.ts +37 -0
- package/src/server/utility/get-element-id-for-block.ts +15 -0
- package/src/server/utility/get-emoji-for-block-type.ts +39 -0
- package/src/server/utility/get-emoji-for-tool-type.ts +20 -0
- package/src/server/utility/get-end-of-month.ts +13 -0
- package/src/server/utility/get-end-of-week.ts +13 -0
- package/src/server/utility/get-filepath-for-folder-block.ts +23 -0
- package/src/server/utility/get-hex-for-color.ts +31 -0
- package/src/server/utility/get-label-for-time-place-visibility.ts +23 -0
- package/src/server/utility/get-month-name.ts +18 -0
- package/src/server/utility/get-next-day.ts +7 -0
- package/src/server/utility/get-next-month.ts +12 -0
- package/src/server/utility/get-next-week.ts +12 -0
- package/src/server/utility/get-next-year.ts +13 -0
- package/src/server/utility/get-ordinal-label-for-week.ts +11 -0
- package/src/server/utility/get-ordinal-of-week-within-month.ts +15 -0
- package/src/server/utility/get-padded-date.ts +11 -0
- package/src/server/utility/get-parent-index-path.ts +18 -0
- package/src/server/utility/get-path-for-folder-block.ts +25 -0
- package/src/server/utility/get-path-from-url.ts +13 -0
- package/src/server/utility/get-previous-index-path.ts +27 -0
- package/src/server/utility/get-previous-month.ts +12 -0
- package/src/server/utility/get-previous-week.ts +11 -0
- package/src/server/utility/get-previous-year.ts +13 -0
- package/src/server/utility/get-random-emoji-for-date.ts +109 -0
- package/src/server/utility/get-short-label-for-date.ts +11 -0
- package/src/server/utility/get-short-month-name.ts +9 -0
- package/src/server/utility/get-short-ordinal.ts +26 -0
- package/src/server/utility/get-siblings-and-index-for-index-path.ts +67 -0
- package/src/server/utility/get-start-of-month.ts +11 -0
- package/src/server/utility/get-start-of-week.ts +12 -0
- package/src/server/utility/get-start-of-year.ts +12 -0
- package/src/server/utility/get-weekday-name.ts +24 -0
- package/src/server/utility/increment-date.ts +15 -0
- package/src/server/utility/is-index-path.ts +5 -0
- package/src/server/utility/key-to-date.ts +25 -0
- package/src/server/utility/month-has-week-containing-date.ts +13 -0
- package/src/server/utility/month-to-date.ts +28 -0
- package/src/server/utility/month-to-path.ts +10 -0
- package/src/server/utility/months-are-equal.ts +8 -0
- package/src/server/utility/parse-index-path.ts +23 -0
- package/src/server/utility/path-is-date.ts +13 -0
- package/src/server/utility/path-to-date.ts +24 -0
- package/src/server/utility/subtract-days.ts +7 -0
- package/src/server/utility/validate-month.ts +10 -0
- package/src/server/utility/validate-page.ts +46 -0
- package/src/server/utility/validate-path.ts +9 -0
- package/src/server/utility/validate-url.ts +12 -0
- package/src/server/utility/week-greater-than.ts +10 -0
- package/src/server/utility/week-to-date.ts +8 -0
- package/src/server/utility/week-to-path.ts +12 -0
- package/src/server/utility/weeks-are-equal.ts +8 -0
- package/src/server/utility/year-to-date.ts +26 -0
- package/src/server/utility/year-to-path.ts +7 -0
- package/src/server/utility/years-are-equal.ts +8 -0
- package/src/server.ts +140 -0
- package/src/test.ts +195 -0
- package/src/type/account-settings.ts +9 -0
- package/src/type/account.ts +11 -0
- package/src/type/action/add-block.ts +74 -0
- package/src/type/action/complete-block.ts +10 -0
- package/src/type/action/delete-block.ts +11 -0
- package/src/type/action/demote-block.ts +9 -0
- package/src/type/action/edit-block.ts +11 -0
- package/src/type/action/promote-block.ts +9 -0
- package/src/type/action.ts +9 -0
- package/src/type/block/audio.ts +8 -0
- package/src/type/block/background.ts +10 -0
- package/src/type/block/directory.ts +18 -0
- package/src/type/block/ephemeral.ts +9 -0
- package/src/type/block/folder.ts +14 -0
- package/src/type/block/header.ts +11 -0
- package/src/type/block/image.ts +8 -0
- package/src/type/block/link.ts +12 -0
- package/src/type/block/list.ts +24 -0
- package/src/type/block/multi-column.ts +10 -0
- package/src/type/block/note.ts +9 -0
- package/src/type/block/todo.ts +10 -0
- package/src/type/block/whitespace.ts +9 -0
- package/src/type/block-metadata.ts +14 -0
- package/src/type/block.ts +18 -0
- package/src/type/day.ts +5 -0
- package/src/type/field-definition.ts +8 -0
- package/src/type/field-value.ts +5 -0
- package/src/type/file.ts +6 -0
- package/src/type/month.ts +5 -0
- package/src/type/page.ts +8 -0
- package/src/type/price.ts +11 -0
- package/src/type/resource.ts +5 -0
- package/src/type/runtime-config.ts +13 -0
- package/src/type/server-settings.ts +17 -0
- package/src/type/toast.ts +8 -0
- package/src/type/week.ts +5 -0
- package/src/type/year.ts +5 -0
- package/test/unit/index.ts +11 -0
- package/test/unit/server/operation/promote-block.ts +84 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import BlockResultSerializer from 'server/result-serializer/block';
|
|
2
|
+
import MultiColumnBlock from 'type/block/multi-column';
|
|
3
|
+
import ActionType from 'enum/action-type';
|
|
4
|
+
import BlockResultSerializerFactory from 'server/factory/block-result-serializer';
|
|
5
|
+
import parseIndexPath from 'server/utility/parse-index-path';
|
|
6
|
+
import createIndexPath from 'server/utility/create-index-path';
|
|
7
|
+
import Block from 'type/block';
|
|
8
|
+
|
|
9
|
+
class MultiColumnResultSerializer extends BlockResultSerializer<MultiColumnBlock> {
|
|
10
|
+
public serializeContent(): string {
|
|
11
|
+
const block = this.getResult();
|
|
12
|
+
const metadata = this.getMetadata();
|
|
13
|
+
const {editing, page_path} = metadata;
|
|
14
|
+
const {max_columns} = block;
|
|
15
|
+
|
|
16
|
+
const children = block.children.slice(0) as (Block | string)[];
|
|
17
|
+
|
|
18
|
+
if (editing) {
|
|
19
|
+
const parent_index_path = metadata.index_path;
|
|
20
|
+
const parts = parseIndexPath(parent_index_path);
|
|
21
|
+
|
|
22
|
+
parts.push(children.length);
|
|
23
|
+
|
|
24
|
+
const child_index_path = createIndexPath(parts);
|
|
25
|
+
|
|
26
|
+
children.push(`
|
|
27
|
+
<a class="biglink grey" href="/actions?path=${page_path}&editing=true&action_type=${ActionType.ADD_BLOCK}&index_path=${child_index_path}">+</a>
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const groups: (Block | string)[][] = [];
|
|
32
|
+
|
|
33
|
+
let current_group: (Block | string)[] = [];
|
|
34
|
+
|
|
35
|
+
children.forEach((child) => {
|
|
36
|
+
if (current_group.length === max_columns) {
|
|
37
|
+
groups.push(current_group);
|
|
38
|
+
current_group = [];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
current_group.push(child);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
if (current_group.length) {
|
|
45
|
+
groups.push(current_group);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const session = this.getSession();
|
|
49
|
+
|
|
50
|
+
let child_counter = 0;
|
|
51
|
+
|
|
52
|
+
const serialized_groups = groups.map((group, group_index) => {
|
|
53
|
+
const serialized_children = group.map((child) => {
|
|
54
|
+
if (typeof child === 'string') {
|
|
55
|
+
return `<td>${child}</td>`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const parent_path = metadata.index_path;
|
|
59
|
+
const parts = parseIndexPath(parent_path);
|
|
60
|
+
const child_index = child_counter++;
|
|
61
|
+
|
|
62
|
+
parts.push(child_index);
|
|
63
|
+
|
|
64
|
+
const index_path = createIndexPath(parts);
|
|
65
|
+
|
|
66
|
+
const child_metadata = {
|
|
67
|
+
...metadata,
|
|
68
|
+
index_path
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const factory = new BlockResultSerializerFactory(child, child_metadata, session);
|
|
72
|
+
const serializer = factory.create();
|
|
73
|
+
const serialized_child = serializer.serializeContent();
|
|
74
|
+
|
|
75
|
+
return `
|
|
76
|
+
<td>${serialized_child}</td>
|
|
77
|
+
`;
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return `
|
|
81
|
+
<tr>
|
|
82
|
+
${serialized_children.join('\n')}
|
|
83
|
+
</tr>
|
|
84
|
+
`;
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return this.wrapSection(`
|
|
88
|
+
<table class="fixed multi-column">
|
|
89
|
+
<tbody>
|
|
90
|
+
${serialized_groups.join('\n')}
|
|
91
|
+
</tbody>
|
|
92
|
+
</table>
|
|
93
|
+
`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export default MultiColumnResultSerializer;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import Marked from 'marked';
|
|
2
|
+
|
|
3
|
+
import BlockResultSerializer from 'server/result-serializer/block';
|
|
4
|
+
import NoteBlock from 'type/block/note';
|
|
5
|
+
import getElementIdForBlock from 'server/utility/get-element-id-for-block';
|
|
6
|
+
|
|
7
|
+
class NoteBlockResultSerializer extends BlockResultSerializer<NoteBlock> {
|
|
8
|
+
public serializeContent(): string {
|
|
9
|
+
if (!this.canRead()) {
|
|
10
|
+
return this.serializePermissionDenied();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const block = this.getResult();
|
|
14
|
+
const metadata = this.getMetadata();
|
|
15
|
+
const {text} = block;
|
|
16
|
+
|
|
17
|
+
if (typeof text !== 'string') {
|
|
18
|
+
return this.printWarning(`
|
|
19
|
+
Got invalid config for text block (no text content):
|
|
20
|
+
${JSON.stringify(block)}
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const block_id = getElementIdForBlock(block, metadata);
|
|
25
|
+
|
|
26
|
+
if (text === '') {
|
|
27
|
+
return this.wrapSection(`
|
|
28
|
+
<span id="${block_id}-update-target">
|
|
29
|
+
<em>no text supplied</em>
|
|
30
|
+
</span>
|
|
31
|
+
`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const markdown = Marked.parse(text);
|
|
35
|
+
|
|
36
|
+
return this.wrapSection(`
|
|
37
|
+
<span class="markdown-wrapper" id="${block_id}-update-target">
|
|
38
|
+
${markdown}
|
|
39
|
+
</span>
|
|
40
|
+
`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default NoteBlockResultSerializer;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import BlockResultSerializer from 'server/result-serializer/block';
|
|
2
|
+
import TodoBlock from 'type/block/todo';
|
|
3
|
+
import ActionType from 'enum/action-type';
|
|
4
|
+
import Emoji from 'enum/emoji';
|
|
5
|
+
import getElementIdForBlock from 'server/utility/get-element-id-for-block';
|
|
6
|
+
|
|
7
|
+
class TodoBlockResultSerializer extends BlockResultSerializer<TodoBlock> {
|
|
8
|
+
public serializeContent(): string {
|
|
9
|
+
if (!this.canRead()) {
|
|
10
|
+
return this.serializePermissionDenied();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const block = this.getResult();
|
|
14
|
+
const metadata = this.getMetadata();
|
|
15
|
+
const {title, completed_at, block_type} = block;
|
|
16
|
+
const {editing, page_path, index_path} = metadata;
|
|
17
|
+
|
|
18
|
+
if (typeof title !== 'string') {
|
|
19
|
+
return this.printWarning(`
|
|
20
|
+
Got invalid config for todo block (no title content):
|
|
21
|
+
<pre>${JSON.stringify(block, null, 2)}</pre>
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const block_id = getElementIdForBlock(block, metadata);
|
|
26
|
+
const complete = completed_at !== null;
|
|
27
|
+
const style_class = complete ? 'strikethrough' : '';
|
|
28
|
+
const emoji = complete ? Emoji.COMPLETED_CHECKMARK : Emoji.WHITE_SQUARE;
|
|
29
|
+
const content = title || '<em>no title supplied</em>';
|
|
30
|
+
const logged_in = this.isLoggedIn();
|
|
31
|
+
|
|
32
|
+
if (!logged_in) {
|
|
33
|
+
return this.wrapSection(`
|
|
34
|
+
<table>
|
|
35
|
+
<tbody>
|
|
36
|
+
<tr>
|
|
37
|
+
<td class="align-left" style="width:15%">
|
|
38
|
+
${emoji}
|
|
39
|
+
</td>
|
|
40
|
+
<td class="align-left">
|
|
41
|
+
${content}
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
44
|
+
</tbody>
|
|
45
|
+
</table>
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return this.wrapSection(`
|
|
50
|
+
<form method="POST" action="/actions?path=${page_path}&editing=${editing}&action_type=${ActionType.COMPLETE_BLOCK}&index_path=${index_path}">
|
|
51
|
+
<input type="hidden" name="path" value="${page_path}" />
|
|
52
|
+
<input type="hidden" name="action_type" value="${ActionType.COMPLETE_BLOCK}" />
|
|
53
|
+
<input type="hidden" name="index_path" value="${index_path}" />
|
|
54
|
+
<input type="hidden" name="block_type" value="${block_type}" />
|
|
55
|
+
<input type="hidden" name="title" value="${title}" />
|
|
56
|
+
|
|
57
|
+
<table>
|
|
58
|
+
<tbody>
|
|
59
|
+
<tr>
|
|
60
|
+
<td class="align-left" style="width:15%">
|
|
61
|
+
<button type="submit">
|
|
62
|
+
${emoji}
|
|
63
|
+
</button>
|
|
64
|
+
</td>
|
|
65
|
+
<td class="align-left">
|
|
66
|
+
<span class="${style_class}" id="${block_id}-update-target">
|
|
67
|
+
${content}
|
|
68
|
+
</span>
|
|
69
|
+
</td>
|
|
70
|
+
</tr>
|
|
71
|
+
</tbody>
|
|
72
|
+
</table>
|
|
73
|
+
</form>
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default TodoBlockResultSerializer;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import BlockResultSerializer from 'server/result-serializer/block';
|
|
2
|
+
import WhitespaceBlock from 'type/block/whitespace';
|
|
3
|
+
|
|
4
|
+
class WhitespaceBlockResultSerializer extends BlockResultSerializer<WhitespaceBlock> {
|
|
5
|
+
public serializeContent(): string {
|
|
6
|
+
const {line_count} = this.getResult();
|
|
7
|
+
const lines = Array(line_count).fill('<br />');
|
|
8
|
+
|
|
9
|
+
return this.wrapSection(`
|
|
10
|
+
${lines.join('\n')}
|
|
11
|
+
`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default WhitespaceBlockResultSerializer;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import {HtmlResultSerializer} from 'lib/server';
|
|
2
|
+
import {InvariantViolation} from 'lib/errors';
|
|
3
|
+
import {Session} from 'lib/execution-context';
|
|
4
|
+
|
|
5
|
+
import Block from 'type/block';
|
|
6
|
+
import BlockMetadata from 'type/block-metadata';
|
|
7
|
+
import Color from 'enum/color';
|
|
8
|
+
import BlockType from 'enum/block-type';
|
|
9
|
+
import PermissionType from 'enum/permission-type';
|
|
10
|
+
import DefaultRole from 'enum/default-role';
|
|
11
|
+
import getHexForColor from 'server/utility/get-hex-for-color';
|
|
12
|
+
import ActionType from 'enum/action-type';
|
|
13
|
+
import Emoji from 'enum/emoji';
|
|
14
|
+
import getBlockPermissions from 'server/utility/get-block-permissions';
|
|
15
|
+
import pathIsDate from 'server/utility/path-is-date';
|
|
16
|
+
import getShortLabelForDate from 'server/utility/get-short-label-for-date';
|
|
17
|
+
import getElementIdForBlock from 'server/utility/get-element-id-for-block';
|
|
18
|
+
import pathToDate from 'server/utility/path-to-date';
|
|
19
|
+
import createDate from 'server/utility/create-date';
|
|
20
|
+
import datesAreOnTheSameDay from 'server/utility/dates-are-on-the-same-day';
|
|
21
|
+
|
|
22
|
+
abstract class BlockResultSerializer<T extends Block> extends HtmlResultSerializer<T> {
|
|
23
|
+
private metadata: BlockMetadata;
|
|
24
|
+
private session: Session;
|
|
25
|
+
|
|
26
|
+
public constructor(result: T, metadata: BlockMetadata, session: Session) {
|
|
27
|
+
super(result);
|
|
28
|
+
|
|
29
|
+
this.metadata = metadata;
|
|
30
|
+
this.session = session;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
protected getTitle(): string {
|
|
34
|
+
throw new InvariantViolation(`
|
|
35
|
+
Tried to call getTitle() on BlockResultSerializer,
|
|
36
|
+
but rendering page-level blocks is not supported
|
|
37
|
+
`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected printWarning(message: string): string {
|
|
41
|
+
return `
|
|
42
|
+
<section class="warning">
|
|
43
|
+
<h2 class="text-yellow">WARNING</h2>
|
|
44
|
+
${message}
|
|
45
|
+
</section>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
protected serializePermissionDenied(): string {
|
|
50
|
+
const message = this.getPermissionDeniedMessage();
|
|
51
|
+
|
|
52
|
+
return this.wrapSection(`
|
|
53
|
+
<span class="text-smaller three-quarter-opacity">
|
|
54
|
+
${Emoji.LOCKED}
|
|
55
|
+
${message}
|
|
56
|
+
</span>
|
|
57
|
+
`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected getPermissionDeniedMessage(): string {
|
|
61
|
+
const required_role = this.getRequiredReadRole();
|
|
62
|
+
const {creator_username} = this.getMetadata();
|
|
63
|
+
const {block_type} = this.getResult();
|
|
64
|
+
|
|
65
|
+
if (required_role === DefaultRole.CREATOR) {
|
|
66
|
+
return `[${creator_username}] has marked this ${block_type} as private`;
|
|
67
|
+
} else {
|
|
68
|
+
return `to view this ${block_type}, you must be at least: [${required_role}]`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected isLoggedIn(): boolean {
|
|
73
|
+
const {account_id} = this.getSession();
|
|
74
|
+
|
|
75
|
+
return account_id !== null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
protected getSession(): Session {
|
|
79
|
+
return this.session;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
protected canRead(): boolean {
|
|
83
|
+
const role = this.getAccountRole();
|
|
84
|
+
const {roles} = this.getMetadata();
|
|
85
|
+
const required_role = this.getRequiredReadRole();
|
|
86
|
+
const required_index = roles.indexOf(required_role);
|
|
87
|
+
const actual_index = roles.indexOf(role);
|
|
88
|
+
|
|
89
|
+
return actual_index >= required_index;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
protected getRequiredReadRole(): string {
|
|
93
|
+
const block = this.getResult();
|
|
94
|
+
const permissions = getBlockPermissions(block);
|
|
95
|
+
|
|
96
|
+
return permissions[PermissionType.READ];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
protected wrapSection(section_contents: string): string {
|
|
100
|
+
const page_path = this.getPagePath();
|
|
101
|
+
const block = this.getResult();
|
|
102
|
+
const {created_at, block_type} = block;
|
|
103
|
+
const border_color = block.color || Color.GREY;
|
|
104
|
+
const created_date = createDate(created_at);
|
|
105
|
+
const hours = created_date.getHours();
|
|
106
|
+
const minutes = created_date.getMinutes();
|
|
107
|
+
const suffix = hours >= 12 ? 'pm' : 'am';
|
|
108
|
+
const truncated_hours = hours % 12 || 12;
|
|
109
|
+
const padded_minutes = minutes.toString().padStart(2, '0');
|
|
110
|
+
const time_string = `${truncated_hours}:${padded_minutes} ${suffix}`;
|
|
111
|
+
const datetime_attribute = created_date.toString();
|
|
112
|
+
|
|
113
|
+
let date_prefix = getShortLabelForDate(created_date);
|
|
114
|
+
|
|
115
|
+
if (pathIsDate(page_path)) {
|
|
116
|
+
const page_date = pathToDate(page_path);
|
|
117
|
+
|
|
118
|
+
if (datesAreOnTheSameDay(page_date, created_date)) {
|
|
119
|
+
date_prefix = '';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const today = createDate();
|
|
124
|
+
|
|
125
|
+
if (datesAreOnTheSameDay(created_date, today)) {
|
|
126
|
+
date_prefix = '';
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const is_folder = block_type === BlockType.FOLDER;
|
|
130
|
+
const border_hex = getHexForColor(border_color);
|
|
131
|
+
|
|
132
|
+
const style_attribute = is_folder ? '' : `border-color:${border_hex}`;
|
|
133
|
+
|
|
134
|
+
const serialized_time = `
|
|
135
|
+
<time style="${style_attribute}" datetime="${datetime_attribute}">
|
|
136
|
+
${date_prefix}${time_string}
|
|
137
|
+
</time>
|
|
138
|
+
`;
|
|
139
|
+
|
|
140
|
+
const time_class = this.shouldHideTime() ? '' : 'with-time';
|
|
141
|
+
const editing = this.isEditing();
|
|
142
|
+
const reticule = '<div class="focus-reticule flashing"></div>';
|
|
143
|
+
const cursor = `<div class="focus-cursor">${Emoji.RIGHT_ARROW_UNICODE}</div>`;
|
|
144
|
+
const metadata = this.getMetadata();
|
|
145
|
+
const section_id = getElementIdForBlock(block, metadata);
|
|
146
|
+
const condensed_class = this.isCondensed() ? 'condensed' : '';
|
|
147
|
+
const selected_class = this.isFocusedBlock() ? 'selected' : '';
|
|
148
|
+
const editing_class = editing ? 'editing' : '';
|
|
149
|
+
const {index_path} = metadata;
|
|
150
|
+
|
|
151
|
+
return `
|
|
152
|
+
<section id="${section_id}" class="block ${block_type} ${selected_class} ${editing_class} ${time_class} ${condensed_class} focus-reticule-container" style="${style_attribute}" data-index-path="${index_path}" data-block-type="${block_type}">
|
|
153
|
+
${reticule}
|
|
154
|
+
${serialized_time}
|
|
155
|
+
${cursor}
|
|
156
|
+
${section_contents}
|
|
157
|
+
|
|
158
|
+
<nav class="left">
|
|
159
|
+
<form id="${section_id}-promote" method="post" action="/actions?editing=${editing}">
|
|
160
|
+
<input type="hidden" name="path" value="${page_path}" />
|
|
161
|
+
<input type="hidden" name="action_type" value="${ActionType.PROMOTE_BLOCK}" />
|
|
162
|
+
<input type="hidden" name="index_path" value="${index_path}" />
|
|
163
|
+
|
|
164
|
+
<button class="biglink" type="submit">⬆️</button>
|
|
165
|
+
</form>
|
|
166
|
+
|
|
167
|
+
<form id="${section_id}-demote" method="post" action="/actions?editing=${editing}">
|
|
168
|
+
<input type="hidden" name="path" value="${page_path}" />
|
|
169
|
+
<input type="hidden" name="action_type" value="${ActionType.DEMOTE_BLOCK}" />
|
|
170
|
+
<input type="hidden" name="index_path" value="${index_path}" />
|
|
171
|
+
|
|
172
|
+
<button class="biglink" type="submit">⬇️</button>
|
|
173
|
+
</form>
|
|
174
|
+
</nav>
|
|
175
|
+
|
|
176
|
+
<nav class="right">
|
|
177
|
+
<a id="${section_id}-delete" class="biglink" href="/actions?editing=${editing}&path=${page_path}&action_type=${ActionType.DELETE_BLOCK}&index_path=${index_path}">❌</a>
|
|
178
|
+
<a id="${section_id}-edit" class="biglink" href="/actions?editing=${editing}&path=${page_path}&action_type=${ActionType.EDIT_BLOCK}&index_path=${index_path}">⚙️</a>
|
|
179
|
+
</nav>
|
|
180
|
+
</section>
|
|
181
|
+
`;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private isEditing(): boolean {
|
|
185
|
+
const {editing} = this.getMetadata();
|
|
186
|
+
|
|
187
|
+
return editing;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private shouldHideTime(): boolean {
|
|
191
|
+
const {show_time} = this.getResult();
|
|
192
|
+
|
|
193
|
+
if (show_time !== undefined) {
|
|
194
|
+
return show_time === false;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const {block_type} = this.getResult();
|
|
198
|
+
|
|
199
|
+
switch (block_type) {
|
|
200
|
+
case BlockType.IMAGE:
|
|
201
|
+
case BlockType.AUDIO:
|
|
202
|
+
case BlockType.NOTE:
|
|
203
|
+
return false;
|
|
204
|
+
default:
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
protected getPagePath(): string {
|
|
210
|
+
const {page_path} = this.getMetadata();
|
|
211
|
+
|
|
212
|
+
return page_path;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
protected isFocusedBlock(): boolean {
|
|
216
|
+
const {target_index_path, index_path} = this.getMetadata();
|
|
217
|
+
|
|
218
|
+
return target_index_path === index_path;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
protected getMetadata(): BlockMetadata {
|
|
222
|
+
return this.metadata;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
private isCondensed(): boolean {
|
|
226
|
+
const {block_type} = this.getResult();
|
|
227
|
+
|
|
228
|
+
switch (block_type) {
|
|
229
|
+
case BlockType.LINK:
|
|
230
|
+
case BlockType.MULTI_COLUMN:
|
|
231
|
+
return true;
|
|
232
|
+
default:
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
private getAccountRole(): string {
|
|
238
|
+
const {account} = this.getMetadata();
|
|
239
|
+
|
|
240
|
+
if (account === null) {
|
|
241
|
+
return DefaultRole.PUBLIC;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return account.role;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export default BlockResultSerializer;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import TimePlaceVisibility from 'enum/time-place-visibility';
|
|
2
|
+
import getLabelForTimePlaceVisibility from 'server/utility/get-label-for-time-place-visibility';
|
|
3
|
+
|
|
4
|
+
function serializeTimePlaceOptions(current_visibility: TimePlaceVisibility): string {
|
|
5
|
+
const visibilities = Object.values(TimePlaceVisibility);
|
|
6
|
+
|
|
7
|
+
const serialized_options = visibilities.map((visibility) => {
|
|
8
|
+
const label = getLabelForTimePlaceVisibility(visibility);
|
|
9
|
+
const checked = visibility === current_visibility ? 'checked="checked"' : '';
|
|
10
|
+
|
|
11
|
+
return `
|
|
12
|
+
<td>
|
|
13
|
+
<input type="radio" id="time-place-${visibility}" name="time_place_visibility" value="${visibility}" ${checked} />
|
|
14
|
+
|
|
15
|
+
<label for="time-place-${visibility}" class="biglink yellow">
|
|
16
|
+
${label}
|
|
17
|
+
</label>
|
|
18
|
+
</td>
|
|
19
|
+
`;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return `
|
|
23
|
+
<table class="button-row fixed mt-32">
|
|
24
|
+
<tbody>
|
|
25
|
+
<tr>
|
|
26
|
+
${serialized_options.join('\n')}
|
|
27
|
+
</tr>
|
|
28
|
+
</tbody>
|
|
29
|
+
</table>
|
|
30
|
+
`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default serializeTimePlaceOptions;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import Emoji from 'enum/emoji';
|
|
2
|
+
import PageType from 'client/enum/page-type';
|
|
3
|
+
import BaseResultSerializer from 'server/result-serializer/base';
|
|
4
|
+
|
|
5
|
+
interface LoginData {
|
|
6
|
+
readonly source_path: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
class LoginResultSerializer extends BaseResultSerializer<LoginData> {
|
|
10
|
+
protected getTitle(): string {
|
|
11
|
+
return 'log in';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
protected serializeFooter(): string {
|
|
15
|
+
return `
|
|
16
|
+
<footer>
|
|
17
|
+
<div class="section-wrapper">
|
|
18
|
+
<section class="transparent">
|
|
19
|
+
<a class="float-right" href="#">forgot your password?</a>
|
|
20
|
+
<a href="/">${Emoji.LEFT_ARROW_UNICODE} home</a>
|
|
21
|
+
</section>
|
|
22
|
+
</div>
|
|
23
|
+
</footer>
|
|
24
|
+
`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected serializeSections(): string {
|
|
28
|
+
const {source_path} = this.getResult();
|
|
29
|
+
|
|
30
|
+
return `
|
|
31
|
+
<section class="grey">
|
|
32
|
+
<form action="/session" method="POST">
|
|
33
|
+
<input type="hidden" name="source" value="${source_path}" />
|
|
34
|
+
|
|
35
|
+
<fieldset>
|
|
36
|
+
<legend>username:</legend>
|
|
37
|
+
<input type="text" name="username" placeholder="username" autofocus />
|
|
38
|
+
</fieldset>
|
|
39
|
+
|
|
40
|
+
<fieldset>
|
|
41
|
+
<legend>password:</legend>
|
|
42
|
+
<input type="password" name="password" placeholder="password" />
|
|
43
|
+
</fieldset>
|
|
44
|
+
|
|
45
|
+
<button class="mt-32 biglink blue" type="submit">
|
|
46
|
+
log in ${Emoji.RIGHT_ARROW_UNICODE}
|
|
47
|
+
</button>
|
|
48
|
+
</form>
|
|
49
|
+
</section>
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected getPageType(): PageType {
|
|
54
|
+
return PageType.LOGIN;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default LoginResultSerializer;
|