@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,104 @@
|
|
|
1
|
+
import ExecutionContext from 'lib/execution-context';
|
|
2
|
+
import {InvariantViolation} from 'lib/errors';
|
|
3
|
+
|
|
4
|
+
import getSiblingsAndIndexForIndexPath from 'server/utility/get-siblings-and-index-for-index-path';
|
|
5
|
+
import BaseOperation from 'operation';
|
|
6
|
+
import BlockType from 'enum/block-type';
|
|
7
|
+
import getParentIndexPath from 'server/utility/get-parent-index-path';
|
|
8
|
+
import createIndexPath from 'server/utility/create-index-path';
|
|
9
|
+
import parseIndexPath from 'server/utility/parse-index-path';
|
|
10
|
+
import LoadPageOperation from 'server/operation/load-page';
|
|
11
|
+
import SavePageOperation from 'server/operation/save-page';
|
|
12
|
+
|
|
13
|
+
class PromoteBlockOperation extends BaseOperation<string> {
|
|
14
|
+
private page_key: string;
|
|
15
|
+
private index_path: string;
|
|
16
|
+
|
|
17
|
+
public constructor(page_key: string, index_path: string, execution_context: ExecutionContext) {
|
|
18
|
+
super(execution_context);
|
|
19
|
+
|
|
20
|
+
this.page_key = page_key;
|
|
21
|
+
this.index_path = index_path;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected async performInternal(): Promise<string> {
|
|
25
|
+
const page_key = this.getPageKey();
|
|
26
|
+
const execution_context = this.getExecutionContext();
|
|
27
|
+
const load_operation = new LoadPageOperation(page_key, execution_context);
|
|
28
|
+
const page = await load_operation.perform();
|
|
29
|
+
const index_path = this.getIndexPath();
|
|
30
|
+
|
|
31
|
+
if (index_path === '0') {
|
|
32
|
+
return index_path;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const {
|
|
36
|
+
siblings,
|
|
37
|
+
index
|
|
38
|
+
} = getSiblingsAndIndexForIndexPath(page, index_path);
|
|
39
|
+
|
|
40
|
+
const index_parts = parseIndexPath(index_path);
|
|
41
|
+
const parent_parts = index_parts.slice(0, -1);
|
|
42
|
+
|
|
43
|
+
let new_path: string;
|
|
44
|
+
|
|
45
|
+
if (index === 0) {
|
|
46
|
+
const [removed_block] = siblings.splice(index, 1);
|
|
47
|
+
const parent_index_path = getParentIndexPath(index_path);
|
|
48
|
+
|
|
49
|
+
const {
|
|
50
|
+
siblings: parent_siblings,
|
|
51
|
+
index: parent_index
|
|
52
|
+
} = getSiblingsAndIndexForIndexPath(page, parent_index_path);
|
|
53
|
+
|
|
54
|
+
parent_siblings.splice(parent_index, 0, removed_block);
|
|
55
|
+
new_path = parent_index_path;
|
|
56
|
+
} else {
|
|
57
|
+
const new_index = index - 1;
|
|
58
|
+
const sibling = siblings[new_index];
|
|
59
|
+
|
|
60
|
+
if (sibling && sibling.block_type === BlockType.MULTI_COLUMN) {
|
|
61
|
+
const [removed_block] = siblings.splice(index, 1);
|
|
62
|
+
const children = sibling.children;
|
|
63
|
+
|
|
64
|
+
if (children === undefined) {
|
|
65
|
+
throw new InvariantViolation(`
|
|
66
|
+
Tried to read children for multi-column block,
|
|
67
|
+
but they were not set
|
|
68
|
+
`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
children.push(removed_block);
|
|
72
|
+
new_path = createIndexPath([
|
|
73
|
+
...parent_parts,
|
|
74
|
+
new_index,
|
|
75
|
+
children.length - 1
|
|
76
|
+
]);
|
|
77
|
+
} else {
|
|
78
|
+
const [removed_block] = siblings.splice(index, 1);
|
|
79
|
+
|
|
80
|
+
index_parts.pop();
|
|
81
|
+
index_parts.push(new_index);
|
|
82
|
+
new_path = createIndexPath(index_parts);
|
|
83
|
+
|
|
84
|
+
siblings.splice(new_index, 0, removed_block);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const save_operation = new SavePageOperation(page, execution_context);
|
|
89
|
+
|
|
90
|
+
await save_operation.perform();
|
|
91
|
+
|
|
92
|
+
return new_path;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private getPageKey(): string {
|
|
96
|
+
return this.page_key;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private getIndexPath(): string {
|
|
100
|
+
return this.index_path;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export default PromoteBlockOperation;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import Path from 'path';
|
|
2
|
+
import {writeFile, mkdir} from 'fs/promises';
|
|
3
|
+
|
|
4
|
+
import {StringEncoding} from 'lib/string';
|
|
5
|
+
import ExecutionContext from 'lib/execution-context';
|
|
6
|
+
|
|
7
|
+
import BaseOperation from 'operation';
|
|
8
|
+
import Page from 'type/page';
|
|
9
|
+
import BlockType from 'enum/block-type';
|
|
10
|
+
import validatePage from 'server/utility/validate-page';
|
|
11
|
+
|
|
12
|
+
class SavePageOperation extends BaseOperation<Page> {
|
|
13
|
+
private page: Page;
|
|
14
|
+
|
|
15
|
+
public constructor(page: Page, execution_context: ExecutionContext) {
|
|
16
|
+
super(execution_context);
|
|
17
|
+
|
|
18
|
+
this.page = page;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
protected async performInternal(): Promise<Page> {
|
|
22
|
+
const page = this.getPage();
|
|
23
|
+
|
|
24
|
+
validatePage(page);
|
|
25
|
+
|
|
26
|
+
const sanitized_blocks = page.blocks.filter((block) => {
|
|
27
|
+
const {block_type} = block;
|
|
28
|
+
|
|
29
|
+
return block_type !== BlockType.EPHEMERAL;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const sanitized_page = {
|
|
33
|
+
blocks: sanitized_blocks
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const {public_directory} = this.getConfig();
|
|
37
|
+
const {path} = page;
|
|
38
|
+
const filepath = Path.resolve(public_directory, `./${path}/index.json`);
|
|
39
|
+
const contents = JSON.stringify(sanitized_page, null, 2);
|
|
40
|
+
const parsed_path = Path.parse(filepath);
|
|
41
|
+
|
|
42
|
+
await mkdir(parsed_path.dir, {
|
|
43
|
+
recursive: true
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
await writeFile(filepath, contents, StringEncoding.UTF8);
|
|
47
|
+
|
|
48
|
+
return page;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected formatResult(result: Page): string {
|
|
52
|
+
return result.path;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private getPage(): Page {
|
|
56
|
+
return this.page;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default SavePageOperation;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {UnauthorizedError} from 'lib/errors';
|
|
2
|
+
import ExecutionContext from 'lib/execution-context';
|
|
3
|
+
|
|
4
|
+
import AccountSettings from 'type/account-settings';
|
|
5
|
+
import BaseOperation from 'operation';
|
|
6
|
+
|
|
7
|
+
class UpdateAccountSettingsOperation extends BaseOperation<AccountSettings> {
|
|
8
|
+
private settings: AccountSettings;
|
|
9
|
+
|
|
10
|
+
public constructor(settings: AccountSettings, execution_context: ExecutionContext) {
|
|
11
|
+
super(execution_context);
|
|
12
|
+
|
|
13
|
+
this.settings = settings;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
protected async performInternal(): Promise<AccountSettings> {
|
|
17
|
+
const execution_context = this.getExecutionContext();
|
|
18
|
+
const session = execution_context.getSession();
|
|
19
|
+
|
|
20
|
+
if (session === undefined) {
|
|
21
|
+
throw new UnauthorizedError();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const {username} = session;
|
|
25
|
+
|
|
26
|
+
if (username === null) {
|
|
27
|
+
throw new UnauthorizedError();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const {repository} = this.getConfig();
|
|
31
|
+
const account = await repository.getAccountForUsername(username);
|
|
32
|
+
|
|
33
|
+
if (account === undefined) {
|
|
34
|
+
throw new UnauthorizedError();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const settings = this.getSettings();
|
|
38
|
+
|
|
39
|
+
await repository.saveAccount({
|
|
40
|
+
...account,
|
|
41
|
+
settings
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return settings;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private getSettings(): AccountSettings {
|
|
48
|
+
return this.settings;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default UpdateAccountSettingsOperation;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import {rename} from 'fs/promises';
|
|
2
|
+
|
|
3
|
+
import {InvariantViolation} from 'lib/errors';
|
|
4
|
+
import ExecutionContext from 'lib/execution-context';
|
|
5
|
+
|
|
6
|
+
import Block from 'type/block';
|
|
7
|
+
import BlockType from 'enum/block-type';
|
|
8
|
+
import FolderBlock from 'type/block/folder';
|
|
9
|
+
import getFilepathForFolderBlock from 'server/utility/get-filepath-for-folder-block';
|
|
10
|
+
import BaseOperation from 'operation';
|
|
11
|
+
import getSiblingsAndIndexForIndexPath from 'server/utility/get-siblings-and-index-for-index-path';
|
|
12
|
+
import Page from 'type/page';
|
|
13
|
+
import SavePageOperation from 'server/operation/save-page';
|
|
14
|
+
import getBlockAtIndexPath from 'server/utility/get-block-at-index-path';
|
|
15
|
+
|
|
16
|
+
class UpdateBlockOperation extends BaseOperation<Block> {
|
|
17
|
+
private page: Page;
|
|
18
|
+
private block: Block;
|
|
19
|
+
private index_path: string;
|
|
20
|
+
|
|
21
|
+
public constructor(page: Page, block: Block, index_path: string, execution_context: ExecutionContext) {
|
|
22
|
+
super(execution_context);
|
|
23
|
+
|
|
24
|
+
this.page = page;
|
|
25
|
+
this.block = block;
|
|
26
|
+
this.index_path = index_path;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
protected async performInternal(): Promise<Block> {
|
|
30
|
+
await this.sanitizeFiles();
|
|
31
|
+
await this.updateBlockArtifacts();
|
|
32
|
+
|
|
33
|
+
return this.saveBlockToPage();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private async sanitizeFiles(): Promise<void> {
|
|
37
|
+
const new_block = this.getBlock();
|
|
38
|
+
const new_files = new_block.files || [];
|
|
39
|
+
const old_block = this.getOldBlock();
|
|
40
|
+
const old_files = old_block.files || [];
|
|
41
|
+
|
|
42
|
+
if (old_files.length > 0 && new_files.length === 0) {
|
|
43
|
+
this.block = {
|
|
44
|
+
...new_block,
|
|
45
|
+
files: old_files
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private async updateBlockArtifacts(): Promise<void> {
|
|
51
|
+
const new_block = this.getBlock();
|
|
52
|
+
|
|
53
|
+
if (new_block.block_type !== BlockType.FOLDER) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const old_block = this.getOldBlock();
|
|
58
|
+
|
|
59
|
+
if (old_block.block_type !== BlockType.FOLDER) {
|
|
60
|
+
throw new InvariantViolation(`
|
|
61
|
+
Tried to update folder block,
|
|
62
|
+
but preexisting block was of type: ${old_block.block_type}
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const {public_directory} = this.getConfig();
|
|
67
|
+
const {path} = this.getPage();
|
|
68
|
+
|
|
69
|
+
const new_folder_block = new_block as FolderBlock;
|
|
70
|
+
|
|
71
|
+
const new_path = getFilepathForFolderBlock({
|
|
72
|
+
block: new_folder_block,
|
|
73
|
+
public_directory,
|
|
74
|
+
base_path: path
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const old_folder_block = old_block as FolderBlock;
|
|
78
|
+
|
|
79
|
+
const old_path = getFilepathForFolderBlock({
|
|
80
|
+
block: old_folder_block,
|
|
81
|
+
public_directory,
|
|
82
|
+
base_path: path
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
await rename(old_path, new_path);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private async saveBlockToPage(): Promise<Block> {
|
|
89
|
+
const page = this.getPage();
|
|
90
|
+
const execution_context = this.getExecutionContext();
|
|
91
|
+
const updated_block = this.getBlock();
|
|
92
|
+
const index_path = this.getIndexPath();
|
|
93
|
+
const {siblings, index} = getSiblingsAndIndexForIndexPath(page, index_path);
|
|
94
|
+
|
|
95
|
+
siblings.splice(index, 1, updated_block);
|
|
96
|
+
|
|
97
|
+
const save_operation = new SavePageOperation(page, execution_context);
|
|
98
|
+
|
|
99
|
+
await save_operation.perform();
|
|
100
|
+
|
|
101
|
+
return updated_block;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private getOldBlock(): Block {
|
|
105
|
+
const page = this.getPage();
|
|
106
|
+
const index_path = this.getIndexPath();
|
|
107
|
+
|
|
108
|
+
return getBlockAtIndexPath(page, index_path);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private getPage(): Page {
|
|
112
|
+
return this.page;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private getBlock(): Block {
|
|
116
|
+
return this.block;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private getIndexPath(): string {
|
|
120
|
+
return this.index_path;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export default UpdateBlockOperation;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import KeyGenerator from 'lib/key-generator';
|
|
2
|
+
import {NotFoundError} from 'lib/errors';
|
|
3
|
+
import {Session} from 'lib/execution-context';
|
|
4
|
+
|
|
5
|
+
import Account from 'type/account';
|
|
6
|
+
import Repository from 'interface/repository';
|
|
7
|
+
|
|
8
|
+
type MemoryData = {
|
|
9
|
+
readonly accounts: Account[];
|
|
10
|
+
readonly sessions: Session[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
class MemoryRepository implements Repository {
|
|
14
|
+
private data: MemoryData;
|
|
15
|
+
private accounts_by_username: Record<string, Account>;
|
|
16
|
+
|
|
17
|
+
public constructor(data?: MemoryData) {
|
|
18
|
+
this.data = data || {
|
|
19
|
+
accounts: [],
|
|
20
|
+
sessions: []
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
this.accounts_by_username = {};
|
|
24
|
+
|
|
25
|
+
this.data.accounts.forEach((account) => {
|
|
26
|
+
const {username} = account;
|
|
27
|
+
|
|
28
|
+
this.accounts_by_username[username] = account;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public async findSession(session_id: string): Promise<Session> {
|
|
33
|
+
const session = this.data.sessions.find((session) => {
|
|
34
|
+
return session.id === session_id;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (session === undefined) {
|
|
38
|
+
return {
|
|
39
|
+
id: session_id,
|
|
40
|
+
account_id: null,
|
|
41
|
+
username: null
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return session;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public async destroySession(session_id: string): Promise<void> {
|
|
49
|
+
let found = false;
|
|
50
|
+
|
|
51
|
+
this.data = {
|
|
52
|
+
...this.data,
|
|
53
|
+
sessions: this.data.sessions.filter((session) => {
|
|
54
|
+
if (session.id === session_id) {
|
|
55
|
+
found = true;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
})
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
if (!found) {
|
|
64
|
+
throw new NotFoundError(`Unable to find session for id: ${session_id}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public async createSessionForAccount(account: Account): Promise<Session> {
|
|
69
|
+
const id = KeyGenerator.generateToken();
|
|
70
|
+
|
|
71
|
+
const session = {
|
|
72
|
+
id,
|
|
73
|
+
account_id: account.id,
|
|
74
|
+
username: account.username
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
this.data = {
|
|
78
|
+
...this.data,
|
|
79
|
+
sessions: [
|
|
80
|
+
...this.data.sessions.filter((session) => {
|
|
81
|
+
return session.account_id !== account.id;
|
|
82
|
+
}),
|
|
83
|
+
session
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return session;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public async saveAccount(new_account: Account): Promise<void> {
|
|
91
|
+
this.accounts_by_username[new_account.username] = new_account;
|
|
92
|
+
|
|
93
|
+
const accounts = this.data.accounts.map((old_account) => {
|
|
94
|
+
if (old_account.id === new_account.id) {
|
|
95
|
+
return new_account;
|
|
96
|
+
} else {
|
|
97
|
+
return old_account;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
this.data = {
|
|
102
|
+
...this.data,
|
|
103
|
+
accounts
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public async getAccountForUsername(username: string): Promise<Account | undefined> {
|
|
108
|
+
return this.accounts_by_username[username];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export default MemoryRepository;
|