diff --git a/.yarn/cache/@jest-core-npm-28.1.2-d632a1ee2e-dd67cc911c.zip b/.yarn/cache/@jest-core-npm-28.1.2-d632a1ee2e-dd67cc911c.zip new file mode 100644 index 000000000..d1e0ca8c5 Binary files /dev/null and b/.yarn/cache/@jest-core-npm-28.1.2-d632a1ee2e-dd67cc911c.zip differ diff --git a/.yarn/cache/@jest-environment-npm-28.1.2-5ba92d7c1b-5bffc464e9.zip b/.yarn/cache/@jest-environment-npm-28.1.2-5ba92d7c1b-5bffc464e9.zip new file mode 100644 index 000000000..7318e7176 Binary files /dev/null and b/.yarn/cache/@jest-environment-npm-28.1.2-5ba92d7c1b-5bffc464e9.zip differ diff --git a/.yarn/cache/@jest-expect-npm-28.1.2-c1ba663cb5-ee470cdd3a.zip b/.yarn/cache/@jest-expect-npm-28.1.2-c1ba663cb5-ee470cdd3a.zip new file mode 100644 index 000000000..4ace2a492 Binary files /dev/null and b/.yarn/cache/@jest-expect-npm-28.1.2-c1ba663cb5-ee470cdd3a.zip differ diff --git a/.yarn/cache/@jest-expect-utils-npm-28.1.1-1823a850d9-46a2ad754b.zip b/.yarn/cache/@jest-expect-utils-npm-28.1.1-1823a850d9-46a2ad754b.zip new file mode 100644 index 000000000..bed0e498a Binary files /dev/null and b/.yarn/cache/@jest-expect-utils-npm-28.1.1-1823a850d9-46a2ad754b.zip differ diff --git a/.yarn/cache/@jest-fake-timers-npm-28.1.2-708e436e77-d6e6b1a12f.zip b/.yarn/cache/@jest-fake-timers-npm-28.1.2-708e436e77-d6e6b1a12f.zip new file mode 100644 index 000000000..4a37426a1 Binary files /dev/null and b/.yarn/cache/@jest-fake-timers-npm-28.1.2-708e436e77-d6e6b1a12f.zip differ diff --git a/.yarn/cache/@jest-globals-npm-28.1.2-a3b0bd62de-f07b7d0a2d.zip b/.yarn/cache/@jest-globals-npm-28.1.2-a3b0bd62de-f07b7d0a2d.zip new file mode 100644 index 000000000..7637c890b Binary files /dev/null and b/.yarn/cache/@jest-globals-npm-28.1.2-a3b0bd62de-f07b7d0a2d.zip differ diff --git a/.yarn/cache/@jest-reporters-npm-28.1.2-8a0dea0c1e-26aa66e8ea.zip b/.yarn/cache/@jest-reporters-npm-28.1.2-8a0dea0c1e-26aa66e8ea.zip new file mode 100644 index 000000000..dffb58830 Binary files /dev/null and b/.yarn/cache/@jest-reporters-npm-28.1.2-8a0dea0c1e-26aa66e8ea.zip differ diff --git a/.yarn/cache/@jest-source-map-npm-28.1.2-c3d608514f-b82a5c2e93.zip b/.yarn/cache/@jest-source-map-npm-28.1.2-c3d608514f-b82a5c2e93.zip new file mode 100644 index 000000000..991b89e34 Binary files /dev/null and b/.yarn/cache/@jest-source-map-npm-28.1.2-c3d608514f-b82a5c2e93.zip differ diff --git a/.yarn/cache/@jest-test-sequencer-npm-28.1.1-d7bbefa803-acfa3b7ff1.zip b/.yarn/cache/@jest-test-sequencer-npm-28.1.1-d7bbefa803-acfa3b7ff1.zip new file mode 100644 index 000000000..34001bc13 Binary files /dev/null and b/.yarn/cache/@jest-test-sequencer-npm-28.1.1-d7bbefa803-acfa3b7ff1.zip differ diff --git a/.yarn/cache/@jest-transform-npm-28.1.2-6f3b28178a-cd8d1bdf1a.zip b/.yarn/cache/@jest-transform-npm-28.1.2-6f3b28178a-cd8d1bdf1a.zip new file mode 100644 index 000000000..4fbb4c261 Binary files /dev/null and b/.yarn/cache/@jest-transform-npm-28.1.2-6f3b28178a-cd8d1bdf1a.zip differ diff --git a/.yarn/cache/@sinonjs-fake-timers-npm-9.1.2-3ff37ab7fb-7d3aef54e1.zip b/.yarn/cache/@sinonjs-fake-timers-npm-9.1.2-3ff37ab7fb-7d3aef54e1.zip new file mode 100644 index 000000000..fc45d2a9b Binary files /dev/null and b/.yarn/cache/@sinonjs-fake-timers-npm-9.1.2-3ff37ab7fb-7d3aef54e1.zip differ diff --git a/.yarn/cache/@standardnotes-features-npm-1.46.0-32e559e3b6-0653b9b425.zip b/.yarn/cache/@standardnotes-features-npm-1.46.0-32e559e3b6-0653b9b425.zip deleted file mode 100644 index da2275986..000000000 Binary files a/.yarn/cache/@standardnotes-features-npm-1.46.0-32e559e3b6-0653b9b425.zip and /dev/null differ diff --git a/.yarn/cache/@standardnotes-features-npm-1.47.0-6629f29da7-bd0ddd6017.zip b/.yarn/cache/@standardnotes-features-npm-1.47.0-6629f29da7-bd0ddd6017.zip deleted file mode 100644 index 2849c870f..000000000 Binary files a/.yarn/cache/@standardnotes-features-npm-1.47.0-6629f29da7-bd0ddd6017.zip and /dev/null differ diff --git a/.yarn/cache/@types-jest-npm-28.1.4-0d5921a434-97e22c6003.zip b/.yarn/cache/@types-jest-npm-28.1.4-0d5921a434-97e22c6003.zip new file mode 100644 index 000000000..aa32fb70f Binary files /dev/null and b/.yarn/cache/@types-jest-npm-28.1.4-0d5921a434-97e22c6003.zip differ diff --git a/.yarn/cache/babel-jest-npm-28.1.2-9fe49235c4-1aa605ef4d.zip b/.yarn/cache/babel-jest-npm-28.1.2-9fe49235c4-1aa605ef4d.zip new file mode 100644 index 000000000..8d16285b1 Binary files /dev/null and b/.yarn/cache/babel-jest-npm-28.1.2-9fe49235c4-1aa605ef4d.zip differ diff --git a/.yarn/cache/babel-plugin-jest-hoist-npm-28.1.1-aaeb3ac36a-5fb9ad012e.zip b/.yarn/cache/babel-plugin-jest-hoist-npm-28.1.1-aaeb3ac36a-5fb9ad012e.zip new file mode 100644 index 000000000..0ead1dcbd Binary files /dev/null and b/.yarn/cache/babel-plugin-jest-hoist-npm-28.1.1-aaeb3ac36a-5fb9ad012e.zip differ diff --git a/.yarn/cache/babel-preset-jest-npm-28.1.1-05a1e38dd1-c581a81967.zip b/.yarn/cache/babel-preset-jest-npm-28.1.1-05a1e38dd1-c581a81967.zip new file mode 100644 index 000000000..84bf3bfe6 Binary files /dev/null and b/.yarn/cache/babel-preset-jest-npm-28.1.1-05a1e38dd1-c581a81967.zip differ diff --git a/.yarn/cache/expect-npm-28.1.1-0260491458-6e557b681f.zip b/.yarn/cache/expect-npm-28.1.1-0260491458-6e557b681f.zip new file mode 100644 index 000000000..f28560f17 Binary files /dev/null and b/.yarn/cache/expect-npm-28.1.1-0260491458-6e557b681f.zip differ diff --git a/.yarn/cache/jest-changed-files-npm-28.0.2-86f0227b65-389d4de4b2.zip b/.yarn/cache/jest-changed-files-npm-28.0.2-86f0227b65-389d4de4b2.zip new file mode 100644 index 000000000..514ac8e96 Binary files /dev/null and b/.yarn/cache/jest-changed-files-npm-28.0.2-86f0227b65-389d4de4b2.zip differ diff --git a/.yarn/cache/jest-circus-npm-28.1.2-7f50bea781-c8f2e024e4.zip b/.yarn/cache/jest-circus-npm-28.1.2-7f50bea781-c8f2e024e4.zip new file mode 100644 index 000000000..e5b377503 Binary files /dev/null and b/.yarn/cache/jest-circus-npm-28.1.2-7f50bea781-c8f2e024e4.zip differ diff --git a/.yarn/cache/jest-cli-npm-28.1.2-cbf6c8906a-527873c257.zip b/.yarn/cache/jest-cli-npm-28.1.2-cbf6c8906a-527873c257.zip new file mode 100644 index 000000000..202c92147 Binary files /dev/null and b/.yarn/cache/jest-cli-npm-28.1.2-cbf6c8906a-527873c257.zip differ diff --git a/.yarn/cache/jest-config-npm-28.1.2-56df4d8edb-ddc4de7a28.zip b/.yarn/cache/jest-config-npm-28.1.2-56df4d8edb-ddc4de7a28.zip new file mode 100644 index 000000000..1dee08e41 Binary files /dev/null and b/.yarn/cache/jest-config-npm-28.1.2-56df4d8edb-ddc4de7a28.zip differ diff --git a/.yarn/cache/jest-docblock-npm-28.1.1-92269e3ff0-22fca68d98.zip b/.yarn/cache/jest-docblock-npm-28.1.1-92269e3ff0-22fca68d98.zip new file mode 100644 index 000000000..a5d9751fb Binary files /dev/null and b/.yarn/cache/jest-docblock-npm-28.1.1-92269e3ff0-22fca68d98.zip differ diff --git a/.yarn/cache/jest-each-npm-28.1.1-299702462d-91965603f8.zip b/.yarn/cache/jest-each-npm-28.1.1-299702462d-91965603f8.zip new file mode 100644 index 000000000..5d393e140 Binary files /dev/null and b/.yarn/cache/jest-each-npm-28.1.1-299702462d-91965603f8.zip differ diff --git a/.yarn/cache/jest-environment-node-npm-28.1.2-a3cfa6adac-cee61a3e25.zip b/.yarn/cache/jest-environment-node-npm-28.1.2-a3cfa6adac-cee61a3e25.zip new file mode 100644 index 000000000..89436f3fb Binary files /dev/null and b/.yarn/cache/jest-environment-node-npm-28.1.2-a3cfa6adac-cee61a3e25.zip differ diff --git a/.yarn/cache/jest-haste-map-npm-28.1.1-184dfbeed0-db31a2a839.zip b/.yarn/cache/jest-haste-map-npm-28.1.1-184dfbeed0-db31a2a839.zip new file mode 100644 index 000000000..506c06428 Binary files /dev/null and b/.yarn/cache/jest-haste-map-npm-28.1.1-184dfbeed0-db31a2a839.zip differ diff --git a/.yarn/cache/jest-leak-detector-npm-28.1.1-99f9cda79d-379a15ad7b.zip b/.yarn/cache/jest-leak-detector-npm-28.1.1-99f9cda79d-379a15ad7b.zip new file mode 100644 index 000000000..a5bb5038a Binary files /dev/null and b/.yarn/cache/jest-leak-detector-npm-28.1.1-99f9cda79d-379a15ad7b.zip differ diff --git a/.yarn/cache/jest-mock-npm-28.1.1-66f9031b26-285716d062.zip b/.yarn/cache/jest-mock-npm-28.1.1-66f9031b26-285716d062.zip new file mode 100644 index 000000000..090d62946 Binary files /dev/null and b/.yarn/cache/jest-mock-npm-28.1.1-66f9031b26-285716d062.zip differ diff --git a/.yarn/cache/jest-npm-28.1.2-0cb80d72d4-8ad37088c4.zip b/.yarn/cache/jest-npm-28.1.2-0cb80d72d4-8ad37088c4.zip new file mode 100644 index 000000000..8041992e4 Binary files /dev/null and b/.yarn/cache/jest-npm-28.1.2-0cb80d72d4-8ad37088c4.zip differ diff --git a/.yarn/cache/jest-resolve-dependencies-npm-28.1.2-3bd416d27e-2f822678b5.zip b/.yarn/cache/jest-resolve-dependencies-npm-28.1.2-3bd416d27e-2f822678b5.zip new file mode 100644 index 000000000..f43105d03 Binary files /dev/null and b/.yarn/cache/jest-resolve-dependencies-npm-28.1.2-3bd416d27e-2f822678b5.zip differ diff --git a/.yarn/cache/jest-resolve-npm-28.1.1-5f1937a1f8-cda5c472fe.zip b/.yarn/cache/jest-resolve-npm-28.1.1-5f1937a1f8-cda5c472fe.zip new file mode 100644 index 000000000..8fa0209c2 Binary files /dev/null and b/.yarn/cache/jest-resolve-npm-28.1.1-5f1937a1f8-cda5c472fe.zip differ diff --git a/.yarn/cache/jest-runner-npm-28.1.2-f1340306c4-51e46779e6.zip b/.yarn/cache/jest-runner-npm-28.1.2-f1340306c4-51e46779e6.zip new file mode 100644 index 000000000..7b6143ab1 Binary files /dev/null and b/.yarn/cache/jest-runner-npm-28.1.2-f1340306c4-51e46779e6.zip differ diff --git a/.yarn/cache/jest-runtime-npm-28.1.2-ae8fb2675f-d9a2f45a7b.zip b/.yarn/cache/jest-runtime-npm-28.1.2-ae8fb2675f-d9a2f45a7b.zip new file mode 100644 index 000000000..54506df8e Binary files /dev/null and b/.yarn/cache/jest-runtime-npm-28.1.2-ae8fb2675f-d9a2f45a7b.zip differ diff --git a/.yarn/cache/jest-snapshot-npm-28.1.2-c457ca7d89-5c33c8b05d.zip b/.yarn/cache/jest-snapshot-npm-28.1.2-c457ca7d89-5c33c8b05d.zip new file mode 100644 index 000000000..1529adc2f Binary files /dev/null and b/.yarn/cache/jest-snapshot-npm-28.1.2-c457ca7d89-5c33c8b05d.zip differ diff --git a/.yarn/cache/jest-validate-npm-28.1.1-3a8ac7efbd-7bb5427d9b.zip b/.yarn/cache/jest-validate-npm-28.1.1-3a8ac7efbd-7bb5427d9b.zip new file mode 100644 index 000000000..015aeaf81 Binary files /dev/null and b/.yarn/cache/jest-validate-npm-28.1.1-3a8ac7efbd-7bb5427d9b.zip differ diff --git a/.yarn/cache/source-map-support-npm-0.5.13-377dfd7321-933550047b.zip b/.yarn/cache/source-map-support-npm-0.5.13-377dfd7321-933550047b.zip new file mode 100644 index 000000000..4fbf1b13a Binary files /dev/null and b/.yarn/cache/source-map-support-npm-0.5.13-377dfd7321-933550047b.zip differ diff --git a/.yarn/cache/v8-to-istanbul-npm-9.0.1-58bbce7857-a49c34bf0a.zip b/.yarn/cache/v8-to-istanbul-npm-9.0.1-58bbce7857-a49c34bf0a.zip new file mode 100644 index 000000000..460a70b28 Binary files /dev/null and b/.yarn/cache/v8-to-istanbul-npm-9.0.1-58bbce7857-a49c34bf0a.zip differ diff --git a/packages/components/package.json b/packages/components/package.json index c606b0d97..e7a6b059a 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@standardnotes/deterministic-zip": "^1.2.0", "@standardnotes/eslint-config-extensions": "^1.0.4", - "@standardnotes/features": "^1.45.1", + "@standardnotes/features": "workspace:*", "copy-webpack-plugin": "^11.0.0", "mini-css-extract-plugin": "^2.6.0", "minimatch": "^5.1.0", diff --git a/packages/features/.eslintignore b/packages/features/.eslintignore new file mode 100644 index 000000000..f06235c46 --- /dev/null +++ b/packages/features/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/features/.eslintrc b/packages/features/.eslintrc new file mode 100644 index 000000000..cb7136174 --- /dev/null +++ b/packages/features/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "../../.eslintrc", + "parserOptions": { + "project": "./linter.tsconfig.json" + } +} diff --git a/packages/features/CHANGELOG.md b/packages/features/CHANGELOG.md new file mode 100644 index 000000000..73ab77546 --- /dev/null +++ b/packages/features/CHANGELOG.md @@ -0,0 +1,680 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.47.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.47.0...@standardnotes/features@1.47.1) (2022-07-04) + +### Bug Fixes + +* add missing reflect-metadata package to all packages ([ce3a5bb](https://github.com/standardnotes/snjs/commit/ce3a5bbf3f1d2276ac4abc3eec3c6a44c8c3ba9b)) +* unit tests running ([9ddc55c](https://github.com/standardnotes/snjs/commit/9ddc55c59c781e2bcc366304a6d0cc88d0e0865d)) + +# [1.47.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.46.0...@standardnotes/features@1.47.0) (2022-06-29) + +### Features + +* undeprecate markdown pro editor ([#774](https://github.com/standardnotes/snjs/issues/774)) ([5b0d582](https://github.com/standardnotes/snjs/commit/5b0d5826a7a1e1432c0026fa04dc26b4bfff44d7)) + +# [1.46.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.6...@standardnotes/features@1.46.0) (2022-06-27) + +### Features + +* deprecate non-primary editors ([#772](https://github.com/standardnotes/snjs/issues/772)) ([60c8f2a](https://github.com/standardnotes/snjs/commit/60c8f2a6a057ac1a097b077143ed85a7607eba20)) + +## [1.45.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.5...@standardnotes/features@1.45.6) (2022-06-27) + +**Note:** Version bump only for package @standardnotes/features + +## [1.45.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.4...@standardnotes/features@1.45.5) (2022-06-16) + +**Note:** Version bump only for package @standardnotes/features + +## [1.45.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.3...@standardnotes/features@1.45.4) (2022-06-16) + +**Note:** Version bump only for package @standardnotes/features + +## [1.45.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.2...@standardnotes/features@1.45.3) (2022-06-15) + +**Note:** Version bump only for package @standardnotes/features + +## [1.45.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.1...@standardnotes/features@1.45.2) (2022-06-10) + +**Note:** Version bump only for package @standardnotes/features + +## [1.45.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.45.0...@standardnotes/features@1.45.1) (2022-06-09) + +### Bug Fixes + +* get ExperimentalFeatures identifiers from experimentalFeatures() ([#762](https://github.com/standardnotes/snjs/issues/762)) ([6b2af78](https://github.com/standardnotes/snjs/commit/6b2af783f25260b47211b1eefb8e0f6742bb3b07)) + +# [1.45.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.7...@standardnotes/features@1.45.0) (2022-06-09) + +### Features + +* advanced checklist ([#759](https://github.com/standardnotes/snjs/issues/759)) ([600c88a](https://github.com/standardnotes/snjs/commit/600c88a81e5871a91793c2e7ca2aea9f358d839e)) + +## [1.44.7](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.6...@standardnotes/features@1.44.7) (2022-06-03) + +### Bug Fixes + +* define getters on items used in predicates so keypath lookups are not undefined ([#756](https://github.com/standardnotes/snjs/issues/756)) ([3297077](https://github.com/standardnotes/snjs/commit/32970774897a48fd9a12b329ca204ed6882a47ab)) + +## [1.44.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.5...@standardnotes/features@1.44.6) (2022-05-30) + +**Note:** Version bump only for package @standardnotes/features + +## [1.44.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.4...@standardnotes/features@1.44.5) (2022-05-27) + +**Note:** Version bump only for package @standardnotes/features + +## [1.44.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.3...@standardnotes/features@1.44.4) (2022-05-24) + +**Note:** Version bump only for package @standardnotes/features + +## [1.44.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.2...@standardnotes/features@1.44.3) (2022-05-24) + +**Note:** Version bump only for package @standardnotes/features + +## [1.44.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.1...@standardnotes/features@1.44.2) (2022-05-22) + +**Note:** Version bump only for package @standardnotes/features + +## [1.44.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.44.0...@standardnotes/features@1.44.1) (2022-05-20) + +**Note:** Version bump only for package @standardnotes/features + +# [1.44.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.43.2...@standardnotes/features@1.44.0) (2022-05-17) + +### Features + +* remove basic user role and core subscription plan ([#741](https://github.com/standardnotes/snjs/issues/741)) ([7800ecd](https://github.com/standardnotes/snjs/commit/7800ecd119e7bbb5872d48bd7806b5d0f5522c0e)) + +## [1.43.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.43.1...@standardnotes/features@1.43.2) (2022-05-17) + +**Note:** Version bump only for package @standardnotes/features + +## [1.43.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.43.0...@standardnotes/features@1.43.1) (2022-05-16) + +**Note:** Version bump only for package @standardnotes/features + +# [1.43.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.42.1...@standardnotes/features@1.43.0) (2022-05-16) + +### Features + +* remove basic user role and core subscription plan names ([304e232](https://github.com/standardnotes/snjs/commit/304e232e738456a93374de869117b5579e8a8f57)) + +## [1.42.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.42.0...@standardnotes/features@1.42.1) (2022-05-12) + +### Bug Fixes + +* remove "Unlimited history" from Plus plan features list ([#729](https://github.com/standardnotes/snjs/issues/729)) ([a4d5c64](https://github.com/standardnotes/snjs/commit/a4d5c6424753ae22ebb46ab31666396c28fcd77f)) + +# [1.42.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.41.0...@standardnotes/features@1.42.0) (2022-05-09) + +### Features + +* plain text feature identifier ([be17b56](https://github.com/standardnotes/snjs/commit/be17b5691b0a4bc45ea9914870dba2093cbb0cbf)) + +# [1.41.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.40.2...@standardnotes/features@1.41.0) (2022-05-05) + +### Features + +* availableInSubscriptions in each feature description ([#723](https://github.com/standardnotes/snjs/issues/723)) ([2f0527c](https://github.com/standardnotes/snjs/commit/2f0527c6ff5e9dc70a61fa6d189aad9e60d09ab0)) + +## [1.40.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.40.0...@standardnotes/features@1.40.2) (2022-05-04) + +**Note:** Version bump only for package @standardnotes/features + +## [1.40.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.40.0...@standardnotes/features@1.40.1) (2022-05-04) + +**Note:** Version bump only for package @standardnotes/features + +# [1.40.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.39.0...@standardnotes/features@1.40.0) (2022-05-03) + +### Features + +* editors => note types ([#722](https://github.com/standardnotes/snjs/issues/722)) ([898f27a](https://github.com/standardnotes/snjs/commit/898f27ab9928a46b33662c0454ec6489884ec276)) + +# [1.39.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.38.1...@standardnotes/features@1.39.0) (2022-05-02) + +### Features + +* take Markdown Visual out of beta ([#720](https://github.com/standardnotes/snjs/issues/720)) ([e03acf7](https://github.com/standardnotes/snjs/commit/e03acf700d7a29b8504af548381131f55696726b)) + +## [1.38.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.38.0...@standardnotes/features@1.38.1) (2022-04-27) + +### Bug Fixes + +* remove deprecated 2FA manager permission and feature ([47df3e4](https://github.com/standardnotes/snjs/commit/47df3e41ea9e5b6b721d47b6319ccd590b6f566c)) + +# [1.38.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.9...@standardnotes/features@1.38.0) (2022-04-25) + +### Features + +* rename feature and permissions related to storage tiers ([b4c18b9](https://github.com/standardnotes/snjs/commit/b4c18b91516d771e5c6bf3f510ab09ca621896ea)) + +## [1.37.9](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.8...@standardnotes/features@1.37.9) (2022-04-22) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.8](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.7...@standardnotes/features@1.37.8) (2022-04-21) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.7](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.6...@standardnotes/features@1.37.7) (2022-04-20) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.5...@standardnotes/features@1.37.6) (2022-04-20) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.4...@standardnotes/features@1.37.5) (2022-04-15) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.3...@standardnotes/features@1.37.4) (2022-04-15) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.2...@standardnotes/features@1.37.3) (2022-04-12) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.1...@standardnotes/features@1.37.2) (2022-04-11) + +**Note:** Version bump only for package @standardnotes/features + +## [1.37.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.37.0...@standardnotes/features@1.37.1) (2022-04-01) + +**Note:** Version bump only for package @standardnotes/features + +# [1.37.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.36.3...@standardnotes/features@1.37.0) (2022-04-01) + +### Features + +* content interfaces and model type strictness ([#685](https://github.com/standardnotes/snjs/issues/685)) ([e2450c5](https://github.com/standardnotes/snjs/commit/e2450c59e8309d7080efaa03905b2abc728d9403)) + +## [1.36.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.36.2...@standardnotes/features@1.36.3) (2022-03-31) + +**Note:** Version bump only for package @standardnotes/features + +## [1.36.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.36.1...@standardnotes/features@1.36.2) (2022-03-31) + +**Note:** Version bump only for package @standardnotes/features + +## [1.36.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.36.0...@standardnotes/features@1.36.1) (2022-03-31) + +**Note:** Version bump only for package @standardnotes/features + +# [1.36.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.6...@standardnotes/features@1.36.0) (2022-03-30) + +### Features + +* files-beta role ([#678](https://github.com/standardnotes/snjs/issues/678)) ([f1ae62f](https://github.com/standardnotes/snjs/commit/f1ae62ff05e361dc551f1a0d047feabd129d0f76)) + +## [1.35.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.5...@standardnotes/features@1.35.6) (2022-03-23) + +**Note:** Version bump only for package @standardnotes/features + +## [1.35.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.4...@standardnotes/features@1.35.5) (2022-03-23) + +**Note:** Version bump only for package @standardnotes/features + +## [1.35.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.3...@standardnotes/features@1.35.4) (2022-03-22) + +**Note:** Version bump only for package @standardnotes/features + +## [1.35.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.2...@standardnotes/features@1.35.3) (2022-03-21) + +**Note:** Version bump only for package @standardnotes/features + +## [1.35.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.1...@standardnotes/features@1.35.2) (2022-03-21) + +**Note:** Version bump only for package @standardnotes/features + +## [1.35.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.35.0...@standardnotes/features@1.35.1) (2022-03-18) + +**Note:** Version bump only for package @standardnotes/features + +# [1.35.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.12...@standardnotes/features@1.35.0) (2022-03-16) + +### Features + +* restricted component permissions ([e90b2d6](https://github.com/standardnotes/snjs/commit/e90b2d6847920e4cd7a281145204ce2f346af88e)) + +## [1.34.12](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.10...@standardnotes/features@1.34.12) (2022-03-16) + +**Note:** Version bump only for package @standardnotes/features + +## [1.34.11](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.10...@standardnotes/features@1.34.11) (2022-03-16) + +**Note:** Version bump only for package @standardnotes/features + +## [1.34.10](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.9...@standardnotes/features@1.34.10) (2022-03-11) + +**Note:** Version bump only for package @standardnotes/features + +## [1.34.9](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.8...@standardnotes/features@1.34.9) (2022-03-11) + +**Note:** Version bump only for package @standardnotes/features + +## [1.34.8](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.7...@standardnotes/features@1.34.8) (2022-03-10) + +### Bug Fixes + +* updated markdown visual ([6a2acb7](https://github.com/standardnotes/snjs/commit/6a2acb70961135394a30fe30d2c6f10f2204c1b9)) + +## [1.34.7](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.6...@standardnotes/features@1.34.7) (2022-03-10) + +### Bug Fixes + +* **temp:** remove markdown visual ([4ba193b](https://github.com/standardnotes/snjs/commit/4ba193b6848c15a94bbdb0e61edb30fea6c02c18)) + +## [1.34.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.5...@standardnotes/features@1.34.6) (2022-03-10) + +### Bug Fixes + +* feature description ([d8a020d](https://github.com/standardnotes/snjs/commit/d8a020d85cae94490cb40be41c041939ec8f0031)) + +## [1.34.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.4...@standardnotes/features@1.34.5) (2022-03-09) + +**Note:** Version bump only for package @standardnotes/features + +## [1.34.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.3...@standardnotes/features@1.34.4) (2022-03-08) + +**Note:** Version bump only for package @standardnotes/features + +## [1.34.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.2...@standardnotes/features@1.34.3) (2022-03-08) + +### Bug Fixes + +* remove AccountSwitcher from experimental features list ([#638](https://github.com/standardnotes/snjs/issues/638)) ([3b37107](https://github.com/standardnotes/snjs/commit/3b37107490d6daad17d0fcb89545bb252cd52732)) + +## [1.34.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.1...@standardnotes/features@1.34.2) (2022-03-07) + +### Bug Fixes + +* changes to enable experimental features ([#632](https://github.com/standardnotes/snjs/issues/632)) ([a60d981](https://github.com/standardnotes/snjs/commit/a60d981eda8f0634c0885cfcc0dfce0d02748072)) + +## [1.34.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.34.0...@standardnotes/features@1.34.1) (2022-03-04) + +**Note:** Version bump only for package @standardnotes/features + +# [1.34.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.33.3...@standardnotes/features@1.34.0) (2022-03-01) + +### Features + +* add experimental feature support ([#622](https://github.com/standardnotes/snjs/issues/622)) ([533c920](https://github.com/standardnotes/snjs/commit/533c92074826e496e6240dff2f11410f72064d8a)) + +## [1.33.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.33.1...@standardnotes/features@1.33.3) (2022-02-28) + +### Bug Fixes + +* add pseudo change to get lerna to trigger ([41e6817](https://github.com/standardnotes/snjs/commit/41e6817bbf726b0932cdf16f58622328b9e42803)) + +## [1.33.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.33.1...@standardnotes/features@1.33.2) (2022-02-28) + +### Bug Fixes + +* add pseudo change to get lerna to trigger ([41e6817](https://github.com/standardnotes/snjs/commit/41e6817bbf726b0932cdf16f58622328b9e42803)) + +## [1.33.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.33.0...@standardnotes/features@1.33.1) (2022-02-27) + +**Note:** Version bump only for package @standardnotes/features + +# [1.33.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.12...@standardnotes/features@1.33.0) (2022-02-25) + +### Features + +* extract core functionalities to separate packages ([#610](https://github.com/standardnotes/snjs/issues/610)) ([801547a](https://github.com/standardnotes/snjs/commit/801547a71614ad51a92fb249eaa184ed46a44aac)) + +## [1.32.12](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.11...@standardnotes/features@1.32.12) (2022-02-24) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.11](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.10...@standardnotes/features@1.32.11) (2022-02-22) + +### Bug Fixes + +* deprecated features should still be packaged ([#606](https://github.com/standardnotes/snjs/issues/606)) ([5176080](https://github.com/standardnotes/snjs/commit/5176080753a5720a0abf434923b1d8103b1261d0)) + +## [1.32.10](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.9...@standardnotes/features@1.32.10) (2022-02-22) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.9](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.8...@standardnotes/features@1.32.9) (2022-02-22) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.8](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.7...@standardnotes/features@1.32.8) (2022-02-18) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.7](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.6...@standardnotes/features@1.32.7) (2022-02-17) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.5...@standardnotes/features@1.32.6) (2022-02-16) + +### Bug Fixes + +* return newly added features ([395747f](https://github.com/standardnotes/snjs/commit/395747f6fa768ef9e87d10fb6b50e76f039115fd)) + +## [1.32.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.4...@standardnotes/features@1.32.5) (2022-02-16) + +### Bug Fixes + +* add new feature identifiers ([6a2623f](https://github.com/standardnotes/snjs/commit/6a2623f1dadb2d275e0c8b265d39f77c844ba26c)) + +## [1.32.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.3...@standardnotes/features@1.32.4) (2022-02-16) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.2...@standardnotes/features@1.32.3) (2022-02-16) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.1...@standardnotes/features@1.32.2) (2022-02-15) + +**Note:** Version bump only for package @standardnotes/features + +## [1.32.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.32.0...@standardnotes/features@1.32.1) (2022-02-14) + +**Note:** Version bump only for package @standardnotes/features + +# [1.32.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.31.0...@standardnotes/features@1.32.0) (2022-02-11) + +### Features + +* deprecated feature identifiers ([8e870f3](https://github.com/standardnotes/snjs/commit/8e870f352b022af768799a13473580d65150ff4b)) + +# [1.31.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.30.1...@standardnotes/features@1.31.0) (2022-02-10) + +### Features + +* remove role name and subscription name from auth in favor of common ([14ec74c](https://github.com/standardnotes/snjs/commit/14ec74c3d98febf1117073f32442504cfad428e8)) + +## [1.30.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.30.0...@standardnotes/features@1.30.1) (2022-02-10) + +**Note:** Version bump only for package @standardnotes/features + +# [1.30.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.29.0...@standardnotes/features@1.30.0) (2022-02-09) + +### Features + +* remove filesafe ([1cee4dd](https://github.com/standardnotes/snjs/commit/1cee4dd595003600d89adfd71fedf7b5454880b8)) + +# [1.29.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.28.0...@standardnotes/features@1.29.0) (2022-02-08) + +### Features + +* markdown visual editor ([#589](https://github.com/standardnotes/snjs/issues/589)) ([a6c9e74](https://github.com/standardnotes/snjs/commit/a6c9e742acef2c8d027646bf0f7a963b4de712ce)) + +# [1.28.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.27.0...@standardnotes/features@1.28.0) (2022-02-07) + +### Features + +* dynamic features based on runtime env ([#590](https://github.com/standardnotes/snjs/issues/590)) ([060861a](https://github.com/standardnotes/snjs/commit/060861a6c5bc179e3e1987c2b63490888e153bbb)) + +# [1.27.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.26.1...@standardnotes/features@1.27.0) (2022-02-01) + +### Features + +* enable spellcheck control for editors ([#578](https://github.com/standardnotes/snjs/issues/578)) ([24e7add](https://github.com/standardnotes/snjs/commit/24e7add3b6217703d142509b2dfd2ecfcc3ceb74)) + +## [1.26.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.26.0...@standardnotes/features@1.26.1) (2022-01-28) + +**Note:** Version bump only for package @standardnotes/features + +# [1.26.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.25.0...@standardnotes/features@1.26.0) (2022-01-27) + +### Features + +* add names to some unnamed features ([#575](https://github.com/standardnotes/snjs/issues/575)) ([1e14494](https://github.com/standardnotes/snjs/commit/1e144941ef0cd9ad3fe5dfa80b4700127c13b5d2)) + +# [1.25.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.7...@standardnotes/features@1.25.0) (2022-01-19) + +### Features + +* onPresyncSave ([0e5f451](https://github.com/standardnotes/snjs/commit/0e5f451e85cfd7cb58ff1f0a87425e4dd43f6030)) + +## [1.24.7](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.6...@standardnotes/features@1.24.7) (2022-01-19) + +### Bug Fixes + +* bump editors ([9e109b1](https://github.com/standardnotes/snjs/commit/9e109b1a29a3767f8fd3126bab0ccfcf4a2487a4)) + +## [1.24.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.5...@standardnotes/features@1.24.6) (2022-01-19) + +**Note:** Version bump only for package @standardnotes/features + +## [1.24.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.4...@standardnotes/features@1.24.5) (2022-01-19) + +**Note:** Version bump only for package @standardnotes/features + +## [1.24.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.3...@standardnotes/features@1.24.4) (2022-01-18) + +**Note:** Version bump only for package @standardnotes/features + +## [1.24.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.2...@standardnotes/features@1.24.3) (2022-01-17) + +**Note:** Version bump only for package @standardnotes/features + +## [1.24.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.1...@standardnotes/features@1.24.2) (2022-01-17) + +**Note:** Version bump only for package @standardnotes/features + +## [1.24.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.24.0...@standardnotes/features@1.24.1) (2022-01-17) + +**Note:** Version bump only for package @standardnotes/features + +# [1.24.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.23.1...@standardnotes/features@1.24.0) (2022-01-15) + +### Features + +* remove server extension type ([#552](https://github.com/standardnotes/snjs/issues/552)) ([aa542f3](https://github.com/standardnotes/snjs/commit/aa542f3124c60fa81a0b271030b3c35415c54a62)) + +## [1.23.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.23.0...@standardnotes/features@1.23.1) (2022-01-15) + +**Note:** Version bump only for package @standardnotes/features + +# [1.23.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.22.0...@standardnotes/features@1.23.0) (2022-01-14) + +### Features + +* markdown pro, bold editor ([0bc5add](https://github.com/standardnotes/snjs/commit/0bc5addabc7033149d207d1140f9c5e1b7dc7fb6)) + +# [1.22.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.21.0...@standardnotes/features@1.22.0) (2022-01-14) + +### Features + +* plus editor 1.6.0 ([6bdf5a7](https://github.com/standardnotes/snjs/commit/6bdf5a7519559f75d72016a1f4e6f715e55d437a)) + +# [1.21.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.8...@standardnotes/features@1.21.0) (2022-01-14) + +### Features + +* spellcheck control per note ([#557](https://github.com/standardnotes/snjs/issues/557)) ([76cc637](https://github.com/standardnotes/snjs/commit/76cc63781e3568bbb48b44001ab51644af0985b3)) + +## [1.20.8](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.7...@standardnotes/features@1.20.8) (2022-01-14) + +### Bug Fixes + +* cross-package dependencies and content type imports ([#556](https://github.com/standardnotes/snjs/issues/556)) ([26ba1e0](https://github.com/standardnotes/snjs/commit/26ba1e0c38e7e0ae572996125150a4c3d27f1c0a)) + +## [1.20.7](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.6...@standardnotes/features@1.20.7) (2022-01-12) + +**Note:** Version bump only for package @standardnotes/features + +## [1.20.6](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.5...@standardnotes/features@1.20.6) (2022-01-10) + +**Note:** Version bump only for package @standardnotes/features + +## [1.20.5](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.4...@standardnotes/features@1.20.5) (2022-01-05) + +### Bug Fixes + +* filesafe index path ([7cdfe46](https://github.com/standardnotes/snjs/commit/7cdfe46bc74b6671b1e26972363d6f3d0048d29a)) + +## [1.20.4](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.3...@standardnotes/features@1.20.4) (2022-01-03) + +**Note:** Version bump only for package @standardnotes/features + +## [1.20.3](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.2...@standardnotes/features@1.20.3) (2021-12-30) + +### Bug Fixes + +* component versions ([cb7407a](https://github.com/standardnotes/snjs/commit/cb7407a7002516f17974c6fcd693738c53c6293c)) + +## [1.20.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.1...@standardnotes/features@1.20.2) (2021-12-30) + +### Bug Fixes + +* missing code editor vendor dir ([1b9cedd](https://github.com/standardnotes/snjs/commit/1b9cedde303d4334d0d816c2e650513bb17b8b49)) + +## [1.20.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.20.0...@standardnotes/features@1.20.1) (2021-12-30) + +### Bug Fixes + +* linter errors in features package ([#534](https://github.com/standardnotes/snjs/issues/534)) ([640012e](https://github.com/standardnotes/snjs/commit/640012e2aa0d956b9a7ffd92a1435e9bd072229f)) + +# [1.20.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.19.1...@standardnotes/features@1.20.0) (2021-12-29) + +### Features + +* **components:** add deterministic zipping ([66d0c61](https://github.com/standardnotes/snjs/commit/66d0c61c966d5c8a8bfa33a6069acf3c24407842)) + +## [1.19.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.19.0...@standardnotes/features@1.19.1) (2021-12-29) + +**Note:** Version bump only for package @standardnotes/features + +# [1.19.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.18.2...@standardnotes/features@1.19.0) (2021-12-29) + +### Features + +* new components package ([95dd5aa](https://github.com/standardnotes/snjs/commit/95dd5aab0c2124192554be3f20f14ace62d9c46b)) + +## [1.18.2](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.18.1...@standardnotes/features@1.18.2) (2021-12-29) + +### Bug Fixes + +* correct gitignore paths ([cefc0cf](https://github.com/standardnotes/snjs/commit/cefc0cfcf98e3e5378e055b8c46931b53b23195e)) +* include dist in static components ([d17ce0f](https://github.com/standardnotes/snjs/commit/d17ce0f67045c6e4c97bf4577709aa58794e72e6)) + +## [1.18.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.18.0...@standardnotes/features@1.18.1) (2021-12-29) + +### Bug Fixes + +* include components cp in build script ([4733ec9](https://github.com/standardnotes/snjs/commit/4733ec9ece77d867280fabe20c63ba827d4834b7)) + +# [1.18.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.16.0...@standardnotes/features@1.18.0) (2021-12-29) + +### Features + +* native components ([#525](https://github.com/standardnotes/snjs/issues/525)) ([ca7f8e8](https://github.com/standardnotes/snjs/commit/ca7f8e876bccdaff60daf2cdee3d3b2020954e53)) + +# [1.16.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.15.1...@standardnotes/features@1.16.0) (2021-12-29) + +### Features + +* add smart tags as a feature / premium option ([#526](https://github.com/standardnotes/snjs/issues/526)) ([02cd04c](https://github.com/standardnotes/snjs/commit/02cd04c8b144c3c6a5aa51ff24d746c39afb1b57)) + +## [1.15.1](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.15.0...@standardnotes/features@1.15.1) (2021-12-27) + +**Note:** Version bump only for package @standardnotes/features + +# [1.15.0](https://github.com/standardnotes/snjs/compare/@standardnotes/features@1.14.0...@standardnotes/features@1.15.0) (2021-12-27) + +### Features + +* Remove theme:no-distraction permission ([#515](https://github.com/standardnotes/snjs/issues/515)) ([e8031fe](https://github.com/standardnotes/snjs/commit/e8031fe5a8f68add24de922b4f171ec69affa286)) + +# 1.14.0 (2021-12-23) + +### Features + +* rename email backup setting to email backup frequency ([25e7b46](https://github.com/standardnotes/snjs/commit/25e7b4620834711ac7f513ae893898c5eab1af53)) + +## 1.13.3 (2021-12-23) + +### Bug Fixes + +* lock package versions ([8aa2ce6](https://github.com/standardnotes/snjs/commit/8aa2ce676b57598ab72840adf851869d8e769022)) + +## 1.13.2 (2021-12-23) + +### Bug Fixes + +* add publishing from package version by lerna ([80433d0](https://github.com/standardnotes/snjs/commit/80433d044f258095753482b8322d73aba3d9a9e4)) + +## 1.13.1 (2021-12-23) + +### Bug Fixes + +* remove the ammend commit from lerna versioning ([f0400d9](https://github.com/standardnotes/snjs/commit/f0400d9a2f5a04eaece2e4c16da71166a2ddb251)) + +# 1.13.0 (2021-12-23) + +### Features + +* add one drive backup frequency setting ([#522](https://github.com/standardnotes/snjs/issues/522)) ([c27827f](https://github.com/standardnotes/snjs/commit/c27827f8c7969dd32511c9c75122ece372132c83)) + +## 1.12.4 (2021-12-23) + +### Bug Fixes + +* remove running tests upon deployment - ensured on PR status checks ([#523](https://github.com/standardnotes/snjs/issues/523)) ([5c795d1](https://github.com/standardnotes/snjs/commit/5c795d17b583d02955773576384e622c3ef7f418)) + +## 1.12.3 (2021-12-23) + +### Bug Fixes + +* pr template ([#518](https://github.com/standardnotes/snjs/issues/518)) ([b445bb6](https://github.com/standardnotes/snjs/commit/b445bb64841217ae27c2514887629235be95d2a3)) + +## 1.12.2 (2021-12-23) + +### Bug Fixes + +* checkout with personal access token ([773c1ef](https://github.com/standardnotes/snjs/commit/773c1ef91c4452ad411e928342060dcb59428e3c)) + +## 1.12.1 (2021-12-22) + +### Bug Fixes + +* gpg signing with CI StandardNotes user ([d72f61c](https://github.com/standardnotes/snjs/commit/d72f61c23cd15b31d37340cc756d16526634b9ee)) + +# 1.12.0 (2021-12-22) + +### Bug Fixes + +* add "Markdown Math" to features and permissions list, also add missing fields for CloudLink ([#389](https://github.com/standardnotes/snjs/issues/389)) ([66b1392](https://github.com/standardnotes/snjs/commit/66b13922b573ac81fc822cec8861126193e11de4)) +* add new props to features type ([#458](https://github.com/standardnotes/snjs/issues/458)) ([7a3e911](https://github.com/standardnotes/snjs/commit/7a3e9114414646a564a4de0879d68a801686e34f)) +* export feature identifier ([fc55d5c](https://github.com/standardnotes/snjs/commit/fc55d5cba9218548f2effdbb3d1456d4539398ad)) +* make borderColor snake-cased in features list ([#413](https://github.com/standardnotes/snjs/issues/413)) ([d96237c](https://github.com/standardnotes/snjs/commit/d96237c81288aa35d3f1e7757f0a2c4143a5fe29)) +* make features package independent of auth ([#371](https://github.com/standardnotes/snjs/issues/371)) ([cfb9e7d](https://github.com/standardnotes/snjs/commit/cfb9e7d5820f5fbb40f9aa253cd4f1a60049ca9d)) +* make remaining camel-cased feature keys to be snake-cased ([#416](https://github.com/standardnotes/snjs/issues/416)) ([98fe4c8](https://github.com/standardnotes/snjs/commit/98fe4c82e6d8da8d2922d01b984e2bd15d5a34db)) +* missing exports for permission model ([044744b](https://github.com/standardnotes/snjs/commit/044744bbf61ad4f294896cb2fd80e310ef025c01)) +* replace permissions with features in auth token ([#373](https://github.com/standardnotes/snjs/issues/373)) ([739c956](https://github.com/standardnotes/snjs/commit/739c95604bd119a893d0d43dd2b35794cb5cb770)) +* two factor auth feature id ([98720b8](https://github.com/standardnotes/snjs/commit/98720b83e93b383b703d008a66828ad250a2e50c)) +* versioning and package dependencies ([#509](https://github.com/standardnotes/snjs/issues/509)) ([fe1df94](https://github.com/standardnotes/snjs/commit/fe1df94eff3e90bcf9ba0cf45bdc44ac49204c71)) + +### Features + +* add deprecation_message to feature description ([19113db](https://github.com/standardnotes/snjs/commit/19113db0213962b04b9d53f4ddd03377a1ad653f)) +* add feature identifier to features ([05d4951](https://github.com/standardnotes/snjs/commit/05d49511f744d5ba0b130780aeb26760bda8e62b)) +* add features data ([#369](https://github.com/standardnotes/snjs/issues/369)) ([1094bea](https://github.com/standardnotes/snjs/commit/1094beabeed272db6f91332523b8a521de41f170)) +* Add Focus Mode feature ([#487](https://github.com/standardnotes/snjs/issues/487)) ([7f22590](https://github.com/standardnotes/snjs/commit/7f2259003e150db83f0182c9878493ce775360cc)) +* add missing features ([693048b](https://github.com/standardnotes/snjs/commit/693048bccfce57df7b88f8f87c1e3ccbe34fd93a)) +* add role name to features and refactor package structure ([#481](https://github.com/standardnotes/snjs/issues/481)) ([3651629](https://github.com/standardnotes/snjs/commit/365162948127653d2f199f9f8660123edfe24682)) +* editor note and file types ([#456](https://github.com/standardnotes/snjs/issues/456)) ([8b9d264](https://github.com/standardnotes/snjs/commit/8b9d264f465227d5ca846969b1a1885382b583ad)) +* features instead of permissions ([#385](https://github.com/standardnotes/snjs/issues/385)) ([b53e967](https://github.com/standardnotes/snjs/commit/b53e967297bc472ed11aed79af79d0ae5b36d101)) +* map only some features to items ([#404](https://github.com/standardnotes/snjs/issues/404)) ([7f521ef](https://github.com/standardnotes/snjs/commit/7f521efe621d3f2128881aed8a31bf7bd2399a74)) +* Remove "No Distraction" as it's replaced by Focused Writing ([#506](https://github.com/standardnotes/snjs/issues/506)) ([527e676](https://github.com/standardnotes/snjs/commit/527e67673652721ebc947c752815c12007f8d263)) +* remove ContentType from features in favor of common ([#402](https://github.com/standardnotes/snjs/issues/402)) ([ba0ac62](https://github.com/standardnotes/snjs/commit/ba0ac62fd2631541cd0aa615e9163af1b59fd824)) +* upgrade node engine versions to latest active LTS ([#462](https://github.com/standardnotes/snjs/issues/462)) ([686fc15](https://github.com/standardnotes/snjs/commit/686fc15030d302b474ebb7ef1cd4dcc48ec42359)) + +### Reverts + +* Revert "refactor: make features depend on snjs" ([c0dfdc1](https://github.com/standardnotes/snjs/commit/c0dfdc110de5b73967fb9b3a3d93ba4cf872d24f)) diff --git a/packages/features/jest.config.js b/packages/features/jest.config.js new file mode 100644 index 000000000..ad1ceabb0 --- /dev/null +++ b/packages/features/jest.config.js @@ -0,0 +1,11 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const base = require('../../node_modules/@standardnotes/config/src/jest.json'); + +module.exports = { + ...base, + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.json', + }, + } +}; diff --git a/packages/features/linter.tsconfig.json b/packages/features/linter.tsconfig.json new file mode 100644 index 000000000..c1a7d22c5 --- /dev/null +++ b/packages/features/linter.tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["dist"] +} diff --git a/packages/features/package.json b/packages/features/package.json new file mode 100644 index 000000000..be80ccb2e --- /dev/null +++ b/packages/features/package.json @@ -0,0 +1,39 @@ +{ + "name": "@standardnotes/features", + "version": "1.47.1", + "engines": { + "node": ">=16.0.0 <17.0.0" + }, + "description": "Features SDK for Standard Notes projects", + "main": "dist/index.js", + "author": "Standard Notes", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "license": "AGPL-3.0-or-later", + "scripts": { + "clean": "rm -fr dist", + "prestart": "yarn clean", + "start": "tsc -p tsconfig.json --watch", + "prebuild": "yarn clean", + "build": "tsc -p tsconfig.json", + "lint": "eslint . --ext .ts", + "test:unit": "jest" + }, + "dependencies": { + "@standardnotes/auth": "^3.19.4", + "@standardnotes/common": "^1.23.1", + "reflect-metadata": "^0.1.13" + }, + "devDependencies": { + "@types/jest": "^28.1.4", + "@typescript-eslint/eslint-plugin": "^5.30.0", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^28.1.2", + "ts-jest": "^28.0.5" + } +} diff --git a/packages/features/src/Domain/Component/ComponentAction.ts b/packages/features/src/Domain/Component/ComponentAction.ts new file mode 100644 index 000000000..2dde53625 --- /dev/null +++ b/packages/features/src/Domain/Component/ComponentAction.ts @@ -0,0 +1,25 @@ +export enum ComponentAction { + SetSize = 'set-size', + StreamItems = 'stream-items', + StreamContextItem = 'stream-context-item', + SaveItems = 'save-items', + SelectItem = 'select-item', + AssociateItem = 'associate-item', + DeassociateItem = 'deassociate-item', + ClearSelection = 'clear-selection', + CreateItem = 'create-item', + CreateItems = 'create-items', + DeleteItems = 'delete-items', + SetComponentData = 'set-component-data', + ToggleActivateComponent = 'toggle-activate-component', + RequestPermissions = 'request-permissions', + PresentConflictResolution = 'present-conflict-resolution', + DuplicateItem = 'duplicate-item', + ComponentRegistered = 'component-registered', + ActivateThemes = 'themes', + Reply = 'reply', + ThemesActivated = 'themes-activated', + KeyDown = 'key-down', + KeyUp = 'key-up', + Click = 'click', +} diff --git a/packages/features/src/Domain/Component/ComponentArea.ts b/packages/features/src/Domain/Component/ComponentArea.ts new file mode 100644 index 000000000..1f30dab87 --- /dev/null +++ b/packages/features/src/Domain/Component/ComponentArea.ts @@ -0,0 +1,5 @@ +export enum ComponentArea { + Editor = 'editor-editor', + Themes = 'themes', + EditorStack = 'editor-stack', +} diff --git a/packages/features/src/Domain/Component/ComponentFlag.ts b/packages/features/src/Domain/Component/ComponentFlag.ts new file mode 100644 index 000000000..02f9ac476 --- /dev/null +++ b/packages/features/src/Domain/Component/ComponentFlag.ts @@ -0,0 +1,4 @@ +export enum ComponentFlag { + New = 'New', + Deprecated = 'Deprecated', +} diff --git a/packages/features/src/Domain/Component/ComponentPermission.ts b/packages/features/src/Domain/Component/ComponentPermission.ts new file mode 100644 index 000000000..41ca8d7b9 --- /dev/null +++ b/packages/features/src/Domain/Component/ComponentPermission.ts @@ -0,0 +1,7 @@ +import { ContentType } from '@standardnotes/common' +import { ComponentAction } from './ComponentAction' + +export type ComponentPermission = { + name: ComponentAction + content_types?: ContentType[] +} diff --git a/packages/features/src/Domain/Component/NoteType.ts b/packages/features/src/Domain/Component/NoteType.ts new file mode 100644 index 000000000..61b731481 --- /dev/null +++ b/packages/features/src/Domain/Component/NoteType.ts @@ -0,0 +1,8 @@ +export enum NoteType { + Authentication = 'authentication', + Code = 'code', + Markdown = 'markdown', + RichText = 'rich-text', + Spreadsheet = 'spreadsheet', + Task = 'task', +} diff --git a/packages/features/src/Domain/Component/ThemeDockIcon.ts b/packages/features/src/Domain/Component/ThemeDockIcon.ts new file mode 100644 index 000000000..1ea6fae08 --- /dev/null +++ b/packages/features/src/Domain/Component/ThemeDockIcon.ts @@ -0,0 +1,7 @@ +export type ThemeDockIcon = { + type: 'svg' | 'circle' + background_color: string + foreground_color: string + border_color: string + source?: string +} diff --git a/packages/features/src/Domain/Feature/FeatureDescription.ts b/packages/features/src/Domain/Feature/FeatureDescription.ts new file mode 100644 index 000000000..4f5c81b60 --- /dev/null +++ b/packages/features/src/Domain/Feature/FeatureDescription.ts @@ -0,0 +1,78 @@ +import { ComponentPermission } from '../Component/ComponentPermission' +import { ContentType, RoleName, SubscriptionName } from '@standardnotes/common' +import { ComponentArea } from '../Component/ComponentArea' +import { PermissionName } from '../Permission/PermissionName' +import { FeatureIdentifier } from './FeatureIdentifier' +import { ComponentFlag } from '../Component/ComponentFlag' +import { NoteType } from '../Component/NoteType' +import { ThemeDockIcon } from '../Component/ThemeDockIcon' + +type RoleFields = { + /** Server populated */ + role_name?: RoleName + + /** Statically populated. Non-influencing; used as a reference by other static consumers (such as email service) */ + availableInSubscriptions: SubscriptionName[] +} + +export type BaseFeatureDescription = RoleFields & { + deletion_warning?: string + deprecated?: boolean + deprecation_message?: string + description?: string + expires_at?: number + + flags?: ComponentFlag[] + identifier: FeatureIdentifier + marketing_url?: string + name?: string + no_expire?: boolean + no_mobile?: boolean + thumbnail_url?: string + permission_name: PermissionName +} + +export type ServerFeatureDescription = RoleFields & { + name?: string + identifier: FeatureIdentifier + permission_name: PermissionName +} + +export type ClientFeatureDescription = RoleFields & { + identifier: FeatureIdentifier + permission_name: PermissionName + description: string + name: string +} + +export type ComponentFeatureDescription = BaseFeatureDescription & { + /** The relative path of the index.html file or the main css file if theme, within the component folder itself */ + index_path: string + content_type: ContentType + area: ComponentArea +} + +export type ThirdPartyFeatureDescription = ComponentFeatureDescription & { + url: string +} + +export type IframeComponentFeatureDescription = ComponentFeatureDescription & { + component_permissions: ComponentPermission[] +} + +export type EditorFeatureDescription = IframeComponentFeatureDescription & { + file_type: 'txt' | 'html' | 'md' | 'json' + /** Whether an editor is interchangable with another editor that has the same file_type */ + interchangeable: boolean + note_type: NoteType + spellcheckControl?: boolean +} + +export type ThemeFeatureDescription = ComponentFeatureDescription & { + /** Some themes can be layered on top of other themes */ + layerable?: boolean + dock_icon?: ThemeDockIcon +} + +export type FeatureDescription = BaseFeatureDescription & + Partial diff --git a/packages/features/src/Domain/Feature/FeatureIdentifier.ts b/packages/features/src/Domain/Feature/FeatureIdentifier.ts new file mode 100644 index 000000000..937538895 --- /dev/null +++ b/packages/features/src/Domain/Feature/FeatureIdentifier.ts @@ -0,0 +1,53 @@ +export enum FeatureIdentifier { + AccountSwitcher = 'com.standardnotes.account-switcher', + CloudLink = 'org.standardnotes.cloudlink', + DailyDropboxBackup = 'org.standardnotes.daily-dropbox-backup', + DailyEmailBackup = 'org.standardnotes.daily-email-backup', + DailyGDriveBackup = 'org.standardnotes.daily-gdrive-backup', + DailyOneDriveBackup = 'org.standardnotes.daily-onedrive-backup', + Files = 'org.standardnotes.files', + FilesBeta = 'org.standardnotes.files-beta', + FilesLowStorageTier = 'org.standardnotes.files-low-storage-tier', + FilesMaximumStorageTier = 'org.standardnotes.files-max-storage-tier', + ListedCustomDomain = 'org.standardnotes.listed-custom-domain', + NoteHistory30Days = 'org.standardnotes.note-history-30', + NoteHistory365Days = 'org.standardnotes.note-history-365', + NoteHistoryUnlimited = 'org.standardnotes.note-history-unlimited', + SignInAlerts = 'com.standardnotes.sign-in-alerts', + SmartFilters = 'org.standardnotes.smart-filters', + TagNesting = 'org.standardnotes.tag-nesting', + TwoFactorAuth = 'org.standardnotes.two-factor-auth', + + AutobiographyTheme = 'org.standardnotes.theme-autobiography', + DynamicTheme = 'org.standardnotes.theme-dynamic', + FocusedTheme = 'org.standardnotes.theme-focus', + FocusMode = 'org.standardnotes.focus-mode', + FuturaTheme = 'org.standardnotes.theme-futura', + MidnightTheme = 'org.standardnotes.theme-midnight', + SolarizedDarkTheme = 'org.standardnotes.theme-solarized-dark', + TitaniumTheme = 'org.standardnotes.theme-titanium', + + AdvancedChecklist = 'org.standardnotes.advanced-checklist', + CodeEditor = 'org.standardnotes.code-editor', + MarkdownProEditor = 'org.standardnotes.advanced-markdown-editor', + MarkdownVisualEditor = 'org.standardnotes.markdown-visual-editor', + PlainTextEditor = 'org.standardnotes.plain-text-editor', + PlusEditor = 'org.standardnotes.plus-editor', + SheetsEditor = 'org.standardnotes.standard-sheets', + TaskEditor = 'org.standardnotes.simple-task-editor', + TokenVaultEditor = 'org.standardnotes.token-vault', + + DeprecatedBoldEditor = 'org.standardnotes.bold-editor', + DeprecatedMarkdownBasicEditor = 'org.standardnotes.simple-markdown-editor', + DeprecatedMarkdownMathEditor = 'org.standardnotes.fancy-markdown-editor', + DeprecatedMarkdownMinimistEditor = 'org.standardnotes.minimal-markdown-editor', + DeprecatedFoldersComponent = 'org.standardnotes.folders', + DeprecatedFileSafe = 'org.standardnotes.file-safe', +} + +/** + * Identifier for standalone filesafe instance offered as legacy installable via extensions-server + */ +export const LegacyFileSafeIdentifier = 'org.standardnotes.legacy.file-safe' + +export const ExperimentalFeatures = [FeatureIdentifier.AdvancedChecklist] diff --git a/packages/features/src/Domain/Feature/Features.spec.ts b/packages/features/src/Domain/Feature/Features.spec.ts new file mode 100644 index 000000000..c34cb5ca2 --- /dev/null +++ b/packages/features/src/Domain/Feature/Features.spec.ts @@ -0,0 +1,19 @@ +import { SubscriptionName } from '@standardnotes/common' +import { GetFeatures, GetFeaturesForSubscription } from './Features' + +describe('features', () => { + it('all features should have availableInSubscriptions populated', () => { + const features = GetFeatures() + + for (const feature of features) { + expect(feature.availableInSubscriptions.length).toBeGreaterThan(0) + } + }) + it('gets features for plus plan', () => { + const features = GetFeaturesForSubscription(SubscriptionName.PlusPlan) + + for (const feature of features) { + expect(feature.availableInSubscriptions.includes(SubscriptionName.PlusPlan)) + } + }) +}) diff --git a/packages/features/src/Domain/Feature/Features.ts b/packages/features/src/Domain/Feature/Features.ts new file mode 100644 index 000000000..38465be7f --- /dev/null +++ b/packages/features/src/Domain/Feature/Features.ts @@ -0,0 +1,28 @@ +import { FeatureDescription } from './FeatureDescription' +import { FeatureIdentifier } from './FeatureIdentifier' +import { editors } from '../Lists/Editors' +import { themes } from '../Lists/Themes' +import { serverFeatures } from '../Lists/ServerFeatures' +import { clientFeatures } from '../Lists/ClientFeatures' +import { GetDeprecatedFeatures } from '../Lists/DeprecatedFeatures' +import { experimentalFeatures } from '../Lists/ExperimentalFeatures' +import { SubscriptionName } from '@standardnotes/common' + +export function GetFeatures(): FeatureDescription[] { + return [ + ...themes(), + ...editors(), + ...serverFeatures(), + ...clientFeatures(), + ...experimentalFeatures(), + ...GetDeprecatedFeatures(), + ] +} + +export function GetFeaturesForSubscription(subscription: SubscriptionName): FeatureDescription[] { + return GetFeatures().filter((feature) => feature.availableInSubscriptions.includes(subscription)) +} + +export function FindNativeFeature(identifier: FeatureIdentifier): FeatureDescription | undefined { + return GetFeatures().find((f) => f.identifier === identifier) +} diff --git a/packages/features/src/Domain/Lists/ClientFeatures.ts b/packages/features/src/Domain/Lists/ClientFeatures.ts new file mode 100644 index 000000000..c7e34f167 --- /dev/null +++ b/packages/features/src/Domain/Lists/ClientFeatures.ts @@ -0,0 +1,58 @@ +import { ClientFeatureDescription } from '../Feature/FeatureDescription' +import { PermissionName } from '../Permission/PermissionName' +import { FeatureIdentifier } from '../Feature/FeatureIdentifier' +import { SubscriptionName } from '@standardnotes/common' + +export function clientFeatures(): ClientFeatureDescription[] { + return [ + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Tag Nesting', + identifier: FeatureIdentifier.TagNesting, + permission_name: PermissionName.TagNesting, + description: 'Organize your tags into folders.', + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Smart Filters', + identifier: FeatureIdentifier.SmartFilters, + permission_name: PermissionName.SmartFilters, + description: 'Create smart filters for viewing notes matching specific criteria.', + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Encrypted files (coming soon)', + identifier: FeatureIdentifier.Files, + permission_name: PermissionName.Files, + description: '', + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Encrypted files beta', + identifier: FeatureIdentifier.FilesBeta, + permission_name: PermissionName.FilesBeta, + description: '', + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Focus Mode', + identifier: FeatureIdentifier.FocusMode, + permission_name: PermissionName.FocusMode, + description: '', + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Listed Custom Domain', + identifier: FeatureIdentifier.ListedCustomDomain, + permission_name: PermissionName.ListedCustomDomain, + description: '', + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Multiple accounts', + identifier: FeatureIdentifier.AccountSwitcher, + permission_name: PermissionName.AccountSwitcher, + description: '', + }, + ] +} diff --git a/packages/features/src/Domain/Lists/DeprecatedFeatures.spec.ts b/packages/features/src/Domain/Lists/DeprecatedFeatures.spec.ts new file mode 100644 index 000000000..19bc3183d --- /dev/null +++ b/packages/features/src/Domain/Lists/DeprecatedFeatures.spec.ts @@ -0,0 +1,7 @@ +import { GetDeprecatedFeatures } from './DeprecatedFeatures' + +it('all deprecated features should have deprecated flag true', async () => { + for (const feature of GetDeprecatedFeatures()) { + expect(feature.deprecated).toEqual(true) + } +}) diff --git a/packages/features/src/Domain/Lists/DeprecatedFeatures.ts b/packages/features/src/Domain/Lists/DeprecatedFeatures.ts new file mode 100644 index 000000000..4e2d9e4dd --- /dev/null +++ b/packages/features/src/Domain/Lists/DeprecatedFeatures.ts @@ -0,0 +1,110 @@ +import { ContentType, SubscriptionName } from '@standardnotes/common' +import { + EditorFeatureDescription, + IframeComponentFeatureDescription, + FeatureDescription, +} from '../Feature/FeatureDescription' +import { PermissionName } from '../Permission/PermissionName' +import { FeatureIdentifier } from '../Feature/FeatureIdentifier' +import { NoteType } from '../Component/NoteType' +import { FillEditorComponentDefaults } from './Utilities/FillEditorComponentDefaults' +import { ComponentAction } from '../Component/ComponentAction' +import { ComponentArea } from '../Component/ComponentArea' + +export function GetDeprecatedFeatures(): FeatureDescription[] { + const bold: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Alternative Rich Text', + identifier: FeatureIdentifier.DeprecatedBoldEditor, + note_type: NoteType.RichText, + file_type: 'html', + component_permissions: [ + { + name: ComponentAction.StreamContextItem, + content_types: [ContentType.Note], + }, + { + name: ComponentAction.StreamItems, + content_types: [ + ContentType.FilesafeCredentials, + ContentType.FilesafeFileMetadata, + ContentType.FilesafeIntegration, + ], + }, + ], + spellcheckControl: true, + deprecated: true, + permission_name: PermissionName.BoldEditor, + description: 'A simple and peaceful rich editor that helps you write and think clearly.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/bold.jpg', + }) + + const markdownBasic: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Basic Markdown', + identifier: FeatureIdentifier.DeprecatedMarkdownBasicEditor, + note_type: NoteType.Markdown, + spellcheckControl: true, + file_type: 'md', + deprecated: true, + permission_name: PermissionName.MarkdownBasicEditor, + description: 'A Markdown editor with dynamic split-pane preview.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/simple-markdown.jpg', + }) + + const markdownMinimist: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Minimal Markdown', + identifier: FeatureIdentifier.DeprecatedMarkdownMinimistEditor, + note_type: NoteType.Markdown, + file_type: 'md', + index_path: 'index.html', + permission_name: PermissionName.MarkdownMinimistEditor, + spellcheckControl: true, + deprecated: true, + description: 'A minimal Markdown editor with live rendering and in-text search via Ctrl/Cmd + F', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/min-markdown.jpg', + }) + + const markdownMath: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Markdown with Math', + identifier: FeatureIdentifier.DeprecatedMarkdownMathEditor, + spellcheckControl: true, + permission_name: PermissionName.MarkdownMathEditor, + note_type: NoteType.Markdown, + file_type: 'md', + deprecated: true, + index_path: 'index.html', + description: 'A beautiful split-pane Markdown editor with synced-scroll, LaTeX support, and colorful syntax.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/fancy-markdown.jpg', + }) + + const filesafe: IframeComponentFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'FileSafe', + identifier: FeatureIdentifier.DeprecatedFileSafe, + component_permissions: [ + { + name: ComponentAction.StreamContextItem, + content_types: [ContentType.Note], + }, + { + name: ComponentAction.StreamItems, + content_types: [ + ContentType.FilesafeCredentials, + ContentType.FilesafeFileMetadata, + ContentType.FilesafeIntegration, + ], + }, + ], + permission_name: PermissionName.ComponentFilesafe, + area: ComponentArea.EditorStack, + deprecated: true, + description: + 'Encrypted attachments for your notes using your Dropbox, Google Drive, or WebDAV server. Limited to 50MB per file.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/FileSafe-banner.png', + }) + + return [bold, markdownBasic, markdownMinimist, markdownMath, filesafe] +} diff --git a/packages/features/src/Domain/Lists/Editors.ts b/packages/features/src/Domain/Lists/Editors.ts new file mode 100644 index 000000000..f7446c848 --- /dev/null +++ b/packages/features/src/Domain/Lists/Editors.ts @@ -0,0 +1,105 @@ +import { SubscriptionName } from '@standardnotes/common' +import { EditorFeatureDescription } from '../Feature/FeatureDescription' +import { PermissionName } from '../Permission/PermissionName' +import { FeatureIdentifier } from '../Feature/FeatureIdentifier' +import { NoteType } from '../Component/NoteType' +import { FillEditorComponentDefaults } from './Utilities/FillEditorComponentDefaults' + +export function editors(): EditorFeatureDescription[] { + const code: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Code', + spellcheckControl: true, + identifier: FeatureIdentifier.CodeEditor, + permission_name: PermissionName.CodeEditor, + note_type: NoteType.Code, + file_type: 'txt', + interchangeable: true, + index_path: 'index.html', + description: + 'Syntax highlighting and convenient keyboard shortcuts for over 120 programming' + + ' languages. Ideal for code snippets and procedures.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/code.jpg', + }) + + const plus: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Rich Text', + note_type: NoteType.RichText, + file_type: 'html', + identifier: FeatureIdentifier.PlusEditor, + permission_name: PermissionName.PlusEditor, + spellcheckControl: true, + description: + 'From highlighting to custom font sizes and colors, to tables and lists, this editor is perfect for crafting any document.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/plus-editor.jpg', + }) + + const markdown: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Markdown', + identifier: FeatureIdentifier.MarkdownProEditor, + note_type: NoteType.Markdown, + file_type: 'md', + permission_name: PermissionName.MarkdownProEditor, + spellcheckControl: true, + description: + 'A fully featured Markdown editor that supports live preview, a styling toolbar, and split pane support.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/adv-markdown.jpg', + }) + + const markdownAlt: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Markdown Alternative', + identifier: FeatureIdentifier.MarkdownVisualEditor, + note_type: NoteType.Markdown, + file_type: 'md', + permission_name: PermissionName.MarkdownVisualEditor, + spellcheckControl: true, + description: + 'A WYSIWYG-style Markdown editor that renders Markdown in preview-mode while you type without displaying any syntax.', + index_path: 'build/index.html', + }) + + const task: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Checklist', + identifier: FeatureIdentifier.TaskEditor, + note_type: NoteType.Task, + spellcheckControl: true, + file_type: 'md', + interchangeable: false, + permission_name: PermissionName.TaskEditor, + description: + 'A great way to manage short-term and long-term to-do"s. You can mark tasks as completed, change their order, and edit the text naturally in place.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/task-editor.jpg', + }) + + const tokenvault: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Authenticator', + note_type: NoteType.Authentication, + file_type: 'json', + interchangeable: false, + identifier: FeatureIdentifier.TokenVaultEditor, + permission_name: PermissionName.TokenVaultEditor, + description: + 'Encrypt and protect your 2FA secrets for all your internet accounts. Authenticator handles your 2FA secrets so that you never lose them again, or have to start over when you get a new device.', + thumbnail_url: 'https://standard-notes.s3.amazonaws.com/screenshots/models/editors/token-vault.png', + }) + + const spreadsheets: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Spreadsheet', + identifier: FeatureIdentifier.SheetsEditor, + note_type: NoteType.Spreadsheet, + file_type: 'json', + interchangeable: false, + permission_name: PermissionName.SheetsEditor, + description: + 'A powerful spreadsheet editor with formatting and formula support. Not recommended for large data sets, as encryption of such data may decrease editor performance.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/editors/spreadsheets.png', + }) + + return [code, plus, markdown, markdownAlt, task, tokenvault, spreadsheets] +} diff --git a/packages/features/src/Domain/Lists/ExperimentalFeatures.ts b/packages/features/src/Domain/Lists/ExperimentalFeatures.ts new file mode 100644 index 000000000..89e25af16 --- /dev/null +++ b/packages/features/src/Domain/Lists/ExperimentalFeatures.ts @@ -0,0 +1,23 @@ +import { SubscriptionName } from '@standardnotes/common' +import { NoteType } from '../Component/NoteType' +import { PermissionName } from '../Permission/PermissionName' +import { EditorFeatureDescription, FeatureDescription } from '../Feature/FeatureDescription' +import { FeatureIdentifier } from '../Feature/FeatureIdentifier' +import { FillEditorComponentDefaults } from './Utilities/FillEditorComponentDefaults' + +export function experimentalFeatures(): FeatureDescription[] { + const advancedChecklist: EditorFeatureDescription = FillEditorComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Advanced Checklist [Alpha]', + identifier: FeatureIdentifier.AdvancedChecklist, + note_type: NoteType.Task, + spellcheckControl: true, + file_type: 'json', + interchangeable: false, + permission_name: PermissionName.AdvancedChecklist, + description: 'A task editor with grouping functionality.', + index_path: 'build/index.html', + }) + + return [advancedChecklist] +} diff --git a/packages/features/src/Domain/Lists/ServerFeatures.ts b/packages/features/src/Domain/Lists/ServerFeatures.ts new file mode 100644 index 000000000..c05074a5b --- /dev/null +++ b/packages/features/src/Domain/Lists/ServerFeatures.ts @@ -0,0 +1,64 @@ +import { ServerFeatureDescription } from '../Feature/FeatureDescription' +import { PermissionName } from '../Permission/PermissionName' +import { FeatureIdentifier } from '../Feature/FeatureIdentifier' +import { SubscriptionName } from '@standardnotes/common' + +export function serverFeatures(): ServerFeatureDescription[] { + return [ + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Two factor authentication', + identifier: FeatureIdentifier.TwoFactorAuth, + permission_name: PermissionName.TwoFactorAuth, + }, + { + availableInSubscriptions: [SubscriptionName.ProPlan], + name: 'Unlimited note history', + identifier: FeatureIdentifier.NoteHistoryUnlimited, + permission_name: PermissionName.NoteHistoryUnlimited, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan], + name: '365 days note history', + identifier: FeatureIdentifier.NoteHistory365Days, + permission_name: PermissionName.NoteHistory365Days, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Email backups', + identifier: FeatureIdentifier.DailyEmailBackup, + permission_name: PermissionName.DailyEmailBackup, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Sign-in email alerts', + identifier: FeatureIdentifier.SignInAlerts, + permission_name: PermissionName.SignInAlerts, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + identifier: FeatureIdentifier.DailyDropboxBackup, + permission_name: PermissionName.DailyDropboxBackup, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + identifier: FeatureIdentifier.DailyGDriveBackup, + permission_name: PermissionName.DailyGDriveBackup, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + identifier: FeatureIdentifier.DailyOneDriveBackup, + permission_name: PermissionName.DailyOneDriveBackup, + }, + { + availableInSubscriptions: [SubscriptionName.ProPlan], + identifier: FeatureIdentifier.FilesMaximumStorageTier, + permission_name: PermissionName.FilesMaximumStorageTier, + }, + { + availableInSubscriptions: [SubscriptionName.PlusPlan], + identifier: FeatureIdentifier.FilesLowStorageTier, + permission_name: PermissionName.FilesLowStorageTier, + }, + ] +} diff --git a/packages/features/src/Domain/Lists/Themes.ts b/packages/features/src/Domain/Lists/Themes.ts new file mode 100644 index 000000000..e6d835b21 --- /dev/null +++ b/packages/features/src/Domain/Lists/Themes.ts @@ -0,0 +1,109 @@ +import { ThemeFeatureDescription } from '../Feature/FeatureDescription' +import { PermissionName } from '../Permission/PermissionName' +import { FeatureIdentifier } from '../Feature/FeatureIdentifier' +import { FillThemeComponentDefaults } from './Utilities/FillThemeComponentDefaults' +import { SubscriptionName } from '@standardnotes/common' + +export function themes(): ThemeFeatureDescription[] { + const midnight: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Midnight', + identifier: FeatureIdentifier.MidnightTheme, + permission_name: PermissionName.MidnightTheme, + description: 'Elegant utilitarianism.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/themes/midnight-with-mobile.jpg', + dock_icon: { + type: 'circle', + background_color: '#086DD6', + foreground_color: '#ffffff', + border_color: '#086DD6', + }, + }) + + const futura: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Futura', + identifier: FeatureIdentifier.FuturaTheme, + permission_name: PermissionName.FuturaTheme, + description: 'Calm and relaxed. Take some time off.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/themes/futura-with-mobile.jpg', + dock_icon: { + type: 'circle', + background_color: '#fca429', + foreground_color: '#ffffff', + border_color: '#fca429', + }, + }) + + const solarizedDark: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Solarized Dark', + identifier: FeatureIdentifier.SolarizedDarkTheme, + permission_name: PermissionName.SolarizedDarkTheme, + description: 'The perfect theme for any time.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/themes/solarized-dark.jpg', + dock_icon: { + type: 'circle', + background_color: '#2AA198', + foreground_color: '#ffffff', + border_color: '#2AA198', + }, + }) + + const autobiography: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Autobiography', + identifier: FeatureIdentifier.AutobiographyTheme, + permission_name: PermissionName.AutobiographyTheme, + description: 'A theme for writers and readers.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/themes/autobiography.jpg', + dock_icon: { + type: 'circle', + background_color: '#9D7441', + foreground_color: '#ECE4DB', + border_color: '#9D7441', + }, + }) + + const focus: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Focus', + identifier: FeatureIdentifier.FocusedTheme, + permission_name: PermissionName.FocusedTheme, + description: 'For when you need to go in.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/themes/focus-with-mobile.jpg', + dock_icon: { + type: 'circle', + background_color: '#a464c2', + foreground_color: '#ffffff', + border_color: '#a464c2', + }, + }) + + const titanium: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Titanium', + identifier: FeatureIdentifier.TitaniumTheme, + permission_name: PermissionName.TitaniumTheme, + description: 'Light on the eyes, heavy on the spirit.', + thumbnail_url: 'https://s3.amazonaws.com/standard-notes/screenshots/models/themes/titanium-with-mobile.jpg', + dock_icon: { + type: 'circle', + background_color: '#6e2b9e', + foreground_color: '#ffffff', + border_color: '#6e2b9e', + }, + }) + + const dynamic: ThemeFeatureDescription = FillThemeComponentDefaults({ + availableInSubscriptions: [SubscriptionName.PlusPlan, SubscriptionName.ProPlan], + name: 'Dynamic Panels', + identifier: FeatureIdentifier.DynamicTheme, + permission_name: PermissionName.ThemeDynamic, + layerable: true, + no_mobile: true, + description: 'A smart theme that minimizes the tags and notes panels when they are not in use.', + }) + + return [midnight, futura, solarizedDark, autobiography, focus, titanium, dynamic] +} diff --git a/packages/features/src/Domain/Lists/Utilities/FillEditorComponentDefaults.ts b/packages/features/src/Domain/Lists/Utilities/FillEditorComponentDefaults.ts new file mode 100644 index 000000000..9833c142c --- /dev/null +++ b/packages/features/src/Domain/Lists/Utilities/FillEditorComponentDefaults.ts @@ -0,0 +1,34 @@ +import { ComponentAction } from '../../Component/ComponentAction' +import { ContentType } from '@standardnotes/common' +import { EditorFeatureDescription } from '../../Feature/FeatureDescription' +import { ComponentArea } from '../../Component/ComponentArea' + +export type RequiredEditorFields = Pick + +export function FillEditorComponentDefaults( + component: Partial & RequiredEditorFields, +): EditorFeatureDescription { + if (!component.index_path) { + component.index_path = 'dist/index.html' + } + + if (!component.component_permissions) { + component.component_permissions = [ + { + name: ComponentAction.StreamContextItem, + content_types: [ContentType.Note], + }, + ] + } + + component.content_type = ContentType.Component + if (!component.area) { + component.area = ComponentArea.Editor + } + + if (component.interchangeable == undefined) { + component.interchangeable = true + } + + return component as EditorFeatureDescription +} diff --git a/packages/features/src/Domain/Lists/Utilities/FillThemeComponentDefaults.ts b/packages/features/src/Domain/Lists/Utilities/FillThemeComponentDefaults.ts new file mode 100644 index 000000000..d6e1a7d87 --- /dev/null +++ b/packages/features/src/Domain/Lists/Utilities/FillThemeComponentDefaults.ts @@ -0,0 +1,21 @@ +import { ContentType } from '@standardnotes/common' +import { ThemeFeatureDescription } from '../../Feature/FeatureDescription' +import { ComponentArea } from '../../Component/ComponentArea' + +type RequiredThemeFields = Pick + +export function FillThemeComponentDefaults( + theme: Partial & RequiredThemeFields, +): ThemeFeatureDescription { + if (!theme.index_path) { + theme.index_path = 'dist/dist.css' + } + + theme.content_type = ContentType.Theme + + if (!theme.area) { + theme.area = ComponentArea.Themes + } + + return theme as ThemeFeatureDescription +} diff --git a/packages/features/src/Domain/Permission/Permission.ts b/packages/features/src/Domain/Permission/Permission.ts new file mode 100644 index 000000000..47b43d7ad --- /dev/null +++ b/packages/features/src/Domain/Permission/Permission.ts @@ -0,0 +1,8 @@ +import { Uuid } from '@standardnotes/common' + +import { PermissionName } from './PermissionName' + +export type Permission = { + uuid: Uuid + name: PermissionName +} diff --git a/packages/features/src/Domain/Permission/PermissionName.ts b/packages/features/src/Domain/Permission/PermissionName.ts new file mode 100644 index 000000000..d98336cdb --- /dev/null +++ b/packages/features/src/Domain/Permission/PermissionName.ts @@ -0,0 +1,42 @@ +export enum PermissionName { + AccountSwitcher = 'app:account-switcher', + AdvancedChecklist = 'editor:advanced-checklist', + AutobiographyTheme = 'theme:autobiography', + BoldEditor = 'editor:bold', + CloudLink = 'component:cloud-link', + CodeEditor = 'editor:code-editor', + ComponentFilesafe = 'component:filesafe', + ComponentFolders = 'component:folders', + DailyDropboxBackup = 'server:daily-dropbox-backup', + DailyEmailBackup = 'server:daily-email-backup', + DailyGDriveBackup = 'server:daily-gdrive-backup', + DailyOneDriveBackup = 'server:daily-onedrive-backup', + FilesBeta = 'app:files-beta', + Files = 'app:files', + FilesMaximumStorageTier = 'server:files-max-storage-tier', + FilesLowStorageTier = 'server:files-low-storage-tier', + FocusedTheme = 'theme:focused', + FocusMode = 'app:focus-mode', + FuturaTheme = 'theme:futura', + ListedCustomDomain = 'listed:custom-domain', + MarkdownBasicEditor = 'editor:markdown-basic', + MarkdownMathEditor = 'editor:markdown-math', + MarkdownMinimistEditor = 'editor:markdown-minimist', + MarkdownProEditor = 'editor:markdown-pro', + MarkdownVisualEditor = 'editor:markdown-visual', + MidnightTheme = 'theme:midnight', + NoteHistory30Days = 'server:note-history-30-days', + NoteHistory365Days = 'server:note-history-365-days', + NoteHistoryUnlimited = 'server:note-history-unlimited', + PlusEditor = 'editor:plus', + SheetsEditor = 'editor:sheets', + SignInAlerts = 'server:sign-in-alerts', + SmartFilters = 'app:smart-filters', + SolarizedDarkTheme = 'theme:solarized-dark', + TagNesting = 'app:tag-nesting', + TaskEditor = 'editor:task-editor', + ThemeDynamic = 'theme:dynamic', + TitaniumTheme = 'theme:titanium', + TokenVaultEditor = 'editor:token-vault', + TwoFactorAuth = 'server:two-factor-auth', +} diff --git a/packages/features/src/Domain/index.ts b/packages/features/src/Domain/index.ts new file mode 100644 index 000000000..e132badb7 --- /dev/null +++ b/packages/features/src/Domain/index.ts @@ -0,0 +1,13 @@ +export * from './Feature/FeatureDescription' +export * from './Feature/FeatureIdentifier' +export * from './Feature/Features' + +export * from './Permission/Permission' +export * from './Permission/PermissionName' + +export * from './Component/ComponentAction' +export * from './Component/ComponentArea' +export * from './Component/ComponentFlag' +export * from './Component/ComponentPermission' +export * from './Component/NoteType' +export * from './Component/ThemeDockIcon' diff --git a/packages/features/src/index.ts b/packages/features/src/index.ts new file mode 100644 index 000000000..920deacdb --- /dev/null +++ b/packages/features/src/index.ts @@ -0,0 +1 @@ +export * from './Domain' diff --git a/packages/features/tsconfig.json b/packages/features/tsconfig.json new file mode 100644 index 000000000..f3dac14ef --- /dev/null +++ b/packages/features/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../node_modules/@standardnotes/config/src/tsconfig.json", + "compilerOptions": { + "skipLibCheck": true, + "rootDir": "./src", + "outDir": "./dist", + }, + "include": [ + "src/**/*" + ], + "references": [], + "exclude": ["**/*.spec.ts", "dist", "node_modules"] +} diff --git a/yarn.lock b/yarn.lock index c726805d6..efdef5522 100644 --- a/yarn.lock +++ b/yarn.lock @@ -287,7 +287,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.1.0, @babel/core@npm:^7.1.6, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.16, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.10, @babel/core@npm:^7.13.13, @babel/core@npm:^7.13.14, @babel/core@npm:^7.13.8, @babel/core@npm:^7.14.0, @babel/core@npm:^7.14.6, @babel/core@npm:^7.15.5, @babel/core@npm:^7.16.0, @babel/core@npm:^7.17.10, @babel/core@npm:^7.17.9, @babel/core@npm:^7.18.2, @babel/core@npm:^7.18.5, @babel/core@npm:^7.7.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.7, @babel/core@npm:^7.8.0": +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.1.6, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.16, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.10, @babel/core@npm:^7.13.13, @babel/core@npm:^7.13.14, @babel/core@npm:^7.13.8, @babel/core@npm:^7.14.0, @babel/core@npm:^7.14.6, @babel/core@npm:^7.15.5, @babel/core@npm:^7.16.0, @babel/core@npm:^7.17.10, @babel/core@npm:^7.17.9, @babel/core@npm:^7.18.2, @babel/core@npm:^7.18.5, @babel/core@npm:^7.7.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.7, @babel/core@npm:^7.8.0": version: 7.18.6 resolution: "@babel/core@npm:7.18.6" dependencies: @@ -3653,6 +3653,48 @@ __metadata: languageName: node linkType: hard +"@jest/core@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/core@npm:28.1.2" + dependencies: + "@jest/console": ^28.1.1 + "@jest/reporters": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^28.0.2 + jest-config: ^28.1.2 + jest-haste-map: ^28.1.1 + jest-message-util: ^28.1.1 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.1 + jest-resolve-dependencies: ^28.1.2 + jest-runner: ^28.1.2 + jest-runtime: ^28.1.2 + jest-snapshot: ^28.1.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + jest-watcher: ^28.1.1 + micromatch: ^4.0.4 + pretty-format: ^28.1.1 + rimraf: ^3.0.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: dd67cc911cf770550b3bdde39ec78d2cc3814d66008e3b0184c6a2b66380bb425fed07e81d6488eaf459257f38207822f04fcf7f05626a366b8b36542dce7137 + languageName: node + linkType: hard + "@jest/create-cache-key-function@npm:^27.0.1": version: 27.5.1 resolution: "@jest/create-cache-key-function@npm:27.5.1" @@ -3674,6 +3716,37 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/environment@npm:28.1.2" + dependencies: + "@jest/fake-timers": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + jest-mock: ^28.1.1 + checksum: 5bffc464e9d2fdf7561305bc02844faebfed2ffed54c015561a8d39a3ea129d375aa408b724546fef6246881100770ff43637c2da667db80f0b26235b6a40c98 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/expect-utils@npm:28.1.1" + dependencies: + jest-get-type: ^28.0.2 + checksum: 46a2ad754b10bc649c36a5914f887bea33a43bb868946508892a73f1da99065b17167dc3c0e3e299c7cea82c6be1e9d816986e120d7ae3e1be511f64cfc1d3d3 + languageName: node + linkType: hard + +"@jest/expect@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/expect@npm:28.1.2" + dependencies: + expect: ^28.1.1 + jest-snapshot: ^28.1.2 + checksum: ee470cdd3a6a64a251ba66629cf95c508cc8b2b9ce1928459baacffa0bf297f5ad715c2352e73f24e7d3880e3699b03923e037919b712901e6db259293ad73a6 + languageName: node + linkType: hard + "@jest/fake-timers@npm:^27.5.1": version: 27.5.1 resolution: "@jest/fake-timers@npm:27.5.1" @@ -3688,6 +3761,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/fake-timers@npm:28.1.2" + dependencies: + "@jest/types": ^28.1.1 + "@sinonjs/fake-timers": ^9.1.2 + "@types/node": "*" + jest-message-util: ^28.1.1 + jest-mock: ^28.1.1 + jest-util: ^28.1.1 + checksum: d6e6b1a12fe84335d9cc6087b4e590c3b9b855edaff11742d2167827f415459704ab1eae9b3543603898b6a0789b2cc7863f12469f8479257315effb844fe6bd + languageName: node + linkType: hard + "@jest/globals@npm:^27.5.1": version: 27.5.1 resolution: "@jest/globals@npm:27.5.1" @@ -3699,6 +3786,17 @@ __metadata: languageName: node linkType: hard +"@jest/globals@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/globals@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/expect": ^28.1.2 + "@jest/types": ^28.1.1 + checksum: f07b7d0a2d08bd4b1e5f0862d835b522578495301ad50109d08c13d367b18a712c2406b62fe0c0a6513998d2caeb3eb650da47d14b22fde7850983537e309045 + languageName: node + linkType: hard + "@jest/reporters@npm:^27.5.1": version: 27.5.1 resolution: "@jest/reporters@npm:27.5.1" @@ -3737,6 +3835,44 @@ __metadata: languageName: node linkType: hard +"@jest/reporters@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/reporters@npm:28.1.2" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^28.1.1 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@jridgewell/trace-mapping": ^0.3.13 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + jest-worker: ^28.1.1 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + terminal-link: ^2.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 26aa66e8eae2599f9bf6c5f594fce7d3a42f821678a10aa7014022cd4dd13d1aea7feba31abd1f01599ae416c7ab828232a74a97d8c352b8b58c699888955bdd + languageName: node + linkType: hard + "@jest/schemas@npm:^28.0.2": version: 28.0.2 resolution: "@jest/schemas@npm:28.0.2" @@ -3757,6 +3893,17 @@ __metadata: languageName: node linkType: hard +"@jest/source-map@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/source-map@npm:28.1.2" + dependencies: + "@jridgewell/trace-mapping": ^0.3.13 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a + languageName: node + linkType: hard + "@jest/test-result@npm:^27.5.1": version: 27.5.1 resolution: "@jest/test-result@npm:27.5.1" @@ -3793,6 +3940,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-sequencer@npm:^28.1.1": + version: 28.1.1 + resolution: "@jest/test-sequencer@npm:28.1.1" + dependencies: + "@jest/test-result": ^28.1.1 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + slash: ^3.0.0 + checksum: acfa3b7ff18478aaa9ac54d6013f951e1be2133a09ea5ca6b248eb80340e5cac71420f1357ef87d2780cb2adb2411fbacbbffcb6ac7f93a0b24cc76be5a42afa + languageName: node + linkType: hard + "@jest/transform@npm:^27.5.1": version: 27.5.1 resolution: "@jest/transform@npm:27.5.1" @@ -3816,6 +3975,29 @@ __metadata: languageName: node linkType: hard +"@jest/transform@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/transform@npm:28.1.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^28.1.1 + "@jridgewell/trace-mapping": ^0.3.13 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^1.4.0 + fast-json-stable-stringify: ^2.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.1 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.1 + checksum: cd8d1bdf1a5831cdf91934dd0af1d29d4d2bcad92feb9bf7555fc0e1152cb01a9206410380af0f6221a623ffc9b6f6e6dded429d01d87b85b0777cf9d4425127 + languageName: node + linkType: hard + "@jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -3918,7 +4100,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.8, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.8, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.14 resolution: "@jridgewell/trace-mapping@npm:0.3.14" dependencies: @@ -5924,6 +6106,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^9.1.2": + version: 9.1.2 + resolution: "@sinonjs/fake-timers@npm:9.1.2" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6 + languageName: node + linkType: hard + "@slorber/static-site-generator-webpack-plugin@npm:^4.0.4": version: 4.0.7 resolution: "@slorber/static-site-generator-webpack-plugin@npm:4.0.7" @@ -6176,7 +6367,7 @@ __metadata: dependencies: "@standardnotes/deterministic-zip": ^1.2.0 "@standardnotes/eslint-config-extensions": ^1.0.4 - "@standardnotes/features": ^1.45.1 + "@standardnotes/features": "workspace:*" "@standardnotes/styles": "workspace:*" copy-webpack-plugin: ^11.0.0 mini-css-extract-plugin: ^2.6.0 @@ -6390,25 +6581,20 @@ __metadata: languageName: node linkType: hard -"@standardnotes/features@npm:^1.45.1, @standardnotes/features@npm:^1.46.0": - version: 1.46.0 - resolution: "@standardnotes/features@npm:1.46.0" +"@standardnotes/features@^1.46.0, @standardnotes/features@^1.47.0, @standardnotes/features@workspace:*, @standardnotes/features@workspace:packages/features": + version: 0.0.0-use.local + resolution: "@standardnotes/features@workspace:packages/features" dependencies: "@standardnotes/auth": ^3.19.4 "@standardnotes/common": ^1.23.1 - checksum: 0653b9b425e86cf0f2e6a80fb68316c841aaf7feb23ca39131e3d09546735d199879532ef9e89f424000b916dd5ac2d7e6ea0e60ac755712ef37c3fecdf48d94 - languageName: node - linkType: hard - -"@standardnotes/features@npm:^1.47.0": - version: 1.47.0 - resolution: "@standardnotes/features@npm:1.47.0" - dependencies: - "@standardnotes/auth": ^3.19.4 - "@standardnotes/common": ^1.23.1 - checksum: bd0ddd6017867e7c905dfdbac4875889713b3f10e79a2e702cc76c3f5db4c9a5ac1a2418e54358aaee4f4404e4d62b208faa755c61bc2eb3e5a2a17777dfbdd0 - languageName: node - linkType: hard + "@types/jest": ^28.1.4 + "@typescript-eslint/eslint-plugin": ^5.30.0 + eslint-plugin-prettier: ^4.2.1 + jest: ^28.1.2 + reflect-metadata: ^0.1.13 + ts-jest: ^28.0.5 + languageName: unknown + linkType: soft "@standardnotes/filepicker@npm:1.16.23, @standardnotes/filepicker@npm:^1.16.23": version: 1.16.23 @@ -7976,7 +8162,7 @@ __metadata: languageName: node linkType: hard -"@types/graceful-fs@npm:^4.1.2": +"@types/graceful-fs@npm:^4.1.2, @types/graceful-fs@npm:^4.1.3": version: 4.1.5 resolution: "@types/graceful-fs@npm:4.1.5" dependencies: @@ -8096,6 +8282,16 @@ __metadata: languageName: node linkType: hard +"@types/jest@npm:^28.1.4": + version: 28.1.4 + resolution: "@types/jest@npm:28.1.4" + dependencies: + jest-matcher-utils: ^28.0.0 + pretty-format: ^28.0.0 + checksum: 97e22c600397bb4f30e39b595f8285ae92e4eb29a1ef6d1689749e4a4da683d88ecfe717b64492f6adc4c17c1c989520c3546f938c84a7d435c6ac3acf1a2bdc + languageName: node + linkType: hard + "@types/js-base64@npm:^3.3.1": version: 3.3.1 resolution: "@types/js-base64@npm:3.3.1" @@ -10905,6 +11101,23 @@ __metadata: languageName: node linkType: hard +"babel-jest@npm:^28.1.2": + version: 28.1.2 + resolution: "babel-jest@npm:28.1.2" + dependencies: + "@jest/transform": ^28.1.2 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^28.1.1 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 1aa605ef4dfae3a557fbed8b9d1ba1c2678ba910d0ff3931fad8dc2a150a8ef220a456a86f3b441f5cd4f97f973c2f721fc74ea6a26432766c5ab501a967f8c8 + languageName: node + linkType: hard + "babel-loader@npm:^8.0.6, babel-loader@npm:^8.1.0, babel-loader@npm:^8.2.2, babel-loader@npm:^8.2.3, babel-loader@npm:^8.2.5": version: 8.2.5 resolution: "babel-loader@npm:8.2.5" @@ -10993,6 +11206,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-jest-hoist@npm:^28.1.1": + version: 28.1.1 + resolution: "babel-plugin-jest-hoist@npm:28.1.1" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 5fb9ad012e4613e7d321b61a875371dd10e171ef3df2e9c87be25fda62c3c7ad759821e40a9da18f611054727309c38f10e3502583f697312cb9cd1e92616756 + languageName: node + linkType: hard + "babel-plugin-macros@npm:^2.6.1": version: 2.8.0 resolution: "babel-plugin-macros@npm:2.8.0" @@ -11187,6 +11412,18 @@ __metadata: languageName: node linkType: hard +"babel-preset-jest@npm:^28.1.1": + version: 28.1.1 + resolution: "babel-preset-jest@npm:28.1.1" + dependencies: + babel-plugin-jest-hoist: ^28.1.1 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: c581a81967aa30eba71a5a5a28eca2cc082901f3e6823c17e5b4ef7ba10f1347494a8e77d785b09ba7e86d3f902f2e13f5b75854d2af7bf9b489924629a87bad + languageName: node + linkType: hard + "babel-preset-react-app@npm:^10.0.1": version: 10.0.1 resolution: "babel-preset-react-app@npm:10.0.1" @@ -17831,6 +18068,19 @@ __metadata: languageName: node linkType: hard +"expect@npm:^28.1.1": + version: 28.1.1 + resolution: "expect@npm:28.1.1" + dependencies: + "@jest/expect-utils": ^28.1.1 + jest-get-type: ^28.0.2 + jest-matcher-utils: ^28.1.1 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + checksum: 6e557b681f4cfb0bf61efad50c5787cc6eb4596a3c299be69adc83fcad0265b5f329b997c2bb7ec92290e609681485616e51e16301a7f0ba3c57139b337c9351 + languageName: node + linkType: hard + "express@npm:^4.17.1, express@npm:^4.17.3": version: 4.18.1 resolution: "express@npm:4.18.1" @@ -22225,6 +22475,16 @@ __metadata: languageName: node linkType: hard +"jest-changed-files@npm:^28.0.2": + version: 28.0.2 + resolution: "jest-changed-files@npm:28.0.2" + dependencies: + execa: ^5.0.0 + throat: ^6.0.1 + checksum: 389d4de4b26de3d2c6e23783ef4e23f827a9a79cfebd2db7c6ff74727198814469ee1e1a89f0e6d28a94e3c632ec45b044c2400a0793b8591e18d07b4b421784 + languageName: node + linkType: hard + "jest-circus@npm:^27.5.1": version: 27.5.1 resolution: "jest-circus@npm:27.5.1" @@ -22252,6 +22512,33 @@ __metadata: languageName: node linkType: hard +"jest-circus@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-circus@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/expect": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.0 + jest-each: ^28.1.1 + jest-matcher-utils: ^28.1.1 + jest-message-util: ^28.1.1 + jest-runtime: ^28.1.2 + jest-snapshot: ^28.1.2 + jest-util: ^28.1.1 + pretty-format: ^28.1.1 + slash: ^3.0.0 + stack-utils: ^2.0.3 + throat: ^6.0.1 + checksum: c8f2e024e438f4ca9a6fb8c4f2dfbf843761fad63e82f603a8b167ead5ea3d2d1b99b695242a12017a32c17f8cb2a338e2eb8cdf37d5d71478fcf1650fd9c391 + languageName: node + linkType: hard + "jest-cli@npm:^27.5.1": version: 27.5.1 resolution: "jest-cli@npm:27.5.1" @@ -22279,6 +22566,33 @@ __metadata: languageName: node linkType: hard +"jest-cli@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-cli@npm:28.1.2" + dependencies: + "@jest/core": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/types": ^28.1.1 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^28.1.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 527873c25755f5a8fc630d61bf856d6f933aace9ff9b35fcc47ac954e5f957ae621ec499bf571b8da51d7fd3760b220f9bf02ccf1710c9821430173e34073c41 + languageName: node + linkType: hard + "jest-config@npm:^27.5.1": version: 27.5.1 resolution: "jest-config@npm:27.5.1" @@ -22316,6 +22630,44 @@ __metadata: languageName: node linkType: hard +"jest-config@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-config@npm:28.1.2" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^28.1.1 + "@jest/types": ^28.1.1 + babel-jest: ^28.1.2 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^28.1.2 + jest-environment-node: ^28.1.2 + jest-get-type: ^28.0.2 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.1 + jest-runner: ^28.1.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^28.1.1 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: ddc4de7a286d087a0f88813171498a85d64eb6b22aa8915ab6860661e0b445d1d5773d61b928ff9c3f5c47b20576838dc4565d20f4d77c94ba886421d61544d4 + languageName: node + linkType: hard + "jest-diff@npm:^27.5.1": version: 27.5.1 resolution: "jest-diff@npm:27.5.1" @@ -22349,6 +22701,15 @@ __metadata: languageName: node linkType: hard +"jest-docblock@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-docblock@npm:28.1.1" + dependencies: + detect-newline: ^3.0.0 + checksum: 22fca68d988ecb2933bc65f448facdca85fc71b4bd0a188ea09a5ae1b0cc3a049a2a6ec7e7eaa2542c1d5cb5e5145e420a3df4fa280f5070f486c44da1d36151 + languageName: node + linkType: hard + "jest-each@npm:^27.5.1": version: 27.5.1 resolution: "jest-each@npm:27.5.1" @@ -22362,6 +22723,19 @@ __metadata: languageName: node linkType: hard +"jest-each@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-each@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + jest-util: ^28.1.1 + pretty-format: ^28.1.1 + checksum: 91965603f898d5e29150995333f5b193aa37f36b232fc9ffd1be546236e7e47f5df4eca1f25ee45eb549e0866f4769d6a8045591703454b505d18e9fe2b18572 + languageName: node + linkType: hard + "jest-environment-jsdom@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-jsdom@npm:27.5.1" @@ -22391,6 +22765,20 @@ __metadata: languageName: node linkType: hard +"jest-environment-node@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-environment-node@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/fake-timers": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + jest-mock: ^28.1.1 + jest-util: ^28.1.1 + checksum: cee61a3e25cc032ce6a3320ce8829dae9295fa84ea2f220fddd496ba876807cdc88397dc5a6362e60e44b7e14a91d7b448ffb2031bda7955276f69c9e1bd93fc + languageName: node + linkType: hard + "jest-get-type@npm:^26.3.0": version: 26.3.0 resolution: "jest-get-type@npm:26.3.0" @@ -22461,6 +22849,29 @@ __metadata: languageName: node linkType: hard +"jest-haste-map@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-haste-map@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.1 + jest-worker: ^28.1.1 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: db31a2a83906277d96b79017742c433c1573b322d061632a011fb1e184cf6f151f94134da09da7366e4477e8716f280efa676b4cc04a8544c13ce466a44102e8 + languageName: node + linkType: hard + "jest-jasmine2@npm:^27.5.1": version: 27.5.1 resolution: "jest-jasmine2@npm:27.5.1" @@ -22496,6 +22907,16 @@ __metadata: languageName: node linkType: hard +"jest-leak-detector@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-leak-detector@npm:28.1.1" + dependencies: + jest-get-type: ^28.0.2 + pretty-format: ^28.1.1 + checksum: 379a15ad7bed4f6d11414cc0131a5a592ac9c0b12a5933c522b292209a325b12a852e2330144fb59c82420a89712e46f2c244a881722473e241ad1c487fc476d + languageName: node + linkType: hard + "jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.5.1": version: 27.5.1 resolution: "jest-matcher-utils@npm:27.5.1" @@ -22508,7 +22929,7 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^28.0.0": +"jest-matcher-utils@npm:^28.0.0, jest-matcher-utils@npm:^28.1.1": version: 28.1.1 resolution: "jest-matcher-utils@npm:28.1.1" dependencies: @@ -22564,6 +22985,16 @@ __metadata: languageName: node linkType: hard +"jest-mock@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-mock@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/node": "*" + checksum: 285716d062bd9403830d9f5c90dc414a17495a4e31b82e7789806dac5ea924364fe308a1a8a3151f1055b87cf811e09fab2e2699e53be9972a2657883dd48614 + languageName: node + linkType: hard + "jest-pnp-resolver@npm:^1.2.2": version: 1.2.2 resolution: "jest-pnp-resolver@npm:1.2.2" @@ -22590,7 +23021,7 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^28.0.0": +"jest-regex-util@npm:^28.0.0, jest-regex-util@npm:^28.0.2": version: 28.0.2 resolution: "jest-regex-util@npm:28.0.2" checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add @@ -22608,6 +23039,16 @@ __metadata: languageName: node linkType: hard +"jest-resolve-dependencies@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-resolve-dependencies@npm:28.1.2" + dependencies: + jest-regex-util: ^28.0.2 + jest-snapshot: ^28.1.2 + checksum: 2f822678b5469019abab398d0e72eb804a68a9f9ab01b707dd16ebf6f294fe5d4345121e83ad63811c30fe77b7f9bb59003fb03a7215f5f140a2bd5dd193d193 + languageName: node + linkType: hard + "jest-resolve@npm:^27.4.2, jest-resolve@npm:^27.5.1": version: 27.5.1 resolution: "jest-resolve@npm:27.5.1" @@ -22626,6 +23067,23 @@ __metadata: languageName: node linkType: hard +"jest-resolve@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-resolve@npm:28.1.1" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + jest-pnp-resolver: ^1.2.2 + jest-util: ^28.1.1 + jest-validate: ^28.1.1 + resolve: ^1.20.0 + resolve.exports: ^1.1.0 + slash: ^3.0.0 + checksum: cda5c472fe5b50b91696d90d5c3a72d0f5ff188ecad18816b4085fbac0bad53c0a9abff94c3bf41c7ced24256cf8e34f0b03f1c9e05464e8efcd0f03560d6699 + languageName: node + linkType: hard + "jest-runner@npm:^27.5.1": version: 27.5.1 resolution: "jest-runner@npm:27.5.1" @@ -22655,6 +23113,35 @@ __metadata: languageName: node linkType: hard +"jest-runner@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-runner@npm:28.1.2" + dependencies: + "@jest/console": ^28.1.1 + "@jest/environment": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.10.2 + graceful-fs: ^4.2.9 + jest-docblock: ^28.1.1 + jest-environment-node: ^28.1.2 + jest-haste-map: ^28.1.1 + jest-leak-detector: ^28.1.1 + jest-message-util: ^28.1.1 + jest-resolve: ^28.1.1 + jest-runtime: ^28.1.2 + jest-util: ^28.1.1 + jest-watcher: ^28.1.1 + jest-worker: ^28.1.1 + source-map-support: 0.5.13 + throat: ^6.0.1 + checksum: 51e46779e6c834269de22ba20528b4a1f1df2fe0785dfacb6e5188a552089cef625a49f480db7fa93ed8a11e49de197c9a204c390515cd2f7f4e24474a4f2c6b + languageName: node + linkType: hard + "jest-runtime@npm:^27.5.1": version: 27.5.1 resolution: "jest-runtime@npm:27.5.1" @@ -22685,6 +23172,36 @@ __metadata: languageName: node linkType: hard +"jest-runtime@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-runtime@npm:28.1.2" + dependencies: + "@jest/environment": ^28.1.2 + "@jest/fake-timers": ^28.1.2 + "@jest/globals": ^28.1.2 + "@jest/source-map": ^28.1.2 + "@jest/test-result": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + execa: ^5.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.1 + jest-message-util: ^28.1.1 + jest-mock: ^28.1.1 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.1 + jest-snapshot: ^28.1.2 + jest-util: ^28.1.1 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: d9a2f45a7b21f239b12448e4fb82c0893e94fdd644fa9315a936251ffbe128d73e9daf3645bc1526a0f3850e79d271bd5b71aa7699a9990c0cd52e51ee13b2f2 + languageName: node + linkType: hard + "jest-serializer@npm:^26.6.2": version: 26.6.2 resolution: "jest-serializer@npm:26.6.2" @@ -22735,6 +23252,37 @@ __metadata: languageName: node linkType: hard +"jest-snapshot@npm:^28.1.2": + version: 28.1.2 + resolution: "jest-snapshot@npm:28.1.2" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^28.1.1 + "@jest/transform": ^28.1.2 + "@jest/types": ^28.1.1 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^28.1.1 + graceful-fs: ^4.2.9 + jest-diff: ^28.1.1 + jest-get-type: ^28.0.2 + jest-haste-map: ^28.1.1 + jest-matcher-utils: ^28.1.1 + jest-message-util: ^28.1.1 + jest-util: ^28.1.1 + natural-compare: ^1.4.0 + pretty-format: ^28.1.1 + semver: ^7.3.5 + checksum: 5c33c8b05d387d4fa4516556dc6fdeca4d7c0a1d48bfb31d05d5bf182988713800a35b0f7d4d9e40e3646edbde095aba36bb1b64a8d9bac40e34f76e90ddb482 + languageName: node + linkType: hard + "jest-util@npm:^26.6.2": version: 26.6.2 resolution: "jest-util@npm:26.6.2" @@ -22805,6 +23353,20 @@ __metadata: languageName: node linkType: hard +"jest-validate@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-validate@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + leven: ^3.1.0 + pretty-format: ^28.1.1 + checksum: 7bb5427d9b5ef4efc218aaf1f2a4282ebcc66458a6c40aa9fd2914aab967d3157352fb37ea46c83c1bc640ccf997ca3edee4d7aa109dccc02a7c821bac192104 + languageName: node + linkType: hard + "jest-watch-typeahead@npm:^1.0.0": version: 1.1.0 resolution: "jest-watch-typeahead@npm:1.1.0" @@ -22837,7 +23399,7 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:^28.0.0": +"jest-watcher@npm:^28.0.0, jest-watcher@npm:^28.1.1": version: 28.1.1 resolution: "jest-watcher@npm:28.1.1" dependencies: @@ -22875,7 +23437,7 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^28.0.2": +"jest-worker@npm:^28.0.2, jest-worker@npm:^28.1.1": version: 28.1.1 resolution: "jest-worker@npm:28.1.1" dependencies: @@ -22904,6 +23466,25 @@ __metadata: languageName: node linkType: hard +"jest@npm:^28.1.2": + version: 28.1.2 + resolution: "jest@npm:28.1.2" + dependencies: + "@jest/core": ^28.1.2 + "@jest/types": ^28.1.1 + import-local: ^3.0.2 + jest-cli: ^28.1.2 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 8ad37088c42cd5a6decb54c61dfe6a45131a50dfe4c805aef1228cae4ca91b0fc7dfe2991ea771d88118151f5f1697d113b6f45c9b0d88b2ece2aac229e77150 + languageName: node + linkType: hard + "jetifier@npm:^1.6.2": version: 1.6.8 resolution: "jetifier@npm:1.6.8" @@ -34308,6 +34889,16 @@ __metadata: languageName: node linkType: hard +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + "source-map-support@npm:^0.4.15": version: 0.4.18 resolution: "source-map-support@npm:0.4.18" @@ -36166,7 +36757,7 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^28.0.3": +"ts-jest@npm:^28.0.3, ts-jest@npm:^28.0.5": version: 28.0.5 resolution: "ts-jest@npm:28.0.5" dependencies: @@ -37380,6 +37971,17 @@ __metadata: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.1": + version: 9.0.1 + resolution: "v8-to-istanbul@npm:9.0.1" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + languageName: node + linkType: hard + "v8flags@npm:^2.1.1": version: 2.1.1 resolution: "v8flags@npm:2.1.1" @@ -37594,7 +38196,7 @@ __metadata: languageName: node linkType: hard -"walker@npm:^1.0.7, walker@npm:~1.0.5": +"walker@npm:^1.0.7, walker@npm:^1.0.8, walker@npm:~1.0.5": version: 1.0.8 resolution: "walker@npm:1.0.8" dependencies: @@ -38988,7 +39590,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.0.1, yargs@npm:^17.2.1, yargs@npm:^17.5.1": +"yargs@npm:^17.0.0, yargs@npm:^17.0.1, yargs@npm:^17.2.1, yargs@npm:^17.3.1, yargs@npm:^17.5.1": version: 17.5.1 resolution: "yargs@npm:17.5.1" dependencies: