Compare commits
1771 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0fd409c6dc | |||
| f4e7379768 | |||
| ee99191fb4 | |||
| 18124ae32a | |||
| de3373b8f9 | |||
| bdb4e6e2bd | |||
| 0a790de2c1 | |||
| ffb55bfde6 | |||
| c0fbe56f79 | |||
| 342ab0d471 | |||
| aa9fe7d408 | |||
| f499c10f09 | |||
| 45ed7cdf38 | |||
| fa271aaed2 | |||
| 8883476dcb | |||
| c1755ff85b | |||
| 6d04f6c62a | |||
| 53363711bb | |||
| 442ee45e97 | |||
| 8405b337f9 | |||
| facae926ce | |||
| 9544624e00 | |||
| a489fd465f | |||
| 9ff4c0dbd5 | |||
| 36ec16babe | |||
| 92233f2e90 | |||
| efd590976c | |||
| 463cbed7df | |||
| 9138976dad | |||
| ace4d5f6ce | |||
| b09ecb0b06 | |||
| 10fef0f667 | |||
| 3e5945fb9e | |||
| fdf1b2148c | |||
| 7e4d72f959 | |||
| 3e203ea967 | |||
| af56598a58 | |||
| 1fef1fa5f8 | |||
| bd2f68a51d | |||
| 64477f6b3a | |||
| 8b09dfd697 | |||
| f330673143 | |||
| 9351c05126 | |||
| af722e54d8 | |||
| 1eb89844f4 | |||
| 004423aea3 | |||
| 369c6245ab | |||
| b8ae937966 | |||
| 3b510a4f3d | |||
| b3e609d53d | |||
| 2f07a792e9 | |||
| 078bf2bc9c | |||
| a7c8f0b90e | |||
| 495acf4319 | |||
| dce86119d4 | |||
| 2c70b7a360 | |||
| c518185947 | |||
| b314178de2 | |||
| e0a2cec978 | |||
| d3608be1a0 | |||
| 4c79129242 | |||
| 8ac83f1d59 | |||
| 17e6d42989 | |||
| 0a3bbc1caf | |||
| 89e1331e49 | |||
| d934a53e6d | |||
| 2398d60b1a | |||
| 1bd755b628 | |||
| 861d5fa1b9 | |||
| 0239fc6773 | |||
| de57592d79 | |||
| f70f3a0a5d | |||
| 6c96b331dd | |||
| 767e09ee18 | |||
| b2f3ade7c7 | |||
| 8f050b40c1 | |||
| 3cf01ff14c | |||
| 73e0084125 | |||
| 093c9ec015 | |||
| 475dddfbe4 | |||
| 188e4f2740 | |||
| 4dc2b3184b | |||
| 139d541d86 | |||
| 10798c0a05 | |||
| 9c6ad11479 | |||
| 5527ef17f4 | |||
| 981f4010a9 | |||
| db7e8923c0 | |||
| 0eef5c2f01 | |||
| 08901f2e8a | |||
| 51b365226d | |||
| 0b89ee7eb5 | |||
| d7c4b24203 | |||
| d7352867ec | |||
| a2b97bd918 | |||
| 5991a767f7 | |||
| 643eba263e | |||
| 4db8a3992b | |||
| 03f7156749 | |||
| d9912e5548 | |||
| 3c85c985d9 | |||
| 0cf848b9b9 | |||
| ef4056abde | |||
| 3a6c25d42d | |||
| 642c95027c | |||
| 8a66a5c6c7 | |||
| 7dcc55a083 | |||
| 6989fec9d0 | |||
| bba190e4e9 | |||
| 6f670c8cc6 | |||
| d8626c624f | |||
| 454ad25b1d | |||
| 4dce703b20 | |||
| ce1e911c90 | |||
| f84f4dcee6 | |||
| bfa3757ee0 | |||
| 1fea5d7af3 | |||
| dd33bbf6a8 | |||
| 74640b1a82 | |||
| 51e6a74eda | |||
| 27a9812194 | |||
| ba03a9ed20 | |||
| f5c1c62a09 | |||
| 420e719db2 | |||
| c448f53964 | |||
| 72230f67d8 | |||
| 4bdc28d7fc | |||
| eb5195768b | |||
| 5b6539d799 | |||
| b1b471cf63 | |||
| bcd80463f3 | |||
| e2781cb090 | |||
| 09f906f7a1 | |||
| 706ab20ced | |||
| 1dde615686 | |||
| dda8be1fd0 | |||
| 2888877463 | |||
| ac4253a187 | |||
| a6f79d77d1 | |||
| 4ca841a1d5 | |||
| 4d2a8728be | |||
| ae3afdfc7e | |||
| e135b06e2c | |||
| 106843be09 | |||
| 022021dc4b | |||
| 8815b1608e | |||
| 3dcd7743be | |||
| 66fd838085 | |||
| b04852c98c | |||
| ad19bfa283 | |||
| ee86910caa | |||
| 9a4daaf024 | |||
| fcf1202af3 | |||
| 43c402ccae | |||
| 24334a1e78 | |||
| 37e27510de | |||
| fe35e8ea39 | |||
| db49879584 | |||
| df68305f28 | |||
| 078b10ccea | |||
| 1f8a36efb4 | |||
| b0c386ff87 | |||
| 8b69e06f79 | |||
| 24aa4c7406 | |||
| 621c45aaf1 | |||
| 9f67b83bc5 | |||
| da7dfd4bca | |||
| 07250f4ace | |||
| 8b5055d9d3 | |||
| ec36918061 | |||
| c895722ffc | |||
| 7df34db36b | |||
| 3008909f02 | |||
| 8af381729c | |||
| 8ca0aeb1bd | |||
| 99f8ec935b | |||
| d07cfe8fdb | |||
| 2f1b2a32c3 | |||
| b6fd62eb54 | |||
| 1dfe7e0ab5 | |||
| 17c7e9765e | |||
| 0ae03477df | |||
| 2348e95b6c | |||
| 439ecf4a7f | |||
| 68750da731 | |||
| 61de39712a | |||
| d32e6f9839 | |||
| 0cda4621c7 | |||
| 4bcd654e49 | |||
| bf0a0a17a0 | |||
| ca59b6b236 | |||
| 2a6cd98d4e | |||
| d4da2f322b | |||
| 04ce02bb5d | |||
| 62e3bb93c1 | |||
| 7da6b94daf | |||
| e95bd3b6fe | |||
| 8e4c70468d | |||
| 1ea5082314 | |||
| 267cbc751c | |||
| 5e522e1f3e | |||
| ba7ef25bcb | |||
| e132ea33f2 | |||
| d0b19d50e4 | |||
| 226ded6156 | |||
| 8f5abfd0a6 | |||
| 1bf2802b67 | |||
| b95826840a | |||
| 584e2b3ffb | |||
| 69af845ad1 | |||
| fba8eec319 | |||
| 01c0f9b324 | |||
| 86e8ccbbd6 | |||
| 0b45338300 | |||
| eafe6a0d7b | |||
| 3fb41f68fb | |||
| f5c819a489 | |||
| 5336317dbb | |||
| 6099e06a71 | |||
| 0066971b77 | |||
| c417a7f9ab | |||
| 1961b994d7 | |||
| 5288ca3840 | |||
| f985dc93aa | |||
| d6e43c40c9 | |||
| 184c24cace | |||
| 9861cb9aa7 | |||
| 2d722b94bd | |||
| 2db67e3b4d | |||
| 6290232858 | |||
| 7f6bf992a2 | |||
| 1f5bd8d6bb | |||
| 46383e57d2 | |||
| 2611b2c171 | |||
| 229207c8f8 | |||
| 2eb0b3abce | |||
| 8b6909b486 | |||
| dbb9fe44d8 | |||
| bb11001fb7 | |||
| b35457bb53 | |||
| 1ea0d39fa2 | |||
| 9193b3c90b | |||
| c349b50164 | |||
| fe3bc6efe4 | |||
| df138ee96e | |||
| d0b8e560c9 | |||
| 537409cec1 | |||
| bac8ad1040 | |||
| cc26cbeb7b | |||
| 3b6c2bd0e8 | |||
| 0b004fbcaf | |||
| c72c21e2a9 | |||
| d6310a79fa | |||
| 953354f367 | |||
| f8ddb21510 | |||
| 761e89108b | |||
| ec34a84d6d | |||
| 9cb5e6847b | |||
| 43f0c6f7f2 | |||
| ffcad81498 | |||
| f16a337c50 | |||
| 30e5303c36 | |||
| 19d5cb596f | |||
| ff58925606 | |||
| 12b16a0030 | |||
| b08c10a716 | |||
| b878561f65 | |||
| 5e36ad961f | |||
| 3dc2f0cfff | |||
| 073c4fb76e | |||
| cef0bd172d | |||
| 23eed197ee | |||
| 3f8f76df76 | |||
| b047023d9c | |||
| 420655f231 | |||
| 520ab88a97 | |||
| f96da50e6a | |||
| 1dc42daed4 | |||
| 0a80e2f5ec | |||
| 4661d2019c | |||
| 4e4e7b705d | |||
| bae1b0be72 | |||
| e890ee01a3 | |||
| af4b0757a9 | |||
| 6ef62d82c4 | |||
| 44df509b62 | |||
| 5d3fe2a5ea | |||
| 076e6dce73 | |||
| f745320456 | |||
| 6e64aaa1ee | |||
| 8b68edfc05 | |||
| 0a7bae4dac | |||
| b925a573f3 | |||
| 0012bb21ce | |||
| 3b3ec9fc4a | |||
| 396663d65c | |||
| f275b47755 | |||
| cfb7481d7e | |||
| 57fcce90d9 | |||
| 2c0ea0c108 | |||
| e81317b72c | |||
| 686cf9dc7e | |||
| a9e7cda37d | |||
| eae0b8a95e | |||
| 1b65b1d596 | |||
| d85b1fe2fd | |||
| f00006af1b | |||
| 75a07fe4ef | |||
| 946e429906 | |||
| 2e5a401ff7 | |||
| b8b84d8d16 | |||
| 4373538476 | |||
| af79ea2f72 | |||
| aab859bc20 | |||
| c692c16183 | |||
| cb59808be2 | |||
| 039777bf63 | |||
| 3547ec13c3 | |||
| 3763577451 | |||
| c6618049f2 | |||
| 28d6aa9885 | |||
| 568786e4f6 | |||
| 2aad2d29de | |||
| 400354ee9e | |||
| ea3ba78d1a | |||
| 38614ee526 | |||
| 15ad6bb5f8 | |||
| 15f431ada6 | |||
| 5163acc6ef | |||
| f9297d783a | |||
| c34a02c06f | |||
| 61ed1fb202 | |||
| 87638ba6c5 | |||
| 26b4100bb0 | |||
| 1157c2adf6 | |||
| 8613d3288b | |||
| ab008fbdff | |||
| 0b30197280 | |||
| 89a121f21e | |||
| 045a8c56af | |||
| d83c11db8c | |||
| 7efe14b835 | |||
| 37116aecf9 | |||
| 9a606e8f2a | |||
| b1e65ed500 | |||
| 26f3dbff06 | |||
| 5ee0b188bd | |||
| 4692cd6a55 | |||
| 7ad8c01853 | |||
| bc27b45fd7 | |||
| 94cc28d377 | |||
| 19e80cef3b | |||
| 5397cd3194 | |||
| f01af9c0ec | |||
| a288010d02 | |||
| b9a7a1c32b | |||
| 65b9a0dce5 | |||
| 7464006e19 | |||
| 590d56b7e7 | |||
| c75cb1e87e | |||
| 597b2f4a6f | |||
| 2e84c6bbb2 | |||
| 06c0cd5297 | |||
| 79eab3d62f | |||
| 6527723a0e | |||
| 3d6652f132 | |||
| da5d9779d4 | |||
| 865399e753 | |||
| 960ea6c8dd | |||
| 39ab48f0cb | |||
| 7341b4cf61 | |||
| 28c5acc6af | |||
| 4366eefc66 | |||
| cb95e761c1 | |||
| 7136748463 | |||
| b0cacfd75c | |||
| 81f03dac79 | |||
| e37d1eadcd | |||
| 23fb310374 | |||
| 797a1732d2 | |||
| c405a417e9 | |||
| 808deb1d77 | |||
| 6ac1473ec3 | |||
| 9c183abf4b | |||
| 33c33faae9 | |||
| 4cccbc2039 | |||
| cc061dedf8 | |||
| 402ce2210f | |||
| 329c5c4070 | |||
| 878aeb7a8c | |||
| 3ee396d788 | |||
| 090037602c | |||
| bee77051e7 | |||
| be6741a4a8 | |||
| 3e9b440322 | |||
| dfea5bc77c | |||
| 1eef30e298 | |||
| e5b9a9de3f | |||
| dfedd3a6e8 | |||
| a19845b4ca | |||
| 094f6f5a7a | |||
| fa60edce2b | |||
| ba44652457 | |||
| 931be39912 | |||
| 5048a27acb | |||
| 71fc615b31 | |||
| 20ed4e22ef | |||
| fc2d337a39 | |||
| 31d96f3862 | |||
| 7b43853ec6 | |||
| 40fa913272 | |||
| cdd5482aad | |||
| 4a3fa20ee7 | |||
| d49ed4cd47 | |||
| db3cf77f5b | |||
| c4a08961d6 | |||
| 5ba1643d46 | |||
| d189f425e8 | |||
| 0fe6fb83ac | |||
| f15ae41f48 | |||
| 46a07fc72e | |||
| 83af317739 | |||
| f4db1b2735 | |||
| 6d4922f419 | |||
| 6af098ee8a | |||
| 1dcb2ebcac | |||
| f65cb463cc | |||
| 2b4ce97f8a | |||
| 25abf319ab | |||
| 77807ab42a | |||
| f21990b14f | |||
| 1873d10e95 | |||
| 32ff3f3136 | |||
| 354b0aefb0 | |||
| aaa70a9aab | |||
| 3b90739087 | |||
| acaae993a5 | |||
| a74f0322e2 | |||
| 1a0286f6b0 | |||
| 64182483e2 | |||
| 87a25fba62 | |||
| 12803536fa | |||
| f160b34b34 | |||
| cca7da9da2 | |||
| 01cf5f3bdc | |||
| 33a928a9ea | |||
| c83443a41a | |||
| 374007bffd | |||
| 092382f319 | |||
| 79a0532e1d | |||
| 56c7c8b1ee | |||
| 722fe7b71e | |||
| 759793b2e3 | |||
| 99c6cd0371 | |||
| 9fbc5ab8de | |||
| 75ac2c9961 | |||
| 87330dd863 | |||
| 38fe9302cf | |||
| 33a455c593 | |||
| 37db0ac58d | |||
| 2cbf50b1cc | |||
| e26923eb19 | |||
| 3e63bcfb11 | |||
| 1e1c18c4a1 | |||
| 953e7fc918 | |||
| 8e147dbe0c | |||
| 86dbd5d1dc | |||
| e85ecfacba | |||
| f210532870 | |||
| 6c9ca686cb | |||
| 35b556d4a3 | |||
| c83339404a | |||
| 4172def1a3 | |||
| c99481ea8d | |||
| a11ddf6564 | |||
| 917a70fbe9 | |||
| 486d6818ba | |||
| 807b9d4c45 | |||
| 0013e78b1a | |||
| 9dd46c83fd | |||
| 1eb6bb8aa9 | |||
| 6c86946614 | |||
| 612b016a15 | |||
| be8beacaec | |||
| 4d316c5524 | |||
| 7fee5d6a87 | |||
| 0dd1aa5a5b | |||
| ed65ba4a73 | |||
| d39020370c | |||
| c18ba11819 | |||
| 5fbd7226eb | |||
| c9e27fd586 | |||
| 51b80eb09b | |||
| f409e9f329 | |||
| 304e6aaad5 | |||
| 3c5d02043e | |||
| 63980f63d4 | |||
| facd2b2131 | |||
| 25452588cc | |||
| 195d8c42fc | |||
| fe04b9d32d | |||
| d03b3aeb5f | |||
| 2ee33e70f7 | |||
| e9209629f7 | |||
| fa1e6bf5e6 | |||
| 93c3b10bf7 | |||
| 56cb2e3b07 | |||
| eabfb2457a | |||
| 317ab442ee | |||
| 2b24b36da6 | |||
| 161d59d01d | |||
| 821b75ed26 | |||
| 1f901e68d3 | |||
| 46d94a6a8f | |||
| 44c2146505 | |||
| ec2f1f5931 | |||
| e86c59f4ec | |||
| 6df6813a17 | |||
| f73679e2a6 | |||
| 68b866921a | |||
| 35364d615a | |||
| f64dd2a99c | |||
| a309a75a4d | |||
| c2e2f7cad9 | |||
| f69b92b153 | |||
| f8760fdd6b | |||
| caa4daabe2 | |||
| 67f685af26 | |||
| b2a8b5653f | |||
| 9232f019e1 | |||
| ac371664af | |||
| e4cca81124 | |||
| d76d2b86d2 | |||
| fcd2d6eea2 | |||
| 067064d19c | |||
| 52cdfb98a4 | |||
| 41261afcc4 | |||
| 77f71fdeb7 | |||
| ce0032e7e5 | |||
| c97ca350ad | |||
| 90abcb2cf7 | |||
| 8626172faa | |||
| 44ef97c656 | |||
| 7661fe5309 | |||
| beb02c871d | |||
| 8a47320272 | |||
| 114c8990a3 | |||
| 7e2d48ac6a | |||
| dbb6667889 | |||
| 29a02131d2 | |||
| 5d887f1cfb | |||
| 18f0e73ed4 | |||
| c4c1425c9b | |||
| 00bb3934ad | |||
| 324096e14e | |||
| 9cad2bb308 | |||
| eec537135a | |||
| 53e42d3350 | |||
| e74122977a | |||
| f32c3ebe2c | |||
| d07ac4fef0 | |||
| 183761b01f | |||
| 361ef70ce8 | |||
| 2bac0a4e5b | |||
| b89a68bb9c | |||
| 496dadebbd | |||
| 155a4eecd4 | |||
| 5eec1b6f7b | |||
| e2ce9472cf | |||
| 06f0b69cfb | |||
| 0ae43fde72 | |||
| 32f5b7e5c4 | |||
| e3a804ca64 | |||
| 6a3ee289b3 | |||
| 02a8605fec | |||
| dbd72e6bbf | |||
| d629c95daf | |||
| 04d6e8e7f0 | |||
| 7caf95158d | |||
| 8245448f29 | |||
| 4d85bcd60e | |||
| d8d156adac | |||
| 7d02c84c47 | |||
| a5d70b8c37 | |||
| d42cd9ffac | |||
| 1b19c83998 | |||
| c0be8bef23 | |||
| 90bc2d0b60 | |||
| 1c747f69f5 | |||
| 57914c7488 | |||
| 1939222d31 | |||
| c29f5fab7a | |||
| adb2cda614 | |||
| c462441f9e | |||
| 2681f6897d | |||
| 2322c67aff | |||
| f645663fd8 | |||
| f2f4d4b827 | |||
| 85108cfcb5 | |||
| 308bd355e2 | |||
| 4ab032c717 | |||
| 17a117d1ee | |||
| bc43cc232d | |||
| 94ae9e65f4 | |||
| 2ed7158cf1 | |||
| 9d8a21a3de | |||
| d313eaa742 | |||
| c5d91e7cca | |||
| cc668a1624 | |||
| d17173ec0a | |||
| ebcd886d20 | |||
| 4976bd1889 | |||
| 9da6d92fb3 | |||
| 9dee5429d5 | |||
| ebe90aac5c | |||
| 289d69c79d | |||
| 5bdaf4f662 | |||
| 67f47bc3df | |||
| 67ddd76ff3 | |||
| 95de883879 | |||
| 3227da122e | |||
| ae243c783a | |||
| eb3b7f5146 | |||
| 414439cac9 | |||
| 7dacccb70e | |||
| a5e1d0595e | |||
| 7e8c6e92a2 | |||
| 24542d4e21 | |||
| b975125af5 | |||
| cc8c60605b | |||
| 23adc15ce3 | |||
| 7204aa0c9a | |||
| 6750429cd4 | |||
| cfe0a6cbb8 | |||
| a9f95971e8 | |||
| d7eee844b7 | |||
| 4c52731d16 | |||
| e53447d0bf | |||
| 53ed23ac58 | |||
| 226fb4a349 | |||
| d89632eb9d | |||
| 4621196993 | |||
| 988e753c74 | |||
| aa49b2ca76 | |||
| fdcd2fdb27 | |||
| 62f94206bb | |||
| 7b6647cfd4 | |||
| 73828c5db7 | |||
| e1d942bb3a | |||
| a764cf64b3 | |||
| 018d51993a | |||
| 4ce51291de | |||
| e0cd68787d | |||
| 6601f4c505 | |||
| 6f62f0e2f1 | |||
| c00026e203 | |||
| 38ac365953 | |||
| 7cfb0f7d2d | |||
| bae194f366 | |||
| 398d95528d | |||
| d1b2ee5490 | |||
| d39b9bc060 | |||
| 0c0b7d86ee | |||
| 03c4d9504f | |||
| 0737bfc5fe | |||
| 80b4916094 | |||
| 00845b43b4 | |||
| 83a74808d5 | |||
| 951679cc10 | |||
| 3cd95f06b2 | |||
| de00fa91ae | |||
| 25d4f0b347 | |||
| 413aa28594 | |||
| 29e153bc54 | |||
| 7b1a2f60d0 | |||
| 2302626703 | |||
| 28b3193743 | |||
| 0fdf8d0f6a | |||
| 890c93a820 | |||
| 3bfcde99dc | |||
| d5a8d19b66 | |||
| 7a3a9a6f7c | |||
| a816c52699 | |||
| bdd3157a45 | |||
| 7337e75d1e | |||
| b39f1694c3 | |||
| b3a919293c | |||
| 927eb1d0ba | |||
| b812c6d984 | |||
| 6a768c3f84 | |||
| 83f4e65bc3 | |||
| ad33abe6bc | |||
| 2e1624235c | |||
| 647f09f2f3 | |||
| d0ad2bd38b | |||
| 3ae4e11bbe | |||
| 6f19a3e750 | |||
| e8442eedad | |||
| a606db25f6 | |||
| 82f715bab6 | |||
| 28914b878c | |||
| 3c2f1709cc | |||
| 40ffde33b6 | |||
| 8184c21a80 | |||
| 5c13d0c2df | |||
| fd8fd22bdc | |||
| 31d8669c9d | |||
| 59e1fbf565 | |||
| 80c9bb0317 | |||
| 6c71bad8ef | |||
| 0e82f6287a | |||
| 52aacc1e1d | |||
| 909b4a5432 | |||
| b48b724c01 | |||
| 91ac1567d4 | |||
| c034035aba | |||
| cd852f9563 | |||
| 010ac6e5b6 | |||
| 0a3cf46068 | |||
| 2bbeeb860d | |||
| b74045fe55 | |||
| a940102d83 | |||
| 74e9d5eb3c | |||
| b256d66374 | |||
| 5b23e60b04 | |||
| 4cd71decbc | |||
| 1ba372e2c3 | |||
| d88f8c87f6 | |||
| ff02ab2aa0 | |||
| 38c71bdb3b | |||
| b68ce9695c | |||
| 0d3e7bd996 | |||
| 1e0acf4ce8 | |||
| b9e8e084a8 | |||
| 1701d4253d | |||
| ff60b71321 | |||
| f68439b936 | |||
| a3fe3944b7 | |||
| 9cf44777e1 | |||
| 5206c2c971 | |||
| 294fd10304 | |||
| 32650f8b9a | |||
| c5d96db9a8 | |||
| d04c66006b | |||
| d43529dce9 | |||
| 5ba95f3cbc | |||
| 7381e5b393 | |||
| b62f00dfd7 | |||
| 95787fcc66 | |||
| 4ef76f72dc | |||
| 939f33e791 | |||
| e15ade91d4 | |||
| 0776cc884d | |||
| 0ad09eb11f | |||
| 9e8b37c6cf | |||
| c2839934b4 | |||
| e2e3c3a9b3 | |||
| 9b3f4bc1a3 | |||
| cf9c34950f | |||
| d4a2927279 | |||
| 56172b1e5c | |||
| 7def5437fd | |||
| d21e364f11 | |||
| 7c6440fd9a | |||
| 0b61207ecf | |||
| fff2f40924 | |||
| 2166929fa8 | |||
| 5aa53da864 | |||
| 21d7ff2f74 | |||
| 8bba30e290 | |||
| fd94a32b95 | |||
| 25f9aa8c2d | |||
| 172bb4527c | |||
| 8ad769569c | |||
| 32eba22628 | |||
| 8d4179b5df | |||
| b7385825b6 | |||
| 5a20528cc8 | |||
| 324cf161ec | |||
| 9f84e77f57 | |||
| beaf0a9ecb | |||
| fb308e8038 | |||
| d2d15dae9f | |||
| 977f064157 | |||
| 8d23dd0186 | |||
| 90ae06df2a | |||
| 2cf253a914 | |||
| 9e462cc329 | |||
| 36ae8910b6 | |||
| fe0ed0bc9a | |||
| ec738515b7 | |||
| 287b6c6bc7 | |||
| aad93b9147 | |||
| 31176245bd | |||
| da45c7e2b9 | |||
| 3c73cb3fed | |||
| 275d01421e | |||
| 75edfccc31 | |||
| 1d230d9fed | |||
| 7d87dbf2ed | |||
| 44467331a2 | |||
| 29cbfd4fb3 | |||
| d946408105 | |||
| 6101372ba8 | |||
| 4993860a18 | |||
| 5e29119e83 | |||
| fe14664cfd | |||
| f871817a2f | |||
| 6ccacaa92e | |||
| 24e0f04aca | |||
| f878d499a7 | |||
| c24cd1c02b | |||
| c6028fca44 | |||
| 25daa5b358 | |||
| 0503a2a517 | |||
| 28fd3d9b18 | |||
| 1a9af1dee4 | |||
| ce27de1af6 | |||
| c9d5334a38 | |||
| bd20b7b8e0 | |||
| 52f40c8c26 | |||
| 622dd6aba4 | |||
| 969a6a1f2c | |||
| 08eab9622d | |||
| 107960b67c | |||
| b394f5e43f | |||
| 4d71a5c9d4 | |||
| 59e2216861 | |||
| 2fba5da04e | |||
| efbe2ddbf7 | |||
| 7f353723eb | |||
| a94d50f3cd | |||
| ae66e6f01a | |||
| e4b0b1e305 | |||
| 65ca2560fc | |||
| bdbf04efe9 | |||
| 4b56671d2d | |||
| f2b190b21a | |||
| 4f5cf931be | |||
| 68beefdaf2 | |||
| 4a52fd2edc | |||
| 47fdfb344d | |||
| ebbbc85d7b | |||
| 22ff2c36d9 | |||
| 5db2a1bb84 | |||
| 8a4ae0df20 | |||
| 80c3e48f5c | |||
| a7244032e4 | |||
| 7fc3ff26bc | |||
| 0648d230fc | |||
| 2626608200 | |||
| 081ef45047 | |||
| 9aa9ebc23f | |||
| f664a10024 | |||
| 52beb2f012 | |||
| 149e3c2d84 | |||
| 223965757c | |||
| 27c1d2516b | |||
| 014a97fcdc | |||
| eb85cc5c14 | |||
| b1d49d71ea | |||
| 9a0a6305e7 | |||
| a218bce73b | |||
| c94ca54aff | |||
| 2e8cd805fd | |||
| 1a9bb4ddc5 | |||
| e7f7c0704a | |||
| b5e0fb0e97 | |||
| f555989a5c | |||
| 2e0ea4520c | |||
| 31a9164df1 | |||
| b363a1e60d | |||
| e5714f9047 | |||
| e9b9c77edc | |||
| acd49994bd | |||
| 5264674cda | |||
| 2825925781 | |||
| 083bd7f1cf | |||
| 3f90fe04b4 | |||
| a63a247b22 | |||
| 7bb589b8f7 | |||
| 7c94ea3ec5 | |||
| 5789ae3c73 | |||
| 95fad3deb8 | |||
| 2b5b8d7931 | |||
| 96e0fb81ae | |||
| e5a568f510 | |||
| 8cb3155ea6 | |||
| 52c5d93449 | |||
| 5e3502f589 | |||
| f1fd36d3a1 | |||
| 9f49b7f4c0 | |||
| eca89e538b | |||
| bbac63e162 | |||
| ed3123470a | |||
| 170bda3158 | |||
| b5a8eec650 | |||
| 817b4ed133 | |||
| e4837cea9d | |||
| e1cdeb284f | |||
| f195933cb6 | |||
| 6e1d91b413 | |||
| d4e39de67e | |||
| 4903cfc689 | |||
| 54a8e26c7c | |||
| 4cc9006c8e | |||
| bc6492b1c4 | |||
| afd05f93fc | |||
| e83f5e7cca | |||
| 7b8e02023e | |||
| 3882f531cf | |||
| 0ce58b5c0f | |||
| f36a1c60f4 | |||
| 98fcc5d2d4 | |||
| 6ff2ee23f8 | |||
| e1405b140f | |||
| 04ab709ddd | |||
| 0736c68d77 | |||
| 34ccf345cd | |||
| 605a38d8ab | |||
| c9fd8ccae2 | |||
| 43482b1b96 | |||
| 81912b2530 | |||
| 2db2e7a369 | |||
| 3589d26fb3 | |||
| e5282fb264 | |||
| 61fddbb8af | |||
| e141aa3ff4 | |||
| 2fa1536315 | |||
| 5607dcfae9 | |||
| bd103802f9 | |||
| 0cbf427a58 | |||
| e53cd477f9 | |||
| df61f29a02 | |||
| feda01ab3b | |||
| fb2684c0b3 | |||
| 89e4b80e65 | |||
| d55fe2d100 | |||
| 49a510aaf9 | |||
| 16a5504a32 | |||
| b720c27c2a | |||
| cad3453e32 | |||
| afe0a8a159 | |||
| 2487e815a3 | |||
| 771348dd5e | |||
| 1f76e1228a | |||
| fe782e5ff8 | |||
| b4167a38f2 | |||
| 61459a197f | |||
| 30b6cc646a | |||
| df95d4e29f | |||
| 5090b64e57 | |||
| 12d188d85a | |||
| ab3e45d933 | |||
| 8c979cabd7 | |||
| a617922c1d | |||
| fec7cd65a7 | |||
| 10cfdb2fa2 | |||
| 43a62d8bec | |||
| 7b32b7ecd6 | |||
| 2fcd166d32 | |||
| d8c673157b | |||
| 99316df879 | |||
| 5a4fa3d2b3 | |||
| 71ececd7ce | |||
| 74519c08f0 | |||
| a85f19e016 | |||
| cfe887341d | |||
| eab17c3467 | |||
| 87c598627f | |||
| 30dc840144 | |||
| dd0e2d0bd2 | |||
| bf0da9ccff | |||
| f430bcf54a | |||
| ec4ef9ab7e | |||
| d01432e742 | |||
| cbb3e17e5d | |||
| 618bc927e9 | |||
| 047c4f4baa | |||
| 3aea158edc | |||
| ed3b93493d | |||
| 410efe1192 | |||
| 58473f1cce | |||
| 399c9df1f3 | |||
| cdfb2d1263 | |||
| 9073a60ce6 | |||
| e9295bee2e | |||
| d1321106c2 | |||
| 8d2dec28e8 | |||
| ea426965de | |||
| 86dfeae727 | |||
| 861cd6acee | |||
| e9055f0914 | |||
| 9e4ada241c | |||
| b13fc5cfe8 | |||
| 35641e3af6 | |||
| df86706199 | |||
| 1f3251ceea | |||
| a1917da1b1 | |||
| e9208bdeaa | |||
| 9ad86e6a62 | |||
| a9bcb00d8b | |||
| 1a0b2aeee1 | |||
| 7d45996bf1 | |||
| 594d7f94a2 | |||
| 5252da6abb | |||
| 4fa3b2161f | |||
| 87732f25ba | |||
| a4a0958ba4 | |||
| e2c8b82ed2 | |||
| 8f060f6868 | |||
| 6ae783c03e | |||
| ed1d9d88de | |||
| f6565eb8ea | |||
| a47cdb5a15 | |||
| 6d45c9966e | |||
| 77753aa5d7 | |||
| 9e00992387 | |||
| 2ef99d8383 | |||
| a03912b804 | |||
| d0ffedfef7 | |||
| d68f093c90 | |||
| 2fc948de76 | |||
| 1dc4783459 | |||
| 18a22001bd | |||
| 1e4bf3043c | |||
| ad48f9bb19 | |||
| 0349f949c4 | |||
| 9b2f741df0 | |||
| 0da4b43d25 | |||
| c8f46ed760 | |||
| fb036e0712 | |||
| ed966f0d18 | |||
| 05c4076a5f | |||
| ac054705a1 | |||
| ab66372ebc | |||
| 2ff093e0ff | |||
| 3a13a22f8a | |||
| 24d2739480 | |||
| 7f15cee11a | |||
| c389fdce04 | |||
| e87d926a5a | |||
| 0bbbc91e53 | |||
| d0edb4489c | |||
| 4bff8b98db | |||
| 03d832ddc1 | |||
| ab01ef855b | |||
| 9e2b2d3b42 | |||
| ce749a0f11 | |||
| d0e52f6186 | |||
| 6cc5808139 | |||
| 8a2cd974fd | |||
| 8e189cbf2b | |||
| 83b7eb8163 | |||
| eb8350647e | |||
| 69e0f43326 | |||
| 7c81259d76 | |||
| b1868a7e62 | |||
| 63156f5140 | |||
| 40bf79a5a2 | |||
| 621350e0fc | |||
| b698da85d1 | |||
| 36c1b30910 | |||
| c6b208b577 | |||
| 6940e8c9c1 | |||
| 575875e807 | |||
| 158504b5c9 | |||
| 611505d43c | |||
| 244efd2ae3 | |||
| 7cd2fae578 | |||
| 6fa22bb7e4 | |||
| d0c04275f6 | |||
| d62eaa2e30 | |||
| 09a40b8d36 | |||
| 9eb194bac2 | |||
| 1113cac7ff | |||
| 769068e93c | |||
| 881689e497 | |||
| 1af6530888 | |||
| 003fa52793 | |||
| a54552c451 | |||
| 26c3a84bfd | |||
| be3c060f38 | |||
| 435f67c5ab | |||
| 1ea3f3d755 | |||
| 8a2dde52f8 | |||
| 7622f48c00 | |||
| 4876d76a49 | |||
| 0b05355e25 | |||
| 89690d76b5 | |||
| a9cf074d82 | |||
| 86f46f5162 | |||
| 693abac7fc | |||
| f79d90bfc3 | |||
| bf347aa5d3 | |||
| b2f350f3f7 | |||
| d5f359d59d | |||
| ab4cb6d484 | |||
| 33517b2c0e | |||
| a9193cfe15 | |||
| 10c2870d8a | |||
| 6894965575 | |||
| 8631a8c559 | |||
| a0418c7f5c | |||
| ad86902073 | |||
| c7d274117c | |||
| 67606e7cee | |||
| e0baafeb7d | |||
| 795577ede0 | |||
| 9a4094d115 | |||
| b3ccfeb015 | |||
| bfaf75c8dd | |||
| 35b669eae8 | |||
| 1893afbdbb | |||
| 17430fb921 | |||
| f09d7254a7 | |||
| 4fe10eb8fa | |||
| 562ba869e2 | |||
| bcf5313498 | |||
| 97bf4d00b1 | |||
| 37486dc87e | |||
| 2b15edb75a | |||
| 926a9c7c78 | |||
| 07f146e86d | |||
| cb6d412002 | |||
| d4fcf043ad | |||
| 6947292adf | |||
| 2270fcdc67 | |||
| cff0498646 | |||
| 62c7db3650 | |||
| 3a91f03340 | |||
| 7bcd0b350e | |||
| 99fb735b5b | |||
| 8e25e3f9a0 | |||
| a43512b117 | |||
| da67607eda | |||
| 8e98810682 | |||
| eb1804339c | |||
| f63df323cf | |||
| 468487d815 | |||
| 0ff8f72668 | |||
| 8df7018b4f | |||
| b5cc1b4c6d | |||
| 2b655707e4 | |||
| 853132453e | |||
| a922f28e86 | |||
| 26e4f2b9f7 | |||
| 1030662c93 | |||
| db3de3841f | |||
| 3d9d6982e4 | |||
| d8a5ad7107 | |||
| e9b9bd8ff9 | |||
| 43a94bfa2c | |||
| b75401bc7b | |||
| 1cebf76b85 | |||
| c113e78c33 | |||
| 4abdc51934 | |||
| a7c10e1c80 | |||
| a9bb37416a | |||
| 400836841a | |||
| 81b37f3408 | |||
| 7fa663f1af | |||
| b6b6005c7d | |||
| 4015a4eac7 | |||
| b458316bef | |||
| ec819c66d8 | |||
| c4d678c439 | |||
| 6edbafff47 | |||
| 5439611d83 | |||
| b0f9fe9265 | |||
| f10501b9cc | |||
| 3400d6c9ab | |||
| 8aeead7e5e | |||
| 41d9498999 | |||
| 284f217163 | |||
| b35d5e35fe | |||
| 499ae4213a | |||
| 9f1681a89c | |||
| baeb11d7fb | |||
| c1907d4e00 | |||
| 0a898900bf | |||
| 0258c394b6 | |||
| 9b6991504c | |||
| 18d0de2366 | |||
| 5f6352b123 | |||
| 9a5c8cbbb7 | |||
| 9d7cfb39aa | |||
| f3f65068fa | |||
| c74a456168 | |||
| 5806c687b6 | |||
| 3436a5ec8e | |||
| e6de29a5ab | |||
| 7e2b134991 | |||
| 288a891c8a | |||
| 25fbc80dd7 | |||
| 3e032e4fca | |||
| b391b81209 | |||
| bbd0d9d31f | |||
| b8c09f6784 | |||
| d217535fcd | |||
| f9b106642d | |||
| 1dac117ed3 | |||
| 0392c7c6c6 | |||
| 5ba72a59c4 | |||
| bfdd3bc361 | |||
| e06b4cfc84 | |||
| 0153c4f900 | |||
| 85f74ce761 | |||
| 639c88d3c9 | |||
| 4aac1f9662 | |||
| 38244b8f98 | |||
| 593372a508 | |||
| c24a9695b6 | |||
| f7516db415 | |||
| 3d520a8867 | |||
| 3a152d0d80 | |||
| 787cc20028 | |||
| 6d28e5f7f0 | |||
| e57769d90c | |||
| b65aa5f9cf | |||
| a95e3855c0 | |||
| 50a3868c67 | |||
| 4f3e314063 | |||
| 885aeb542a | |||
| 933e91e45c | |||
| 3b8ea9b712 | |||
| 09e67dfba9 | |||
| a12f464c4a | |||
| 08bd69ddf8 | |||
| 3862cc069c | |||
| cb37705085 | |||
| 06785525eb | |||
| b046e4a110 | |||
| 92fba7b0b8 | |||
| 976c56a6bb | |||
| 50ddfb8a2e | |||
| 84f41eb69f | |||
| bb18f18d22 | |||
| 94d17dd033 | |||
| e340abd386 | |||
| 2231fc23e1 | |||
| f73ecb6898 | |||
| fc33d3e2ca | |||
| 88c249299f | |||
| 224e5e412a | |||
| c6545d5d6f | |||
| e0b1e021ec | |||
| 235dc6cd02 | |||
| 2858d742e1 | |||
| df26167474 | |||
| a11dea6e7f | |||
| 6d705e5db7 | |||
| d636360ec5 | |||
| 3693df7ad2 | |||
| d15b6ac79f | |||
| 786f2e16ef | |||
| 7c5eb6a3a3 | |||
| af258acf3a | |||
| 21e6f8668d | |||
| d123d1cddd | |||
| e4aa66e213 | |||
| 8e8c6641aa | |||
| 9e3b5707cf | |||
| bc1e0bed1d | |||
| 2306650aa5 | |||
| 5136dd6698 | |||
| 50622ff917 | |||
| 1f217ed4a5 | |||
| 8666358722 | |||
| 70b850140d | |||
| 2d411b4924 | |||
| 4a15d0e822 | |||
| 258c027b2d | |||
| 114c23ab09 | |||
| 396206ca03 | |||
| 1412feba15 | |||
| 4b1fcb7ec6 | |||
| e927f5df5e | |||
| f238d6bfb9 | |||
| 2c0f3ac905 | |||
| 7f08400432 | |||
| f16c2ea0cf | |||
| c2d61f1011 | |||
| c458ee780b | |||
| 10674786e2 | |||
| 65aa12de02 | |||
| df29a37c6c | |||
| 6cafe077b4 | |||
| 7a0c33cd49 | |||
| 4b7c16641b | |||
| 5cfd895f0e | |||
| 08e8ccb3f0 | |||
| 973bb8a076 | |||
| efe84d6a0c | |||
| 7823041b4c | |||
| 055b742b66 | |||
| fa0c9015ae | |||
| c6372bfc0b | |||
| a46bb7c2f7 | |||
| 1a010b7f12 | |||
| da7b020dbb | |||
| f88952d8f6 | |||
| 064cbce172 | |||
| a42a1b231e | |||
| e0e618ac1c | |||
| f6ea37381a | |||
| 214546d17a | |||
| e851cefb39 | |||
| 7030acfa77 | |||
| efe23c01a7 | |||
| 45e4bf0b97 | |||
| b679539c0f | |||
| de8421d966 | |||
| 8c6f8c3b01 | |||
| 504682e9bf | |||
| f0090ca7b5 | |||
| fb862123db | |||
| 89981810d1 | |||
| cd916fdca2 | |||
| a3ccb9950f | |||
| 036bb523bd | |||
| b24317bf9b | |||
| 354e3090bf | |||
| 337a0b9cb5 | |||
| 626ee69dea | |||
| bd2727415f | |||
| ec541338b6 | |||
| c4fbd92b49 | |||
| e49a392e8e | |||
| 6374ef5e6d | |||
| c8e3894559 | |||
| f4216b98ec | |||
| 3dfecdf5d2 | |||
| fbcbd456e3 | |||
| 18afbdec46 | |||
| 7db43b91f1 | |||
| 4071a8c280 | |||
| 3b7028618c | |||
| 0715fdaaba | |||
| 888810c5ae | |||
| 5cef31f1bd | |||
| 3d0ae35156 | |||
| a3d03bdb35 | |||
| 5d52b206c4 | |||
| f05a8cd823 | |||
| 664f2e6623 | |||
| 389d6fe9c6 | |||
| d3c767362c | |||
| 2892e3b36f | |||
| b17de99331 | |||
| 9d8557fbed | |||
| 35c3a4e613 | |||
| 00c9da8de9 | |||
| dfc5fec14a | |||
| 85eca607a1 | |||
| 8973001ec8 | |||
| 5a1e7412d2 | |||
| 8095612d30 | |||
| 2259b812a2 | |||
| 5af6549a0f | |||
| 6d3a590ce8 | |||
| ce5be558e3 | |||
| eb6f1dadd1 | |||
| 2ed7e9f724 | |||
| ecea028fc0 | |||
| c76a7343f9 | |||
| 1281a5e9aa | |||
| 763d09b952 | |||
| 6d3b96aa20 | |||
| 7f9447f403 | |||
| 37836b938b | |||
| b8605f82a8 | |||
| c81b5931c8 | |||
| 3d4aa61a3d | |||
| 21ee76b6b2 | |||
| c4b65e0b96 | |||
| 11e2d2d0e1 | |||
| 149a849a7e | |||
| 18c4ede771 | |||
| 6c3cb7f5d1 | |||
| 945854c671 | |||
| 52460e5977 | |||
| 60d571198f | |||
| 54f73a5fd5 | |||
| ac6d7d7a7a | |||
| 9c35cae103 | |||
| ae358f9d41 | |||
| 786731b4e1 | |||
| 3af3db6a4a | |||
| 4c889cf6f0 | |||
| 89aa546b42 | |||
| 695c4a928d | |||
| ec24dbeef2 | |||
| 43dc022675 | |||
| b3486a9b7f | |||
| 46c1d2484a | |||
| c9e402be57 | |||
| cfb9fffb47 | |||
| 9a531dd7f6 | |||
| 1f7b581208 | |||
| 7a474d45c6 | |||
| ea04d13a60 | |||
| ec825ebb9d | |||
| a873d6dfca | |||
| fb687f3760 | |||
| f00cf33c3a | |||
| 61a8768f9f | |||
| 07b4a4af73 | |||
| 14e2829635 | |||
| 23d721a5ed | |||
| 8dc78776b3 | |||
| 722b4b8e2d | |||
| 260ed6ed8c | |||
| 4710e31c45 | |||
| a1585dfa17 | |||
| 34dfedd2e0 | |||
| f08c4e2354 | |||
| 482760aeed | |||
| 5814b60370 | |||
| 21c2a7da25 | |||
| d7e32348ee | |||
| e0a824cf40 | |||
| a85509ea80 | |||
| 5193fe0775 | |||
| 6078d15aa1 | |||
| d6622accce | |||
| 9805721498 | |||
| 8f9a5e7009 | |||
| 37bae77faa | |||
| cca8c60fbf | |||
| a30cc3332a | |||
| 77046470ea | |||
| 27c9e63e46 | |||
| ebe1fb516c | |||
| 5fda10806d | |||
| 92a8927162 | |||
| bcbb63f585 | |||
| c67a465e3e | |||
| 83b79610af | |||
| 4fa3ea2491 | |||
| 7a4742a314 | |||
| b24df76fca | |||
| 9e30d7a117 | |||
| 789fab5b96 | |||
| 07fa597755 | |||
| 62dd433de4 | |||
| 713e85347c | |||
| 13c2ba7dcd | |||
| 9b4d4090d7 | |||
| f662e02cb1 | |||
| 35fce5a89d | |||
| 39bbf108a3 | |||
| b1cf4cc042 | |||
| c24faa2e52 | |||
| 777f38a5ee | |||
| a79eb76fa9 | |||
| 22c3584988 | |||
| 85f7ad871d | |||
| bfac524c75 | |||
| 2a93c10828 | |||
| 833c509606 | |||
| 1b010571c9 | |||
| 2765fe12cd | |||
| 6f35b2e17d | |||
| 35261ffc75 | |||
| 60309677fe | |||
| 1f1cf0cb74 | |||
| 0a1d3ed5ef | |||
| ab46981182 | |||
| b0f609dc15 | |||
| 7ee305dfc6 | |||
| 3f51835bea | |||
| 0a7ad96dcc | |||
| 6d7f20b527 | |||
| 8b7d847291 | |||
| c77dfae653 | |||
| 3e87e832c7 | |||
| eb83f941d2 | |||
| b1a6ada443 | |||
| dc3306fb95 | |||
| faaaf253b2 | |||
| 2242ca3bf0 | |||
| 258eda5bdb | |||
| 95ed5bacaa | |||
| a87fd6d4bd | |||
| ea6bb4b467 | |||
| eb5d960f3a | |||
| 844c99ddc7 | |||
| 232b9e97eb | |||
| c288397048 | |||
| 7ec084c1a9 | |||
| b37d2a0ea2 | |||
| 26d537867e | |||
| c98ec1f1a8 | |||
| ed0bc153da | |||
| 7ec4584d71 | |||
| d75ee3a3dd | |||
| ad722f1c8c | |||
| 5ed5e8352d | |||
| 51dd20424c | |||
| 1bba822e20 | |||
| a119e79a49 | |||
| 52f9b16003 | |||
| 44dba712d1 | |||
| e28a3566b6 | |||
| eb4f272d80 | |||
| 3d38b95276 | |||
| 38e0460878 | |||
| d8e29a9fa7 | |||
| fb36b68179 | |||
| e14a2554ad | |||
| b91a6548cb | |||
| ee8aedea73 | |||
| 1fa39c875b | |||
| 06741e14b7 | |||
| 8e1929dbec | |||
| 08abc86201 | |||
| 01a4ff387f | |||
| cb026c51f3 | |||
| 3fdb894296 | |||
| da0290e494 | |||
| 5d081b2ef0 | |||
| b087b5cdee | |||
| cb18ee94bf | |||
| 3142891b6a | |||
| 7191697d70 | |||
| 88f4ac7bc2 | |||
| fd9fc1f471 | |||
| 3f6ee25fc4 | |||
| c7c0f5e7f9 | |||
| 98c8893046 | |||
| d0b8f827aa | |||
| d4eac626ec | |||
| 43ca0b7e2a | |||
| 2d5c2394c8 | |||
| 746e4ae088 | |||
| 1e12366e5a | |||
| 98978a9992 | |||
| d7dcb1bf61 | |||
| 3bece03c7f | |||
| 60fdde1919 | |||
| c42d03a4a6 | |||
| 58a6ef436a | |||
| 3ab542b03f | |||
| 2a760f1f2a | |||
| 0a06e84350 | |||
| f2c07c1a31 | |||
| 829b851588 | |||
| 8f524f8c21 | |||
| 0e2a7313c6 | |||
| 9ab7530070 | |||
| f4833d3c1c | |||
| 6d01f2ab0c | |||
| 6b5ebe79f4 | |||
| 83dece4617 | |||
| 0b66a9ab37 | |||
| 4b50bf777f | |||
| 77a8505098 | |||
| 1da4797835 | |||
| 410b282d38 | |||
| 5d012a483d | |||
| 0feb793ce5 | |||
| 26cccd15f9 | |||
| be4da5661e | |||
| e5717080f2 | |||
| de87d71e63 | |||
| e93ecf4f8d | |||
| dae3edd3cd | |||
| af445a8f6d | |||
| 02d114d6f0 | |||
| 8518531cf4 | |||
| 192aad66b3 | |||
| 872b4a5e4d | |||
| 63a11f3f1b | |||
| 6d1bb15d46 | |||
| aba95aaa04 | |||
| 338c0f0d4e | |||
| fd61a002a9 | |||
| fec7a0c96f | |||
| d06e9194c9 | |||
| f8374783c1 | |||
| 6f3be0138d | |||
| 15e527456d | |||
| 7d7e7ba078 | |||
| 1af020f8b8 | |||
| 79a1f5daea | |||
| cee489025f | |||
| e00a048afc | |||
| 0ecebabd3f | |||
| a9591ca396 | |||
| db6be0f7cb | |||
| 683f24d4e4 | |||
| c4249d9e78 | |||
| e714b69896 | |||
| 378a7e390e | |||
| 96a5ccd715 | |||
| d3be9dc294 | |||
| 3f60917d17 | |||
| 8430820faf | |||
| 7f5151dcf2 | |||
| 8725a80d78 | |||
| fd85667515 | |||
| 16107fa5e6 | |||
| ec727646fe | |||
| a7f4362a8b | |||
| 7c5d97c603 | |||
| f7850c14f9 | |||
| a4813fe141 | |||
| 5e45309b81 | |||
| 5f0cebc879 | |||
| 122020e66b | |||
| c166ca6aa5 | |||
| 7bbe42935e | |||
| decb17c1ab | |||
| 61246dcfb4 | |||
| 9625258394 | |||
| c051aa284a | |||
| b605ecdaaa | |||
| 27d8742829 | |||
| 7cb350e37b | |||
| e400d2f1fb | |||
| 221370ba9e | |||
| a446367514 | |||
| 50e6d37780 | |||
| 4803ad3c9a | |||
| 7db68764ac | |||
| ef48592a73 | |||
| d0dd3d5acf | |||
| 0c74035a8f | |||
| 213012b66e | |||
| 2022d0ba56 | |||
| ae68825306 | |||
| aa575b0d79 | |||
| 4e83ef642d | |||
| e6740b5451 | |||
| 2e0a820518 | |||
| b5e47b7d60 | |||
| 3d328aeaaf | |||
| 952fa6bc9e | |||
| 7d3bc03594 | |||
| 19baf3f04a | |||
| 73d488f97d | |||
| d6d8ca67a8 | |||
| 9a93b0fee7 | |||
| 900eece37d | |||
| 20711ce4b2 | |||
| d9a43dc579 | |||
| f2aac62611 | |||
| 26d2392ac2 | |||
| 64585b3393 | |||
| 58d919efdc | |||
| 5eeb275b32 | |||
| 629ee14b55 | |||
| 113752e3e9 | |||
| 758fad8447 | |||
| 3967befabd | |||
| cbff0baf15 | |||
| b0cccc059a | |||
| c879f48109 | |||
| fce52cee6b | |||
| aedf7e7295 | |||
| c593132663 | |||
| ff7bdd7619 | |||
| c229fa31fc | |||
| 632f76cbb9 | |||
| 5dae509aa9 | |||
| 1b902dabfa | |||
| a1043a3b28 | |||
| 22c682bf4c | |||
| 0b67b51ae4 | |||
| 1673d4527a | |||
| 5e762a9cbf | |||
| 406be0107e | |||
| 4ab4174cb2 | |||
| 78e6ed9bfc | |||
| f813e59b0c | |||
| 2992a855f9 | |||
| f172a0ee1a | |||
| 3c74e4f5f6 | |||
| bf4eefe4fd | |||
| 2e81d6fe20 | |||
| 77f243a14a | |||
| 4245c21248 | |||
| e6d276de03 | |||
| 3c09c1704d | |||
| 0e3c3a78d7 | |||
| fa28005f40 | |||
| 3a956c2718 | |||
| a21e9e9838 | |||
| c109a9f31c | |||
| c1dd5e92fe | |||
| 441183975c | |||
| 0f9c0a8d06 | |||
| 5beba8f12e | |||
| 9b7102605f | |||
| 0618cd0d7a | |||
| bc7f11fb57 | |||
| 19d731eebb | |||
| e2b183bd96 | |||
| 80709c5415 | |||
| 22e3c7f5f2 | |||
| 843231c410 | |||
| 1a33bdd3ae | |||
| c0300c6bec | |||
| bffa5ef0e2 | |||
| 4e95232d59 | |||
| ca64356f12 | |||
| c2c1b0feb4 | |||
| 57afaf1995 | |||
| 4c965ed5a2 | |||
| 0462141e1b | |||
| ce39397c57 | |||
| 55cb81f7af | |||
| f7a4e69025 | |||
| 55ac0019b7 | |||
| b87a3dd2ba | |||
| 41c751c081 | |||
| 1f34a22bd8 | |||
| 10ef03eee0 | |||
| bef6de13db | |||
| bd356663cc | |||
| 1670c3e19b | |||
| aa35555356 | |||
| 1520be20c4 | |||
| 9cd49a40d5 | |||
| d27f11e26c | |||
| 9aff64183b | |||
| 5e32c8498b | |||
| bd2f2d442d | |||
| 328ff206d7 | |||
| 774a0fe9e3 | |||
| 3eb76739cc | |||
| f00f6ae1bd | |||
| 7798c0166d | |||
| 9c63687d56 | |||
| 28cad34c5f | |||
| 86d345bffc | |||
| 9cdab61eaf | |||
| 48b35c47b4 | |||
| 349d7f38cc | |||
| 7cbc279407 | |||
| 301d500c3d | |||
| 4150ba8786 | |||
| f39bc44eec | |||
| 4fabd481e6 | |||
| a374338ac5 | |||
| a7337478d0 | |||
| a7b37e9f7b | |||
| 48e0cff123 | |||
| 8a4cc312a1 | |||
| f008f803b8 | |||
| b43224c353 | |||
| 8bb9798ff4 | |||
| 86ae6f927a | |||
| c0693ac508 | |||
| ab512157a5 | |||
| 86475d4e3c | |||
| c5084209eb | |||
| eada69040c | |||
| 6deabb21ba | |||
| 2bb324752e | |||
| 03e90ea48f | |||
| d67e429f23 | |||
| 85ced7818f | |||
| 55eb81f219 | |||
| 2614860862 | |||
| 5445abeb9d | |||
| 0f75d15df6 | |||
| df1f695f9b | |||
| 5fa751cd76 | |||
| 8961a30bf8 |
@@ -2,17 +2,10 @@
|
||||
"$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json",
|
||||
"changelog": "@changesets/cli/changelog",
|
||||
"commit": false,
|
||||
"fixed": [],
|
||||
"fixed": [["@trigger.dev/*"]],
|
||||
"linked": [],
|
||||
"access": "public",
|
||||
"baseBranch": "main",
|
||||
"updateInternalDependencies": "patch",
|
||||
"ignore": [
|
||||
"wss",
|
||||
"webapp",
|
||||
"integrations",
|
||||
"emails",
|
||||
"internal-cli",
|
||||
"integration-catalog"
|
||||
]
|
||||
"ignore": ["webapp", "emails", "@trigger.dev/database"]
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# You need to stop and re-run docker to switch, `pnpm run docker:db`
|
||||
# To login using GitHub and connect via OAuth with most integrations
|
||||
AUTH_CALLBACK_URL=http://localhost:3004/oauth/callback
|
||||
# To connect with Slack
|
||||
# AUTH_CALLBACK_URL=https://<ngrok subdomain>.eu.ngrok.io/oauth/callback
|
||||
|
||||
# You only need to use this locally if you specify PIZZLY_SECRET_KEY in the webapp .env file
|
||||
# PIZZLY_SECRET_KEY=<secret_key>
|
||||
+9
-1
@@ -3,6 +3,7 @@
|
||||
.github
|
||||
# editor
|
||||
.idea
|
||||
.vscode
|
||||
# dependencies
|
||||
node_modules
|
||||
.pnp
|
||||
@@ -34,4 +35,11 @@ cypress/screenshots
|
||||
cypress/videos
|
||||
|
||||
apps/**/styles/tailwind.css
|
||||
packages/**/styles/tailwind.css
|
||||
packages/**/styles/tailwind.css
|
||||
|
||||
.changeset
|
||||
examples
|
||||
CHANGESETS.md
|
||||
CONTRIBUTING.md
|
||||
README.md
|
||||
LICENSE
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# YOU MIGHT LIKE TO MODIFY THESE VARIABLES
|
||||
SESSION_SECRET=abcdef1234
|
||||
MAGIC_LINK_SECRET=abcdef1234
|
||||
ENCRYPTION_KEY=ae13021afef0819c3a307ad487071c06 # Must be a random 16 byte hex string. You can generate an encryption key by running `openssl rand -hex 16` in your terminal
|
||||
LOGIN_ORIGIN=http://localhost:3030
|
||||
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres?schema=public
|
||||
REMIX_APP_PORT=3030
|
||||
APP_ENV=development
|
||||
APP_ORIGIN=http://localhost:3030
|
||||
NODE_ENV=development
|
||||
|
||||
# OPTIONAL VARIABLES
|
||||
# This is used for logging in via GitHub. You can leave these commented out if you don't want to use GitHub for authentication.
|
||||
# AUTH_GITHUB_CLIENT_ID=
|
||||
# AUTH_GITHUB_CLIENT_SECRET=
|
||||
|
||||
# Resend is an email service used for signing in to Trigger.dev via a Magic Link.
|
||||
# Emails will print to the console if you leave these commented out
|
||||
### Visit https://resend.com, create an account and get your API key. Then insert it below along with your From and Reply To email addresses. Visit https://resend.com/docs for more information.
|
||||
# RESEND_API_KEY=<api_key>
|
||||
# FROM_EMAIL=
|
||||
# REPLY_TO_EMAIL=
|
||||
|
||||
# CLOUD VARIABLES
|
||||
POSTHOG_PROJECT_KEY=
|
||||
PLAIN_API_KEY=
|
||||
CLOUD_AIRTABLE_CLIENT_ID=
|
||||
CLOUD_AIRTABLE_CLIENT_SECRET=
|
||||
CLOUD_GITHUB_CLIENT_ID=
|
||||
CLOUD_GITHUB_CLIENT_SECRET=
|
||||
CLOUD_SLACK_APP_HOST=
|
||||
CLOUD_SLACK_CLIENT_ID=
|
||||
CLOUD_SLACK_CLIENT_SECRET=
|
||||
@@ -0,0 +1,127 @@
|
||||
name: 🚀 Publish Trigger.dev Docker
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- "v.docker.*"
|
||||
paths:
|
||||
- ".github/workflows/publish.yml"
|
||||
- "packages/**"
|
||||
- "!packages/**/*.md"
|
||||
- "!packages/**/*.eslintrc"
|
||||
- "apps/**"
|
||||
- "!apps/**/*.md"
|
||||
- "!apps/**/*.eslintrc"
|
||||
- "integrations/**"
|
||||
- "!integrations/**/*.md"
|
||||
- "!integrations/**/*.eslintrc"
|
||||
- "pnpm-lock.yaml"
|
||||
- "pnpm-workspace.yaml"
|
||||
- "turbo.json"
|
||||
- "docker/Dockerfile"
|
||||
- "docker/scripts/**"
|
||||
|
||||
permissions:
|
||||
id-token: write
|
||||
packages: write
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
|
||||
env:
|
||||
AWS_REGION: us-east-1
|
||||
|
||||
jobs:
|
||||
typecheck:
|
||||
name: ʦ TypeScript
|
||||
runs-on: buildjet-4vcpu-ubuntu-2204
|
||||
steps:
|
||||
- name: ⬇️ Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: ⎔ Setup pnpm
|
||||
uses: pnpm/action-setup@v2.2.4
|
||||
with:
|
||||
version: 7.18
|
||||
|
||||
- name: ⎔ Setup node
|
||||
uses: buildjet/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
cache: "pnpm"
|
||||
|
||||
- name: 📥 Download deps
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: 📀 Generate Prisma Client
|
||||
run: pnpm run generate
|
||||
|
||||
- name: 🔎 Type check
|
||||
run: pnpm run typecheck --filter webapp
|
||||
|
||||
publish:
|
||||
needs: [typecheck]
|
||||
runs-on: buildjet-4vcpu-ubuntu-2204
|
||||
outputs:
|
||||
version: ${{ steps.get_version.outputs.version }}
|
||||
short_sha: ${{ steps.get_commit.outputs.sha_short }}
|
||||
steps:
|
||||
- name: ⬇️ Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: 🆚 Get the version
|
||||
id: get_version
|
||||
run: |
|
||||
IMAGE_TAG="${GITHUB_REF#refs/tags/}"
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
if [[ $IMAGE_TAG == v.docker.* ]]; then
|
||||
ORIGINAL_VERSION="${IMAGE_TAG#v.docker.}"
|
||||
IMAGE_TAG="v${ORIGINAL_VERSION}"
|
||||
fi
|
||||
echo "IMAGE_TAG=${IMAGE_TAG}"
|
||||
elif [[ $GITHUB_REF == refs/heads/* ]]; then
|
||||
IMAGE_TAG="${GITHUB_REF#refs/heads/}"
|
||||
echo "IMAGE_TAG=${IMAGE_TAG}"
|
||||
else
|
||||
echo "Invalid reference: ${GITHUB_REF}"
|
||||
exit 1
|
||||
fi
|
||||
echo "::set-output name=version::${IMAGE_TAG}"
|
||||
- name: 🔢 Get the commit hash
|
||||
id: get_commit
|
||||
run: |
|
||||
echo ::set-output name=sha_short::$(echo ${{ github.sha }} | cut -c1-7)
|
||||
|
||||
- name: 🐳 Build Docker Image
|
||||
run: |
|
||||
docker build -t release_build_image -f ./docker/Dockerfile .
|
||||
|
||||
- name: 🐙 Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: 🐙 Push to GitHub Container Registry
|
||||
run: |
|
||||
docker tag release_build_image $REGISTRY/$REPOSITORY:$IMAGE_TAG
|
||||
docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
|
||||
env:
|
||||
REGISTRY: ghcr.io/triggerdotdev
|
||||
REPOSITORY: trigger.dev
|
||||
IMAGE_TAG: ${{ steps.get_version.outputs.version }}
|
||||
|
||||
- name: 🐙 Push 'latest' to GitHub Container Registry
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
docker tag release_build_image $REGISTRY/$REPOSITORY:latest
|
||||
docker push $REGISTRY/$REPOSITORY:latest
|
||||
env:
|
||||
REGISTRY: ghcr.io/triggerdotdev
|
||||
REPOSITORY: trigger.dev
|
||||
@@ -0,0 +1,77 @@
|
||||
name: 🦋 Changesets Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- ".github/workflows/release.yml"
|
||||
- "packages/**"
|
||||
- "!packages/**/*.md"
|
||||
- "changesets/**"
|
||||
- "integrations/**"
|
||||
- "!integrations/**/*.md"
|
||||
- "pnpm-lock.yaml"
|
||||
- "pnpm-workspace.yaml"
|
||||
- "turbo.json"
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: 🦋 Changesets Release
|
||||
runs-on: buildjet-4vcpu-ubuntu-2204
|
||||
if: |
|
||||
github.repository == 'triggerdotdev/trigger.dev'
|
||||
outputs:
|
||||
published_packages: ${{ steps.changesets.outputs.publishedPackages }}
|
||||
published: ${{ steps.changesets.outputs.published }}
|
||||
steps:
|
||||
- name: 🛑 Cancel Previous Runs
|
||||
uses: styfle/cancel-workflow-action@0.11.0
|
||||
|
||||
- name: ⬇️ Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: ⎔ Setup pnpm
|
||||
uses: pnpm/action-setup@v2.2.4
|
||||
with:
|
||||
version: 7.18
|
||||
|
||||
- name: ⎔ Setup node
|
||||
uses: buildjet/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
cache: "pnpm"
|
||||
|
||||
- name: 📥 Download deps
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: 📀 Generate Prisma Client
|
||||
run: pnpm run generate
|
||||
|
||||
- name: 🔎 Type check
|
||||
run: pnpm run typecheck
|
||||
|
||||
- name: 🔐 Setup npm auth
|
||||
run: |
|
||||
echo "registry=https://registry.npmjs.org" >> ~/.npmrc
|
||||
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc
|
||||
|
||||
# This action has two responsibilities. The first time the workflow runs
|
||||
# (initial push to the `main` branch) it will create a new branch and
|
||||
# then open a PR with the related changes for the new version. After the
|
||||
# PR is merged, the workflow will run again and this action will build +
|
||||
# publish to npm.
|
||||
- name: 🚀 PR / Publish
|
||||
id: changesets
|
||||
uses: changesets/action@v1
|
||||
with:
|
||||
version: pnpm run changeset:version
|
||||
commit: "chore: Update version for release"
|
||||
title: "chore: Update version for release"
|
||||
publish: pnpm run changeset:release
|
||||
createGithubReleases: false
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
+4
-1
@@ -45,4 +45,7 @@ yarn-error.log*
|
||||
.output
|
||||
apps/**/public/build
|
||||
.tests-container-id.txt
|
||||
.sentryclirc
|
||||
.sentryclirc
|
||||
.buildt
|
||||
|
||||
**/tmp/
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"workspaceId":"63e5e42daf9a537ba8d9503c"}
|
||||
{ "workspaceId": "63e5e42daf9a537ba8d9503c" }
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
link-workspace-packages=false
|
||||
link-workspace-packages=false
|
||||
public-hoist-pattern[]=*prisma*
|
||||
@@ -0,0 +1,11 @@
|
||||
node_modules
|
||||
.env
|
||||
.env.local
|
||||
pnpm-lock.yaml
|
||||
tailwind.css
|
||||
.babelrc.json
|
||||
**/.react-email/
|
||||
**/storybook-static/
|
||||
**/.changeset/
|
||||
**/build/
|
||||
**/dist/
|
||||
Vendored
+1
-8
@@ -5,19 +5,12 @@
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "pnpm run idev --filter webapp",
|
||||
"command": "pnpm run dev --filter webapp",
|
||||
"name": "Run webapp",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
{
|
||||
"command": "pnpm run dev --filter integrations",
|
||||
"name": "Run integrations",
|
||||
"request": "launch",
|
||||
"type": "node-terminal",
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
{
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
|
||||
Vendored
-19
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"name": "trigger.dev",
|
||||
"path": "../"
|
||||
},
|
||||
{
|
||||
"name": "Webapp",
|
||||
"path": "../apps/webapp"
|
||||
},
|
||||
{
|
||||
"name": "Integrations",
|
||||
"path": "../apps/integrations"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"vitest.commandLine": "pnpm exec vitest"
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
# Warp Launch Configuration
|
||||
#
|
||||
#
|
||||
# Use this to start a certain configuration of windows, tabs, and panes
|
||||
# Open the launch configuration palette to access and open any launch configuration
|
||||
#
|
||||
# This file defines your launch configuration
|
||||
# More on how to do so here:
|
||||
# https://docs.warp.dev/features/session-management/launch-configurations
|
||||
#
|
||||
# All launch configurations are stored under ~/.warp/launch_configurations/
|
||||
# Edit them anytime!
|
||||
#
|
||||
# You can also add commands that run on-start for your launch configurations like so:
|
||||
# ---
|
||||
# name: Example with Command
|
||||
# windows:
|
||||
# - tabs:
|
||||
# - layout:
|
||||
# cwd: /Users/warp-user/project
|
||||
# commands:
|
||||
# - exec: code .
|
||||
|
||||
---
|
||||
name: Triggerdotdev
|
||||
windows:
|
||||
- tabs:
|
||||
- title: webapp
|
||||
layout:
|
||||
split_direction: vertical
|
||||
panes:
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
|
||||
commands:
|
||||
- exec: pnpm run build --filter webapp
|
||||
- exec: pnpm run i-dev --filter webapp
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev/apps/webapp
|
||||
- title: integrations
|
||||
layout:
|
||||
split_direction: vertical
|
||||
panes:
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
|
||||
commands:
|
||||
- exec: pnpm run dev --filter integrations
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev/apps/integrations
|
||||
- title: ngrok
|
||||
layout:
|
||||
split_direction: horizontal
|
||||
panes:
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
|
||||
commands:
|
||||
- exec: ./scripts/proxy-webapp.sh <your-trigger-dev>
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev
|
||||
commands:
|
||||
- exec: ./scripts/proxy-pizzly.sh <your-pizzly-dev>
|
||||
- title: wss and examples
|
||||
layout:
|
||||
split_direction: horizontal
|
||||
panes:
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev/apps/wss
|
||||
commands:
|
||||
- exec: LOG_LEVEL=debug pnpm run dev
|
||||
- cwd: /Users/eric/code/triggerdotdev/trigger.dev/examples
|
||||
- title: emails
|
||||
layout:
|
||||
split_direction: horizontal
|
||||
panes:
|
||||
- cwd: /Users/eric/Work/Git/APIHero/trigger.dev/packages/emails
|
||||
commands:
|
||||
- exec: pnpm run dev
|
||||
- cwd: /Users/eric/Work/Git/APIHero/trigger.dev/packages/emails
|
||||
+9
-10
@@ -4,23 +4,22 @@ Trigger.dev uses [changesets](https://github.com/changesets/changesets) to manag
|
||||
|
||||
## Adding a changeset
|
||||
|
||||
To add a changeset, use `pnpm run changeset:add` and follow the instructions [here](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). Please only ever select one of our public packages when adding a changeset, which currently are:
|
||||
To add a changeset, use `pnpm run changeset:add` and follow the instructions [here](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). Please only ever select one of our public packages when adding a changeset.
|
||||
|
||||
- `@trigger.dev/sdk`
|
||||
- `@trigger.dev/integration-sdk`
|
||||
- `@trigger.dev/github`
|
||||
- `@trigger.dev/notion`
|
||||
- `@trigger.dev/slack`
|
||||
- `@trigger.dev/shopify`
|
||||
- `@trigger.dev/resend`
|
||||
|
||||
## Release instructions
|
||||
## Release instructions (local only)
|
||||
|
||||
Based on the instructions [here](https://github.com/changesets/changesets/blob/main/docs/intro-to-using-changesets.md)
|
||||
|
||||
1. Run `pnpm run changeset:version`
|
||||
2. Run `pnpm run changeset:release`
|
||||
|
||||
## Release instructions (CI)
|
||||
|
||||
Please follow the best-practice of adding changesets in the same commit as the code making the change with `pnpm run changeset:add`, as it will allow our release.yml CI workflow to function properly:
|
||||
|
||||
- Anytime new changesets are added in a commit in the `main` branch, the [release.yml](./.github/workflows/release.yml) workflow will run and will automatically create/update a PR with a fresh run of `pnpm run changeset:version`.
|
||||
- When the version PR is merged into `main`, the release.yml workflow will automatically run `pnpm run changeset:release` to build and release packages to npm.
|
||||
|
||||
## Pre-release instructions
|
||||
|
||||
1. Add changesets as usual `pnpm run changeset:add`
|
||||
|
||||
+245
@@ -0,0 +1,245 @@
|
||||
# Contributing to Trigger.dev
|
||||
|
||||
Thank you for taking the time to contribute to Trigger.dev. Your involvement is not just welcomed, but we encourage it! 🚀
|
||||
|
||||
Please take some time to read this guide to understand contributing best practices for Trigger.dev.
|
||||
|
||||
Thank you for helping us make Trigger.dev even better! 🤩
|
||||
|
||||
## Developing
|
||||
|
||||
The development branch is `main`. This is the branch that all pull
|
||||
requests should be made against. The changes on the `main`
|
||||
branch are tagged into a release monthly.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- [Node.js](https://nodejs.org/en) version >=16.x
|
||||
- [pnpm package manager](https://pnpm.io/installation) version 7
|
||||
- [Docker](https://www.docker.com/get-started/)
|
||||
|
||||
### Setup
|
||||
|
||||
1. Clone the repo into a public GitHub repository or [fork the repo](https://github.com/triggerdotdev/trigger.dev/fork). If you plan to distribute the code, keep the source code public to comply with the [Apache Licence 2.0](https://github.com/triggerdotdev/trigger.dev/blob/main/LICENSE).
|
||||
|
||||
```
|
||||
git clone https://github.com/triggerdotdev/trigger.dev.git
|
||||
```
|
||||
|
||||
> If you are on windows, run the following command on gitbash with admin privileges:
|
||||
> `git clone -c core.symlinks=true https://triggerdotdev/trigger.dev.git`
|
||||
|
||||
2. Navigate to the project folder
|
||||
```
|
||||
cd trigger.dev
|
||||
```
|
||||
3. Install the required packages using pnpm.
|
||||
```
|
||||
pnpm i
|
||||
```
|
||||
4. Create your `.env` files
|
||||
```
|
||||
cp .env.example .env && cp packages/database/.env.example packages/database/.env
|
||||
```
|
||||
5. Open the root `.env` file and generate a new value for `ENCRYPTION_KEY`:
|
||||
|
||||
`ENCRYPTION_KEY` is used to two-way encrypt OAuth access tokens and so you'll probably want to actually generate a unique value, and it must be a random 16 byte hex string. You can generate one with the following command:
|
||||
|
||||
```sh
|
||||
openssl rand -hex 16
|
||||
```
|
||||
|
||||
Feel free to update `SESSION_SECRET` and `MAGIC_LINK_SECRET` as well using the same method.
|
||||
|
||||
6. Start Docker. This starts the required services like Postgres. If this is your first time using Docker, consider going through this [guide](DOCKER_INSTALLATION.md)
|
||||
```
|
||||
pnpm run docker
|
||||
```
|
||||
7. Migrate the database
|
||||
```
|
||||
pnpm run db:migrate
|
||||
```
|
||||
8. Build the app
|
||||
```
|
||||
pnpm run build --filter webapp
|
||||
```
|
||||
9. Run the seed script
|
||||
```
|
||||
pnpm run db:seed
|
||||
```
|
||||
10. Run the app. See the section below.
|
||||
|
||||
## Running
|
||||
|
||||
1. You can run the app with:
|
||||
|
||||
```
|
||||
pnpm run dev --filter webapp
|
||||
```
|
||||
|
||||
It should run on port `3030`: [http://localhost:3030](http://localhost:3030/)
|
||||
|
||||
2. Once the app is running click the magic link button and enter your email.
|
||||
3. Check your terminal, the magic link email should have printed out as following:
|
||||
|
||||
```sh
|
||||
webapp:dev: Log in to Trigger.dev
|
||||
webapp:dev:
|
||||
webapp:dev: Click here to log in with this magic link
|
||||
webapp:dev: [http://localhost:3030/magic?token=U2FsdGVkX18OvB0JxgaswTLCSbaRz%2FY82TN0EZWhSzFyZYwgG%2BIzKVTkeiaOtWfotPw7F8RwFzCHh53aBpMEu%2B%2B%2FItb%2FcJYh89MSjc3Pz92bevoEjqxSQ%2Ff%2BZbks09JOpqlBbYC3FzGWC8vuSVFBlxqLXxteSDLthZSUaC%2BS2LaA%2BJgp%2BLO7hgjAaC2lXbCHrM7MTgTdXOFt7i0Dvvuwz6%2BWY25RnfomZOPqDsyH0xz8Q2rzPTz0Xu53WSXrZ1hd]
|
||||
webapp:dev:
|
||||
webapp:dev: If you didn't try to log in, you can safely ignore this email.
|
||||
```
|
||||
|
||||
Paste the magic link shown in your terminal into your browser to login.
|
||||
|
||||
## Adding and running migrations
|
||||
|
||||
1. Modify packages/database/prisma/schema.prisma file
|
||||
2. Change directory to the packages/database folder
|
||||
```sh
|
||||
cd packages/database
|
||||
```
|
||||
3. Generate the Prisma client
|
||||
|
||||
```sh
|
||||
pnpm run generate
|
||||
```
|
||||
|
||||
The above updates the prisma client generated into node_modules/.prisma/client folder. This helps with typing of relevant prisma models. It ensures typescript
|
||||
recognizes fields added or removed from a model and type-checks appropriately.
|
||||
|
||||
4. Create and apply the migrations
|
||||
|
||||
```
|
||||
pnpm run db:migrate:dev
|
||||
```
|
||||
|
||||
This creates a migration file and executes the migrations against your database and applies changes to the database schema(s)
|
||||
|
||||
5. Commit generated migrations as well as changes to the schema.prisma file
|
||||
6. If you're using VSCode you may need to restart the Typescript server in the webapp to get updated type inference. Open a TypeScript file, then open the Command Palette (View > Command Palette) and run `TypeScript: Restart TS server`.
|
||||
|
||||
## Testing CLI changes
|
||||
|
||||
To test CLI changes, follow the steps below:
|
||||
|
||||
1. Build the CLI and watch for changes
|
||||
|
||||
```sh
|
||||
cd packages/cli
|
||||
pnpm run dev
|
||||
```
|
||||
|
||||
2. Open a new Terminal window and run the webapp locally and then create a new project in the dashboard. Copy out the dev API key.
|
||||
|
||||
3. Create a new temporary Next.js app in examples directory
|
||||
|
||||
```sh
|
||||
pnpm create next-app@latest
|
||||
```
|
||||
|
||||
Follow the prompts to create a TypeScript project using the App Directory.
|
||||
|
||||
4. Then once that's finished, add the `@trigger.dev/cli` to the `devDependencies` of the newly created Next.js app's `package.json` file, like so:
|
||||
|
||||
```json
|
||||
{
|
||||
"devDependencies": { "@trigger.dev/cli": "workspace:*" }
|
||||
}
|
||||
```
|
||||
|
||||
5. Open a new terminal window, navigate into the example, and initialize the CLI:
|
||||
|
||||
```sh
|
||||
cd examples/your-newly-created-nextjs-project
|
||||
pnpm i
|
||||
pnpm exec trigger-cli init
|
||||
```
|
||||
|
||||
6. When prompted, select `self-hosted` and enter `localhost:3030` for your local version of the webapp. When asked for an API key, use the key you copied earlier.
|
||||
|
||||
7. Run the CLI
|
||||
|
||||
```sh
|
||||
pnpm exec trigger-cli dev
|
||||
```
|
||||
|
||||
8. After running the CLI, start your newly created Next.js project. You should now be able to see the changes.
|
||||
|
||||
9. Please remember to delete the temporary project you created after you've tested the changes, and before you raise a PR.
|
||||
|
||||
## Add sample jobs
|
||||
|
||||
The [examples/jobs-starter](./examples/jobs-starter/) project defines simple jobs you can get started with.
|
||||
|
||||
1. `cd` into `examples/jobs-starter`
|
||||
2. Create a `.env.local` file with the following content,
|
||||
replacing `[TRIGGER_DEV_API_KEY]` with an actual key:
|
||||
|
||||
```env
|
||||
TRIGGER_API_KEY=[TRIGGER_DEV_API_KEY]
|
||||
TRIGGER_API_URL=http://localhost:3030
|
||||
```
|
||||
|
||||
`TRIGGER_API_URL` is used to configure the URL for your Trigger.dev instance,
|
||||
where the jobs will be registered.
|
||||
|
||||
3. Run the `jobs-starter` app:
|
||||
|
||||
```sh
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
4. Navigate to your trigger.dev instance ([http://localhost:3030](http://localhost:3030/)), to see the jobs.
|
||||
You can use the test feature to trigger them.
|
||||
|
||||
## Making a pull request
|
||||
|
||||
**If you get errors, be sure to fix them before committing.**
|
||||
|
||||
- Be sure to [check the "Allow edits from maintainers" option](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) while creating you PR.
|
||||
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. See more about [Linking a pull request to an issue
|
||||
](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
|
||||
- Be sure to fill the PR Template accordingly.
|
||||
|
||||
## Adding changesets
|
||||
|
||||
We use [changesets](https://github.com/changesets/changesets) to manage our package versions and changelogs. If you've never used changesets before, first read [their guide here](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).
|
||||
|
||||
If you are contributing a change to any packages in this monorepo (anything in either the `/packages` or `/integrations` directories), then you will need to add a changeset to your Pull Requests before they can be merged.
|
||||
|
||||
To add a changeset, run the following command in the root of the repo
|
||||
|
||||
```sh
|
||||
pnpm run changeset:add
|
||||
```
|
||||
|
||||
Here's an example of creating a `patch` changeset for the `@trigger.dev/github` and `@trigger.dev/slack` packages (click to view):
|
||||
|
||||
[](https://asciinema.org/a/599228)
|
||||
|
||||
You will be prompted to select which packages to include in the changeset. Only select the packages that you have made changes for.
|
||||
|
||||
Most of the time the changes you'll make are likely to be categorized as patch releases. If you feel like there is the need for a minor or major release of the package based on the changes being made, add the changeset as such and it will be discussed during PR review.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### EADDRINUSE: address already in use :::3030
|
||||
|
||||
When receiving the following error message:
|
||||
|
||||
```sh
|
||||
webapp:dev: Error: listen EADDRINUSE: address already in use :::3030
|
||||
```
|
||||
|
||||
The process running on port `3030` should be destroyed.
|
||||
|
||||
1. Get the `PID` of the process running on PORT `3030`
|
||||
```sh
|
||||
lsof -i :3030
|
||||
```
|
||||
2. Kill the process
|
||||
```sh
|
||||
sudo kill -9 <PID>
|
||||
```
|
||||
@@ -1,32 +0,0 @@
|
||||
# Trigger.dev Deployment Guide
|
||||
|
||||
## StreamNative Cloud - Hosted Pulsar
|
||||
|
||||
### Generic client credentials
|
||||
|
||||
```sh
|
||||
snctl auth export-service-account webapp --key-file webapp-credentials.json
|
||||
snctl auth export-service-account websocketserver --key-file wss-credentials.json
|
||||
```
|
||||
|
||||
### Topics
|
||||
|
||||
#### Triggers (`persistent://triggerdotdev/workflows/triggers`)
|
||||
|
||||
Events that trigger workflows to run. These are sent by the "platform" and read by the Web Socket Servers, which then coordinate with the hosts for running the workflows
|
||||
|
||||
#### Run Commands (`persistent://triggerdotdev/workflows/run-commands`)
|
||||
|
||||
These are events that come from hosts and are published by the Web Socket Servers, e.g. Sending Integration Requests, Sending Logs, Initializing a Delay
|
||||
|
||||
#### Run Command Responses (`persistent://triggerdotdev/workflows/run-command-responses`)
|
||||
|
||||
These are events that come from the platform and are read by the Web Socket Servers, to resolve or reject a previous Run Command
|
||||
|
||||
#### Integration Requests (`persistent://triggerdotdev/queues/integration-requests`)
|
||||
|
||||
This is an internal queue used by the platform to perform integration requests, and retry them.
|
||||
|
||||
#### App Task Queue (`persistent://triggerdotdev/queues/background-tasks`)
|
||||
|
||||
This is an internal queue used by the platform to do tasks in a queue. Basically a background job system.
|
||||
-231
@@ -1,231 +0,0 @@
|
||||
# Initial setup
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### Pulsar requirements
|
||||
|
||||
1. Ensure you have Homebrew installed by running `which brew` in terminal. If it's not found then you should install it: https://brew.sh/. Run `which brew` again to check it's found. If it's not you may need to [add it your path](https://stackoverflow.com/questions/36657321/after-installing-homebrew-i-get-zsh-command-not-found-brew)
|
||||
|
||||
2. Run `brew install libpulsar` to install the C++ libraries that the pulsar-client depends on
|
||||
|
||||
3. Make sure you have Python installed on your machine by running `which python3` in terminal.
|
||||
|
||||
4. If python isn't found then you should install it: https://www.python.org/downloads/. In a new terminal window run `which python3` again.
|
||||
|
||||
5. Run `npm config set python /the/path/from/the/which/python3/command` inserting the path from step 2 or 3
|
||||
|
||||
6. Install node-gyp: `npm install -g node-gyp`
|
||||
|
||||
7. Make sure you have the Xcode command line tools installed by running `xcode-select --install` from the terminal. If it says they're already installed then you're set.
|
||||
|
||||
8. Run this in the terminal:
|
||||
|
||||
```sh
|
||||
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:$(brew --prefix)/include"
|
||||
export LIBRARY_PATH="$LIBRARY_PATH:$(brew --prefix)/lib"
|
||||
export PULSAR_CPP_DIR=/opt/homebrew/Cellar/libpulsar/3.1.0
|
||||
```
|
||||
|
||||
9. Run `pnpm install` in the same terminal window.
|
||||
|
||||
## Building and running the webapp
|
||||
|
||||
> **Warning**
|
||||
> All the following commands should be launched from the **monorepo root directory**
|
||||
|
||||
1. Install the dependencies.
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
2. Optionally, if you are testing auth (pizzly) or webhooks (webapp) then you'll need to use ngrok to proxy internet traffic to your local machine
|
||||
|
||||
Get access to ngrok and then follow the instructions here to get it setup: https://ngrok.com/download (use homebrew) and make sure to authenticate.
|
||||
|
||||
Then run the following scripts to start proxying:
|
||||
|
||||
```sh
|
||||
./scripts/proxy-pizzly.sh dan-pizzly-dev
|
||||
./scripts/proxy-webapp.sh dan-trigger-dev
|
||||
```
|
||||
|
||||
3. Environment variables. You will need to create copies of the `.env.example` files in `app/webapp`
|
||||
|
||||
```sh
|
||||
cp ./apps/webapp/.env.example ./apps/webapp/.env
|
||||
```
|
||||
|
||||
Then you will need to fill in the fields with real values.
|
||||
|
||||
You also need to create the `pizzly-server.env` files under the `.docker` directory:
|
||||
|
||||
```sh
|
||||
cp ./.docker/pizzly-server.env.example ./.docker/pizzly-server.env
|
||||
```
|
||||
|
||||
Next, update the `AUTH_CALLBACK_URL` env var in the `pizzly-server.env` env file with the value provided to the `./scripts/proxy-pizzly.sh` command. Using the example above the `AUTH_CALLBACK_URL` would be `AUTH_CALLBACK_URL=https://dan-pizzly-dev.eu.ngrok.io/oauth/callback`.
|
||||
|
||||
If you aren't proxying pizzly according to step 2, then leave the `pizzly-server.env` file empty.
|
||||
|
||||
If you are proxying the webapp according to step 2 then in `webapp/.env`, set the `APP_ORIGIN` to the `NGROK_SUBDOMAIN` provided to the `./scripts/proxy-webapp.sh` command, e.g. `APP_ORIGIN=https://dan-trigger-dev.eu.ngrok.io`
|
||||
|
||||
4. Start postgresql, redis, pizzly server, followed by pulsar standalone
|
||||
|
||||
```bash
|
||||
pnpm run docker:services
|
||||
pnpm run docker:pulsar
|
||||
```
|
||||
|
||||
> **Note:** The npm script will complete while Docker sets up the container in the background. Ensure that Docker has finished and your container is running before proceeding.
|
||||
|
||||
5. Generate prisma schema
|
||||
```bash
|
||||
pnpm run generate
|
||||
```
|
||||
6. Run the Prisma migration to the database
|
||||
|
||||
```bash
|
||||
pnpm run db:migrate:deploy
|
||||
```
|
||||
|
||||
7. Run the first build (with dependencies via the `...` option)
|
||||
|
||||
```bash
|
||||
pnpm run build --filter=webapp...
|
||||
```
|
||||
|
||||
**Running simply `pnpm run build` will build everything, including the Remix app.**
|
||||
|
||||
8. Run the Remix dev server
|
||||
|
||||
```bash
|
||||
pnpm run dev --filter=webapp
|
||||
```
|
||||
|
||||
## Attaching an API integration using Pizzly
|
||||
|
||||
```bash
|
||||
PIZZLY_HOSTPORT=http://localhost:3004 npx pizzly config:create github github <client-id> <client-secret> "repo,user"
|
||||
```
|
||||
|
||||
## Tests, Typechecks, Lint, Install packages...
|
||||
|
||||
Check the `turbo.json` file to see the available pipelines.
|
||||
|
||||
- Run the Cypress tests and Dev
|
||||
```bash
|
||||
pnpm run test:e2e:dev --filter=webapp
|
||||
```
|
||||
- Lint everything
|
||||
```bash
|
||||
pnpm run lint
|
||||
```
|
||||
- Typecheck the whole monorepo
|
||||
```bash
|
||||
pnpm run typecheck
|
||||
```
|
||||
- Test the whole monorepo
|
||||
```bash
|
||||
pnpm run test
|
||||
or
|
||||
pnpm run test:dev
|
||||
```
|
||||
- How to install an npm package in the Remix app ?
|
||||
```bash
|
||||
pnpm add dayjs --filter webapp
|
||||
```
|
||||
- Tweak the tsconfigs, eslint configs in the `config-package` folder. Any package or app will then extend from these configs.
|
||||
|
||||
# Running a workflow locally
|
||||
|
||||
## After pulling a change
|
||||
|
||||
1. Ensure there are no database migrations to run
|
||||
|
||||
```bash
|
||||
pnpm run db:migrate:dev
|
||||
```
|
||||
|
||||
2. Generate the Prisma database client
|
||||
|
||||
```bash
|
||||
pnpm run generate
|
||||
```
|
||||
|
||||
3. Install packages
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
4. Build everything
|
||||
|
||||
```bash
|
||||
pnpm run build
|
||||
```
|
||||
|
||||
5. Install packages again, this makes sure the local packages are linked
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
## Running the servers
|
||||
|
||||
1. Ensure the docker containers are running
|
||||
|
||||
```bash
|
||||
pnpm run docker:services
|
||||
pnpm run docker:pulsar
|
||||
```
|
||||
|
||||
2. Run the webapp
|
||||
|
||||
```bash
|
||||
pnpm run dev --filter=webapp
|
||||
```
|
||||
|
||||
3. Run the Web Socket Server
|
||||
|
||||
```bash
|
||||
pnpm run dev --filter=wss
|
||||
```
|
||||
|
||||
4. Build all the @trigger.dev/\* packages
|
||||
|
||||
```bash
|
||||
pnpm run dev --filter="@trigger.dev/*"
|
||||
```
|
||||
|
||||
## Running the smoke test
|
||||
|
||||
1. Run the smoke test workflow
|
||||
|
||||
```bash
|
||||
cd ./examples/smoke-test
|
||||
pnpm run dev
|
||||
```
|
||||
|
||||
2. Running the workflow requires you to send data to the local API.
|
||||
|
||||
You can use this cURL command to send a `user.created` event. This will run the workflow and generate the corresponding logs.
|
||||
|
||||
```bash
|
||||
curl --request POST \
|
||||
--url http://localhost:3000/api/v1/events \
|
||||
--header 'Authorization: Bearer trigger_dev_zC25mKNn6c0q' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data '{
|
||||
"name": "user.created",
|
||||
"payload": {
|
||||
"id": "123"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
## Dependency & Package graph
|
||||
|
||||

|
||||
|
||||
## Warp Launch Configuration
|
||||
|
||||
Setup a custom launch configuration for the Warp terminal ([docs here](https://docs.warp.dev/features/sessions/launch-configurations)) by copying the `.warp/triggerdotdev.yaml.example` file to `~/.warp/launch_configurations/triggerdotdev.yaml`. Make sure you edit the file and replace `<your-trigger-dev>` and `<your-pizzly-dev>` with your custom ngrok subdomains.
|
||||
@@ -0,0 +1,126 @@
|
||||
This guide covers installing Docker and Docker Compose. If you're looking for instructions for running Trigger.dev in docker, [see here](https://github.com/triggerdotdev/docker).
|
||||
|
||||
## Setting up Docker for the first time.
|
||||
|
||||
In the contributing guide of Trigger.dev, there's a section that requires you to start Docker.
|
||||
|
||||
If you don't have Docker installed on your machine, you'll run into some complications (errors).
|
||||
|
||||
Below are the steps on how you can avoid that.
|
||||
|
||||
First you need to setup docker-compose as it is an underlying tool that this command: `pnpm run docker` fires behind the scene.
|
||||
|
||||
## Linux
|
||||
|
||||
To install Docker Compose on Linux Ubuntu via the terminal, you can follow these steps:
|
||||
|
||||
1. Update the package index on your system by running the following command:
|
||||
|
||||
```shell
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
2. Install the required dependencies by running the following command:
|
||||
|
||||
```shell
|
||||
sudo apt install curl
|
||||
```
|
||||
|
||||
3. Download the Docker Compose binary into the `/usr/local/bin` directory using the `curl` command:
|
||||
|
||||
```shell
|
||||
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
```
|
||||
|
||||
4. Set the appropriate permissions to make the `docker-compose` binary executable:
|
||||
|
||||
```shell
|
||||
sudo chmod +x /usr/local/bin/docker-compose
|
||||
```
|
||||
|
||||
5. Verify that Docker Compose has been successfully installed by running the following command:
|
||||
|
||||
```shell
|
||||
docker-compose --version
|
||||
```
|
||||
|
||||
This command should display the version information of Docker Compose without any errors.
|
||||
|
||||
After following these steps, you should have Docker Compose installed on your Ubuntu system, and you can use it by running `docker-compose` commands in the terminal.
|
||||
|
||||
When you've verified that the `docker-compose` package is installed and you proceed to start Docker with `pnpm run docker`.
|
||||
|
||||
You'll probably get an error similar to the one below:
|
||||
|
||||
```shell
|
||||
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
|
||||
ELIFECYCLE Command failed with exit code 1.
|
||||
```
|
||||
|
||||
The error message suggests that the Docker daemon is not running on your system. The Docker daemon is responsible for managing and running Docker containers.
|
||||
|
||||
To resolve this issue, you may need to install Docker properly on your Ubuntu system. Here are the steps to install Docker on Ubuntu:
|
||||
|
||||
1. Update the package index on your system by running the following command:
|
||||
|
||||
```shell
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
2. Install the necessary packages to allow apt to use repositories over HTTPS:
|
||||
|
||||
```shell
|
||||
sudo apt install apt-transport-https ca-certificates curl software-properties-common
|
||||
```
|
||||
|
||||
3. Add the official Docker GPG key to your system by running the following command:
|
||||
|
||||
```shell
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
```
|
||||
|
||||
4. Add the Docker repository to the APT sources list:
|
||||
|
||||
```shell
|
||||
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
```
|
||||
|
||||
5. Update the package index again:
|
||||
|
||||
```shell
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
6. Install Docker by running the following command:
|
||||
|
||||
```shell
|
||||
sudo apt install docker-ce docker-ce-cli containerd.io
|
||||
```
|
||||
|
||||
7. After the installation is complete, verify that Docker is installed correctly by running the following command:
|
||||
|
||||
```shell
|
||||
docker --version
|
||||
```
|
||||
|
||||
This command should display the version information of Docker without any errors.
|
||||
|
||||
Once Docker is installed and verified, you should be able to start the Docker daemon and run the `pnpm run docker` command without encountering any issues.
|
||||
|
||||
## Windows
|
||||
|
||||
1. Download the Docker Desktop installer from the Docker website: [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop)
|
||||
|
||||
2. Run the installer and follow the instructions to install Docker Desktop.
|
||||
|
||||
3. After installation, Docker Desktop should be running automatically.
|
||||
|
||||
## macOS
|
||||
|
||||
1. Download the Docker Desktop installer from the Docker website: [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop)
|
||||
|
||||
2. Run the installer and follow the instructions to install Docker Desktop.
|
||||
|
||||
3. After installation, Docker Desktop should be running automatically.
|
||||
|
||||
Please note that the instructions provided above are for the most common scenarios. For specific versions or different distributions, it's always a good idea to consult the official Docker documentation for the respective operating systems.
|
||||
@@ -1,25 +1,201 @@
|
||||
Copyright (c) 2022 API Hero Inc.
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
Portions of this software are licensed as follows:
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
- All content that resides under any "ee/" directory of this repository, if such directories exists, are licensed under the license defined in "ee/LICENSE".
|
||||
- All third party components incorporated into the Trigger.dev Software are licensed under the original license provided by the owner of the applicable component.
|
||||
- Content outside of the above mentioned directories or restrictions above is available under the "MIT Expat" license as defined below.
|
||||
1. Definitions.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
@@ -1,204 +1,65 @@
|
||||
<div align="center">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://imagedelivery.net/3TbraffuDZ4aEf8KWOmI_w/a45d1fa2-0ae8-4a39-4409-f4f934bfae00/public">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://imagedelivery.net/3TbraffuDZ4aEf8KWOmI_w/3f5ad4c1-c4c8-4277-b622-290e7f37bd00/public">
|
||||
<img alt="Trigger.dev logo" src="https://imagedelivery.net/3TbraffuDZ4aEf8KWOmI_w/a45d1fa2-0ae8-4a39-4409-f4f934bfae00/public">
|
||||
</picture>
|
||||
|
||||
### The background jobs framework for Next.js
|
||||
|
||||

|
||||
[Discord](https://discord.gg/JtBAxBr2m3) | [Website](https://trigger.dev) | [Issues](https://github.com/triggerdotdev/trigger.dev/issues) | [Docs](https://trigger.dev/docs)
|
||||
|
||||
[](https://twitter.com/triggerdotdev) [](https://www.youtube.com/@triggerdotdev)
|
||||
[](https://twitter.com/triggerdotdev)
|
||||
[](https://github.com/triggerdotdev/trigger.dev)
|
||||
|
||||
[Website](https://trigger.dev) | [Community](https://discord.gg/JtBAxBr2m3) | [Docs](https://docs.trigger.dev)
|
||||
</div>
|
||||
|
||||
# About Trigger.dev
|
||||
|
||||
# **✨ Trigger.dev**
|
||||
### **The developer-first open source Zapier alternative.**
|
||||
Create long-running jobs directly in your codebase with features like API integrations, webhooks, scheduling and delays.
|
||||
|
||||
### Long running Jobs on serverless
|
||||
|
||||
Trigger.dev is an open source platform that makes it easy for developers to create event-driven background tasks directly in their code. Build, test and run workflows locally using our SDK. Subscribe to webhooks, schedule jobs, run background jobs and add long delays easily and reliably. In our web app you get full visibility of every run your workflow has ever made making it easier to monitor and debug.
|
||||
Reliably run jobs and don’t worry about function timeouts, we handle those for you.
|
||||
|
||||
|
||||
- Auto-resume after a function timeout
|
||||
- Auto-resume after a server outage
|
||||
- Add delays of up to a year
|
||||
|
||||
# **⭐️ Features:**
|
||||
### In your codebase
|
||||
|
||||
- 👂 Easily subscribe to [webhooks](https://docs.trigger.dev/triggers/webhooks)
|
||||
— they work locally without tunnelling.
|
||||
- 🔥 Fire your own [custom events](https://docs.trigger.dev/triggers/custom-events)—a single event can trigger multiple workflows.
|
||||
- 📆 [Schedule workflows](https://docs.trigger.dev/triggers/scheduled)—easily repeat tasks or use CRON syntax for advanced cases.
|
||||
- 🚦 Add [long delays](https://docs.trigger.dev/functions/delays) inside workflows (up to a year) and they will pick up where they left off.
|
||||
- 🤝 When your server goes down [it’s not a problem](https://docs.trigger.dev/guides/resumability), workflows will reconnect and continue.
|
||||
- 🪧 [View every step of every run](https://docs.trigger.dev/viewing-runs), with data, previews and errors.
|
||||
- 👋 Connect to and authenticate with APIs using our custom integrations.
|
||||
- 🚗 If you have a custom use case, we support [Fetch for calling any HTTP endpoint](https://docs.trigger.dev/functions/fetch) or [webhooks](https://docs.trigger.dev/triggers/webhooks) for subscribing to events from APIs.
|
||||
- 📡 All API calls are automatically retried with exponential back off.
|
||||
- 😀 TypeScript SDK, so whether you’re using JavaScript or TypeScript you will have a great experience.
|
||||
Create Jobs where they belong: in your codebase. Version control, localhost, test, review, and deploy like you're already used to.
|
||||
|
||||
|
||||
### Secure by design
|
||||
|
||||
# **🌱 Documentation:**
|
||||
We only receive Triggers and the data you choose to send to us. You can even completely self-host the entire platform.
|
||||
|
||||
- [Getting Started with Trigger.dev](https://docs.trigger.dev/getting-started)
|
||||
- Example workflows
|
||||
- [Welcome email drip campaign using Resend and Slack](https://docs.trigger.dev/examples/resend)
|
||||
- [Post to Slack when a GitHub issue is created or modified](https://docs.trigger.dev/examples/slack)
|
||||
- [Create a new product on Shopify](https://docs.trigger.dev/examples/shopify)
|
||||
- [When a GitHub repo is starred, post information about the user to Slack](https://docs.trigger.dev/examples/github)
|
||||
- Triggers:
|
||||
- [Webhooks](https://docs.trigger.dev/triggers/webhooks)
|
||||
- [Custom events](https://docs.trigger.dev/triggers/custom-events)
|
||||
- [Scheduled](https://docs.trigger.dev/triggers/scheduled)
|
||||
- Functions:
|
||||
- [Fetch](https://docs.trigger.dev/functions/fetch)
|
||||
- [Logging](https://docs.trigger.dev/functions/logging)
|
||||
- [Delays](https://docs.trigger.dev/functions/delays)
|
||||
- [Send event](https://docs.trigger.dev/functions/send-event)
|
||||
- [Loops, conditionals, etc](https://docs.trigger.dev/functions/loops-conditionals-etc)
|
||||
### Don't worry about deployment
|
||||
|
||||
|
||||
Just use our SDK to write Jobs in your Next.js codebase. There's nothing extra to deploy and no CI to configure, your Jobs just connect to our cloud. Or you can always self-host.
|
||||
|
||||
# 🔬 **Anatomy of a workflow**
|
||||
### Full visibility of every job run
|
||||
|
||||
* You create workflows in code on your server using our SDK
|
||||
* Each API integration is a separate package, e.g. `@trigger.dev/slack`
|
||||
* Each workflow has an event that triggers it, e.g. `github.events.newStarEvent`, `scheduleEvent`, `customEvent`
|
||||
* Each workflow has a `run` function that is called when the event is triggered
|
||||
* If we don't have an integration for the API you want to use, you can use `fetch` to call any HTTP endpoint and `webhookEvent` to subscribe to webhooks
|
||||
View every Task in every Run so you can tell exactly what happened.
|
||||
|
||||
## **Example workflows**
|
||||

|
||||
|
||||
<details open><summary> Post to Slack when a GitHub issue is created or modified
|
||||
</summary>
|
||||
### Built-in integrations
|
||||
|
||||
_Integrations required: Slack, GitHub_
|
||||
Easily integrate with hundreds of third-party APIs – including your own. Use API keys (which never leave your server) or let us handle OAuth for you. Install our integration packages and easily subscribe to webhooks and perform common tasks, or you can easily use your existing favorite Node.JS SDKs and get resumability and idempotency through our `runTask` function.
|
||||
|
||||
```ts
|
||||
import { Trigger } from "@trigger.dev/sdk";
|
||||
import * as github from "@trigger.dev/github";
|
||||
import * as slack from "@trigger.dev/slack";
|
||||
### Trigger.dev Connect (coming soon)
|
||||
|
||||
new Trigger({
|
||||
id: "new-github-star-to-slack",
|
||||
name: "New GitHub Star: triggerdotdev/trigger.dev",
|
||||
apiKey: "<my_api_key>",
|
||||
on: github.events.newStarEvent({
|
||||
repo: "triggerdotdev/trigger.dev",
|
||||
}),
|
||||
run: async (event) => {
|
||||
await slack.postMessage("github-stars", {
|
||||
channelName: "github-stars",
|
||||
text: `New GitHub star from \n<${event.sender.html_url}|${event.sender.login}>`,
|
||||
});
|
||||
},
|
||||
}).listen();
|
||||
```
|
||||
Easily add integrations for your users.
|
||||
|
||||
</details>
|
||||
# Getting started
|
||||
|
||||
<details><summary>Welcome email drip campaign
|
||||
</summary>
|
||||
Visit our docs [here](https://trigger.dev/docs).
|
||||
|
||||
_Integrations required: Slack, Resend_
|
||||
## Self-host
|
||||
|
||||
```ts
|
||||
import { customEvent, Trigger, sendEvent } from "@trigger.dev/sdk";
|
||||
import * as resend from "@trigger.dev/resend";
|
||||
import * as slack from "@trigger.dev/slack";
|
||||
import React from "react";
|
||||
import { z } from "zod";
|
||||
import { getUser } from "../db";
|
||||
import { InactiveEmail, TipsEmail, WelcomeEmail } from "./email-templates";
|
||||
We provide an official trigger.dev docker image you can use to easily self-host the platform. We're working on more extensive guides but we currently provide a [Fly.io example repository](https://github.com/triggerdotdev/fly.io) with instructions in the README for deploying and using a self-hosted instance of Trigger.dev on Fly.io.
|
||||
|
||||
new Trigger({
|
||||
id: "welcome-email-campaign",
|
||||
name: "Welcome email drip campaign",
|
||||
apiKey: "<my_api_key>",
|
||||
on: customEvent({
|
||||
name: "user.created",
|
||||
schema: z.object({
|
||||
userId: z.string(),
|
||||
}),
|
||||
}),
|
||||
async run(event, context) {
|
||||
//get the user data from the database
|
||||
const user = await getUser(event.userId);
|
||||
## Development
|
||||
|
||||
await slack.postMessage("send-to-slack", {
|
||||
channelName: "new-users",
|
||||
text: `New user signed up: ${user.name} (${user.email})`,
|
||||
});
|
||||
|
||||
//Send the first email
|
||||
const welcomeResponse = await resend.sendEmail("welcome-email", {
|
||||
from: "Trigger.dev <james@email.trigger.dev>",
|
||||
replyTo: "James <james@trigger.dev>",
|
||||
to: user.email,
|
||||
subject: "Welcome to Trigger.dev",
|
||||
react: <WelcomeEmail name={user.name} />,
|
||||
});
|
||||
await context.logger.debug(
|
||||
`Sent welcome email to ${welcomeResponse.to} with id ${welcomeResponse.id}`
|
||||
);
|
||||
|
||||
//wait 1 day, check if the user has created a workflow and send the appropriate email
|
||||
await context.waitFor("wait-a-while", { days: 1 });
|
||||
const updatedUser = await getUser(event.userId);
|
||||
|
||||
if (updatedUser.hasOnboarded) {
|
||||
await resend.sendEmail("onboarding-complete", {
|
||||
from: "Trigger.dev <james@email.trigger.dev>",
|
||||
replyTo: "James <james@trigger.dev>",
|
||||
to: updatedUser.email,
|
||||
subject: "Pro tips for workflows",
|
||||
react: <TipsEmail name={updatedUser.name} />,
|
||||
});
|
||||
} else {
|
||||
await resend.sendEmail("onboarding-incomplete", {
|
||||
from: "Trigger.dev <james@email.trigger.dev>",
|
||||
replyTo: "James <james@trigger.dev>",
|
||||
to: updatedUser.email,
|
||||
subject: "Help with your first workflow",
|
||||
react: <InactiveEmail name={updatedUser.name} />,
|
||||
});
|
||||
}
|
||||
},
|
||||
}).listen();
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
[More examples here](https://docs.trigger.dev/examples/examples)
|
||||
|
||||
|
||||
|
||||
# 👀 **Viewing runs:**
|
||||
|
||||
One of the most powerful features of Trigger.dev is the [runs page](https://docs.trigger.dev/viewing-runs). All of the steps in a workflow, including the initial event, can be viewed in detail. See the status / output of each step, the logs, rich previews, errors and much more.
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
# **🏠 Running Trigger.dev locally:**
|
||||
|
||||
To run Trigger.dev locally, [follow these steps](https://github.com/triggerdotdev/trigger.dev/blob/main/DEVELOPMENT.md).
|
||||
|
||||
|
||||
|
||||
# **👏 Contributing:**
|
||||
|
||||
We are open source and love contributions!
|
||||
|
||||
- Request a feature in our [Discord community](https://discord.gg/JtBAxBr2m3)
|
||||
- Open a PR
|
||||
|
||||
|
||||
|
||||
# **🧘♂️ Self-hosting guide:**
|
||||
|
||||
Please subscribe to the [GitHub issue](https://github.com/triggerdotdev/trigger.dev/issues/48) to be notified when it's live.
|
||||
|
||||
|
||||
|
||||
|
||||
# **📧 Support & contact:**
|
||||
|
||||
- Join our [Discord community](https://discord.gg/JtBAxBr2m3)
|
||||
- If you have any other questions, get in touch at [hello@trigger.dev](mailto:hello@trigger.dev)
|
||||
To setup and develop locally or contribute to the open source project, follow our [developement guide](./CONTRIBUTING.md).
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"prettier"
|
||||
],
|
||||
"env": {
|
||||
"node": true,
|
||||
"commonjs": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"plugins": ["@typescript-eslint"],
|
||||
"root": true,
|
||||
"rules": {
|
||||
"@typescript-eslint/explicit-function-return-type": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off",
|
||||
"no-console": "off"
|
||||
},
|
||||
"ignorePatterns": ["**/dist/*.js"]
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
.DS_Store
|
||||
@@ -1 +0,0 @@
|
||||
{ "workspaceId": "63ea6cff29733e58db1e6b80" }
|
||||
@@ -1,4 +0,0 @@
|
||||
node_modules
|
||||
|
||||
/build
|
||||
.env
|
||||
@@ -1,55 +0,0 @@
|
||||
FROM node:16-bullseye AS pruner
|
||||
RUN apt-get update && apt-get install openssl -y
|
||||
WORKDIR /app
|
||||
RUN npm install turbo@1.7.0 -g
|
||||
COPY . .
|
||||
RUN turbo prune --scope=integrations --docker
|
||||
RUN find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
|
||||
|
||||
# Base strategy to have layer caching
|
||||
FROM node:16-bullseye AS base
|
||||
RUN apt-get update && apt-get install openssl -y
|
||||
WORKDIR /app
|
||||
COPY .gitignore .gitignore
|
||||
COPY --from=pruner /app/out/json/ .
|
||||
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
|
||||
COPY --from=pruner /app/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
|
||||
|
||||
FROM base AS production-deps
|
||||
WORKDIR /app
|
||||
RUN npm install turbo@1.7.0 -g
|
||||
RUN corepack enable
|
||||
ENV NODE_ENV production
|
||||
COPY --from=pruner /app/out/full/apps/integrations/prisma/schema.prisma /app/apps/integrations/prisma/schema.prisma
|
||||
RUN pnpm install --prod --frozen-lockfile
|
||||
RUN pnpx prisma generate --schema /app/apps/integrations/prisma/schema.prisma
|
||||
|
||||
FROM base AS builder
|
||||
WORKDIR /app
|
||||
RUN npm install turbo@1.7.0 -g
|
||||
COPY turbo.json turbo.json
|
||||
RUN corepack enable
|
||||
COPY --from=pruner /app/out/full/ .
|
||||
ENV NODE_ENV development
|
||||
RUN pnpm install --ignore-scripts --frozen-lockfile
|
||||
ENV NODE_ENV production
|
||||
RUN pnpm run generate
|
||||
RUN pnpm run build --filter=integrations...
|
||||
RUN pnpx prisma migrate deploy --schema apps/integrations/prisma/schema.prisma
|
||||
|
||||
# Runner
|
||||
FROM node:16-bullseye AS runner
|
||||
RUN apt-get update && apt-get install openssl -y
|
||||
WORKDIR /app
|
||||
RUN corepack enable
|
||||
ENV NODE_ENV production
|
||||
RUN addgroup --system --gid 1001 nodejs
|
||||
RUN adduser --system --uid 1001 expressjs
|
||||
RUN chown -R expressjs:nodejs /app
|
||||
USER expressjs
|
||||
|
||||
COPY --from=pruner --chown=expressjs:nodejs /app/out/full/ .
|
||||
COPY --from=production-deps --chown=expressjs:nodejs /app .
|
||||
COPY --from=builder --chown=expressjs:nodejs /app/apps/integrations/dist/index.js ./apps/integrations/dist/index.js
|
||||
|
||||
ENTRYPOINT ["pnpm", "--filter", "integrations", "run", "start"]
|
||||
@@ -1,2 +0,0 @@
|
||||
# trigger-integrations
|
||||
You can create API integrations using this data and system
|
||||
@@ -1,71 +0,0 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "integrations",
|
||||
"version": "1.0.0",
|
||||
"description": "API integrations in a format that can be used to generate clients",
|
||||
"main": "./dist/index.js",
|
||||
"scripts": {
|
||||
"build": "tsup",
|
||||
"start": "node dist/index.js",
|
||||
"dev": "concurrently \"tsup --watch\" \"nodemon -r dotenv/config -q dist/index.js\"",
|
||||
"test": "vitest",
|
||||
"typecheck": "tsc -b",
|
||||
"lint": "eslint --no-error-on-unmatched-pattern src/**",
|
||||
"lint-fix": "eslint --no-error-on-unmatched-pattern --fix src/**",
|
||||
"generate-integrations": "NODE_OPTIONS=--max-old-space-size=16384 tsx src/trigger/sdk/generate.ts generate",
|
||||
"generate": "prisma generate",
|
||||
"convert": "tsx src/tools/schemas/typescript-to-json-schema.ts convert",
|
||||
"db:migrate:deploy": "prisma migrate deploy",
|
||||
"db:migrate:dev": "prisma migrate dev"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cfworker/json-schema": "^1.12.5",
|
||||
"@prisma/client": "^4.3.0",
|
||||
"@sentry/node": "^7.38.0",
|
||||
"ajv": "^8.12.0",
|
||||
"express": "^4.18.1",
|
||||
"express-async-errors": "^3.1.1",
|
||||
"json-pointer": "^0.6.2",
|
||||
"json-schema-deref-sync": "^0.14.0",
|
||||
"json-schema-to-typescript": "^11.0.3",
|
||||
"loglevel": "^1.8.1",
|
||||
"morgan": "^1.10.0",
|
||||
"node-fetch": "^3.3.0",
|
||||
"node-object-hash": "^2.3.10",
|
||||
"zod": "^3.20.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@apidevtools/json-schema-ref-parser": "^10.1.0",
|
||||
"@types/eslint": "^8.4.6",
|
||||
"@types/express": "^4.17.13",
|
||||
"@types/json-pointer": "^1.0.31",
|
||||
"@types/morgan": "^1.9.3",
|
||||
"@types/node": "^18.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.51.0",
|
||||
"commander": "^9.4.1",
|
||||
"concurrently": "^7.6.0",
|
||||
"dotenv": "^16.0.3",
|
||||
"eslint": "^8.34.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-config-standard-with-typescript": "^34.0.0",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-n": "^15.6.1",
|
||||
"eslint-plugin-promise": "^6.1.1",
|
||||
"nock": "^13.3.0",
|
||||
"nodemon": "^2.0.19",
|
||||
"prisma": "^4.3.0",
|
||||
"rimraf": "^4.1.2",
|
||||
"tiny-invariant": "^1.2.0",
|
||||
"ts-json-schema-generator": "^1.2.0",
|
||||
"ts-morph": "^17.0.1",
|
||||
"tsup": "^6.6.2",
|
||||
"tsx": "^3.12.3",
|
||||
"typescript": "^4.9.5",
|
||||
"vite": "^4.1.1",
|
||||
"vite-tsconfig-paths": "^4.0.5",
|
||||
"vitest": "^0.28.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16.0.0"
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "Cache" (
|
||||
"id" TEXT NOT NULL,
|
||||
"namespace" TEXT NOT NULL,
|
||||
"key" TEXT NOT NULL,
|
||||
"value" TEXT NOT NULL,
|
||||
"expiresAt" TIMESTAMP(3) NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "Cache_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Cache_key_key" ON "Cache"("key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "Cache_namespace_key_idx" ON "Cache"("namespace", "key");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Cache_namespace_key_key" ON "Cache"("namespace", "key");
|
||||
@@ -1,5 +0,0 @@
|
||||
-- DropIndex
|
||||
DROP INDEX "Cache_key_key";
|
||||
|
||||
-- DropIndex
|
||||
DROP INDEX "Cache_namespace_key_idx";
|
||||
@@ -1,2 +0,0 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "Cache" ALTER COLUMN "expiresAt" DROP NOT NULL;
|
||||
@@ -1,22 +0,0 @@
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
output = "../node_modules/.prisma/client"
|
||||
binaryTargets = ["native", "debian-openssl-1.1.x"]
|
||||
previewFeatures = ["orderByNulls"]
|
||||
}
|
||||
|
||||
model Cache {
|
||||
id String @id @default(cuid())
|
||||
namespace String
|
||||
key String
|
||||
value String
|
||||
expiresAt DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@unique([namespace, key])
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
import { InputSpec } from "core/action/types";
|
||||
|
||||
export function createParametersBody(
|
||||
inputSpec: InputSpec,
|
||||
params?: Record<string | number, any> | undefined
|
||||
) {
|
||||
//separate the parameters and body by looking at the spec and pulling properties out
|
||||
let parameters: Record<string, any> | undefined = undefined;
|
||||
let body: any = undefined;
|
||||
|
||||
if (params) {
|
||||
inputSpec.parameters?.forEach((p) => {
|
||||
if (!parameters) {
|
||||
parameters = {};
|
||||
}
|
||||
parameters[p.name] = params[p.name];
|
||||
});
|
||||
|
||||
//everything left should go in the body
|
||||
if (inputSpec.body) {
|
||||
body = {};
|
||||
Object.keys(params).forEach((name) => {
|
||||
if (!inputSpec.parameters?.find((p) => p.name === name)) {
|
||||
body[name] = params[name];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
parameters,
|
||||
body,
|
||||
};
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
import { DisplayProperties } from "core/action/types";
|
||||
import { Request, Response } from "express";
|
||||
import { catalog } from "integrations/catalog";
|
||||
import { z } from "zod";
|
||||
import { createParametersBody } from "./createParametersBody";
|
||||
import { getServiceAction } from "./validation";
|
||||
|
||||
const requestBodySchema = z.object({
|
||||
params: z.record(z.string().or(z.number()), z.any()).optional(),
|
||||
});
|
||||
|
||||
export async function handleActionDisplay(req: Request, res: Response) {
|
||||
const serviceActionResult = getServiceAction(req.params);
|
||||
|
||||
if (!serviceActionResult.success) {
|
||||
res
|
||||
.status(404)
|
||||
.send(
|
||||
JSON.stringify({ success: false, error: serviceActionResult.error })
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const { service, action } = serviceActionResult;
|
||||
|
||||
const parsedRequestBody = requestBodySchema.safeParse(req.body);
|
||||
if (!parsedRequestBody.success) {
|
||||
res.status(400).send(
|
||||
JSON.stringify({
|
||||
success: false,
|
||||
error: {
|
||||
type: "invalid_body",
|
||||
message: "Action not found",
|
||||
service,
|
||||
action,
|
||||
issues: parsedRequestBody.error.issues,
|
||||
},
|
||||
})
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const requestData = createParametersBody(
|
||||
action.spec.input,
|
||||
parsedRequestBody.data.params
|
||||
);
|
||||
|
||||
const displayProperties = await action.displayProperties(requestData);
|
||||
res.send(JSON.stringify({ success: true, properties: displayProperties }));
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
import { PostgresCacheService } from "cache/postgresCache";
|
||||
import { AuthCredentials } from "core/authentication/types";
|
||||
import { Service } from "core/service/types";
|
||||
import { validateInputs } from "core/validation/inputs";
|
||||
import { Request, Response } from "express";
|
||||
import { z } from "zod";
|
||||
import { error, ReturnResponse } from "../requestUtilities";
|
||||
import { createParametersBody } from "./createParametersBody";
|
||||
import { getServiceAction } from "./validation";
|
||||
|
||||
const requestBodySchema = z.object({
|
||||
credentials: z.object({ accessToken: z.string() }).optional(),
|
||||
params: z.record(z.string().or(z.number()), z.any()).optional(),
|
||||
metadata: z.object({
|
||||
requestId: z.string(),
|
||||
workflowId: z.string(),
|
||||
connectionId: z.string(),
|
||||
}),
|
||||
});
|
||||
|
||||
export async function handleAction(req: Request, res: Response) {
|
||||
const serviceActionResult = getServiceAction(req.params);
|
||||
|
||||
if (!serviceActionResult.success) {
|
||||
res
|
||||
.status(404)
|
||||
.send(JSON.stringify(error(404, false, serviceActionResult.error)));
|
||||
return;
|
||||
}
|
||||
|
||||
const { service, action } = serviceActionResult;
|
||||
|
||||
const parsedRequestBody = requestBodySchema.safeParse(req.body);
|
||||
|
||||
if (!parsedRequestBody.success) {
|
||||
res.status(400).send(
|
||||
JSON.stringify(
|
||||
error(400, false, {
|
||||
type: "invalid_body",
|
||||
message: "Action not found",
|
||||
service,
|
||||
action,
|
||||
issues: parsedRequestBody.error.issues,
|
||||
})
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
//for v1 of this API we're building the credentials from the action
|
||||
//this is fine for now but we'll want to use the connection in future to cover complex cases
|
||||
let credentials: AuthCredentials | undefined = undefined;
|
||||
if (parsedRequestBody.data.credentials && action.spec.input.security) {
|
||||
const firstSecurityMethod = Object.entries(action.spec.input.security)[0];
|
||||
if (firstSecurityMethod) {
|
||||
const [name, scopes] = firstSecurityMethod;
|
||||
//get the full info from the service
|
||||
const securityMethod = service.authentication[name];
|
||||
|
||||
switch (securityMethod.type) {
|
||||
case "oauth2":
|
||||
credentials = {
|
||||
type: "oauth2",
|
||||
name,
|
||||
accessToken: parsedRequestBody.data.credentials.accessToken,
|
||||
scopes,
|
||||
};
|
||||
break;
|
||||
case "api_key":
|
||||
credentials = {
|
||||
type: "api_key",
|
||||
name,
|
||||
api_key: parsedRequestBody.data.credentials.accessToken,
|
||||
scopes,
|
||||
};
|
||||
break;
|
||||
default:
|
||||
throw new Error(
|
||||
`Not implemented credentials for: ${JSON.stringify(securityMethod)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const { parameters, body } = createParametersBody(
|
||||
action.spec.input,
|
||||
parsedRequestBody.data.params
|
||||
);
|
||||
|
||||
const inputValidationResult = await validateInputs(action.spec.input, {
|
||||
parameters,
|
||||
body,
|
||||
credentials,
|
||||
});
|
||||
if (!inputValidationResult.success) {
|
||||
res
|
||||
.status(400)
|
||||
.send(JSON.stringify(error(400, false, inputValidationResult.error)));
|
||||
return;
|
||||
}
|
||||
|
||||
const { metadata } = parsedRequestBody.data;
|
||||
const cache = new PostgresCacheService(`${metadata.connectionId}-${service}`);
|
||||
|
||||
try {
|
||||
const data = await action.action(
|
||||
{ credentials, parameters, body },
|
||||
cache,
|
||||
metadata
|
||||
);
|
||||
|
||||
//convert into the format for the webapp
|
||||
const response: ReturnResponse = {
|
||||
ok: true,
|
||||
isRetryable: isRetryable(service, data.status),
|
||||
response: {
|
||||
output: data.body ?? {},
|
||||
context: {
|
||||
statusCode: data.status,
|
||||
headers: data.headers,
|
||||
},
|
||||
},
|
||||
};
|
||||
res.send(JSON.stringify(response));
|
||||
} catch (e: any) {
|
||||
console.error(e);
|
||||
|
||||
if (e instanceof Error) {
|
||||
res
|
||||
.status(500)
|
||||
.send(JSON.stringify(error(500, false, { error: JSON.stringify(e) })));
|
||||
return;
|
||||
}
|
||||
|
||||
if ("error" in e) {
|
||||
res.status(500).send(JSON.stringify(error(500, false, e.error)));
|
||||
return;
|
||||
}
|
||||
|
||||
res
|
||||
.status(500)
|
||||
.send(JSON.stringify(error(500, false, { error: JSON.stringify(e) })));
|
||||
}
|
||||
}
|
||||
|
||||
function isRetryable(service: Service, status: number): boolean {
|
||||
return service.retryableStatusCodes.includes(status);
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
import { Action } from "core/action/types";
|
||||
import { Service } from "core/service/types";
|
||||
import { Request } from "express";
|
||||
import { catalog } from "integrations/catalog";
|
||||
|
||||
type ServiceActionResult =
|
||||
| {
|
||||
success: true;
|
||||
service: Service;
|
||||
action: Action;
|
||||
}
|
||||
| {
|
||||
success: false;
|
||||
error: Record<string, any>;
|
||||
};
|
||||
|
||||
export function getServiceAction(
|
||||
params: Request["params"]
|
||||
): ServiceActionResult {
|
||||
const { service, action } = params;
|
||||
|
||||
const matchingService = Object.values(catalog.services).find(
|
||||
(s) => s.service === service
|
||||
);
|
||||
|
||||
if (!matchingService) {
|
||||
return {
|
||||
success: false,
|
||||
error: { type: "missing_service", message: "Service not found", service },
|
||||
};
|
||||
}
|
||||
|
||||
const matchingAction = Object.values(matchingService.actions).find(
|
||||
(a) => a.name === action
|
||||
);
|
||||
|
||||
if (!matchingAction) {
|
||||
return {
|
||||
success: false,
|
||||
error: {
|
||||
type: "missing_action",
|
||||
message: "Action not found",
|
||||
service,
|
||||
action,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return { success: true, service: matchingService, action: matchingAction };
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
import { AuthCredentials } from "core/authentication/types";
|
||||
import { HTTPMethodSchema } from "core/endpoint/types";
|
||||
import { serviceFetch } from "core/fetch/serviceFetch";
|
||||
import { Request, Response } from "express";
|
||||
import { catalog } from "integrations/catalog";
|
||||
import { z } from "zod";
|
||||
import { error } from "./requestUtilities";
|
||||
|
||||
const requestBodySchema = z.object({
|
||||
credentials: z.object({ accessToken: z.string() }).optional(),
|
||||
path: z.string(),
|
||||
method: HTTPMethodSchema,
|
||||
headers: z.record(z.string(), z.string()).optional(),
|
||||
body: z.any(),
|
||||
});
|
||||
|
||||
type ReturnResponse = {
|
||||
response: NormalizedResponse;
|
||||
isRetryable: boolean;
|
||||
ok: boolean;
|
||||
};
|
||||
|
||||
type NormalizedResponse = {
|
||||
output: NonNullable<any>;
|
||||
context: any;
|
||||
};
|
||||
|
||||
export async function handleAction(req: Request, res: Response) {
|
||||
const { service } = req.params;
|
||||
|
||||
const matchingService = Object.values(catalog.services).find(
|
||||
(s) => s.service === service
|
||||
);
|
||||
|
||||
if (!matchingService) {
|
||||
return {
|
||||
success: false,
|
||||
error: { type: "missing_service", message: "Service not found", service },
|
||||
};
|
||||
}
|
||||
|
||||
const parsedRequestBody = requestBodySchema.safeParse(req.body);
|
||||
|
||||
if (!parsedRequestBody.success) {
|
||||
res.status(400).send(
|
||||
JSON.stringify(
|
||||
error(400, false, {
|
||||
type: "invalid_body",
|
||||
message: "Invalid input",
|
||||
issues: parsedRequestBody.error.issues,
|
||||
})
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
//v1 build credentials from the service authentication info
|
||||
let credentials: AuthCredentials | undefined = undefined;
|
||||
if (parsedRequestBody.data.credentials) {
|
||||
//just get the first security method
|
||||
const [name, securityMethod] = Object.entries(
|
||||
matchingService.authentication
|
||||
)[0];
|
||||
|
||||
switch (securityMethod.type) {
|
||||
case "oauth2":
|
||||
credentials = {
|
||||
type: "oauth2",
|
||||
name,
|
||||
accessToken: parsedRequestBody.data.credentials.accessToken,
|
||||
scopes: Object.keys(securityMethod.scopes),
|
||||
};
|
||||
break;
|
||||
case "api_key":
|
||||
credentials = {
|
||||
type: "api_key",
|
||||
name,
|
||||
api_key: parsedRequestBody.data.credentials.accessToken,
|
||||
scopes: Object.keys(securityMethod.scopes),
|
||||
};
|
||||
break;
|
||||
default:
|
||||
throw new Error(
|
||||
`Not implemented credentials for: ${JSON.stringify(securityMethod)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const url = matchingService.baseUrl + parsedRequestBody.data.path;
|
||||
|
||||
const data = await serviceFetch({
|
||||
url,
|
||||
method: parsedRequestBody.data.method,
|
||||
headers: parsedRequestBody.data.headers,
|
||||
body: parsedRequestBody.data.body,
|
||||
authentication: matchingService.authentication,
|
||||
credentials,
|
||||
});
|
||||
|
||||
const response: ReturnResponse = {
|
||||
ok: true,
|
||||
isRetryable: isRetryable(data.status),
|
||||
response: {
|
||||
output: data.body ?? {},
|
||||
context: {
|
||||
statusCode: data.status,
|
||||
headers: data.headers,
|
||||
},
|
||||
},
|
||||
};
|
||||
res.send(JSON.stringify(response));
|
||||
}
|
||||
|
||||
function isRetryable(statusCode: number) {
|
||||
return [408, 429, 500, 502, 503, 504].includes(statusCode);
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
export type ReturnResponse = {
|
||||
response: NormalizedResponse;
|
||||
isRetryable: boolean;
|
||||
ok: boolean;
|
||||
};
|
||||
|
||||
export type NormalizedResponse = {
|
||||
output: NonNullable<any>;
|
||||
context: any;
|
||||
};
|
||||
|
||||
export function error(
|
||||
status: number,
|
||||
isRetryable: boolean,
|
||||
error: Record<string, any>
|
||||
): ReturnResponse {
|
||||
const response: ReturnResponse = {
|
||||
ok: false,
|
||||
isRetryable,
|
||||
response: {
|
||||
output: error,
|
||||
context: {
|
||||
statusCode: status,
|
||||
headers: {},
|
||||
},
|
||||
},
|
||||
};
|
||||
return response;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import { IntegrationAuthentication } from "core/authentication/types";
|
||||
import { Service } from "core/service/types";
|
||||
import { Request, Response } from "express";
|
||||
import { catalog } from "integrations/catalog";
|
||||
|
||||
type ServiceMetadata = {
|
||||
name: string;
|
||||
service: string;
|
||||
version: string;
|
||||
icon: string;
|
||||
live: boolean;
|
||||
authentication: IntegrationAuthentication;
|
||||
};
|
||||
|
||||
export async function handleServices(_req: Request, res: Response) {
|
||||
const servicesMetadata: Record<string, ServiceMetadata> = {};
|
||||
Object.entries(catalog.services).forEach(([key, service]) => {
|
||||
if (service.live === false) return;
|
||||
const metadata = omitExtraInfo(service);
|
||||
servicesMetadata[key] = {
|
||||
...metadata,
|
||||
icon: `/integrations/${metadata.service}.png`,
|
||||
};
|
||||
});
|
||||
|
||||
res.send(
|
||||
JSON.stringify({
|
||||
services: servicesMetadata,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function omitExtraInfo(
|
||||
service: Service
|
||||
): Omit<Service, "actions" | "retryableStatusCodes"> {
|
||||
const { actions, retryableStatusCodes, ...rest } = service;
|
||||
return rest;
|
||||
}
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
import { PrismaClient, Prisma } from ".prisma/client";
|
||||
import invariant from "tiny-invariant";
|
||||
|
||||
export { Prisma };
|
||||
|
||||
let prisma: PrismaClient;
|
||||
|
||||
declare global {
|
||||
// eslint-disable-next-line no-var
|
||||
var __db__: PrismaClient;
|
||||
}
|
||||
|
||||
// this is needed because in development we don't want to restart
|
||||
// the server with every change, but we want to make sure we don't
|
||||
// create a new connection to the DB with every change either.
|
||||
// in production we'll have a single connection to the DB.
|
||||
if (process.env.NODE_ENV === "production") {
|
||||
prisma = getClient();
|
||||
} else {
|
||||
if (!global.__db__) {
|
||||
global.__db__ = getClient();
|
||||
}
|
||||
prisma = global.__db__;
|
||||
}
|
||||
|
||||
function getClient() {
|
||||
const { DATABASE_URL } = process.env;
|
||||
invariant(typeof DATABASE_URL === "string", "DATABASE_URL env var not set");
|
||||
|
||||
// Remove the username:password in the url and print that to the console
|
||||
const urlWithoutCredentials = new URL(DATABASE_URL);
|
||||
urlWithoutCredentials.password = "";
|
||||
|
||||
console.log(
|
||||
`1. 🔌 setting up prisma client to ${urlWithoutCredentials.toString()}`
|
||||
);
|
||||
|
||||
const client = new PrismaClient({
|
||||
datasources: {
|
||||
db: {
|
||||
url: DATABASE_URL,
|
||||
},
|
||||
},
|
||||
log: ["warn", "error"],
|
||||
});
|
||||
|
||||
console.log(`2.0 🔌 prisma client connecting`);
|
||||
|
||||
// connect eagerly
|
||||
client.$connect();
|
||||
|
||||
console.log(`3.0 🔌 prisma client connected`);
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
export { prisma };
|
||||
export type { PrismaClient } from ".prisma/client";
|
||||
-53
@@ -1,53 +0,0 @@
|
||||
import type { Prisma, Cache } from ".prisma/client";
|
||||
import { prisma } from "./db.server";
|
||||
import { CacheService } from "core/cache/types";
|
||||
|
||||
export class PostgresCacheService implements CacheService {
|
||||
constructor(private readonly namespace: string) {}
|
||||
|
||||
async get(key: string) {
|
||||
const cachedRow = await prisma.cache.findFirst({
|
||||
where: {
|
||||
namespace: this.namespace,
|
||||
key,
|
||||
OR: [
|
||||
{ expiresAt: null },
|
||||
{
|
||||
expiresAt: {
|
||||
gt: new Date(),
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
if (cachedRow) {
|
||||
return cachedRow.value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
async set(key: string, value: string, ttl?: number): Promise<void> {
|
||||
const expiresAt = ttl ? new Date(Date.now() + ttl * 1000) : null;
|
||||
|
||||
await prisma.cache.upsert({
|
||||
where: {
|
||||
namespace_key: {
|
||||
namespace: this.namespace,
|
||||
key,
|
||||
},
|
||||
},
|
||||
update: {
|
||||
value,
|
||||
expiresAt,
|
||||
},
|
||||
create: {
|
||||
namespace: this.namespace,
|
||||
key,
|
||||
value,
|
||||
expiresAt,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import { EndpointSpecMetadata } from "core/endpoint/types";
|
||||
import { RequestData } from "core/request/types";
|
||||
|
||||
export async function getDisplayProperties(
|
||||
data: RequestData,
|
||||
displayProperties: EndpointSpecMetadata["displayProperties"]
|
||||
) {
|
||||
return {
|
||||
title: interpolateString(displayProperties.title, {
|
||||
parameters: data.parameters,
|
||||
body: data.body,
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
function interpolateString(
|
||||
template: string,
|
||||
data: Record<string | number, any>
|
||||
) {
|
||||
return template.replace(/\${([^}]+)}/g, (_, key) => {
|
||||
return key
|
||||
.split(".")
|
||||
.reduce((obj: Record<string | number, any>, prop: string | number) => {
|
||||
return obj[prop];
|
||||
}, data);
|
||||
});
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
import { CacheService } from "core/cache/types";
|
||||
import { Endpoint } from "core/endpoint/types";
|
||||
import { RequestData, RequestResponse } from "core/request/types";
|
||||
import { getDisplayProperties } from "./getDisplayProperties";
|
||||
import { Action, InputSpec, Metadata, OutputSpec } from "./types";
|
||||
import { makeInputSpec, makeOutputSpec } from "./utilities";
|
||||
|
||||
/** Create an action where you specify the spec and action */
|
||||
export const makeAdvancedAction = ({
|
||||
endpoint,
|
||||
spec,
|
||||
action,
|
||||
}: {
|
||||
endpoint: Endpoint;
|
||||
spec: Action["spec"];
|
||||
action: (
|
||||
data: RequestData,
|
||||
cache?: CacheService,
|
||||
metadata?: Metadata
|
||||
) => Promise<RequestResponse>;
|
||||
}) => {
|
||||
const displayProperties = async (data: RequestData) => {
|
||||
return getDisplayProperties(
|
||||
data,
|
||||
endpoint.spec.endpointSpec.metadata.displayProperties
|
||||
);
|
||||
};
|
||||
|
||||
return {
|
||||
name: endpoint.spec.endpointSpec.metadata.name,
|
||||
description: endpoint.spec.endpointSpec.metadata.description,
|
||||
path: endpoint.spec.endpointSpec.path,
|
||||
method: endpoint.spec.endpointSpec.method,
|
||||
spec,
|
||||
action,
|
||||
displayProperties,
|
||||
};
|
||||
};
|
||||
|
||||
/** Creates an action where the spec and data is manipulated */
|
||||
export const makeSimpleAction = (
|
||||
endpoint: Endpoint,
|
||||
processSpec?: (specs: Action["spec"]) => Action["spec"],
|
||||
preRequest?: (data: RequestData) => RequestData
|
||||
) => {
|
||||
let specs = {
|
||||
input: makeInputSpec(endpoint),
|
||||
output: makeOutputSpec(endpoint),
|
||||
};
|
||||
|
||||
if (processSpec) {
|
||||
specs = processSpec(specs);
|
||||
}
|
||||
|
||||
const action = async (
|
||||
data: RequestData,
|
||||
cache?: CacheService,
|
||||
metadata?: Metadata
|
||||
) => {
|
||||
if (preRequest) {
|
||||
data = preRequest(data);
|
||||
}
|
||||
//a simple request doesn't use the cache or metadata
|
||||
return await endpoint.request(data);
|
||||
};
|
||||
|
||||
return makeAdvancedAction({
|
||||
endpoint,
|
||||
spec: specs,
|
||||
action,
|
||||
});
|
||||
};
|
||||
|
||||
export const makeSimpleActions = <
|
||||
TEndpoints extends Record<string, Endpoint>,
|
||||
K extends keyof TEndpoints
|
||||
>(
|
||||
endpoints: TEndpoints,
|
||||
processSpec?: (specs: Action["spec"]) => Action["spec"],
|
||||
preRequest?: (data: RequestData) => RequestData
|
||||
): Record<K, Action> => {
|
||||
const actions: any = {};
|
||||
|
||||
Object.entries(endpoints).forEach(([name, endpoint]) => {
|
||||
actions[name as K] = makeSimpleAction(endpoint, processSpec, preRequest);
|
||||
});
|
||||
|
||||
return actions;
|
||||
};
|
||||
@@ -1,42 +0,0 @@
|
||||
import { CacheService } from "core/cache/types";
|
||||
import { EndpointSpec, HTTPMethod } from "core/endpoint/types";
|
||||
import { RequestData, RequestResponse } from "core/request/types";
|
||||
|
||||
export type InputSpec = {
|
||||
security?: EndpointSpec["security"];
|
||||
parameters?: EndpointSpec["parameters"];
|
||||
body?: NonNullable<EndpointSpec["request"]["body"]>["schema"];
|
||||
};
|
||||
|
||||
export type OutputSpec = {
|
||||
responses: EndpointSpec["responses"];
|
||||
};
|
||||
|
||||
export type Metadata = Record<string, any>;
|
||||
|
||||
export type DisplayProperties = {
|
||||
title: string;
|
||||
};
|
||||
|
||||
export type Action = {
|
||||
name: string;
|
||||
description: string;
|
||||
path: string;
|
||||
method: HTTPMethod;
|
||||
spec: {
|
||||
input: InputSpec;
|
||||
output: OutputSpec;
|
||||
};
|
||||
action: (
|
||||
/** The data to be sent to the endpoint */
|
||||
data: RequestData,
|
||||
/** The cache service to use for caching */
|
||||
cache?: CacheService,
|
||||
/** Additional metadata that can be used to modify the request */
|
||||
metadata?: Metadata
|
||||
) => Promise<RequestResponse>;
|
||||
displayProperties: (
|
||||
/** The data to be sent to the endpoint */
|
||||
data: RequestData
|
||||
) => Promise<DisplayProperties>;
|
||||
};
|
||||
@@ -1,49 +0,0 @@
|
||||
import { Endpoint } from "core/endpoint/types";
|
||||
import { InputSpec, OutputSpec } from "./types";
|
||||
|
||||
export function makeInputSpec(endpoint: Endpoint): InputSpec {
|
||||
return {
|
||||
security: endpoint.spec.endpointSpec.security,
|
||||
parameters: endpoint.spec.endpointSpec.parameters,
|
||||
body: endpoint.spec.endpointSpec.request.body?.schema,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeOutputSpec(endpoint: Endpoint): OutputSpec {
|
||||
return {
|
||||
responses: endpoint.spec.endpointSpec.responses,
|
||||
};
|
||||
}
|
||||
|
||||
export function combineSecurityScopes(
|
||||
securities: (Record<string, string[]> | undefined)[]
|
||||
): Record<string, string[]> | undefined {
|
||||
const securityA = securities[0];
|
||||
const securityB = securities[1];
|
||||
|
||||
//where a key already exists, concatenate the scope arrays together
|
||||
//where a key does not exist, add it to the object
|
||||
let combined: Record<string, string[]> = {};
|
||||
|
||||
if (securityA) {
|
||||
combined = {
|
||||
...securityA,
|
||||
};
|
||||
}
|
||||
|
||||
if (securityB) {
|
||||
for (const key in securityB) {
|
||||
if (combined[key]) {
|
||||
combined[key] = [...combined[key], ...securityB[key]];
|
||||
} else {
|
||||
combined[key] = securityB[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (securities.length > 2) {
|
||||
return combineSecurityScopes([combined, ...securities.slice(2)]);
|
||||
}
|
||||
|
||||
return combined;
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
import { EndpointSpec } from "core/endpoint/types";
|
||||
import { FetchConfig } from "core/request/types";
|
||||
import { expect, test } from "vitest";
|
||||
import { checkRequiredScopes, applyCredentials } from "./credentials";
|
||||
import { AuthCredentials, IntegrationAuthentication } from "./types";
|
||||
|
||||
test("Required scopes present", async () => {
|
||||
const credentials: AuthCredentials = {
|
||||
type: "oauth2",
|
||||
name: "authName",
|
||||
accessToken: "token",
|
||||
scopes: ["scope1", "scope2"],
|
||||
};
|
||||
|
||||
const requiredScopes = ["scope1", "scope2"];
|
||||
|
||||
const result = checkRequiredScopes(requiredScopes, credentials);
|
||||
expect(result.success).toEqual(true);
|
||||
});
|
||||
|
||||
test("Required scopes missing", async () => {
|
||||
const credentials: AuthCredentials = {
|
||||
type: "oauth2",
|
||||
name: "authName",
|
||||
accessToken: "token",
|
||||
scopes: ["scope1", "scope2"],
|
||||
};
|
||||
|
||||
const requiredScopes = ["scope1", "scope2", "scope3"];
|
||||
|
||||
const result = checkRequiredScopes(requiredScopes, credentials);
|
||||
expect(result.success).toEqual(false);
|
||||
if (result.success) throw new Error("Should not be success");
|
||||
expect(result.missingScopes).toEqual(["scope3"]);
|
||||
});
|
||||
|
||||
test("Applied credentials", async () => {
|
||||
const credentials: AuthCredentials = {
|
||||
type: "oauth2",
|
||||
name: "authName",
|
||||
accessToken: "123456",
|
||||
scopes: ["scope1", "scope2"],
|
||||
};
|
||||
const endpointSecurity: EndpointSpec["security"] = {
|
||||
authName: ["scope1", "scope2"],
|
||||
};
|
||||
|
||||
const integrationAuthentication: IntegrationAuthentication = {
|
||||
authName: {
|
||||
type: "oauth2",
|
||||
placement: {
|
||||
in: "header",
|
||||
type: "bearer",
|
||||
key: "Authorization",
|
||||
},
|
||||
authorizationUrl: "https://example.com",
|
||||
tokenUrl: "https://example.com",
|
||||
flow: "accessCode",
|
||||
scopes: {
|
||||
scope1: "scope1",
|
||||
scope2: "scope2",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const existingFetch: FetchConfig = {
|
||||
url: "https://example.com",
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
};
|
||||
|
||||
const fetchConfig = applyCredentials(existingFetch, {
|
||||
endpointSecurity,
|
||||
authentication: integrationAuthentication,
|
||||
credentials,
|
||||
});
|
||||
|
||||
expect(fetchConfig.headers.Authorization).toEqual("Bearer 123456");
|
||||
expect(fetchConfig.headers["Content-Type"]).toEqual("application/json");
|
||||
});
|
||||
@@ -1,107 +0,0 @@
|
||||
import { EndpointSpec } from "core/endpoint/types";
|
||||
import { InsufficientScopesError } from "core/request/errors";
|
||||
import { FetchConfig } from "core/request/types";
|
||||
import { IntegrationAuthentication, AuthCredentials } from "./types";
|
||||
|
||||
/** Apply the given credentials to the given fetch config */
|
||||
export function applyCredentials(
|
||||
fetch: FetchConfig,
|
||||
{
|
||||
endpointSecurity,
|
||||
authentication,
|
||||
credentials,
|
||||
}: {
|
||||
endpointSecurity: EndpointSpec["security"];
|
||||
authentication: IntegrationAuthentication;
|
||||
credentials: AuthCredentials;
|
||||
}
|
||||
): FetchConfig {
|
||||
if (endpointSecurity === undefined) return fetch;
|
||||
// check if the credentials have the required scopes
|
||||
const requiredScopes = endpointSecurity[credentials.name] ?? [];
|
||||
const scopesCheckResult = checkRequiredScopes(requiredScopes, credentials);
|
||||
if (!scopesCheckResult.success) {
|
||||
const error: InsufficientScopesError = {
|
||||
type: "insufficient_scopes",
|
||||
missingScopes: scopesCheckResult.missingScopes,
|
||||
};
|
||||
throw error;
|
||||
}
|
||||
|
||||
return addCredentialsToConfig(fetch, { authentication, credentials });
|
||||
}
|
||||
|
||||
export function addCredentialsToConfig(
|
||||
fetch: FetchConfig,
|
||||
{
|
||||
authentication,
|
||||
credentials,
|
||||
}: {
|
||||
authentication: IntegrationAuthentication;
|
||||
credentials: AuthCredentials;
|
||||
}
|
||||
) {
|
||||
// apply the credentials
|
||||
switch (credentials.type) {
|
||||
case "oauth2": {
|
||||
const authConfig = authentication[credentials.name];
|
||||
switch (authConfig.placement.in) {
|
||||
case "header": {
|
||||
fetch.headers[
|
||||
authConfig.placement.key
|
||||
] = `Bearer ${credentials.accessToken}`;
|
||||
return fetch;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "api_key": {
|
||||
const authConfig = authentication[credentials.name];
|
||||
if (authConfig.placement.in === "header") {
|
||||
let value = "";
|
||||
switch (authConfig.placement.type) {
|
||||
case "basic":
|
||||
value = `Basic ${credentials.api_key}`;
|
||||
break;
|
||||
case "bearer":
|
||||
value = `Bearer ${credentials.api_key}`;
|
||||
break;
|
||||
}
|
||||
fetch.headers[authConfig.placement.key] = value;
|
||||
}
|
||||
return fetch;
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Invalid credentials");
|
||||
}
|
||||
|
||||
type ScopesCheckResult =
|
||||
| {
|
||||
success: true;
|
||||
}
|
||||
| {
|
||||
success: false;
|
||||
missingScopes: string[];
|
||||
};
|
||||
|
||||
/** Check if the given credentials have the required scopes */
|
||||
export function checkRequiredScopes(
|
||||
requiredScopes: string[],
|
||||
credentials: AuthCredentials
|
||||
): ScopesCheckResult {
|
||||
const missingScopes = requiredScopes.filter(
|
||||
(scope) => !credentials.scopes.includes(scope)
|
||||
);
|
||||
|
||||
if (missingScopes.length > 0) {
|
||||
return {
|
||||
success: false,
|
||||
missingScopes,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
};
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
import { z } from "zod";
|
||||
|
||||
export type IntegrationAuthentication = Record<
|
||||
string,
|
||||
AuthenticationDefinition
|
||||
>;
|
||||
|
||||
type AuthenticationDefinition = OAuth2Authentication | APIKeyAuthentication;
|
||||
|
||||
type OAuth2Authentication = {
|
||||
type: "oauth2";
|
||||
placement: AuthenticationPlacement;
|
||||
authorizationUrl: string;
|
||||
tokenUrl: string;
|
||||
flow: "accessCode" | "implicit" | "password" | "application";
|
||||
scopes: Record<string, string>;
|
||||
};
|
||||
|
||||
type APIKeyAuthentication = {
|
||||
type: "api_key";
|
||||
placement: AuthenticationPlacement;
|
||||
documentation: string;
|
||||
scopes: Record<string, string>;
|
||||
additionalFields?: {
|
||||
key: string;
|
||||
fieldType: "text";
|
||||
name: string;
|
||||
placeholder?: string;
|
||||
description: string;
|
||||
}[];
|
||||
};
|
||||
|
||||
type AuthenticationPlacement = HeaderAuthentication;
|
||||
|
||||
interface HeaderAuthentication {
|
||||
in: "header";
|
||||
type: "basic" | "bearer";
|
||||
key: string;
|
||||
}
|
||||
|
||||
const OAuth2CredentialsSchema = z.object({
|
||||
type: z.literal("oauth2"),
|
||||
name: z.string(),
|
||||
accessToken: z.string(),
|
||||
scopes: z.array(z.string()),
|
||||
});
|
||||
|
||||
const APIKeyCredentialsSchema = z.object({
|
||||
type: z.literal("api_key"),
|
||||
name: z.string(),
|
||||
api_key: z.string(),
|
||||
additionalFields: z.record(z.string(), z.string()).optional(),
|
||||
scopes: z.array(z.string()),
|
||||
});
|
||||
|
||||
export const AuthCredentialsSchema = z.discriminatedUnion("type", [
|
||||
OAuth2CredentialsSchema,
|
||||
APIKeyCredentialsSchema,
|
||||
]);
|
||||
|
||||
export type AuthCredentials = z.infer<typeof AuthCredentialsSchema>;
|
||||
-4
@@ -1,4 +0,0 @@
|
||||
export interface CacheService {
|
||||
get: (key: string) => Promise<string | null>;
|
||||
set: (key: string, value: string, ttl?: number) => Promise<void>;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
import { Service } from "./service/types";
|
||||
|
||||
export type Catalog = {
|
||||
services: Record<string, Service>;
|
||||
};
|
||||
@@ -1,36 +0,0 @@
|
||||
import { IntegrationAuthentication } from "core/authentication/types";
|
||||
import { requestEndpoint } from "core/request/requestEndpoint";
|
||||
import { RequestData, RequestResponse, RequestSpec } from "core/request/types";
|
||||
import { Endpoint, EndpointSpec } from "./types";
|
||||
|
||||
export const makeEndpoint = (spec: RequestSpec) => {
|
||||
const request = async (data: RequestData) => {
|
||||
return await requestEndpoint(spec, data);
|
||||
};
|
||||
|
||||
return {
|
||||
spec,
|
||||
request,
|
||||
};
|
||||
};
|
||||
|
||||
export const makeEndpoints = <
|
||||
TSpecs extends Record<string, EndpointSpec>,
|
||||
K extends keyof TSpecs
|
||||
>(
|
||||
baseUrl: string,
|
||||
authentication: IntegrationAuthentication,
|
||||
specs: TSpecs
|
||||
): Record<K, Endpoint> => {
|
||||
const endpoints: any = {};
|
||||
|
||||
Object.entries(specs).forEach(([name, spec]) => {
|
||||
endpoints[name as K] = makeEndpoint({
|
||||
baseUrl,
|
||||
endpointSpec: spec,
|
||||
authentication,
|
||||
});
|
||||
});
|
||||
|
||||
return endpoints;
|
||||
};
|
||||
@@ -1,78 +0,0 @@
|
||||
import { RequestData, RequestResponse, RequestSpec } from "core/request/types";
|
||||
import { JSONSchema } from "core/schemas/types";
|
||||
import { z } from "zod";
|
||||
|
||||
export type Endpoint = {
|
||||
spec: RequestSpec;
|
||||
request: (data: RequestData) => Promise<RequestResponse>;
|
||||
};
|
||||
|
||||
export const HTTPMethodSchema = z.union([
|
||||
z.literal("GET"),
|
||||
z.literal("POST"),
|
||||
z.literal("PUT"),
|
||||
z.literal("PATCH"),
|
||||
z.literal("DELETE"),
|
||||
z.literal("HEAD"),
|
||||
z.literal("OPTIONS"),
|
||||
z.literal("TRACE"),
|
||||
]);
|
||||
|
||||
export type HTTPMethod = z.infer<typeof HTTPMethodSchema>;
|
||||
|
||||
export interface EndpointSpec {
|
||||
path: string;
|
||||
method: HTTPMethod;
|
||||
metadata: EndpointSpecMetadata;
|
||||
parameters?: EndpointSpecParameter[];
|
||||
security?: Record<string, string[]>;
|
||||
request: EndpointSpecRequest;
|
||||
responses: EndpointSpecResponse[];
|
||||
}
|
||||
|
||||
export interface EndpointSpecParameter {
|
||||
name: string;
|
||||
description: string;
|
||||
in: "query" | "path" | "header";
|
||||
required?: boolean;
|
||||
schema: JSONSchema;
|
||||
}
|
||||
|
||||
interface EndpointSpecRequest {
|
||||
headers?: Record<string, string>;
|
||||
body?: {
|
||||
schema: JSONSchema;
|
||||
};
|
||||
}
|
||||
|
||||
export interface EndpointSpecResponse {
|
||||
/** If you return true then this response is the relevant one */
|
||||
matches: ({
|
||||
statusCode,
|
||||
headers,
|
||||
body,
|
||||
}: {
|
||||
statusCode: number;
|
||||
headers: Record<string, string>;
|
||||
body: any;
|
||||
}) => boolean;
|
||||
success: boolean;
|
||||
name: string;
|
||||
description?: string;
|
||||
schema?: JSONSchema;
|
||||
}
|
||||
|
||||
export interface EndpointSpecMetadata {
|
||||
name: string;
|
||||
description: string;
|
||||
displayProperties: {
|
||||
title: string;
|
||||
};
|
||||
externalDocs?: ExternalDocs;
|
||||
tags: string[];
|
||||
}
|
||||
|
||||
interface ExternalDocs {
|
||||
description: string;
|
||||
url: string;
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
import { RequestResponse } from "core/request/types";
|
||||
import { type Response } from "node-fetch";
|
||||
|
||||
export async function getFetch() {
|
||||
return (await import("node-fetch")).default;
|
||||
}
|
||||
|
||||
export async function safeGetJson(response: Response) {
|
||||
try {
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export function normalizeHeaders(headers: Headers): Record<string, string> {
|
||||
const normalizedHeaders: Record<string, string> = {};
|
||||
|
||||
headers.forEach((value, key) => {
|
||||
normalizedHeaders[key.toLowerCase()] = value;
|
||||
});
|
||||
|
||||
return normalizedHeaders;
|
||||
}
|
||||
|
||||
export function responseFromCaughtError(error: any): RequestResponse {
|
||||
if (error instanceof Error) {
|
||||
return {
|
||||
success: false,
|
||||
status: 400,
|
||||
headers: {},
|
||||
body: { error: error.message },
|
||||
};
|
||||
}
|
||||
|
||||
//convert the error into JSON
|
||||
return {
|
||||
success: false,
|
||||
status: 400,
|
||||
headers: {},
|
||||
body: { error },
|
||||
};
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
import { authentication } from "integrations/airtable/authentication";
|
||||
import { startNock, stopNock } from "testing/nock";
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { serviceFetch } from "./serviceFetch";
|
||||
const authToken = () => process.env.AIRTABLE_TOKEN ?? "";
|
||||
|
||||
describe("serviceFetch", async () => {
|
||||
test("simple GET", async () => {
|
||||
const accessToken = authToken();
|
||||
|
||||
const nockDone = await startNock("serviceFetch.simple.get");
|
||||
const response = await serviceFetch({
|
||||
url: "https://api.airtable.com/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m/recHcnB1MbBr9Rd2P",
|
||||
method: "GET",
|
||||
authentication: authentication,
|
||||
credentials: {
|
||||
type: "oauth2",
|
||||
name: "oauth",
|
||||
accessToken,
|
||||
scopes: ["data.records:read"],
|
||||
},
|
||||
});
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(response.success).toEqual(true);
|
||||
expect(response.body).not.toBeNull();
|
||||
stopNock(nockDone);
|
||||
});
|
||||
});
|
||||
@@ -1,73 +0,0 @@
|
||||
import { addCredentialsToConfig } from "core/authentication/credentials";
|
||||
import {
|
||||
AuthCredentials,
|
||||
IntegrationAuthentication,
|
||||
} from "core/authentication/types";
|
||||
import { HTTPMethod } from "core/endpoint/types";
|
||||
import { FetchConfig, RequestResponse } from "core/request/types";
|
||||
import {
|
||||
getFetch,
|
||||
normalizeHeaders,
|
||||
responseFromCaughtError,
|
||||
safeGetJson,
|
||||
} from "./fetchUtilities";
|
||||
|
||||
export type ServiceFetchOptions = {
|
||||
url: string;
|
||||
method: HTTPMethod;
|
||||
headers?: Record<string, string>;
|
||||
body?: any;
|
||||
authentication: IntegrationAuthentication;
|
||||
credentials?: AuthCredentials;
|
||||
};
|
||||
|
||||
export async function serviceFetch({
|
||||
url,
|
||||
method = "GET",
|
||||
headers,
|
||||
body,
|
||||
credentials,
|
||||
authentication,
|
||||
}: ServiceFetchOptions): Promise<RequestResponse> {
|
||||
let fetchConfig: FetchConfig = {
|
||||
url,
|
||||
method,
|
||||
headers: {
|
||||
...headers,
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
};
|
||||
|
||||
if (credentials == null) {
|
||||
throw {
|
||||
type: "missing_credentials",
|
||||
};
|
||||
}
|
||||
|
||||
fetchConfig = addCredentialsToConfig(fetchConfig, {
|
||||
authentication,
|
||||
credentials,
|
||||
});
|
||||
|
||||
const fetchObject = {
|
||||
method: fetchConfig.method,
|
||||
headers: fetchConfig.headers,
|
||||
body: fetchConfig.body,
|
||||
};
|
||||
|
||||
try {
|
||||
const fetch = await getFetch();
|
||||
const response = await fetch(url, fetchObject);
|
||||
|
||||
const json = await safeGetJson(response);
|
||||
|
||||
return {
|
||||
success: response.ok,
|
||||
status: response.status,
|
||||
headers: normalizeHeaders(response.headers),
|
||||
body: json,
|
||||
};
|
||||
} catch (error: any) {
|
||||
return responseFromCaughtError(error);
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
import { JSONSchemaError } from "core/schemas/types";
|
||||
|
||||
export type RequestError =
|
||||
| RequestBodyInvalid
|
||||
| ParameterMissing
|
||||
| ParametersInvalid
|
||||
| ExtraParametersError
|
||||
| InsufficientScopesError
|
||||
| MissingResponseSpec
|
||||
| ResponseBodyInvalid
|
||||
| BodyMissing
|
||||
| MissingCredentialsError;
|
||||
|
||||
export interface RequestBodyInvalid {
|
||||
type: "request_body_invalid";
|
||||
errors: any[];
|
||||
}
|
||||
|
||||
export interface BodyMissing {
|
||||
type: "missing_body";
|
||||
}
|
||||
|
||||
export interface ParameterMissing {
|
||||
type: "missing_parameter";
|
||||
parameter: {
|
||||
name: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface ParametersInvalid {
|
||||
type: "parameter_invalid";
|
||||
parameter: {
|
||||
name: string;
|
||||
value: any;
|
||||
};
|
||||
errors: JSONSchemaError[];
|
||||
}
|
||||
|
||||
export interface ExtraParametersError {
|
||||
type: "extra_parameters";
|
||||
parameters: Array<{
|
||||
name: string;
|
||||
value: any;
|
||||
}>;
|
||||
}
|
||||
|
||||
export interface MissingCredentialsError {
|
||||
type: "missing_credentials";
|
||||
}
|
||||
|
||||
export interface InsufficientScopesError {
|
||||
type: "insufficient_scopes";
|
||||
missingScopes: string[];
|
||||
}
|
||||
|
||||
export interface MissingResponseSpec {
|
||||
type: "no_response_spec";
|
||||
status: number;
|
||||
}
|
||||
|
||||
export interface ResponseBodyInvalid {
|
||||
type: "response_invalid";
|
||||
errors: Array<{ name: string; errors: JSONSchemaError[] }>;
|
||||
status: number;
|
||||
body?: any;
|
||||
}
|
||||
@@ -1,182 +0,0 @@
|
||||
import { applyCredentials } from "core/authentication/credentials";
|
||||
import {
|
||||
getFetch,
|
||||
normalizeHeaders,
|
||||
responseFromCaughtError,
|
||||
safeGetJson,
|
||||
} from "core/fetch/fetchUtilities";
|
||||
import { JSONSchemaError } from "core/schemas/types";
|
||||
import {
|
||||
FetchConfig,
|
||||
RequestData,
|
||||
RequestResponse,
|
||||
RequestSpec,
|
||||
} from "./types";
|
||||
import * as Sentry from "@sentry/node";
|
||||
|
||||
export async function requestEndpoint(
|
||||
{ baseUrl, endpointSpec, authentication }: RequestSpec,
|
||||
{ parameters, body, credentials }: RequestData
|
||||
): Promise<RequestResponse> {
|
||||
const { method, security, request, responses } = endpointSpec;
|
||||
let path = endpointSpec.path;
|
||||
|
||||
// validate the request body
|
||||
if (body == null && request.body?.schema != null) {
|
||||
throw {
|
||||
type: "missing_body",
|
||||
};
|
||||
}
|
||||
|
||||
let headers: Record<string, string> = {};
|
||||
|
||||
// validate and add the parameters
|
||||
if (endpointSpec.parameters != null) {
|
||||
for (const parameter of endpointSpec.parameters) {
|
||||
const { name, in: location, required } = parameter;
|
||||
|
||||
// if the parameter is missing
|
||||
if (parameters === undefined || parameters[name] == null) {
|
||||
if (required) {
|
||||
throw {
|
||||
type: "missing_parameter",
|
||||
parameter: {
|
||||
name,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
const element = parameters[name];
|
||||
|
||||
//add the parameter
|
||||
switch (location) {
|
||||
case "path":
|
||||
path = path.replace(`{${name}}`, element as string);
|
||||
break;
|
||||
case "query": {
|
||||
if (parameter.schema?.type === "array") {
|
||||
const array = element as Array<string>;
|
||||
for (const item of array) {
|
||||
path = `${path}${path.includes("?") ? "&" : "?"}${name}=${item}`;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
path = `${path}${path.includes("?") ? "&" : "?"}${name}=${element}`;
|
||||
break;
|
||||
}
|
||||
case "header":
|
||||
headers = {
|
||||
...headers,
|
||||
[name]: `${element}`,
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add headers from the config
|
||||
for (const name in request.headers) {
|
||||
if (Object.prototype.hasOwnProperty.call(request.headers, name)) {
|
||||
const element = request.headers[name];
|
||||
headers = {
|
||||
...headers,
|
||||
[name]: element,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// build the fetch config
|
||||
const url = `${baseUrl}${path}`;
|
||||
let fetchConfig: FetchConfig = {
|
||||
url,
|
||||
method,
|
||||
headers: {
|
||||
...headers,
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
};
|
||||
|
||||
// apply credentials
|
||||
if (security != null) {
|
||||
if (credentials == null) {
|
||||
throw {
|
||||
type: "missing_credentials",
|
||||
};
|
||||
}
|
||||
fetchConfig = applyCredentials(fetchConfig, {
|
||||
endpointSecurity: security,
|
||||
authentication,
|
||||
credentials,
|
||||
});
|
||||
}
|
||||
|
||||
// do the fetch and try get the JSON
|
||||
const fetchObject = {
|
||||
method: fetchConfig.method,
|
||||
headers: fetchConfig.headers,
|
||||
body: fetchConfig.body,
|
||||
};
|
||||
|
||||
try {
|
||||
const fetch = await getFetch();
|
||||
const response = await fetch(fetchConfig.url, fetchObject);
|
||||
const json = await safeGetJson(response);
|
||||
|
||||
const normalizedHeaders = normalizeHeaders(response.headers);
|
||||
|
||||
// start with the first response spec and loop through them, if one succeeds then return that
|
||||
const specErrors: Array<{ name: string; errors: JSONSchemaError[] }> = [];
|
||||
for (const spec of responses) {
|
||||
const isMatch = spec.matches({
|
||||
statusCode: response.status,
|
||||
headers: normalizedHeaders,
|
||||
body: json,
|
||||
});
|
||||
|
||||
if (!isMatch) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return {
|
||||
success: spec.success,
|
||||
status: response.status,
|
||||
headers: normalizedHeaders,
|
||||
body: json,
|
||||
};
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === "production") {
|
||||
//if it's a 2xx response, even if it fails validation we'll return it as a success
|
||||
if (response.status >= 200 && response.status < 300) {
|
||||
//we want to report this to Sentry though so we can improve the schemas
|
||||
Sentry.captureException({
|
||||
type: "response_invalid",
|
||||
baseUrl: baseUrl,
|
||||
spec: endpointSpec,
|
||||
status: response.status,
|
||||
body: json,
|
||||
errors: specErrors,
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
status: response.status,
|
||||
headers: normalizeHeaders(response.headers),
|
||||
body: json,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
throw {
|
||||
type: "no_response_spec",
|
||||
status: response.status,
|
||||
body: json,
|
||||
};
|
||||
} catch (error: any) {
|
||||
return responseFromCaughtError(error);
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
import {
|
||||
IntegrationAuthentication,
|
||||
AuthCredentials,
|
||||
} from "core/authentication/types";
|
||||
import { HTTPMethod, EndpointSpec } from "core/endpoint/types";
|
||||
|
||||
export interface FetchConfig {
|
||||
url: string;
|
||||
method: HTTPMethod;
|
||||
headers: Record<string, string>;
|
||||
body?: any;
|
||||
}
|
||||
|
||||
export interface RequestSpec {
|
||||
baseUrl: string;
|
||||
endpointSpec: EndpointSpec;
|
||||
authentication: IntegrationAuthentication;
|
||||
}
|
||||
export interface RequestData {
|
||||
parameters?: Record<string, any>;
|
||||
body?: any;
|
||||
credentials?: AuthCredentials;
|
||||
}
|
||||
|
||||
export interface RequestResponse {
|
||||
success: boolean;
|
||||
status: number;
|
||||
headers?: Record<string, string>;
|
||||
body?: any;
|
||||
}
|
||||
@@ -1,182 +0,0 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { AutoReffer } from "./autoReffer";
|
||||
import { JSONSchema } from "./types";
|
||||
|
||||
describe("autoReffer", async () => {
|
||||
test("simple", async () => {
|
||||
const schema: JSONSchema = {
|
||||
type: "object",
|
||||
properties: {
|
||||
type: {
|
||||
type: "string",
|
||||
const: "person",
|
||||
},
|
||||
person: {
|
||||
title: "Person",
|
||||
type: "object",
|
||||
properties: {
|
||||
email: {
|
||||
type: "string",
|
||||
},
|
||||
timezone: {
|
||||
type: "string",
|
||||
enum: [
|
||||
"Africa/Abidjan",
|
||||
"Africa/Accra",
|
||||
"Africa/Addis_Ababa",
|
||||
"Africa/Algiers",
|
||||
"Africa/Asmara",
|
||||
"Africa/Asmera",
|
||||
],
|
||||
},
|
||||
props: {
|
||||
anyOf: [
|
||||
{
|
||||
type: "object",
|
||||
properties: {
|
||||
first: {
|
||||
type: "string",
|
||||
},
|
||||
last: {
|
||||
type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
parent: {
|
||||
title: "Person",
|
||||
type: "object",
|
||||
properties: {
|
||||
email: {
|
||||
type: "string",
|
||||
},
|
||||
timezone: {
|
||||
type: "string",
|
||||
enum: [
|
||||
"Africa/Abidjan",
|
||||
"Africa/Accra",
|
||||
"Africa/Addis_Ababa",
|
||||
"Africa/Algiers",
|
||||
"Africa/Asmara",
|
||||
"Africa/Asmera",
|
||||
],
|
||||
},
|
||||
props: {
|
||||
anyOf: [
|
||||
{
|
||||
type: "object",
|
||||
properties: {
|
||||
first: {
|
||||
type: "string",
|
||||
},
|
||||
last: {
|
||||
type: "string",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
id: {
|
||||
type: "string",
|
||||
},
|
||||
tz: {
|
||||
type: "string",
|
||||
enum: [
|
||||
"Africa/Abidjan",
|
||||
"Africa/Accra",
|
||||
"Africa/Addis_Ababa",
|
||||
"Africa/Algiers",
|
||||
"Africa/Asmara",
|
||||
"Africa/Asmera",
|
||||
],
|
||||
},
|
||||
},
|
||||
required: ["type", "person", "id"],
|
||||
additionalProperties: false,
|
||||
};
|
||||
|
||||
const autoReffer = new AutoReffer(schema);
|
||||
const optimizedSchema = autoReffer.optimize();
|
||||
|
||||
expect(optimizedSchema).toMatchInlineSnapshot(`
|
||||
{
|
||||
"additionalProperties": false,
|
||||
"definitions": {
|
||||
"Person": {
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"email": {
|
||||
"type": "string",
|
||||
},
|
||||
"props": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/definitions/Props",
|
||||
},
|
||||
],
|
||||
},
|
||||
"timezone": {
|
||||
"$ref": "#/definitions/Timezone",
|
||||
},
|
||||
},
|
||||
"title": "Person",
|
||||
"type": "object",
|
||||
},
|
||||
"Props": {
|
||||
"properties": {
|
||||
"first": {
|
||||
"type": "string",
|
||||
},
|
||||
"last": {
|
||||
"type": "string",
|
||||
},
|
||||
},
|
||||
"type": "object",
|
||||
},
|
||||
"Timezone": {
|
||||
"enum": [
|
||||
"Africa/Abidjan",
|
||||
"Africa/Accra",
|
||||
"Africa/Addis_Ababa",
|
||||
"Africa/Algiers",
|
||||
"Africa/Asmara",
|
||||
"Africa/Asmera",
|
||||
],
|
||||
"type": "string",
|
||||
},
|
||||
},
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
},
|
||||
"parent": {
|
||||
"$ref": "#/definitions/Person",
|
||||
},
|
||||
"person": {
|
||||
"$ref": "#/definitions/Person",
|
||||
},
|
||||
"type": {
|
||||
"const": "person",
|
||||
"type": "string",
|
||||
},
|
||||
"tz": {
|
||||
"$ref": "#/definitions/Timezone",
|
||||
},
|
||||
},
|
||||
"required": [
|
||||
"type",
|
||||
"person",
|
||||
"id",
|
||||
],
|
||||
"type": "object",
|
||||
}
|
||||
`);
|
||||
});
|
||||
});
|
||||
@@ -1,222 +0,0 @@
|
||||
import { JSONSchema } from "./types";
|
||||
import nodeObjectHash from "node-object-hash";
|
||||
import pointer from "json-pointer";
|
||||
|
||||
type JSONPointer = string[];
|
||||
const hasher = nodeObjectHash({ sort: true });
|
||||
|
||||
type Options = {
|
||||
refIfMoreThan: number;
|
||||
};
|
||||
|
||||
export class AutoReffer {
|
||||
#schemaPointers = new Map<string, JSONPointer[]>();
|
||||
#schema: JSONSchema;
|
||||
#options: Options;
|
||||
|
||||
constructor(schema: JSONSchema, options: Options = { refIfMoreThan: 2 }) {
|
||||
this.#schema = schema;
|
||||
this.#options = options;
|
||||
}
|
||||
|
||||
optimize() {
|
||||
this.#walk(this.#schema, []);
|
||||
const optimizedSchema = this.#addRefs();
|
||||
return optimizedSchema;
|
||||
}
|
||||
|
||||
#walk(schema: JSONSchema, pointer: JSONPointer) {
|
||||
if (schema.type === "object" || (schema.type === "string" && schema.enum)) {
|
||||
const hash = hasher.hash(schema);
|
||||
const existingPath = this.#schemaPointers.get(hash);
|
||||
if (existingPath) {
|
||||
existingPath.push(pointer);
|
||||
} else {
|
||||
this.#schemaPointers.set(hash, [pointer]);
|
||||
}
|
||||
}
|
||||
|
||||
if (schema.properties) {
|
||||
for (const [key, value] of Object.entries(schema.properties)) {
|
||||
if (typeof value === "boolean") continue;
|
||||
this.#walk(value, [...pointer, "properties", key]);
|
||||
}
|
||||
}
|
||||
|
||||
if (schema.items) {
|
||||
if (typeof schema.items === "boolean") return;
|
||||
this.#walk(schema.items, [...pointer, "items"]);
|
||||
}
|
||||
|
||||
if (schema.additionalProperties) {
|
||||
if (typeof schema.additionalProperties === "boolean") return;
|
||||
this.#walk(schema.additionalProperties, [
|
||||
...pointer,
|
||||
"additionalProperties",
|
||||
]);
|
||||
}
|
||||
|
||||
if (schema.allOf) {
|
||||
schema.allOf.forEach((item, index) => {
|
||||
this.#walk(item, [...pointer, "allOf", `${index}`]);
|
||||
});
|
||||
}
|
||||
|
||||
if (schema.anyOf) {
|
||||
schema.anyOf.forEach((item, index) => {
|
||||
this.#walk(item, [...pointer, "anyOf", `${index}`]);
|
||||
});
|
||||
}
|
||||
|
||||
if (schema.oneOf) {
|
||||
schema.oneOf.forEach((item, index) => {
|
||||
this.#walk(item, [...pointer, "oneOf", `${index}`]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
#addRefs(): JSONSchema {
|
||||
const newSchema: JSONSchema = JSON.parse(JSON.stringify(this.#schema));
|
||||
//create definitions structure if it doesn't exist
|
||||
if (!newSchema.definitions) {
|
||||
newSchema.definitions = {};
|
||||
}
|
||||
|
||||
//turn the map into an array of [hash, pointers]
|
||||
const schemaPaths = Array.from(this.#schemaPointers.entries());
|
||||
|
||||
//filter out the ones that are not used more than the threshold
|
||||
const filteredSchemaPaths = schemaPaths.filter(
|
||||
([hash, pointers]) => pointers.length >= this.#options.refIfMoreThan
|
||||
);
|
||||
|
||||
//now flatten it to an array of pointers with name
|
||||
const names = new Set<string>();
|
||||
const pointers = filteredSchemaPaths.flatMap(([hash, pointers]) => {
|
||||
//the name must be unique
|
||||
const name = this.#inventName(pointers, newSchema, names);
|
||||
return pointers.map((p) => ({
|
||||
pointer: p,
|
||||
name: name,
|
||||
}));
|
||||
});
|
||||
|
||||
//now we want to sort them by their path, so we start out with the deepest ones in the tree
|
||||
const sortedPointers = pointers.sort((a, b) => {
|
||||
return b.pointer.join("/").localeCompare(a.pointer.join("/"));
|
||||
});
|
||||
|
||||
for (let index = 0; index < sortedPointers.length; index++) {
|
||||
const element = sortedPointers[index];
|
||||
try {
|
||||
const originalObject = pointer.get(newSchema, element.pointer);
|
||||
const ref = `#/definitions/${element.name}`;
|
||||
newSchema.definitions[element.name] = originalObject;
|
||||
|
||||
//set the ref
|
||||
pointer.set(newSchema, element.pointer, { $ref: ref });
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
return newSchema;
|
||||
}
|
||||
|
||||
#inventName(
|
||||
pointers: JSONPointer[],
|
||||
schema: JSONSchema,
|
||||
names: Set<string>
|
||||
): string {
|
||||
const candidates: string[] = [];
|
||||
for (const ptr of pointers) {
|
||||
try {
|
||||
const object = pointer.get(schema, ptr);
|
||||
if (object.title) {
|
||||
candidates.push(object.title);
|
||||
}
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
if (candidates.length > 0) {
|
||||
const mostCommon = mode(candidates);
|
||||
if (mostCommon) {
|
||||
const name = toTitleCase(mostCommon);
|
||||
if (!names.has(name)) {
|
||||
names.add(name);
|
||||
return name;
|
||||
}
|
||||
|
||||
//if the name is already taken, we need to add a number to it
|
||||
let i = 1;
|
||||
while (names.has(`${name}${i}`)) {
|
||||
i++;
|
||||
}
|
||||
names.add(`${name}${i}`);
|
||||
return `${name}${i}`;
|
||||
}
|
||||
}
|
||||
|
||||
//failing finding a title we can look at the path and try create a name from that
|
||||
const namesFromPointer = pointers.map((ptr) =>
|
||||
findAppropriateNameFromPointer(ptr)
|
||||
);
|
||||
|
||||
const mostCommon = mode(namesFromPointer);
|
||||
const name = toTitleCase(mostCommon ?? namesFromPointer[0]);
|
||||
if (!names.has(name)) {
|
||||
names.add(name);
|
||||
return name;
|
||||
}
|
||||
|
||||
//if the name is already taken, we need to add a number to it
|
||||
let i = 1;
|
||||
while (names.has(`${name}${i}`)) {
|
||||
i++;
|
||||
}
|
||||
names.add(`${name}${i}`);
|
||||
return `${name}${i}`;
|
||||
}
|
||||
}
|
||||
|
||||
function mode(arr: string[]) {
|
||||
return arr
|
||||
.sort(
|
||||
(a, b) =>
|
||||
arr.filter((v) => v === a).length - arr.filter((v) => v === b).length
|
||||
)
|
||||
.pop();
|
||||
}
|
||||
|
||||
//remove spaces and convert to TitleCase, deal with single words
|
||||
function toTitleCase(str: string) {
|
||||
return str
|
||||
.split(" ")
|
||||
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
||||
.join("");
|
||||
}
|
||||
|
||||
function nameIsJustNumbers(name: string | undefined) {
|
||||
if (!name) return false;
|
||||
return /^\d+$/.test(name);
|
||||
}
|
||||
|
||||
function findAppropriateNameFromPointer(pointer: JSONPointer): string {
|
||||
//start with the last segment and loop backwards
|
||||
for (let i = pointer.length - 1; i >= 0; i--) {
|
||||
const name = pointer[i];
|
||||
|
||||
if (name === "anyOf" || name === "oneOf" || name === "allOf") {
|
||||
continue;
|
||||
}
|
||||
|
||||
//check if the segment is a number, if so we need to look at the previous segment
|
||||
if (!nameIsJustNumbers(name)) {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
return "Item";
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
declare module "json-schema-deref-sync";
|
||||
@@ -1,235 +0,0 @@
|
||||
import { JSONSchema, JSONSchemaInstanceType } from "./types";
|
||||
|
||||
export function makeStringSchema(
|
||||
title: string,
|
||||
description?: string,
|
||||
options?: {
|
||||
defaultValue?: string;
|
||||
const?: string;
|
||||
enum?: string[];
|
||||
}
|
||||
): JSONSchema {
|
||||
const schema: JSONSchema = {
|
||||
type: "string",
|
||||
title,
|
||||
};
|
||||
|
||||
if (description) {
|
||||
schema.description = description;
|
||||
}
|
||||
|
||||
if (options?.defaultValue) {
|
||||
schema.default = options.defaultValue;
|
||||
}
|
||||
|
||||
if (options?.enum) {
|
||||
schema.enum = options.enum;
|
||||
}
|
||||
|
||||
if (options?.const) {
|
||||
schema.const = options.const;
|
||||
}
|
||||
|
||||
return schema;
|
||||
}
|
||||
|
||||
export function makeNumberSchema(
|
||||
title: string,
|
||||
description?: string,
|
||||
options?: {
|
||||
defaultValue: number;
|
||||
}
|
||||
): JSONSchema {
|
||||
const schema: JSONSchema = {
|
||||
type: "number",
|
||||
title,
|
||||
};
|
||||
|
||||
if (description) {
|
||||
schema.description = description;
|
||||
}
|
||||
|
||||
if (options?.defaultValue) {
|
||||
schema.default = options.defaultValue;
|
||||
}
|
||||
|
||||
return schema;
|
||||
}
|
||||
|
||||
export function makeBooleanSchema(
|
||||
title: string,
|
||||
description?: string,
|
||||
options?: {
|
||||
defaultValue?: boolean;
|
||||
enum?: boolean;
|
||||
const?: boolean;
|
||||
}
|
||||
): JSONSchema {
|
||||
const schema: JSONSchema = {
|
||||
title,
|
||||
type: "boolean",
|
||||
};
|
||||
|
||||
if (description) {
|
||||
schema.description = description;
|
||||
}
|
||||
|
||||
if (options?.defaultValue) {
|
||||
schema.default = options.defaultValue;
|
||||
}
|
||||
|
||||
if (options?.enum) {
|
||||
schema.enum = [options.enum];
|
||||
}
|
||||
|
||||
if (options?.const) {
|
||||
schema.const = options.const;
|
||||
}
|
||||
|
||||
return schema;
|
||||
}
|
||||
|
||||
export function makeArraySchema(title: string, items: JSONSchema): JSONSchema {
|
||||
return {
|
||||
type: "array",
|
||||
title,
|
||||
items,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeObjectSchema(
|
||||
title: string,
|
||||
options: {
|
||||
optionalProperties?: Record<string, JSONSchema>;
|
||||
requiredProperties?: Record<string, JSONSchema>;
|
||||
additionalProperties?: boolean | JSONSchema;
|
||||
}
|
||||
): JSONSchema {
|
||||
let properties: Record<string, JSONSchema> | undefined = undefined;
|
||||
|
||||
if (options.optionalProperties || options.requiredProperties) {
|
||||
properties = {};
|
||||
}
|
||||
|
||||
if (options.optionalProperties) {
|
||||
properties = {
|
||||
...properties,
|
||||
...options.optionalProperties,
|
||||
};
|
||||
}
|
||||
|
||||
if (options.requiredProperties) {
|
||||
properties = {
|
||||
...properties,
|
||||
...options.requiredProperties,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
type: "object",
|
||||
title,
|
||||
properties,
|
||||
required: options.requiredProperties
|
||||
? Object.keys(options.requiredProperties)
|
||||
: undefined,
|
||||
additionalProperties: options.additionalProperties,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeRecordSchema(
|
||||
title: string,
|
||||
schema: JSONSchema
|
||||
): JSONSchema {
|
||||
return {
|
||||
type: "object",
|
||||
title,
|
||||
additionalProperties: schema,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeNull(): JSONSchema {
|
||||
return {
|
||||
type: "null",
|
||||
};
|
||||
}
|
||||
|
||||
export function makeOneOf(title: string, schemas: JSONSchema[]): JSONSchema {
|
||||
return {
|
||||
title,
|
||||
oneOf: schemas,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeAnyOf(title: string, schemas: JSONSchema[]): JSONSchema {
|
||||
return {
|
||||
title,
|
||||
anyOf: schemas,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeNullable(schema: JSONSchema): JSONSchema {
|
||||
//if there's no existing type then we need to create an anyOf with null
|
||||
if (!schema.type) {
|
||||
return {
|
||||
title: schema.title,
|
||||
description: schema.description,
|
||||
anyOf: [
|
||||
{
|
||||
type: "null",
|
||||
},
|
||||
schema,
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
//if there is a type then we can add the "null" type to it
|
||||
let combinedTypes: JSONSchemaInstanceType[] = [];
|
||||
switch (typeof schema.type) {
|
||||
case "string":
|
||||
combinedTypes = [schema.type, "null"];
|
||||
break;
|
||||
case "object":
|
||||
combinedTypes = [...schema.type, "null"];
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Invalid schema type: ${typeof schema.type}`);
|
||||
}
|
||||
|
||||
return {
|
||||
...schema,
|
||||
type: combinedTypes,
|
||||
};
|
||||
}
|
||||
|
||||
export function makeAllPropertiesOptional(schema: JSONSchema): JSONSchema {
|
||||
if (schema.type !== "object") {
|
||||
throw new Error("Schema must be an object");
|
||||
}
|
||||
|
||||
if (!schema.properties) {
|
||||
throw new Error("Schema must have properties");
|
||||
}
|
||||
|
||||
return {
|
||||
...schema,
|
||||
required: [],
|
||||
};
|
||||
}
|
||||
|
||||
export function makePropertiesOptional(
|
||||
schema: JSONSchema,
|
||||
properties: string[]
|
||||
): JSONSchema {
|
||||
if (schema.type !== "object") {
|
||||
throw new Error("Schema must be an object");
|
||||
}
|
||||
|
||||
if (!schema.properties) {
|
||||
throw new Error("Schema must have properties");
|
||||
}
|
||||
|
||||
return {
|
||||
...schema,
|
||||
required: schema.required?.filter((p) => !properties.includes(p)),
|
||||
};
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
import { expect, test } from "vitest";
|
||||
import spec from "./test-openapi-spec-v2.json";
|
||||
import { dereferenceSpec, schemaFromOpenApiSpecV2 } from "./openApi";
|
||||
|
||||
test("Returns the correct schema", async () => {
|
||||
const dereferenced = dereferenceSpec(spec);
|
||||
const schema = schemaFromOpenApiSpecV2(
|
||||
dereferenced,
|
||||
"/paths//conversations.list/get/responses/200/schema"
|
||||
);
|
||||
expect(schema.type).toEqual("object");
|
||||
expect(schema.additionalProperties).toEqual(false);
|
||||
});
|
||||
@@ -1,15 +0,0 @@
|
||||
import deref from "json-schema-deref-sync";
|
||||
import pointer from "json-pointer";
|
||||
import { type JSONSchema } from "./types";
|
||||
|
||||
export function dereferenceSpec(spec: any): any {
|
||||
return deref(spec);
|
||||
}
|
||||
|
||||
// todo validate that it's a valid json schema
|
||||
export function schemaFromOpenApiSpecV2(spec: any, path: string): JSONSchema {
|
||||
// we need to escape the path because it contains ~ and / characters
|
||||
path = path.replace(/~/g, "~0").replace(/\/\//g, "/~1");
|
||||
const schema = pointer.get(spec as pointer.JsonObject, path);
|
||||
return schema;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
||||
import { Schema, InstanceType } from "@cfworker/json-schema";
|
||||
import { ErrorObject } from "ajv";
|
||||
|
||||
export type JSONSchema = Schema;
|
||||
export type JSONSchemaInstanceType = InstanceType;
|
||||
export type JSONSchemaError = ErrorObject;
|
||||
@@ -1,122 +0,0 @@
|
||||
import { JSONSchema, JSONSchemaError } from "./types";
|
||||
import nodeObjectHash from "node-object-hash";
|
||||
import Ajv from "ajv";
|
||||
import { performance, PerformanceObserver } from "perf_hooks";
|
||||
|
||||
//setup performance tracking
|
||||
const perfObserver = new PerformanceObserver((items) => {
|
||||
return;
|
||||
});
|
||||
perfObserver.observe({ entryTypes: ["measure"], buffered: true });
|
||||
|
||||
const ajv = new Ajv({
|
||||
strict: false,
|
||||
logger: false,
|
||||
});
|
||||
|
||||
type SuccessResult = {
|
||||
success: true;
|
||||
};
|
||||
|
||||
type FailureResult = {
|
||||
success: false;
|
||||
errors: JSONSchemaError[];
|
||||
};
|
||||
|
||||
export async function validate(
|
||||
data: any,
|
||||
schema?: JSONSchema
|
||||
): Promise<SuccessResult | FailureResult> {
|
||||
try {
|
||||
if (schema === undefined) {
|
||||
return {
|
||||
success: true as const,
|
||||
};
|
||||
}
|
||||
|
||||
if (data === undefined) {
|
||||
return {
|
||||
success: false as const,
|
||||
errors: [
|
||||
{
|
||||
keyword: "undefined",
|
||||
instancePath: "undefined",
|
||||
schemaPath: "undefined",
|
||||
params: {},
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
performance.mark("get-validator-start");
|
||||
const validator = getValidator(schema);
|
||||
performance.mark("get-validator-end");
|
||||
|
||||
performance.mark("validate-start");
|
||||
const result = validator(data);
|
||||
performance.mark("validate-end");
|
||||
|
||||
const getValidatorPerformance = performance.measure(
|
||||
"get-validator",
|
||||
"get-validator-start",
|
||||
"get-validator-end"
|
||||
);
|
||||
const validatePerformance = performance.measure(
|
||||
"validate",
|
||||
"validate-start",
|
||||
"validate-end"
|
||||
);
|
||||
|
||||
if (process.env.SHOW_PERFORMANCE_TESTS === "true") {
|
||||
console.log("validate benchmarks:", {
|
||||
getValidator: getValidatorPerformance.duration,
|
||||
validate: validatePerformance.duration,
|
||||
});
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
return {
|
||||
success: false as const,
|
||||
errors: validator.errors ?? [],
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: true as const,
|
||||
};
|
||||
} catch (e: any) {
|
||||
console.error(e);
|
||||
return {
|
||||
success: false as const,
|
||||
errors: [
|
||||
{
|
||||
keyword: "undefined",
|
||||
instancePath: "undefined",
|
||||
schemaPath: "undefined",
|
||||
params: {},
|
||||
message: e.toString(),
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
//we are going to has the schemas and use that as the key to find the cached validator
|
||||
const hasher = nodeObjectHash({ sort: false });
|
||||
|
||||
function getValidator(schema: JSONSchema) {
|
||||
const hash = hasher.hash(schema);
|
||||
|
||||
// get the validator from the cache, if it doesn't exist, add it to the cache
|
||||
let validator = ajv.getSchema(hash);
|
||||
if (validator === undefined) {
|
||||
ajv.addSchema(schema, hash);
|
||||
validator = ajv.getSchema(hash);
|
||||
}
|
||||
|
||||
if (validator === undefined) {
|
||||
throw new Error("Could not get validator");
|
||||
}
|
||||
|
||||
return validator;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
import { Action } from "core/action/types";
|
||||
import { IntegrationAuthentication } from "core/authentication/types";
|
||||
|
||||
export type Service = {
|
||||
name: string;
|
||||
service: string;
|
||||
version: string;
|
||||
baseUrl: string;
|
||||
live: boolean;
|
||||
authentication: IntegrationAuthentication;
|
||||
actions: Record<string, Action>;
|
||||
retryableStatusCodes: number[];
|
||||
};
|
||||
@@ -1,97 +0,0 @@
|
||||
import { InputSpec } from "core/action/types";
|
||||
import { checkRequiredScopes } from "core/authentication/credentials";
|
||||
import { RequestError } from "core/request/errors";
|
||||
import { RequestData, RequestSpec } from "core/request/types";
|
||||
import { validate } from "core/schemas/validate";
|
||||
|
||||
type ValidationResult =
|
||||
| {
|
||||
success: true;
|
||||
}
|
||||
| {
|
||||
success: false;
|
||||
error: RequestError;
|
||||
};
|
||||
|
||||
export async function validateInputs(
|
||||
inputSpec: InputSpec,
|
||||
{ parameters, body, credentials }: RequestData
|
||||
): Promise<ValidationResult> {
|
||||
if (inputSpec.security) {
|
||||
if (credentials === undefined) {
|
||||
return {
|
||||
success: false,
|
||||
error: {
|
||||
type: "missing_credentials",
|
||||
},
|
||||
};
|
||||
}
|
||||
const requiredScopes = inputSpec.security[credentials.name] ?? [];
|
||||
const result = checkRequiredScopes(requiredScopes, credentials);
|
||||
|
||||
if (!result.success) {
|
||||
return {
|
||||
success: false,
|
||||
error: {
|
||||
type: "insufficient_scopes",
|
||||
missingScopes: result.missingScopes,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// validate the request body exists if it should
|
||||
if (body == null && inputSpec.body != null) {
|
||||
return {
|
||||
success: false,
|
||||
error: {
|
||||
type: "missing_body",
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
//validate the parameters
|
||||
if (inputSpec.parameters != null) {
|
||||
for (const parameter of inputSpec.parameters) {
|
||||
const { name, required } = parameter;
|
||||
|
||||
// if the parameter is missing
|
||||
if (parameters === undefined || parameters[name] == null) {
|
||||
if (required) {
|
||||
return {
|
||||
success: false,
|
||||
error: {
|
||||
type: "missing_parameter",
|
||||
parameter: {
|
||||
name,
|
||||
},
|
||||
},
|
||||
};
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
const element = parameters[name];
|
||||
//validate the parameter against the schema
|
||||
const valid = await validate(element, parameter.schema);
|
||||
if (!valid.success) {
|
||||
return {
|
||||
success: false,
|
||||
error: {
|
||||
type: "parameter_invalid",
|
||||
parameter: {
|
||||
name,
|
||||
value: element,
|
||||
},
|
||||
errors: valid.errors,
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
};
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,75 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://slack.com:443",
|
||||
"method": "GET",
|
||||
"path": "/api/conversations.list?limit=3",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": [
|
||||
"13a10900e45a2e5f5f662b462e26151762c481e859dbffffde6956a4097eb37f02aa77df7d8db575e3fea335752c0a039e145027e3d40b2d00eba4129d035425d78756f60ba204af170b1f86483c07dee72fe4317870e818d6cdc59b7d081878c0287860ab6e19cd3bf225f61be1bc2382ac0003f2e24cce767358bdc5ff27e6efe91e15d4cecfa8a6aaeaa6eeeaf667d1c49ef8fb383a0c655532f02ae7e5e72c8ac21662b52b9fbf2ed41ddc25fcc145a24ddfb1d411d84be8b4ff04dbb1b7b63ebf31fc3bfed0b427f133131f2a9ed4f65f9d87833bea7962df1dcbb40c575534c5b0150ce8e822c38f0726b8c1a31775894ab417e0d9318cb3c3335335424a29fa12934fe2d87ceefa561a8129f271cb7784f29485b4fd55e0491abc5f00ce6df0e046706922da1285233d68fe538d002f132a1be061b31db24c20e0de211ded031dfdc7403381cc3efb633986e2d0cae55b25863e82922a674915308c922049729e62948938a552fde834122d2af230a4ad5404eb6368268695184d5a6b371a5b02166f21265a49a688495cc46831de9149e52d1de762e84a357473940f6c7da403cff8c744e37194d39b870b86ef4f71a40ab47210eafedec73fa66bb99aa36aaa6acc30179aa4d4548102cec5c0a3e46de9484720aa1fd1458a057d8fa70eb30d722b62ad1bfdaf51732b0c120ad5261e0936adc6e03e980bf5b38efe852022fc10052d45ff3cb4e9a73bcca22c88540219b11b9ff60572714c9e4bede4f2e2fa97ef83a8cfa3a06aeb94601a99baa6d96693b436663171fddf9a64af46731d453115ddd0d4d9b7d5af35e352b56742300a313884c29056bed452699f53febf3154c19949cfb0d0f7301142aadafa91c1303d001ec4a72f59f8541fdd1e3d3cbc3c7f0437caf536fcff03"
|
||||
],
|
||||
"rawHeaders": [
|
||||
"date",
|
||||
"Sat, 18 Feb 2023 16:06:41 GMT",
|
||||
"server",
|
||||
"Apache",
|
||||
"x-powered-by",
|
||||
"HHVM/4.153.1",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"referrer-policy",
|
||||
"no-referrer",
|
||||
"x-slack-backend",
|
||||
"r",
|
||||
"x-slack-unique-id",
|
||||
"Y_D3kQScXBLeo8CcHpwldgAAECY",
|
||||
"strict-transport-security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-headers",
|
||||
"slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled, x-b3-flags",
|
||||
"access-control-expose-headers",
|
||||
"x-slack-req-id, retry-after",
|
||||
"x-oauth-scopes",
|
||||
"channels:read,channels:join,channels:manage,chat:write,groups:write,im:write,mpim:write,chat:write.customize,reactions:write",
|
||||
"x-accepted-oauth-scopes",
|
||||
"channels:read,groups:read,mpim:read,im:read,read",
|
||||
"expires",
|
||||
"Mon, 26 Jul 1997 05:00:00 GMT",
|
||||
"cache-control",
|
||||
"private, no-cache, no-store, must-revalidate",
|
||||
"pragma",
|
||||
"no-cache",
|
||||
"x-xss-protection",
|
||||
"0",
|
||||
"x-content-type-options",
|
||||
"nosniff",
|
||||
"x-slack-req-id",
|
||||
"10d2571cfa8e50b57c91d537221aff81",
|
||||
"vary",
|
||||
"Accept-Encoding",
|
||||
"content-encoding",
|
||||
"br",
|
||||
"content-length",
|
||||
"654",
|
||||
"content-type",
|
||||
"application/json; charset=utf-8",
|
||||
"x-envoy-upstream-service-time",
|
||||
"118",
|
||||
"x-backend",
|
||||
"main_normal main_canary_with_overflow main_control_with_overflow",
|
||||
"x-server",
|
||||
"slack-www-hhvm-main-iad-cxtr",
|
||||
"x-slack-shared-secret-outcome",
|
||||
"no-match",
|
||||
"via",
|
||||
"envoy-www-iad-scsk, envoy-edge-lhr-csok",
|
||||
"x-edge-backend",
|
||||
"envoy-www",
|
||||
"x-slack-edge-shared-secret-outcome",
|
||||
"no-match",
|
||||
"connection",
|
||||
"close"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,53 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m",
|
||||
"body": {
|
||||
"fields": {
|
||||
"Employee": "Employee single create"
|
||||
}
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"id": "recY9ZLK96wNBblmo",
|
||||
"createdTime": "2023-02-18T17:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee single create"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 17:05:53 GMT",
|
||||
"Content-Type",
|
||||
"120",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=uxQV2kzjELpFGUscnluykIVz7XOSrD1HxCYqoKdrnnPDt2Djy+EBfTKTDx4p0fAh1qD5c3/jRM2bCy9rhptozXyMsWOCDL7v2H3E6VRso6pGZm+kmcdzFjjoIO36; Expires=Sat, 25 Feb 2023 17:05:53 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=uxQV2kzjELpFGUscnluykIVz7XOSrD1HxCYqoKdrnnPDt2Djy+EBfTKTDx4p0fAh1qD5c3/jRM2bCy9rhptozXyMsWOCDL7v2H3E6VRso6pGZm+kmcdzFjjoIO36; Expires=Sat, 25 Feb 2023 17:05:53 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwL5hqTq5iBqCg9Q; path=/; expires=Sun, 18 Feb 2024 17:05:53 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"114"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,73 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m",
|
||||
"body": {
|
||||
"records": [
|
||||
{
|
||||
"fields": {
|
||||
"Employee": "Employee #1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"fields": {
|
||||
"Employee": "Employee #2"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"id": "recGy1FsSzQnQ1Q5G",
|
||||
"createdTime": "2023-02-18T17:05:09.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee #1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recfrk4NonMC37k3q",
|
||||
"createdTime": "2023-02-18T17:05:09.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee #2"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 17:05:09 GMT",
|
||||
"Content-Type",
|
||||
"145",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=S3w+xLzGuJ4YZa7uQpSGEZYmk2IXTVlsJ9yVl+E2aUbEW5BtGoPl4lNa9pwXEpNvI29HEMTQgpuOXAnvfTFKzm+ot6y2DAQJwqa1nDNgQVRZ2z6lNn602nx0ebhI; Expires=Sat, 25 Feb 2023 17:05:08 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=S3w+xLzGuJ4YZa7uQpSGEZYmk2IXTVlsJ9yVl+E2aUbEW5BtGoPl4lNa9pwXEpNvI29HEMTQgpuOXAnvfTFKzm+ot6y2DAQJwqa1nDNgQVRZ2z6lNn602nx0ebhI; Expires=Sat, 25 Feb 2023 17:05:08 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brw7GK0C3hS9Fnih9; path=/; expires=Sun, 18 Feb 2024 17:05:08 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"221"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,97 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m",
|
||||
"body": {
|
||||
"fields": {
|
||||
"Employee": "Delete now #3"
|
||||
}
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"id": "recyubpGhZWle9GOS",
|
||||
"createdTime": "2023-02-18T17:25:39.000Z",
|
||||
"fields": {
|
||||
"Employee": "Delete now #3"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 17:25:38 GMT",
|
||||
"Content-Type",
|
||||
"121",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=jt7yHA1t0HaG6Wp2xE4aJWZdQ59coYaZrRwqp8gwZmizt1A1N1H+xEqqycwyHEJtuK/6Rvc5FGcWdsJZQD2kbg5MSS0aropskjuOcOWICRp4+IHNWdYH5Osmcfre; Expires=Sat, 25 Feb 2023 17:25:38 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=jt7yHA1t0HaG6Wp2xE4aJWZdQ59coYaZrRwqp8gwZmizt1A1N1H+xEqqycwyHEJtuK/6Rvc5FGcWdsJZQD2kbg5MSS0aropskjuOcOWICRp4+IHNWdYH5Osmcfre; Expires=Sat, 25 Feb 2023 17:25:38 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwoFcsjVo3nFDHPT; path=/; expires=Sun, 18 Feb 2024 17:25:38 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"105"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
},
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "DELETE",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m/recyubpGhZWle9GOS",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"deleted": true,
|
||||
"id": "recyubpGhZWle9GOS"
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 17:25:39 GMT",
|
||||
"Content-Type",
|
||||
"59",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=SjG+vAIOeCRwgx9Zhi7bVWiFG0acnh1G6+u2nL+ZUfo+4ON1RPjGdhX41SiaekKoYBmW2oCbSynCYAXKGnQjJYaOmPFAeIkml0VZuXSCv1Jm8P2PsXR+DoKIvZTk; Expires=Sat, 25 Feb 2023 17:25:39 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=SjG+vAIOeCRwgx9Zhi7bVWiFG0acnh1G6+u2nL+ZUfo+4ON1RPjGdhX41SiaekKoYBmW2oCbSynCYAXKGnQjJYaOmPFAeIkml0VZuXSCv1Jm8P2PsXR+DoKIvZTk; Expires=Sat, 25 Feb 2023 17:25:39 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwUynCRjs24wfp6Z; path=/; expires=Sun, 18 Feb 2024 17:25:39 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"41"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,125 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m",
|
||||
"body": {
|
||||
"records": [
|
||||
{
|
||||
"fields": {
|
||||
"Employee": "Delete now #1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"fields": {
|
||||
"Employee": "Delete now #2"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"id": "recTR6YLOshwwyi1O",
|
||||
"createdTime": "2023-02-18T17:22:12.000Z",
|
||||
"fields": {
|
||||
"Employee": "Delete now #1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recuQVL2gpUjN64py",
|
||||
"createdTime": "2023-02-18T17:22:12.000Z",
|
||||
"fields": {
|
||||
"Employee": "Delete now #2"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 17:22:12 GMT",
|
||||
"Content-Type",
|
||||
"154",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=IAMzoMptPLC7k7rWXTocxJiu8ciJvbHqD17c0EPaM38k1FkzA/zW7S+tRKK6LOzrVFyLL8GUgFtdfDGFELrQ8uO1bADYnEiB4vfOAXjRwSBA2Dc61N3O+MIWMdnM; Expires=Sat, 25 Feb 2023 17:22:12 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=IAMzoMptPLC7k7rWXTocxJiu8ciJvbHqD17c0EPaM38k1FkzA/zW7S+tRKK6LOzrVFyLL8GUgFtdfDGFELrQ8uO1bADYnEiB4vfOAXjRwSBA2Dc61N3O+MIWMdnM; Expires=Sat, 25 Feb 2023 17:22:12 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwFID6JiyKkz2OUb; path=/; expires=Sun, 18 Feb 2024 17:22:12 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"225"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
},
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "DELETE",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m?records=recTR6YLOshwwyi1O&records=recuQVL2gpUjN64py",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"deleted": true,
|
||||
"id": "recTR6YLOshwwyi1O"
|
||||
},
|
||||
{
|
||||
"deleted": true,
|
||||
"id": "recuQVL2gpUjN64py"
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 17:22:13 GMT",
|
||||
"Content-Type",
|
||||
"91",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=psOMBihmNThSHe+ZEkpP1CKmbhnepN53OlaE2Eyi0zBUDOzM7dHGR7ptEm8ebKfpyqDolVl93quNNO44wwIfZqZHuSPVGyZsJWJoM2FsHY4G4HaFCJZoPEkqRFFs; Expires=Sat, 25 Feb 2023 17:22:12 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=psOMBihmNThSHe+ZEkpP1CKmbhnepN53OlaE2Eyi0zBUDOzM7dHGR7ptEm8ebKfpyqDolVl93quNNO44wwIfZqZHuSPVGyZsJWJoM2FsHY4G4HaFCJZoPEkqRFFs; Expires=Sat, 25 Feb 2023 17:22:12 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwq5X9BQFhfFj5lr; path=/; expires=Sun, 18 Feb 2024 17:22:12 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"97"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,79 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m/recHcnB1MbBr9Rd2P",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Faith Butterworth",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "att3ibwyOXULYL15O",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/0Hy62Ommo3C1BR3r_TsIMw/xGdMUGBUycsvzqjCPHlIuKyvUCM_Y6InDa7Bz15pCaGtWXyue5BlHYak_kFJYmgVXbgvWAXkaigRk7xdcUHiZU66F33CrAUP36ihAFT3-eU/-_khPf6Rh8P9uLt3Oc55HupkyS000nORrpvZpY1bKwI",
|
||||
"filename": "headshot-purple-2 (1).png",
|
||||
"size": 191272,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/MlmaPKrIg1yOj_qipSwKhg/fVQ5W7QtoxoAszvbIHT2dksddzWQi2ETkCewMXRSY2NIiX6wD1LWuC6d4VICHwRCz_6sKW4vhwZ1vkScFYpcgQ/Iy8lz5HcTKpTrG8gBq4fQJRyPAdnfYrwn3u05_lovmc",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/BBIfL5Oqc8BAHkugmNUkXA/JygSzSF9lLJi1U1dP1xCpH1QTSJwxb2FRvJssEdxZubfzVIa9iofsOn5HKsIFLuPl2K3yYCvaxAD3ZsHa7WCig/Rpbg9vWTPa6-oxoPUO4gqkOBFHzadVBHEZhjJoIu6Y8",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/xlrKts_ACw09qLqsAW16EQ/qrDMlQpI1cVdPCe0uw6ZJw9FeZCcwenmFzZ317qbsO0q8ZY2DY5k-bpPFYBaS4KkqztczIOqdnCBIYiuJ3_wqA/4LU_0QW7hp8Rw828Z_ov3GNcZa86pywziLdQy364XXE",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "Contractor"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 16:02:10 GMT",
|
||||
"Content-Type",
|
||||
"872",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=PhNLtNqLT//gbRBjRTywLiyg0lY3ZGo9Q2LLwOqLnAwsXcrRIaaELYV7A+s2lJlrAsid5UKIKld15Jq1nLyroXxAcFPd3vcbq6ku7tK7LE8HnOQiaMOV9gOoxqoa; Expires=Sat, 25 Feb 2023 16:02:10 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=PhNLtNqLT//gbRBjRTywLiyg0lY3ZGo9Q2LLwOqLnAwsXcrRIaaELYV7A+s2lJlrAsid5UKIKld15Jq1nLyroXxAcFPd3vcbq6ku7tK7LE8HnOQiaMOV9gOoxqoa; Expires=Sat, 25 Feb 2023 16:02:10 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwuEVkvPW1vATlmC; path=/; expires=Sun, 18 Feb 2024 16:02:10 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"1320"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,112 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m/listRecords",
|
||||
"body": {
|
||||
"timeZone": "America/Los_Angeles",
|
||||
"userLocale": "en",
|
||||
"sort": [
|
||||
{
|
||||
"field": "Employee",
|
||||
"direction": "asc"
|
||||
}
|
||||
],
|
||||
"fields": [
|
||||
"Employee"
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"id": "recWhRejYoDn5CNsB",
|
||||
"createdTime": "2023-01-23T07:46:46.000Z",
|
||||
"fields": {}
|
||||
},
|
||||
{
|
||||
"id": "recFeH8y7qLNR6CxB",
|
||||
"createdTime": "2023-01-22T23:15:09.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee 7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recRo4MuSqRcb33pp",
|
||||
"createdTime": "2023-01-23T00:48:36.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee 9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Faith Butterworth"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recbKWDa9URtGWIGG",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Harley Holbrook"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "rec3cPi3z4s6oe9SD",
|
||||
"createdTime": "2023-01-22T23:51:21.000Z",
|
||||
"fields": {
|
||||
"Employee": "Jimmy dean"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recGPicQa5yIo9dBY",
|
||||
"createdTime": "2023-01-22T19:22:05.000Z",
|
||||
"fields": {
|
||||
"Employee": "Matt Aitken"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recElL0yiCgIEVcyc",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Quinn Nguyen"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 16:24:53 GMT",
|
||||
"Content-Type",
|
||||
"338",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=4+PtBWlCPjGrIo2V0YEi8J0ogkebmIOEMfx8TOaOhZvHsaXUZ1TQV+5DlPbCxYxrXoXbbP/F0iRXc3qLGC8LVtm5VIkxt0NDhBENoLsdbBAWF1bbmlOs2DM3N+k3; Expires=Sat, 25 Feb 2023 16:24:53 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=4+PtBWlCPjGrIo2V0YEi8J0ogkebmIOEMfx8TOaOhZvHsaXUZ1TQV+5DlPbCxYxrXoXbbP/F0iRXc3qLGC8LVtm5VIkxt0NDhBENoLsdbBAWF1bbmlOs2DM3N+k3; Expires=Sat, 25 Feb 2023 16:24:53 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brw4B3gkaAL97bpKd; path=/; expires=Sun, 18 Feb 2024 16:24:53 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"829"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,218 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m/listRecords",
|
||||
"body": {},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"id": "rec3cPi3z4s6oe9SD",
|
||||
"createdTime": "2023-01-22T23:51:21.000Z",
|
||||
"fields": {
|
||||
"Employee": "Jimmy dean",
|
||||
"Phone": "7778",
|
||||
"Employee type": "Employee",
|
||||
"Manager": {
|
||||
"id": "usrpWV6yqSVvzVO0j",
|
||||
"email": "matt@trigger.dev",
|
||||
"name": "Matt Aitken"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recElL0yiCgIEVcyc",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Quinn Nguyen",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "attx14Pa1lP0DMgRw",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/5gbGs-cRWoOC46FxBWQZKw/ph_QI1srGvvZArxOz207bnKOs-xlIXF8ZqMlk5ssMr-jbiMuFfXOjmjadjOACGFRyQ9nE59Dpy7540UU_6bpgsQ_tMKtCFaaf2a4ieIPEEU/ptI5mq4oczxmmrz-RRWb3MSegywNfAwWf--9mL5IT34",
|
||||
"filename": "headshot-pink-1.png",
|
||||
"size": 215411,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/3bEGb1n_oJxadHpHMcDg_w/1Mga_f3JNzLtWq_an_E7I98CxejzOpiALmDJHRdI0XcBbVwIv-vzj96mY-XeAL0W32Q_WCQPu4TqWzisnlqLYg/7pJLZzaspSp1339lIgp1o1Nb1durOAoIx-IflDRI8gY",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/7Xr67It2dJ296uYyumST1g/HH8QTjlaP0frLwscoJy3vJLvOdKwz1zHL_ll8zMtfFkm1uFB9-nRkA09YeSojhemScYjpvIB7OoxJTh3lqU-jQ/8jtF2js5F47hndbxts2_ZIFZaxkuq3G0BxbomG1wRDA",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/O1xGv0NoeaGTVYYDxpZnuQ/IBXER_7M4O9QqAmv_9pF2evdf5_9YzeVmdzk3Rsi2gFaK6ueREni-Kaw6Xg8VORqFpHNtUQ7JrV_5Ya4zhSuXg/VAGl2IqW98-D0E1RgBretLYJCmNCDqledVmdTrUOEIU",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "Employee"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recFeH8y7qLNR6CxB",
|
||||
"createdTime": "2023-01-22T23:15:09.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee 7",
|
||||
"Phone": "342567",
|
||||
"Employee type": "Contractor",
|
||||
"Manager": {
|
||||
"id": "usrpWV6yqSVvzVO0j",
|
||||
"email": "matt@trigger.dev",
|
||||
"name": "Matt Aitken"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recGPicQa5yIo9dBY",
|
||||
"createdTime": "2023-01-22T19:22:05.000Z",
|
||||
"fields": {
|
||||
"Employee": "Matt Aitken",
|
||||
"Phone": "12345678",
|
||||
"Employee type": "Employee",
|
||||
"Manager": {
|
||||
"id": "usrpWV6yqSVvzVO0j",
|
||||
"email": "matt@trigger.dev",
|
||||
"name": "Matt Aitken"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Faith Butterworth",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "att3ibwyOXULYL15O",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/xV5UysTMWXnI9p8E8KMTlA/Ov21BA--8-n8JC_sH7-sx_Iub_aXA1PGiVAohUAhE5SuEtqSMGhN39pRHI3tmu3LqEh8iDz8pTZ_TdWHVV8riCTBPEm8NvvD3o6BtJTRXcE/LJjYfS0Wh_KMcmkgL-82HOLXyhhDHnMsFvrqL1OCtXQ",
|
||||
"filename": "headshot-purple-2 (1).png",
|
||||
"size": 191272,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/L9WFjSk92HlOH9RDdrP7MA/7AgbUc3M9KuDz5plvUFL5dsRwt55PiqcnPvoDIawWfk0w_N4GDZPTPDiiqxFOsUMNOk4CB1RuBZFFLNEfu0bRA/RYcp3x_oGgLtvOi7CtUplGM_rmU-EdbBQ5zdcr7L-Yo",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/Zl-Thn_JCnnb_-j9CpJ0lg/9hIAzhles7CH7n0EgRzrg-_qVCz1G6oHXX8M7A70KVUBy3Ttnc1NwoSKLMj7JxmYkqc8hYCRU4qRA_S22sS1cw/BhQLDmDmMAUd4sUaxVfTbHnxPGJD9q0_NPB3l7rYz4o",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/4E18KjffN_36eSJ65hCEFg/1_ts6X0NwupOAEyHnehE_hy5ROdSOt1jODcXv5Cny3Wn4O5r3Ewl3vgsg3Lebkwv40iJo7tbtblZEdtZMecpJA/GBgtTGmld0ZH7_4FygTqipHkEpQVn4dt3CmGBnOo6Wc",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "Contractor"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recRo4MuSqRcb33pp",
|
||||
"createdTime": "2023-01-23T00:48:36.000Z",
|
||||
"fields": {
|
||||
"Employee": "Employee 9",
|
||||
"Phone": "12345678",
|
||||
"Employee type": "Employee",
|
||||
"Manager": {
|
||||
"id": "usrpWV6yqSVvzVO0j",
|
||||
"email": "matt@trigger.dev",
|
||||
"name": "Matt Aitken"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recWhRejYoDn5CNsB",
|
||||
"createdTime": "2023-01-23T07:46:46.000Z",
|
||||
"fields": {}
|
||||
},
|
||||
{
|
||||
"id": "recbKWDa9URtGWIGG",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "Harley Holbrook",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "attIMHgGEnN0YutyM",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/Fz00EH3JBLCN7V_swur5cg/p3tx8jWcy5175n6bvK9aCabwdIfMur6wDrly_X6A8cL6YnO5JBKK0YJW1EjrEzjCtkj0uJ0PAS4lbwD2hMsKlKUZjopUmDegHLnms_ucOxE/6HP7Qw3GHTGiAmHUM21jHC5fhLcyfTrlD9qrs35a9-I",
|
||||
"filename": "headshot-yellow-2.png",
|
||||
"size": 349926,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/Cyg5kaW38cKzs03TbM-X3g/8omtIQVimV1MrD9PPtj2SaAlOA3CxuCdqHWoVPxi6UELMV2w7EhFv9Ko3WexIF5bcQyd9-N4RLFGvd5__VgP6A/suCIwJkTLliZrHLwioXIUqnrkJ7gIOxtNrdQtkDrBjk",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/g3EV5PxrbBETRQ9Qzn5WYg/rloz8wROtoNA6Ab9HEykJEmHtnmqUzxnnksoNJU7Y1NjeoV6dQQQZxLTjQBYJukBQfil4EXI8b_ejtARnkANhw/RwNwembhBCNpNJPThTWE_Fae3KtNvBQf-nDboeTP06c",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676743200000/hFdCcDELa9Y1qNU8ynA-gA/rY9pKGsa3U-i95eAYUT9qPkXhakhXNpWaWBOKsKSSvmc0MFERzMvBTQ9X6hfBBOWdJNPm2ewSI5qaMk1OqdDYg/IVswNEnsz2QWGQtpfHLGHHaAZEWVam08gd7vSXPVMOI",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "On leave"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 15:58:57 GMT",
|
||||
"Content-Type",
|
||||
"2247",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=eKX9sqNvujzmAJZfcbDUrm7NlI8Xe9niXH7mrVhWbrGQZxHi9a8M9cKLI067MCp0mv5UfHVCEeUvkQbnHW8lB/LQwpch1qdox/a0c+J5kcVIGXWLH8zOB6pv2t42; Expires=Sat, 25 Feb 2023 15:58:57 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=eKX9sqNvujzmAJZfcbDUrm7NlI8Xe9niXH7mrVhWbrGQZxHi9a8M9cKLI067MCp0mv5UfHVCEeUvkQbnHW8lB/LQwpch1qdox/a0c+J5kcVIGXWLH8zOB6pv2t42; Expires=Sat, 25 Feb 2023 15:58:57 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwJiIPgBOUtNPjri; path=/; expires=Sun, 18 Feb 2024 15:58:57 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"4968"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,83 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "PATCH",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m/recHcnB1MbBr9Rd2P",
|
||||
"body": {
|
||||
"fields": {
|
||||
"Employee": "John Doe II"
|
||||
}
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "John Doe II",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "att3ibwyOXULYL15O",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/0Hy62Ommo3C1BR3r_TsIMw/xGdMUGBUycsvzqjCPHlIuKyvUCM_Y6InDa7Bz15pCaGtWXyue5BlHYak_kFJYmgVXbgvWAXkaigRk7xdcUHiZU66F33CrAUP36ihAFT3-eU/-_khPf6Rh8P9uLt3Oc55HupkyS000nORrpvZpY1bKwI",
|
||||
"filename": "headshot-purple-2 (1).png",
|
||||
"size": 191272,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/MlmaPKrIg1yOj_qipSwKhg/fVQ5W7QtoxoAszvbIHT2dksddzWQi2ETkCewMXRSY2NIiX6wD1LWuC6d4VICHwRCz_6sKW4vhwZ1vkScFYpcgQ/Iy8lz5HcTKpTrG8gBq4fQJRyPAdnfYrwn3u05_lovmc",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/BBIfL5Oqc8BAHkugmNUkXA/JygSzSF9lLJi1U1dP1xCpH1QTSJwxb2FRvJssEdxZubfzVIa9iofsOn5HKsIFLuPl2K3yYCvaxAD3ZsHa7WCig/Rpbg9vWTPa6-oxoPUO4gqkOBFHzadVBHEZhjJoIu6Y8",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/xlrKts_ACw09qLqsAW16EQ/qrDMlQpI1cVdPCe0uw6ZJw9FeZCcwenmFzZ317qbsO0q8ZY2DY5k-bpPFYBaS4KkqztczIOqdnCBIYiuJ3_wqA/4LU_0QW7hp8Rw828Z_ov3GNcZa86pywziLdQy364XXE",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "Contractor"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 16:56:09 GMT",
|
||||
"Content-Type",
|
||||
"868",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=2CpHsb1CL3MMw3hBwb9rVw+mR1QJ7rNbVnCS1fkDNEEi3FM0b4jSEGQ0FhjkIkdkQfLhOMrCXK95XbgEImuhWJuv4FKNdOIk6hNaJawWjFq6kh/mOMlFi7HU8r8h; Expires=Sat, 25 Feb 2023 16:56:09 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=2CpHsb1CL3MMw3hBwb9rVw+mR1QJ7rNbVnCS1fkDNEEi3FM0b4jSEGQ0FhjkIkdkQfLhOMrCXK95XbgEImuhWJuv4FKNdOIk6hNaJawWjFq6kh/mOMlFi7HU8r8h; Expires=Sat, 25 Feb 2023 16:56:09 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwP6XoEdwHyGdxxZ; path=/; expires=Sun, 18 Feb 2024 16:56:09 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"1314"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,92 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "PATCH",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m",
|
||||
"body": {
|
||||
"records": [
|
||||
{
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"fields": {
|
||||
"Employee": "John Doe"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "John Doe",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "att3ibwyOXULYL15O",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/0Hy62Ommo3C1BR3r_TsIMw/xGdMUGBUycsvzqjCPHlIuKyvUCM_Y6InDa7Bz15pCaGtWXyue5BlHYak_kFJYmgVXbgvWAXkaigRk7xdcUHiZU66F33CrAUP36ihAFT3-eU/-_khPf6Rh8P9uLt3Oc55HupkyS000nORrpvZpY1bKwI",
|
||||
"filename": "headshot-purple-2 (1).png",
|
||||
"size": 191272,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/MlmaPKrIg1yOj_qipSwKhg/fVQ5W7QtoxoAszvbIHT2dksddzWQi2ETkCewMXRSY2NIiX6wD1LWuC6d4VICHwRCz_6sKW4vhwZ1vkScFYpcgQ/Iy8lz5HcTKpTrG8gBq4fQJRyPAdnfYrwn3u05_lovmc",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/BBIfL5Oqc8BAHkugmNUkXA/JygSzSF9lLJi1U1dP1xCpH1QTSJwxb2FRvJssEdxZubfzVIa9iofsOn5HKsIFLuPl2K3yYCvaxAD3ZsHa7WCig/Rpbg9vWTPa6-oxoPUO4gqkOBFHzadVBHEZhjJoIu6Y8",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/xlrKts_ACw09qLqsAW16EQ/qrDMlQpI1cVdPCe0uw6ZJw9FeZCcwenmFzZ317qbsO0q8ZY2DY5k-bpPFYBaS4KkqztczIOqdnCBIYiuJ3_wqA/4LU_0QW7hp8Rw828Z_ov3GNcZa86pywziLdQy364XXE",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "Contractor"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 16:46:03 GMT",
|
||||
"Content-Type",
|
||||
"870",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=aRijGYsG1c7HW7/3PfA+iqX9yfDtsVgoPBVm4dkHcigHjt0gpNbzI/GN4nVRaRPorF1fOAE0jRrIREfxlnx9YcqQP097XI6IpF109sT5W5dRnY6rzb2gyGS93Vhn; Expires=Sat, 25 Feb 2023 16:46:03 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=aRijGYsG1c7HW7/3PfA+iqX9yfDtsVgoPBVm4dkHcigHjt0gpNbzI/GN4nVRaRPorF1fOAE0jRrIREfxlnx9YcqQP097XI6IpF109sT5W5dRnY6rzb2gyGS93Vhn; Expires=Sat, 25 Feb 2023 16:46:03 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwkAO755Iu5BkpXR; path=/; expires=Sun, 18 Feb 2024 16:46:03 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"1325"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,114 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.airtable.com:443",
|
||||
"method": "PATCH",
|
||||
"path": "/v0/appBlf3KsalIQeMUo/tblvXn2TOeVPC9c6m",
|
||||
"body": {
|
||||
"performUpsert": {
|
||||
"fieldsToMergeOn": [
|
||||
"Employee"
|
||||
]
|
||||
},
|
||||
"records": [
|
||||
{
|
||||
"fields": {
|
||||
"Employee": "John Doe"
|
||||
}
|
||||
},
|
||||
{
|
||||
"fields": {
|
||||
"Employee": "Jane Doe"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"records": [
|
||||
{
|
||||
"id": "recHcnB1MbBr9Rd2P",
|
||||
"createdTime": "2023-01-03T12:05:53.000Z",
|
||||
"fields": {
|
||||
"Employee": "John Doe",
|
||||
"Phone": "(123) 456-7890",
|
||||
"Headshot": [
|
||||
{
|
||||
"id": "att3ibwyOXULYL15O",
|
||||
"width": 950,
|
||||
"height": 700,
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/0Hy62Ommo3C1BR3r_TsIMw/xGdMUGBUycsvzqjCPHlIuKyvUCM_Y6InDa7Bz15pCaGtWXyue5BlHYak_kFJYmgVXbgvWAXkaigRk7xdcUHiZU66F33CrAUP36ihAFT3-eU/-_khPf6Rh8P9uLt3Oc55HupkyS000nORrpvZpY1bKwI",
|
||||
"filename": "headshot-purple-2 (1).png",
|
||||
"size": 191272,
|
||||
"type": "image/png",
|
||||
"thumbnails": {
|
||||
"small": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/MlmaPKrIg1yOj_qipSwKhg/fVQ5W7QtoxoAszvbIHT2dksddzWQi2ETkCewMXRSY2NIiX6wD1LWuC6d4VICHwRCz_6sKW4vhwZ1vkScFYpcgQ/Iy8lz5HcTKpTrG8gBq4fQJRyPAdnfYrwn3u05_lovmc",
|
||||
"width": 49,
|
||||
"height": 36
|
||||
},
|
||||
"large": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/BBIfL5Oqc8BAHkugmNUkXA/JygSzSF9lLJi1U1dP1xCpH1QTSJwxb2FRvJssEdxZubfzVIa9iofsOn5HKsIFLuPl2K3yYCvaxAD3ZsHa7WCig/Rpbg9vWTPa6-oxoPUO4gqkOBFHzadVBHEZhjJoIu6Y8",
|
||||
"width": 695,
|
||||
"height": 512
|
||||
},
|
||||
"full": {
|
||||
"url": "https://v5.airtableusercontent.com/v1/15/15/1676750400000/xlrKts_ACw09qLqsAW16EQ/qrDMlQpI1cVdPCe0uw6ZJw9FeZCcwenmFzZ317qbsO0q8ZY2DY5k-bpPFYBaS4KkqztczIOqdnCBIYiuJ3_wqA/4LU_0QW7hp8Rw828Z_ov3GNcZa86pywziLdQy364XXE",
|
||||
"width": 3000,
|
||||
"height": 3000
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"Employee type": "Contractor"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "recpyQHEcTiiwzAAe",
|
||||
"createdTime": "2023-02-18T16:49:12.000Z",
|
||||
"fields": {
|
||||
"Employee": "Jane Doe"
|
||||
}
|
||||
}
|
||||
],
|
||||
"updatedRecords": [
|
||||
"recHcnB1MbBr9Rd2P"
|
||||
],
|
||||
"createdRecords": [
|
||||
"recpyQHEcTiiwzAAe"
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sat, 18 Feb 2023 16:49:12 GMT",
|
||||
"Content-Type",
|
||||
"931",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"AWSALB=/B2FI/4JzHLz69XGh0fnXEzIHT58xav2z9CRaJPk/mxxK+IPKjzX/Kd13DU/uJsnD5QcWRgFZjepxA7s8HoojMSUw3+Vkav3Db4mPcly8wQXp88r5BEUjDvFso9o; Expires=Sat, 25 Feb 2023 16:49:12 GMT; Path=/",
|
||||
"Set-Cookie",
|
||||
"AWSALBCORS=/B2FI/4JzHLz69XGh0fnXEzIHT58xav2z9CRaJPk/mxxK+IPKjzX/Kd13DU/uJsnD5QcWRgFZjepxA7s8HoojMSUw3+Vkav3Db4mPcly8wQXp88r5BEUjDvFso9o; Expires=Sat, 25 Feb 2023 16:49:12 GMT; Path=/; SameSite=None; Secure",
|
||||
"Server",
|
||||
"Tengine",
|
||||
"Set-Cookie",
|
||||
"brw=brwsqrG8CnBxgniFg; path=/; expires=Sun, 18 Feb 2024 16:49:12 GMT; domain=.airtable.com; samesite=none; secure",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"access-control-allow-methods",
|
||||
"DELETE,GET,OPTIONS,PATCH,POST,PUT",
|
||||
"access-control-allow-headers",
|
||||
"authorization,content-length,content-type,user-agent,x-airtable-application-id,x-airtable-user-agent,x-api-version,x-requested-with",
|
||||
"X-Frame-Options",
|
||||
"DENY",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"airtable-uncompressed-content-length",
|
||||
"1504"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,78 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://slack.com:443",
|
||||
"method": "POST",
|
||||
"path": "/api/chat.postMessage",
|
||||
"body": {
|
||||
"channel": "C00AAAAAAAA",
|
||||
"text": "This channel doesn't exist, so message won't send"
|
||||
},
|
||||
"status": 200,
|
||||
"response": [
|
||||
"13270000045439f20ace64f1259fdc9ec3444e00b2e6817cef2beb4e3f1ab2011262c998a76bb93c"
|
||||
],
|
||||
"rawHeaders": [
|
||||
"date",
|
||||
"Sat, 18 Feb 2023 16:06:42 GMT",
|
||||
"server",
|
||||
"Apache",
|
||||
"x-powered-by",
|
||||
"HHVM/4.153.1",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"referrer-policy",
|
||||
"no-referrer",
|
||||
"x-slack-backend",
|
||||
"r",
|
||||
"x-slack-unique-id",
|
||||
"Y_D3kqn7oMaK4u0tyzhR0AAAEDY",
|
||||
"strict-transport-security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-headers",
|
||||
"slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled, x-b3-flags",
|
||||
"access-control-expose-headers",
|
||||
"x-slack-req-id, retry-after",
|
||||
"x-oauth-scopes",
|
||||
"channels:read,channels:join,channels:manage,chat:write,groups:write,im:write,mpim:write,chat:write.customize,reactions:write",
|
||||
"x-accepted-oauth-scopes",
|
||||
"chat:write",
|
||||
"expires",
|
||||
"Mon, 26 Jul 1997 05:00:00 GMT",
|
||||
"cache-control",
|
||||
"private, no-cache, no-store, must-revalidate",
|
||||
"pragma",
|
||||
"no-cache",
|
||||
"x-xss-protection",
|
||||
"0",
|
||||
"x-content-type-options",
|
||||
"nosniff",
|
||||
"x-slack-req-id",
|
||||
"ebbefac5397dbab5385db0aae08cf6b3",
|
||||
"vary",
|
||||
"Accept-Encoding",
|
||||
"content-encoding",
|
||||
"br",
|
||||
"content-length",
|
||||
"40",
|
||||
"content-type",
|
||||
"application/json; charset=utf-8",
|
||||
"x-envoy-upstream-service-time",
|
||||
"93",
|
||||
"x-backend",
|
||||
"main_normal main_canary_with_overflow main_control_with_overflow",
|
||||
"x-server",
|
||||
"slack-www-hhvm-main-iad-dihx",
|
||||
"x-slack-shared-secret-outcome",
|
||||
"no-match",
|
||||
"via",
|
||||
"envoy-www-iad-uqca, envoy-edge-lhr-ozbu",
|
||||
"x-edge-backend",
|
||||
"envoy-www",
|
||||
"x-slack-edge-shared-secret-outcome",
|
||||
"no-match",
|
||||
"connection",
|
||||
"close"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,78 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://slack.com:443",
|
||||
"method": "POST",
|
||||
"path": "/api/chat.postMessage",
|
||||
"body": {
|
||||
"channel": "C04GWUTDC3W",
|
||||
"text": "This the Trigger.dev integrations test"
|
||||
},
|
||||
"status": 200,
|
||||
"response": [
|
||||
"132a0300c4f7dfcd9f56ce9d9f9342c8d6f68b484575e2661a76992518653ed6029993da6eeb1ffccd5ee7345e3bb70b6a2dc047cc6a474c8790110b4b6112e38710141d5d7f7f7e5c14e36f28ac9610f8244dd23821e74d1688288302d2d790231ad355b5df82a0e0e8fa972e9eeeae73eef97ed686181b0ad73ce882605eae7aede863d1ef76db0bd36a6fa27fe9e317b9002e2360a92b8c47fc31049f8e6edce7e7ebcbcd1ba9a03e9b3101f2b01b4fd93d33e1da644bc8ff7161faf2553ea405e1dab9e6672888b8ed2456c3b4c796c43df1a8dab9fcc53ca1fa78c294ffe6b7c20bc170baaa060a937a4be63de7f627f531276273af355d3dd88e517b0185cce397a058db09ab71d2bca74b29d992ad9b657572babef0e99649c9b2cb3197da8159b25dbd5ab2f5d9ac64496a7192be18348e881e3192189d34d057f0f9d534a00667852a365b685402cac16b4132aa117b171387829075f67ae7f319"
|
||||
],
|
||||
"rawHeaders": [
|
||||
"date",
|
||||
"Sat, 18 Feb 2023 16:06:41 GMT",
|
||||
"server",
|
||||
"Apache",
|
||||
"x-powered-by",
|
||||
"HHVM/4.153.1",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"referrer-policy",
|
||||
"no-referrer",
|
||||
"x-slack-backend",
|
||||
"r",
|
||||
"x-slack-unique-id",
|
||||
"Y_D3kaZTOTsosPP4CQqdxwAAAD8",
|
||||
"strict-transport-security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-headers",
|
||||
"slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled, x-b3-flags",
|
||||
"access-control-expose-headers",
|
||||
"x-slack-req-id, retry-after",
|
||||
"x-oauth-scopes",
|
||||
"channels:read,channels:join,channels:manage,chat:write,groups:write,im:write,mpim:write,chat:write.customize,reactions:write",
|
||||
"x-accepted-oauth-scopes",
|
||||
"chat:write",
|
||||
"expires",
|
||||
"Mon, 26 Jul 1997 05:00:00 GMT",
|
||||
"cache-control",
|
||||
"private, no-cache, no-store, must-revalidate",
|
||||
"pragma",
|
||||
"no-cache",
|
||||
"x-xss-protection",
|
||||
"0",
|
||||
"x-content-type-options",
|
||||
"nosniff",
|
||||
"x-slack-req-id",
|
||||
"bd4f8b61920e9df75d67e4cfeb504ab9",
|
||||
"vary",
|
||||
"Accept-Encoding",
|
||||
"content-encoding",
|
||||
"br",
|
||||
"content-length",
|
||||
"351",
|
||||
"content-type",
|
||||
"application/json; charset=utf-8",
|
||||
"x-envoy-upstream-service-time",
|
||||
"141",
|
||||
"x-backend",
|
||||
"main_normal main_canary_with_overflow main_control_with_overflow",
|
||||
"x-server",
|
||||
"slack-www-hhvm-main-iad-mhht",
|
||||
"x-slack-shared-secret-outcome",
|
||||
"no-match",
|
||||
"via",
|
||||
"envoy-www-iad-qbeb, envoy-edge-lhr-vvct",
|
||||
"x-edge-backend",
|
||||
"envoy-www",
|
||||
"x-slack-edge-shared-secret-outcome",
|
||||
"no-match",
|
||||
"connection",
|
||||
"close"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,75 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://slack.com:443",
|
||||
"method": "GET",
|
||||
"path": "/api/conversations.list?limit=1",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": [
|
||||
"13b70300c4c8b67c7d337bad87225e710b16c4026732712e9d6da4139c5a54d3ce1324f223350ae881931e68f7fe6f2e24241b5ae4fce77333b3308328b0bdc4c2a6b0c47fd8fe99218bb08d13c7b0eeaf3fed1350d47ec5b10d59b12bca7aac133d4690f51821096e8017ee6455da533537753e31a7cf1f8a4134bc504d55d54dddd5edb6948833517f6a3b0cb0cc0dea32ab8b76a2c2b0c8a4d6b369799577425dd5010f896e52233616b8cbf8b8df824e74d5d5cf1fc5e9f8fd719fd94f603a045e61471fcef3f123a9795cbe1f966919aeaa688a612b14de3162df8f279060601b5ea44a20d17d8337c7302e4f2e4d558826a6c8229a3e6ec7f23bfa639a72cc9ae6e29f85125e05bc3b2a819318db3338ce776ce35ed4d248740b126c7a503e5423e15e3c991b886c598e5622e0ce7dc37abc6fe8684101b30acd3947bb1c13d3a154d39724844e2171995571e95794c47e1c677542492aa2844b4dee39115d926741c0bb52eec747642206ab11f9b5d631d92d819adefc4a7429f12192908486c57ab7442a76f9301383deac46a939aa07554cf5b06d2cfe028d6b812d9122d694e12ac0b13c8f7d9c6302b6115dbca7c16b73fa70fa64dc9d450f6f85d8c36201"
|
||||
],
|
||||
"rawHeaders": [
|
||||
"date",
|
||||
"Sat, 18 Feb 2023 16:06:42 GMT",
|
||||
"server",
|
||||
"Apache",
|
||||
"x-powered-by",
|
||||
"HHVM/4.153.1",
|
||||
"access-control-allow-origin",
|
||||
"*",
|
||||
"referrer-policy",
|
||||
"no-referrer",
|
||||
"x-slack-backend",
|
||||
"r",
|
||||
"x-slack-unique-id",
|
||||
"Y_D3khlLQ9vqek922QY0uQAAECM",
|
||||
"strict-transport-security",
|
||||
"max-age=31536000; includeSubDomains; preload",
|
||||
"access-control-allow-headers",
|
||||
"slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid, x-b3-sampled, x-b3-flags",
|
||||
"access-control-expose-headers",
|
||||
"x-slack-req-id, retry-after",
|
||||
"x-oauth-scopes",
|
||||
"channels:read,channels:join,channels:manage,chat:write,groups:write,im:write,mpim:write,chat:write.customize,reactions:write",
|
||||
"x-accepted-oauth-scopes",
|
||||
"channels:read,groups:read,mpim:read,im:read,read",
|
||||
"expires",
|
||||
"Mon, 26 Jul 1997 05:00:00 GMT",
|
||||
"cache-control",
|
||||
"private, no-cache, no-store, must-revalidate",
|
||||
"pragma",
|
||||
"no-cache",
|
||||
"x-xss-protection",
|
||||
"0",
|
||||
"x-content-type-options",
|
||||
"nosniff",
|
||||
"x-slack-req-id",
|
||||
"c9ac7f0c1a73910e91a87a6cd3925462",
|
||||
"vary",
|
||||
"Accept-Encoding",
|
||||
"content-encoding",
|
||||
"br",
|
||||
"content-length",
|
||||
"452",
|
||||
"content-type",
|
||||
"application/json; charset=utf-8",
|
||||
"x-envoy-upstream-service-time",
|
||||
"115",
|
||||
"x-backend",
|
||||
"main_normal main_canary_with_overflow main_control_with_overflow",
|
||||
"x-server",
|
||||
"slack-www-hhvm-main-iad-bmkm",
|
||||
"x-slack-shared-secret-outcome",
|
||||
"no-match",
|
||||
"via",
|
||||
"envoy-www-iad-vpph, envoy-edge-lhr-tspo",
|
||||
"x-edge-backend",
|
||||
"envoy-www",
|
||||
"x-slack-edge-shared-secret-outcome",
|
||||
"no-match",
|
||||
"connection",
|
||||
"close"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,120 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "PATCH",
|
||||
"path": "/v1/blocks/b4609033-b45a-4fc6-8d15-f06920495ab1/children",
|
||||
"body": {
|
||||
"children": [
|
||||
{
|
||||
"heading_1": {
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "This new title is appended using appendBlockChildren()"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "list",
|
||||
"results": [
|
||||
{
|
||||
"object": "block",
|
||||
"id": "4c946f30-ebc2-4eed-bfbc-094226ae9659",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-27T11:22:00.000Z",
|
||||
"last_edited_time": "2023-02-27T11:22:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": false,
|
||||
"type": "heading_1",
|
||||
"heading_1": {
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "This new title is appended using appendBlockChildren()",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "This new title is appended using appendBlockChildren()",
|
||||
"href": null
|
||||
}
|
||||
],
|
||||
"is_toggleable": false,
|
||||
"color": "default"
|
||||
}
|
||||
}
|
||||
],
|
||||
"next_cursor": null,
|
||||
"has_more": false,
|
||||
"type": "block",
|
||||
"block": {}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 11:22:57 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=53f6ccf8-1698-4ece-ab61-a73987903c80; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 11:22:56 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"383-2rLMttu6Pq17KGfS6h8OoM7fsF0\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 11:22:56 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=VXShyz_MBH77_gf3gFuj9pOYT7KvZ0tAI1g76xSEsck-1677496977-0-AUaWjGjnwWhILvSEGODB1JprJBjZrmavjD0fIoD8o74Vdpn24iAC1GFwI+oEzZMuV8/3uv4uYpo9ZB8PP0HV/c4=; path=/; expires=Mon, 27-Feb-23 11:52:57 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,98 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v1/comments",
|
||||
"body": {
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"rich_text": [
|
||||
{
|
||||
"text": {
|
||||
"content": "Hello world"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "comment",
|
||||
"id": "6ff7c4ea-2666-4fe7-a256-56b43a73ea10",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"discussion_id": "81530ca2-4afa-44c0-b298-7fab0a72b563",
|
||||
"created_time": "2023-02-27T13:00:00.000Z",
|
||||
"last_edited_time": "2023-02-27T13:00:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Hello world",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Hello world",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 13:00:37 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=7bc1c0a7-d91d-4689-91b6-c883d992ffec; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 13:00:37 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"24c-39U+DEocpupSzxBZH1jvsL+yyfE\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 13:00:37 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=JdgeEvg_PUn_06.lvhPATrAM_WVGfxBXIcOghAm6Yr0-1677502837-0-AbYTmwFA+LHk4LeVThTqVragQppCTfC0TAHONeLrHzQP4RvMSSL92kGXM1mtAufkMHDcaHDftwzDCzLiKkGNOtg=; path=/; expires=Mon, 27-Feb-23 13:30:37 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,165 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v1/databases",
|
||||
"body": {
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "📝"
|
||||
},
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Trigger.dev created db",
|
||||
"link": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"properties": {
|
||||
"Name": {
|
||||
"title": {}
|
||||
},
|
||||
"Description": {
|
||||
"rich_text": {}
|
||||
},
|
||||
"In stock": {
|
||||
"checkbox": {}
|
||||
},
|
||||
"+1": {
|
||||
"people": {}
|
||||
},
|
||||
"Photo": {
|
||||
"files": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "database",
|
||||
"id": "8db50793-ac53-496b-bbff-a74be0fb78b4",
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "📝"
|
||||
},
|
||||
"created_time": "2023-02-27T12:03:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_time": "2023-02-27T12:03:00.000Z",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Trigger.dev created db",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Trigger.dev created db",
|
||||
"href": null
|
||||
}
|
||||
],
|
||||
"description": [],
|
||||
"is_inline": false,
|
||||
"properties": {
|
||||
"Photo": {
|
||||
"id": "JvIM",
|
||||
"name": "Photo",
|
||||
"type": "files",
|
||||
"files": {}
|
||||
},
|
||||
"Description": {
|
||||
"id": "al%3E%3F",
|
||||
"name": "Description",
|
||||
"type": "rich_text",
|
||||
"rich_text": {}
|
||||
},
|
||||
"+1": {
|
||||
"id": "b%7DNi",
|
||||
"name": "+1",
|
||||
"type": "people",
|
||||
"people": {}
|
||||
},
|
||||
"In stock": {
|
||||
"id": "q%60gF",
|
||||
"name": "In stock",
|
||||
"type": "checkbox",
|
||||
"checkbox": {}
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"name": "Name",
|
||||
"type": "title",
|
||||
"title": {}
|
||||
}
|
||||
},
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"url": "https://www.notion.so/8db50793ac53496bbbffa74be0fb78b4",
|
||||
"archived": false
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 12:03:23 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=45d29e4b-e829-4c24-b6a4-6220d6103576; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 12:03:22 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"48b-o15ev/xDPCB+PMklXFEv7yjRNjg\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 12:03:22 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=oTxAMd2fa8cXyXzIAradg5hbvrWNohWvKiBn_nAAT.Q-1677499403-0-AcoKZ8MVXztc+eW5DoC2TGRVKUWQIgFsB8w8UHKbORoTp8Qw7uTk/efMwoQoW2BTGY6Qy4GJEn1P8iZ/DRsSLIA=; path=/; expires=Mon, 27-Feb-23 12:33:23 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,116 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v1/pages",
|
||||
"body": {
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"properties": {
|
||||
"title": {
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Test page"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "page",
|
||||
"id": "8bd3c664-d6ef-46af-9910-e22686eb997e",
|
||||
"created_time": "2023-02-26T17:38:00.000Z",
|
||||
"last_edited_time": "2023-02-26T17:38:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": null,
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"title": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Test page",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Test page",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Test-page-8bd3c664d6ef46af9910e22686eb997e"
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sun, 26 Feb 2023 17:38:03 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=0584f959-2ff5-46b1-9d5d-832c26040396; Domain=www.notion.so; Path=/; Expires=Mon, 26 Feb 2024 17:38:02 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"301-5q45Nq2W9keK4up4HOm5qUpzNKo\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Mon, 27 Feb 2023 17:38:02 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=MeS4vVeV5Sms1RFoqYUoJ.onoMrGFyS6M_b0rfN7aho-1677433083-0-AQTR+b9TQ5LWf2yEhTnFj4QFuWs/C0ySl36mDO9bwhQ2rnsR1I8wrFgFls6yg4BJuorZQBnYtmIw00LnCvDHTfA=; path=/; expires=Sun, 26-Feb-23 18:08:03 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,96 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "DELETE",
|
||||
"path": "/v1/blocks/4c946f30-ebc2-4eed-bfbc-094226ae9659",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "block",
|
||||
"id": "4c946f30-ebc2-4eed-bfbc-094226ae9659",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-27T11:22:00.000Z",
|
||||
"last_edited_time": "2023-02-27T11:26:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": true,
|
||||
"type": "heading_1",
|
||||
"heading_1": {
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "This new title is appended using appendBlockChildren()",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "This new title is appended using appendBlockChildren()",
|
||||
"href": null
|
||||
}
|
||||
],
|
||||
"is_toggleable": false,
|
||||
"color": "default"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 11:26:10 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=d7b221d7-718e-45a2-a11e-1406aa98975d; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 11:26:09 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"326-D6+1VY70vo6bSnfGivDXLQlR9sA\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 11:26:09 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=LargbK1gg7PjzvuUZu9DAsNpgc2zb3YdVGwgePQccYg-1677497170-0-Af8+5TWVeIgr9kq8MfM0cIPW6rO2QT0AA7cuyIFfJYni14Qvd5M0V+CkIF/Vrto9qbmPTD6L40sKr4fkr12MIkA=; path=/; expires=Mon, 27-Feb-23 11:56:10 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,76 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/blocks/b4609033-b45a-4fc6-8d15-f06920495ab1",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "block",
|
||||
"id": "b4609033-b45a-4fc6-8d15-f06920495ab1",
|
||||
"parent": {
|
||||
"type": "workspace",
|
||||
"workspace": true
|
||||
},
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-27T09:19:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"has_children": true,
|
||||
"archived": false,
|
||||
"type": "child_page",
|
||||
"child_page": {
|
||||
"title": "Personal Home"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 09:26:00 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=5d40d8ce-14ac-4534-a52e-1fc1b79f6242; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 09:26:00 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"1bf-Xn6bRYmy8GO/bp7WIQLZCOHSxRw\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 09:26:00 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=xDv5oNogRgQN.m5YOrYBRu7vQPpAprpUNpqRES8Zbp8-1677489960-0-AS3KjttcIVVXJO5WedstOC9vc78EcmHw2kyHHdUTBVk3Uufe8/r5VygzgdKwS8XiDkYFQFYaMzvUMIcZwcXBNeE=; path=/; expires=Mon, 27-Feb-23 09:56:00 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,223 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/blocks/b4609033-b45a-4fc6-8d15-f06920495ab1/children",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "list",
|
||||
"results": [
|
||||
{
|
||||
"object": "block",
|
||||
"id": "2675c67d-392a-4b86-86f6-93de22c797bd",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": false,
|
||||
"type": "paragraph",
|
||||
"paragraph": {
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Organize everything in your life in one place.",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Organize everything in your life in one place.",
|
||||
"href": null
|
||||
}
|
||||
],
|
||||
"color": "gray"
|
||||
}
|
||||
},
|
||||
{
|
||||
"object": "block",
|
||||
"id": "f3df1513-efda-4caf-af5b-f08a0ebe3dfa",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"has_children": true,
|
||||
"archived": false,
|
||||
"type": "column_list",
|
||||
"column_list": {}
|
||||
},
|
||||
{
|
||||
"object": "block",
|
||||
"id": "d843f4ae-6cc2-44df-a294-3d9405c950bb",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-26T17:36:00.000Z",
|
||||
"last_edited_time": "2023-02-26T17:36:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": false,
|
||||
"type": "child_page",
|
||||
"child_page": {
|
||||
"title": "Test page"
|
||||
}
|
||||
},
|
||||
{
|
||||
"object": "block",
|
||||
"id": "026566db-b2a0-4d0a-96f1-1007fccc28df",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-26T17:37:00.000Z",
|
||||
"last_edited_time": "2023-02-26T17:37:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": false,
|
||||
"type": "child_page",
|
||||
"child_page": {
|
||||
"title": "Test page"
|
||||
}
|
||||
},
|
||||
{
|
||||
"object": "block",
|
||||
"id": "8bd3c664-d6ef-46af-9910-e22686eb997e",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-26T17:38:00.000Z",
|
||||
"last_edited_time": "2023-02-26T17:38:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": false,
|
||||
"type": "child_page",
|
||||
"child_page": {
|
||||
"title": "Test page"
|
||||
}
|
||||
},
|
||||
{
|
||||
"object": "block",
|
||||
"id": "fe7ade22-66de-45fb-b3b5-4a467ff67d2b",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"created_time": "2023-02-26T17:38:00.000Z",
|
||||
"last_edited_time": "2023-02-26T17:38:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"has_children": false,
|
||||
"archived": false,
|
||||
"type": "paragraph",
|
||||
"paragraph": {
|
||||
"rich_text": [],
|
||||
"color": "default"
|
||||
}
|
||||
}
|
||||
],
|
||||
"next_cursor": null,
|
||||
"has_more": false,
|
||||
"type": "block",
|
||||
"block": {}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 11:09:36 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=86f94a88-a9d2-4e88-abf9-3d364583ad08; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 11:09:36 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"c9a-7ksTq1q+y6dBHZKFnoF7Xfgs/Fw\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 11:09:36 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=ipVUIrHFEqeTilNjmbfPoJKioZkTOB97pJd9mYe9zIk-1677496176-0-AZfFsUjfINaIHmGd5kPe0tqoBC2UgOqo1kL89YPsBd4fTQWgiJ5PdZFotvJdsHaXlUTyGswSb6HQO3kF6D7POjw=; path=/; expires=Mon, 27-Feb-23 11:39:36 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,75 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/users/me",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644",
|
||||
"name": "Trigger.dev (localhost)",
|
||||
"avatar_url": "https://s3-us-west-2.amazonaws.com/public.notion-static.com/b374368f-9f41-460a-bf8e-5e19f8fb0e07/td-square-logo_512.png",
|
||||
"type": "bot",
|
||||
"bot": {
|
||||
"owner": {
|
||||
"type": "user",
|
||||
"user": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4",
|
||||
"name": "Matt Aitken",
|
||||
"avatar_url": "https://s3-us-west-2.amazonaws.com/public.notion-static.com/0ccadce7-a4aa-4a69-92e6-2ac708593613/matt-wedding.jpg",
|
||||
"type": "person",
|
||||
"person": {
|
||||
"email": "matt@apihero.run"
|
||||
}
|
||||
}
|
||||
},
|
||||
"workspace_name": "Notion integration test workspace"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sun, 26 Feb 2023 17:03:48 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=9231cce8-e2ce-411c-b0e1-2597eb62b367; Domain=www.notion.so; Path=/; Expires=Mon, 26 Feb 2024 17:03:48 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"258-Y7OR6G0p0SWytfeYN6CvqKvsRr4\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Mon, 27 Feb 2023 17:03:48 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=bFtxnRN2taXobaLZvnlr6T3gU61eVngXy2I7_UV5sQs-1677431028-0-AVKDesaUNQBhdDqVjtHeh1Up5jm+pHl7pOcmzOpVMuUGHrrNulojcu6nNhI8Qp0hIs2e5m2DF/7wTh8dzT4KPOc=; path=/; expires=Sun, 26-Feb-23 17:33:48 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,95 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/comments?block_id=b4609033-b45a-4fc6-8d15-f06920495ab1",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "list",
|
||||
"results": [
|
||||
{
|
||||
"object": "comment",
|
||||
"id": "6ff7c4ea-2666-4fe7-a256-56b43a73ea10",
|
||||
"parent": {
|
||||
"type": "page_id",
|
||||
"page_id": "b4609033-b45a-4fc6-8d15-f06920495ab1"
|
||||
},
|
||||
"discussion_id": "81530ca2-4afa-44c0-b298-7fab0a72b563",
|
||||
"created_time": "2023-02-27T13:00:00.000Z",
|
||||
"last_edited_time": "2023-02-27T13:00:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644"
|
||||
},
|
||||
"rich_text": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Hello world",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Hello world",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"next_cursor": null,
|
||||
"has_more": false,
|
||||
"type": "comment",
|
||||
"comment": {}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 13:00:58 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=c81c8597-3ce1-47c0-8534-3d082e8bad6c; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 13:00:58 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"2ac-O+0+EDR87lnud1uk0Nv98XVEwRE\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 13:00:58 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=SZWrmwDFWsjiBWbj0XSJiw.u3NWFS5JHraec1hFlXTU-1677502858-0-AceoZDX4TcA2W/fyWOdl8ZvCnFibpJWx8CF8vLabqtJQK1ZqHHYc5yitwJd6ylJC1pCsnGxwqDtKKPSThXMs5Hc=; path=/; expires=Mon, 27-Feb-23 13:30:58 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,164 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/databases/0fadc732-4472-418c-83dc-04454332cb52",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "database",
|
||||
"id": "0fadc732-4472-418c-83dc-04454332cb52",
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "📓"
|
||||
},
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_time": "2023-02-24T19:09:00.000Z",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Journal",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Journal",
|
||||
"href": null
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Document your life - daily happenings, special occasions, and reflections on your goals.\nCategorize entries with tags and automatically capture the date.\n\n↓ Click through the different database tabs to filter entries by a specific category such as daily or personal.",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Document your life - daily happenings, special occasions, and reflections on your goals.\nCategorize entries with tags and automatically capture the date.\n\n↓ Click through the different database tabs to filter entries by a specific category such as daily or personal.",
|
||||
"href": null
|
||||
}
|
||||
],
|
||||
"is_inline": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"name": "Tags",
|
||||
"type": "multi_select",
|
||||
"multi_select": {
|
||||
"options": [
|
||||
{
|
||||
"id": "4322f3ac-635f-4d2f-808f-22d639bc393b",
|
||||
"name": "Daily",
|
||||
"color": "purple"
|
||||
},
|
||||
{
|
||||
"id": "00a58cba-c800-40cd-a8f1-6e42527b0a29",
|
||||
"name": "Special Event",
|
||||
"color": "yellow"
|
||||
},
|
||||
{
|
||||
"id": "f4cf83a1-4b72-494e-bbc7-4a3c5cbaca4e",
|
||||
"name": "Work",
|
||||
"color": "blue"
|
||||
},
|
||||
{
|
||||
"id": "b28c7f82-f6e4-4a72-a790-78585e7ead7e",
|
||||
"name": "Personal",
|
||||
"color": "red"
|
||||
},
|
||||
{
|
||||
"id": "7973659c-e670-44c5-95bd-ee8bea4410fe",
|
||||
"name": "Planning",
|
||||
"color": "orange"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"name": "Created",
|
||||
"type": "created_time",
|
||||
"created_time": {}
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"name": "Name",
|
||||
"type": "title",
|
||||
"title": {}
|
||||
}
|
||||
},
|
||||
"parent": {
|
||||
"type": "workspace",
|
||||
"workspace": true
|
||||
},
|
||||
"url": "https://www.notion.so/0fadc7324472418c83dc04454332cb52",
|
||||
"archived": false
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 11:31:56 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=b02dceea-7410-4b8b-9953-39e385a6602f; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 11:31:56 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"848-0VcVJU20PQNFJSOeYVumjc5lRqY\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 11:31:56 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=uuQBm38FV5ll_bzRt2ubDw9OzPXYBeijloNaM81LTJU-1677497516-0-AfW2IE7SMS9u4DCuJo99WPCqCycUNmDB75jASkaVcuA5lfUjhFko1coulGCEfqctYOnwFGsTRXkTUmhyigS0rIc=; path=/; expires=Mon, 27-Feb-23 12:01:56 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,107 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/pages/b4609033-b45a-4fc6-8d15-f06920495ab1",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "page",
|
||||
"id": "b4609033-b45a-4fc6-8d15-f06920495ab1",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:09:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": {
|
||||
"type": "external",
|
||||
"external": {
|
||||
"url": "https://www.notion.so/images/page-cover/met_horace_pippin.jpg"
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "🏡"
|
||||
},
|
||||
"parent": {
|
||||
"type": "workspace",
|
||||
"workspace": true
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"title": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Personal Home",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Personal Home",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Personal-Home-b4609033b45a4fc68d15f06920495ab1"
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sun, 26 Feb 2023 17:03:49 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=837961ad-d90a-4d47-a6f1-ef58202dc051; Domain=www.notion.so; Path=/; Expires=Mon, 26 Feb 2024 17:03:49 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"36c-te9LAYsMgFb2lhvFvIZkYRlpBwU\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Mon, 27 Feb 2023 17:03:49 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=c4loqDfzCMnR_nUxqp_cUN9b64H5.AYvYzoiD2k3Dys-1677431029-0-AdU9UH0qjksRe8fwh1fJEjKmMC1iLs8At3ExpapYqTIt2++8Ygcgg/6mhzD8rEvFPpWIDSDdfXLmwEWtH2uWfPI=; path=/; expires=Sun, 26-Feb-23 17:33:49 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,62 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/users/cc18a80a-973f-42c4-8fed-a055f8ae31f4",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4",
|
||||
"name": "Matt Aitken",
|
||||
"avatar_url": "https://s3-us-west-2.amazonaws.com/public.notion-static.com/0ccadce7-a4aa-4a69-92e6-2ac708593613/matt-wedding.jpg",
|
||||
"type": "person",
|
||||
"person": {
|
||||
"email": "matt@apihero.run"
|
||||
}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sun, 26 Feb 2023 17:03:48 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=7a2dbb41-36d9-4105-a02e-5d48c2b39738; Domain=www.notion.so; Path=/; Expires=Mon, 26 Feb 2024 17:03:48 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"109-LARZeHVPyOZD6oYu0o3lE/OaSIY\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Mon, 27 Feb 2023 17:03:48 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=.LPcUVtRskZYeQnmoXm3JleuCDBhDy5xttc1bB0ZAhU-1677431028-0-AZgnltB964z4cce5vJuH+ZKp7AA28R96OldVDfor3Gmp8BNHTuPud15UN9TMND7J18fL9Jeu1QBOsPuTBwuINGc=; path=/; expires=Sun, 26-Feb-23 17:33:48 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,94 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "GET",
|
||||
"path": "/v1/users",
|
||||
"body": "",
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "list",
|
||||
"results": [
|
||||
{
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4",
|
||||
"name": "Matt Aitken",
|
||||
"avatar_url": "https://s3-us-west-2.amazonaws.com/public.notion-static.com/0ccadce7-a4aa-4a69-92e6-2ac708593613/matt-wedding.jpg",
|
||||
"type": "person",
|
||||
"person": {
|
||||
"email": "matt@apihero.run"
|
||||
}
|
||||
},
|
||||
{
|
||||
"object": "user",
|
||||
"id": "bcd4bb6e-7cb4-4e04-8609-10744a579644",
|
||||
"name": "Trigger.dev (localhost)",
|
||||
"avatar_url": "https://s3-us-west-2.amazonaws.com/public.notion-static.com/b374368f-9f41-460a-bf8e-5e19f8fb0e07/td-square-logo_512.png",
|
||||
"type": "bot",
|
||||
"bot": {
|
||||
"owner": {
|
||||
"type": "user",
|
||||
"user": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4",
|
||||
"name": "Matt Aitken",
|
||||
"avatar_url": "https://s3-us-west-2.amazonaws.com/public.notion-static.com/0ccadce7-a4aa-4a69-92e6-2ac708593613/matt-wedding.jpg",
|
||||
"type": "person",
|
||||
"person": {
|
||||
"email": "matt@apihero.run"
|
||||
}
|
||||
}
|
||||
},
|
||||
"workspace_name": "Notion integration test workspace"
|
||||
}
|
||||
}
|
||||
],
|
||||
"next_cursor": null,
|
||||
"has_more": false,
|
||||
"type": "user",
|
||||
"user": {}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Sun, 26 Feb 2023 17:03:48 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=3f1b8498-f598-48f5-ae0e-909958b2d1a3; Domain=www.notion.so; Path=/; Expires=Mon, 26 Feb 2024 17:03:48 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"3bc-ykFfGm633jdplPzsTxjZ4jd6FvI\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Mon, 27 Feb 2023 17:03:48 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=JUbz0XQ9i6zPhxS0oIlWs64OPfsdvZRqasIXF2JnDbQ-1677431028-0-AVLucbFsDItX1PIHDRVIsLNIprkWZAJwGX7lOZsK48xoMeUPs3gFdaJEh1CXf5WYt4q62YwDMhlsHcPlW0kc7iA=; path=/; expires=Sun, 26-Feb-23 17:33:48 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
@@ -1,523 +0,0 @@
|
||||
[
|
||||
{
|
||||
"scope": "https://api.notion.com:443",
|
||||
"method": "POST",
|
||||
"path": "/v1/databases/0fadc732-4472-418c-83dc-04454332cb52/query",
|
||||
"body": {},
|
||||
"status": 200,
|
||||
"response": {
|
||||
"object": "list",
|
||||
"results": [
|
||||
{
|
||||
"object": "page",
|
||||
"id": "09b0be23-f79f-48e4-a24e-be483decd15b",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "🎂"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "7973659c-e670-44c5-95bd-ee8bea4410fe",
|
||||
"name": "Planning",
|
||||
"color": "orange"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "28th Birthday",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "28th Birthday",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/28th-Birthday-09b0be23f79f48e4a24ebe483decd15b"
|
||||
},
|
||||
{
|
||||
"object": "page",
|
||||
"id": "1e26b51f-de7a-4f4f-a491-4217636b232e",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "🥥"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "00a58cba-c800-40cd-a8f1-6e42527b0a29",
|
||||
"name": "Special Event",
|
||||
"color": "yellow"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Hawaii Vacation",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Hawaii Vacation",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Hawaii-Vacation-1e26b51fde7a4f4fa4914217636b232e"
|
||||
},
|
||||
{
|
||||
"object": "page",
|
||||
"id": "2726fedf-6d01-461a-990e-5238be7b7741",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "📋"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "f4cf83a1-4b72-494e-bbc7-4a3c5cbaca4e",
|
||||
"name": "Work",
|
||||
"color": "blue"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Job Search - September",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Job Search - September",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Job-Search-September-2726fedf6d01461a990e5238be7b7741"
|
||||
},
|
||||
{
|
||||
"object": "page",
|
||||
"id": "527fa387-5b64-4eb9-a60e-5382a2fc483b",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "✨"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "4322f3ac-635f-4d2f-808f-22d639bc393b",
|
||||
"name": "Daily",
|
||||
"color": "purple"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "So much to be grateful for",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "So much to be grateful for",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/So-much-to-be-grateful-for-527fa3875b644eb9a60e5382a2fc483b"
|
||||
},
|
||||
{
|
||||
"object": "page",
|
||||
"id": "5c2a75da-1b9c-4cbb-9f2d-fc258c2ee77e",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "🌻"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "4322f3ac-635f-4d2f-808f-22d639bc393b",
|
||||
"name": "Daily",
|
||||
"color": "purple"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Just another day",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Just another day",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Just-another-day-5c2a75da1b9c4cbb9f2dfc258c2ee77e"
|
||||
},
|
||||
{
|
||||
"object": "page",
|
||||
"id": "a6d6cce8-97f2-42b1-9ca9-13496014741a",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "🍸"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "b28c7f82-f6e4-4a72-a790-78585e7ead7e",
|
||||
"name": "Personal",
|
||||
"color": "red"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Date with Stewart",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Date with Stewart",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Date-with-Stewart-a6d6cce897f242b19ca913496014741a"
|
||||
},
|
||||
{
|
||||
"object": "page",
|
||||
"id": "b02c0fe9-758e-4d4b-925e-4b5463459b8b",
|
||||
"created_time": "2023-02-24T19:07:00.000Z",
|
||||
"last_edited_time": "2023-02-24T19:07:00.000Z",
|
||||
"created_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"last_edited_by": {
|
||||
"object": "user",
|
||||
"id": "cc18a80a-973f-42c4-8fed-a055f8ae31f4"
|
||||
},
|
||||
"cover": null,
|
||||
"icon": {
|
||||
"type": "emoji",
|
||||
"emoji": "💭"
|
||||
},
|
||||
"parent": {
|
||||
"type": "database_id",
|
||||
"database_id": "0fadc732-4472-418c-83dc-04454332cb52"
|
||||
},
|
||||
"archived": false,
|
||||
"properties": {
|
||||
"Tags": {
|
||||
"id": "!'(w",
|
||||
"type": "multi_select",
|
||||
"multi_select": [
|
||||
{
|
||||
"id": "4322f3ac-635f-4d2f-808f-22d639bc393b",
|
||||
"name": "Daily",
|
||||
"color": "purple"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Created": {
|
||||
"id": "%7D%25j%7B",
|
||||
"type": "created_time",
|
||||
"created_time": "2023-02-24T19:07:00.000Z"
|
||||
},
|
||||
"Name": {
|
||||
"id": "title",
|
||||
"type": "title",
|
||||
"title": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": {
|
||||
"content": "Daily reflection",
|
||||
"link": null
|
||||
},
|
||||
"annotations": {
|
||||
"bold": false,
|
||||
"italic": false,
|
||||
"strikethrough": false,
|
||||
"underline": false,
|
||||
"code": false,
|
||||
"color": "default"
|
||||
},
|
||||
"plain_text": "Daily reflection",
|
||||
"href": null
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"url": "https://www.notion.so/Daily-reflection-b02c0fe9758e4d4b925e4b5463459b8b"
|
||||
}
|
||||
],
|
||||
"next_cursor": null,
|
||||
"has_more": false,
|
||||
"type": "page",
|
||||
"page": {}
|
||||
},
|
||||
"rawHeaders": [
|
||||
"Date",
|
||||
"Mon, 27 Feb 2023 11:58:47 GMT",
|
||||
"Content-Type",
|
||||
"application/json; charset=utf-8",
|
||||
"Transfer-Encoding",
|
||||
"chunked",
|
||||
"Connection",
|
||||
"close",
|
||||
"Set-Cookie",
|
||||
"notion_browser_id=b073f780-6c12-425e-964c-a024261062b8; Domain=www.notion.so; Path=/; Expires=Tue, 27 Feb 2024 11:58:47 GMT; Secure",
|
||||
"Content-Security-Policy",
|
||||
"script-src 'self' 'unsafe-inline' 'unsafe-eval' https://gist.github.com https://apis.google.com https://www.google.com https://www.gstatic.com https://cdn.amplitude.com https://api.amplitude.com http://dev-embed.notion.co http://embed.notion.co https://widget.intercom.io https://js.intercomcdn.com https://static.zdassets.com https://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://analytics.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://embed.typeform.com https://admin.typeform.com https://public.profitwell.com https://static.profitwell.com js.sentry-cdn.com https://js.chilipiper.com https://platform.twitter.com https://cdn.syndication.twimg.com https://accounts.google.com https://www.googletagmanager.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://cdn01.boxcdn.net https://cdn.sprig.com assets.customer.io code.gist.build;connect-src 'self' data: blob: https://msgstore.www.notion.so wss://msgstore.www.notion.so ws://localhost:* ws://127.0.0.1:* https://notion-emojis.s3-us-west-2.amazonaws.com https://s3-us-west-2.amazonaws.com https://s3.us-west-2.amazonaws.com https://notion-production-snapshots-2.s3.us-west-2.amazonaws.com https://cdn.amplitude.com https://api.amplitude.com https://www.notion.so https://api.embed.ly http://dev-embed.notion.co http://embed.notion.co https://js.intercomcdn.com https://api-iam.intercom.io https://uploads.intercomcdn.com wss://nexus-websocket-a.intercom.io https://ekr.zdassets.com https://ekr.zendesk.com\t https://makenotion.zendesk.com\t https://api.smooch.io\t wss://api.smooch.io\t https://logs-01.loggly.com https://http-inputs-notion.splunkcloud.com https://cdn.segment.com https://api.segment.io https://analytics.pgncs.notion.so https://api.pgncs.notion.so https://o324374.ingest.sentry.io https://checkout.stripe.com https://js.stripe.com https://cdn.contentful.com https://preview.contentful.com https://images.ctfassets.net https://www2.profitwell.com https://tracking.chilipiper.com https://api.chilipiper.com https://api.unsplash.com https://boards-api.greenhouse.io https://accounts.google.com https://oauth2.googleapis.com https://www.googletagmanager.com https://analytics.google.com https://www.googleadservices.com https://googleads.g.doubleclick.net https://region1.google-analytics.com https://region1.analytics.google.com https://www.google-analytics.com https://api-v2.mutinyhq.io https://client-registry.mutinycdn.com https://client.mutinycdn.com https://user-data.mutinycdn.com https://cdn.metadata.io https://platformapi.metadata.io https://d2hrivdxn8ekm8.cloudfront.net https://d1lu3pmaz2ilpx.cloudfront.net https://dvqigh9b7wa32.cloudfront.net https://d330aiyvva2oww.cloudfront.net https://cdn.transcend.io https://telemetry.transcend.io https://api.statuspage.io https://pgncd.notion.so https://api.statsig.com https://statsigapi.net https://exp.notion.so https://file.notion.so notion://file.notion.so https://api.box.com https://*.mux.com https://api.sprig.com https://storage.googleapis.com https://cdn.sprig.com https://cdn.userleap.com track.customer.io *.api.gist.build *.cloud.gist.build;font-src 'self' data: https://cdnjs.cloudflare.com https://js.intercomcdn.com https://cdn01.boxcdn.net;img-src 'self' data: blob: https: https://platform.twitter.com https://syndication.twitter.com https://pbs.twimg.com https://ton.twimg.com https://region1.google-analytics.com https://region1.analytics.google.com https://file.notion.so notion://file.notion.so https://*.mux.com track.customer.io;style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://github.githubassets.com https://js.chilipiper.com https://platform.twitter.com https://ton.twimg.com https://accounts.google.com https://cdn.transcend.io https://cdn01.boxcdn.net code.gist.build;media-src blob: https: http: https://file.notion.so notion://file.notion.so https://*.mux.com;worker-src blob:;frame-src https: http: https://accounts.google.com renderer.gist.build code.gist.build",
|
||||
"X-DNS-Prefetch-Control",
|
||||
"off",
|
||||
"X-Frame-Options",
|
||||
"SAMEORIGIN",
|
||||
"Strict-Transport-Security",
|
||||
"max-age=5184000; includeSubDomains",
|
||||
"X-Download-Options",
|
||||
"noopen",
|
||||
"X-Content-Type-Options",
|
||||
"nosniff",
|
||||
"X-Permitted-Cross-Domain-Policies",
|
||||
"none",
|
||||
"Referrer-Policy",
|
||||
"strict-origin-when-cross-origin",
|
||||
"X-XSS-Protection",
|
||||
"0",
|
||||
"ETag",
|
||||
"W/\"1d6c-SpQFVKKxcgW+bv9mDjNi7A5pUcY\"",
|
||||
"Vary",
|
||||
"Accept-Encoding",
|
||||
"CF-Cache-Status",
|
||||
"DYNAMIC",
|
||||
"Set-Cookie",
|
||||
"notion_check_cookie_consent=true; Domain=www.notion.so; Path=/; Expires=Tue, 28 Feb 2023 11:58:47 GMT; Secure",
|
||||
"Set-Cookie",
|
||||
"__cf_bm=cwWAubzSJCT1wYgrzxM1q.SqOSvuofy9GfmFsOA2gLc-1677499127-0-AegyUwVahKvgc2gyTcp71mVVrVZqv6QGBz1sjO8pGkrWTDiNjVfBddTR0woRBH4Xew/jAiiYdlZhArh/NJuiBvA=; path=/; expires=Mon, 27-Feb-23 12:28:47 GMT; domain=.notion.com; HttpOnly; Secure; SameSite=None",
|
||||
"Server",
|
||||
"cloudflare"
|
||||
],
|
||||
"responseIsBinary": false
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user