mirror of
https://github.com/standardnotes/server
synced 2026-04-18 23:05:49 -04:00
Compare commits
830 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5cf84e31b0 | |||
| 31e7aaf253 | |||
| 8ec3d37c18 | |||
| 857c6af946 | |||
| de081fe786 | |||
| 0aeeb2d1cf | |||
| e589029722 | |||
| b265a39b63 | |||
| ed5cfd86db | |||
| a1a3e9f586 | |||
| a40b17b141 | |||
| 18181ed9df | |||
| 0ae028db73 | |||
| 79971be672 | |||
| e4fcd738c3 | |||
| 6827e5e218 | |||
| b91cd7e232 | |||
| 735d89cdaa | |||
| e8db412bc2 | |||
| bf855bb26e | |||
| 41cd377145 | |||
| d798864caf | |||
| cef1998f0e | |||
| c2cbf44594 | |||
| de2e167582 | |||
| 547a79e231 | |||
| 5a3afb3b17 | |||
| 66ef4be656 | |||
| c5d0d63ddd | |||
| 36f07c691a | |||
| ac0390e7c3 | |||
| 0477507a6a | |||
| 3e7856c895 | |||
| 6778a80f21 | |||
| d4d49454a6 | |||
| 04b52e6773 | |||
| 2a1859e4be | |||
| dd9a9c68cb | |||
| 9147ff5d49 | |||
| 503b84531b | |||
| fe8ca828fb | |||
| 03a4a3f2ab | |||
| 3a8607d146 | |||
| 93b6e65554 | |||
| 5984e4c3e7 | |||
| b4257c10ea | |||
| c164bde847 | |||
| 883df939dd | |||
| c7807d0f9e | |||
| fc90343aaa | |||
| fbcb45c3a2 | |||
| 179d8eaaa1 | |||
| 38685c1861 | |||
| cdf42fbe2d | |||
| 9be4c002b7 | |||
| a16c5307a0 | |||
| d5536f5430 | |||
| b1d88b15be | |||
| ff78285e43 | |||
| 1a26221385 | |||
| 54113abe2a | |||
| afe385aed4 | |||
| f055e52e06 | |||
| fab5d18064 | |||
| a1e654a0d0 | |||
| aa835268ea | |||
| 74b4312928 | |||
| e91a832152 | |||
| 4f95bbee3f | |||
| b9c9f74d0c | |||
| e535cd504c | |||
| db0360860a | |||
| aa2b5f3b74 | |||
| 6241661e27 | |||
| 25047bf46d | |||
| a1820ed212 | |||
| 0a1d1624e8 | |||
| 7367de6832 | |||
| f0abfe89fc | |||
| d1244d165a | |||
| 106d8f9192 | |||
| 1d86ba8fcb | |||
| f20a947f8a | |||
| 19b9de05ae | |||
| 1d751c0fbe | |||
| fa2564e164 | |||
| 330bff0124 | |||
| ca57c8e7b5 | |||
| a82b9a0c8a | |||
| ea7e9d73c4 | |||
| 117b7b4b99 | |||
| b4bf11d9da | |||
| 0306e10469 | |||
| 0ab47013f2 | |||
| 836883b82d | |||
| ed671be9c5 | |||
| 9676a2586c | |||
| e95ba61c7f | |||
| a0718aea26 | |||
| 156fa7a618 | |||
| 8d006ece30 | |||
| 037c994040 | |||
| a164ba291d | |||
| 610fba2601 | |||
| 398338c8f8 | |||
| 34be157d8e | |||
| 76372fe357 | |||
| 46879c336b | |||
| aef9e936bd | |||
| 8cb92d9678 | |||
| 52db89de81 | |||
| c5af8dfc05 | |||
| 27ad8e6959 | |||
| c4a1502f70 | |||
| d1d6c753c4 | |||
| 3bd63f7674 | |||
| 376466d9b2 | |||
| e100c52bbc | |||
| d4830dec01 | |||
| 7e11821021 | |||
| 4715e019a2 | |||
| 794cd8734a | |||
| 14d42b26bb | |||
| 6bb44afd91 | |||
| c82345aeeb | |||
| 72ab08a0d0 | |||
| f2d1b47e40 | |||
| d9ee2c5be2 | |||
| eb59902cf7 | |||
| 002074e4d1 | |||
| 45b55068f9 | |||
| 157eee5d93 | |||
| d5f2b4f6eb | |||
| a7a93497e8 | |||
| 8f96f0ed7a | |||
| 3f064176f2 | |||
| c7b0c7dfa8 | |||
| df20dd46db | |||
| 6dfd09989e | |||
| fc821709e2 | |||
| e986abaab5 | |||
| a006fb3119 | |||
| 2af812eaf1 | |||
| d13c975f94 | |||
| 1f7e4dd184 | |||
| 8b04216998 | |||
| 27ff25b70e | |||
| dc3a41e4bb | |||
| 94448bb5d8 | |||
| 9a568b0f73 | |||
| a1ee491dc5 | |||
| e5c118c262 | |||
| 1bef1279e6 | |||
| c511f259c7 | |||
| f77ed8ef94 | |||
| a4929af2ee | |||
| 095811dda9 | |||
| 480d5879ba | |||
| c0722b173b | |||
| f07c8e4bd4 | |||
| baf4b2c1d2 | |||
| a6039bd99a | |||
| 7c0010c902 | |||
| 596a0f1a02 | |||
| efda3df09b | |||
| ec35f46d45 | |||
| c64fa2f47c | |||
| 6ce42a0101 | |||
| d40c74c072 | |||
| d722206916 | |||
| 19e4c8bf5e | |||
| ee656b868b | |||
| 5e79d28bbf | |||
| 25ffd6b803 | |||
| a08fe8087f | |||
| fe273a9107 | |||
| 06170d8d7d | |||
| 62d231ae41 | |||
| 4a72097921 | |||
| 23b8cdc4a1 | |||
| 2646b756a9 | |||
| 28e058c6e8 | |||
| 8dea171115 | |||
| aef9254713 | |||
| 31b7396006 | |||
| be0a2649da | |||
| bf8f91f83d | |||
| effdfebc19 | |||
| f4816e6c9a | |||
| 152a5cbd27 | |||
| 1488763115 | |||
| bbb35d16fc | |||
| ef07045ee9 | |||
| 3ba673b424 | |||
| 9c4032ebea | |||
| 05bb12c978 | |||
| df957f07e3 | |||
| b510284e01 | |||
| 205a1ed637 | |||
| 2073c735a5 | |||
| 34085ac6fb | |||
| 3d6559921b | |||
| 15a7f0e71a | |||
| 3e56243d6f | |||
| 032fcb938d | |||
| e98393452b | |||
| 302b624504 | |||
| e00d9d2ca0 | |||
| 9ab4601c8d | |||
| 19e43bdb1a | |||
| 49832e7944 | |||
| 916e98936a | |||
| 31d1eef7f7 | |||
| 2648d9a813 | |||
| b24b576209 | |||
| faee38bffd | |||
| 65f3503fe8 | |||
| 054023b791 | |||
| 383c3a68fa | |||
| 7d22b1c15c | |||
| c71e7cd926 | |||
| 83ad069c5d | |||
| 081108d9ba | |||
| 8f3df56a2b | |||
| d02124f4e5 | |||
| 09e351fedb | |||
| ad4b85b095 | |||
| 0bf7d8beae | |||
| 1ae7cca394 | |||
| bc1c7a8ae1 | |||
| c22c5e4584 | |||
| ac3646836c | |||
| 7a31ab75d6 | |||
| c49dc35ab5 | |||
| 06cedd11d8 | |||
| f496376fb3 | |||
| 091e2a57e8 | |||
| 0d40ef6796 | |||
| 1be33ba4c3 | |||
| aaeb311928 | |||
| a7a38c07ac | |||
| 56f49752b4 | |||
| 892d8b6fe2 | |||
| cec2005436 | |||
| 0eb86c0096 | |||
| b8e39d76c1 | |||
| 1c3ff526b7 | |||
| 373767248c | |||
| d7965b2748 | |||
| cbcd2ec87a | |||
| c74d37fc48 | |||
| 66f9352a06 | |||
| e5eef3aba0 | |||
| d261c81cd0 | |||
| 634e3bbb67 | |||
| f8c9e67063 | |||
| 18eddea6f8 | |||
| c6d655c5f5 | |||
| 46867c1a4d | |||
| d29903bab6 | |||
| 3415cae093 | |||
| 408fd5a0c6 | |||
| 0a16ee64fe | |||
| 22b00479b4 | |||
| 5311e74266 | |||
| 5be7db7788 | |||
| 3bd1547ce3 | |||
| a1fe15f7a9 | |||
| 19b8921f28 | |||
| 6b7879ba15 | |||
| bd5f492a73 | |||
| 67311cc002 | |||
| f39d3aca5b | |||
| 8e47491e3c | |||
| 0036d527bd | |||
| f565f1d950 | |||
| 8e35dfa4b7 | |||
| f911473be9 | |||
| 71624f1897 | |||
| 17de6ea7e1 | |||
| 6aad7cd207 | |||
| 63af335877 | |||
| 8cd7a138ab | |||
| f69cdc7b03 | |||
| 2ca649cf31 | |||
| f2ada08201 | |||
| 54ba1f69e5 | |||
| f13a99f5fd | |||
| e9bba6fd3a | |||
| f0d1a70c87 | |||
| 56f0aef21d | |||
| 75e266cb9e | |||
| b9bb83c0ce | |||
| da645c5ab3 | |||
| 318af5757d | |||
| b1cc156a25 | |||
| 79d71ca161 | |||
| cedd50b366 | |||
| 0d5dcdd8ec | |||
| d2b0fb144b | |||
| 053852b46c | |||
| 6ad349d379 | |||
| f7d33c7164 | |||
| b53b67328f | |||
| 573ffbfcf3 | |||
| 501ac0e99f | |||
| 959a11293a | |||
| fee1f1a3a7 | |||
| b0fbe0bb58 | |||
| 0087c70007 | |||
| 36e496dd7c | |||
| f2e2030e85 | |||
| 0c3737dc19 | |||
| f7471119e1 | |||
| 9bd97b95e9 | |||
| b7400c198f | |||
| f87036e3a8 | |||
| a43e5ef724 | |||
| 913ced70b0 | |||
| 6ffce30a36 | |||
| f5a57d886c | |||
| e8ba49ecca | |||
| c79a5dc94b | |||
| 4db83ae678 | |||
| 84ceb7ffd2 | |||
| e215ac4343 | |||
| bc8048790f | |||
| 886ccf84c1 | |||
| c067cb9fe4 | |||
| 6b2389cdc3 | |||
| d93916b159 | |||
| c34f548e45 | |||
| 6fcd56cc86 | |||
| 8f88a87c93 | |||
| f8c2f84322 | |||
| 46c4947871 | |||
| 64759ec2da | |||
| 5f7e768e64 | |||
| 4bc189f1c5 | |||
| 71721ab198 | |||
| 5536a48966 | |||
| f77e29d3c9 | |||
| 4b1fc718a2 | |||
| 1708c3f8a0 | |||
| 352e02028d | |||
| 1bbb639c83 | |||
| c14265f103 | |||
| c030a6b3d8 | |||
| af997ea658 | |||
| efa4d7fc60 | |||
| f714aaa0e9 | |||
| aee6e60583 | |||
| 4e602687d5 | |||
| d026152ac8 | |||
| 3f21a358d2 | |||
| dc55e47c98 | |||
| 3b804e2321 | |||
| b32f851a90 | |||
| 479d20e76f | |||
| fae4553fc8 | |||
| cb74b23e45 | |||
| af8f12c33a | |||
| a148c4d1f6 | |||
| f7190c0c9c | |||
| c00d7765a9 | |||
| 2b651d86e2 | |||
| 9be3517093 | |||
| fcfedaf7e7 | |||
| 0b82794e9c | |||
| 2a52e398cb | |||
| c31e882ad2 | |||
| 2f0903e0eb | |||
| 2396053bc1 | |||
| 17fd12305e | |||
| 425ea4374d | |||
| c076c3c74a | |||
| 547cdfd8ec | |||
| a0af8f0025 | |||
| c970b1ea68 | |||
| 4d1e2dec26 | |||
| 108408a944 | |||
| 18d07d431f | |||
| cbc024f67a | |||
| 55ec5970da | |||
| 58bdca6659 | |||
| ef49b0d3f8 | |||
| 9cb691e5ad | |||
| 04d09582d4 | |||
| 8f90dc172b | |||
| f759261919 | |||
| 2606f6d929 | |||
| c288e5d8dc | |||
| 4b76d4b71e | |||
| 72310130d2 | |||
| f9e51ef06e | |||
| 92a5eb0d98 | |||
| 77d2ea1a1f | |||
| 92f96ddb84 | |||
| 15a914e25e | |||
| 912a29d091 | |||
| b2c32ce70e | |||
| ed1a708c40 | |||
| e905128d45 | |||
| fd598f372a | |||
| 7a3946a9e2 | |||
| cbdd2584d0 | |||
| f3161c2712 | |||
| 148542dd5a | |||
| d2b2c339f2 | |||
| d2578c48f0 | |||
| fecfd54728 | |||
| 17e4162d3e | |||
| 742209d773 | |||
| 1fa4b7cf27 | |||
| 5dc5507039 | |||
| 3035a20b9f | |||
| 04b3bb034f | |||
| bf84be0136 | |||
| 890cf48749 | |||
| 2b3436c6ce | |||
| 4df8c3b2e5 | |||
| 25a2696c32 | |||
| 52f879f842 | |||
| 4f70fa156d | |||
| 38e77f04be | |||
| 060206ddd4 | |||
| 0bc0909386 | |||
| 667d528a8c | |||
| fa7fbe26e7 | |||
| ba422a29d0 | |||
| d220ec5bf7 | |||
| 7baf5492bc | |||
| d5a8409bb5 | |||
| f58f90667c | |||
| a388e1a802 | |||
| 8811d10a73 | |||
| c7a394cd1a | |||
| b7615a7f2e | |||
| 1ca70c1e50 | |||
| 253cbb1d0c | |||
| e38a16404c | |||
| f17a1f875c | |||
| 2237e0f5df | |||
| 0df471585f | |||
| 95aac1a7bf | |||
| c078bc958d | |||
| 49c27924ea | |||
| c9dd8e7338 | |||
| 5ef90cc75b | |||
| 063c61d96c | |||
| 0cb5e36b20 | |||
| 319bab5b34 | |||
| 90a4f2111f | |||
| 3aba202970 | |||
| c8974b7fa2 | |||
| 3654a19586 | |||
| 5f0929c1aa | |||
| c0fa83bce6 | |||
| c201ee42a0 | |||
| e6a4cc3098 | |||
| 39f2fe2ba1 | |||
| 72ce190996 | |||
| 527dd1b61b | |||
| af8feaadfe | |||
| 3164f76662 | |||
| d6e531d4b6 | |||
| af76878dad | |||
| 28cce39fe7 | |||
| a8b806af08 | |||
| fa0b0294b4 | |||
| 58ab410b0a | |||
| 51c8b20506 | |||
| 1e62a3760e | |||
| 2f569d4104 | |||
| f23e444ed0 | |||
| e6e9a32f03 | |||
| 8237df33a7 | |||
| 624b574013 | |||
| d762bc89d1 | |||
| f0cbec07b8 | |||
| 8c1f583968 | |||
| b28636fa73 | |||
| 092054fd44 | |||
| 9391917d08 | |||
| 5cf008f53d | |||
| 231194bd53 | |||
| 2707e87554 | |||
| 4b40c59e7e | |||
| f2e8579f95 | |||
| 57118c85e3 | |||
| 8ddc7b0a58 | |||
| bc63d0aeea | |||
| 9def26e809 | |||
| 74ac709bb5 | |||
| 1f749fad49 | |||
| 13c85d4331 | |||
| 77d2099cdb | |||
| 56a312f217 | |||
| aa2b3dac49 | |||
| 1a8daef79d | |||
| a83d133f93 | |||
| b0d01dffd9 | |||
| b74e7ce86d | |||
| 671f7a7074 | |||
| 55fd873b37 | |||
| 32c667b22d | |||
| a6b062f638 | |||
| f9183b4c62 | |||
| c7d575a0ff | |||
| a575e62519 | |||
| 3761d60f41 | |||
| fd629d43ba | |||
| 76b1cb0f5a | |||
| 2f94abc9f7 | |||
| c70040fe5d | |||
| 4b8a9e448a | |||
| 1e4c7d0f31 | |||
| ec75795a02 | |||
| ad26b64b28 | |||
| 9e4715ebbd | |||
| cc612296d0 | |||
| 1148b3948c | |||
| c7e605fd60 | |||
| 4ab32c670e | |||
| 2d810568a8 | |||
| b8353aa817 | |||
| 7924f63e28 | |||
| b3b617ea0b | |||
| 18a5071618 | |||
| fea58029b9 | |||
| e748723209 | |||
| 8a47d81936 | |||
| 7ae9f5694d | |||
| 9031379469 | |||
| dc71e6777f | |||
| 89eb798fa8 | |||
| 4304e068b9 | |||
| 126bc6de6a | |||
| c2b9107f13 | |||
| 1471f4a839 | |||
| b0b3c6671d | |||
| 6ddb8fb6c2 | |||
| 66da49b0df | |||
| 750cd26c36 | |||
| 4c15589663 | |||
| 62a0e89748 | |||
| b9603240d0 | |||
| 85d87bb45e | |||
| 3193308d8d | |||
| 7fe90c2a1a | |||
| e917b19f22 | |||
| 7d47d6a752 | |||
| 8fbb94d15a | |||
| 9fcadf8fbb | |||
| f5ac8ac5e9 | |||
| 0a0b8aafaf | |||
| 097a7eae7e | |||
| c0e43a0cf0 | |||
| d7926dd9d1 | |||
| da474741e6 | |||
| a1e16031e0 | |||
| a229093b60 | |||
| 1a64a1c34d | |||
| b8f49d2d45 | |||
| 990140c392 | |||
| 542b296018 | |||
| c6122d33b9 | |||
| 8c71066660 | |||
| a748164bf2 | |||
| c427fa8790 | |||
| 093cc07c39 | |||
| 30f14820c6 | |||
| c8ea2ab199 | |||
| d56bbacc0b | |||
| bb468a8b7e | |||
| 7e99f4b078 | |||
| 14ce6dd818 | |||
| 063a3e425d | |||
| 0900dc75ac | |||
| aa8bd1f8dc | |||
| c71f7ff8ad | |||
| fe18420913 | |||
| 97124928df | |||
| c108bfb12f | |||
| 5fe6ed1462 | |||
| df5fcce769 | |||
| 8f57ece7b8 | |||
| 8a10d201c5 | |||
| 9d7e63a7a7 | |||
| 87c1ae2ac0 | |||
| 56c922e715 | |||
| a29ac8e68f | |||
| 03f9c6039c | |||
| 73d81df8cb | |||
| 484f554339 | |||
| 2ad864e68e | |||
| 723ff44151 | |||
| 04e11cbbf7 | |||
| 3aef5998df | |||
| 34018ae7eb | |||
| 2f9d8e776f | |||
| 9503f0d963 | |||
| 32aff3e3f4 | |||
| 9b9f10d4ca | |||
| e4f0cc6b37 | |||
| d211249086 | |||
| 0fc5db8aee | |||
| 0a2abef979 | |||
| 8242f13aff | |||
| 7516ba7028 | |||
| 3417407cbe | |||
| 720d046c00 | |||
| b88f560b07 | |||
| 51b264ca13 | |||
| 0309aeab34 | |||
| aca8d2948d | |||
| 09596d2181 | |||
| e87f7e1674 | |||
| 4ad1cccc33 | |||
| 5d12648669 | |||
| 7e989720bf | |||
| f8a2892811 | |||
| eaab23ec19 | |||
| 36dcdf256f | |||
| 10a596db65 | |||
| c76302cf98 | |||
| 176cf608ef | |||
| f69073ba02 | |||
| 09ecf9262a | |||
| a3fc0d9120 | |||
| 0d5c3283d3 | |||
| 7b486348ef | |||
| 25f752d6b5 | |||
| 74e35a2d65 | |||
| 3532289575 | |||
| 7db9ba03f3 | |||
| b0baaf9ea6 | |||
| b7c6dab3ad | |||
| 2daa145867 | |||
| 4bd5fb22b4 | |||
| 78533a6045 | |||
| e1c533a15e | |||
| b6c2bb8023 | |||
| c45653a50a | |||
| d827513b73 | |||
| ad183ca621 | |||
| 1d11c5a186 | |||
| e84e78ec55 | |||
| f91e4316ff | |||
| d54b812881 | |||
| 28dc5ba2a4 | |||
| 979a320ca6 | |||
| c46186b237 | |||
| 27cf093f85 | |||
| ec0fb7e0b9 | |||
| 90029456fe | |||
| b167b00075 | |||
| b13fab76f3 | |||
| 782a9d310d | |||
| 537b1f2a29 | |||
| 2fad6b62cb | |||
| bf173b4ede | |||
| c52f038c76 | |||
| b12ba98a5c | |||
| dbccdf342b | |||
| 49b6d029c4 | |||
| d6469954ce | |||
| 5f40550ad4 | |||
| 79ccbdf100 | |||
| 1983cfcab2 | |||
| 753f86707f | |||
| 16d0ed505b | |||
| 9de09c55f8 | |||
| c3d7a33aa2 | |||
| a9cc00a478 | |||
| ec035ba648 | |||
| 5446f3cae4 | |||
| 6a550092c2 | |||
| 1b691f6bcd | |||
| 98f45cc4c2 | |||
| edc4a20859 | |||
| 74e1380df8 | |||
| dfa5187ff7 | |||
| c99c4425cd | |||
| 2d8919a079 | |||
| f638287213 | |||
| 991d885b63 | |||
| bb17efa817 | |||
| deec29c1b4 | |||
| 9d872008a7 | |||
| 145b4401af | |||
| 17bd50c263 | |||
| 4cb79de685 | |||
| 28ab0b8e46 | |||
| 6911802b87 | |||
| 5b98924561 | |||
| f13944badc | |||
| af41e6497d | |||
| b1122a3da5 | |||
| b17fddda63 | |||
| 20dc020596 | |||
| b53291650f | |||
| b83d84e519 | |||
| 14794d1a5f | |||
| 6b130ef045 | |||
| 25a6126ef4 | |||
| a2df09fb5b | |||
| 465b2741fb | |||
| 724dc5c86c | |||
| f4208c19a7 | |||
| 6fed293716 | |||
| 29ffaf04c4 | |||
| bc9182f214 | |||
| 91c70a51a0 | |||
| dfe30d7f5e | |||
| 815d5460e7 | |||
| 8a63c6768b | |||
| f7c29848f1 | |||
| 78b9426c1c | |||
| 87b22ac684 | |||
| 46c30d197a | |||
| 36b8354350 | |||
| b6702c7182 | |||
| 09d7f608cd | |||
| d023a27377 | |||
| 190595febf | |||
| b25edec26c | |||
| 85d0c12dad | |||
| 25c98ef078 | |||
| af51baea9a | |||
| e97b16606c | |||
| 5ff9e43899 | |||
| d3a49e109c | |||
| e3dbff6996 | |||
| d9f5410afd | |||
| 0568c8f563 | |||
| 16043a7d68 | |||
| f24ee61d11 | |||
| 881a6967ac | |||
| a93f66c6ac | |||
| fdf4b29ae2 | |||
| d5f6ca0d2e | |||
| 12d9ccf28c | |||
| ffc270cc6f | |||
| 61e2e58297 | |||
| b68ede1f63 | |||
| d333c1393c | |||
| 35d6f2f961 | |||
| 3d619a0c61 | |||
| bda812f170 | |||
| 826719bb67 | |||
| 631101eae5 | |||
| fa0b9bf935 | |||
| 708af5e83c | |||
| 993d31167b | |||
| ac5fc7d28a | |||
| 73f3fad13d | |||
| 85e0e2165f | |||
| 89ee103303 | |||
| 6b313947c3 | |||
| fba8e6ce35 | |||
| 622c024547 | |||
| 2c51d92bab | |||
| 11ef2ef708 | |||
| df793e07fd | |||
| bae6eea3aa | |||
| be17b67cc1 | |||
| 645a24d29b | |||
| 64962ce632 | |||
| 5120883691 | |||
| 0b4570ebee | |||
| 5bbdc7e426 | |||
| a1d60630a0 | |||
| e96fd6d69e | |||
| 1423b3fc35 | |||
| fd10b4d585 | |||
| 8a79437668 | |||
| 85a87dc40a | |||
| 95aa0a0024 | |||
| d0c44d1376 | |||
| b0e31ff305 | |||
| f11569ac53 | |||
| fbf7a61bc9 | |||
| 2265165fa3 | |||
| b216b17ef5 | |||
| b2c7b924ac | |||
| 1349f950c9 | |||
| f1c398a3a4 | |||
| 369231ff11 | |||
| 271dee5be6 | |||
| a0c8f40e7b | |||
| 4db0aef0ff | |||
| 5ed9bd243f | |||
| 2c53306f5a | |||
| a3624357dc | |||
| afe0be31f2 | |||
| 71854b704d | |||
| 0907773d6f | |||
| 787eedc8af | |||
| 040a2b5e5f | |||
| 347ee275fa | |||
| 1c0a9e6726 | |||
| c4f038ab9a | |||
| 3746ac5fc1 | |||
| 5c4353dd0c | |||
| f64caed220 | |||
| 863d590292 | |||
| 0dcf64c82b | |||
| 48fd5c5ff6 | |||
| 84fa374072 | |||
| 2313b0b450 | |||
| 4fa6f579af | |||
| 08c1328932 | |||
| 4586308210 | |||
| 5aa561dcb2 | |||
| e07612fe24 | |||
| c9289204c4 | |||
| 51bb1081a6 | |||
| 25066bb33c | |||
| bfdb176445 | |||
| 42233fa756 | |||
| 55de4319ed | |||
| 306f6edd4e | |||
| bf55bbccd9 | |||
| 6e26c0a0be | |||
| 11bcd318ab | |||
| 2f6d19dc91 | |||
| 989e1ce175 | |||
| 1c2fd46401 | |||
| b7967b34d1 |
@@ -0,0 +1,13 @@
|
|||||||
|
dist
|
||||||
|
coverage
|
||||||
|
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/cache
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/plugins
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/unplugged
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
|
||||||
|
data/*
|
||||||
+20
@@ -1,6 +1,26 @@
|
|||||||
|
######
|
||||||
|
# DB #
|
||||||
|
######
|
||||||
|
|
||||||
|
DB_HOST=db
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
DB_USERNAME=std_notes_user
|
DB_USERNAME=std_notes_user
|
||||||
DB_PASSWORD=changeme123
|
DB_PASSWORD=changeme123
|
||||||
DB_DATABASE=standard_notes_db
|
DB_DATABASE=standard_notes_db
|
||||||
|
DB_TYPE=mysql
|
||||||
|
|
||||||
|
#########
|
||||||
|
# CACHE #
|
||||||
|
#########
|
||||||
|
|
||||||
REDIS_PORT=6379
|
REDIS_PORT=6379
|
||||||
|
REDIS_HOST=cache
|
||||||
|
CACHE_TYPE=redis
|
||||||
|
|
||||||
|
########
|
||||||
|
# KEYS #
|
||||||
|
########
|
||||||
|
|
||||||
|
AUTH_JWT_SECRET=
|
||||||
|
AUTH_SERVER_ENCRYPTION_SERVER_KEY=
|
||||||
|
VALET_TOKEN_SECRET=
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"root": true,
|
"root": true,
|
||||||
"parser": "@typescript-eslint/parser",
|
|
||||||
"parserOptions": {
|
"parserOptions": {
|
||||||
"project": "./tsconfig.json"
|
"project": "./tsconfig.json"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
PUBLIC_FILES_SERVER_URL=http://localhost:3125
|
||||||
|
DB_HOST=db
|
||||||
|
DB_USERNAME=std_notes_user
|
||||||
|
DB_PASSWORD=changeme123
|
||||||
|
DB_DATABASE=standard_notes_db
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_DEBUG_LEVEL=all
|
||||||
|
DB_SQLITE_DATABASE_PATH=standard_notes_db
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_HOST=cache
|
||||||
|
AUTH_SERVER_ACCESS_TOKEN_AGE=4
|
||||||
|
AUTH_SERVER_REFRESH_TOKEN_AGE=10
|
||||||
|
AUTH_SERVER_EPHEMERAL_SESSION_AGE=300
|
||||||
|
SYNCING_SERVER_REVISIONS_FREQUENCY=2
|
||||||
|
AUTH_SERVER_LOG_LEVEL=debug
|
||||||
|
SYNCING_SERVER_LOG_LEVEL=debug
|
||||||
|
FILES_SERVER_LOG_LEVEL=debug
|
||||||
|
REVISIONS_SERVER_LOG_LEVEL=debug
|
||||||
|
API_GATEWAY_LOG_LEVEL=debug
|
||||||
|
|
||||||
|
MYSQL_DATABASE=standard_notes_db
|
||||||
|
MYSQL_USER=std_notes_user
|
||||||
|
MYSQL_PASSWORD=changeme123
|
||||||
|
MYSQL_ROOT_PASSWORD=changeme123
|
||||||
|
|
||||||
|
MONGO_HOST=secondary_db
|
||||||
|
MONGO_PORT=27017
|
||||||
|
MONGO_USERNAME=standardnotes
|
||||||
|
MONGO_PASSWORD=standardnotes
|
||||||
|
MONGO_DATABASE=standardnotes
|
||||||
|
|
||||||
|
AUTH_JWT_SECRET=f95259c5e441f5a4646d76422cfb3df4c4488842901aa50b6c51b8be2e0040e9
|
||||||
|
AUTH_SERVER_ENCRYPTION_SERVER_KEY=1087415dfde3093797f9a7ca93a49e7d7aa1861735eb0d32aae9c303b8c3d060
|
||||||
|
VALET_TOKEN_SECRET=4b886819ebe1e908077c6cae96311b48a8416bd60cc91c03060e15bdf6b30d1f
|
||||||
+16
-1
@@ -30,6 +30,11 @@ updates:
|
|||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/packages/domain-core"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
- package-ecosystem: "npm"
|
- package-ecosystem: "npm"
|
||||||
directory: "/packages/domain-events"
|
directory: "/packages/domain-events"
|
||||||
schedule:
|
schedule:
|
||||||
@@ -50,11 +55,21 @@ updates:
|
|||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/packages/home-server"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
- package-ecosystem: "npm"
|
- package-ecosystem: "npm"
|
||||||
directory: "/packages/predicates"
|
directory: "/packages/predicates"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/packages/revisions"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
- package-ecosystem: "npm"
|
- package-ecosystem: "npm"
|
||||||
directory: "/packages/scheduler"
|
directory: "/packages/scheduler"
|
||||||
schedule:
|
schedule:
|
||||||
@@ -86,7 +101,7 @@ updates:
|
|||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|
||||||
- package-ecosystem: "npm"
|
- package-ecosystem: "npm"
|
||||||
directory: "/packages/workspace"
|
directory: "/packages/websockets"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
call_server_utility_workflow:
|
call_server_application_workflow:
|
||||||
name: Server Utility
|
name: Server Application
|
||||||
uses: standardnotes/server/.github/workflows/common-server-utility.yml@main
|
uses: standardnotes/server/.github/workflows/common-server-application.yml@main
|
||||||
with:
|
with:
|
||||||
service_name: analytics
|
service_name: analytics
|
||||||
workspace_name: "@standardnotes/analytics"
|
workspace_name: "@standardnotes/analytics"
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
newrelic:
|
newrelic:
|
||||||
needs: call_server_utility_workflow
|
needs: call_server_application_workflow
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
service_name: api-gateway
|
service_name: api-gateway
|
||||||
workspace_name: "@standardnotes/api-gateway"
|
workspace_name: "@standardnotes/api-gateway"
|
||||||
e2e_tag_parameter_name: api_gateway_image_tag
|
|
||||||
deploy_worker: false
|
deploy_worker: false
|
||||||
package_path: packages/api-gateway
|
package_path: packages/api-gateway
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
service_name: auth
|
service_name: auth
|
||||||
workspace_name: "@standardnotes/auth-server"
|
workspace_name: "@standardnotes/auth-server"
|
||||||
e2e_tag_parameter_name: auth_image_tag
|
|
||||||
package_path: packages/auth
|
package_path: packages/auth
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Configure AWS credentials
|
- name: Configure AWS credentials
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v3
|
||||||
with:
|
with:
|
||||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
@@ -50,6 +50,6 @@ jobs:
|
|||||||
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
|
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
|
||||||
with:
|
with:
|
||||||
task-definition: ${{ steps.task-def-prod.outputs.task-definition }}
|
task-definition: ${{ steps.task-def-prod.outputs.task-definition }}
|
||||||
service: ${{ inputs.service_name }}-prod
|
service: ${{ inputs.service_name }}
|
||||||
cluster: prod
|
cluster: prod
|
||||||
wait-for-service-stability: true
|
wait-for-service-stability: true
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ on:
|
|||||||
service_name:
|
service_name:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
bundle_dir:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
package_path:
|
package_path:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
@@ -32,13 +29,16 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
- name: Cache build
|
- name: Cache build
|
||||||
id: cache-build
|
id: cache-build
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
packages/**/dist
|
packages/**/dist
|
||||||
${{ inputs.bundle_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
||||||
|
|
||||||
- name: Set up Node
|
- name: Set up Node
|
||||||
@@ -47,13 +47,12 @@ jobs:
|
|||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
if: steps.cache-build.outputs.cache-hit != 'true'
|
||||||
run: yarn build ${{ inputs.package_path }}
|
run: yarn build
|
||||||
|
|
||||||
- name: Bundle
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn workspace ${{ inputs.workspace_name }} bundle --no-compress --output-directory ${{ inputs.bundle_dir }}
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
@@ -62,7 +61,7 @@ jobs:
|
|||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
- name: Configure AWS credentials
|
- name: Configure AWS credentials
|
||||||
uses: aws-actions/configure-aws-credentials@v1
|
uses: aws-actions/configure-aws-credentials@v3
|
||||||
with:
|
with:
|
||||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
@@ -82,11 +81,11 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@master
|
uses: docker/setup-buildx-action@master
|
||||||
|
|
||||||
- name: Publish Docker image
|
- name: Publish Docker image
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v4
|
||||||
with:
|
with:
|
||||||
builder: ${{ steps.buildx.outputs.name }}
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
context: ${{ inputs.bundle_dir }}
|
context: .
|
||||||
file: ${{ inputs.bundle_dir }}/${{ inputs.package_path }}/Dockerfile
|
file: ${{ inputs.package_path }}/Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
|
|||||||
@@ -0,0 +1,170 @@
|
|||||||
|
name: Reusable Run E2E Test Suite Workflow
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
snjs_image_tag:
|
||||||
|
type: string
|
||||||
|
default: latest
|
||||||
|
description: The Docker image tag used for SNJS container
|
||||||
|
secrets:
|
||||||
|
DOCKER_USERNAME:
|
||||||
|
required: true
|
||||||
|
DOCKER_PASSWORD:
|
||||||
|
required: true
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
required: true
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
e2e:
|
||||||
|
name: (Self Hosting) E2E Test Suite
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
secondary_db_enabled: [true, false]
|
||||||
|
transition_mode_enabled: [true, false]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
services:
|
||||||
|
snjs:
|
||||||
|
image: standardnotes/snjs:${{ inputs.snjs_image_tag }}
|
||||||
|
ports:
|
||||||
|
- 9001:9001
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
- name: Run Server
|
||||||
|
run: docker compose -f docker-compose.ci.yml up -d
|
||||||
|
env:
|
||||||
|
DB_TYPE: mysql
|
||||||
|
CACHE_TYPE: redis
|
||||||
|
SECONDARY_DB_ENABLED: ${{ matrix.secondary_db_enabled }}
|
||||||
|
TRANSITION_MODE_ENABLED: ${{ matrix.transition_mode_enabled }}
|
||||||
|
|
||||||
|
- name: Wait for server to start
|
||||||
|
run: docker/is-available.sh http://localhost:3123 $(pwd)/logs
|
||||||
|
|
||||||
|
- name: Run E2E Test Suite
|
||||||
|
run: yarn dlx mocha-headless-chrome --timeout 3600000 -f http://localhost:9001/mocha/test.html
|
||||||
|
|
||||||
|
- name: Show logs on failure
|
||||||
|
if: ${{ failure() }}
|
||||||
|
run: |
|
||||||
|
echo "# Errors:"
|
||||||
|
tail -n 100 logs/*.err
|
||||||
|
echo "# Logs:"
|
||||||
|
tail -n 100 logs/*.log
|
||||||
|
|
||||||
|
e2e-home-server:
|
||||||
|
name: (Home Server) E2E Test Suite
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
db_type: [mysql, sqlite]
|
||||||
|
cache_type: [redis, memory]
|
||||||
|
secondary_db_enabled: [true, false]
|
||||||
|
transition_mode_enabled: [true, false]
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
services:
|
||||||
|
snjs:
|
||||||
|
image: standardnotes/snjs:${{ inputs.snjs_image_tag }}
|
||||||
|
ports:
|
||||||
|
- 9001:9001
|
||||||
|
cache:
|
||||||
|
image: redis
|
||||||
|
ports:
|
||||||
|
- 6379:6379
|
||||||
|
db:
|
||||||
|
image: mysql
|
||||||
|
ports:
|
||||||
|
- 3306:3306
|
||||||
|
env:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: standardnotes
|
||||||
|
MYSQL_USER: standardnotes
|
||||||
|
MYSQL_PASSWORD: standardnotes
|
||||||
|
secondary_db:
|
||||||
|
image: mongo:5.0
|
||||||
|
ports:
|
||||||
|
- 27017:27017
|
||||||
|
env:
|
||||||
|
MONGO_INITDB_ROOT_USERNAME: standardnotes
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD: standardnotes
|
||||||
|
MONGO_INITDB_DATABASE: standardnotes
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: yarn build
|
||||||
|
|
||||||
|
- name: Copy dotenv file
|
||||||
|
run: cp packages/home-server/.env.sample packages/home-server/.env
|
||||||
|
|
||||||
|
- name: Fill in env variables
|
||||||
|
run: |
|
||||||
|
sed -i "s/JWT_SECRET=/JWT_SECRET=$(openssl rand -hex 32)/g" packages/home-server/.env
|
||||||
|
sed -i "s/AUTH_JWT_SECRET=/AUTH_JWT_SECRET=$(openssl rand -hex 32)/g" packages/home-server/.env
|
||||||
|
sed -i "s/ENCRYPTION_SERVER_KEY=/ENCRYPTION_SERVER_KEY=$(openssl rand -hex 32)/g" packages/home-server/.env
|
||||||
|
sed -i "s/PSEUDO_KEY_PARAMS_KEY=/PSEUDO_KEY_PARAMS_KEY=$(openssl rand -hex 32)/g" packages/home-server/.env
|
||||||
|
sed -i "s/VALET_TOKEN_SECRET=/VALET_TOKEN_SECRET=$(openssl rand -hex 32)/g" packages/home-server/.env
|
||||||
|
echo "ACCESS_TOKEN_AGE=4" >> packages/home-server/.env
|
||||||
|
echo "REFRESH_TOKEN_AGE=10" >> packages/home-server/.env
|
||||||
|
echo "REVISIONS_FREQUENCY=2" >> packages/home-server/.env
|
||||||
|
echo "DB_HOST=localhost" >> packages/home-server/.env
|
||||||
|
echo "DB_PORT=3306" >> packages/home-server/.env
|
||||||
|
echo "DB_DATABASE=standardnotes" >> packages/home-server/.env
|
||||||
|
echo "DB_SQLITE_DATABASE_PATH=homeserver.db" >> packages/home-server/.env
|
||||||
|
echo "DB_USERNAME=standardnotes" >> packages/home-server/.env
|
||||||
|
echo "DB_PASSWORD=standardnotes" >> packages/home-server/.env
|
||||||
|
echo "DB_TYPE=${{ matrix.db_type }}" >> packages/home-server/.env
|
||||||
|
echo "DB_DEBUG_LEVEL=all" >> packages/home-server/.env
|
||||||
|
echo "REDIS_URL=redis://localhost:6379" >> packages/home-server/.env
|
||||||
|
echo "CACHE_TYPE=${{ matrix.cache_type }}" >> packages/home-server/.env
|
||||||
|
echo "SECONDARY_DB_ENABLED=${{ matrix.secondary_db_enabled }}" >> packages/home-server/.env
|
||||||
|
echo "TRANSITION_MODE_ENABLED=${{ matrix.transition_mode_enabled }}" >> packages/home-server/.env
|
||||||
|
echo "MONGO_HOST=localhost" >> packages/home-server/.env
|
||||||
|
echo "MONGO_PORT=27017" >> packages/home-server/.env
|
||||||
|
echo "MONGO_DATABASE=standardnotes" >> packages/home-server/.env
|
||||||
|
echo "MONGO_USERNAME=standardnotes" >> packages/home-server/.env
|
||||||
|
echo "MONGO_PASSWORD=standardnotes" >> packages/home-server/.env
|
||||||
|
echo "FILES_SERVER_URL=http://localhost:3123" >> packages/home-server/.env
|
||||||
|
echo "E2E_TESTING=true" >> packages/home-server/.env
|
||||||
|
|
||||||
|
- name: Run Server
|
||||||
|
run: nohup yarn workspace @standardnotes/home-server start > logs/output.log 2>&1 &
|
||||||
|
env:
|
||||||
|
PORT: 3123
|
||||||
|
|
||||||
|
- name: Wait for server to start
|
||||||
|
run: for i in {1..30}; do curl -s http://localhost:3123/healthcheck && break || sleep 1; done
|
||||||
|
|
||||||
|
- name: Run E2E Test Suite
|
||||||
|
run: yarn dlx mocha-headless-chrome --timeout 3600000 -f http://localhost:9001/mocha/test.html
|
||||||
|
|
||||||
|
- name: Show logs on failure
|
||||||
|
if: ${{ failure() }}
|
||||||
|
run: tail -n 500 logs/output.log
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
name: Reusable Publish Docker Self Hosting Image Workflow
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
secrets:
|
||||||
|
DOCKER_USERNAME:
|
||||||
|
required: true
|
||||||
|
DOCKER_PASSWORD:
|
||||||
|
required: true
|
||||||
|
AWS_ACCESS_KEY_ID:
|
||||||
|
required: true
|
||||||
|
AWS_SECRET_ACCESS_KEY:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@master
|
||||||
|
with:
|
||||||
|
platforms: all
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@master
|
||||||
|
|
||||||
|
- name: Publish Docker image
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
context: .
|
||||||
|
file: Dockerfile
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
standardnotes/server:latest
|
||||||
|
standardnotes/server:${{ github.sha }}
|
||||||
@@ -17,9 +17,6 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
type: boolean
|
type: boolean
|
||||||
e2e_tag_parameter_name:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
package_path:
|
package_path:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
@@ -36,177 +33,11 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
temp_dir: ${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Create Bundle Dir
|
|
||||||
id: bundle-dir
|
|
||||||
run: echo "temp_dir=$(mktemp -d -t ${{ inputs.service_name }}-${{ github.sha }}-XXXXXXX)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Bundle
|
|
||||||
run: yarn workspace ${{ inputs.workspace_name }} bundle --no-compress --output-directory ${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Lint
|
|
||||||
run: yarn lint:${{ inputs.service_name }}
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: yarn test ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
e2e:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Bundle
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn workspace ${{ inputs.workspace_name }} bundle --no-compress --output-directory ${{ needs.build.outputs.temp_dir }}
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@master
|
|
||||||
with:
|
|
||||||
platforms: all
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@master
|
|
||||||
|
|
||||||
- name: Publish Docker image for E2E testing
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
builder: ${{ steps.buildx.outputs.name }}
|
|
||||||
context: ${{ needs.build.outputs.temp_dir }}
|
|
||||||
file: ${{ needs.build.outputs.temp_dir }}/${{ inputs.package_path }}/Dockerfile
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: standardnotes/${{ inputs.service_name }}:${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Run E2E test suite
|
|
||||||
uses: convictional/trigger-workflow-and-wait@master
|
|
||||||
with:
|
|
||||||
owner: standardnotes
|
|
||||||
repo: self-hosted
|
|
||||||
github_token: ${{ secrets.CI_PAT_TOKEN }}
|
|
||||||
workflow_file_name: testing-with-updating-client-and-server.yml
|
|
||||||
wait_interval: 30
|
|
||||||
client_payload: '{"${{ inputs.e2e_tag_parameter_name }}": "${{ github.sha }}"}'
|
|
||||||
propagate_failure: true
|
|
||||||
trigger_workflow: true
|
|
||||||
wait_workflow: true
|
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
needs: [ build, test, lint, e2e ]
|
|
||||||
|
|
||||||
name: Publish Docker Image
|
name: Publish Docker Image
|
||||||
uses: standardnotes/server/.github/workflows/common-docker-image.yml@main
|
uses: standardnotes/server/.github/workflows/common-docker-image.yml@main
|
||||||
with:
|
with:
|
||||||
service_name: ${{ inputs.service_name }}
|
service_name: ${{ inputs.service_name }}
|
||||||
bundle_dir: ${{ needs.build.outputs.temp_dir }}
|
|
||||||
package_path: ${{ inputs.package_path }}
|
package_path: ${{ inputs.package_path }}
|
||||||
workspace_name: ${{ inputs.workspace_name }}
|
workspace_name: ${{ inputs.workspace_name }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -1,164 +0,0 @@
|
|||||||
name: Reusable Server Utility Workflow
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
service_name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
workspace_name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
deploy_web:
|
|
||||||
required: false
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
deploy_worker:
|
|
||||||
required: false
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
package_path:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
secrets:
|
|
||||||
DOCKER_USERNAME:
|
|
||||||
required: true
|
|
||||||
DOCKER_PASSWORD:
|
|
||||||
required: true
|
|
||||||
CI_PAT_TOKEN:
|
|
||||||
required: true
|
|
||||||
AWS_ACCESS_KEY_ID:
|
|
||||||
required: true
|
|
||||||
AWS_SECRET_ACCESS_KEY:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
temp_dir: ${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Create Bundle Dir
|
|
||||||
id: bundle-dir
|
|
||||||
run: echo "temp_dir=$(mktemp -d -t ${{ inputs.service_name }}-${{ github.sha }}-XXXXXXX)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Bundle
|
|
||||||
run: yarn workspace ${{ inputs.workspace_name }} bundle --no-compress --output-directory ${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Lint
|
|
||||||
run: yarn lint:${{ inputs.service_name }}
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-${{ inputs.service_name }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn build ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: yarn test ${{ inputs.package_path }}
|
|
||||||
|
|
||||||
publish:
|
|
||||||
needs: [ build, test, lint ]
|
|
||||||
|
|
||||||
name: Publish Docker Image
|
|
||||||
uses: standardnotes/server/.github/workflows/common-docker-image.yml@main
|
|
||||||
with:
|
|
||||||
service_name: ${{ inputs.service_name }}
|
|
||||||
bundle_dir: ${{ needs.build.outputs.temp_dir }}
|
|
||||||
package_path: ${{ inputs.package_path }}
|
|
||||||
workspace_name: ${{ inputs.workspace_name }}
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
deploy-web:
|
|
||||||
if: ${{ inputs.deploy_web }}
|
|
||||||
|
|
||||||
needs: publish
|
|
||||||
|
|
||||||
name: Deploy Web
|
|
||||||
uses: standardnotes/server/.github/workflows/common-deploy.yml@main
|
|
||||||
with:
|
|
||||||
service_name: ${{ inputs.service_name }}
|
|
||||||
docker_image: ${{ inputs.service_name }}:${{ github.sha }}
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
deploy-worker:
|
|
||||||
if: ${{ inputs.deploy_worker }}
|
|
||||||
|
|
||||||
needs: publish
|
|
||||||
|
|
||||||
name: Deploy Worker
|
|
||||||
uses: standardnotes/server/.github/workflows/common-deploy.yml@main
|
|
||||||
with:
|
|
||||||
service_name: ${{ inputs.service_name }}-worker
|
|
||||||
docker_image: ${{ inputs.service_name }}:${{ github.sha }}
|
|
||||||
secrets: inherit
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
name: E2E Test Suite On Self Hosted Server
|
||||||
|
|
||||||
|
run-name: E2E Test Suite against ${{ inputs.ref_name }} by ${{ inputs.author }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 */12 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
snjs_image_tag:
|
||||||
|
type: string
|
||||||
|
default: latest
|
||||||
|
description: The Docker image tag used for SNJS container
|
||||||
|
author:
|
||||||
|
type: string
|
||||||
|
default: unknown
|
||||||
|
description: The author that triggered the workflow
|
||||||
|
ref_name:
|
||||||
|
type: string
|
||||||
|
default: unknown
|
||||||
|
description: The ref name from which the workflow was triggered
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
e2e:
|
||||||
|
name: E2E
|
||||||
|
uses: standardnotes/server/.github/workflows/common-e2e.yml@main
|
||||||
|
with:
|
||||||
|
snjs_image_tag: ${{ inputs.snjs_image_tag || 'latest' }}
|
||||||
|
secrets: inherit
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
name: Event Store
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: event-store
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- '*standardnotes/event-store*'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
call_server_utility_workflow:
|
|
||||||
name: Server Utility
|
|
||||||
uses: standardnotes/server/.github/workflows/common-server-utility.yml@main
|
|
||||||
with:
|
|
||||||
service_name: event-store
|
|
||||||
workspace_name: "@standardnotes/event-store"
|
|
||||||
deploy_web: false
|
|
||||||
package_path: packages/event-store
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
newrelic:
|
|
||||||
needs: call_server_utility_workflow
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Create New Relic deployment marker for Worker
|
|
||||||
uses: newrelic/deployment-marker-action@v1
|
|
||||||
with:
|
|
||||||
accountId: ${{ secrets.NEW_RELIC_ACCOUNT_ID }}
|
|
||||||
apiKey: ${{ secrets.NEW_RELIC_API_KEY }}
|
|
||||||
applicationId: ${{ secrets.NEW_RELIC_APPLICATION_ID_EVENT_STORE_PROD }}
|
|
||||||
revision: "${{ github.sha }}"
|
|
||||||
description: "Automated Deployment via Github Actions"
|
|
||||||
user: "${{ github.actor }}"
|
|
||||||
@@ -17,7 +17,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
service_name: files
|
service_name: files
|
||||||
workspace_name: "@standardnotes/files-server"
|
workspace_name: "@standardnotes/files-server"
|
||||||
e2e_tag_parameter_name: files_image_tag
|
|
||||||
package_path: packages/files
|
package_path: packages/files
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
|||||||
+12
-78
@@ -25,6 +25,9 @@ jobs:
|
|||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: yarn build
|
run: yarn build
|
||||||
|
|
||||||
@@ -42,7 +45,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
packages/**/dist
|
packages/**/dist
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-build-${{ github.sha }}
|
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||||
|
|
||||||
- name: Set up Node
|
- name: Set up Node
|
||||||
@@ -51,6 +53,9 @@ jobs:
|
|||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
if: steps.cache-build.outputs.cache-hit != 'true'
|
||||||
run: yarn build
|
run: yarn build
|
||||||
@@ -72,7 +77,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
packages/**/dist
|
packages/**/dist
|
||||||
${{ needs.build.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-build-${{ github.sha }}
|
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||||
|
|
||||||
- name: Set up Node
|
- name: Set up Node
|
||||||
@@ -81,6 +85,9 @@ jobs:
|
|||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
if: steps.cache-build.outputs.cache-hit != 'true'
|
||||||
run: yarn build
|
run: yarn build
|
||||||
@@ -89,81 +96,8 @@ jobs:
|
|||||||
run: yarn test
|
run: yarn test
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
application:
|
|
||||||
- { "service_name": "api-gateway", "workspace_name": "@standardnotes/api-gateway", "e2e_tag_parameter_name": "api_gateway_image_tag", "package_path": "packages/api-gateway" }
|
|
||||||
- { "service_name": "auth", "workspace_name": "@standardnotes/auth-server", "e2e_tag_parameter_name": "auth_image_tag", "package_path": "packages/auth" }
|
|
||||||
- { "service_name": "files", "workspace_name": "@standardnotes/files-server", "e2e_tag_parameter_name": "files_image_tag", "package_path": "packages/files" }
|
|
||||||
- { "service_name": "revisions", "workspace_name": "@standardnotes/revisions-server", "e2e_tag_parameter_name": "revisions_image_tag", "package_path": "packages/revisions"}
|
|
||||||
- { "service_name": "syncing-server-js", "workspace_name": "@standardnotes/syncing-server", "e2e_tag_parameter_name": "syncing_server_js_image_tag", "package_path": "packages/syncing-server" }
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
needs: build
|
needs: build
|
||||||
|
|
||||||
steps:
|
name: E2E
|
||||||
- uses: actions/checkout@v3
|
uses: standardnotes/server/.github/workflows/common-e2e.yml@main
|
||||||
|
secrets: inherit
|
||||||
- name: Create Bundle Dir
|
|
||||||
id: bundle-dir
|
|
||||||
run: echo "temp_dir=$(mktemp -d -t ${{ matrix.application.service_name }}-${{ github.sha }}-XXXXXXX)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache build
|
|
||||||
id: cache-build
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
packages/**/dist
|
|
||||||
${{ needs.e2e.outputs.temp_dir }}
|
|
||||||
key: ${{ runner.os }}-build-${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Set up Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
if: steps.cache-build.outputs.cache-hit != 'true'
|
|
||||||
run: yarn build
|
|
||||||
|
|
||||||
- name: Bundle
|
|
||||||
run: yarn workspace ${{ matrix.application.workspace_name }} bundle --no-compress --output-directory ${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@master
|
|
||||||
with:
|
|
||||||
platforms: all
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@master
|
|
||||||
|
|
||||||
- name: Publish Docker image for E2E testing
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
builder: ${{ steps.buildx.outputs.name }}
|
|
||||||
context: ${{ steps.bundle-dir.outputs.temp_dir }}
|
|
||||||
file: ${{ steps.bundle-dir.outputs.temp_dir }}/${{ matrix.application.package_path }}/Dockerfile
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: standardnotes/${{ matrix.application.service_name }}:${{ github.sha }}
|
|
||||||
|
|
||||||
- name: Run E2E test suite
|
|
||||||
uses: convictional/trigger-workflow-and-wait@master
|
|
||||||
with:
|
|
||||||
owner: standardnotes
|
|
||||||
repo: self-hosted
|
|
||||||
github_token: ${{ secrets.CI_PAT_TOKEN }}
|
|
||||||
workflow_file_name: testing-with-updating-client-and-server.yml
|
|
||||||
wait_interval: 30
|
|
||||||
client_payload: '{"${{ matrix.application.e2e_tag_parameter_name }}": "${{ github.sha }}"}'
|
|
||||||
propagate_failure: true
|
|
||||||
trigger_workflow: true
|
|
||||||
wait_workflow: true
|
|
||||||
|
|||||||
@@ -5,9 +5,113 @@ on:
|
|||||||
branches: [ main ]
|
branches: [ main ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release_and_publish:
|
build:
|
||||||
if: contains(github.event.head_commit.message, 'chore(release)') == false
|
if: contains(github.event.head_commit.message, 'chore(release)') == false
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Cache build
|
||||||
|
id: cache-build
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
packages/**/dist
|
||||||
|
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Set up Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: yarn build
|
||||||
|
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
needs: build
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Cache build
|
||||||
|
id: cache-build
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
packages/**/dist
|
||||||
|
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Set up Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
if: steps.cache-build.outputs.cache-hit != 'true'
|
||||||
|
run: yarn build
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
run: yarn lint
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
needs: build
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Cache build
|
||||||
|
id: cache-build
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
packages/**/dist
|
||||||
|
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Set up Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
if: steps.cache-build.outputs.cache-hit != 'true'
|
||||||
|
run: yarn build
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
run: yarn test
|
||||||
|
|
||||||
|
e2e:
|
||||||
|
needs: build
|
||||||
|
name: E2E
|
||||||
|
uses: standardnotes/server/.github/workflows/common-e2e.yml@main
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
publish-self-hosting:
|
||||||
|
needs: [ test, lint, e2e ]
|
||||||
|
name: Publish Self Hosting Docker Image
|
||||||
|
uses: standardnotes/server/.github/workflows/common-self-hosting.yml@main
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
publish-services:
|
||||||
|
needs: [ test, lint, e2e ]
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@@ -15,6 +119,14 @@ jobs:
|
|||||||
token: ${{ secrets.CI_PAT_TOKEN }}
|
token: ${{ secrets.CI_PAT_TOKEN }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Cache build
|
||||||
|
id: cache-build
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
packages/**/dist
|
||||||
|
key: ${{ runner.os }}-build-${{ github.sha }}
|
||||||
|
|
||||||
- name: Setup git config
|
- name: Setup git config
|
||||||
run: |
|
run: |
|
||||||
git config --global user.name "standardci"
|
git config --global user.name "standardci"
|
||||||
@@ -34,7 +146,11 @@ jobs:
|
|||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
- name: Build packages
|
- name: Install
|
||||||
|
run: yarn install --immutable
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
if: steps.cache-build.outputs.cache-hit != 'true'
|
||||||
run: yarn build
|
run: yarn build
|
||||||
|
|
||||||
- name: Bump version
|
- name: Bump version
|
||||||
@@ -44,4 +160,3 @@ jobs:
|
|||||||
run: yarn publish
|
run: yarn publish
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.CI_NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.CI_NPM_TOKEN }}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
service_name: revisions
|
service_name: revisions
|
||||||
workspace_name: "@standardnotes/revisions-server"
|
workspace_name: "@standardnotes/revisions-server"
|
||||||
e2e_tag_parameter_name: revisions_image_tag
|
|
||||||
package_path: packages/revisions
|
package_path: packages/revisions
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
call_server_utility_workflow:
|
call_server_application_workflow:
|
||||||
name: Server Utility
|
name: Server Application
|
||||||
uses: standardnotes/server/.github/workflows/common-server-utility.yml@main
|
uses: standardnotes/server/.github/workflows/common-server-application.yml@main
|
||||||
with:
|
with:
|
||||||
service_name: scheduler
|
service_name: scheduler
|
||||||
workspace_name: "@standardnotes/scheduler-server"
|
workspace_name: "@standardnotes/scheduler-server"
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
newrelic:
|
newrelic:
|
||||||
needs: call_server_utility_workflow
|
needs: call_server_application_workflow
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
service_name: syncing-server-js
|
service_name: syncing-server-js
|
||||||
workspace_name: "@standardnotes/syncing-server"
|
workspace_name: "@standardnotes/syncing-server"
|
||||||
e2e_tag_parameter_name: syncing_server_js_image_tag
|
|
||||||
package_path: packages/syncing-server
|
package_path: packages/syncing-server
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
call_server_utility_workflow:
|
call_server_application_workflow:
|
||||||
name: Server Utility
|
name: Server Application
|
||||||
uses: standardnotes/server/.github/workflows/common-server-utility.yml@main
|
uses: standardnotes/server/.github/workflows/common-server-application.yml@main
|
||||||
with:
|
with:
|
||||||
service_name: websockets
|
service_name: websockets
|
||||||
workspace_name: "@standardnotes/websockets-server"
|
workspace_name: "@standardnotes/websockets-server"
|
||||||
@@ -21,7 +21,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
newrelic:
|
newrelic:
|
||||||
needs: call_server_utility_workflow
|
needs: call_server_application_workflow
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
name: Workspace Server
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: workspace
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- '*standardnotes/workspace-server*'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
call_server_utility_workflow:
|
|
||||||
name: Server Utility
|
|
||||||
uses: standardnotes/server/.github/workflows/common-server-utility.yml@main
|
|
||||||
with:
|
|
||||||
service_name: workspace
|
|
||||||
workspace_name: "@standardnotes/workspace-server"
|
|
||||||
package_path: packages/workspace
|
|
||||||
secrets: inherit
|
|
||||||
|
|
||||||
newrelic:
|
|
||||||
needs: call_server_utility_workflow
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- name: Create New Relic deployment marker for Web
|
|
||||||
uses: newrelic/deployment-marker-action@v1
|
|
||||||
with:
|
|
||||||
accountId: ${{ secrets.NEW_RELIC_ACCOUNT_ID }}
|
|
||||||
apiKey: ${{ secrets.NEW_RELIC_API_KEY }}
|
|
||||||
applicationId: ${{ secrets.NEW_RELIC_APPLICATION_ID_WORKSPACE_WEB_PROD }}
|
|
||||||
revision: "${{ github.sha }}"
|
|
||||||
description: "Automated Deployment via Github Actions"
|
|
||||||
user: "${{ github.actor }}"
|
|
||||||
|
|
||||||
- name: Create New Relic deployment marker for Worker
|
|
||||||
uses: newrelic/deployment-marker-action@v1
|
|
||||||
with:
|
|
||||||
accountId: ${{ secrets.NEW_RELIC_ACCOUNT_ID }}
|
|
||||||
apiKey: ${{ secrets.NEW_RELIC_API_KEY }}
|
|
||||||
applicationId: ${{ secrets.NEW_RELIC_APPLICATION_ID_WORKSPACE_WORKER_PROD }}
|
|
||||||
revision: "${{ github.sha }}"
|
|
||||||
description: "Automated Deployment via Github Actions"
|
|
||||||
user: "${{ github.actor }}"
|
|
||||||
+9
-1
@@ -11,12 +11,20 @@ newrelic_agent.log
|
|||||||
!.yarn/patches
|
!.yarn/patches
|
||||||
!.yarn/plugins
|
!.yarn/plugins
|
||||||
!.yarn/releases
|
!.yarn/releases
|
||||||
!.yarn/unplugged
|
|
||||||
!.yarn/sdks
|
!.yarn/sdks
|
||||||
!.yarn/versions
|
!.yarn/versions
|
||||||
|
|
||||||
|
yarn.build-error.log
|
||||||
|
|
||||||
packages/files/uploads/*
|
packages/files/uploads/*
|
||||||
!packages/files/uploads/.gitkeep
|
!packages/files/uploads/.gitkeep
|
||||||
|
|
||||||
data/*
|
data/*
|
||||||
!data/.gitkeep
|
!data/.gitkeep
|
||||||
|
|
||||||
|
packages/**/data/*
|
||||||
|
|
||||||
|
logs/*
|
||||||
|
!logs/.gitkeep
|
||||||
|
|
||||||
|
docker-compose.yml
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Generated
+91
-103
@@ -1,5 +1,5 @@
|
|||||||
import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url';
|
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import moduleExports, { Module } from 'module';
|
import moduleExports, { Module } from 'module';
|
||||||
import { createHash } from 'crypto';
|
import { createHash } from 'crypto';
|
||||||
@@ -10,7 +10,8 @@ const SAFE_TIME = 456789e3;
|
|||||||
|
|
||||||
const PortablePath = {
|
const PortablePath = {
|
||||||
root: `/`,
|
root: `/`,
|
||||||
dot: `.`
|
dot: `.`,
|
||||||
|
parent: `..`
|
||||||
};
|
};
|
||||||
const npath = Object.create(path);
|
const npath = Object.create(path);
|
||||||
const ppath = Object.create(path.posix);
|
const ppath = Object.create(path.posix);
|
||||||
@@ -88,7 +89,6 @@ async function copyPromise(destinationFs, destination, sourceFs, source, opts) {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
async function copyImpl(prelayout, postlayout, destinationFs, destination, sourceFs, source, opts) {
|
async function copyImpl(prelayout, postlayout, destinationFs, destination, sourceFs, source, opts) {
|
||||||
var _a, _b, _c;
|
|
||||||
const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null;
|
const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null;
|
||||||
const sourceStat = await sourceFs.lstatPromise(source);
|
const sourceStat = await sourceFs.lstatPromise(source);
|
||||||
const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat;
|
const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat;
|
||||||
@@ -114,8 +114,8 @@ async function copyImpl(prelayout, postlayout, destinationFs, destination, sourc
|
|||||||
throw new Error(`Unsupported file type (${sourceStat.mode})`);
|
throw new Error(`Unsupported file type (${sourceStat.mode})`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (((_a = opts.linkStrategy) == null ? void 0 : _a.type) !== `HardlinkFromIndex` || !sourceStat.isFile()) {
|
if (opts.linkStrategy?.type !== `HardlinkFromIndex` || !sourceStat.isFile()) {
|
||||||
if (updated || ((_b = destinationStat == null ? void 0 : destinationStat.mtime) == null ? void 0 : _b.getTime()) !== mtime.getTime() || ((_c = destinationStat == null ? void 0 : destinationStat.atime) == null ? void 0 : _c.getTime()) !== atime.getTime()) {
|
if (updated || destinationStat?.mtime?.getTime() !== mtime.getTime() || destinationStat?.atime?.getTime() !== atime.getTime()) {
|
||||||
postlayout.push(() => destinationFs.lutimesPromise(destination, atime, mtime));
|
postlayout.push(() => destinationFs.lutimesPromise(destination, atime, mtime));
|
||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
@@ -185,7 +185,7 @@ async function copyFileViaIndex(prelayout, postlayout, destinationFs, destinatio
|
|||||||
let indexStat = await maybeLStat(destinationFs, indexPath);
|
let indexStat = await maybeLStat(destinationFs, indexPath);
|
||||||
if (destinationStat) {
|
if (destinationStat) {
|
||||||
const isDestinationHardlinkedFromIndex = indexStat && destinationStat.dev === indexStat.dev && destinationStat.ino === indexStat.ino;
|
const isDestinationHardlinkedFromIndex = indexStat && destinationStat.dev === indexStat.dev && destinationStat.ino === indexStat.ino;
|
||||||
const isIndexModified = (indexStat == null ? void 0 : indexStat.mtimeMs) !== defaultTimeMs;
|
const isIndexModified = indexStat?.mtimeMs !== defaultTimeMs;
|
||||||
if (isDestinationHardlinkedFromIndex) {
|
if (isDestinationHardlinkedFromIndex) {
|
||||||
if (isIndexModified && linkStrategy.autoRepair) {
|
if (isIndexModified && linkStrategy.autoRepair) {
|
||||||
atomicBehavior = 0 /* Lock */;
|
atomicBehavior = 0 /* Lock */;
|
||||||
@@ -255,8 +255,7 @@ async function copyFileDirect(prelayout, postlayout, destinationFs, destination,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
async function copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) {
|
async function copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) {
|
||||||
var _a;
|
if (opts.linkStrategy?.type === `HardlinkFromIndex`) {
|
||||||
if (((_a = opts.linkStrategy) == null ? void 0 : _a.type) === `HardlinkFromIndex`) {
|
|
||||||
return copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, opts.linkStrategy);
|
return copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, opts.linkStrategy);
|
||||||
} else {
|
} else {
|
||||||
return copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts);
|
return copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts);
|
||||||
@@ -386,7 +385,7 @@ class FakeFS {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createdDirectory ?? (createdDirectory = subPath);
|
createdDirectory ??= subPath;
|
||||||
if (chmod != null)
|
if (chmod != null)
|
||||||
await this.chmodPromise(subPath, chmod);
|
await this.chmodPromise(subPath, chmod);
|
||||||
if (utimes != null) {
|
if (utimes != null) {
|
||||||
@@ -417,7 +416,7 @@ class FakeFS {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createdDirectory ?? (createdDirectory = subPath);
|
createdDirectory ??= subPath;
|
||||||
if (chmod != null)
|
if (chmod != null)
|
||||||
this.chmodSync(subPath, chmod);
|
this.chmodSync(subPath, chmod);
|
||||||
if (utimes != null) {
|
if (utimes != null) {
|
||||||
@@ -612,12 +611,14 @@ class FakeFS {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async writeJsonPromise(p, data) {
|
async writeJsonPromise(p, data, { compact = false } = {}) {
|
||||||
return await this.writeFilePromise(p, `${JSON.stringify(data, null, 2)}
|
const space = compact ? 0 : 2;
|
||||||
|
return await this.writeFilePromise(p, `${JSON.stringify(data, null, space)}
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
writeJsonSync(p, data) {
|
writeJsonSync(p, data, { compact = false } = {}) {
|
||||||
return this.writeFileSync(p, `${JSON.stringify(data, null, 2)}
|
const space = compact ? 0 : 2;
|
||||||
|
return this.writeFileSync(p, `${JSON.stringify(data, null, space)}
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
async preserveTimePromise(p, cb) {
|
async preserveTimePromise(p, cb) {
|
||||||
@@ -851,7 +852,7 @@ class ProxiedFS extends FakeFS {
|
|||||||
readFileSync(p, encoding) {
|
readFileSync(p, encoding) {
|
||||||
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
||||||
}
|
}
|
||||||
async readdirPromise(p, opts) {
|
readdirPromise(p, opts) {
|
||||||
return this.baseFs.readdirPromise(this.mapToBase(p), opts);
|
return this.baseFs.readdirPromise(this.mapToBase(p), opts);
|
||||||
}
|
}
|
||||||
readdirSync(p, opts) {
|
readdirSync(p, opts) {
|
||||||
@@ -931,12 +932,24 @@ class NodeFS extends BasePortableFakeFS {
|
|||||||
this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject));
|
this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject));
|
||||||
}
|
}
|
||||||
}).then((dir) => {
|
}).then((dir) => {
|
||||||
return Object.defineProperty(dir, `path`, { value: p, configurable: true, writable: true });
|
const dirWithFixedPath = dir;
|
||||||
|
Object.defineProperty(dirWithFixedPath, `path`, {
|
||||||
|
value: p,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
return dirWithFixedPath;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
opendirSync(p, opts) {
|
opendirSync(p, opts) {
|
||||||
const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p));
|
const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p));
|
||||||
return Object.defineProperty(dir, `path`, { value: p, configurable: true, writable: true });
|
const dirWithFixedPath = dir;
|
||||||
|
Object.defineProperty(dirWithFixedPath, `path`, {
|
||||||
|
value: p,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
return dirWithFixedPath;
|
||||||
}
|
}
|
||||||
async readPromise(fd, buffer, offset = 0, length = 0, position = -1) {
|
async readPromise(fd, buffer, offset = 0, length = 0, position = -1) {
|
||||||
return await new Promise((resolve, reject) => {
|
return await new Promise((resolve, reject) => {
|
||||||
@@ -1214,16 +1227,16 @@ class NodeFS extends BasePortableFakeFS {
|
|||||||
}
|
}
|
||||||
async readdirPromise(p, opts) {
|
async readdirPromise(p, opts) {
|
||||||
return await new Promise((resolve, reject) => {
|
return await new Promise((resolve, reject) => {
|
||||||
if (opts == null ? void 0 : opts.withFileTypes) {
|
if (opts) {
|
||||||
this.realFs.readdir(npath.fromPortablePath(p), { withFileTypes: true }, this.makeCallback(resolve, reject));
|
this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject));
|
||||||
} else {
|
} else {
|
||||||
this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback((value) => resolve(value), reject));
|
this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback((value) => resolve(value), reject));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
readdirSync(p, opts) {
|
readdirSync(p, opts) {
|
||||||
if (opts == null ? void 0 : opts.withFileTypes) {
|
if (opts) {
|
||||||
return this.realFs.readdirSync(npath.fromPortablePath(p), { withFileTypes: true });
|
return this.realFs.readdirSync(npath.fromPortablePath(p), opts);
|
||||||
} else {
|
} else {
|
||||||
return this.realFs.readdirSync(npath.fromPortablePath(p));
|
return this.realFs.readdirSync(npath.fromPortablePath(p));
|
||||||
}
|
}
|
||||||
@@ -1357,6 +1370,10 @@ class VirtualFS extends ProxiedFS {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10));
|
||||||
|
const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13;
|
||||||
|
const HAS_LAZY_LOADED_TRANSLATORS = major > 19 || major === 19 && minor >= 3;
|
||||||
|
|
||||||
const builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(`natives`)));
|
const builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(`natives`)));
|
||||||
const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request);
|
const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request);
|
||||||
function readPackageScope(checkPath) {
|
function readPackageScope(checkPath) {
|
||||||
@@ -1384,11 +1401,6 @@ function readPackage(requestPath) {
|
|||||||
return JSON.parse(fs.readFileSync(jsonPath, `utf8`));
|
return JSON.parse(fs.readFileSync(jsonPath, `utf8`));
|
||||||
}
|
}
|
||||||
|
|
||||||
const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10));
|
|
||||||
const HAS_CONSOLIDATED_HOOKS = major > 16 || major === 16 && minor >= 12;
|
|
||||||
const HAS_UNFLAGGED_JSON_MODULES = major > 17 || major === 17 && minor >= 5 || major === 16 && minor >= 15;
|
|
||||||
const HAS_JSON_IMPORT_ASSERTION_REQUIREMENT = major > 17 || major === 17 && minor >= 1 || major === 16 && minor > 14;
|
|
||||||
|
|
||||||
async function tryReadFile$1(path2) {
|
async function tryReadFile$1(path2) {
|
||||||
try {
|
try {
|
||||||
return await fs.promises.readFile(path2, `utf8`);
|
return await fs.promises.readFile(path2, `utf8`);
|
||||||
@@ -1424,11 +1436,7 @@ function getFileFormat(filepath) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
case `.json`: {
|
case `.json`: {
|
||||||
if (HAS_UNFLAGGED_JSON_MODULES)
|
return `json`;
|
||||||
return `json`;
|
|
||||||
throw new Error(
|
|
||||||
`Unknown file extension ".json" for ${filepath}`
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
case `.js`: {
|
case `.js`: {
|
||||||
const pkg = readPackageScope(filepath);
|
const pkg = readPackageScope(filepath);
|
||||||
@@ -1449,54 +1457,32 @@ function getFileFormat(filepath) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getFormat$1(resolved, context, defaultGetFormat) {
|
|
||||||
const url = tryParseURL(resolved);
|
|
||||||
if ((url == null ? void 0 : url.protocol) !== `file:`)
|
|
||||||
return defaultGetFormat(resolved, context, defaultGetFormat);
|
|
||||||
const format = getFileFormat(fileURLToPath(url));
|
|
||||||
if (format) {
|
|
||||||
return {
|
|
||||||
format
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return defaultGetFormat(resolved, context, defaultGetFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getSource$1(urlString, context, defaultGetSource) {
|
|
||||||
const url = tryParseURL(urlString);
|
|
||||||
if ((url == null ? void 0 : url.protocol) !== `file:`)
|
|
||||||
return defaultGetSource(urlString, context, defaultGetSource);
|
|
||||||
return {
|
|
||||||
source: await fs.promises.readFile(fileURLToPath(url), `utf8`)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async function load$1(urlString, context, nextLoad) {
|
async function load$1(urlString, context, nextLoad) {
|
||||||
var _a;
|
|
||||||
const url = tryParseURL(urlString);
|
const url = tryParseURL(urlString);
|
||||||
if ((url == null ? void 0 : url.protocol) !== `file:`)
|
if (url?.protocol !== `file:`)
|
||||||
return nextLoad(urlString, context, nextLoad);
|
return nextLoad(urlString, context, nextLoad);
|
||||||
const filePath = fileURLToPath(url);
|
const filePath = fileURLToPath(url);
|
||||||
const format = getFileFormat(filePath);
|
const format = getFileFormat(filePath);
|
||||||
if (!format)
|
if (!format)
|
||||||
return nextLoad(urlString, context, nextLoad);
|
return nextLoad(urlString, context, nextLoad);
|
||||||
if (HAS_JSON_IMPORT_ASSERTION_REQUIREMENT && format === `json` && ((_a = context.importAssertions) == null ? void 0 : _a.type) !== `json`) {
|
if (format === `json` && context.importAssertions?.type !== `json`) {
|
||||||
const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`);
|
const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`);
|
||||||
err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`;
|
err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`;
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
|
if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
|
||||||
|
const pathToSend = pathToFileURL(
|
||||||
|
npath.fromPortablePath(
|
||||||
|
VirtualFS.resolveVirtual(npath.toPortablePath(filePath))
|
||||||
|
)
|
||||||
|
).href;
|
||||||
process.send({
|
process.send({
|
||||||
"watch:import": pathToFileURL(
|
"watch:import": WATCH_MODE_MESSAGE_USES_ARRAYS ? [pathToSend] : pathToSend
|
||||||
npath.fromPortablePath(
|
|
||||||
VirtualFS.resolveVirtual(npath.toPortablePath(filePath))
|
|
||||||
)
|
|
||||||
).href
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
format,
|
format,
|
||||||
source: await fs.promises.readFile(filePath, `utf8`),
|
source: format === `commonjs` ? void 0 : await fs.promises.readFile(filePath, `utf8`),
|
||||||
shortCircuit: true
|
shortCircuit: true
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1880,12 +1866,7 @@ function patternKeyCompare(a, b) {
|
|||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
function packageImportsResolve({
|
function packageImportsResolve({ name, base, conditions, readFileSyncFn }) {
|
||||||
name,
|
|
||||||
base,
|
|
||||||
conditions,
|
|
||||||
readFileSyncFn
|
|
||||||
}) {
|
|
||||||
if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) {
|
if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) {
|
||||||
const reason = "is not a valid internal imports specifier name";
|
const reason = "is not a valid internal imports specifier name";
|
||||||
throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base));
|
throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base));
|
||||||
@@ -1992,7 +1973,7 @@ async function resolve$1(originalSpecifier, context, nextResolve) {
|
|||||||
specifier = fileURLToPath(url);
|
specifier = fileURLToPath(url);
|
||||||
}
|
}
|
||||||
const { parentURL, conditions = [] } = context;
|
const { parentURL, conditions = [] } = context;
|
||||||
const issuer = parentURL ? fileURLToPath(parentURL) : process.cwd();
|
const issuer = parentURL && tryParseURL(parentURL)?.protocol === `file:` ? fileURLToPath(parentURL) : process.cwd();
|
||||||
const pnpapi = findPnpApi(issuer) ?? (url ? findPnpApi(specifier) : null);
|
const pnpapi = findPnpApi(issuer) ?? (url ? findPnpApi(specifier) : null);
|
||||||
if (!pnpapi)
|
if (!pnpapi)
|
||||||
return nextResolve(originalSpecifier, context, nextResolve);
|
return nextResolve(originalSpecifier, context, nextResolve);
|
||||||
@@ -2002,7 +1983,7 @@ async function resolve$1(originalSpecifier, context, nextResolve) {
|
|||||||
let allowLegacyResolve = false;
|
let allowLegacyResolve = false;
|
||||||
if (dependencyNameMatch) {
|
if (dependencyNameMatch) {
|
||||||
const [, dependencyName, subPath] = dependencyNameMatch;
|
const [, dependencyName, subPath] = dependencyNameMatch;
|
||||||
if (subPath === ``) {
|
if (subPath === `` && dependencyName !== `pnpapi`) {
|
||||||
const resolved = pnpapi.resolveToUnqualified(`${dependencyName}/package.json`, issuer);
|
const resolved = pnpapi.resolveToUnqualified(`${dependencyName}/package.json`, issuer);
|
||||||
if (resolved) {
|
if (resolved) {
|
||||||
const content = await tryReadFile$1(resolved);
|
const content = await tryReadFile$1(resolved);
|
||||||
@@ -2013,10 +1994,17 @@ async function resolve$1(originalSpecifier, context, nextResolve) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const result = pnpapi.resolveRequest(specifier, issuer, {
|
let result;
|
||||||
conditions: new Set(conditions),
|
try {
|
||||||
extensions: allowLegacyResolve ? void 0 : []
|
result = pnpapi.resolveRequest(specifier, issuer, {
|
||||||
});
|
conditions: new Set(conditions),
|
||||||
|
extensions: allowLegacyResolve ? void 0 : []
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
if (err instanceof Error && `code` in err && err.code === `MODULE_NOT_FOUND`)
|
||||||
|
err.code = `ERR_MODULE_NOT_FOUND`;
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
if (!result)
|
if (!result)
|
||||||
throw new Error(`Resolving '${specifier}' from '${issuer}' failed`);
|
throw new Error(`Resolving '${specifier}' from '${issuer}' failed`);
|
||||||
const resultURL = pathToFileURL(result);
|
const resultURL = pathToFileURL(result);
|
||||||
@@ -2032,36 +2020,36 @@ async function resolve$1(originalSpecifier, context, nextResolve) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const binding = process.binding(`fs`);
|
if (!HAS_LAZY_LOADED_TRANSLATORS) {
|
||||||
const originalfstat = binding.fstat;
|
const binding = process.binding(`fs`);
|
||||||
const ZIP_MASK = 4278190080;
|
const originalfstat = binding.fstat;
|
||||||
const ZIP_MAGIC = 704643072;
|
const ZIP_MASK = 4278190080;
|
||||||
binding.fstat = function(...args) {
|
const ZIP_MAGIC = 704643072;
|
||||||
const [fd, useBigint, req] = args;
|
binding.fstat = function(...args) {
|
||||||
if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) {
|
const [fd, useBigint, req] = args;
|
||||||
try {
|
if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) {
|
||||||
const stats = fs.fstatSync(fd);
|
try {
|
||||||
return new Float64Array([
|
const stats = fs.fstatSync(fd);
|
||||||
stats.dev,
|
return new Float64Array([
|
||||||
stats.mode,
|
stats.dev,
|
||||||
stats.nlink,
|
stats.mode,
|
||||||
stats.uid,
|
stats.nlink,
|
||||||
stats.gid,
|
stats.uid,
|
||||||
stats.rdev,
|
stats.gid,
|
||||||
stats.blksize,
|
stats.rdev,
|
||||||
stats.ino,
|
stats.blksize,
|
||||||
stats.size,
|
stats.ino,
|
||||||
stats.blocks
|
stats.size,
|
||||||
]);
|
stats.blocks
|
||||||
} catch {
|
]);
|
||||||
|
} catch {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return originalfstat.apply(this, args);
|
||||||
return originalfstat.apply(this, args);
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
const resolve = resolve$1;
|
const resolve = resolve$1;
|
||||||
const getFormat = HAS_CONSOLIDATED_HOOKS ? void 0 : getFormat$1;
|
const load = load$1;
|
||||||
const getSource = HAS_CONSOLIDATED_HOOKS ? void 0 : getSource$1;
|
|
||||||
const load = HAS_CONSOLIDATED_HOOKS ? load$1 : void 0;
|
|
||||||
|
|
||||||
export { getFormat, getSource, load, resolve };
|
export { load, resolve };
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user