mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-03 20:06:08 +01:00 
			
		
		
		
	Compare commits
	
		
			781 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d243880099 | ||
| 
						 | 
					2e23c521c3 | ||
| 
						 | 
					eb761b286f | ||
| 
						 | 
					d0f6ff5f98 | ||
| 
						 | 
					84feaabc52 | ||
| 
						 | 
					a6036859b8 | ||
| 
						 | 
					93dcce2217 | ||
| 
						 | 
					686af0c6a1 | ||
| 
						 | 
					d07f02b95f | ||
| 
						 | 
					ad74952194 | ||
| 
						 | 
					10f3df3ed4 | ||
| 
						 | 
					18e2e6779b | ||
| 
						 | 
					ed129c307b | ||
| 
						 | 
					8742e4bfe9 | ||
| 
						 | 
					722299dd26 | ||
| 
						 | 
					e2b1421bf3 | ||
| 
						 | 
					1f41d39bc7 | ||
| 
						 | 
					ce39d3b4ce | ||
| 
						 | 
					ef2ade849b | ||
| 
						 | 
					88067c071c | ||
| 
						 | 
					f5018e9820 | ||
| 
						 | 
					1561f402f0 | ||
| 
						 | 
					0d7889d212 | ||
| 
						 | 
					19a10e59e9 | ||
| 
						 | 
					746abb02d3 | ||
| 
						 | 
					23351298c8 | ||
| 
						 | 
					426a8f75aa | ||
| 
						 | 
					999cf0d9e3 | ||
| 
						 | 
					0afc41060a | ||
| 
						 | 
					6e2d76c2b4 | ||
| 
						 | 
					3abf74a9f3 | ||
| 
						 | 
					5d52498da1 | ||
| 
						 | 
					cf068211ff | ||
| 
						 | 
					0507c46ae9 | ||
| 
						 | 
					69ed3644f9 | ||
| 
						 | 
					b0c5894691 | ||
| 
						 | 
					f10fc7bd7f | ||
| 
						 | 
					bdbaacaac9 | ||
| 
						 | 
					2790f52e36 | ||
| 
						 | 
					6515dd7b23 | ||
| 
						 | 
					5a38bf78e1 | ||
| 
						 | 
					4bdb40904f | ||
| 
						 | 
					e7d98206f9 | ||
| 
						 | 
					1939375161 | ||
| 
						 | 
					ec737d02b2 | ||
| 
						 | 
					927e5ede0c | ||
| 
						 | 
					3470347523 | ||
| 
						 | 
					e25c86e947 | ||
| 
						 | 
					fb1478f2dd | ||
| 
						 | 
					c8d6f20c3b | ||
| 
						 | 
					5af1c7756c | ||
| 
						 | 
					38e6008aa2 | ||
| 
						 | 
					9a587e8c8c | ||
| 
						 | 
					30bd216500 | ||
| 
						 | 
					a3ce5b5d28 | ||
| 
						 | 
					b17848609b | ||
| 
						 | 
					e9ece21d20 | ||
| 
						 | 
					b700f069fe | ||
| 
						 | 
					40fb6aa168 | ||
| 
						 | 
					341480e7cf | ||
| 
						 | 
					bde311fd76 | ||
| 
						 | 
					f8bc03feaf | ||
| 
						 | 
					7fc1eb5262 | ||
| 
						 | 
					531e9d4aff | ||
| 
						 | 
					e0d4766c2d | ||
| 
						 | 
					ab4e83771c | ||
| 
						 | 
					803b6df40c | ||
| 
						 | 
					1ebdb0f5e1 | ||
| 
						 | 
					df5951ce46 | ||
| 
						 | 
					809ffa0c6e | ||
| 
						 | 
					6dd466ddaf | ||
| 
						 | 
					a45b801a84 | ||
| 
						 | 
					f8ade4d0c5 | ||
| 
						 | 
					889cb1d7b1 | ||
| 
						 | 
					d3a477b8f2 | ||
| 
						 | 
					4db042736c | ||
| 
						 | 
					612e4406b5 | ||
| 
						 | 
					76f874ef6d | ||
| 
						 | 
					f37f47ce5b | ||
| 
						 | 
					45ed436426 | ||
| 
						 | 
					9314cf87c5 | ||
| 
						 | 
					0efc42081d | ||
| 
						 | 
					7d80fe19e0 | ||
| 
						 | 
					de8c351e25 | ||
| 
						 | 
					695c9d5cf3 | ||
| 
						 | 
					8690228d98 | ||
| 
						 | 
					01093d05d7 | ||
| 
						 | 
					690caf7da1 | ||
| 
						 | 
					a9b63111ae | ||
| 
						 | 
					eb0a68d0ab | ||
| 
						 | 
					48e98b2ac3 | ||
| 
						 | 
					ed1a731950 | ||
| 
						 | 
					4660c154e9 | ||
| 
						 | 
					ef974ab1f5 | ||
| 
						 | 
					bacae67374 | ||
| 
						 | 
					cc20d17bd2 | ||
| 
						 | 
					494b240015 | ||
| 
						 | 
					1cd391a132 | ||
| 
						 | 
					1c15527d95 | ||
| 
						 | 
					7af79ec33b | ||
| 
						 | 
					4294c043d8 | ||
| 
						 | 
					e5b925abf8 | ||
| 
						 | 
					90c0a4a437 | ||
| 
						 | 
					692f7868bc | ||
| 
						 | 
					5282af55f6 | ||
| 
						 | 
					aefc4c6bd2 | ||
| 
						 | 
					b39ba76505 | ||
| 
						 | 
					9d918e7a54 | ||
| 
						 | 
					4773f9392b | ||
| 
						 | 
					5c10fc26be | ||
| 
						 | 
					38db7f9db7 | ||
| 
						 | 
					5163e50e7d | ||
| 
						 | 
					5115b33446 | ||
| 
						 | 
					b01fe5ead9 | ||
| 
						 | 
					b1d4a258a1 | ||
| 
						 | 
					ca041bb658 | ||
| 
						 | 
					52244ddc99 | ||
| 
						 | 
					87a60e325f | ||
| 
						 | 
					0a172d8bc1 | ||
| 
						 | 
					67a12d3c4d | ||
| 
						 | 
					5b2ba3646d | ||
| 
						 | 
					148bff9f77 | ||
| 
						 | 
					2132cf3bdc | ||
| 
						 | 
					d5271c17e3 | ||
| 
						 | 
					b764761e58 | ||
| 
						 | 
					c666fc3b98 | ||
| 
						 | 
					ba34df2e15 | ||
| 
						 | 
					840ac2d63e | ||
| 
						 | 
					5dd4586ebe | ||
| 
						 | 
					bd7fa16e96 | ||
| 
						 | 
					846ac9305e | ||
| 
						 | 
					db8014c0ef | ||
| 
						 | 
					a3540772dd | ||
| 
						 | 
					137703ada4 | ||
| 
						 | 
					ec6b8476f9 | ||
| 
						 | 
					d09d3f5a96 | ||
| 
						 | 
					3d15aeae58 | ||
| 
						 | 
					9765892d18 | ||
| 
						 | 
					00f5924251 | ||
| 
						 | 
					99d0f22403 | ||
| 
						 | 
					78f8a37587 | ||
| 
						 | 
					86d62866f2 | ||
| 
						 | 
					1dc3fafcbf | ||
| 
						 | 
					7f06952d9e | ||
| 
						 | 
					78b6614eea | ||
| 
						 | 
					9665e872c2 | ||
| 
						 | 
					9db0a062ed | ||
| 
						 | 
					055bb39e4d | ||
| 
						 | 
					1261a06a30 | ||
| 
						 | 
					91eb3c45d5 | ||
| 
						 | 
					3944235592 | ||
| 
						 | 
					5be61e6142 | ||
| 
						 | 
					62ccf798ee | ||
| 
						 | 
					d259931bd2 | ||
| 
						 | 
					7729aad1e9 | ||
| 
						 | 
					70d6bd0157 | ||
| 
						 | 
					e5555beea9 | ||
| 
						 | 
					9767b6269a | ||
| 
						 | 
					7e486fda06 | ||
| 
						 | 
					9f726304aa | ||
| 
						 | 
					614cc4dd82 | ||
| 
						 | 
					3e8f09d306 | ||
| 
						 | 
					613b83e638 | ||
| 
						 | 
					4ac609ff57 | ||
| 
						 | 
					c14ce2c428 | ||
| 
						 | 
					984bd726e9 | ||
| 
						 | 
					964abf390b | ||
| 
						 | 
					af24758ad4 | ||
| 
						 | 
					528d94a8fb | ||
| 
						 | 
					be918628c3 | ||
| 
						 | 
					602b9ae64a | ||
| 
						 | 
					602a166e36 | ||
| 
						 | 
					2e69cc8331 | ||
| 
						 | 
					aaad858395 | ||
| 
						 | 
					b266c327e4 | ||
| 
						 | 
					149462e3ab | ||
| 
						 | 
					237d309406 | ||
| 
						 | 
					48248224f8 | ||
| 
						 | 
					79e5e3b65f | ||
| 
						 | 
					d0383f3044 | ||
| 
						 | 
					62ecd1ad76 | ||
| 
						 | 
					75b7706c2c | ||
| 
						 | 
					584b176643 | ||
| 
						 | 
					a16555bbff | ||
| 
						 | 
					a749e24147 | ||
| 
						 | 
					bb81f110dd | ||
| 
						 | 
					5dd6f49104 | ||
| 
						 | 
					bc6be44b19 | ||
| 
						 | 
					8075265753 | ||
| 
						 | 
					9d69024758 | ||
| 
						 | 
					40ca949890 | ||
| 
						 | 
					035113db4d | ||
| 
						 | 
					4a67f63abd | ||
| 
						 | 
					d9666210f1 | ||
| 
						 | 
					925bba134e | ||
| 
						 | 
					d46801ff1f | ||
| 
						 | 
					7848c7e319 | ||
| 
						 | 
					65e53741e7 | ||
| 
						 | 
					a83e8ff91a | ||
| 
						 | 
					542e2579df | ||
| 
						 | 
					81d64e020e | ||
| 
						 | 
					9413cd2296 | ||
| 
						 | 
					5b85713bf3 | ||
| 
						 | 
					15254e2dfc | ||
| 
						 | 
					5f6d562bf8 | ||
| 
						 | 
					f37dc66074 | ||
| 
						 | 
					c881b39860 | ||
| 
						 | 
					0b84524807 | ||
| 
						 | 
					5218f7b7a6 | ||
| 
						 | 
					8062bb7e2a | ||
| 
						 | 
					806062c8d1 | ||
| 
						 | 
					83f19c0537 | ||
| 
						 | 
					0424728012 | ||
| 
						 | 
					3a83d58b25 | ||
| 
						 | 
					6fa9d996e8 | ||
| 
						 | 
					1ea3d238e0 | ||
| 
						 | 
					eb273b7dbb | ||
| 
						 | 
					55374ac4d9 | ||
| 
						 | 
					8070c00b5f | ||
| 
						 | 
					da8025f1e4 | ||
| 
						 | 
					d2263c68f8 | ||
| 
						 | 
					92e43bc051 | ||
| 
						 | 
					40971afe4f | ||
| 
						 | 
					90fc4b8293 | ||
| 
						 | 
					97d8b19868 | ||
| 
						 | 
					2bc7da91a6 | ||
| 
						 | 
					2b4cbb5f6b | ||
| 
						 | 
					72b2a6ecb6 | ||
| 
						 | 
					7b662b04ff | ||
| 
						 | 
					f8e4a665bd | ||
| 
						 | 
					f9a27dd90c | ||
| 
						 | 
					641985737f | ||
| 
						 | 
					121e4ba2ea | ||
| 
						 | 
					01474ecd2d | ||
| 
						 | 
					82e4e28e7b | ||
| 
						 | 
					06eb522a8c | ||
| 
						 | 
					21098be307 | ||
| 
						 | 
					886ee0dbcb | ||
| 
						 | 
					6f7fbacca1 | ||
| 
						 | 
					f5ddabc042 | ||
| 
						 | 
					8da5b90aea | ||
| 
						 | 
					23848526c0 | ||
| 
						 | 
					e7d57bc08f | ||
| 
						 | 
					041758766a | ||
| 
						 | 
					69980c798b | ||
| 
						 | 
					4de6a803e9 | ||
| 
						 | 
					748c5064b5 | ||
| 
						 | 
					c6e8966ecd | ||
| 
						 | 
					8c247ba7c6 | ||
| 
						 | 
					52b5711ecd | ||
| 
						 | 
					58fe3a62af | ||
| 
						 | 
					af4d0c3ba6 | ||
| 
						 | 
					4bba0aa842 | ||
| 
						 | 
					ae9af8ea23 | ||
| 
						 | 
					eea29aba0e | ||
| 
						 | 
					abbd0b50eb | ||
| 
						 | 
					739ab28763 | ||
| 
						 | 
					c551eae651 | ||
| 
						 | 
					d5aea26960 | ||
| 
						 | 
					d3730ac1a9 | ||
| 
						 | 
					f2a510e4c5 | ||
| 
						 | 
					4717242dc7 | ||
| 
						 | 
					b5ef09e779 | ||
| 
						 | 
					d706b3a447 | ||
| 
						 | 
					6c96cca3a5 | ||
| 
						 | 
					c1865f8564 | ||
| 
						 | 
					515c5411a6 | ||
| 
						 | 
					3f7a5504c7 | ||
| 
						 | 
					8c7c37cf98 | ||
| 
						 | 
					d93e00adce | ||
| 
						 | 
					0e16e48db6 | ||
| 
						 | 
					c0f48c0e99 | ||
| 
						 | 
					abedf2bba4 | ||
| 
						 | 
					bb0137b2fd | ||
| 
						 | 
					6c54c7d17d | ||
| 
						 | 
					cd95adcecb | ||
| 
						 | 
					90255ac55b | ||
| 
						 | 
					e741c2826c | ||
| 
						 | 
					026992db78 | ||
| 
						 | 
					33780c1e17 | ||
| 
						 | 
					ede9c43f67 | ||
| 
						 | 
					5c12ac4eee | ||
| 
						 | 
					522518cf0d | ||
| 
						 | 
					1d869d25c2 | ||
| 
						 | 
					a9cdd93cb4 | ||
| 
						 | 
					4240da349d | ||
| 
						 | 
					c257bc07a8 | ||
| 
						 | 
					00eaa16985 | ||
| 
						 | 
					fefb059564 | ||
| 
						 | 
					9166765ced | ||
| 
						 | 
					6ae7661603 | ||
| 
						 | 
					30e75056bd | ||
| 
						 | 
					530e56dcb5 | ||
| 
						 | 
					63675bfbae | ||
| 
						 | 
					696ce38083 | ||
| 
						 | 
					12014b9f4d | ||
| 
						 | 
					e8b52f9e6c | ||
| 
						 | 
					04b125afc0 | ||
| 
						 | 
					2a7fe85020 | ||
| 
						 | 
					119050e355 | ||
| 
						 | 
					72122d0f95 | ||
| 
						 | 
					bd22863bb7 | ||
| 
						 | 
					ce3834eb9e | ||
| 
						 | 
					8edb5428e5 | ||
| 
						 | 
					527718eff7 | ||
| 
						 | 
					5b0f487f3f | ||
| 
						 | 
					a3fa8341ba | ||
| 
						 | 
					04813743e2 | ||
| 
						 | 
					ddf75cd5e5 | ||
| 
						 | 
					d0e5ad5b7e | ||
| 
						 | 
					b4631e927c | ||
| 
						 | 
					b7bc843a37 | ||
| 
						 | 
					98d65f8767 | ||
| 
						 | 
					0599891ec0 | ||
| 
						 | 
					cc06701565 | ||
| 
						 | 
					40683985cd | ||
| 
						 | 
					074e13a889 | ||
| 
						 | 
					98b0baefe2 | ||
| 
						 | 
					3aad0ebc95 | ||
| 
						 | 
					479d720a6e | ||
| 
						 | 
					e4892c9888 | ||
| 
						 | 
					f8c9178c5d | ||
| 
						 | 
					83049c95c3 | ||
| 
						 | 
					bc8f531b33 | ||
| 
						 | 
					23278f54cb | ||
| 
						 | 
					18801fb3e1 | ||
| 
						 | 
					dc0a0dcf09 | ||
| 
						 | 
					04c306b360 | ||
| 
						 | 
					d6a4f1db13 | ||
| 
						 | 
					84c4b368c8 | ||
| 
						 | 
					4307f25205 | ||
| 
						 | 
					48f03f7a1b | ||
| 
						 | 
					9d24499fef | ||
| 
						 | 
					df97b269a7 | ||
| 
						 | 
					ee6fb98a0d | ||
| 
						 | 
					13e30e5855 | ||
| 
						 | 
					5ab2ec0f13 | ||
| 
						 | 
					8465d7fa68 | ||
| 
						 | 
					d153fc7ba5 | ||
| 
						 | 
					1a7c2d4c32 | ||
| 
						 | 
					b3381a3b53 | ||
| 
						 | 
					ac0d61e9b4 | ||
| 
						 | 
					b13a6ced19 | ||
| 
						 | 
					b61aab06b5 | ||
| 
						 | 
					64b86b2666 | ||
| 
						 | 
					27e6fa9526 | ||
| 
						 | 
					3d31742285 | ||
| 
						 | 
					2b2f4fbc07 | ||
| 
						 | 
					513bf252cd | ||
| 
						 | 
					f591e954f3 | ||
| 
						 | 
					59de1925a9 | ||
| 
						 | 
					6c1011341c | ||
| 
						 | 
					906082a6b2 | ||
| 
						 | 
					30bcd1764a | ||
| 
						 | 
					cea54aecad | ||
| 
						 | 
					ff6f2a4d44 | ||
| 
						 | 
					5f6fded833 | ||
| 
						 | 
					fed5f1a7d2 | ||
| 
						 | 
					a06ee1ced1 | ||
| 
						 | 
					332b92791e | ||
| 
						 | 
					d4a9461460 | ||
| 
						 | 
					2dac6ab281 | ||
| 
						 | 
					4d00404f55 | ||
| 
						 | 
					3adab07ddb | ||
| 
						 | 
					3d0c3652ce | ||
| 
						 | 
					c3f5bb5518 | ||
| 
						 | 
					b2d460d5c1 | ||
| 
						 | 
					d475346a09 | ||
| 
						 | 
					ca41806bc2 | ||
| 
						 | 
					a748710b01 | ||
| 
						 | 
					ac9a4b3afc | ||
| 
						 | 
					b7f0fd2db3 | ||
| 
						 | 
					7d6c847d47 | ||
| 
						 | 
					6ec6d66f17 | ||
| 
						 | 
					977089cc28 | ||
| 
						 | 
					c3f8975166 | ||
| 
						 | 
					639f80b603 | ||
| 
						 | 
					927da84d3b | ||
| 
						 | 
					b8c9943deb | ||
| 
						 | 
					bb6ab0fe45 | ||
| 
						 | 
					0c86dece5f | ||
| 
						 | 
					b7b0bd80ed | ||
| 
						 | 
					f06207207b | ||
| 
						 | 
					068684101f | ||
| 
						 | 
					f78d96a3d4 | ||
| 
						 | 
					a0d958bf12 | ||
| 
						 | 
					0802b81807 | ||
| 
						 | 
					192e399cb5 | ||
| 
						 | 
					fc564f6aed | ||
| 
						 | 
					eb34f9c64f | ||
| 
						 | 
					48029cea7c | ||
| 
						 | 
					f4ec4e58c7 | ||
| 
						 | 
					faa402fcda | ||
| 
						 | 
					788841d256 | ||
| 
						 | 
					b7c37fdf58 | ||
| 
						 | 
					a46c5a2243 | ||
| 
						 | 
					430f2975f8 | ||
| 
						 | 
					dd8226ff4c | ||
| 
						 | 
					807b442c7a | ||
| 
						 | 
					a452e4add5 | ||
| 
						 | 
					48b30b985e | ||
| 
						 | 
					05d2f4fe96 | ||
| 
						 | 
					85a75fc186 | ||
| 
						 | 
					ddda4d9867 | ||
| 
						 | 
					42c8059ae1 | ||
| 
						 | 
					0f4eb8ff4c | ||
| 
						 | 
					8ee537e2eb | ||
| 
						 | 
					8eb091445b | ||
| 
						 | 
					1fc23c948e | ||
| 
						 | 
					cb2b97635a | ||
| 
						 | 
					8fb42e4517 | ||
| 
						 | 
					edae1a5d1c | ||
| 
						 | 
					08398a1417 | ||
| 
						 | 
					712304bbc6 | ||
| 
						 | 
					afb893c157 | ||
| 
						 | 
					ebccd48013 | ||
| 
						 | 
					54065672aa | ||
| 
						 | 
					8394ce8002 | ||
| 
						 | 
					176784834f | ||
| 
						 | 
					a47004bb4e | ||
| 
						 | 
					995f1c9fc4 | ||
| 
						 | 
					1f3b6feaff | ||
| 
						 | 
					8095c77b91 | ||
| 
						 | 
					6cfd18b29b | ||
| 
						 | 
					defd997424 | ||
| 
						 | 
					5905950c17 | ||
| 
						 | 
					691fccb769 | ||
| 
						 | 
					bbe3f436d3 | ||
| 
						 | 
					af053b61fc | ||
| 
						 | 
					e22f77eae7 | ||
| 
						 | 
					3223e76787 | ||
| 
						 | 
					74400dad97 | ||
| 
						 | 
					1b68adf3e4 | ||
| 
						 | 
					a2cd6f92d7 | ||
| 
						 | 
					3ff5fe61b2 | ||
| 
						 | 
					75c6afd1c3 | ||
| 
						 | 
					8d2958738f | ||
| 
						 | 
					0496412f4a | ||
| 
						 | 
					f80a20d18c | ||
| 
						 | 
					34c642a49a | ||
| 
						 | 
					2ebbc33081 | ||
| 
						 | 
					ac56056f65 | ||
| 
						 | 
					6f16b4caec | ||
| 
						 | 
					bea39f37ee | ||
| 
						 | 
					6548149107 | ||
| 
						 | 
					fbc805a221 | ||
| 
						 | 
					6015a067ec | ||
| 
						 | 
					4a1ecd906b | ||
| 
						 | 
					41844cf817 | ||
| 
						 | 
					004cfe1965 | ||
| 
						 | 
					b97ebe9f03 | ||
| 
						 | 
					08ec866dd2 | ||
| 
						 | 
					2bdd538d7d | ||
| 
						 | 
					6e69cafe54 | ||
| 
						 | 
					38839532d5 | ||
| 
						 | 
					0234ff5fca | ||
| 
						 | 
					44bcfd47c0 | ||
| 
						 | 
					69c7eb14aa | ||
| 
						 | 
					00453fc151 | ||
| 
						 | 
					5c393f959d | ||
| 
						 | 
					e6bf6424e8 | ||
| 
						 | 
					57702a07a2 | ||
| 
						 | 
					3b3f6082a7 | ||
| 
						 | 
					49241ab318 | ||
| 
						 | 
					93addac8bb | ||
| 
						 | 
					fe908759d1 | ||
| 
						 | 
					779751a234 | ||
| 
						 | 
					cb9feab7b2 | ||
| 
						 | 
					b79631a35d | ||
| 
						 | 
					c177aaa901 | ||
| 
						 | 
					eff3e1df85 | ||
| 
						 | 
					b46d5f4a71 | ||
| 
						 | 
					5b421d51b5 | ||
| 
						 | 
					8852e8e531 | ||
| 
						 | 
					8bc84cfaf6 | ||
| 
						 | 
					cde13dc580 | ||
| 
						 | 
					282d135f0f | ||
| 
						 | 
					3e3d7aa4d7 | ||
| 
						 | 
					446c41d020 | ||
| 
						 | 
					33fdad5159 | ||
| 
						 | 
					463d145cb7 | ||
| 
						 | 
					1413756d00 | ||
| 
						 | 
					d3bf325f19 | ||
| 
						 | 
					c4f69fd9cb | ||
| 
						 | 
					50ec17433d | ||
| 
						 | 
					2c8eb82d42 | ||
| 
						 | 
					af67cf64b1 | ||
| 
						 | 
					095da691a4 | ||
| 
						 | 
					7e71029d1c | ||
| 
						 | 
					045ee18237 | ||
| 
						 | 
					e47c3a27b0 | ||
| 
						 | 
					ced99f8ac8 | ||
| 
						 | 
					0c4492bcd0 | ||
| 
						 | 
					d9359c7c55 | ||
| 
						 | 
					86a080e7ec | ||
| 
						 | 
					0a66809bf0 | ||
| 
						 | 
					ecfdde2f2a | ||
| 
						 | 
					758dba9ba5 | ||
| 
						 | 
					ae42e0efc7 | ||
| 
						 | 
					b5cfc28912 | ||
| 
						 | 
					c802bf7d8b | ||
| 
						 | 
					9e5a02094c | ||
| 
						 | 
					58253567cd | ||
| 
						 | 
					92d5aeae41 | ||
| 
						 | 
					d2d286a4ff | ||
| 
						 | 
					a6ade790c6 | ||
| 
						 | 
					a9dae7823f | ||
| 
						 | 
					86861f6ec3 | ||
| 
						 | 
					d26a0fae17 | ||
| 
						 | 
					375dba3264 | ||
| 
						 | 
					74044754e2 | ||
| 
						 | 
					64aed9b462 | ||
| 
						 | 
					5428cafa50 | ||
| 
						 | 
					735852b3c1 | ||
| 
						 | 
					f4b5d43899 | ||
| 
						 | 
					235b779dec | ||
| 
						 | 
					2a39906993 | ||
| 
						 | 
					e1b67e20ec | ||
| 
						 | 
					df17840dbc | ||
| 
						 | 
					9d52f80c2f | ||
| 
						 | 
					0aa119af2c | ||
| 
						 | 
					c2f70031d0 | ||
| 
						 | 
					1a2beb941e | ||
| 
						 | 
					01b2887b36 | ||
| 
						 | 
					5286d4a97c | ||
| 
						 | 
					bf6106f4dc | ||
| 
						 | 
					82efc92413 | ||
| 
						 | 
					34481df2e7 | ||
| 
						 | 
					ad4631018a | ||
| 
						 | 
					ef89eede17 | ||
| 
						 | 
					6878877acd | ||
| 
						 | 
					611a983461 | ||
| 
						 | 
					8e913cb453 | ||
| 
						 | 
					9d49264258 | ||
| 
						 | 
					6098d62dcc | ||
| 
						 | 
					580ceec6b3 | ||
| 
						 | 
					79dca12274 | ||
| 
						 | 
					66c25e7f29 | ||
| 
						 | 
					dc4983a013 | ||
| 
						 | 
					039959a48b | ||
| 
						 | 
					63be25f5bb | ||
| 
						 | 
					ce7489049f | ||
| 
						 | 
					b3d5938665 | ||
| 
						 | 
					579ed7e194 | ||
| 
						 | 
					e20fac19ba | ||
| 
						 | 
					9e9fb2979f | ||
| 
						 | 
					7fc2824325 | ||
| 
						 | 
					0728f540ab | ||
| 
						 | 
					4913a5a5fa | ||
| 
						 | 
					14dd2b8827 | ||
| 
						 | 
					4e9e7eba48 | ||
| 
						 | 
					f3bc604516 | ||
| 
						 | 
					bd278e291a | ||
| 
						 | 
					074820dae5 | ||
| 
						 | 
					1089e84f56 | ||
| 
						 | 
					ed3d81ce62 | ||
| 
						 | 
					57aa0a0fe1 | ||
| 
						 | 
					88a961180f | ||
| 
						 | 
					1f8798d7ac | ||
| 
						 | 
					bd8429a0ba | ||
| 
						 | 
					af95d387b9 | ||
| 
						 | 
					da348075e8 | ||
| 
						 | 
					d24d3af87d | ||
| 
						 | 
					085c0e76ca | ||
| 
						 | 
					d7d98b29a7 | ||
| 
						 | 
					cb3b03537c | ||
| 
						 | 
					7c7bea5e3a | ||
| 
						 | 
					9fc474504b | ||
| 
						 | 
					412fd105c9 | ||
| 
						 | 
					470a0c7b21 | ||
| 
						 | 
					9968cba348 | ||
| 
						 | 
					aee520a209 | ||
| 
						 | 
					cf4201b084 | ||
| 
						 | 
					76196ed42c | ||
| 
						 | 
					6089a369e3 | ||
| 
						 | 
					092db03729 | ||
| 
						 | 
					239c14a5df | ||
| 
						 | 
					8a6002c6be | ||
| 
						 | 
					38781d33ac | ||
| 
						 | 
					0518cdbe8e | ||
| 
						 | 
					4849dacd52 | ||
| 
						 | 
					7cf47520d4 | ||
| 
						 | 
					8eb0a4e1cb | ||
| 
						 | 
					ad2a7a2da3 | ||
| 
						 | 
					6a9aa5eeda | ||
| 
						 | 
					04524ae8e4 | ||
| 
						 | 
					04caba9f5b | ||
| 
						 | 
					cc1f831a6a | ||
| 
						 | 
					331d280075 | ||
| 
						 | 
					46ed61d38a | ||
| 
						 | 
					ff5d3a5f0c | ||
| 
						 | 
					626af84f42 | ||
| 
						 | 
					b05ce12e7b | ||
| 
						 | 
					274505188b | ||
| 
						 | 
					f85209a72f | ||
| 
						 | 
					291f0e79d9 | ||
| 
						 | 
					64db5e2542 | ||
| 
						 | 
					c4a2ff5fa1 | ||
| 
						 | 
					9f5f0aeddd | ||
| 
						 | 
					4d5612e845 | ||
| 
						 | 
					371f174756 | ||
| 
						 | 
					5676ff9b2e | ||
| 
						 | 
					aa8c0fdad8 | ||
| 
						 | 
					8284c673f9 | ||
| 
						 | 
					cc02546ed3 | ||
| 
						 | 
					d09132dd60 | ||
| 
						 | 
					ec662d01d0 | ||
| 
						 | 
					ad0b98e2a1 | ||
| 
						 | 
					3cafad3bf4 | ||
| 
						 | 
					fbea3ed94f | ||
| 
						 | 
					0ab18e3069 | ||
| 
						 | 
					2aa987c072 | ||
| 
						 | 
					a06ddc439d | ||
| 
						 | 
					f6944b8219 | ||
| 
						 | 
					fa3cbb4645 | ||
| 
						 | 
					6dfc72c065 | ||
| 
						 | 
					0af6f91d21 | ||
| 
						 | 
					4aeecfdfa9 | ||
| 
						 | 
					79d4dcf5f1 | ||
| 
						 | 
					26a6ef8c03 | ||
| 
						 | 
					5e1f81e53e | ||
| 
						 | 
					9cdcbb3125 | ||
| 
						 | 
					35338e9ec6 | ||
| 
						 | 
					78d83b8826 | ||
| 
						 | 
					8edf06d28d | ||
| 
						 | 
					ecd2a5cbac | ||
| 
						 | 
					c0cf319521 | ||
| 
						 | 
					bb9631476e | ||
| 
						 | 
					386e8dd32e | ||
| 
						 | 
					61616f708f | ||
| 
						 | 
					8ce499e958 | ||
| 
						 | 
					22587ee6b5 | ||
| 
						 | 
					9b32d86f78 | ||
| 
						 | 
					5ea8226996 | ||
| 
						 | 
					fbffc6b2b5 | ||
| 
						 | 
					cd01886eb2 | ||
| 
						 | 
					bb8fd2b054 | ||
| 
						 | 
					d8bc9c2982 | ||
| 
						 | 
					d232694dec | ||
| 
						 | 
					735ac55bb8 | ||
| 
						 | 
					c9aab9b479 | ||
| 
						 | 
					53c87f3d25 | ||
| 
						 | 
					4f1fafdf75 | ||
| 
						 | 
					330e7ac08e | ||
| 
						 | 
					49fb913eab | ||
| 
						 | 
					4b074365e7 | ||
| 
						 | 
					0896000fcd | ||
| 
						 | 
					e007aba067 | ||
| 
						 | 
					a6eda2479f | ||
| 
						 | 
					eff567ee48 | ||
| 
						 | 
					d3c2c314ac | ||
| 
						 | 
					89681977b5 | ||
| 
						 | 
					e10a7ea9a6 | ||
| 
						 | 
					c3c6d73bb2 | ||
| 
						 | 
					5e2efca933 | ||
| 
						 | 
					e71b0d82a1 | ||
| 
						 | 
					c6c162cdda | ||
| 
						 | 
					8b46d6c718 | ||
| 
						 | 
					e24d5a6f83 | ||
| 
						 | 
					e28fbf4617 | ||
| 
						 | 
					0e4a040ed8 | ||
| 
						 | 
					b84670d503 | ||
| 
						 | 
					8725f7cfb2 | ||
| 
						 | 
					af9ef83742 | ||
| 
						 | 
					3eafdadd1f | ||
| 
						 | 
					447b8f0f0c | ||
| 
						 | 
					aaf6e3bace | ||
| 
						 | 
					44c61b8e7d | ||
| 
						 | 
					d3b17f586d | ||
| 
						 | 
					a556ba0959 | ||
| 
						 | 
					ad40cd72ff | ||
| 
						 | 
					9a22c3fce7 | ||
| 
						 | 
					63e044ffdf | ||
| 
						 | 
					2e794ee38f | ||
| 
						 | 
					a1d4e062ed | ||
| 
						 | 
					d2d2a28885 | ||
| 
						 | 
					ead4242735 | ||
| 
						 | 
					30a8c6b579 | ||
| 
						 | 
					25df8f9c52 | ||
| 
						 | 
					65d2389b2e | ||
| 
						 | 
					7aa26580ba | ||
| 
						 | 
					f01657e1dd | ||
| 
						 | 
					0c08126752 | ||
| 
						 | 
					ea64adc2f9 | ||
| 
						 | 
					ad8ec68443 | ||
| 
						 | 
					5e5fe2ccf3 | ||
| 
						 | 
					34ecd77bd4 | ||
| 
						 | 
					6cf0fe0b73 | ||
| 
						 | 
					3f8bf7cacc | ||
| 
						 | 
					17128c5874 | ||
| 
						 | 
					9e71c44c76 | ||
| 
						 | 
					54c0268593 | ||
| 
						 | 
					a5f0b2a81e | ||
| 
						 | 
					a154bea016 | ||
| 
						 | 
					2a34c8fa66 | ||
| 
						 | 
					15a11daf38 | ||
| 
						 | 
					5e88e24693 | ||
| 
						 | 
					988c5c6a25 | ||
| 
						 | 
					d98c46a275 | ||
| 
						 | 
					185b206627 | ||
| 
						 | 
					cfb04f7d8a | ||
| 
						 | 
					dba0c9f373 | ||
| 
						 | 
					ee60652746 | ||
| 
						 | 
					fbc79eae62 | ||
| 
						 | 
					b356a634d1 | ||
| 
						 | 
					b2ed5a01b3 | ||
| 
						 | 
					745e120a0b | ||
| 
						 | 
					a0ac603260 | ||
| 
						 | 
					181ddce887 | ||
| 
						 | 
					50043f889b | ||
| 
						 | 
					49d1c5140e | ||
| 
						 | 
					ab7a07a318 | ||
| 
						 | 
					306e7abb47 | ||
| 
						 | 
					cec4dfa6c3 | ||
| 
						 | 
					21813a7b83 | ||
| 
						 | 
					8695228537 | ||
| 
						 | 
					e871edc8f3 | ||
| 
						 | 
					517f1992a1 | ||
| 
						 | 
					e6adf3a522 | ||
| 
						 | 
					6612a3a550 | ||
| 
						 | 
					5d6d9ab6d6 | ||
| 
						 | 
					2bc78ccafb | ||
| 
						 | 
					53aebf1448 | ||
| 
						 | 
					2e9ce962df | ||
| 
						 | 
					fa406d3ded | ||
| 
						 | 
					93ad83d2ae | ||
| 
						 | 
					d354c91d7c | ||
| 
						 | 
					2d7b5e4aa2 | ||
| 
						 | 
					b542a28673 | ||
| 
						 | 
					3192531d4c | ||
| 
						 | 
					351bb760ae | ||
| 
						 | 
					79a6baca6f | ||
| 
						 | 
					f9645e8971 | ||
| 
						 | 
					7611c83148 | ||
| 
						 | 
					53b4f0e0d5 | ||
| 
						 | 
					9a645c24ca | ||
| 
						 | 
					682d821b67 | ||
| 
						 | 
					71afffaac1 | ||
| 
						 | 
					cf904a874e | ||
| 
						 | 
					5a32a7ce18 | ||
| 
						 | 
					6d6221636c | ||
| 
						 | 
					8a4caaf6fb | ||
| 
						 | 
					fa6d1879dd | ||
| 
						 | 
					874b6c71a3 | ||
| 
						 | 
					9be524ef89 | ||
| 
						 | 
					fd8a2d4d92 | ||
| 
						 | 
					0b270ee87a | ||
| 
						 | 
					5cc5859211 | ||
| 
						 | 
					bd489d5780 | ||
| 
						 | 
					56e8506cb9 | ||
| 
						 | 
					c86be990d6 | ||
| 
						 | 
					a24c56a9d5 | ||
| 
						 | 
					95e38a037b | ||
| 
						 | 
					256b800d0e | ||
| 
						 | 
					b3c4c850db | ||
| 
						 | 
					4284116280 | ||
| 
						 | 
					d31b5ac99f | ||
| 
						 | 
					b3f47bb2b6 | ||
| 
						 | 
					e698aa5822 | ||
| 
						 | 
					1fdb23746a | ||
| 
						 | 
					9cd5bdeb53 | ||
| 
						 | 
					e6183b9a1d | ||
| 
						 | 
					d83005fe4d | ||
| 
						 | 
					2b84f1be00 | ||
| 
						 | 
					bb45c67e60 | ||
| 
						 | 
					515fb4e5db | ||
| 
						 | 
					b6efc954bd | ||
| 
						 | 
					eee05a4d01 | ||
| 
						 | 
					dc97400dbf | ||
| 
						 | 
					e16bedfab4 | ||
| 
						 | 
					5a8e216dec | ||
| 
						 | 
					1faf8225c7 | ||
| 
						 | 
					bfbb531863 | ||
| 
						 | 
					48ba73e06d | ||
| 
						 | 
					c922322ed3 | ||
| 
						 | 
					53aaffd0f5 | ||
| 
						 | 
					d3ec9f022c | ||
| 
						 | 
					5225a99995 | ||
| 
						 | 
					929f8ef720 | ||
| 
						 | 
					5820f874fc | ||
| 
						 | 
					a904e82d72 | 
							
								
								
									
										7
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					node_modules
 | 
				
			||||||
 | 
					dist
 | 
				
			||||||
 | 
					bin
 | 
				
			||||||
 | 
					docs
 | 
				
			||||||
 | 
					libraries
 | 
				
			||||||
 | 
					coverage
 | 
				
			||||||
 | 
					play
 | 
				
			||||||
							
								
								
									
										212
									
								
								.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,212 @@
 | 
				
			|||||||
 | 
					module.exports = {
 | 
				
			||||||
 | 
					    env: {
 | 
				
			||||||
 | 
					        browser: true,
 | 
				
			||||||
 | 
					        commonjs: true,
 | 
				
			||||||
 | 
					        es2021: true,
 | 
				
			||||||
 | 
					        node: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    // plugins: ['prettier'], // to be activated
 | 
				
			||||||
 | 
					    extends: ['eslint:recommended', 'airbnb-base', 'plugin:jsonc/recommended-with-jsonc', 'prettier'],
 | 
				
			||||||
 | 
					    overrides: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            files: ['*.json', '*.json5', '*.jsonc'],
 | 
				
			||||||
 | 
					            parser: 'jsonc-eslint-parser',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            files: ['package.json'],
 | 
				
			||||||
 | 
					            parser: 'jsonc-eslint-parser',
 | 
				
			||||||
 | 
					            rules: {
 | 
				
			||||||
 | 
					                'jsonc/sort-keys': [
 | 
				
			||||||
 | 
					                    'off',
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        pathPattern: '^$',
 | 
				
			||||||
 | 
					                        order: [
 | 
				
			||||||
 | 
					                            'name',
 | 
				
			||||||
 | 
					                            'version',
 | 
				
			||||||
 | 
					                            'private',
 | 
				
			||||||
 | 
					                            'packageManager',
 | 
				
			||||||
 | 
					                            'description',
 | 
				
			||||||
 | 
					                            'type',
 | 
				
			||||||
 | 
					                            'keywords',
 | 
				
			||||||
 | 
					                            'homepage',
 | 
				
			||||||
 | 
					                            'bugs',
 | 
				
			||||||
 | 
					                            'license',
 | 
				
			||||||
 | 
					                            'author',
 | 
				
			||||||
 | 
					                            'contributors',
 | 
				
			||||||
 | 
					                            'funding',
 | 
				
			||||||
 | 
					                            'files',
 | 
				
			||||||
 | 
					                            'main',
 | 
				
			||||||
 | 
					                            'module',
 | 
				
			||||||
 | 
					                            'exports',
 | 
				
			||||||
 | 
					                            'unpkg',
 | 
				
			||||||
 | 
					                            'jsdelivr',
 | 
				
			||||||
 | 
					                            'browser',
 | 
				
			||||||
 | 
					                            'bin',
 | 
				
			||||||
 | 
					                            'man',
 | 
				
			||||||
 | 
					                            'directories',
 | 
				
			||||||
 | 
					                            'repository',
 | 
				
			||||||
 | 
					                            'publishConfig',
 | 
				
			||||||
 | 
					                            'scripts',
 | 
				
			||||||
 | 
					                            'peerDependencies',
 | 
				
			||||||
 | 
					                            'peerDependenciesMeta',
 | 
				
			||||||
 | 
					                            'optionalDependencies',
 | 
				
			||||||
 | 
					                            'dependencies',
 | 
				
			||||||
 | 
					                            'devDependencies',
 | 
				
			||||||
 | 
					                            'engines',
 | 
				
			||||||
 | 
					                            'config',
 | 
				
			||||||
 | 
					                            'overrides',
 | 
				
			||||||
 | 
					                            'pnpm',
 | 
				
			||||||
 | 
					                            'husky',
 | 
				
			||||||
 | 
					                            'lint-staged',
 | 
				
			||||||
 | 
					                            'eslintConfig',
 | 
				
			||||||
 | 
					                        ],
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        pathPattern: '^(?:dev|peer|optional|bundled)?[Dd]ependencies$',
 | 
				
			||||||
 | 
					                        order: { type: 'asc' },
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    globals: {
 | 
				
			||||||
 | 
					        $: true,
 | 
				
			||||||
 | 
					        jQuery: true,
 | 
				
			||||||
 | 
					        glob: true,
 | 
				
			||||||
 | 
					        log: true,
 | 
				
			||||||
 | 
					        EditorWatchdog: true,
 | 
				
			||||||
 | 
					        React: true,
 | 
				
			||||||
 | 
					        appState: true,
 | 
				
			||||||
 | 
					        ExcalidrawLib: true,
 | 
				
			||||||
 | 
					        elements: true,
 | 
				
			||||||
 | 
					        files: true,
 | 
				
			||||||
 | 
					        ReactDOM: true,
 | 
				
			||||||
 | 
					        // src\public\app\widgets\type_widgets\relation_map.js
 | 
				
			||||||
 | 
					        jsPlumb: true,
 | 
				
			||||||
 | 
					        panzoom: true,
 | 
				
			||||||
 | 
					        logError: true,
 | 
				
			||||||
 | 
					        // src\public\app\widgets\type_widgets\image.js
 | 
				
			||||||
 | 
					        WZoom: true,
 | 
				
			||||||
 | 
					        // \src\public\app\widgets\type_widgets\read_only_text.js
 | 
				
			||||||
 | 
					        renderMathInElement: true,
 | 
				
			||||||
 | 
					        // \src\public\app\widgets\type_widgets\editable_text.js
 | 
				
			||||||
 | 
					        BalloonEditor: true,
 | 
				
			||||||
 | 
					        FancytreeNode: true,
 | 
				
			||||||
 | 
					        CKEditorInspector: true,
 | 
				
			||||||
 | 
					        // \src\public\app\widgets\type_widgets\editable_code.js
 | 
				
			||||||
 | 
					        CodeMirror: true,
 | 
				
			||||||
 | 
					        // \src\public\app\services\resizer.js
 | 
				
			||||||
 | 
					        Split: true,
 | 
				
			||||||
 | 
					        // \src\public\app\services\content_renderer.js
 | 
				
			||||||
 | 
					        mermaid: true,
 | 
				
			||||||
 | 
					        // src\public\app\services\frontend_script_api.js
 | 
				
			||||||
 | 
					        dayjs: true,
 | 
				
			||||||
 | 
					        // \src\public\app\widgets\note_map.js
 | 
				
			||||||
 | 
					        ForceGraph: true,
 | 
				
			||||||
 | 
					        // \src\public\app\setup.js
 | 
				
			||||||
 | 
					        ko: true,
 | 
				
			||||||
 | 
					        syncInProgress: true,
 | 
				
			||||||
 | 
					        // src\public\app\services\utils.js
 | 
				
			||||||
 | 
					        logInfo: true,
 | 
				
			||||||
 | 
					        __non_webpack_require__: true,
 | 
				
			||||||
 | 
					        describe: true,
 | 
				
			||||||
 | 
					        it: true,
 | 
				
			||||||
 | 
					        expect: true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    parserOptions: {
 | 
				
			||||||
 | 
					        ecmaVersion: 'latest',
 | 
				
			||||||
 | 
					        sourceType: 'module',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    rules: {
 | 
				
			||||||
 | 
					        // eslint:recommended
 | 
				
			||||||
 | 
					        'no-unused-vars': 'off',
 | 
				
			||||||
 | 
					        'linebreak-style': 'off',
 | 
				
			||||||
 | 
					        'no-useless-escape': 'off',
 | 
				
			||||||
 | 
					        'no-empty': 'off',
 | 
				
			||||||
 | 
					        'no-constant-condition': 'off',
 | 
				
			||||||
 | 
					        'getter-return': 'off',
 | 
				
			||||||
 | 
					        'no-cond-assign': 'off',
 | 
				
			||||||
 | 
					        'no-async-promise-executor': 'off',
 | 
				
			||||||
 | 
					        'no-extra-semi': 'off',
 | 
				
			||||||
 | 
					        'no-inner-declarations': 'off',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // prettier
 | 
				
			||||||
 | 
					        'prettier/prettier': ['off', { endOfLine: 'auto' }],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // airbnb-base
 | 
				
			||||||
 | 
					        'no-console': 'off',
 | 
				
			||||||
 | 
					        'no-plusplus': 'off',
 | 
				
			||||||
 | 
					        'no-param-reassign': 'off',
 | 
				
			||||||
 | 
					        'global-require': 'off',
 | 
				
			||||||
 | 
					        'no-use-before-define': 'off',
 | 
				
			||||||
 | 
					        'no-await-in-loop': 'off',
 | 
				
			||||||
 | 
					        radix: 'off',
 | 
				
			||||||
 | 
					        'import/order': 'off',
 | 
				
			||||||
 | 
					        'import/no-extraneous-dependencies': 'off',
 | 
				
			||||||
 | 
					        'prefer-destructuring': 'off',
 | 
				
			||||||
 | 
					        'no-shadow': 'off',
 | 
				
			||||||
 | 
					        'no-new': 'off',
 | 
				
			||||||
 | 
					        'no-restricted-syntax': 'off',
 | 
				
			||||||
 | 
					        strict: 'off',
 | 
				
			||||||
 | 
					        'class-methods-use-this': 'off',
 | 
				
			||||||
 | 
					        'no-else-return': 'off',
 | 
				
			||||||
 | 
					        'import/no-dynamic-require': 'off',
 | 
				
			||||||
 | 
					        'no-underscore-dangle': 'off',
 | 
				
			||||||
 | 
					        'prefer-template': 'off',
 | 
				
			||||||
 | 
					        'consistent-return': 'off',
 | 
				
			||||||
 | 
					        'no-continue': 'off',
 | 
				
			||||||
 | 
					        'object-shorthand': 'off',
 | 
				
			||||||
 | 
					        'one-var': 'off',
 | 
				
			||||||
 | 
					        'prefer-const': 'off',
 | 
				
			||||||
 | 
					        'spaced-comment': 'off',
 | 
				
			||||||
 | 
					        'no-loop-func': 'off',
 | 
				
			||||||
 | 
					        'arrow-body-style': 'off',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'guard-for-in': 'off',
 | 
				
			||||||
 | 
					        'no-return-assign': 'off',
 | 
				
			||||||
 | 
					        'dot-notation': 'off',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'func-names': 'off',
 | 
				
			||||||
 | 
					        'import/no-useless-path-segments': 'off',
 | 
				
			||||||
 | 
					        'default-param-last': 'off',
 | 
				
			||||||
 | 
					        'prefer-arrow-callback': 'off',
 | 
				
			||||||
 | 
					        'no-unneeded-ternary': 'off',
 | 
				
			||||||
 | 
					        'no-return-await': 'off',
 | 
				
			||||||
 | 
					        'import/extensions': 'off',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        'no-var': 'off',
 | 
				
			||||||
 | 
					        'import/newline-after-import': 'off',
 | 
				
			||||||
 | 
					        'no-restricted-globals': 'off',
 | 
				
			||||||
 | 
					        'operator-assignment': 'off',
 | 
				
			||||||
 | 
					        'no-eval': 'off',
 | 
				
			||||||
 | 
					        'max-classes-per-file': 'off',
 | 
				
			||||||
 | 
					        'vars-on-top': 'off',
 | 
				
			||||||
 | 
					        'no-bitwise': 'off',
 | 
				
			||||||
 | 
					        'no-lonely-if': 'off',
 | 
				
			||||||
 | 
					        'no-multi-assign': 'off',
 | 
				
			||||||
 | 
					        'no-promise-executor-return': 'off',
 | 
				
			||||||
 | 
					        'no-empty-function': 'off',
 | 
				
			||||||
 | 
					        'import/no-unresolved': 'off',
 | 
				
			||||||
 | 
					        camelcase: 'off',
 | 
				
			||||||
 | 
					        eqeqeq: 'off',
 | 
				
			||||||
 | 
					        'lines-between-class-members': 'off',
 | 
				
			||||||
 | 
					        'import/no-cycle': 'off',
 | 
				
			||||||
 | 
					        'new-cap': 'off',
 | 
				
			||||||
 | 
					        'prefer-object-spread': 'off',
 | 
				
			||||||
 | 
					        'no-new-func': 'off',
 | 
				
			||||||
 | 
					        'no-unused-expressions': 'off',
 | 
				
			||||||
 | 
					        'lines-around-directive': 'off',
 | 
				
			||||||
 | 
					        'prefer-exponentiation-operator': 'off',
 | 
				
			||||||
 | 
					        'no-restricted-properties': 'off',
 | 
				
			||||||
 | 
					        'prefer-rest-params': 'off',
 | 
				
			||||||
 | 
					        'no-unreachable-loop': 'off',
 | 
				
			||||||
 | 
					        'no-alert': 'off',
 | 
				
			||||||
 | 
					        'no-useless-return': 'off',
 | 
				
			||||||
 | 
					        'no-nested-ternary': 'off',
 | 
				
			||||||
 | 
					        'prefer-regex-literals': 'off',
 | 
				
			||||||
 | 
					        'import/no-named-as-default-member': 'off',
 | 
				
			||||||
 | 
					        yoda: 'off',
 | 
				
			||||||
 | 
					        'no-script-url': 'off',
 | 
				
			||||||
 | 
					        'no-prototype-builtins':'off'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -11,4 +11,6 @@ cert.crt
 | 
				
			|||||||
server-package.json
 | 
					server-package.json
 | 
				
			||||||
.idea/httpRequests/
 | 
					.idea/httpRequests/
 | 
				
			||||||
data/
 | 
					data/
 | 
				
			||||||
 | 
					data-test/
 | 
				
			||||||
tmp/
 | 
					tmp/
 | 
				
			||||||
 | 
					.eslintcache
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ image:
 | 
				
			|||||||
  file: .gitpod.dockerfile
 | 
					  file: .gitpod.dockerfile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tasks:
 | 
					tasks:
 | 
				
			||||||
    - before: nvm install 16.19.1 && nvm use 16.19.1
 | 
					    - before: nvm install 18.18.2 && nvm use 18.18.2
 | 
				
			||||||
      init: npm install
 | 
					      init: npm install
 | 
				
			||||||
      command: npm run start-server
 | 
					      command: npm run start-server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.husky/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					_
 | 
				
			||||||
							
								
								
									
										4
									
								
								.husky/pre-commit
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.husky/pre-commit
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					. "$(dirname "$0")/_/husky.sh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#npx lint-staged
 | 
				
			||||||
							
								
								
									
										4
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								.idea/dataSources.xml
									
									
									
										generated
									
									
									
								
							@@ -1,11 +1,11 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
<project version="4">
 | 
					<project version="4">
 | 
				
			||||||
  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
 | 
					  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
 | 
				
			||||||
    <data-source source="LOCAL" name="SQLite - document.db" uuid="30cef30d-e704-484d-a4ca-5d3bfc2ece63">
 | 
					    <data-source source="LOCAL" name="document.db" uuid="2a4ac1e6-b828-4a2a-8e4a-3f59f10aff26">
 | 
				
			||||||
      <driver-ref>sqlite.xerial</driver-ref>
 | 
					      <driver-ref>sqlite.xerial</driver-ref>
 | 
				
			||||||
      <synchronize>true</synchronize>
 | 
					      <synchronize>true</synchronize>
 | 
				
			||||||
      <jdbc-driver>org.sqlite.JDBC</jdbc-driver>
 | 
					      <jdbc-driver>org.sqlite.JDBC</jdbc-driver>
 | 
				
			||||||
      <jdbc-url>jdbc:sqlite:$PROJECT_DIR$/../trilium-data/document.db</jdbc-url>
 | 
					      <jdbc-url>jdbc:sqlite:$PROJECT_DIR$/data/document.db</jdbc-url>
 | 
				
			||||||
      <working-dir>$ProjectFileDir$</working-dir>
 | 
					      <working-dir>$ProjectFileDir$</working-dir>
 | 
				
			||||||
    </data-source>
 | 
					    </data-source>
 | 
				
			||||||
  </component>
 | 
					  </component>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
				
			|||||||
<component name="InspectionProjectProfileManager">
 | 
					<component name="InspectionProjectProfileManager">
 | 
				
			||||||
  <profile version="1.0">
 | 
					  <profile version="1.0">
 | 
				
			||||||
    <option name="myName" value="Project Default" />
 | 
					    <option name="myName" value="Project Default" />
 | 
				
			||||||
    <inspection_tool class="JSUnfilteredForInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
 | 
					    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
 | 
				
			||||||
    <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
 | 
					    <inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
 | 
				
			||||||
      <option name="processCode" value="true" />
 | 
					      <option name="processCode" value="true" />
 | 
				
			||||||
      <option name="processLiterals" value="true" />
 | 
					      <option name="processLiterals" value="true" />
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								.idea/jsLinters/eslint.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/jsLinters/eslint.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<project version="4">
 | 
				
			||||||
 | 
					  <component name="EslintConfiguration">
 | 
				
			||||||
 | 
					    <option name="fix-on-save" value="true" />
 | 
				
			||||||
 | 
					  </component>
 | 
				
			||||||
 | 
					</project>
 | 
				
			||||||
							
								
								
									
										1
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							@@ -1,4 +1,3 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					<project version="4">
 | 
				
			||||||
  <component name="JavaScriptSettings">
 | 
					  <component name="JavaScriptSettings">
 | 
				
			||||||
    <option name="languageLevel" value="ES6" />
 | 
					    <option name="languageLevel" value="ES6" />
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					//https://prettier.io/docs/en/options.html
 | 
				
			||||||
 | 
					module.exports = {
 | 
				
			||||||
 | 
						semi: true,
 | 
				
			||||||
 | 
						trailingComma: 'none',
 | 
				
			||||||
 | 
						singleQuote: true,
 | 
				
			||||||
 | 
						printWidth: 100,
 | 
				
			||||||
 | 
						tabWidth: 4,
 | 
				
			||||||
 | 
						useTabs: false,
 | 
				
			||||||
 | 
						quoteProps: "as-needed",
 | 
				
			||||||
 | 
						bracketSpacing: true,
 | 
				
			||||||
 | 
						arrowParens: "avoid"
 | 
				
			||||||
 | 
						// htmlWhitespaceSensitivity: 'ignore',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										6
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "recommendations": [
 | 
				
			||||||
 | 
					    "dbaeumer.vscode-eslint",
 | 
				
			||||||
 | 
					    "esbenp.prettier-vscode",
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							@@ -1,19 +1,24 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "version": "0.2.0",
 | 
					    "version": "0.2.0",
 | 
				
			||||||
    "configurations": [
 | 
					    "configurations": [
 | 
				
			||||||
 | 
					        // nodemon should be installed globally, use npm i -g nodemon
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type": "node",
 | 
					            "console": "integratedTerminal",
 | 
				
			||||||
 | 
					            "internalConsoleOptions": "neverOpen",
 | 
				
			||||||
 | 
					            "name": "nodemon start-server",
 | 
				
			||||||
 | 
					            "program": "${workspaceFolder}/src/www",
 | 
				
			||||||
            "request": "launch",
 | 
					            "request": "launch",
 | 
				
			||||||
            "name": "start-server",
 | 
					            "restart": true,
 | 
				
			||||||
            "skipFiles": [
 | 
					            "runtimeExecutable": "nodemon",
 | 
				
			||||||
                "<node_internals>/**"
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
            "env": {
 | 
					            "env": {
 | 
				
			||||||
                "TRILIUM_ENV": "dev",
 | 
					                "TRILIUM_ENV": "dev",
 | 
				
			||||||
                "TRILIUM_DATA_DIR": "./data"
 | 
					                "TRILIUM_DATA_DIR": "./data"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            "skipFiles": [
 | 
				
			||||||
 | 
					                "<node_internals>/**"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "type": "node",
 | 
				
			||||||
            "outputCapture": "std",
 | 
					            "outputCapture": "std",
 | 
				
			||||||
            "program": "${workspaceFolder}/src/www"
 | 
					        },
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "[javascript]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "dbaeumer.vscode-eslint"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "[json]": {
 | 
				
			||||||
 | 
					    "editor.defaultFormatter": "dbaeumer.vscode-eslint"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "editor.formatOnSave": true,
 | 
				
			||||||
 | 
					  "eslint.format.enable": true,
 | 
				
			||||||
 | 
					  "eslint.probe": [
 | 
				
			||||||
 | 
					    "javascript",
 | 
				
			||||||
 | 
					    "javascriptreact",
 | 
				
			||||||
 | 
					    "typescript",
 | 
				
			||||||
 | 
					    "typescriptreact",
 | 
				
			||||||
 | 
					    "html",
 | 
				
			||||||
 | 
					    "vue",
 | 
				
			||||||
 | 
					    "markdown",
 | 
				
			||||||
 | 
					    "json",
 | 
				
			||||||
 | 
					    "jsonc"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "eslint.validate": [
 | 
				
			||||||
 | 
					    "javascript",
 | 
				
			||||||
 | 
					    "javascriptreact",
 | 
				
			||||||
 | 
					    "typescript",
 | 
				
			||||||
 | 
					    "typescriptreact",
 | 
				
			||||||
 | 
					    "html",
 | 
				
			||||||
 | 
					    "vue",
 | 
				
			||||||
 | 
					    "markdown",
 | 
				
			||||||
 | 
					    "json",
 | 
				
			||||||
 | 
					    "jsonc"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "files.eol": "\n",
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
# !!! Don't try to build this Dockerfile directly, run it through bin/build-docker.sh script !!!
 | 
					# !!! Don't try to build this Dockerfile directly, run it through bin/build-docker.sh script !!!
 | 
				
			||||||
FROM node:16.19.1-alpine
 | 
					FROM node:18.18.2-alpine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Create app directory
 | 
					# Create app directory
 | 
				
			||||||
WORKDIR /usr/src/app
 | 
					WORKDIR /usr/src/app
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# Trilium Notes
 | 
					# Trilium Notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md)
 | 
					[English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | [Japanese](https://github.com/zadam/trilium/blob/master/README.ja.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
					[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
				
			||||||
Trilium Notes 是一个层次化的笔记应用程序,专注于建立大型个人知识库。请参阅[屏幕截图](https://github.com/zadam/trilium/wiki/Screenshot-tour)以快速了解:
 | 
					Trilium Notes 是一个层次化的笔记应用程序,专注于建立大型个人知识库。请参阅[屏幕截图](https://github.com/zadam/trilium/wiki/Screenshot-tour)以快速了解:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										83
									
								
								README.ja.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								README.ja.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					# Trilium Notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | [Japanese](https://github.com/zadam/trilium/blob/master/README.ja.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Trilium Notes は、大規模な個人知識ベースの構築に焦点を当てた、階層型ノートアプリケーションです。概要は[スクリーンショット](https://github.com/zadam/trilium/wiki/Screenshot-tour)をご覧ください:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<a href="https://github.com/zadam/trilium/wiki/Screenshot-tour"><img src="https://raw.githubusercontent.com/wiki/zadam/trilium/images/screenshot.png" alt="Trilium Screenshot" width="1000"></a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ウクライナは現在、ロシアの侵略から自国を守っています。[ウクライナ軍や人道的な慈善団体への寄付](https://standforukraine.com/)をご検討ください。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<p float="left">
 | 
				
			||||||
 | 
					  <img src="https://upload.wikimedia.org/wikipedia/commons/4/49/Flag_of_Ukraine.svg" alt="drawing" width="400"/>
 | 
				
			||||||
 | 
					  <img src="https://signmyrocket.com//uploads/2b2a523cd0c0e76cdbba95a89a9636b2_1676971281.jpg" alt="Trilium Notes supports Ukraine!" width="570"/>
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 🎁 特徴
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* ノートは、任意の深さのツリーに配置できます。単一のノートをツリー内の複数の場所に配置できます ([cloning](https://github.com/zadam/trilium/wiki/Cloning-notes) を参照)
 | 
				
			||||||
 | 
					* マークダウン[オートフォーマット](https://github.com/zadam/trilium/wiki/Text-notes#autoformat)による、表、画像、[数学](https://github.com/zadam/trilium/wiki/Text-notes#math-support)などの豊富な WYSIWYG ノート編集機能
 | 
				
			||||||
 | 
					* シンタックスハイライトを含む[ソースコード付きノート](https://github.com/zadam/trilium/wiki/Code-notes)の編集をサポート
 | 
				
			||||||
 | 
					* [ノート間のナビゲーション](https://github.com/zadam/trilium/wiki/Note-navigation)、全文検索、[ノートホイスト](https://github.com/zadam/trilium/wiki/Note-hoisting)が高速かつ簡単に行えます
 | 
				
			||||||
 | 
					* シームレスな[ノートのバージョン管理](https://github.com/zadam/trilium/wiki/Note-revisions)
 | 
				
			||||||
 | 
					* ノート[属性](https://github.com/zadam/trilium/wiki/Attributes)は、ノート整理、クエリ、高度な[スクリプト](https://github.com/zadam/trilium/wiki/Scripts)に使用できます
 | 
				
			||||||
 | 
					* 自己ホスト型同期サーバーとの[同期](https://github.com/zadam/trilium/wiki/Synchronization)
 | 
				
			||||||
 | 
					  * [同期サーバーをホストするサードパーティ・サービス](https://trilium.cc/paid-hosting)があります
 | 
				
			||||||
 | 
					* 公開インターネットへのノートの[共有](https://github.com/zadam/trilium/wiki/Sharing)(公開)
 | 
				
			||||||
 | 
					* ノートごとの粒度を持つ強力な[ノート暗号化](https://github.com/zadam/trilium/wiki/Protected-notes)
 | 
				
			||||||
 | 
					* 組み込みの Excalidraw を使用した図のスケッチ (ノート タイプ"キャンバス")
 | 
				
			||||||
 | 
					* ノートとその関係を可視化するための[関係図](https://github.com/zadam/trilium/wiki/Relation-map)と[リンクマップ](https://github.com/zadam/trilium/wiki/Link-map)
 | 
				
			||||||
 | 
					* [スクリプティング](https://github.com/zadam/trilium/wiki/Scripts) - [高度なショーケース](https://github.com/zadam/trilium/wiki/Advanced-showcases)を参照
 | 
				
			||||||
 | 
					* 自動化のための [REST API](https://github.com/zadam/trilium/wiki/ETAPI)
 | 
				
			||||||
 | 
					* ユーザビリティとパフォーマンスの両方で 100 000 ノート以上に拡張可能
 | 
				
			||||||
 | 
					* スマートフォンとタブレット向けのタッチ最適化[モバイルフロントエンド](https://github.com/zadam/trilium/wiki/Mobile-frontend)
 | 
				
			||||||
 | 
					* [ナイトテーマ](https://github.com/zadam/trilium/wiki/Themes)
 | 
				
			||||||
 | 
					* [Evernote](https://github.com/zadam/trilium/wiki/Evernote-import) と [Markdown のインポートとエクスポート](https://github.com/zadam/trilium/wiki/Markdown)
 | 
				
			||||||
 | 
					* Web コンテンツを簡単に保存するための [Web クリッパー](https://github.com/zadam/trilium/wiki/Web-clipper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					サードパーティのテーマ、スクリプト、プラグインなどは、 [awesome-trilium](https://github.com/Nriver/awesome-trilium) をチェックしてください。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 🏗 ビルド
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Trilium は、デスクトップアプリケーション(Linux、Windows)またはサーバー上でホストされるウェブアプリケーション(Linux)として提供されます。 Mac OS のデスクトップビルドも利用可能ですが、 [unsupported](https://github.com/zadam/trilium/wiki/FAQ#mac-os-support) となっています。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* デスクトップで Trilium を使用したい場合は、 [latest release](https://github.com/zadam/trilium/releases/latest) からお使いのプラットフォームのバイナリリリースをダウンロードし、パッケージを解凍して ``trilium`` の実行ファイルを実行してください。
 | 
				
			||||||
 | 
					* サーバーに Trilium をインストールする場合は、[このページ](https://github.com/zadam/trilium/wiki/Server-installation)に従ってください。
 | 
				
			||||||
 | 
					  * 現在、対応(動作確認)しているブラウザは、最近の Chrome と Firefox のみです。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Trilium は Flatpak としても提供されます:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[<img width="240" src="https://flathub.org/assets/badges/flathub-badge-en.png">](https://flathub.org/apps/details/com.github.zadam.trilium)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 📝 ドキュメント
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ドキュメントページの全リストはwikiをご覧ください。](https://github.com/zadam/trilium/wiki/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					また、[個人的な知識基盤のパターン](https://github.com/zadam/trilium/wiki/Patterns-of-personal-knowledge-base)を読むと、 Trilium の使い方のヒントを得ることができます。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 💻 コントリビュート
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ブラウザベースの開発環境を使用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://gitpod.io/#https://github.com/zadam/trilium)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					または、ローカルにクローンして実行
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					npm install
 | 
				
			||||||
 | 
					npm run start-server
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 📢 シャウトアウト
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - 市場で最高の WYSIWYG エディター、非常にインタラクティブで聞き上手なチーム
 | 
				
			||||||
 | 
					* [FancyTree](https://github.com/mar10/fancytree) - 真の競争相手がいない、非常に機能豊富なツリーライブラリです。 Trilium Notes は、これなしでは成り立たないでしょう。
 | 
				
			||||||
 | 
					* [CodeMirror](https://github.com/codemirror/CodeMirror) - 膨大な数の言語をサポートするコードエディタ
 | 
				
			||||||
 | 
					* [jsPlumb](https://github.com/jsplumb/jsplumb) - 競合のないビジュアルコネクティビティライブラリです。[関係図](https://github.com/zadam/trilium/wiki/Relation-map)、[リンク図](https://github.com/zadam/trilium/wiki/Link-map)で使用。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 🤝 サポート
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GitHub スポンサー、[PayPal](https://paypal.me/za4am)もしくは Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2) にて Trilium をサポートすることができます。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 🔑 ライセンス
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					このプログラムはフリーソフトウェアです:フリーソフトウェア財団が発行した GNU Affero General Public License のバージョン3、またはそれ以降のバージョンのいずれかに従って、再配布および/または改変することができます。
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# Trilium Notes
 | 
					# Trilium Notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md)
 | 
					[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | [Japanese](https://github.com/zadam/trilium/blob/master/README.ja.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview:
 | 
					Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,7 +76,7 @@ npm run start-server
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 🤝 Support
 | 
					## 🤝 Support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can support Trilum using GitHub Sponsors, [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2).
 | 
					You can support Trilium using GitHub Sponsors, [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 🔑 License
 | 
					## 🔑 License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# Trilium Notes
 | 
					# Trilium Notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md)
 | 
					[English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | [Japanese](https://github.com/zadam/trilium/blob/master/README.ja.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
					[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 | 
				
			||||||
Trilium Notes – это приложение для заметок с иерархической структурой, ориентированное на создание больших персональных баз знаний. Для быстрого ознакомления посмотрите [скриншот-тур](https://github.com/zadam/trilium/wiki/Screenshot-tour):
 | 
					Trilium Notes – это приложение для заметок с иерархической структурой, ориентированное на создание больших персональных баз знаний. Для быстрого ознакомления посмотрите [скриншот-тур](https://github.com/zadam/trilium/wiki/Screenshot-tour):
 | 
				
			||||||
 
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -5,18 +5,3 @@ echo "Packaging debian x64 distribution..."
 | 
				
			|||||||
VERSION=`jq -r ".version" package.json`
 | 
					VERSION=`jq -r ".version" package.json`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
./node_modules/.bin/electron-installer-debian --config bin/deb-options.json --options.version=${VERSION} --arch amd64
 | 
					./node_modules/.bin/electron-installer-debian --config bin/deb-options.json --options.version=${VERSION} --arch amd64
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# hacky stop-gag measure to produce debian compatible XZ compressed debs until this is fixed: https://github.com/electron-userland/electron-installer-debian/issues/272
 | 
					 | 
				
			||||||
cd dist
 | 
					 | 
				
			||||||
ar x trilium_${VERSION}_amd64.deb
 | 
					 | 
				
			||||||
rm trilium_${VERSION}_amd64.deb
 | 
					 | 
				
			||||||
# recompress
 | 
					 | 
				
			||||||
< control.tar.zst zstd -d | xz > control.tar.xz
 | 
					 | 
				
			||||||
< data.tar.zst zstd -d | xz > data.tar.xz
 | 
					 | 
				
			||||||
# create deb archive (I really do not know, what argument "sdsd" is for but something is required for ar to create the archive as desired)
 | 
					 | 
				
			||||||
ar -m -c -a sdsd trilium_${VERSION}_amd64.deb debian-binary control.tar.xz data.tar.xz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rm control* data* debian-binary
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo "Converted to XZ deb"
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,9 +24,6 @@ mv "./dist/Trilium Notes-linux-x64" $BUILD_DIR
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
cp images/app-icons/png/128x128.png $BUILD_DIR/icon.png
 | 
					cp images/app-icons/png/128x128.png $BUILD_DIR/icon.png
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# removing software WebGL binaries because they are pretty huge and not necessary
 | 
					 | 
				
			||||||
rm -r $BUILD_DIR/swiftshader
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cp bin/tpl/anonymize-database.sql $BUILD_DIR/
 | 
					cp bin/tpl/anonymize-database.sql $BUILD_DIR/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cp -r dump-db $BUILD_DIR/
 | 
					cp -r dump-db $BUILD_DIR/
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_DIR=dist/trilium-linux-x64-server
 | 
					PKG_DIR=dist/trilium-linux-x64-server
 | 
				
			||||||
NODE_VERSION=16.19.1
 | 
					NODE_VERSION=18.18.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$1" != "DONTCOPY" ]
 | 
					if [ "$1" != "DONTCOPY" ]
 | 
				
			||||||
then
 | 
					then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,9 +22,6 @@ rm -rf $BUILD_DIR
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
mv "./dist/Trilium Notes-win32-x64" $BUILD_DIR
 | 
					mv "./dist/Trilium Notes-win32-x64" $BUILD_DIR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# removing software WebGL binaries because they are pretty huge and not necessary
 | 
					 | 
				
			||||||
rm -r $BUILD_DIR/swiftshader
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cp bin/tpl/anonymize-database.sql $BUILD_DIR/
 | 
					cp bin/tpl/anonymize-database.sql $BUILD_DIR/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cp -r dump-db $BUILD_DIR/
 | 
					cp -r dump-db $BUILD_DIR/
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@ if [[ $# -eq 0 ]] ; then
 | 
				
			|||||||
    exit 1
 | 
					    exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
n exec 16.19.1 npm run webpack
 | 
					n exec 18.18.2 npm run webpack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DIR=$1
 | 
					DIR=$1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,7 +27,7 @@ cp -r electron.js $DIR/
 | 
				
			|||||||
cp webpack-* $DIR/
 | 
					cp webpack-* $DIR/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# run in subshell (so we return to original dir)
 | 
					# run in subshell (so we return to original dir)
 | 
				
			||||||
(cd $DIR && n exec 16.19.1 npm install --only=prod)
 | 
					(cd $DIR && n exec 18.18.2 npm install --only=prod)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# cleanup of useless files in dependencies
 | 
					# cleanup of useless files in dependencies
 | 
				
			||||||
rm -r $DIR/node_modules/image-q/demo
 | 
					rm -r $DIR/node_modules/image-q/demo
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										0
									
								
								bin/create-anonymization-script.js
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								bin/create-anonymization-script.js
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "src": "dist/trilium-linux-x64",
 | 
					  "src": "dist/trilium-linux-x64",
 | 
				
			||||||
  "dest": "dist/",
 | 
					  "dest": "dist/",
 | 
				
			||||||
 | 
					  "compression": "xz",
 | 
				
			||||||
  "name": "trilium",
 | 
					  "name": "trilium",
 | 
				
			||||||
  "productName": "Trilium Notes",
 | 
					  "productName": "Trilium Notes",
 | 
				
			||||||
  "genericName": "Note taker",
 | 
					  "genericName": "Note taker",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,161 +1,45 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
UPDATE etapi_tokens SET tokenHash = 'API token hash value';
 | 
					UPDATE etapi_tokens SET tokenHash = 'API token hash value';
 | 
				
			||||||
UPDATE notes SET title = 'title' WHERE noteId != 'root' AND noteId NOT LIKE '\_%' ESCAPE '\';
 | 
					UPDATE notes SET title = 'title'
 | 
				
			||||||
UPDATE note_contents SET content = 'text' WHERE content IS NOT NULL;
 | 
					             WHERE noteId NOT IN ('root', '_hidden', '_share')
 | 
				
			||||||
UPDATE note_revisions SET title = 'title';
 | 
					               AND SUBSTR(noteId, 1, 8) != '_options'
 | 
				
			||||||
UPDATE note_revision_contents SET content = 'text' WHERE content IS NOT NULL;
 | 
					               AND SUBSTR(noteId, 1, 3) != '_lb';
 | 
				
			||||||
 | 
					UPDATE blobs SET content = 'text' WHERE content IS NOT NULL;
 | 
				
			||||||
UPDATE attributes SET name = 'name', value = 'value'
 | 
					UPDATE revisions SET title = 'title';
 | 
				
			||||||
                  WHERE type = 'label'
 | 
					 | 
				
			||||||
                    AND name NOT IN ('inbox',
 | 
					 | 
				
			||||||
                                     'disableVersioning',
 | 
					 | 
				
			||||||
                                     'calendarRoot',
 | 
					 | 
				
			||||||
                                     'archived',
 | 
					 | 
				
			||||||
                                     'excludeFromExport',
 | 
					 | 
				
			||||||
                                     'disableInclusion',
 | 
					 | 
				
			||||||
                                     'appCss',
 | 
					 | 
				
			||||||
                                     'appTheme',
 | 
					 | 
				
			||||||
                                     'hidePromotedAttributes',
 | 
					 | 
				
			||||||
                                     'readOnly',
 | 
					 | 
				
			||||||
                                     'autoReadOnlyDisabled',
 | 
					 | 
				
			||||||
                                     'cssClass',
 | 
					 | 
				
			||||||
                                     'iconClass',
 | 
					 | 
				
			||||||
                                     'keyboardShortcut',
 | 
					 | 
				
			||||||
                                     'run',
 | 
					 | 
				
			||||||
                                     'runOnInstance',
 | 
					 | 
				
			||||||
                                     'runAtHour',
 | 
					 | 
				
			||||||
                                     'customRequestHandler',
 | 
					 | 
				
			||||||
                                     'customResourceProvider',
 | 
					 | 
				
			||||||
                                     'widget',
 | 
					 | 
				
			||||||
                                     'noteInfoWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'linkMapWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'noteRevisionsWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'whatLinksHereWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'similarNotesWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'workspace',
 | 
					 | 
				
			||||||
                                     'workspaceIconClass',
 | 
					 | 
				
			||||||
                                     'workspaceTabBackgroundColor',
 | 
					 | 
				
			||||||
                                     'searchHome',
 | 
					 | 
				
			||||||
                                     'workspaceInbox',
 | 
					 | 
				
			||||||
                                     'workspaceSearchHome',
 | 
					 | 
				
			||||||
                                     'sqlConsoleHome',
 | 
					 | 
				
			||||||
                                     'datePattern',
 | 
					 | 
				
			||||||
                                     'pageSize',
 | 
					 | 
				
			||||||
                                     'viewType',
 | 
					 | 
				
			||||||
                                     'mapRootNoteId',
 | 
					 | 
				
			||||||
                                     'bookmarkFolder',
 | 
					 | 
				
			||||||
                                     'sorted',
 | 
					 | 
				
			||||||
                                     'top',
 | 
					 | 
				
			||||||
                                     'fullContentWidth',
 | 
					 | 
				
			||||||
                                     'shareHiddenFromTree',
 | 
					 | 
				
			||||||
                                     'shareAlias',
 | 
					 | 
				
			||||||
                                     'shareOmitDefaultCss',
 | 
					 | 
				
			||||||
                                     'shareRoot',
 | 
					 | 
				
			||||||
                                     'internalLink',
 | 
					 | 
				
			||||||
                                     'imageLink',
 | 
					 | 
				
			||||||
                                     'relationMapLink',
 | 
					 | 
				
			||||||
                                     'includeMapLink',
 | 
					 | 
				
			||||||
                                     'runOnNoteCreation',
 | 
					 | 
				
			||||||
                                     'runOnNoteTitleChange',
 | 
					 | 
				
			||||||
                                     'runOnNoteContentChange',
 | 
					 | 
				
			||||||
                                     'runOnNoteChange',
 | 
					 | 
				
			||||||
                                     'runOnChildNoteCreation',
 | 
					 | 
				
			||||||
                                     'runOnAttributeCreation',
 | 
					 | 
				
			||||||
                                     'runOnAttributeChange',
 | 
					 | 
				
			||||||
                                     'template',
 | 
					 | 
				
			||||||
                                     'inherit',
 | 
					 | 
				
			||||||
                                     'widget',
 | 
					 | 
				
			||||||
                                     'renderNote',
 | 
					 | 
				
			||||||
                                     'shareCss',
 | 
					 | 
				
			||||||
                                     'shareJs',
 | 
					 | 
				
			||||||
                                     'shareFavicon',
 | 
					 | 
				
			||||||
                                     'executeButton',
 | 
					 | 
				
			||||||
                                     'keepCurrentHoisting',
 | 
					 | 
				
			||||||
                                     'color',
 | 
					 | 
				
			||||||
                                     'toc',
 | 
					 | 
				
			||||||
                                     'excludeFromNoteMap',
 | 
					 | 
				
			||||||
                                     'docName',
 | 
					 | 
				
			||||||
                                     'launcherType',
 | 
					 | 
				
			||||||
                                     'builtinWidget',
 | 
					 | 
				
			||||||
                                     'baseSize',
 | 
					 | 
				
			||||||
                                     'growthFactor'
 | 
					 | 
				
			||||||
                      );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE attributes SET name = 'name'
 | 
					 | 
				
			||||||
                    AND name NOT IN ('inbox',
 | 
					 | 
				
			||||||
                                     'disableVersioning',
 | 
					 | 
				
			||||||
                                     'calendarRoot',
 | 
					 | 
				
			||||||
                                     'archived',
 | 
					 | 
				
			||||||
                                     'excludeFromExport',
 | 
					 | 
				
			||||||
                                     'disableInclusion',
 | 
					 | 
				
			||||||
                                     'appCss',
 | 
					 | 
				
			||||||
                                     'appTheme',
 | 
					 | 
				
			||||||
                                     'hidePromotedAttributes',
 | 
					 | 
				
			||||||
                                     'readOnly',
 | 
					 | 
				
			||||||
                                     'autoReadOnlyDisabled',
 | 
					 | 
				
			||||||
                                     'cssClass',
 | 
					 | 
				
			||||||
                                     'iconClass',
 | 
					 | 
				
			||||||
                                     'keyboardShortcut',
 | 
					 | 
				
			||||||
                                     'run',
 | 
					 | 
				
			||||||
                                     'runOnInstance',
 | 
					 | 
				
			||||||
                                     'runAtHour',
 | 
					 | 
				
			||||||
                                     'customRequestHandler',
 | 
					 | 
				
			||||||
                                     'customResourceProvider',
 | 
					 | 
				
			||||||
                                     'widget',
 | 
					 | 
				
			||||||
                                     'noteInfoWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'linkMapWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'noteRevisionsWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'whatLinksHereWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'similarNotesWidgetDisabled',
 | 
					 | 
				
			||||||
                                     'workspace',
 | 
					 | 
				
			||||||
                                     'workspaceIconClass',
 | 
					 | 
				
			||||||
                                     'workspaceTabBackgroundColor',
 | 
					 | 
				
			||||||
                                     'searchHome',
 | 
					 | 
				
			||||||
                                     'workspaceInbox',
 | 
					 | 
				
			||||||
                                     'workspaceSearchHome',
 | 
					 | 
				
			||||||
                                     'sqlConsoleHome',
 | 
					 | 
				
			||||||
                                     'datePattern',
 | 
					 | 
				
			||||||
                                     'pageSize',
 | 
					 | 
				
			||||||
                                     'viewType',
 | 
					 | 
				
			||||||
                                     'mapRootNoteId',
 | 
					 | 
				
			||||||
                                     'bookmarkFolder',
 | 
					 | 
				
			||||||
                                     'sorted',
 | 
					 | 
				
			||||||
                                     'top',
 | 
					 | 
				
			||||||
                                     'fullContentWidth',
 | 
					 | 
				
			||||||
                                     'shareHiddenFromTree',
 | 
					 | 
				
			||||||
                                     'shareAlias',
 | 
					 | 
				
			||||||
                                     'shareOmitDefaultCss',
 | 
					 | 
				
			||||||
                                     'shareRoot',
 | 
					 | 
				
			||||||
                                     'internalLink',
 | 
					 | 
				
			||||||
                                     'imageLink',
 | 
					 | 
				
			||||||
                                     'relationMapLink',
 | 
					 | 
				
			||||||
                                     'includeMapLink',
 | 
					 | 
				
			||||||
                                     'runOnNoteCreation',
 | 
					 | 
				
			||||||
                                     'runOnNoteTitleChange',
 | 
					 | 
				
			||||||
                                     'runOnNoteContentChange',
 | 
					 | 
				
			||||||
                                     'runOnNoteChange',
 | 
					 | 
				
			||||||
                                     'runOnChildNoteCreation',
 | 
					 | 
				
			||||||
                                     'runOnAttributeCreation',
 | 
					 | 
				
			||||||
                                     'runOnAttributeChange',
 | 
					 | 
				
			||||||
                                     'template',
 | 
					 | 
				
			||||||
                                     'inherit',
 | 
					 | 
				
			||||||
                                     'widget',
 | 
					 | 
				
			||||||
                                     'renderNote',
 | 
					 | 
				
			||||||
                                     'shareCss',
 | 
					 | 
				
			||||||
                                     'shareJs',
 | 
					 | 
				
			||||||
                                     'shareFavicon',
 | 
					 | 
				
			||||||
                                     'executeButton',
 | 
					 | 
				
			||||||
                                     'keepCurrentHoisting',
 | 
					 | 
				
			||||||
                                     'color',
 | 
					 | 
				
			||||||
                                     'toc',
 | 
					 | 
				
			||||||
                                     'excludeFromNoteMap',
 | 
					 | 
				
			||||||
                                     'docName',
 | 
					 | 
				
			||||||
                                     'launcherType',
 | 
					 | 
				
			||||||
                                     'builtinWidget',
 | 
					 | 
				
			||||||
                                     'baseSize',
 | 
					 | 
				
			||||||
                                     'growthFactor'
 | 
					 | 
				
			||||||
                                    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE attributes SET name  = 'name', value = 'value' WHERE type = 'label'
 | 
				
			||||||
 | 
					  AND name NOT IN
 | 
				
			||||||
 | 
					      ('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss',
 | 
				
			||||||
 | 
					       'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'cssClass', 'iconClass',
 | 
				
			||||||
 | 
					       'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider',
 | 
				
			||||||
 | 
					       'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled',
 | 
				
			||||||
 | 
					       'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass',
 | 
				
			||||||
 | 
					       'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox',
 | 
				
			||||||
 | 
					       'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'pageSize', 'viewType', 'mapRootNoteId',
 | 
				
			||||||
 | 
					       'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top',
 | 
				
			||||||
 | 
					       'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription',
 | 
				
			||||||
 | 
					       'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate',
 | 
				
			||||||
 | 
					       'template', 'toc', 'color', 'keepCurrentHoisting', 'executeButton', 'executeDescription', 'newNotesOnTop',
 | 
				
			||||||
 | 
					       'clipperInbox', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation',
 | 
				
			||||||
 | 
					       'runOnNoteTitleChange', 'runOnNoteChange', 'runOnNoteContentChange', 'runOnNoteDeletion', 'runOnBranchCreation', 'runOnBranchChange',
 | 
				
			||||||
 | 
					       'runOnBranchDeletion', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template',
 | 
				
			||||||
 | 
					       'inherit', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareTemplate', 'shareFavicon');
 | 
				
			||||||
 | 
					UPDATE attributes SET name = 'name' WHERE type = 'relation'
 | 
				
			||||||
 | 
					  AND name NOT IN
 | 
				
			||||||
 | 
					      ('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss',
 | 
				
			||||||
 | 
					       'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'cssClass', 'iconClass',
 | 
				
			||||||
 | 
					       'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider',
 | 
				
			||||||
 | 
					       'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled',
 | 
				
			||||||
 | 
					       'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass',
 | 
				
			||||||
 | 
					       'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox',
 | 
				
			||||||
 | 
					       'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'pageSize', 'viewType', 'mapRootNoteId',
 | 
				
			||||||
 | 
					       'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top',
 | 
				
			||||||
 | 
					       'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription',
 | 
				
			||||||
 | 
					       'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate',
 | 
				
			||||||
 | 
					       'template', 'toc', 'color', 'keepCurrentHoisting', 'executeButton', 'executeDescription', 'newNotesOnTop',
 | 
				
			||||||
 | 
					       'clipperInbox', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation',
 | 
				
			||||||
 | 
					       'runOnNoteTitleChange', 'runOnNoteChange', 'runOnNoteContentChange', 'runOnNoteDeletion', 'runOnBranchCreation', 'runOnBranchChange',
 | 
				
			||||||
 | 
					       'runOnBranchDeletion', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template',
 | 
				
			||||||
 | 
					       'inherit', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareTemplate', 'shareFavicon');
 | 
				
			||||||
UPDATE branches SET prefix = 'prefix' WHERE prefix IS NOT NULL AND prefix != 'recovered';
 | 
					UPDATE branches SET prefix = 'prefix' WHERE prefix IS NOT NULL AND prefix != 'recovered';
 | 
				
			||||||
UPDATE options SET value = 'anonymized' WHERE name IN
 | 
					UPDATE options SET value = 'anonymized' WHERE name IN
 | 
				
			||||||
      ('documentId', 'documentSecret', 'encryptedDataKey',
 | 
					      ('documentId', 'documentSecret', 'encryptedDataKey',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ noBackup=false
 | 
				
			|||||||
# host=0.0.0.0
 | 
					# host=0.0.0.0
 | 
				
			||||||
# port setting is relevant only for web deployments, desktop builds run on a fixed port (changeable with TRILIUM_PORT environment variable)
 | 
					# port setting is relevant only for web deployments, desktop builds run on a fixed port (changeable with TRILIUM_PORT environment variable)
 | 
				
			||||||
port=8080
 | 
					port=8080
 | 
				
			||||||
# true for TLS/SSL/HTTPS (secure), false for HTTP (unsecure).
 | 
					# true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
 | 
				
			||||||
https=false
 | 
					https=false
 | 
				
			||||||
# path to certificate (run "bash bin/generate-cert.sh" to generate self-signed certificate). Relevant only if https=true
 | 
					# path to certificate (run "bash bin/generate-cert.sh" to generate self-signed certificate). Relevant only if https=true
 | 
				
			||||||
certPath=
 | 
					certPath=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
- isDeleted = 0 by default
 | 
					- isDeleted = 0 by default
 | 
				
			||||||
- rename openTabs to openNoteContexts
 | 
					 | 
				
			||||||
- unify readOnly handling to a single attribute:
 | 
					- unify readOnly handling to a single attribute:
 | 
				
			||||||
  * readOnly - like now
 | 
					  * readOnly - like now
 | 
				
			||||||
  * readOnly=auto - like without readOnly (used to override inherited readOnly)
 | 
					  * readOnly=auto - like without readOnly (used to override inherited readOnly)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								db/demo.zip
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								db/demo.zip
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1 +0,0 @@
 | 
				
			|||||||
module.exports = () => console.log("NOOP, moved to migration 0189");
 | 
					 | 
				
			||||||
@@ -1,4 +0,0 @@
 | 
				
			|||||||
-- black theme has been removed, dark is closest replacement
 | 
					 | 
				
			||||||
UPDATE options SET value = 'dark' WHERE name = 'theme' AND value = 'black';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE options SET value = 'light' WHERE name = 'theme' AND value = 'white';
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
ALTER TABLE branches DROP COLUMN utcDateCreated;
 | 
					 | 
				
			||||||
ALTER TABLE options DROP COLUMN utcDateCreated;
 | 
					 | 
				
			||||||
@@ -1,33 +0,0 @@
 | 
				
			|||||||
CREATE TABLE IF NOT EXISTS "mig_entity_changes" (
 | 
					 | 
				
			||||||
                                                `id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
 | 
					 | 
				
			||||||
                                                `entityName`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                `entityId`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                `hash`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                `isErased` INT NOT NULL,
 | 
					 | 
				
			||||||
                                                `changeId` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                `sourceId` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                `isSynced` INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                                                `utcDateChanged` TEXT NOT NULL
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSERT INTO mig_entity_changes (id, entityName, entityId, hash, isErased, changeId, sourceId, isSynced, utcDateChanged)
 | 
					 | 
				
			||||||
    SELECT id, entityName, entityId, hash, isErased, '', sourceId, isSynced, utcDateChanged FROM entity_changes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- delete duplicates https://github.com/zadam/trilium/issues/2534
 | 
					 | 
				
			||||||
DELETE FROM mig_entity_changes WHERE isErased = 0 AND id IN (
 | 
					 | 
				
			||||||
    SELECT id FROM mig_entity_changes ec
 | 
					 | 
				
			||||||
    WHERE (
 | 
					 | 
				
			||||||
              SELECT COUNT(*) FROM mig_entity_changes
 | 
					 | 
				
			||||||
              WHERE ec.entityName = mig_entity_changes.entityName
 | 
					 | 
				
			||||||
                AND ec.entityId = mig_entity_changes.entityId
 | 
					 | 
				
			||||||
          ) > 1
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DROP TABLE entity_changes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ALTER TABLE mig_entity_changes RENAME TO entity_changes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CREATE UNIQUE INDEX `IDX_entityChanges_entityName_entityId` ON "entity_changes" (
 | 
					 | 
				
			||||||
                                                                                 `entityName`,
 | 
					 | 
				
			||||||
                                                                                 `entityId`
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
UPDATE branches SET branchId = 'hidden' where branchId = (
 | 
					 | 
				
			||||||
    SELECT branchId FROM branches
 | 
					 | 
				
			||||||
    WHERE parentNoteId = 'root'
 | 
					 | 
				
			||||||
      AND noteId = 'hidden'
 | 
					 | 
				
			||||||
      AND isDeleted = 0
 | 
					 | 
				
			||||||
    ORDER BY utcDateModified
 | 
					 | 
				
			||||||
    LIMIT 1
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
DELETE FROM options WHERE name = 'username';
 | 
					 | 
				
			||||||
@@ -1,15 +0,0 @@
 | 
				
			|||||||
CREATE TABLE IF NOT EXISTS "etapi_tokens"
 | 
					 | 
				
			||||||
(
 | 
					 | 
				
			||||||
    etapiTokenId TEXT PRIMARY KEY NOT NULL,
 | 
					 | 
				
			||||||
    name TEXT NOT NULL,
 | 
					 | 
				
			||||||
    tokenHash TEXT NOT NULL,
 | 
					 | 
				
			||||||
    utcDateCreated TEXT NOT NULL,
 | 
					 | 
				
			||||||
    utcDateModified TEXT NOT NULL,
 | 
					 | 
				
			||||||
    isDeleted INT NOT NULL DEFAULT 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSERT INTO etapi_tokens (etapiTokenId, name, tokenHash, utcDateCreated, utcDateModified, isDeleted)
 | 
					 | 
				
			||||||
SELECT apiTokenId, 'Trilium Sender', token, utcDateCreated, utcDateCreated, isDeleted FROM api_tokens;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DROP TABLE api_tokens;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityName = 'etapi_tokens' WHERE entityName = 'api_tokens';
 | 
					 | 
				
			||||||
@@ -1,10 +0,0 @@
 | 
				
			|||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const sql = require('../../src/services/sql');
 | 
					 | 
				
			||||||
    const crypto = require('crypto');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (const {etapiTokenId, token} of sql.getRows("SELECT etapiTokenId, tokenHash AS token FROM etapi_tokens")) {
 | 
					 | 
				
			||||||
        const tokenHash = crypto.createHash('sha256').update(token).digest('base64');
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        sql.execute(`UPDATE etapi_tokens SET tokenHash = ? WHERE etapiTokenId = ?`, [tokenHash, etapiTokenId]);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,20 +0,0 @@
 | 
				
			|||||||
DROP TABLE entity_changes;
 | 
					 | 
				
			||||||
-- not preserving the data because of https://github.com/zadam/trilium/issues/3447
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CREATE TABLE IF NOT EXISTS "entity_changes" (
 | 
					 | 
				
			||||||
                                                    `id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
 | 
					 | 
				
			||||||
                                                    `entityName`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `entityId`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `hash`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `isErased` INT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `changeId` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `componentId` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `instanceId` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                                    `isSynced` INTEGER NOT NULL,
 | 
					 | 
				
			||||||
                                                    `utcDateChanged` TEXT NOT NULL
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CREATE UNIQUE INDEX `IDX_entityChanges_entityName_entityId` ON "entity_changes" (
 | 
					 | 
				
			||||||
                                                                                 `entityName`,
 | 
					 | 
				
			||||||
                                                                                 `entityId`
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
CREATE INDEX `IDX_entity_changes_changeId` ON `entity_changes` (`changeId`);
 | 
					 | 
				
			||||||
@@ -1,15 +0,0 @@
 | 
				
			|||||||
const becca = require('../../src/becca/becca');
 | 
					 | 
				
			||||||
const beccaLoader = require('../../src/becca/becca_loader');
 | 
					 | 
				
			||||||
const cls = require('../../src/services/cls');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const note of Object.values(becca.notes)) {
 | 
					 | 
				
			||||||
            if (note.hasLabel('calendarRoot')) {
 | 
					 | 
				
			||||||
                note.addLabel('excludeFromNoteMap', "", true);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
-- removing potential remnants of recent notes in entity changes, see https://github.com/zadam/trilium/issues/2842
 | 
					 | 
				
			||||||
DELETE FROM entity_changes WHERE entityName = 'recent_notes';
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
UPDATE attributes SET value = replace(value, 'setLabelValue', 'updateLabelValue') WHERE name = 'action' AND type = 'label';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = replace(value, 'setRelationTarget', 'updateRelationTarget') WHERE name = 'action' AND type = 'label';
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
module.exports = () => console.log("NOOP, increased because of protected notes IV change");
 | 
					 | 
				
			||||||
@@ -1,6 +0,0 @@
 | 
				
			|||||||
UPDATE branches SET branchId = '_hidden__search' WHERE parentNoteId = 'hidden' AND noteId = 'search' AND isDeleted = 0;
 | 
					 | 
				
			||||||
UPDATE branches SET branchId = 'root__globalNoteMap' WHERE parentNoteId = 'singles' AND noteId = 'globalnotemap' AND isDeleted = 0;
 | 
					 | 
				
			||||||
UPDATE branches SET branchId = '_hidden__sqlConsole' WHERE parentNoteId = 'hidden' AND noteId = 'sqlconsole' AND isDeleted = 0;
 | 
					 | 
				
			||||||
UPDATE branches SET branchId = 'root__hidden' WHERE parentNoteId = 'root' AND noteId = 'hidden' AND isDeleted = 0;
 | 
					 | 
				
			||||||
UPDATE branches SET branchId = '_hidden__bulkAction' WHERE parentNoteId = 'hidden' AND noteId = 'bulkaction' AND isDeleted = 0;
 | 
					 | 
				
			||||||
UPDATE branches SET branchId = '_hidden__share' WHERE parentNoteId = 'root' AND noteId = 'share' AND isDeleted = 0;
 | 
					 | 
				
			||||||
@@ -1,53 +0,0 @@
 | 
				
			|||||||
UPDATE notes SET noteId = '_globalNoteMap', title = 'Note Map' WHERE noteId = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE note_contents SET noteId = '_globalNoteMap' WHERE noteId = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE note_revisions SET noteId = '_globalNoteMap' WHERE noteId = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE branches SET noteId = '_globalNoteMap' WHERE noteId = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_globalNoteMap' WHERE parentNoteId = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE attributes SET noteId = '_globalNoteMap' WHERE noteId = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = '_globalNoteMap' WHERE type = 'relation' AND value = 'globalnotemap';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = '_globalNoteMap' WHERE entityId = 'globalnotemap';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE notes SET noteId = '_bulkAction', title = 'Bulk Action' WHERE noteId = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE note_contents SET noteId = '_bulkAction' WHERE noteId = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE note_revisions SET noteId = '_bulkAction' WHERE noteId = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_bulkAction' WHERE parentNoteId = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE branches SET noteId = '_bulkAction' WHERE noteId = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE attributes SET noteId = '_bulkAction' WHERE noteId = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = '_bulkAction' WHERE type = 'relation' AND value = 'bulkaction';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = '_bulkAction' WHERE entityId = 'bulkaction';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE notes SET noteId = '_sqlConsole', title = 'SQL Console History' WHERE noteId = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE note_contents SET noteId = '_sqlConsole' WHERE noteId = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE note_revisions SET noteId = '_sqlConsole' WHERE noteId = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE branches SET noteId = '_sqlConsole' WHERE noteId = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_sqlConsole' WHERE parentNoteId = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE attributes SET noteId = '_sqlConsole' WHERE noteId = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = '_sqlConsole' WHERE type = 'relation' AND value = 'sqlconsole';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = '_sqlConsole' WHERE entityId = 'sqlconsole';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE notes SET noteId = '_hidden', title = 'Hidden Notes' WHERE noteId = 'hidden';
 | 
					 | 
				
			||||||
UPDATE note_contents SET noteId = '_hidden' WHERE noteId = 'hidden';
 | 
					 | 
				
			||||||
UPDATE note_revisions SET noteId = '_hidden' WHERE noteId = 'hidden';
 | 
					 | 
				
			||||||
UPDATE branches SET noteId = '_hidden', prefix = NULL WHERE noteId = 'hidden';
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_hidden' WHERE parentNoteId = 'hidden';
 | 
					 | 
				
			||||||
UPDATE attributes SET noteId = '_hidden' WHERE noteId = 'hidden';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = '_hidden' WHERE type = 'relation' AND value = 'hidden';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = '_hidden' WHERE entityId = 'hidden';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE notes SET noteId = '_search', title = 'Search History' WHERE noteId = 'search';
 | 
					 | 
				
			||||||
UPDATE note_contents SET noteId = '_search' WHERE noteId = 'search';
 | 
					 | 
				
			||||||
UPDATE note_revisions SET noteId = '_search' WHERE noteId = 'search';
 | 
					 | 
				
			||||||
UPDATE branches SET noteId = '_search' WHERE noteId = 'search';
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_search' WHERE parentNoteId = 'search';
 | 
					 | 
				
			||||||
UPDATE attributes SET noteId = '_search' WHERE noteId = 'search';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = '_search' WHERE type = 'relation' AND value = 'search';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = '_search' WHERE entityId = 'search';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE notes SET noteId = '_share', title = 'Shared Notes' WHERE noteId = 'share';
 | 
					 | 
				
			||||||
UPDATE note_contents SET noteId = '_share' WHERE noteId = 'share';
 | 
					 | 
				
			||||||
UPDATE note_revisions SET noteId = '_share' WHERE noteId = 'share';
 | 
					 | 
				
			||||||
UPDATE branches SET noteId = '_share' WHERE noteId = 'share';
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_share' WHERE parentNoteId = 'share';
 | 
					 | 
				
			||||||
UPDATE attributes SET noteId = '_share' WHERE noteId = 'share';
 | 
					 | 
				
			||||||
UPDATE attributes SET value = '_share' WHERE type = 'relation' AND value = 'share';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = '_share' WHERE entityId = 'share';
 | 
					 | 
				
			||||||
@@ -1,12 +0,0 @@
 | 
				
			|||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const hiddenSubtreeService = require('../../src/services/hidden_subtree');
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
        // make sure the hidden subtree exists since the subsequent migrations we will move some existing notes into it (share...)
 | 
					 | 
				
			||||||
        // in previous releases hidden subtree was created lazily
 | 
					 | 
				
			||||||
        hiddenSubtreeService.checkHiddenSubtree(true);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
DELETE FROM branches WHERE noteId = '_share' AND parentNoteId != 'root' AND parentNoteId != '_hidden'; -- delete all other branches of _share if any
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_hidden' WHERE noteId = '_share';
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
DELETE FROM branches WHERE noteId = '_globalNoteMap' AND parentNoteId != 'singles' AND parentNoteId != '_hidden'; -- make sure there are no clones which would fail at the next line
 | 
					 | 
				
			||||||
UPDATE branches SET parentNoteId = '_hidden' WHERE noteId = '_globalNoteMap';
 | 
					 | 
				
			||||||
@@ -1,6 +0,0 @@
 | 
				
			|||||||
DELETE FROM branches WHERE noteId = 'singles';
 | 
					 | 
				
			||||||
DELETE FROM notes WHERE noteId = 'singles';
 | 
					 | 
				
			||||||
DELETE FROM note_contents WHERE noteId = 'singles';
 | 
					 | 
				
			||||||
DELETE FROM note_revisions WHERE noteId = 'singles';
 | 
					 | 
				
			||||||
DELETE FROM attributes WHERE noteId = 'singles';
 | 
					 | 
				
			||||||
DELETE FROM entity_changes WHERE entityId = 'singles';
 | 
					 | 
				
			||||||
@@ -1,21 +0,0 @@
 | 
				
			|||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const cloningService = require("../../src/services/cloning");
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
    const becca = require("../../src/becca/becca");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const attr of becca.findAttributes('label','bookmarked')) {
 | 
					 | 
				
			||||||
            cloningService.toggleNoteInParent(true, attr.noteId, '_lbBookmarks');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            attr.markAsDeleted("0204__migrate_bookmarks_to_clones");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // bookmarkFolder used to work in 0.57 without the bookmarked label
 | 
					 | 
				
			||||||
        for (const attr of becca.findAttributes('label','bookmarkFolder')) {
 | 
					 | 
				
			||||||
            cloningService.toggleNoteInParent(true, attr.noteId, '_lbBookmarks');
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
UPDATE notes SET type = 'relationMap' WHERE type = 'relation-map';
 | 
					 | 
				
			||||||
UPDATE notes SET type = 'noteMap' WHERE type = 'note-map';
 | 
					 | 
				
			||||||
UPDATE notes SET type = 'webView' WHERE type = 'web-view';
 | 
					 | 
				
			||||||
@@ -1,33 +0,0 @@
 | 
				
			|||||||
// the history was previously not exposed and the fact they were not cleaned up is rather a side-effect than an intention
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
    const becca = require("../../src/becca/becca");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // deleting just branches because they might be cloned (and therefore saved) also outside of the hidden subtree
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const searchRoot = becca.getNote('_search');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const searchBranch of searchRoot.getChildBranches()) {
 | 
					 | 
				
			||||||
            const searchNote = searchBranch.getNote();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (searchNote.type === 'search') {
 | 
					 | 
				
			||||||
                searchBranch.deleteBranch('0206__delete_search_and_sql_console_history');
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const sqlConsoleRoot = becca.getNote('_sqlConsole');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const sqlConsoleBranch of sqlConsoleRoot.getChildBranches()) {
 | 
					 | 
				
			||||||
            const sqlConsoleNote = sqlConsoleBranch.getNote();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (sqlConsoleNote.type === 'code' && sqlConsoleNote.mime === 'text/x-sqlite;schema=trilium') {
 | 
					 | 
				
			||||||
                sqlConsoleBranch.deleteBranch('0206__delete_search_and_sql_console_history');
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,2 +0,0 @@
 | 
				
			|||||||
UPDATE notes SET title = 'SQL Console History' WHERE noteId = '_sqlConsole';
 | 
					 | 
				
			||||||
UPDATE notes SET title = 'Search History' WHERE noteId = '_search';
 | 
					 | 
				
			||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
    const becca = require("../../src/becca/becca");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const label of becca.getNote('_hidden').getLabels('archived')) {
 | 
					 | 
				
			||||||
            label.markAsDeleted('0208__remove_archived_from_hidden');
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
UPDATE attributes SET name = 'workspaceInbox' WHERE type = 'label' AND name = 'hoistedInbox';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = 'workspaceInbox' WHERE entityName = 'attributes' AND entityId = 'hoistedInbox';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE attributes SET name = 'workspaceSearchHome' WHERE type = 'label' AND name = 'hoistedSearchHome';
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = 'workspaceSearchHome' WHERE entityName = 'attributes' AND entityId = 'hoistedSearchHome';
 | 
					 | 
				
			||||||
@@ -1,24 +0,0 @@
 | 
				
			|||||||
module.exports = async () => {
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
    const log = require("../../src/services/log");
 | 
					 | 
				
			||||||
    const consistencyChecks = require("../../src/services/consistency_checks");
 | 
					 | 
				
			||||||
    const noteService = require("../../src/services/notes");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await cls.init(async () => {
 | 
					 | 
				
			||||||
        // precaution for the 0211 migration
 | 
					 | 
				
			||||||
        noteService.eraseDeletedNotesNow();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            // precaution before running 211 which might produce unique constraint problems if the DB was not consistent
 | 
					 | 
				
			||||||
            consistencyChecks.runOnDemandChecksWithoutExclusiveLock(true);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        catch (e) {
 | 
					 | 
				
			||||||
            // consistency checks might start failing in the future if there's some incompatible migration down the road
 | 
					 | 
				
			||||||
            // we can optimistically assume the DB is consistent and still continue
 | 
					 | 
				
			||||||
            log.error(`Consistency checks failed in migration 0210: ${e.message} ${e.stack}`);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,12 +0,0 @@
 | 
				
			|||||||
-- case based on isDeleted is needed, otherwise 2 branches (1 deleted, 1 not) might get the same ID
 | 
					 | 
				
			||||||
UPDATE entity_changes SET entityId = COALESCE((
 | 
					 | 
				
			||||||
    SELECT
 | 
					 | 
				
			||||||
        CASE isDeleted
 | 
					 | 
				
			||||||
            WHEN 0 THEN parentNoteId || '_' || noteId
 | 
					 | 
				
			||||||
            WHEN 1 THEN branchId
 | 
					 | 
				
			||||||
        END
 | 
					 | 
				
			||||||
    FROM branches WHERE branchId = entityId
 | 
					 | 
				
			||||||
), entityId)
 | 
					 | 
				
			||||||
WHERE entityName = 'branches' AND isErased = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
UPDATE branches SET branchId = parentNoteId || '_' || noteId WHERE isDeleted = 0;
 | 
					 | 
				
			||||||
@@ -1,27 +0,0 @@
 | 
				
			|||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
    const becca = require("../../src/becca/becca");
 | 
					 | 
				
			||||||
    const log = require("../../src/services/log");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const hidden = becca.getNote("_hidden");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!hidden) {
 | 
					 | 
				
			||||||
            log.info("MIGRATION 212: no _hidden note, skipping.");
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const noteId of hidden.getSubtreeNoteIds({includeHidden: true})) {
 | 
					 | 
				
			||||||
            if (noteId.startsWith("_")) { // is "named" note
 | 
					 | 
				
			||||||
                const note = becca.getNote(noteId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                for (const attr of note.getOwnedAttributes()) {
 | 
					 | 
				
			||||||
                    attr.markAsDeleted("0212__delete_all_attributes_of_named_notes");
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
@@ -1,48 +0,0 @@
 | 
				
			|||||||
module.exports = () => {
 | 
					 | 
				
			||||||
    const beccaLoader = require("../../src/becca/becca_loader");
 | 
					 | 
				
			||||||
    const becca = require("../../src/becca/becca");
 | 
					 | 
				
			||||||
    const cls = require("../../src/services/cls");
 | 
					 | 
				
			||||||
    const log = require("../../src/services/log");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls.init(() => {
 | 
					 | 
				
			||||||
        beccaLoader.load();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const note of Object.values(becca.notes)) {
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                if (!note.isJavaScript()) {
 | 
					 | 
				
			||||||
                    continue;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (!note.mime?.endsWith('env=frontend') && !note.mime?.endsWith('env=backend')) {
 | 
					 | 
				
			||||||
                    continue;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                const origContent = note.getContent().toString();
 | 
					 | 
				
			||||||
                const fixedContent = origContent
 | 
					 | 
				
			||||||
                    .replaceAll("runOnServer", "runOnBackend")
 | 
					 | 
				
			||||||
                    .replaceAll("api.refreshTree()", "")
 | 
					 | 
				
			||||||
                    .replaceAll("addTextToActiveTabEditor", "addTextToActiveContextEditor")
 | 
					 | 
				
			||||||
                    .replaceAll("getActiveTabNote", "getActiveContextNote")
 | 
					 | 
				
			||||||
                    .replaceAll("getActiveTabTextEditor", "getActiveContextTextEditor")
 | 
					 | 
				
			||||||
                    .replaceAll("getActiveTabNotePath", "getActiveContextNotePath")
 | 
					 | 
				
			||||||
                    .replaceAll("getDateNote", "getDayNote")
 | 
					 | 
				
			||||||
                    .replaceAll("utils.unescapeHtml", "unescapeHtml")
 | 
					 | 
				
			||||||
                    .replaceAll("sortNotesByTitle", "sortNotes")
 | 
					 | 
				
			||||||
                    .replaceAll("CollapsibleWidget", "RightPanelWidget")
 | 
					 | 
				
			||||||
                    .replaceAll("TabAwareWidget", "NoteContextAwareWidget")
 | 
					 | 
				
			||||||
                    .replaceAll("TabCachingWidget", "NoteContextAwareWidget")
 | 
					 | 
				
			||||||
                    .replaceAll("NoteContextCachingWidget", "NoteContextAwareWidget");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (origContent !== fixedContent) {
 | 
					 | 
				
			||||||
                    log.info(`Replacing legacy API calls for note '${note.noteId}'`);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    note.saveNoteRevision();
 | 
					 | 
				
			||||||
                    note.setContent(fixedContent);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch (e) {
 | 
					 | 
				
			||||||
                log.error(`Error during migration to 213 for note '${note.noteId}': ${e.message} ${e.stack}`);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										10
									
								
								db/migrations/0215__content_structure.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								db/migrations/0215__content_structure.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS "blobs" (
 | 
				
			||||||
 | 
					                                               `blobId`	TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                               `content`	TEXT NULL DEFAULT NULL,
 | 
				
			||||||
 | 
					                                               `dateModified` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                               `utcDateModified` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                               PRIMARY KEY(`blobId`)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ALTER TABLE notes ADD blobId TEXT DEFAULT NULL;
 | 
				
			||||||
 | 
					ALTER TABLE note_revisions ADD blobId TEXT DEFAULT NULL;
 | 
				
			||||||
							
								
								
									
										62
									
								
								db/migrations/0216__move_content_into_blobs.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								db/migrations/0216__move_content_into_blobs.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					module.exports = () => {
 | 
				
			||||||
 | 
					    const sql = require("../../src/services/sql");
 | 
				
			||||||
 | 
					    const utils = require("../../src/services/utils");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const existingBlobIds = new Set();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const noteId of sql.getColumn(`SELECT noteId FROM note_contents`)) {
 | 
				
			||||||
 | 
					        const row = sql.getRow(`SELECT noteId, content, dateModified, utcDateModified FROM note_contents WHERE noteId = ?`, [noteId]);
 | 
				
			||||||
 | 
					        const blobId = utils.hashedBlobId(row.content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!existingBlobIds.has(blobId)) {
 | 
				
			||||||
 | 
					            existingBlobIds.add(blobId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql.insert('blobs', {
 | 
				
			||||||
 | 
					                blobId,
 | 
				
			||||||
 | 
					                content: row.content,
 | 
				
			||||||
 | 
					                dateModified: row.dateModified,
 | 
				
			||||||
 | 
					                utcDateModified: row.utcDateModified
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql.execute("UPDATE entity_changes SET entityName = 'blobs', entityId = ? WHERE entityName = 'note_contents' AND entityId = ?", [blobId, row.noteId]);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // duplicates
 | 
				
			||||||
 | 
					            sql.execute("DELETE FROM entity_changes WHERE entityName = 'note_contents' AND entityId = ?", [row.noteId]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sql.execute('UPDATE notes SET blobId = ? WHERE noteId = ?', [blobId, row.noteId]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const noteRevisionId of sql.getColumn(`SELECT noteRevisionId FROM note_revision_contents`)) {
 | 
				
			||||||
 | 
					        const row = sql.getRow(`SELECT noteRevisionId, content, utcDateModified FROM note_revision_contents WHERE noteRevisionId = ?`, [noteRevisionId]);
 | 
				
			||||||
 | 
					        const blobId = utils.hashedBlobId(row.content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!existingBlobIds.has(blobId)) {
 | 
				
			||||||
 | 
					            existingBlobIds.add(blobId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql.insert('blobs', {
 | 
				
			||||||
 | 
					                blobId,
 | 
				
			||||||
 | 
					                content: row.content,
 | 
				
			||||||
 | 
					                dateModified: row.utcDateModified,
 | 
				
			||||||
 | 
					                utcDateModified: row.utcDateModified
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            sql.execute("UPDATE entity_changes SET entityName = 'blobs', entityId = ? WHERE entityName = 'note_revision_contents' AND entityId = ?", [blobId, row.noteRevisionId]);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // duplicates
 | 
				
			||||||
 | 
					            sql.execute("DELETE FROM entity_changes WHERE entityName = 'note_revision_contents' AND entityId = ?", [row.noteId]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sql.execute('UPDATE note_revisions SET blobId = ? WHERE noteRevisionId = ?', [blobId, row.noteRevisionId]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const notesWithoutBlobIds = sql.getColumn("SELECT noteId FROM notes WHERE blobId IS NULL");
 | 
				
			||||||
 | 
					    if (notesWithoutBlobIds.length > 0) {
 | 
				
			||||||
 | 
					        throw new Error("BlobIds were not filled correctly in notes: " + JSON.stringify(notesWithoutBlobIds));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const noteRevisionsWithoutBlobIds = sql.getColumn("SELECT noteRevisionId FROM note_revisions WHERE blobId IS NULL");
 | 
				
			||||||
 | 
					    if (noteRevisionsWithoutBlobIds.length > 0) {
 | 
				
			||||||
 | 
					        throw new Error("BlobIds were not filled correctly in note revisions: " + JSON.stringify(noteRevisionsWithoutBlobIds));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										4
									
								
								db/migrations/0217__drop_content_tables.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								db/migrations/0217__drop_content_tables.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					DROP TABLE note_contents;
 | 
				
			||||||
 | 
					DROP TABLE note_revision_contents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DELETE FROM entity_changes WHERE entityName IN ('note_contents', 'note_revision_contents');
 | 
				
			||||||
							
								
								
									
										25
									
								
								db/migrations/0218__rename_note_revision_to_revision.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								db/migrations/0218__rename_note_revision_to_revision.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS "revisions" (`revisionId`	TEXT NOT NULL PRIMARY KEY,
 | 
				
			||||||
 | 
					                                        `noteId`	TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                        type TEXT DEFAULT '' NOT NULL,
 | 
				
			||||||
 | 
					                                        mime TEXT DEFAULT '' NOT NULL,
 | 
				
			||||||
 | 
					                                        `title`	TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                        `isProtected`	INT NOT NULL DEFAULT 0,
 | 
				
			||||||
 | 
					                                        blobId TEXT DEFAULT NULL,
 | 
				
			||||||
 | 
					                                        `utcDateLastEdited` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                        `utcDateCreated` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                        `utcDateModified` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                        `dateLastEdited` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                        `dateCreated` TEXT NOT NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					INSERT INTO revisions (revisionId, noteId, type, mime, title, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, blobId)
 | 
				
			||||||
 | 
					SELECT noteRevisionId, noteId, type, mime, title, isProtected, utcDateLastEdited, utcDateCreated, utcDateModified, dateLastEdited, dateCreated, blobId FROM note_revisions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TABLE note_revisions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX `IDX_revisions_noteId` ON `revisions` (`noteId`);
 | 
				
			||||||
 | 
					CREATE INDEX `IDX_revisions_utcDateCreated` ON `revisions` (`utcDateCreated`);
 | 
				
			||||||
 | 
					CREATE INDEX `IDX_revisions_utcDateLastEdited` ON `revisions` (`utcDateLastEdited`);
 | 
				
			||||||
 | 
					CREATE INDEX `IDX_revisions_dateCreated` ON `revisions` (`dateCreated`);
 | 
				
			||||||
 | 
					CREATE INDEX `IDX_revisions_dateLastEdited` ON `revisions` (`dateLastEdited`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE entity_changes SET entityName = 'revisions' WHERE entityName = 'note_revisions';
 | 
				
			||||||
							
								
								
									
										21
									
								
								db/migrations/0219__attachments.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								db/migrations/0219__attachments.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS "attachments"
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    attachmentId      TEXT not null primary key,
 | 
				
			||||||
 | 
					    ownerId       TEXT not null,
 | 
				
			||||||
 | 
					    role         TEXT not null,
 | 
				
			||||||
 | 
					    mime         TEXT not null,
 | 
				
			||||||
 | 
					    title         TEXT not null,
 | 
				
			||||||
 | 
					    isProtected    INT  not null DEFAULT 0,
 | 
				
			||||||
 | 
					    position     INT  default 0 not null,
 | 
				
			||||||
 | 
					    blobId    TEXT DEFAULT null,
 | 
				
			||||||
 | 
					    dateModified TEXT NOT NULL,
 | 
				
			||||||
 | 
					    utcDateModified TEXT not null,
 | 
				
			||||||
 | 
					    utcDateScheduledForErasureSince TEXT DEFAULT NULL,
 | 
				
			||||||
 | 
					    isDeleted    INT  not null,
 | 
				
			||||||
 | 
					    deleteId    TEXT DEFAULT NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX IDX_attachments_ownerId_role
 | 
				
			||||||
 | 
					    on attachments (ownerId, role);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX IDX_attachments_utcDateScheduledForErasureSince
 | 
				
			||||||
 | 
					    on attachments (utcDateScheduledForErasureSince);
 | 
				
			||||||
							
								
								
									
										27
									
								
								db/migrations/0220__migrate_images_to_attachments.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								db/migrations/0220__migrate_images_to_attachments.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					module.exports = () => {
 | 
				
			||||||
 | 
					    const beccaLoader = require("../../src/becca/becca_loader");
 | 
				
			||||||
 | 
					    const becca = require("../../src/becca/becca");
 | 
				
			||||||
 | 
					    const cls = require("../../src/services/cls");
 | 
				
			||||||
 | 
					    const log = require("../../src/services/log");
 | 
				
			||||||
 | 
					    const sql = require("../../src/services/sql");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cls.init(() => {
 | 
				
			||||||
 | 
					        // emergency disabling of image compression since it appears to make problems in migration to 0.61
 | 
				
			||||||
 | 
					        sql.execute(`UPDATE options SET value = 'false' WHERE name = 'compressImages'`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        beccaLoader.load();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const note of Object.values(becca.notes)) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                const attachment = note.convertToParentAttachment({autoConversion: true});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (attachment) {
 | 
				
			||||||
 | 
					                    log.info(`Auto-converted note '${note.noteId}' into attachment '${attachment.attachmentId}'.`);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (e) {
 | 
				
			||||||
 | 
					                log.error(`Cannot convert note '${note.noteId}' to attachment: ${e.message} ${e.stack}`);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					DELETE FROM options WHERE name = 'hideIncludedImages_main';
 | 
				
			||||||
 | 
					DELETE FROM entity_changes WHERE entityName = 'options' AND entityId = 'hideIncludedImages_main';
 | 
				
			||||||
@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					UPDATE options SET name = 'openNoteContexts' WHERE name = 'openTabs';
 | 
				
			||||||
 | 
					UPDATE entity_changes SET entityId = 'openNoteContexts' WHERE entityName = 'options' AND entityId = 'openTabs';
 | 
				
			||||||
							
								
								
									
										1
									
								
								db/migrations/0223__NOOP.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								db/migrations/0223__NOOP.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					SELECT 1;
 | 
				
			||||||
							
								
								
									
										14
									
								
								db/migrations/0224__fix_blobIds.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								db/migrations/0224__fix_blobIds.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					UPDATE blobs SET blobId = REPLACE(blobId, '+', 'X');
 | 
				
			||||||
 | 
					UPDATE blobs SET blobId = REPLACE(blobId, '/', 'Y');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE notes SET blobId = REPLACE(blobId, '+', 'X');
 | 
				
			||||||
 | 
					UPDATE notes SET blobId = REPLACE(blobId, '/', 'Y');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE attachments SET blobId = REPLACE(blobId, '+', 'X');
 | 
				
			||||||
 | 
					UPDATE attachments SET blobId = REPLACE(blobId, '/', 'Y');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE revisions SET blobId = REPLACE(blobId, '+', 'X');
 | 
				
			||||||
 | 
					UPDATE revisions SET blobId = REPLACE(blobId, '/', 'Y');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UPDATE entity_changes SET entityId = REPLACE(entityId, '+', 'X') WHERE entityName = 'blobs';
 | 
				
			||||||
 | 
					UPDATE entity_changes SET entityId = REPLACE(entityId, '/', 'Y') WHERE entityName = 'blobs';
 | 
				
			||||||
							
								
								
									
										3
									
								
								db/migrations/0225__create_blobId_indices.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								db/migrations/0225__create_blobId_indices.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					CREATE INDEX IF NOT EXISTS IDX_notes_blobId on notes (blobId);
 | 
				
			||||||
 | 
					CREATE INDEX IF NOT EXISTS IDX_revisions_blobId on revisions (blobId);
 | 
				
			||||||
 | 
					CREATE INDEX IF NOT EXISTS IDX_attachments_blobId on attachments (blobId);
 | 
				
			||||||
							
								
								
									
										1
									
								
								db/migrations/0226__rename_noteSize_label.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								db/migrations/0226__rename_noteSize_label.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					UPDATE attributes SET value = 'contentAndAttachmentsAndRevisionsSize' WHERE name = 'orderBy' AND value = 'noteSize';
 | 
				
			||||||
							
								
								
									
										2
									
								
								db/migrations/0227__disable_image_compression.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								db/migrations/0227__disable_image_compression.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					-- emergency disabling of image compression since it appears to make problems in migration to 0.61
 | 
				
			||||||
 | 
					UPDATE options SET value = 'false' WHERE name = 'compressImages';
 | 
				
			||||||
@@ -35,6 +35,7 @@ CREATE TABLE IF NOT EXISTS "notes" (
 | 
				
			|||||||
                                       `isProtected`	INT NOT NULL DEFAULT 0,
 | 
					                                       `isProtected`	INT NOT NULL DEFAULT 0,
 | 
				
			||||||
                                       `type` TEXT NOT NULL DEFAULT 'text',
 | 
					                                       `type` TEXT NOT NULL DEFAULT 'text',
 | 
				
			||||||
                                       `mime` TEXT NOT NULL DEFAULT 'text/html',
 | 
					                                       `mime` TEXT NOT NULL DEFAULT 'text/html',
 | 
				
			||||||
 | 
					                                       blobId TEXT DEFAULT NULL,
 | 
				
			||||||
                                       `isDeleted`	INT NOT NULL DEFAULT 0,
 | 
					                                       `isDeleted`	INT NOT NULL DEFAULT 0,
 | 
				
			||||||
                                       `deleteId`   TEXT DEFAULT NULL,
 | 
					                                       `deleteId`   TEXT DEFAULT NULL,
 | 
				
			||||||
                                       `dateCreated`	TEXT NOT NULL,
 | 
					                                       `dateCreated`	TEXT NOT NULL,
 | 
				
			||||||
@@ -42,27 +43,18 @@ CREATE TABLE IF NOT EXISTS "notes" (
 | 
				
			|||||||
                                       `utcDateCreated`	TEXT NOT NULL,
 | 
					                                       `utcDateCreated`	TEXT NOT NULL,
 | 
				
			||||||
                                       `utcDateModified`	TEXT NOT NULL,
 | 
					                                       `utcDateModified`	TEXT NOT NULL,
 | 
				
			||||||
                                       PRIMARY KEY(`noteId`));
 | 
					                                       PRIMARY KEY(`noteId`));
 | 
				
			||||||
CREATE TABLE IF NOT EXISTS "note_contents" (
 | 
					CREATE TABLE IF NOT EXISTS "revisions" (`revisionId`	TEXT NOT NULL PRIMARY KEY,
 | 
				
			||||||
                                               `noteId`	TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                               `content`	TEXT NULL DEFAULT NULL,
 | 
					 | 
				
			||||||
                                               `dateModified` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                               `utcDateModified` TEXT NOT NULL,
 | 
					 | 
				
			||||||
                                               PRIMARY KEY(`noteId`)
 | 
					 | 
				
			||||||
);
 | 
					 | 
				
			||||||
CREATE TABLE IF NOT EXISTS "note_revisions" (`noteRevisionId`	TEXT NOT NULL PRIMARY KEY,
 | 
					 | 
				
			||||||
                                             `noteId`	TEXT NOT NULL,
 | 
					                                             `noteId`	TEXT NOT NULL,
 | 
				
			||||||
                                             type TEXT DEFAULT '' NOT NULL,
 | 
					                                             type TEXT DEFAULT '' NOT NULL,
 | 
				
			||||||
                                             mime TEXT DEFAULT '' NOT NULL,
 | 
					                                             mime TEXT DEFAULT '' NOT NULL,
 | 
				
			||||||
                                             `title`	TEXT NOT NULL,
 | 
					                                             `title`	TEXT NOT NULL,
 | 
				
			||||||
                                             `isProtected`	INT NOT NULL DEFAULT 0,
 | 
					                                             `isProtected`	INT NOT NULL DEFAULT 0,
 | 
				
			||||||
 | 
					                                            blobId TEXT DEFAULT NULL,
 | 
				
			||||||
                                             `utcDateLastEdited` TEXT NOT NULL,
 | 
					                                             `utcDateLastEdited` TEXT NOT NULL,
 | 
				
			||||||
                                             `utcDateCreated` TEXT NOT NULL,
 | 
					                                             `utcDateCreated` TEXT NOT NULL,
 | 
				
			||||||
                                             `utcDateModified` TEXT NOT NULL,
 | 
					                                             `utcDateModified` TEXT NOT NULL,
 | 
				
			||||||
                                             `dateLastEdited` TEXT NOT NULL,
 | 
					                                             `dateLastEdited` TEXT NOT NULL,
 | 
				
			||||||
                                             `dateCreated` TEXT NOT NULL);
 | 
					                                             `dateCreated` TEXT NOT NULL);
 | 
				
			||||||
CREATE TABLE IF NOT EXISTS "note_revision_contents" (`noteRevisionId`	TEXT NOT NULL PRIMARY KEY,
 | 
					 | 
				
			||||||
                                                     `content`	TEXT,
 | 
					 | 
				
			||||||
                                                     `utcDateModified` TEXT NOT NULL);
 | 
					 | 
				
			||||||
CREATE TABLE IF NOT EXISTS "options"
 | 
					CREATE TABLE IF NOT EXISTS "options"
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
    name TEXT not null PRIMARY KEY,
 | 
					    name TEXT not null PRIMARY KEY,
 | 
				
			||||||
@@ -94,11 +86,11 @@ CREATE INDEX `IDX_notes_dateCreated` ON `notes` (`dateCreated`);
 | 
				
			|||||||
CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`);
 | 
					CREATE INDEX `IDX_notes_dateModified` ON `notes` (`dateModified`);
 | 
				
			||||||
CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`);
 | 
					CREATE INDEX `IDX_notes_utcDateModified` ON `notes` (`utcDateModified`);
 | 
				
			||||||
CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`);
 | 
					CREATE INDEX `IDX_notes_utcDateCreated` ON `notes` (`utcDateCreated`);
 | 
				
			||||||
CREATE INDEX `IDX_note_revisions_noteId` ON `note_revisions` (`noteId`);
 | 
					CREATE INDEX `IDX_revisions_noteId` ON `revisions` (`noteId`);
 | 
				
			||||||
CREATE INDEX `IDX_note_revisions_utcDateCreated` ON `note_revisions` (`utcDateCreated`);
 | 
					CREATE INDEX `IDX_revisions_utcDateCreated` ON `revisions` (`utcDateCreated`);
 | 
				
			||||||
CREATE INDEX `IDX_note_revisions_utcDateLastEdited` ON `note_revisions` (`utcDateLastEdited`);
 | 
					CREATE INDEX `IDX_revisions_utcDateLastEdited` ON `revisions` (`utcDateLastEdited`);
 | 
				
			||||||
CREATE INDEX `IDX_note_revisions_dateCreated` ON `note_revisions` (`dateCreated`);
 | 
					CREATE INDEX `IDX_revisions_dateCreated` ON `revisions` (`dateCreated`);
 | 
				
			||||||
CREATE INDEX `IDX_note_revisions_dateLastEdited` ON `note_revisions` (`dateLastEdited`);
 | 
					CREATE INDEX `IDX_revisions_dateLastEdited` ON `revisions` (`dateLastEdited`);
 | 
				
			||||||
CREATE INDEX `IDX_entity_changes_changeId` ON `entity_changes` (`changeId`);
 | 
					CREATE INDEX `IDX_entity_changes_changeId` ON `entity_changes` (`changeId`);
 | 
				
			||||||
CREATE INDEX IDX_attributes_name_value
 | 
					CREATE INDEX IDX_attributes_name_value
 | 
				
			||||||
    on attributes (name, value);
 | 
					    on attributes (name, value);
 | 
				
			||||||
@@ -112,3 +104,31 @@ CREATE TABLE IF NOT EXISTS "recent_notes"
 | 
				
			|||||||
    notePath TEXT not null,
 | 
					    notePath TEXT not null,
 | 
				
			||||||
    utcDateCreated TEXT not null
 | 
					    utcDateCreated TEXT not null
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					CREATE TABLE IF NOT EXISTS "blobs" (
 | 
				
			||||||
 | 
					                                               `blobId`	TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                               `content`	TEXT NULL DEFAULT NULL,
 | 
				
			||||||
 | 
					                                               `dateModified` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                               `utcDateModified` TEXT NOT NULL,
 | 
				
			||||||
 | 
					                                               PRIMARY KEY(`blobId`)
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					CREATE TABLE IF NOT EXISTS "attachments"
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    attachmentId      TEXT not null primary key,
 | 
				
			||||||
 | 
					    ownerId       TEXT not null,
 | 
				
			||||||
 | 
					    role         TEXT not null,
 | 
				
			||||||
 | 
					    mime         TEXT not null,
 | 
				
			||||||
 | 
					    title         TEXT not null,
 | 
				
			||||||
 | 
					    isProtected    INT  not null DEFAULT 0,
 | 
				
			||||||
 | 
					    position     INT  default 0 not null,
 | 
				
			||||||
 | 
					    blobId    TEXT DEFAULT null,
 | 
				
			||||||
 | 
					    dateModified TEXT NOT NULL,
 | 
				
			||||||
 | 
					    utcDateModified TEXT not null,
 | 
				
			||||||
 | 
					    utcDateScheduledForErasureSince TEXT DEFAULT NULL,
 | 
				
			||||||
 | 
					    isDeleted    INT  not null,
 | 
				
			||||||
 | 
					    deleteId    TEXT DEFAULT NULL);
 | 
				
			||||||
 | 
					CREATE INDEX IDX_attachments_ownerId_role
 | 
				
			||||||
 | 
					    on attachments (ownerId, role);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE INDEX IDX_notes_blobId on notes (blobId);
 | 
				
			||||||
 | 
					CREATE INDEX IDX_revisions_blobId on revisions (blobId);
 | 
				
			||||||
 | 
					CREATE INDEX IDX_attachments_blobId on attachments (blobId);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					# Running `docker-compose up` will create/use the "trilium-data" directory in the user home
 | 
				
			||||||
 | 
					# Run `TRILIUM_DATA_DIR=/path/of/your/choice docker-compose up` to set a different directory
 | 
				
			||||||
version: '2.1'
 | 
					version: '2.1'
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  trilium:
 | 
					  trilium:
 | 
				
			||||||
@@ -8,7 +10,7 @@ services:
 | 
				
			|||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - "8080:8080"
 | 
					      - "8080:8080"
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - trilium:/home/node/trilium-data
 | 
					      - ${TRILIUM_DATA_DIR:-~/trilium-data}:/home/node/trilium-data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
volumes:
 | 
					volumes:
 | 
				
			||||||
  trilium:
 | 
					  trilium:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,11 +4,10 @@ const fs = require("fs");
 | 
				
			|||||||
const dataDir = require("./src/services/data_dir");
 | 
					const dataDir = require("./src/services/data_dir");
 | 
				
			||||||
const config = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, 'utf-8'));
 | 
					const config = ini.parse(fs.readFileSync(dataDir.CONFIG_INI_PATH, 'utf-8'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (config.https) {
 | 
					if (config.Network.https) {
 | 
				
			||||||
    // built-in TLS (terminated by trilium) is not supported yet, PRs are welcome
 | 
					    // built-in TLS (terminated by trilium) is not supported yet, PRs are welcome
 | 
				
			||||||
    // for reverse proxy terminated TLS this will works since config.https will be false
 | 
					    // for reverse proxy terminated TLS this will works since config.https will be false
 | 
				
			||||||
    process.exit(0);
 | 
					    process.exit(0);
 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const port = require('./src/services/port');
 | 
					const port = require('./src/services/port');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,7 +93,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line16">line 16</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -183,7 +183,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line35">line 35</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -211,7 +211,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="addEntityChange"><span class="type-signature">(protected) </span>addEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="_getContent"><span class="type-signature">(protected) </span>_getContent<span class="signature">()</span><span class="type-signature"> → {string|Buffer}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -259,7 +259,112 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line62">line 62</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line250">line 250</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="param-type">Buffer</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="_setContent"><span class="type-signature">(protected) </span>_setContent<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -343,7 +448,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line20">line 20</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -379,7 +484,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"> → {string}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -427,7 +532,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line30">line 30</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -452,6 +557,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -463,7 +584,9 @@
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateIdIfNecessary"><span class="type-signature">(protected) </span>generateIdIfNecessary<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getPojo"><span class="type-signature">(abstract, protected) </span>getPojo<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -511,7 +634,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line23">line 23</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line82">line 82</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -679,7 +802,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line45">line 45</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -725,7 +848,7 @@
 | 
				
			|||||||
<div class="description">
 | 
					<div class="description">
 | 
				
			||||||
    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -833,7 +956,91 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line267">line 267</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="putEntityChange"><span class="type-signature">(protected) </span>putEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line44">line 44</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -921,7 +1128,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line83">line 83</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line91">line 91</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -985,13 +1192,13 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -94,7 +94,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line16">line 16</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line22">line 22</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -205,7 +205,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line47">line 47</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line53">line 53</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -268,7 +268,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line35">line 35</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -336,7 +336,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line59">line 59</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line65">line 65</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -404,7 +404,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -464,74 +464,6 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line49">line 49</a>
 | 
					 | 
				
			||||||
    </li></ul></dd>
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
</dl>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
<h4 class="name" id="position"><span class="type-signature"></span>position<span class="type-signature"> :int</span></h4>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    <h5>Type:</h5>
 | 
					 | 
				
			||||||
    <ul>
 | 
					 | 
				
			||||||
        <li>
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
<span class="param-type">int</span>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        </li>
 | 
					 | 
				
			||||||
    </ul>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<dl class="details">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -558,7 +490,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
<h4 class="name" id="type"><span class="type-signature"></span>type<span class="type-signature"> :string</span></h4>
 | 
					<h4 class="name" id="position"><span class="type-signature"></span>position<span class="type-signature"> :<a href="global.html#int">int</a></span></h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -569,7 +501,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    <ul>
 | 
					    <ul>
 | 
				
			||||||
        <li>
 | 
					        <li>
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
<span class="param-type">string</span>
 | 
					<span class="param-type"><a href="global.html#int">int</a></span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
@@ -608,7 +540,75 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line51">line 51</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line61">line 61</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					<h4 class="name" id="type"><span class="type-signature"></span>type<span class="type-signature"> :<a href="global.html#AttributeType">AttributeType</a></span></h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <h5>Type:</h5>
 | 
				
			||||||
 | 
					    <ul>
 | 
				
			||||||
 | 
					        <li>
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					<span class="param-type"><a href="global.html#AttributeType">AttributeType</a></span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        </li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line57">line 57</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -676,7 +676,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line61">line 61</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line67">line 67</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -744,7 +744,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line57">line 57</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line63">line 63</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -772,7 +772,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="addEntityChange"><span class="type-signature">(protected) </span>addEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="_getContent"><span class="type-signature">(protected) </span>_getContent<span class="signature">()</span><span class="type-signature"> → {string|Buffer}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -802,7 +802,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#addEntityChange">AbstractBeccaEntity#addEntityChange</a>
 | 
					        <a href="AbstractBeccaEntity.html#_getContent">AbstractBeccaEntity#_getContent</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -825,7 +825,117 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line62">line 62</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line250">line 250</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="param-type">Buffer</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="_setContent"><span class="type-signature">(protected) </span>_setContent<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#_setContent">AbstractBeccaEntity#_setContent</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -914,7 +1024,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line20">line 20</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -950,7 +1060,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"> → {string}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -1003,7 +1113,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line30">line 30</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1028,98 +1138,27 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            
 | 
					    </dd>
 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    <h4 class="name" id="generateIdIfNecessary"><span class="type-signature">(protected) </span>generateIdIfNecessary<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<dl class="details">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#generateIdIfNecessary">AbstractBeccaEntity#generateIdIfNecessary</a>
 | 
					 | 
				
			||||||
    </li></ul></dd>
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line23">line 23</a>
 | 
					 | 
				
			||||||
    </li></ul></dd>
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
</dl>
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -1176,7 +1215,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line129">line 129</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line135">line 135</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1227,6 +1266,95 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getPojo"><span class="type-signature">(abstract, protected) </span>getPojo<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#getPojo">AbstractBeccaEntity#getPojo</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line82">line 82</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1370,7 +1498,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line142">line 142</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line148">line 148</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1480,7 +1608,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line45">line 45</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1564,7 +1692,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line157">line 157</a>
 | 
					        <a href="becca_entities_battribute.js.html">becca/entities/battribute.js</a>, <a href="becca_entities_battribute.js.html#line163">line 163</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1628,7 +1756,7 @@ and relation (representing named relationship between source and target note)</d
 | 
				
			|||||||
<div class="description">
 | 
					<div class="description">
 | 
				
			||||||
    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1741,7 +1869,96 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line267">line 267</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="putEntityChange"><span class="type-signature">(protected) </span>putEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#putEntityChange">AbstractBeccaEntity#putEntityChange</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line44">line 44</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1834,7 +2051,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line83">line 83</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line91">line 91</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1898,13 +2115,13 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -203,7 +203,7 @@ Always check noteId instead.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line35">line 35</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -463,7 +463,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line133">line 133</a>
 | 
					        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line134">line 134</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -549,7 +549,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
<h4 class="name" id="notePosition"><span class="type-signature"></span>notePosition<span class="type-signature"> :int</span></h4>
 | 
					<h4 class="name" id="notePosition"><span class="type-signature"></span>notePosition<span class="type-signature"> :<a href="global.html#int">int</a></span></h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -560,7 +560,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    <ul>
 | 
					    <ul>
 | 
				
			||||||
        <li>
 | 
					        <li>
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
<span class="param-type">int</span>
 | 
					<span class="param-type"><a href="global.html#int">int</a></span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
@@ -657,7 +657,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line111">line 111</a>
 | 
					        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line112">line 112</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -892,7 +892,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="addEntityChange"><span class="type-signature">(protected) </span>addEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="_getContent"><span class="type-signature">(protected) </span>_getContent<span class="signature">()</span><span class="type-signature"> → {string|Buffer}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -922,7 +922,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#addEntityChange">AbstractBeccaEntity#addEntityChange</a>
 | 
					        <a href="AbstractBeccaEntity.html#_getContent">AbstractBeccaEntity#_getContent</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -945,7 +945,117 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line62">line 62</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line250">line 250</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="param-type">Buffer</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="_setContent"><span class="type-signature">(protected) </span>_setContent<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#_setContent">AbstractBeccaEntity#_setContent</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1034,7 +1144,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line20">line 20</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1216,7 +1326,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line145">line 145</a>
 | 
					        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line146">line 146</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1274,7 +1384,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"> → {string}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -1327,7 +1437,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line30">line 30</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1352,6 +1462,22 @@ of deletion should not act as a clone.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1363,7 +1489,111 @@ of deletion should not act as a clone.
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateIdIfNecessary"><span class="type-signature">(protected) </span>generateIdIfNecessary<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getNote"><span class="type-signature"></span>getNote<span class="signature">()</span><span class="type-signature"> → {<a href="BNote.html">BNote</a>}</span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_bbranch.js.html">becca/entities/bbranch.js</a>, <a href="becca_entities_bbranch.js.html#line107">line 107</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type"><a href="BNote.html">BNote</a></span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getPojo"><span class="type-signature">(abstract, protected) </span>getPojo<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -1393,7 +1623,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#generateIdIfNecessary">AbstractBeccaEntity#generateIdIfNecessary</a>
 | 
					        <a href="AbstractBeccaEntity.html#getPojo">AbstractBeccaEntity#getPojo</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1416,7 +1646,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line23">line 23</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line82">line 82</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1594,7 +1824,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line45">line 45</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1640,7 +1870,7 @@ of deletion should not act as a clone.
 | 
				
			|||||||
<div class="description">
 | 
					<div class="description">
 | 
				
			||||||
    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1753,7 +1983,96 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line267">line 267</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="putEntityChange"><span class="type-signature">(protected) </span>putEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#putEntityChange">AbstractBeccaEntity#putEntityChange</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line44">line 44</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1846,7 +2165,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line83">line 83</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line91">line 91</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1910,13 +2229,13 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -205,7 +205,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line35">line 35</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -641,7 +641,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="addEntityChange"><span class="type-signature">(protected) </span>addEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="_getContent"><span class="type-signature">(protected) </span>_getContent<span class="signature">()</span><span class="type-signature"> → {string|Buffer}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -671,7 +671,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#addEntityChange">AbstractBeccaEntity#addEntityChange</a>
 | 
					        <a href="AbstractBeccaEntity.html#_getContent">AbstractBeccaEntity#_getContent</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -694,7 +694,117 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line62">line 62</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line250">line 250</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="param-type">Buffer</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="_setContent"><span class="type-signature">(protected) </span>_setContent<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#_setContent">AbstractBeccaEntity#_setContent</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -783,7 +893,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line20">line 20</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -819,7 +929,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"> → {string}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -872,7 +982,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line30">line 30</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -897,6 +1007,22 @@ from tokenHash and token.</div>
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -908,7 +1034,9 @@ from tokenHash and token.</div>
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateIdIfNecessary"><span class="type-signature">(protected) </span>generateIdIfNecessary<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getPojo"><span class="type-signature">(abstract, protected) </span>getPojo<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -938,7 +1066,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#generateIdIfNecessary">AbstractBeccaEntity#generateIdIfNecessary</a>
 | 
					        <a href="AbstractBeccaEntity.html#getPojo">AbstractBeccaEntity#getPojo</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -961,7 +1089,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line23">line 23</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line82">line 82</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1139,7 +1267,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line45">line 45</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1185,7 +1313,7 @@ from tokenHash and token.</div>
 | 
				
			|||||||
<div class="description">
 | 
					<div class="description">
 | 
				
			||||||
    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1298,7 +1426,96 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line267">line 267</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="putEntityChange"><span class="type-signature">(protected) </span>putEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#putEntityChange">AbstractBeccaEntity#putEntityChange</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line44">line 44</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1391,7 +1608,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line83">line 83</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line91">line 91</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1455,13 +1672,13 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -30,7 +30,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
        <h2><span class="attribs"><span class="type-signature"></span></span>BOption<span class="signature">()</span><span class="type-signature"></span></h2>
 | 
					        <h2><span class="attribs"><span class="type-signature"></span></span>BOption<span class="signature">()</span><span class="type-signature"></span></h2>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            <div class="class-description">Option represents name-value pair, either directly configurable by the user or some system property.</div>
 | 
					            <div class="class-description">Option represents a name-value pair, either directly configurable by the user or some system property.</div>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
</header>
 | 
					</header>
 | 
				
			||||||
@@ -199,7 +199,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line35">line 35</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -267,7 +267,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line24">line 24</a>
 | 
					        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line29">line 29</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -335,7 +335,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line20">line 20</a>
 | 
					        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line25">line 25</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -403,7 +403,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line26">line 26</a>
 | 
					        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line31">line 31</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -471,7 +471,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line22">line 22</a>
 | 
					        <a href="becca_entities_boption.js.html">becca/entities/boption.js</a>, <a href="becca_entities_boption.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -499,7 +499,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="addEntityChange"><span class="type-signature">(protected) </span>addEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="_getContent"><span class="type-signature">(protected) </span>_getContent<span class="signature">()</span><span class="type-signature"> → {string|Buffer}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -529,7 +529,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#addEntityChange">AbstractBeccaEntity#addEntityChange</a>
 | 
					        <a href="AbstractBeccaEntity.html#_getContent">AbstractBeccaEntity#_getContent</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -552,7 +552,117 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line62">line 62</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line250">line 250</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="param-type">Buffer</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="_setContent"><span class="type-signature">(protected) </span>_setContent<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#_setContent">AbstractBeccaEntity#_setContent</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -641,7 +751,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line20">line 20</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -677,7 +787,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"> → {string}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -730,7 +840,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line30">line 30</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -755,6 +865,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -766,7 +892,9 @@
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateIdIfNecessary"><span class="type-signature">(protected) </span>generateIdIfNecessary<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getPojo"><span class="type-signature">(abstract, protected) </span>getPojo<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -796,7 +924,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#generateIdIfNecessary">AbstractBeccaEntity#generateIdIfNecessary</a>
 | 
					        <a href="AbstractBeccaEntity.html#getPojo">AbstractBeccaEntity#getPojo</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -819,7 +947,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line23">line 23</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line82">line 82</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -997,7 +1125,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line45">line 45</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1043,7 +1171,7 @@
 | 
				
			|||||||
<div class="description">
 | 
					<div class="description">
 | 
				
			||||||
    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1156,7 +1284,96 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line267">line 267</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="putEntityChange"><span class="type-signature">(protected) </span>putEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#putEntityChange">AbstractBeccaEntity#putEntityChange</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line44">line 44</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1249,7 +1466,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line83">line 83</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line91">line 91</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1313,13 +1530,13 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -199,7 +199,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line53">line 53</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line35">line 35</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -431,7 +431,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="addEntityChange"><span class="type-signature">(protected) </span>addEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="_getContent"><span class="type-signature">(protected) </span>_getContent<span class="signature">()</span><span class="type-signature"> → {string|Buffer}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -461,7 +461,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#addEntityChange">AbstractBeccaEntity#addEntityChange</a>
 | 
					        <a href="AbstractBeccaEntity.html#_getContent">AbstractBeccaEntity#_getContent</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -484,7 +484,117 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line62">line 62</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line250">line 250</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<span class="param-type">Buffer</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="_setContent"><span class="type-signature">(protected) </span>_setContent<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#_setContent">AbstractBeccaEntity#_setContent</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -573,7 +683,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line18">line 18</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line20">line 20</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -609,7 +719,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					    <h4 class="name" id="generateHash"><span class="type-signature">(protected) </span>generateHash<span class="signature">()</span><span class="type-signature"> → {string}</span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -662,7 +772,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line30">line 30</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line59">line 59</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -687,6 +797,22 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h5>Returns:</h5>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl>
 | 
				
			||||||
 | 
					    <dt>
 | 
				
			||||||
 | 
					        Type
 | 
				
			||||||
 | 
					    </dt>
 | 
				
			||||||
 | 
					    <dd>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					<span class="param-type">string</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </dd>
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -698,7 +824,9 @@
 | 
				
			|||||||
            
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    <h4 class="name" id="generateIdIfNecessary"><span class="type-signature">(protected) </span>generateIdIfNecessary<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="getPojo"><span class="type-signature">(abstract, protected) </span>getPojo<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -728,7 +856,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-overrides">Overrides:</dt>
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="AbstractBeccaEntity.html#generateIdIfNecessary">AbstractBeccaEntity#generateIdIfNecessary</a>
 | 
					        <a href="AbstractBeccaEntity.html#getPojo">AbstractBeccaEntity#getPojo</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -751,7 +879,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line23">line 23</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line82">line 82</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -929,7 +1057,7 @@
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line45">line 45</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line27">line 27</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -975,7 +1103,7 @@
 | 
				
			|||||||
<div class="description">
 | 
					<div class="description">
 | 
				
			||||||
    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					    Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1088,7 +1216,96 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line128">line 128</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line267">line 267</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					</dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <h4 class="name" id="putEntityChange"><span class="type-signature">(protected) </span>putEntityChange<span class="signature">()</span><span class="type-signature"></span></h4>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<dl class="details">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-overrides">Overrides:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-overrides"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="AbstractBeccaEntity.html#putEntityChange">AbstractBeccaEntity#putEntityChange</a>
 | 
				
			||||||
 | 
					    </li></ul></dd>
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line44">line 44</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1181,7 +1398,7 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    <dt class="tag-source">Source:</dt>
 | 
					    <dt class="tag-source">Source:</dt>
 | 
				
			||||||
    <dd class="tag-source"><ul class="dummy"><li>
 | 
					    <dd class="tag-source"><ul class="dummy"><li>
 | 
				
			||||||
        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line83">line 83</a>
 | 
					        <a href="becca_entities_abstract_becca_entity.js.html">becca/entities/abstract_becca_entity.js</a>, <a href="becca_entities_abstract_becca_entity.js.html#line91">line 91</a>
 | 
				
			||||||
    </li></ul></dd>
 | 
					    </li></ul></dd>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1245,13 +1462,13 @@ This is a low level method, for notes and branches use `note.deleteNote()` and '
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3243
									
								
								docs/backend_api/BRevision.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3243
									
								
								docs/backend_api/BRevision.html
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -35,6 +35,8 @@ const eventService = require("../../services/events");
 | 
				
			|||||||
const dateUtils = require("../../services/date_utils");
 | 
					const dateUtils = require("../../services/date_utils");
 | 
				
			||||||
const cls = require("../../services/cls");
 | 
					const cls = require("../../services/cls");
 | 
				
			||||||
const log = require("../../services/log");
 | 
					const log = require("../../services/log");
 | 
				
			||||||
 | 
					const protectedSessionService = require("../../services/protected_session");
 | 
				
			||||||
 | 
					const blobService = require("../../services/blob");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let becca = null;
 | 
					let becca = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -44,31 +46,11 @@ let becca = null;
 | 
				
			|||||||
class AbstractBeccaEntity {
 | 
					class AbstractBeccaEntity {
 | 
				
			||||||
    /** @protected */
 | 
					    /** @protected */
 | 
				
			||||||
    beforeSaving() {
 | 
					    beforeSaving() {
 | 
				
			||||||
        this.generateIdIfNecessary();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** @protected */
 | 
					 | 
				
			||||||
    generateIdIfNecessary() {
 | 
					 | 
				
			||||||
        if (!this[this.constructor.primaryKeyName]) {
 | 
					        if (!this[this.constructor.primaryKeyName]) {
 | 
				
			||||||
            this[this.constructor.primaryKeyName] = utils.newEntityId();
 | 
					            this[this.constructor.primaryKeyName] = utils.newEntityId();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @protected */
 | 
					 | 
				
			||||||
    generateHash(isDeleted = false) {
 | 
					 | 
				
			||||||
        let contentToHash = "";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const propertyName of this.constructor.hashedProperties) {
 | 
					 | 
				
			||||||
            contentToHash += `|${this[propertyName]}`;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (isDeleted) {
 | 
					 | 
				
			||||||
            contentToHash += "|deleted";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return utils.hash(contentToHash).substr(0, 10);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** @protected */
 | 
					    /** @protected */
 | 
				
			||||||
    getUtcDateChanged() {
 | 
					    getUtcDateChanged() {
 | 
				
			||||||
        return this.utcDateModified || this.utcDateCreated;
 | 
					        return this.utcDateModified || this.utcDateCreated;
 | 
				
			||||||
@@ -87,8 +69,8 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @protected */
 | 
					    /** @protected */
 | 
				
			||||||
    addEntityChange(isDeleted = false) {
 | 
					    putEntityChange(isDeleted) {
 | 
				
			||||||
        entityChangesService.addEntityChange({
 | 
					        entityChangesService.putEntityChange({
 | 
				
			||||||
            entityName: this.constructor.entityName,
 | 
					            entityName: this.constructor.entityName,
 | 
				
			||||||
            entityId: this[this.constructor.primaryKeyName],
 | 
					            entityId: this[this.constructor.primaryKeyName],
 | 
				
			||||||
            hash: this.generateHash(isDeleted),
 | 
					            hash: this.generateHash(isDeleted),
 | 
				
			||||||
@@ -98,11 +80,37 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @protected
 | 
				
			||||||
 | 
					     * @returns {string}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    generateHash(isDeleted) {
 | 
				
			||||||
 | 
					        let contentToHash = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const propertyName of this.constructor.hashedProperties) {
 | 
				
			||||||
 | 
					            contentToHash += `|${this[propertyName]}`;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isDeleted) {
 | 
				
			||||||
 | 
					            contentToHash += "|deleted";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return utils.hash(contentToHash).substr(0, 10);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @protected */
 | 
					    /** @protected */
 | 
				
			||||||
    getPojoToSave() {
 | 
					    getPojoToSave() {
 | 
				
			||||||
        return this.getPojo();
 | 
					        return this.getPojo();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @protected
 | 
				
			||||||
 | 
					     * @abstract
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getPojo() {
 | 
				
			||||||
 | 
					        throw new Error(`Unimplemented getPojo() for entity '${this.constructor.name}'`)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Saves entity - executes SQL, but doesn't commit the transaction on its own
 | 
					     * Saves entity - executes SQL, but doesn't commit the transaction on its own
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -114,9 +122,7 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        const isNewEntity = !this[primaryKeyName];
 | 
					        const isNewEntity = !this[primaryKeyName];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.beforeSaving) {
 | 
					 | 
				
			||||||
        this.beforeSaving(opts);
 | 
					        this.beforeSaving(opts);
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const pojo = this.getPojoToSave();
 | 
					        const pojo = this.getPojoToSave();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -127,7 +133,7 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.addEntityChange(false);
 | 
					            this.putEntityChange(!!this.isDeleted);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!cls.isEntityEventsDisabled()) {
 | 
					            if (!cls.isEntityEventsDisabled()) {
 | 
				
			||||||
                const eventPayload = {
 | 
					                const eventPayload = {
 | 
				
			||||||
@@ -146,10 +152,143 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @protected */
 | 
				
			||||||
 | 
					    _setContent(content, opts = {}) {
 | 
				
			||||||
 | 
					        // client code asks to save entity even if blobId didn't change (something else was changed)
 | 
				
			||||||
 | 
					        opts.forceSave = !!opts.forceSave;
 | 
				
			||||||
 | 
					        opts.forceFrontendReload = !!opts.forceFrontendReload;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (content === null || content === undefined) {
 | 
				
			||||||
 | 
					            throw new Error(`Cannot set null content to ${this.constructor.primaryKeyName} '${this[this.constructor.primaryKeyName]}'`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.hasStringContent()) {
 | 
				
			||||||
 | 
					            content = content.toString();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            content = Buffer.isBuffer(content) ? content : Buffer.from(content);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const unencryptedContentForHashCalculation = this.#getUnencryptedContentForHashCalculation(content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.isProtected) {
 | 
				
			||||||
 | 
					            if (protectedSessionService.isProtectedSessionAvailable()) {
 | 
				
			||||||
 | 
					                content = protectedSessionService.encrypt(content);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                throw new Error(`Cannot update content of blob since protected session is not available.`);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sql.transactional(() => {
 | 
				
			||||||
 | 
					            const newBlobId = this.#saveBlob(content, unencryptedContentForHashCalculation, opts);
 | 
				
			||||||
 | 
					            const oldBlobId = this.blobId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (newBlobId !== oldBlobId || opts.forceSave) {
 | 
				
			||||||
 | 
					                this.blobId = newBlobId;
 | 
				
			||||||
 | 
					                this.save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (newBlobId !== oldBlobId) {
 | 
				
			||||||
 | 
					                    this.#deleteBlobIfNotUsed(oldBlobId);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #deleteBlobIfNotUsed(oldBlobId) {
 | 
				
			||||||
 | 
					        if (sql.getValue("SELECT 1 FROM notes WHERE blobId = ? LIMIT 1", [oldBlobId])) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (sql.getValue("SELECT 1 FROM attachments WHERE blobId = ? LIMIT 1", [oldBlobId])) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (sql.getValue("SELECT 1 FROM revisions WHERE blobId = ? LIMIT 1", [oldBlobId])) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sql.execute("DELETE FROM blobs WHERE blobId = ?", [oldBlobId]);
 | 
				
			||||||
 | 
					        // blobs are not marked as erased in entity_changes, they are just purged completely
 | 
				
			||||||
 | 
					        // this is because technically every keystroke can create a new blob, and there would be just too many
 | 
				
			||||||
 | 
					        sql.execute("DELETE FROM entity_changes WHERE entityName = 'blobs' AND entityId = ?", [oldBlobId]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #getUnencryptedContentForHashCalculation(unencryptedContent) {
 | 
				
			||||||
 | 
					        if (this.isProtected) {
 | 
				
			||||||
 | 
					            // a "random" prefix makes sure that the calculated hash/blobId is different for a decrypted/encrypted content
 | 
				
			||||||
 | 
					            const encryptedPrefixSuffix = "t$[nvQg7q)&_ENCRYPTED_?M:Bf&j3jr_";
 | 
				
			||||||
 | 
					            return Buffer.isBuffer(unencryptedContent)
 | 
				
			||||||
 | 
					                ? Buffer.concat([Buffer.from(encryptedPrefixSuffix), unencryptedContent])
 | 
				
			||||||
 | 
					                : `${encryptedPrefixSuffix}${unencryptedContent}`;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return unencryptedContent;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #saveBlob(content, unencryptedContentForHashCalculation, opts = {}) {
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					         * We're using the unencrypted blob for the hash calculation, because otherwise the random IV would
 | 
				
			||||||
 | 
					         * cause every content blob to be unique which would balloon the database size (esp. with revisioning).
 | 
				
			||||||
 | 
					         * This has minor security implications (it's easy to infer that given content is shared between different
 | 
				
			||||||
 | 
					         * notes/attachments), but the trade-off comes out clearly positive.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        const newBlobId = utils.hashedBlobId(unencryptedContentForHashCalculation);
 | 
				
			||||||
 | 
					        const blobNeedsInsert = !sql.getValue('SELECT 1 FROM blobs WHERE blobId = ?', [newBlobId]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!blobNeedsInsert) {
 | 
				
			||||||
 | 
					            return newBlobId;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const pojo = {
 | 
				
			||||||
 | 
					            blobId: newBlobId,
 | 
				
			||||||
 | 
					            content: content,
 | 
				
			||||||
 | 
					            dateModified: dateUtils.localNowDateTime(),
 | 
				
			||||||
 | 
					            utcDateModified: dateUtils.utcNowDateTime()
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sql.upsert("blobs", "blobId", pojo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // we can't reuse blobId as an entity_changes hash, because this one has to be calculatable without having
 | 
				
			||||||
 | 
					        // access to the decrypted content
 | 
				
			||||||
 | 
					        const hash = blobService.calculateContentHash(pojo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        entityChangesService.putEntityChange({
 | 
				
			||||||
 | 
					            entityName: 'blobs',
 | 
				
			||||||
 | 
					            entityId: newBlobId,
 | 
				
			||||||
 | 
					            hash: hash,
 | 
				
			||||||
 | 
					            isErased: false,
 | 
				
			||||||
 | 
					            utcDateChanged: pojo.utcDateModified,
 | 
				
			||||||
 | 
					            isSynced: true,
 | 
				
			||||||
 | 
					            // overriding componentId will cause the frontend to think the change is coming from a different component
 | 
				
			||||||
 | 
					            // and thus reload
 | 
				
			||||||
 | 
					            componentId: opts.forceFrontendReload ? utils.randomString(10) : null
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        eventService.emit(eventService.ENTITY_CHANGED, {
 | 
				
			||||||
 | 
					            entityName: 'blobs',
 | 
				
			||||||
 | 
					            entity: this
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return newBlobId;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @protected
 | 
				
			||||||
 | 
					     * @returns {string|Buffer}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    _getContent() {
 | 
				
			||||||
 | 
					        const row = sql.getRow(`SELECT content FROM blobs WHERE blobId = ?`, [this.blobId]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!row) {
 | 
				
			||||||
 | 
					            throw new Error(`Cannot find content for ${this.constructor.primaryKeyName} '${this[this.constructor.primaryKeyName]}', blobId '${this.blobId}'`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return blobService.processContent(row.content, this.isProtected, this.hasStringContent());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Mark the entity as (soft) deleted. It will be completely erased later.
 | 
					     * Mark the entity as (soft) deleted. It will be completely erased later.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * This is a low level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
					     * This is a low-level method, for notes and branches use `note.deleteNote()` and 'branch.deleteBranch()` instead.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param [deleteId=null]
 | 
					     * @param [deleteId=null]
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -172,7 +311,7 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        log.info(`Marking ${entityName} ${entityId} as deleted`);
 | 
					        log.info(`Marking ${entityName} ${entityId} as deleted`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.addEntityChange(true);
 | 
					        this.putEntityChange(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        eventService.emit(eventService.ENTITY_DELETED, { entityName, entityId, entity: this });
 | 
					        eventService.emit(eventService.ENTITY_DELETED, { entityName, entityId, entity: this });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -189,7 +328,7 @@ class AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        log.info(`Marking ${entityName} ${entityId} as deleted`);
 | 
					        log.info(`Marking ${entityName} ${entityId} as deleted`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.addEntityChange(true);
 | 
					        this.putEntityChange(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        eventService.emit(eventService.ENTITY_DELETED, { entityName, entityId, entity: this });
 | 
					        eventService.emit(eventService.ENTITY_DELETED, { entityName, entityId, entity: this });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -206,13 +345,13 @@ module.exports = AbstractBeccaEntity;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										294
									
								
								docs/backend_api/becca_entities_battachment.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								docs/backend_api/becca_entities_battachment.js.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,294 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <meta charset="utf-8">
 | 
				
			||||||
 | 
					    <title>JSDoc: Source: becca/entities/battachment.js</title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script src="scripts/prettify/prettify.js"> </script>
 | 
				
			||||||
 | 
					    <script src="scripts/prettify/lang-css.js"> </script>
 | 
				
			||||||
 | 
					    <!--[if lt IE 9]>
 | 
				
			||||||
 | 
					      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
 | 
				
			||||||
 | 
					    <![endif]-->
 | 
				
			||||||
 | 
					    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
 | 
				
			||||||
 | 
					    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div id="main">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <h1 class="page-title">Source: becca/entities/battachment.js</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <section>
 | 
				
			||||||
 | 
					        <article>
 | 
				
			||||||
 | 
					            <pre class="prettyprint source linenums"><code>"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const utils = require('../../services/utils');
 | 
				
			||||||
 | 
					const dateUtils = require('../../services/date_utils');
 | 
				
			||||||
 | 
					const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
				
			||||||
 | 
					const sql = require("../../services/sql");
 | 
				
			||||||
 | 
					const protectedSessionService = require("../../services/protected_session");
 | 
				
			||||||
 | 
					const log = require("../../services/log");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const attachmentRoleToNoteTypeMapping = {
 | 
				
			||||||
 | 
					    'image': 'image'
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Attachment represent data related/attached to the note. Conceptually similar to attributes, but intended for
 | 
				
			||||||
 | 
					 * larger amounts of data and generally not accessible to the user.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @extends AbstractBeccaEntity
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class BAttachment extends AbstractBeccaEntity {
 | 
				
			||||||
 | 
					    static get entityName() { return "attachments"; }
 | 
				
			||||||
 | 
					    static get primaryKeyName() { return "attachmentId"; }
 | 
				
			||||||
 | 
					    static get hashedProperties() { return ["attachmentId", "ownerId", "role", "mime", "title", "blobId", "utcDateScheduledForErasureSince"]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(row) {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!row.ownerId?.trim()) {
 | 
				
			||||||
 | 
					            throw new Error("'ownerId' must be given to initialize a Attachment entity");
 | 
				
			||||||
 | 
					        } else if (!row.role?.trim()) {
 | 
				
			||||||
 | 
					            throw new Error("'role' must be given to initialize a Attachment entity");
 | 
				
			||||||
 | 
					        } else if (!row.mime?.trim()) {
 | 
				
			||||||
 | 
					            throw new Error("'mime' must be given to initialize a Attachment entity");
 | 
				
			||||||
 | 
					        } else if (!row.title?.trim()) {
 | 
				
			||||||
 | 
					            throw new Error("'title' must be given to initialize a Attachment entity");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.attachmentId = row.attachmentId;
 | 
				
			||||||
 | 
					        /** 
 | 
				
			||||||
 | 
					         * either noteId or revisionId to which this attachment belongs
 | 
				
			||||||
 | 
					         * @type {string}
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.ownerId = row.ownerId;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.role = row.role;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.mime = row.mime;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.title = row.title;
 | 
				
			||||||
 | 
					        /** @type {int} */
 | 
				
			||||||
 | 
					        this.position = row.position;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.blobId = row.blobId;
 | 
				
			||||||
 | 
					        /** @type {boolean} */
 | 
				
			||||||
 | 
					        this.isProtected = !!row.isProtected;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.dateModified = row.dateModified;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.utcDateModified = row.utcDateModified;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.utcDateScheduledForErasureSince = row.utcDateScheduledForErasureSince;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * optionally added to the entity
 | 
				
			||||||
 | 
					         * @type {int}
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.contentLength = row.contentLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.decrypt();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BAttachment} */
 | 
				
			||||||
 | 
					    copy() {
 | 
				
			||||||
 | 
					        return new BAttachment({
 | 
				
			||||||
 | 
					            ownerId: this.ownerId,
 | 
				
			||||||
 | 
					            role: this.role,
 | 
				
			||||||
 | 
					            mime: this.mime,
 | 
				
			||||||
 | 
					            title: this.title,
 | 
				
			||||||
 | 
					            blobId: this.blobId,
 | 
				
			||||||
 | 
					            isProtected: this.isProtected
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BNote} */
 | 
				
			||||||
 | 
					    getNote() {
 | 
				
			||||||
 | 
					        return this.becca.notes[this.ownerId];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {boolean} true if the note has string content (not binary) */
 | 
				
			||||||
 | 
					    hasStringContent() {
 | 
				
			||||||
 | 
					        return utils.isStringNote(this.type, this.mime);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    isContentAvailable() {
 | 
				
			||||||
 | 
					        return !this.attachmentId // new attachment which was not encrypted yet
 | 
				
			||||||
 | 
					            || !this.isProtected
 | 
				
			||||||
 | 
					            || protectedSessionService.isProtectedSessionAvailable()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getTitleOrProtected() {
 | 
				
			||||||
 | 
					        return this.isContentAvailable() ? this.title : '[protected]';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    decrypt() {
 | 
				
			||||||
 | 
					        if (!this.isProtected || !this.attachmentId) {
 | 
				
			||||||
 | 
					            this.isDecrypted = true;
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!this.isDecrypted && protectedSessionService.isProtectedSessionAvailable()) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                this.title = protectedSessionService.decryptString(this.title);
 | 
				
			||||||
 | 
					                this.isDecrypted = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (e) {
 | 
				
			||||||
 | 
					                log.error(`Could not decrypt attachment ${this.attachmentId}: ${e.message} ${e.stack}`);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {string|Buffer}  */
 | 
				
			||||||
 | 
					    getContent() {
 | 
				
			||||||
 | 
					        return this._getContent();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param content
 | 
				
			||||||
 | 
					     * @param {object} [opts]
 | 
				
			||||||
 | 
					     * @param {object} [opts.forceSave=false] - will also save this BAttachment entity
 | 
				
			||||||
 | 
					     * @param {object} [opts.forceFrontendReload=false] - override frontend heuristics on when to reload, instruct to reload
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    setContent(content, opts) {
 | 
				
			||||||
 | 
					        this._setContent(content, opts);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {{note: BNote, branch: BBranch}} */
 | 
				
			||||||
 | 
					    convertToNote() {
 | 
				
			||||||
 | 
					        if (this.type === 'search') {
 | 
				
			||||||
 | 
					            throw new Error(`Note of type search cannot have child notes`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!this.getNote()) {
 | 
				
			||||||
 | 
					            throw new Error("Cannot find note of this attachment. It is possible that this is note revision's attachment. " +
 | 
				
			||||||
 | 
					                "Converting note revision's attachments to note is not (yet) supported.");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!(this.role in attachmentRoleToNoteTypeMapping)) {
 | 
				
			||||||
 | 
					            throw new Error(`Mapping from attachment role '${this.role}' to note's type is not defined`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!this.isContentAvailable()) { // isProtected is the same for attachment
 | 
				
			||||||
 | 
					            throw new Error(`Cannot convert protected attachment outside of protected session`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const noteService = require('../../services/notes');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const { note, branch } = noteService.createNewNote({
 | 
				
			||||||
 | 
					            parentNoteId: this.ownerId,
 | 
				
			||||||
 | 
					            title: this.title,
 | 
				
			||||||
 | 
					            type: attachmentRoleToNoteTypeMapping[this.role],
 | 
				
			||||||
 | 
					            mime: this.mime,
 | 
				
			||||||
 | 
					            content: this.getContent(),
 | 
				
			||||||
 | 
					            isProtected: this.isProtected
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.markAsDeleted();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const parentNote = this.getNote();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.role === 'image' && parentNote.type === 'text') {
 | 
				
			||||||
 | 
					            const origContent = parentNote.getContent();
 | 
				
			||||||
 | 
					            const oldAttachmentUrl = `api/attachments/${this.attachmentId}/image/`;
 | 
				
			||||||
 | 
					            const newNoteUrl = `api/images/${note.noteId}/`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const fixedContent = utils.replaceAll(origContent, oldAttachmentUrl, newNoteUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (fixedContent !== origContent) {
 | 
				
			||||||
 | 
					                parentNote.setContent(fixedContent);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            noteService.asyncPostProcessContent(note, fixedContent);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return { note, branch };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getFileName() {
 | 
				
			||||||
 | 
					        const type = this.role === 'image' ? 'image' : 'file';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return utils.formatDownloadTitle(this.title, type, this.mime);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    beforeSaving() {
 | 
				
			||||||
 | 
					        super.beforeSaving();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.position === undefined || this.position === null) {
 | 
				
			||||||
 | 
					            this.position = 10 + sql.getValue(`SELECT COALESCE(MAX(position), 0)
 | 
				
			||||||
 | 
					                                              FROM attachments
 | 
				
			||||||
 | 
					                                              WHERE ownerId = ?`, [this.noteId]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.dateModified = dateUtils.localNowDateTime();
 | 
				
			||||||
 | 
					        this.utcDateModified = dateUtils.utcNowDateTime();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getPojo() {
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            attachmentId: this.attachmentId,
 | 
				
			||||||
 | 
					            ownerId: this.ownerId,
 | 
				
			||||||
 | 
					            role: this.role,
 | 
				
			||||||
 | 
					            mime: this.mime,
 | 
				
			||||||
 | 
					            title: this.title,
 | 
				
			||||||
 | 
					            position: this.position,
 | 
				
			||||||
 | 
					            blobId: this.blobId,
 | 
				
			||||||
 | 
					            isProtected: !!this.isProtected,
 | 
				
			||||||
 | 
					            isDeleted: false,
 | 
				
			||||||
 | 
					            dateModified: this.dateModified,
 | 
				
			||||||
 | 
					            utcDateModified: this.utcDateModified,
 | 
				
			||||||
 | 
					            utcDateScheduledForErasureSince: this.utcDateScheduledForErasureSince,
 | 
				
			||||||
 | 
					            contentLength: this.contentLength
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getPojoToSave() {
 | 
				
			||||||
 | 
					        const pojo = this.getPojo();
 | 
				
			||||||
 | 
					        delete pojo.contentLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (pojo.isProtected) {
 | 
				
			||||||
 | 
					            if (this.isDecrypted) {
 | 
				
			||||||
 | 
					                pojo.title = protectedSessionService.encrypt(pojo.title);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else {
 | 
				
			||||||
 | 
					                // updating protected note outside of protected session means we will keep original ciphertexts
 | 
				
			||||||
 | 
					                delete pojo.title;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return pojo;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = BAttachment;
 | 
				
			||||||
 | 
					</code></pre>
 | 
				
			||||||
 | 
					        </article>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<nav>
 | 
				
			||||||
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<footer>
 | 
				
			||||||
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 | 
					<script src="scripts/linenumber.js"> </script>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
@@ -35,6 +35,12 @@ const dateUtils = require("../../services/date_utils");
 | 
				
			|||||||
const promotedAttributeDefinitionParser = require("../../services/promoted_attribute_definition_parser");
 | 
					const promotedAttributeDefinitionParser = require("../../services/promoted_attribute_definition_parser");
 | 
				
			||||||
const {sanitizeAttributeName} = require("../../services/sanitize_attribute_name");
 | 
					const {sanitizeAttributeName} = require("../../services/sanitize_attribute_name");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * There are currently only two types of attributes, labels or relations.
 | 
				
			||||||
 | 
					 * @typedef {"label" | "relation"} AttributeType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Attribute is an abstract concept which has two real uses - label (key - value pair)
 | 
					 * Attribute is an abstract concept which has two real uses - label (key - value pair)
 | 
				
			||||||
 * and relation (representing named relationship between source and target note)
 | 
					 * and relation (representing named relationship between source and target note)
 | 
				
			||||||
@@ -75,7 +81,7 @@ class BAttribute extends AbstractBeccaEntity {
 | 
				
			|||||||
        this.attributeId = attributeId;
 | 
					        this.attributeId = attributeId;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.noteId = noteId;
 | 
					        this.noteId = noteId;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {AttributeType} */
 | 
				
			||||||
        this.type = type;
 | 
					        this.type = type;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.name = name;
 | 
					        this.name = name;
 | 
				
			||||||
@@ -124,7 +130,7 @@ class BAttribute extends AbstractBeccaEntity {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.type === 'relation' && !(this.value in this.becca.notes)) {
 | 
					        if (this.type === 'relation' && !(this.value in this.becca.notes)) {
 | 
				
			||||||
            throw new Error(`Cannot save relation '${this.name}' of note '${this.noteId}' since it target not existing note '${this.value}'.`);
 | 
					            throw new Error(`Cannot save relation '${this.name}' of note '${this.noteId}' since it targets not existing note '${this.value}'.`);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -169,7 +175,7 @@ class BAttribute extends AbstractBeccaEntity {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    getTargetNote() {
 | 
					    getTargetNote() {
 | 
				
			||||||
        if (this.type !== 'relation') {
 | 
					        if (this.type !== 'relation') {
 | 
				
			||||||
            throw new Error(`Attribute ${this.attributeId} is not relation`);
 | 
					            throw new Error(`Attribute '${this.attributeId}' is not a relation.`);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!this.value) {
 | 
					        if (!this.value) {
 | 
				
			||||||
@@ -216,9 +222,11 @@ class BAttribute extends AbstractBeccaEntity {
 | 
				
			|||||||
            this.value = "";
 | 
					            this.value = "";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.position === undefined) {
 | 
					        if (this.position === undefined || this.position === null) {
 | 
				
			||||||
            // TODO: can be calculated from becca
 | 
					            const maxExistingPosition = this.getNote().getAttributes()
 | 
				
			||||||
            this.position = 1 + sql.getValue(`SELECT COALESCE(MAX(position), 0) FROM attributes WHERE noteId = ?`, [this.noteId]);
 | 
					                .reduce((maxPosition, attr) => Math.max(maxPosition, attr.position || 0), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.position = maxExistingPosition + 10;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!this.isInheritable) {
 | 
					        if (!this.isInheritable) {
 | 
				
			||||||
@@ -270,13 +278,13 @@ module.exports = BAttribute;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										81
									
								
								docs/backend_api/becca_entities_bblob.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								docs/backend_api/becca_entities_bblob.js.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <meta charset="utf-8">
 | 
				
			||||||
 | 
					    <title>JSDoc: Source: becca/entities/bblob.js</title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script src="scripts/prettify/prettify.js"> </script>
 | 
				
			||||||
 | 
					    <script src="scripts/prettify/lang-css.js"> </script>
 | 
				
			||||||
 | 
					    <!--[if lt IE 9]>
 | 
				
			||||||
 | 
					      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
 | 
				
			||||||
 | 
					    <![endif]-->
 | 
				
			||||||
 | 
					    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
 | 
				
			||||||
 | 
					    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div id="main">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <h1 class="page-title">Source: becca/entities/bblob.js</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <section>
 | 
				
			||||||
 | 
					        <article>
 | 
				
			||||||
 | 
					            <pre class="prettyprint source linenums"><code>class BBlob {
 | 
				
			||||||
 | 
					    static get entityName() { return "blobs"; }
 | 
				
			||||||
 | 
					    static get primaryKeyName() { return "blobId"; }
 | 
				
			||||||
 | 
					    static get hashedProperties() { return ["blobId", "content"]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(row) {
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.blobId = row.blobId;
 | 
				
			||||||
 | 
					        /** @type {string|Buffer} */
 | 
				
			||||||
 | 
					        this.content = row.content;
 | 
				
			||||||
 | 
					        /** @type {int} */
 | 
				
			||||||
 | 
					        this.contentLength = row.contentLength;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.dateModified = row.dateModified;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.utcDateModified = row.utcDateModified;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getPojo() {
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            blobId: this.blobId,
 | 
				
			||||||
 | 
					            content: this.content,
 | 
				
			||||||
 | 
					            contentLength: this.contentLength,
 | 
				
			||||||
 | 
					            dateModified: this.dateModified,
 | 
				
			||||||
 | 
					            utcDateModified: this.utcDateModified
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = BBlob;
 | 
				
			||||||
 | 
					</code></pre>
 | 
				
			||||||
 | 
					        </article>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<nav>
 | 
				
			||||||
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<footer>
 | 
				
			||||||
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 | 
					<script src="scripts/linenumber.js"> </script>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
@@ -131,6 +131,7 @@ class BBranch extends AbstractBeccaEntity {
 | 
				
			|||||||
        return this.becca.notes[this.noteId];
 | 
					        return this.becca.notes[this.noteId];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BNote} */
 | 
				
			||||||
    getNote() {
 | 
					    getNote() {
 | 
				
			||||||
        return this.childNote;
 | 
					        return this.childNote;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -214,11 +215,11 @@ class BBranch extends AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            // first delete children and then parent - this will show up better in recent changes
 | 
					            // first delete children and then parent - this will show up better in recent changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            log.info(`Deleting note ${note.noteId}`);
 | 
					            log.info(`Deleting note '${note.noteId}'`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.becca.notes[note.noteId].isBeingDeleted = true;
 | 
					            this.becca.notes[note.noteId].isBeingDeleted = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (const attribute of note.getOwnedAttributes()) {
 | 
					            for (const attribute of note.getOwnedAttributes().slice()) {
 | 
				
			||||||
                attribute.markAsDeleted(deleteId);
 | 
					                attribute.markAsDeleted(deleteId);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -226,6 +227,10 @@ class BBranch extends AbstractBeccaEntity {
 | 
				
			|||||||
                relation.markAsDeleted(deleteId);
 | 
					                relation.markAsDeleted(deleteId);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (const attachment of note.getAttachments()) {
 | 
				
			||||||
 | 
					                attachment.markAsDeleted(deleteId);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            note.markAsDeleted(deleteId);
 | 
					            note.markAsDeleted(deleteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
@@ -247,7 +252,7 @@ class BBranch extends AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            for (const childBranch of this.parentNote.getChildBranches()) {
 | 
					            for (const childBranch of this.parentNote.getChildBranches()) {
 | 
				
			||||||
                if (maxNotePos < childBranch.notePosition
 | 
					                if (maxNotePos < childBranch.notePosition
 | 
				
			||||||
                    && childBranch.noteId !== '_hidden' // hidden has very large notePosition to always stay last
 | 
					                    && childBranch.noteId !== '_hidden' // hidden has a very large notePosition to always stay last
 | 
				
			||||||
                ) {
 | 
					                ) {
 | 
				
			||||||
                    maxNotePos = childBranch.notePosition;
 | 
					                    maxNotePos = childBranch.notePosition;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -313,13 +318,13 @@ module.exports = BBranch;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -114,13 +114,13 @@ module.exports = BEtapiToken;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,9 +33,9 @@ const log = require('../../services/log');
 | 
				
			|||||||
const sql = require('../../services/sql');
 | 
					const sql = require('../../services/sql');
 | 
				
			||||||
const utils = require('../../services/utils');
 | 
					const utils = require('../../services/utils');
 | 
				
			||||||
const dateUtils = require('../../services/date_utils');
 | 
					const dateUtils = require('../../services/date_utils');
 | 
				
			||||||
const entityChangesService = require('../../services/entity_changes');
 | 
					 | 
				
			||||||
const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
					const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
				
			||||||
const BNoteRevision = require("./bnote_revision");
 | 
					const BRevision = require("./brevision");
 | 
				
			||||||
 | 
					const BAttachment = require("./battachment");
 | 
				
			||||||
const TaskContext = require("../../services/task_context");
 | 
					const TaskContext = require("../../services/task_context");
 | 
				
			||||||
const dayjs = require("dayjs");
 | 
					const dayjs = require("dayjs");
 | 
				
			||||||
const utc = require('dayjs/plugin/utc');
 | 
					const utc = require('dayjs/plugin/utc');
 | 
				
			||||||
@@ -46,14 +46,29 @@ const LABEL = 'label';
 | 
				
			|||||||
const RELATION = 'relation';
 | 
					const RELATION = 'relation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Trilium's main entity which can represent text note, image, code note, file attachment etc.
 | 
					 * There are many different Note types, some of which are entirely opaque to the
 | 
				
			||||||
 | 
					 * end user. Those types should be used only for checking against, they are
 | 
				
			||||||
 | 
					 * not for direct use.
 | 
				
			||||||
 | 
					 * @typedef {"file" | "image" | "search" | "noteMap" | "launcher" | "doc" | "contentWidget" | "text" | "relationMap" | "render" | "canvas" | "mermaid" | "book" | "webView" | "code"} NoteType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @typedef {Object} NotePathRecord
 | 
				
			||||||
 | 
					 * @property {boolean} isArchived
 | 
				
			||||||
 | 
					 * @property {boolean} isInHoistedSubTree
 | 
				
			||||||
 | 
					 * @property {Array<string>} notePath
 | 
				
			||||||
 | 
					 * @property {boolean} isHidden
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Trilium's main entity, which can represent text note, image, code note, file attachment etc.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @extends AbstractBeccaEntity
 | 
					 * @extends AbstractBeccaEntity
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class BNote extends AbstractBeccaEntity {
 | 
					class BNote extends AbstractBeccaEntity {
 | 
				
			||||||
    static get entityName() { return "notes"; }
 | 
					    static get entityName() { return "notes"; }
 | 
				
			||||||
    static get primaryKeyName() { return "noteId"; }
 | 
					    static get primaryKeyName() { return "noteId"; }
 | 
				
			||||||
    static get hashedProperties() { return ["noteId", "title", "isProtected", "type", "mime"]; }
 | 
					    static get hashedProperties() { return ["noteId", "title", "isProtected", "type", "mime", "blobId"]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(row) {
 | 
					    constructor(row) {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
@@ -73,6 +88,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            row.type,
 | 
					            row.type,
 | 
				
			||||||
            row.mime,
 | 
					            row.mime,
 | 
				
			||||||
            row.isProtected,
 | 
					            row.isProtected,
 | 
				
			||||||
 | 
					            row.blobId,
 | 
				
			||||||
            row.dateCreated,
 | 
					            row.dateCreated,
 | 
				
			||||||
            row.dateModified,
 | 
					            row.dateModified,
 | 
				
			||||||
            row.utcDateCreated,
 | 
					            row.utcDateCreated,
 | 
				
			||||||
@@ -80,19 +96,21 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    update([noteId, title, type, mime, isProtected, dateCreated, dateModified, utcDateCreated, utcDateModified]) {
 | 
					    update([noteId, title, type, mime, isProtected, blobId, dateCreated, dateModified, utcDateCreated, utcDateModified]) {
 | 
				
			||||||
        // ------ Database persisted attributes ------
 | 
					        // ------ Database persisted attributes ------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.noteId = noteId;
 | 
					        this.noteId = noteId;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.title = title;
 | 
					        this.title = title;
 | 
				
			||||||
        /** @type {boolean} */
 | 
					        /** @type {NoteType} */
 | 
				
			||||||
        this.isProtected = !!isProtected;
 | 
					 | 
				
			||||||
        /** @type {string} */
 | 
					 | 
				
			||||||
        this.type = type;
 | 
					        this.type = type;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.mime = mime;
 | 
					        this.mime = mime;
 | 
				
			||||||
 | 
					        /** @type {boolean} */
 | 
				
			||||||
 | 
					        this.isProtected = !!isProtected;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.blobId = blobId;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.dateCreated = dateCreated || dateUtils.localNowDateTime();
 | 
					        this.dateCreated = dateCreated || dateUtils.localNowDateTime();
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
@@ -101,7 +119,10 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        this.utcDateCreated = utcDateCreated || dateUtils.utcNowDateTime();
 | 
					        this.utcDateCreated = utcDateCreated || dateUtils.utcNowDateTime();
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.utcDateModified = utcDateModified;
 | 
					        this.utcDateModified = utcDateModified;
 | 
				
			||||||
        /** @type {boolean} - set during the deletion operation, before it is completed (removed from becca completely) */
 | 
					        /**
 | 
				
			||||||
 | 
					         * set during the deletion operation, before it is completed (removed from becca completely)
 | 
				
			||||||
 | 
					         * @type {boolean}
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
        this.isBeingDeleted = false;
 | 
					        this.isBeingDeleted = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // ------ Derived attributes ------
 | 
					        // ------ Derived attributes ------
 | 
				
			||||||
@@ -112,7 +133,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        this.decrypt();
 | 
					        this.decrypt();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {string|null} */
 | 
					        /** @type {string|null} */
 | 
				
			||||||
        this.flatTextCache = null;
 | 
					        this.__flatTextCache = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -125,7 +146,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
         * @private */
 | 
					         * @private */
 | 
				
			||||||
        this.parents = [];
 | 
					        this.parents = [];
 | 
				
			||||||
        /** @type {BNote[]}
 | 
					        /** @type {BNote[]}
 | 
				
			||||||
         * @private*/
 | 
					         * @private */
 | 
				
			||||||
        this.children = [];
 | 
					        this.children = [];
 | 
				
			||||||
        /** @type {BAttribute[]}
 | 
					        /** @type {BAttribute[]}
 | 
				
			||||||
         * @private */
 | 
					         * @private */
 | 
				
			||||||
@@ -135,20 +156,20 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
         * @private */
 | 
					         * @private */
 | 
				
			||||||
        this.__attributeCache = null;
 | 
					        this.__attributeCache = null;
 | 
				
			||||||
        /** @type {BAttribute[]|null}
 | 
					        /** @type {BAttribute[]|null}
 | 
				
			||||||
         * @private*/
 | 
					         * @private */
 | 
				
			||||||
        this.inheritableAttributeCache = null;
 | 
					        this.__inheritableAttributeCache = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {BAttribute[]}
 | 
					        /** @type {BAttribute[]}
 | 
				
			||||||
         * @private*/
 | 
					         * @private */
 | 
				
			||||||
        this.targetRelations = [];
 | 
					        this.targetRelations = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.becca.addNote(this.noteId, this);
 | 
					        this.becca.addNote(this.noteId, this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {BNote[]|null}
 | 
					        /** @type {BNote[]|null}
 | 
				
			||||||
         * @private */
 | 
					         * @private */
 | 
				
			||||||
        this.ancestorCache = null;
 | 
					        this.__ancestorCache = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // following attributes are filled during searching from database
 | 
					        // following attributes are filled during searching in the database
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * size of the content in bytes
 | 
					         * size of the content in bytes
 | 
				
			||||||
@@ -157,11 +178,17 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
         */
 | 
					         */
 | 
				
			||||||
        this.contentSize = null;
 | 
					        this.contentSize = null;
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * size of the content and note revision contents in bytes
 | 
					         * size of the note content, attachment contents in bytes
 | 
				
			||||||
         * @type {int|null}
 | 
					         * @type {int|null}
 | 
				
			||||||
         * @private
 | 
					         * @private
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.noteSize = null;
 | 
					        this.contentAndAttachmentsSize = null;
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * size of the note content, attachment contents and revision contents in bytes
 | 
				
			||||||
 | 
					         * @type {int|null}
 | 
				
			||||||
 | 
					         * @private
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.contentAndAttachmentsAndRevisionsSize = null;
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * number of note revisions for this note
 | 
					         * number of note revisions for this note
 | 
				
			||||||
         * @type {int|null}
 | 
					         * @type {int|null}
 | 
				
			||||||
@@ -231,49 +258,48 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
     * - but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity)
 | 
					     * - but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {*} */
 | 
					    /** @returns {string|Buffer}  */
 | 
				
			||||||
    getContent(silentNotFoundError = false) {
 | 
					    getContent() {
 | 
				
			||||||
        const row = sql.getRow(`SELECT content FROM note_contents WHERE noteId = ?`, [this.noteId]);
 | 
					        return this._getContent();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!row) {
 | 
					 | 
				
			||||||
            if (silentNotFoundError) {
 | 
					 | 
				
			||||||
                return undefined;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
            else {
 | 
					
 | 
				
			||||||
                throw new Error(`Cannot find note content for noteId=${this.noteId}`);
 | 
					    /**
 | 
				
			||||||
 | 
					     * @returns {*}
 | 
				
			||||||
 | 
					     * @throws Error in case of invalid JSON */
 | 
				
			||||||
 | 
					    getJsonContent() {
 | 
				
			||||||
 | 
					        const content = this.getContent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!content || !content.trim()) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return JSON.parse(content);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {*|null} valid object or null if the content cannot be parsed as JSON */
 | 
				
			||||||
 | 
					    getJsonContentSafely() {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            return this.getJsonContent();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        catch (e) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let content = row.content;
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param content
 | 
				
			||||||
 | 
					     * @param {object} [opts]
 | 
				
			||||||
 | 
					     * @param {object} [opts.forceSave=false] - will also save this BNote entity
 | 
				
			||||||
 | 
					     * @param {object} [opts.forceFrontendReload=false] - override frontend heuristics on when to reload, instruct to reload
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    setContent(content, opts) {
 | 
				
			||||||
 | 
					        this._setContent(content, opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.isProtected) {
 | 
					        eventService.emit(eventService.NOTE_CONTENT_CHANGE, { entity: this });
 | 
				
			||||||
            if (protectedSessionService.isProtectedSessionAvailable()) {
 | 
					 | 
				
			||||||
                content = content === null ? null : protectedSessionService.decrypt(content);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else {
 | 
					 | 
				
			||||||
                content = "";
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.isStringNote()) {
 | 
					    setJsonContent(content) {
 | 
				
			||||||
            return content === null
 | 
					        this.setContent(JSON.stringify(content, null, '\t'));
 | 
				
			||||||
                ? ""
 | 
					 | 
				
			||||||
                : content.toString("UTF-8");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else {
 | 
					 | 
				
			||||||
            return content;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** @returns {{contentLength, dateModified, utcDateModified}} */
 | 
					 | 
				
			||||||
    getContentMetadata() {
 | 
					 | 
				
			||||||
        return sql.getRow(`
 | 
					 | 
				
			||||||
            SELECT 
 | 
					 | 
				
			||||||
                LENGTH(content) AS contentLength, 
 | 
					 | 
				
			||||||
                dateModified,
 | 
					 | 
				
			||||||
                utcDateModified 
 | 
					 | 
				
			||||||
            FROM note_contents 
 | 
					 | 
				
			||||||
            WHERE noteId = ?`, [this.noteId]);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get dateCreatedObj() {
 | 
					    get dateCreatedObj() {
 | 
				
			||||||
@@ -292,68 +318,6 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        return this.utcDateModified === null ? null : dayjs.utc(this.utcDateModified);
 | 
					        return this.utcDateModified === null ? null : dayjs.utc(this.utcDateModified);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {*} */
 | 
					 | 
				
			||||||
    getJsonContent() {
 | 
					 | 
				
			||||||
        const content = this.getContent();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!content || !content.trim()) {
 | 
					 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return JSON.parse(content);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    setContent(content, ignoreMissingProtectedSession = false) {
 | 
					 | 
				
			||||||
        if (content === null || content === undefined) {
 | 
					 | 
				
			||||||
            throw new Error(`Cannot set null content to note '${this.noteId}'`);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.isStringNote()) {
 | 
					 | 
				
			||||||
            content = content.toString();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else {
 | 
					 | 
				
			||||||
            content = Buffer.isBuffer(content) ? content : Buffer.from(content);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const pojo = {
 | 
					 | 
				
			||||||
            noteId: this.noteId,
 | 
					 | 
				
			||||||
            content: content,
 | 
					 | 
				
			||||||
            dateModified: dateUtils.localNowDateTime(),
 | 
					 | 
				
			||||||
            utcDateModified: dateUtils.utcNowDateTime()
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.isProtected) {
 | 
					 | 
				
			||||||
            if (protectedSessionService.isProtectedSessionAvailable()) {
 | 
					 | 
				
			||||||
                pojo.content = protectedSessionService.encrypt(pojo.content);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else if (!ignoreMissingProtectedSession) {
 | 
					 | 
				
			||||||
                throw new Error(`Cannot update content of noteId '${this.noteId}' since we're out of protected session.`);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sql.upsert("note_contents", "noteId", pojo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const hash = utils.hash(`${this.noteId}|${pojo.content.toString()}`);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        entityChangesService.addEntityChange({
 | 
					 | 
				
			||||||
            entityName: 'note_contents',
 | 
					 | 
				
			||||||
            entityId: this.noteId,
 | 
					 | 
				
			||||||
            hash: hash,
 | 
					 | 
				
			||||||
            isErased: false,
 | 
					 | 
				
			||||||
            utcDateChanged: pojo.utcDateModified,
 | 
					 | 
				
			||||||
            isSynced: true
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        eventService.emit(eventService.ENTITY_CHANGED, {
 | 
					 | 
				
			||||||
            entityName: 'note_contents',
 | 
					 | 
				
			||||||
            entity: this
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    setJsonContent(content) {
 | 
					 | 
				
			||||||
        this.setContent(JSON.stringify(content, null, '\t'));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */
 | 
					    /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */
 | 
				
			||||||
    isRoot() {
 | 
					    isRoot() {
 | 
				
			||||||
        return this.noteId === 'root';
 | 
					        return this.noteId === 'root';
 | 
				
			||||||
@@ -384,8 +348,13 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            || (this.type === 'file' && this.mime?.startsWith('image/'));
 | 
					            || (this.type === 'file' && this.mime?.startsWith('image/'));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {boolean} true if the note has string content (not binary) */
 | 
					    /** @deprecated use hasStringContent() instead */
 | 
				
			||||||
    isStringNote() {
 | 
					    isStringNote() {
 | 
				
			||||||
 | 
					        return this.hasStringContent();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {boolean} true if the note has string content (not binary) */
 | 
				
			||||||
 | 
					    hasStringContent() {
 | 
				
			||||||
        return utils.isStringNote(this.type, this.mime);
 | 
					        return utils.isStringNote(this.type, this.mime);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -407,6 +376,9 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
					     * Beware that the method must not create a copy of the array, but actually returns its internal array
 | 
				
			||||||
 | 
					     * (for performance reasons)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @param {string} [type] - (optional) attribute type to filter
 | 
					     * @param {string} [type] - (optional) attribute type to filter
 | 
				
			||||||
     * @param {string} [name] - (optional) attribute name to filter
 | 
					     * @param {string} [name] - (optional) attribute name to filter
 | 
				
			||||||
     * @returns {BAttribute[]} all note's attributes, including inherited ones
 | 
					     * @returns {BAttribute[]} all note's attributes, including inherited ones
 | 
				
			||||||
@@ -425,7 +397,6 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            return this.__attributeCache.filter(attr => attr.name === name);
 | 
					            return this.__attributeCache.filter(attr => attr.name === name);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            // a bit unsafe to return the original array, but defensive copy would be costly
 | 
					 | 
				
			||||||
            return this.__attributeCache;
 | 
					            return this.__attributeCache;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -482,11 +453,11 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.inheritableAttributeCache = [];
 | 
					            this.__inheritableAttributeCache = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (const attr of this.__attributeCache) {
 | 
					            for (const attr of this.__attributeCache) {
 | 
				
			||||||
                if (attr.isInheritable) {
 | 
					                if (attr.isInheritable) {
 | 
				
			||||||
                    this.inheritableAttributeCache.push(attr);
 | 
					                    this.__inheritableAttributeCache.push(attr);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -503,11 +474,11 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!this.inheritableAttributeCache) {
 | 
					        if (!this.__inheritableAttributeCache) {
 | 
				
			||||||
            this.__getAttributes(path); // will refresh also this.inheritableAttributeCache
 | 
					            this.__getAttributes(path); // will refresh also this.__inheritableAttributeCache
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return this.inheritableAttributeCache;
 | 
					        return this.__inheritableAttributeCache;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    __validateTypeName(type, name) {
 | 
					    __validateTypeName(type, name) {
 | 
				
			||||||
@@ -560,6 +531,20 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    hasLabel(name, value) { return this.hasAttribute(LABEL, name, value); }
 | 
					    hasLabel(name, value) { return this.hasAttribute(LABEL, name, value); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param {string} name - label name
 | 
				
			||||||
 | 
					     * @returns {boolean} true if label exists (including inherited) and does not have "false" value.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isLabelTruthy(name) {
 | 
				
			||||||
 | 
					        const label = this.getLabel(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!label) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return label && label.value !== 'false';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @param {string} name - label name
 | 
					     * @param {string} name - label name
 | 
				
			||||||
     * @param {string} [value] - label value
 | 
					     * @param {string} [value] - label value
 | 
				
			||||||
@@ -642,7 +627,8 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @param {string} type - attribute type (label, relation, etc.)
 | 
					     * @param {string} type - attribute type (label, relation, etc.)
 | 
				
			||||||
     * @param {string} name - attribute name
 | 
					     * @param {string} name - attribute name
 | 
				
			||||||
     * @returns {BAttribute} attribute of given type and name. If there's more such attributes, first is  returned. Returns null if there's no such attribute belonging to this note.
 | 
					     * @returns {BAttribute} attribute of the given type and name. If there are more such attributes, first is returned.
 | 
				
			||||||
 | 
					     *                       Returns null if there's no such attribute belonging to this note.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    getAttribute(type, name) {
 | 
					    getAttribute(type, name) {
 | 
				
			||||||
        const attributes = this.getAttributes();
 | 
					        const attributes = this.getAttributes();
 | 
				
			||||||
@@ -721,6 +707,9 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
					     * Beware that the method must not create a copy of the array, but actually returns its internal array
 | 
				
			||||||
 | 
					     * (for performance reasons)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @param {string|null} [type] - (optional) attribute type to filter
 | 
					     * @param {string|null} [type] - (optional) attribute type to filter
 | 
				
			||||||
     * @param {string|null} [name] - (optional) attribute name to filter
 | 
					     * @param {string|null} [name] - (optional) attribute name to filter
 | 
				
			||||||
     * @param {string|null} [value] - (optional) attribute value to filter
 | 
					     * @param {string|null} [value] - (optional) attribute value to filter
 | 
				
			||||||
@@ -742,7 +731,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            return this.ownedAttributes.filter(attr => attr.name === name);
 | 
					            return this.ownedAttributes.filter(attr => attr.name === name);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            return this.ownedAttributes.slice();
 | 
					            return this.ownedAttributes;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -761,6 +750,21 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        return this.hasAttribute('label', 'archived');
 | 
					        return this.hasAttribute('label', 'archived');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    areAllNotePathsArchived() {
 | 
				
			||||||
 | 
					        // there's a slight difference between note being itself archived and all its note paths being archived
 | 
				
			||||||
 | 
					        // - note is archived when it itself has an archived label or inherits it
 | 
				
			||||||
 | 
					        // - note does not have or inherit archived label, but each note path contains a note with (non-inheritable)
 | 
				
			||||||
 | 
					        //   archived label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const bestNotePathRecord = this.getSortedNotePathRecords()[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!bestNotePathRecord) {
 | 
				
			||||||
 | 
					            throw new Error(`No note path available for note '${this.noteId}'`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return bestNotePathRecord.isArchived;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    hasInheritableArchivedLabel() {
 | 
					    hasInheritableArchivedLabel() {
 | 
				
			||||||
        for (const attr of this.getAttributes()) {
 | 
					        for (const attr of this.getAttributes()) {
 | 
				
			||||||
            if (attr.name === 'archived' && attr.type === LABEL && attr.isInheritable) {
 | 
					            if (attr.name === 'archived' && attr.type === LABEL && attr.isInheritable) {
 | 
				
			||||||
@@ -780,7 +784,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            } else if (a.parentNote?.isHiddenCompletely()) {
 | 
					            } else if (a.parentNote?.isHiddenCompletely()) {
 | 
				
			||||||
                return 1;
 | 
					                return 1;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                return -1;
 | 
					                return 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -800,7 +804,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            const aBranch = becca.getBranchFromChildAndParent(a.noteId, this.noteId);
 | 
					            const aBranch = becca.getBranchFromChildAndParent(a.noteId, this.noteId);
 | 
				
			||||||
            const bBranch = becca.getBranchFromChildAndParent(b.noteId, this.noteId);
 | 
					            const bBranch = becca.getBranchFromChildAndParent(b.noteId, this.noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return aBranch?.notePosition < bBranch?.notePosition ? -1 : 1;
 | 
					            return (aBranch?.notePosition - bBranch?.notePosition) || 0;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -812,40 +816,40 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
     * @returns {string} - returns flattened textual representation of note, prefixes and attributes
 | 
					     * @returns {string} - returns flattened textual representation of note, prefixes and attributes
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    getFlatText() {
 | 
					    getFlatText() {
 | 
				
			||||||
        if (!this.flatTextCache) {
 | 
					        if (!this.__flatTextCache) {
 | 
				
			||||||
            this.flatTextCache = `${this.noteId} ${this.type} ${this.mime} `;
 | 
					            this.__flatTextCache = `${this.noteId} ${this.type} ${this.mime} `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (const branch of this.parentBranches) {
 | 
					            for (const branch of this.parentBranches) {
 | 
				
			||||||
                if (branch.prefix) {
 | 
					                if (branch.prefix) {
 | 
				
			||||||
                    this.flatTextCache += `${branch.prefix} `;
 | 
					                    this.__flatTextCache += `${branch.prefix} `;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.flatTextCache += `${this.title} `;
 | 
					            this.__flatTextCache += `${this.title} `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (const attr of this.getAttributes()) {
 | 
					            for (const attr of this.getAttributes()) {
 | 
				
			||||||
                // it's best to use space as separator since spaces are filtered from the search string by the tokenization into words
 | 
					                // it's best to use space as separator since spaces are filtered from the search string by the tokenization into words
 | 
				
			||||||
                this.flatTextCache += `${attr.type === 'label' ? '#' : '~'}${attr.name}`;
 | 
					                this.__flatTextCache += `${attr.type === 'label' ? '#' : '~'}${attr.name}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (attr.value) {
 | 
					                if (attr.value) {
 | 
				
			||||||
                    this.flatTextCache += `=${attr.value}`;
 | 
					                    this.__flatTextCache += `=${attr.value}`;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                this.flatTextCache += ' ';
 | 
					                this.__flatTextCache += ' ';
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.flatTextCache = utils.normalize(this.flatTextCache);
 | 
					            this.__flatTextCache = utils.normalize(this.__flatTextCache);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return this.flatTextCache;
 | 
					        return this.__flatTextCache;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    invalidateThisCache() {
 | 
					    invalidateThisCache() {
 | 
				
			||||||
        this.flatTextCache = null;
 | 
					        this.__flatTextCache = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.__attributeCache = null;
 | 
					        this.__attributeCache = null;
 | 
				
			||||||
        this.inheritableAttributeCache = null;
 | 
					        this.__inheritableAttributeCache = null;
 | 
				
			||||||
        this.ancestorCache = null;
 | 
					        this.__ancestorCache = null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    invalidateSubTree(path = []) {
 | 
					    invalidateSubTree(path = []) {
 | 
				
			||||||
@@ -874,24 +878,6 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    invalidateSubtreeFlatText() {
 | 
					 | 
				
			||||||
        this.flatTextCache = null;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const childNote of this.children) {
 | 
					 | 
				
			||||||
            childNote.invalidateSubtreeFlatText();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (const targetRelation of this.targetRelations) {
 | 
					 | 
				
			||||||
            if (targetRelation.name === 'template' || targetRelation.name === 'inherit') {
 | 
					 | 
				
			||||||
                const note = targetRelation.note;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (note) {
 | 
					 | 
				
			||||||
                    note.invalidateSubtreeFlatText();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    getRelationDefinitions() {
 | 
					    getRelationDefinitions() {
 | 
				
			||||||
        return this.getLabels()
 | 
					        return this.getLabels()
 | 
				
			||||||
            .filter(l => l.name.startsWith("relation:"));
 | 
					            .filter(l => l.name.startsWith("relation:"));
 | 
				
			||||||
@@ -1020,7 +1006,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {String[]} - includes the subtree node as well */
 | 
					    /** @returns {string[]} - includes the subtree root note as well */
 | 
				
			||||||
    getSubtreeNoteIds({includeArchived = true, includeHidden = false, resolveSearch = false} = {}) {
 | 
					    getSubtreeNoteIds({includeArchived = true, includeHidden = false, resolveSearch = false} = {}) {
 | 
				
			||||||
        return this.getSubtree({includeArchived, includeHidden, resolveSearch})
 | 
					        return this.getSubtree({includeArchived, includeHidden, resolveSearch})
 | 
				
			||||||
            .notes
 | 
					            .notes
 | 
				
			||||||
@@ -1082,28 +1068,33 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /** @returns {BNote[]} */
 | 
					    /** @returns {BNote[]} */
 | 
				
			||||||
    getAncestors() {
 | 
					    getAncestors() {
 | 
				
			||||||
        if (!this.ancestorCache) {
 | 
					        if (!this.__ancestorCache) {
 | 
				
			||||||
            const noteIds = new Set();
 | 
					            const noteIds = new Set();
 | 
				
			||||||
            this.ancestorCache = [];
 | 
					            this.__ancestorCache = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (const parent of this.parents) {
 | 
					            for (const parent of this.parents) {
 | 
				
			||||||
                if (noteIds.has(parent.noteId)) {
 | 
					                if (noteIds.has(parent.noteId)) {
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                this.ancestorCache.push(parent);
 | 
					                this.__ancestorCache.push(parent);
 | 
				
			||||||
                noteIds.add(parent.noteId);
 | 
					                noteIds.add(parent.noteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (const ancestorNote of parent.getAncestors()) {
 | 
					                for (const ancestorNote of parent.getAncestors()) {
 | 
				
			||||||
                    if (!noteIds.has(ancestorNote.noteId)) {
 | 
					                    if (!noteIds.has(ancestorNote.noteId)) {
 | 
				
			||||||
                        this.ancestorCache.push(ancestorNote);
 | 
					                        this.__ancestorCache.push(ancestorNote);
 | 
				
			||||||
                        noteIds.add(ancestorNote.noteId);
 | 
					                        noteIds.add(ancestorNote.noteId);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return this.ancestorCache;
 | 
					        return this.__ancestorCache;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {string[]} */
 | 
				
			||||||
 | 
					    getAncestorNoteIds() {
 | 
				
			||||||
 | 
					        return this.getAncestors().map(note => note.noteId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {boolean} */
 | 
					    /** @returns {boolean} */
 | 
				
			||||||
@@ -1121,6 +1112,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        return this.noteId === '_hidden' || this.hasAncestor('_hidden');
 | 
					        return this.noteId === '_hidden' || this.hasAncestor('_hidden');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BAttribute[]} */
 | 
				
			||||||
    getTargetRelations() {
 | 
					    getTargetRelations() {
 | 
				
			||||||
        return this.targetRelations;
 | 
					        return this.targetRelations;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -1157,13 +1149,66 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        return minDistance;
 | 
					        return minDistance;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {BNoteRevision[]} */
 | 
					    /** @returns {BRevision[]} */
 | 
				
			||||||
    getNoteRevisions() {
 | 
					    getRevisions() {
 | 
				
			||||||
        return sql.getRows("SELECT * FROM note_revisions WHERE noteId = ?", [this.noteId])
 | 
					        return sql.getRows("SELECT * FROM revisions WHERE noteId = ?", [this.noteId])
 | 
				
			||||||
            .map(row => new BNoteRevision(row));
 | 
					            .map(row => new BRevision(row));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BAttachment[]} */
 | 
				
			||||||
 | 
					    getAttachments(opts = {}) {
 | 
				
			||||||
 | 
					        opts.includeContentLength = !!opts.includeContentLength;
 | 
				
			||||||
 | 
					        // from testing, it looks like calculating length does not make a difference in performance even on large-ish DB
 | 
				
			||||||
 | 
					        // given that we're always fetching attachments only for a specific note, we might just do it always
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const query = opts.includeContentLength
 | 
				
			||||||
 | 
					            ? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
 | 
				
			||||||
 | 
					               FROM attachments 
 | 
				
			||||||
 | 
					               JOIN blobs USING (blobId) 
 | 
				
			||||||
 | 
					               WHERE ownerId = ? AND isDeleted = 0 
 | 
				
			||||||
 | 
					               ORDER BY position`
 | 
				
			||||||
 | 
					            : `SELECT * FROM attachments WHERE ownerId = ? AND isDeleted = 0 ORDER BY position`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return sql.getRows(query, [this.noteId])
 | 
				
			||||||
 | 
					            .map(row => new BAttachment(row));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BAttachment|null} */
 | 
				
			||||||
 | 
					    getAttachmentById(attachmentId, opts = {}) {
 | 
				
			||||||
 | 
					        opts.includeContentLength = !!opts.includeContentLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const query = opts.includeContentLength
 | 
				
			||||||
 | 
					            ? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
 | 
				
			||||||
 | 
					               FROM attachments 
 | 
				
			||||||
 | 
					               JOIN blobs USING (blobId) 
 | 
				
			||||||
 | 
					               WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
 | 
				
			||||||
 | 
					            : `SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return sql.getRows(query, [this.noteId, attachmentId])
 | 
				
			||||||
 | 
					            .map(row => new BAttachment(row))[0];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BAttachment[]} */
 | 
				
			||||||
 | 
					    getAttachmentsByRole(role) {
 | 
				
			||||||
 | 
					        return sql.getRows(`
 | 
				
			||||||
 | 
					                SELECT attachments.*
 | 
				
			||||||
 | 
					                FROM attachments 
 | 
				
			||||||
 | 
					                WHERE ownerId = ? 
 | 
				
			||||||
 | 
					                  AND role = ?
 | 
				
			||||||
 | 
					                  AND isDeleted = 0
 | 
				
			||||||
 | 
					                ORDER BY position`, [this.noteId, role])
 | 
				
			||||||
 | 
					            .map(row => new BAttachment(row));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {BAttachment} */
 | 
				
			||||||
 | 
					    getAttachmentByTitle(title) {
 | 
				
			||||||
 | 
					        // cannot use SQL to filter by title since it can be encrypted
 | 
				
			||||||
 | 
					        return this.getAttachments().filter(attachment => attachment.title === title)[0];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
					     * Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
     * @returns {string[][]} - array of notePaths (each represented by array of noteIds constituting the particular note path)
 | 
					     * @returns {string[][]} - array of notePaths (each represented by array of noteIds constituting the particular note path)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    getAllNotePaths() {
 | 
					    getAllNotePaths() {
 | 
				
			||||||
@@ -1171,18 +1216,70 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            return [['root']];
 | 
					            return [['root']];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const notePaths = [];
 | 
					        const parentNotes = this.getParentNotes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (const parentNote of this.getParentNotes()) {
 | 
					        const notePaths = parentNotes.length === 1
 | 
				
			||||||
            for (const parentPath of parentNote.getAllNotePaths()) {
 | 
					            ? parentNotes[0].getAllNotePaths() // optimization for the most common case
 | 
				
			||||||
                parentPath.push(this.noteId);
 | 
					            : parentNotes.flatMap(parentNote => parentNote.getAllNotePaths());
 | 
				
			||||||
                notePaths.push(parentPath);
 | 
					
 | 
				
			||||||
            }
 | 
					        for (const notePath of notePaths) {
 | 
				
			||||||
 | 
					            notePath.push(this.noteId);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return notePaths;
 | 
					        return notePaths;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param {string} [hoistedNoteId='root']
 | 
				
			||||||
 | 
					     * @return {Array<NotePathRecord>}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getSortedNotePathRecords(hoistedNoteId = 'root') {
 | 
				
			||||||
 | 
					        const isHoistedRoot = hoistedNoteId === 'root';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const notePaths = this.getAllNotePaths().map(path => ({
 | 
				
			||||||
 | 
					            notePath: path,
 | 
				
			||||||
 | 
					            isInHoistedSubTree: isHoistedRoot || path.includes(hoistedNoteId),
 | 
				
			||||||
 | 
					            isArchived: path.some(noteId => this.becca.notes[noteId].isArchived),
 | 
				
			||||||
 | 
					            isHidden: path.includes('_hidden')
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        notePaths.sort((a, b) => {
 | 
				
			||||||
 | 
					            if (a.isInHoistedSubTree !== b.isInHoistedSubTree) {
 | 
				
			||||||
 | 
					                return a.isInHoistedSubTree ? -1 : 1;
 | 
				
			||||||
 | 
					            } else if (a.isArchived !== b.isArchived) {
 | 
				
			||||||
 | 
					                return a.isArchived ? 1 : -1;
 | 
				
			||||||
 | 
					            } else if (a.isHidden !== b.isHidden) {
 | 
				
			||||||
 | 
					                return a.isHidden ? 1 : -1;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                return a.notePath.length - b.notePath.length;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return notePaths;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns a note path considered to be the "best"
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param {string} [hoistedNoteId='root']
 | 
				
			||||||
 | 
					     * @return {string[]} array of noteIds constituting the particular note path
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getBestNotePath(hoistedNoteId = 'root') {
 | 
				
			||||||
 | 
					        return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns a note path considered to be the "best"
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param {string} [hoistedNoteId='root']
 | 
				
			||||||
 | 
					     * @return {string} serialized note path (e.g. 'root/a1h315/js725h')
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getBestNotePathString(hoistedNoteId = 'root') {
 | 
				
			||||||
 | 
					        const notePath = this.getBestNotePath(hoistedNoteId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return notePath?.join("/");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree
 | 
					     * @return boolean - true if there's no non-hidden path, note is not cloned to the visible tree
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -1196,9 +1293,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            } else if (parentNote.noteId === '_hidden') {
 | 
					            } else if (parentNote.noteId === '_hidden') {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            } else if (!parentNote.isHiddenCompletely()) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (!parentNote.isHiddenCompletely()) {
 | 
					 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1272,10 +1367,10 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
     * @param {string} name - name of the attribute, not including the leading ~/#
 | 
					     * @param {string} name - name of the attribute, not including the leading ~/#
 | 
				
			||||||
     * @param {string} [value] - value of the attribute - text for labels, target note ID for relations; optional.
 | 
					     * @param {string} [value] - value of the attribute - text for labels, target note ID for relations; optional.
 | 
				
			||||||
     * @param {boolean} [isInheritable=false]
 | 
					     * @param {boolean} [isInheritable=false]
 | 
				
			||||||
     * @param {int} [position]
 | 
					     * @param {int|null} [position]
 | 
				
			||||||
     * @returns {BAttribute}
 | 
					     * @returns {BAttribute}
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    addAttribute(type, name, value = "", isInheritable = false, position = 1000) {
 | 
					    addAttribute(type, name, value = "", isInheritable = false, position = null) {
 | 
				
			||||||
        const BAttribute = require("./battribute");
 | 
					        const BAttribute = require("./battribute");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new BAttribute({
 | 
					        return new BAttribute({
 | 
				
			||||||
@@ -1314,7 +1409,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Based on enabled, attribute is either set or removed.
 | 
					     * Based on enabled, the attribute is either set or removed.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param {string} type - attribute type ('relation', 'label' etc.)
 | 
					     * @param {string} type - attribute type ('relation', 'label' etc.)
 | 
				
			||||||
     * @param {boolean} enabled - toggle On or Off
 | 
					     * @param {boolean} enabled - toggle On or Off
 | 
				
			||||||
@@ -1373,7 +1468,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
    removeLabel(name, value) { return this.removeAttribute(LABEL, name, value); }
 | 
					    removeLabel(name, value) { return this.removeAttribute(LABEL, name, value); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Remove relation name-value pair, if it exists.
 | 
					     * Remove the relation name-value pair, if it exists.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param {string} name - relation name
 | 
					     * @param {string} name - relation name
 | 
				
			||||||
     * @param {string} [value] - relation value (noteId)
 | 
					     * @param {string} [value] - relation value (noteId)
 | 
				
			||||||
@@ -1392,7 +1487,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @param parentNoteId
 | 
					     * @param parentNoteId
 | 
				
			||||||
     * @returns {{success: boolean, message: string}}
 | 
					     * @returns {{success: boolean, message: string, branchId: string, notePath: string}}
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    cloneTo(parentNoteId) {
 | 
					    cloneTo(parentNoteId) {
 | 
				
			||||||
        const cloningService = require("../../services/cloning");
 | 
					        const cloningService = require("../../services/cloning");
 | 
				
			||||||
@@ -1402,13 +1497,89 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        return cloningService.cloneNoteToBranch(this.noteId, branch.branchId);
 | 
					        return cloningService.cloneNoteToBranch(this.noteId, branch.branchId);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    isEligibleForConversionToAttachment(opts = {autoConversion: false}) {
 | 
				
			||||||
 | 
					        if (this.type !== 'image' || !this.isContentAvailable() || this.hasChildren() || this.getParentBranches().length !== 1) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const targetRelations = this.getTargetRelations().filter(relation => relation.name === 'imageLink');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (opts.autoConversion && targetRelations.length === 0) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        } else if (targetRelations.length > 1) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const parentNote = this.getParentNotes()[0]; // at this point note can have only one parent
 | 
				
			||||||
 | 
					        const referencingNote = targetRelations[0]?.getNote();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (referencingNote && parentNote !== referencingNote) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        } else if (parentNote.type !== 'text' || !parentNote.isContentAvailable()) {
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Some notes are eligible for conversion into an attachment of its parent, note must have these properties:
 | 
				
			||||||
 | 
					     * - it has exactly one target relation
 | 
				
			||||||
 | 
					     * - it has a relation from its parent note
 | 
				
			||||||
 | 
					     * - it has no children
 | 
				
			||||||
 | 
					     * - it has no clones
 | 
				
			||||||
 | 
					     * - the parent is of type text
 | 
				
			||||||
 | 
					     * - both notes are either unprotected or user is in protected session
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Currently, works only for image notes.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * In the future, this functionality might get more generic and some of the requirements relaxed.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @params {Object} [opts]
 | 
				
			||||||
 | 
					     * @params {bolean} [opts.autoConversion=false} if true, the action is not triggered by user, but e.g. by migration,
 | 
				
			||||||
 | 
					     *                                              and only perfect candidates will be migrated
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @returns {BAttachment|null} - null if note is not eligible for conversion
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    convertToParentAttachment(opts = {autoConversion: false}) {
 | 
				
			||||||
 | 
					        if (!this.isEligibleForConversionToAttachment(opts)) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const content = this.getContent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const parentNote = this.getParentNotes()[0];
 | 
				
			||||||
 | 
					        const attachment = parentNote.saveAttachment({
 | 
				
			||||||
 | 
					            role: 'image',
 | 
				
			||||||
 | 
					            mime: this.mime,
 | 
				
			||||||
 | 
					            title: this.title,
 | 
				
			||||||
 | 
					            content: content
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let parentContent = parentNote.getContent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const oldNoteUrl = `api/images/${this.noteId}/`;
 | 
				
			||||||
 | 
					        const newAttachmentUrl = `api/attachments/${attachment.attachmentId}/image/`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const fixedContent = utils.replaceAll(parentContent, oldNoteUrl, newAttachmentUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parentNote.setContent(fixedContent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const noteService = require("../../services/notes");
 | 
				
			||||||
 | 
					        noteService.asyncPostProcessContent(parentNote, fixedContent); // to mark an unused attachment for deletion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.deleteNote();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return attachment;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * (Soft) delete a note and all its descendants.
 | 
					     * (Soft) delete a note and all its descendants.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param {string} [deleteId] - optional delete identified
 | 
					     * @param {string} [deleteId=null] - optional delete identified
 | 
				
			||||||
     * @param {TaskContext} [taskContext]
 | 
					     * @param {TaskContext} [taskContext]
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    deleteNote(deleteId, taskContext) {
 | 
					    deleteNote(deleteId = null, taskContext = null) {
 | 
				
			||||||
        if (this.isDeleted) {
 | 
					        if (this.isDeleted) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1435,7 +1606,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
        if (this.isProtected && !this.isDecrypted && protectedSessionService.isProtectedSessionAvailable()) {
 | 
					        if (this.isProtected && !this.isDecrypted && protectedSessionService.isProtectedSessionAvailable()) {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                this.title = protectedSessionService.decryptString(this.title);
 | 
					                this.title = protectedSessionService.decryptString(this.title);
 | 
				
			||||||
                this.flatTextCache = null;
 | 
					                this.__flatTextCache = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                this.isDecrypted = true;
 | 
					                this.isDecrypted = true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -1454,42 +1625,90 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get isDeleted() {
 | 
					    get isDeleted() {
 | 
				
			||||||
 | 
					        // isBeingDeleted is relevant only in the transition period when the deletion process has begun, but not yet
 | 
				
			||||||
 | 
					        // finished (note is still in becca)
 | 
				
			||||||
        return !(this.noteId in this.becca.notes) || this.isBeingDeleted;
 | 
					        return !(this.noteId in this.becca.notes) || this.isBeingDeleted;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @returns {BNoteRevision|null}
 | 
					     * @returns {BRevision|null}
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    saveNoteRevision() {
 | 
					    saveRevision() {
 | 
				
			||||||
        const content = this.getContent();
 | 
					        return sql.transactional(() => {
 | 
				
			||||||
 | 
					            let noteContent = this.getContent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!content || (Buffer.isBuffer(content) && content.byteLength === 0)) {
 | 
					            const revision = new BRevision({
 | 
				
			||||||
            return null;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const contentMetadata = this.getContentMetadata();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const noteRevision = new BNoteRevision({
 | 
					 | 
				
			||||||
                noteId: this.noteId,
 | 
					                noteId: this.noteId,
 | 
				
			||||||
                // title and text should be decrypted now
 | 
					                // title and text should be decrypted now
 | 
				
			||||||
                title: this.title,
 | 
					                title: this.title,
 | 
				
			||||||
                type: this.type,
 | 
					                type: this.type,
 | 
				
			||||||
                mime: this.mime,
 | 
					                mime: this.mime,
 | 
				
			||||||
                isProtected: this.isProtected,
 | 
					                isProtected: this.isProtected,
 | 
				
			||||||
            utcDateLastEdited: this.utcDateModified > contentMetadata.utcDateModified
 | 
					                utcDateLastEdited: this.utcDateModified,
 | 
				
			||||||
                ? this.utcDateModified
 | 
					 | 
				
			||||||
                : contentMetadata.utcDateModified,
 | 
					 | 
				
			||||||
                utcDateCreated: dateUtils.utcNowDateTime(),
 | 
					                utcDateCreated: dateUtils.utcNowDateTime(),
 | 
				
			||||||
                utcDateModified: dateUtils.utcNowDateTime(),
 | 
					                utcDateModified: dateUtils.utcNowDateTime(),
 | 
				
			||||||
            dateLastEdited: this.dateModified > contentMetadata.dateModified
 | 
					                dateLastEdited: this.dateModified,
 | 
				
			||||||
                ? this.dateModified
 | 
					 | 
				
			||||||
                : contentMetadata.dateModified,
 | 
					 | 
				
			||||||
                dateCreated: dateUtils.localNowDateTime()
 | 
					                dateCreated: dateUtils.localNowDateTime()
 | 
				
			||||||
        }, true).save();
 | 
					            }, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        noteRevision.setContent(content);
 | 
					            revision.save(); // to generate revisionId, which is then used to save attachments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return noteRevision;
 | 
					            for (const noteAttachment of this.getAttachments()) {
 | 
				
			||||||
 | 
					                const revisionAttachment = noteAttachment.copy();
 | 
				
			||||||
 | 
					                revisionAttachment.ownerId = revision.revisionId;
 | 
				
			||||||
 | 
					                revisionAttachment.setContent(noteAttachment.getContent(), {forceSave: true});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (this.type === 'text') {
 | 
				
			||||||
 | 
					                    // content is rewritten to point to the revision attachments
 | 
				
			||||||
 | 
					                    noteContent = noteContent.replaceAll(`attachments/${noteAttachment.attachmentId}`,
 | 
				
			||||||
 | 
					                        `attachments/${revisionAttachment.attachmentId}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    noteContent = noteContent.replaceAll(new RegExp(`href="[^"]*attachmentId=${noteAttachment.attachmentId}[^"]*"`, 'gi'),
 | 
				
			||||||
 | 
					                        `href="api/attachments/${revisionAttachment.attachmentId}/download"`);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            revision.setContent(noteContent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return revision;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param {string} matchBy - choose by which property we detect if to update an existing attachment.
 | 
				
			||||||
 | 
					 *                               Supported values are either 'attachmentId' (default) or 'title'
 | 
				
			||||||
 | 
					     * @returns {BAttachment}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    saveAttachment({attachmentId, role, mime, title, content, position}, matchBy = 'attachmentId') {
 | 
				
			||||||
 | 
					        if (!['attachmentId', 'title'].includes(matchBy)) {
 | 
				
			||||||
 | 
					            throw new Error(`Unsupported value '${matchBy}' for matchBy param, has to be either 'attachmentId' or 'title'.`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let attachment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (matchBy === 'title') {
 | 
				
			||||||
 | 
					            attachment = this.getAttachmentByTitle(title);
 | 
				
			||||||
 | 
					        } else if (matchBy === 'attachmentId' && attachmentId) {
 | 
				
			||||||
 | 
					            attachment = this.becca.getAttachmentOrThrow(attachmentId);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        attachment = attachment || new BAttachment({
 | 
				
			||||||
 | 
					            ownerId: this.noteId,
 | 
				
			||||||
 | 
					            title,
 | 
				
			||||||
 | 
					            role,
 | 
				
			||||||
 | 
					            mime,
 | 
				
			||||||
 | 
					            isProtected: this.isProtected,
 | 
				
			||||||
 | 
					            position
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        content = content || "";
 | 
				
			||||||
 | 
					        attachment.setContent(content, {forceSave: true});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return attachment;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getFileName() {
 | 
				
			||||||
 | 
					        return utils.formatDownloadTitle(this.title, this.type, this.mime);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    beforeSaving() {
 | 
					    beforeSaving() {
 | 
				
			||||||
@@ -1508,6 +1727,7 @@ class BNote extends AbstractBeccaEntity {
 | 
				
			|||||||
            isProtected: this.isProtected,
 | 
					            isProtected: this.isProtected,
 | 
				
			||||||
            type: this.type,
 | 
					            type: this.type,
 | 
				
			||||||
            mime: this.mime,
 | 
					            mime: this.mime,
 | 
				
			||||||
 | 
					            blobId: this.blobId,
 | 
				
			||||||
            isDeleted: false,
 | 
					            isDeleted: false,
 | 
				
			||||||
            dateCreated: this.dateCreated,
 | 
					            dateCreated: this.dateCreated,
 | 
				
			||||||
            dateModified: this.dateModified,
 | 
					            dateModified: this.dateModified,
 | 
				
			||||||
@@ -1544,13 +1764,13 @@ module.exports = BNote;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ const dateUtils = require('../../services/date_utils');
 | 
				
			|||||||
const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
					const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Option represents name-value pair, either directly configurable by the user or some system property.
 | 
					 * Option represents a name-value pair, either directly configurable by the user or some system property.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @extends AbstractBeccaEntity
 | 
					 * @extends AbstractBeccaEntity
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -44,6 +44,11 @@ class BOption extends AbstractBeccaEntity {
 | 
				
			|||||||
    constructor(row) {
 | 
					    constructor(row) {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.updateFromRow(row);
 | 
				
			||||||
 | 
					        this.becca.options[this.name] = this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    updateFromRow(row) {
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.name = row.name;
 | 
					        this.name = row.name;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
@@ -52,8 +57,6 @@ class BOption extends AbstractBeccaEntity {
 | 
				
			|||||||
        this.isSynced = !!row.isSynced;
 | 
					        this.isSynced = !!row.isSynced;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.utcDateModified = row.utcDateModified;
 | 
					        this.utcDateModified = row.utcDateModified;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        this.becca.options[this.name] = this;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    beforeSaving() {
 | 
					    beforeSaving() {
 | 
				
			||||||
@@ -83,13 +86,13 @@ module.exports = BOption;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,13 +71,13 @@ module.exports = BRecentNote;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
<html lang="en">
 | 
					<html lang="en">
 | 
				
			||||||
<head>
 | 
					<head>
 | 
				
			||||||
    <meta charset="utf-8">
 | 
					    <meta charset="utf-8">
 | 
				
			||||||
    <title>JSDoc: Source: becca/entities/bnote_revision.js</title>
 | 
					    <title>JSDoc: Source: becca/entities/brevision.js</title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <script src="scripts/prettify/prettify.js"> </script>
 | 
					    <script src="scripts/prettify/prettify.js"> </script>
 | 
				
			||||||
    <script src="scripts/prettify/lang-css.js"> </script>
 | 
					    <script src="scripts/prettify/lang-css.js"> </script>
 | 
				
			||||||
@@ -17,7 +17,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<div id="main">
 | 
					<div id="main">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h1 class="page-title">Source: becca/entities/bnote_revision.js</h1>
 | 
					    <h1 class="page-title">Source: becca/entities/brevision.js</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,28 +30,29 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const protectedSessionService = require('../../services/protected_session');
 | 
					const protectedSessionService = require('../../services/protected_session');
 | 
				
			||||||
const utils = require('../../services/utils');
 | 
					const utils = require('../../services/utils');
 | 
				
			||||||
const sql = require('../../services/sql');
 | 
					 | 
				
			||||||
const dateUtils = require('../../services/date_utils');
 | 
					const dateUtils = require('../../services/date_utils');
 | 
				
			||||||
const becca = require('../becca');
 | 
					const becca = require('../becca');
 | 
				
			||||||
const entityChangesService = require('../../services/entity_changes');
 | 
					 | 
				
			||||||
const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
					const AbstractBeccaEntity = require("./abstract_becca_entity");
 | 
				
			||||||
 | 
					const sql = require("../../services/sql");
 | 
				
			||||||
 | 
					const BAttachment = require("./battachment");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NoteRevision represents snapshot of note's title and content at some point in the past.
 | 
					 * Revision represents a snapshot of note's title and content at some point in the past.
 | 
				
			||||||
 * It's used for seamless note versioning.
 | 
					 * It's used for seamless note versioning.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @extends AbstractBeccaEntity
 | 
					 * @extends AbstractBeccaEntity
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class BNoteRevision extends AbstractBeccaEntity {
 | 
					class BRevision extends AbstractBeccaEntity {
 | 
				
			||||||
    static get entityName() { return "note_revisions"; }
 | 
					    static get entityName() { return "revisions"; }
 | 
				
			||||||
    static get primaryKeyName() { return "noteRevisionId"; }
 | 
					    static get primaryKeyName() { return "revisionId"; }
 | 
				
			||||||
    static get hashedProperties() { return ["noteRevisionId", "noteId", "title", "isProtected", "dateLastEdited", "dateCreated", "utcDateLastEdited", "utcDateCreated", "utcDateModified"]; }
 | 
					    static get hashedProperties() { return ["revisionId", "noteId", "title", "isProtected", "dateLastEdited", "dateCreated",
 | 
				
			||||||
 | 
					                                            "utcDateLastEdited", "utcDateCreated", "utcDateModified", "blobId"]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(row, titleDecrypted = false) {
 | 
					    constructor(row, titleDecrypted = false) {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.noteRevisionId = row.noteRevisionId;
 | 
					        this.revisionId = row.revisionId;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.noteId = row.noteId;
 | 
					        this.noteId = row.noteId;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
@@ -63,6 +64,8 @@ class BNoteRevision extends AbstractBeccaEntity {
 | 
				
			|||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.title = row.title;
 | 
					        this.title = row.title;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
 | 
					        this.blobId = row.blobId;
 | 
				
			||||||
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.dateLastEdited = row.dateLastEdited;
 | 
					        this.dateLastEdited = row.dateLastEdited;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.dateCreated = row.dateCreated;
 | 
					        this.dateCreated = row.dateCreated;
 | 
				
			||||||
@@ -72,7 +75,7 @@ class BNoteRevision extends AbstractBeccaEntity {
 | 
				
			|||||||
        this.utcDateCreated = row.utcDateCreated;
 | 
					        this.utcDateCreated = row.utcDateCreated;
 | 
				
			||||||
        /** @type {string} */
 | 
					        /** @type {string} */
 | 
				
			||||||
        this.utcDateModified = row.utcDateModified;
 | 
					        this.utcDateModified = row.utcDateModified;
 | 
				
			||||||
        /** @type {number} */
 | 
					        /** @type {int} */
 | 
				
			||||||
        this.contentLength = row.contentLength;
 | 
					        this.contentLength = row.contentLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.isProtected && !titleDecrypted) {
 | 
					        if (this.isProtected && !titleDecrypted) {
 | 
				
			||||||
@@ -87,92 +90,103 @@ class BNoteRevision extends AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {boolean} true if the note has string content (not binary) */
 | 
					    /** @returns {boolean} true if the note has string content (not binary) */
 | 
				
			||||||
    isStringNote() {
 | 
					    hasStringContent() {
 | 
				
			||||||
        return utils.isStringNote(this.type, this.mime);
 | 
					        return utils.isStringNote(this.type, this.mime);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    isContentAvailable() {
 | 
				
			||||||
 | 
					        return !this.revisionId // new note which was not encrypted yet
 | 
				
			||||||
 | 
					            || !this.isProtected
 | 
				
			||||||
 | 
					            || protectedSessionService.isProtectedSessionAvailable()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
     * Note revision content has quite special handling - it's not a separate entity, but a lazily loaded
 | 
					     * Note revision content has quite special handling - it's not a separate entity, but a lazily loaded
 | 
				
			||||||
     * part of NoteRevision entity with its own sync. Reason behind this hybrid design is that
 | 
					     * part of Revision entity with its own sync. The reason behind this hybrid design is that
 | 
				
			||||||
     * content can be quite large, and it's not necessary to load it / fill memory for any note access even
 | 
					     * content can be quite large, and it's not necessary to load it / fill memory for any note access even
 | 
				
			||||||
     * if we don't need a content, especially for bulk operations like search.
 | 
					     * if we don't need a content, especially for bulk operations like search.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * This is the same approach as is used for Note's content.
 | 
					     * This is the same approach as is used for Note's content.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {*} */
 | 
					    /** @returns {string|Buffer} */
 | 
				
			||||||
    getContent(silentNotFoundError = false) {
 | 
					    getContent() {
 | 
				
			||||||
        const res = sql.getRow(`SELECT content FROM note_revision_contents WHERE noteRevisionId = ?`, [this.noteRevisionId]);
 | 
					        return this._getContent();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!res) {
 | 
					 | 
				
			||||||
            if (silentNotFoundError) {
 | 
					 | 
				
			||||||
                return undefined;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
            else {
 | 
					
 | 
				
			||||||
                throw new Error(`Cannot find note revision content for noteRevisionId=${this.noteRevisionId}`);
 | 
					    /**
 | 
				
			||||||
 | 
					     * @returns {*}
 | 
				
			||||||
 | 
					     * @throws Error in case of invalid JSON */
 | 
				
			||||||
 | 
					    getJsonContent() {
 | 
				
			||||||
 | 
					        const content = this.getContent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!content || !content.trim()) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return JSON.parse(content);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @returns {*|null} valid object or null if the content cannot be parsed as JSON */
 | 
				
			||||||
 | 
					    getJsonContentSafely() {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            return this.getJsonContent();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        catch (e) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let content = res.content;
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param content
 | 
				
			||||||
        if (this.isProtected) {
 | 
					     * @param {object} [opts]
 | 
				
			||||||
            if (protectedSessionService.isProtectedSessionAvailable()) {
 | 
					     * @param {object} [opts.forceSave=false] - will also save this BRevision entity
 | 
				
			||||||
                content = protectedSessionService.decrypt(content);
 | 
					     */
 | 
				
			||||||
            }
 | 
					    setContent(content, opts) {
 | 
				
			||||||
            else {
 | 
					        this._setContent(content, opts);
 | 
				
			||||||
                content = "";
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.isStringNote()) {
 | 
					    /** @returns {BAttachment[]} */
 | 
				
			||||||
            return content === null
 | 
					    getAttachments() {
 | 
				
			||||||
                ? ""
 | 
					        return sql.getRows(`
 | 
				
			||||||
                : content.toString("UTF-8");
 | 
					                SELECT attachments.*
 | 
				
			||||||
        }
 | 
					                FROM attachments 
 | 
				
			||||||
        else {
 | 
					                WHERE ownerId = ? 
 | 
				
			||||||
            return content;
 | 
					                  AND isDeleted = 0`, [this.revisionId])
 | 
				
			||||||
        }
 | 
					            .map(row => new BAttachment(row));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setContent(content) {
 | 
					    /** @returns {BAttachment|null} */
 | 
				
			||||||
        const pojo = {
 | 
					    getAttachmentById(attachmentId, opts = {}) {
 | 
				
			||||||
            noteRevisionId: this.noteRevisionId,
 | 
					        opts.includeContentLength = !!opts.includeContentLength;
 | 
				
			||||||
            content: content,
 | 
					 | 
				
			||||||
            utcDateModified: dateUtils.utcNowDateTime()
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.isProtected) {
 | 
					        const query = opts.includeContentLength
 | 
				
			||||||
            if (protectedSessionService.isProtectedSessionAvailable()) {
 | 
					            ? `SELECT attachments.*, LENGTH(blobs.content) AS contentLength
 | 
				
			||||||
                pojo.content = protectedSessionService.encrypt(pojo.content);
 | 
					               FROM attachments 
 | 
				
			||||||
            }
 | 
					               JOIN blobs USING (blobId) 
 | 
				
			||||||
            else {
 | 
					               WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`
 | 
				
			||||||
                throw new Error(`Cannot update content of noteRevisionId=${this.noteRevisionId} since we're out of protected session.`);
 | 
					            : `SELECT * FROM attachments WHERE ownerId = ? AND attachmentId = ? AND isDeleted = 0`;
 | 
				
			||||||
            }
 | 
					
 | 
				
			||||||
 | 
					        return sql.getRows(query, [this.revisionId, attachmentId])
 | 
				
			||||||
 | 
					            .map(row => new BAttachment(row))[0];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sql.upsert("note_revision_contents", "noteRevisionId", pojo);
 | 
					    /** @returns {BAttachment[]} */
 | 
				
			||||||
 | 
					    getAttachmentsByRole(role) {
 | 
				
			||||||
        const hash = utils.hash(`${this.noteRevisionId}|${pojo.content.toString()}`);
 | 
					        return sql.getRows(`
 | 
				
			||||||
 | 
					                SELECT attachments.*
 | 
				
			||||||
        entityChangesService.addEntityChange({
 | 
					                FROM attachments 
 | 
				
			||||||
            entityName: 'note_revision_contents',
 | 
					                WHERE ownerId = ? 
 | 
				
			||||||
            entityId: this.noteRevisionId,
 | 
					                  AND role = ?
 | 
				
			||||||
            hash: hash,
 | 
					                  AND isDeleted = 0
 | 
				
			||||||
            isErased: false,
 | 
					                ORDER BY position`, [this.revisionId, role])
 | 
				
			||||||
            utcDateChanged: this.getUtcDateChanged(),
 | 
					            .map(row => new BAttachment(row));
 | 
				
			||||||
            isSynced: true
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** @returns {{contentLength, dateModified, utcDateModified}} */
 | 
					    /** @returns {BAttachment} */
 | 
				
			||||||
    getContentMetadata() {
 | 
					    getAttachmentByTitle(title) {
 | 
				
			||||||
        return sql.getRow(`
 | 
					        // cannot use SQL to filter by title since it can be encrypted
 | 
				
			||||||
            SELECT 
 | 
					        return this.getAttachments().filter(attachment => attachment.title === title)[0];
 | 
				
			||||||
                LENGTH(content) AS contentLength, 
 | 
					 | 
				
			||||||
                dateModified,
 | 
					 | 
				
			||||||
                utcDateModified 
 | 
					 | 
				
			||||||
            FROM note_revision_contents 
 | 
					 | 
				
			||||||
            WHERE noteRevisionId = ?`, [this.noteRevisionId]);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    beforeSaving() {
 | 
					    beforeSaving() {
 | 
				
			||||||
@@ -183,23 +197,26 @@ class BNoteRevision extends AbstractBeccaEntity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    getPojo() {
 | 
					    getPojo() {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            noteRevisionId: this.noteRevisionId,
 | 
					            revisionId: this.revisionId,
 | 
				
			||||||
            noteId: this.noteId,
 | 
					            noteId: this.noteId,
 | 
				
			||||||
            type: this.type,
 | 
					            type: this.type,
 | 
				
			||||||
            mime: this.mime,
 | 
					            mime: this.mime,
 | 
				
			||||||
            isProtected: this.isProtected,
 | 
					            isProtected: this.isProtected,
 | 
				
			||||||
            title: this.title,
 | 
					            title: this.title,
 | 
				
			||||||
 | 
					            blobId: this.blobId,
 | 
				
			||||||
            dateLastEdited: this.dateLastEdited,
 | 
					            dateLastEdited: this.dateLastEdited,
 | 
				
			||||||
            dateCreated: this.dateCreated,
 | 
					            dateCreated: this.dateCreated,
 | 
				
			||||||
            utcDateLastEdited: this.utcDateLastEdited,
 | 
					            utcDateLastEdited: this.utcDateLastEdited,
 | 
				
			||||||
            utcDateCreated: this.utcDateCreated,
 | 
					            utcDateCreated: this.utcDateCreated,
 | 
				
			||||||
            utcDateModified: this.utcDateModified,
 | 
					            utcDateModified: this.utcDateModified,
 | 
				
			||||||
 | 
					            content: this.content, // used when retrieving full note revision to frontend
 | 
				
			||||||
            contentLength: this.contentLength
 | 
					            contentLength: this.contentLength
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getPojoToSave() {
 | 
					    getPojoToSave() {
 | 
				
			||||||
        const pojo = this.getPojo();
 | 
					        const pojo = this.getPojo();
 | 
				
			||||||
 | 
					        delete pojo.content; // not getting persisted
 | 
				
			||||||
        delete pojo.contentLength; // not getting persisted
 | 
					        delete pojo.contentLength; // not getting persisted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (pojo.isProtected) {
 | 
					        if (pojo.isProtected) {
 | 
				
			||||||
@@ -216,7 +233,7 @@ class BNoteRevision extends AbstractBeccaEntity {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = BNoteRevision;
 | 
					module.exports = BRevision;
 | 
				
			||||||
</code></pre>
 | 
					</code></pre>
 | 
				
			||||||
        </article>
 | 
					        </article>
 | 
				
			||||||
    </section>
 | 
					    </section>
 | 
				
			||||||
@@ -227,13 +244,13 @@ module.exports = BNoteRevision;
 | 
				
			|||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<nav>
 | 
					<nav>
 | 
				
			||||||
    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BNoteRevision.html">BNoteRevision</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul>
 | 
					    <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-sql.html">sql</a></li></ul><h3>Classes</h3><ul><li><a href="AbstractBeccaEntity.html">AbstractBeccaEntity</a></li><li><a href="BAttachment.html">BAttachment</a></li><li><a href="BAttribute.html">BAttribute</a></li><li><a href="BBranch.html">BBranch</a></li><li><a href="BEtapiToken.html">BEtapiToken</a></li><li><a href="BNote.html">BNote</a></li><li><a href="BOption.html">BOption</a></li><li><a href="BRecentNote.html">BRecentNote</a></li><li><a href="BRevision.html">BRevision</a></li><li><a href="BackendScriptApi.html">BackendScriptApi</a></li></ul><h3>Global</h3><ul><li><a href="global.html#api">api</a></li></ul>
 | 
				
			||||||
</nav>
 | 
					</nav>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<br class="clear">
 | 
					<br class="clear">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<footer>
 | 
					<footer>
 | 
				
			||||||
    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.1</a>
 | 
					    Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a>
 | 
				
			||||||
</footer>
 | 
					</footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script> prettyPrint(); </script>
 | 
					<script> prettyPrint(); </script>
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user