proskomma-core 0.9.7 → 0.9.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/.eslintrc.json +79 -0
  2. package/.gitattributes +2 -0
  3. package/babel.config.js +18 -0
  4. package/docs/_config.yml +1 -0
  5. package/docs/index.md +3 -0
  6. package/docs/pk_edit_0_9.odt +0 -0
  7. package/docs/pk_edit_0_9.pdf +0 -0
  8. package/docs/proskomma_101_slideshow.odp +0 -0
  9. package/docs/proskomma_101_slideshow.pdf +0 -0
  10. package/docs/proskomma_edit_html.png +0 -0
  11. package/docs/proskomma_edit_html.svg +451 -0
  12. package/docs/proskomma_edit_reference.png +0 -0
  13. package/docs/proskomma_edit_reference.svg +349 -0
  14. package/docs/repo_logo.png +0 -0
  15. package/esm/package.json +3 -0
  16. package/esm/wrapper.mjs +5 -0
  17. package/index.js +6 -0
  18. package/package.json +19 -17
  19. package/src/graph/index.cjs +201 -0
  20. package/src/graph/lib/do_cv.cjs +249 -0
  21. package/src/graph/lib/dump.cjs +40 -0
  22. package/src/graph/lib/remake_blocks.cjs +57 -0
  23. package/src/graph/lib/sequence_chars.cjs +84 -0
  24. package/src/graph/lib/sort.cjs +39 -0
  25. package/src/graph/lib/tribos.cjs +97 -0
  26. package/src/graph/lib/tribos_expression.cjs +556 -0
  27. package/src/graph/lib/tribos_ohm_UNUSED.cjs +37 -0
  28. package/src/graph/lib/tribos_step.cjs +434 -0
  29. package/src/graph/mutations/add.cjs +91 -0
  30. package/src/graph/mutations/delete.cjs +61 -0
  31. package/src/graph/mutations/index.cjs +54 -0
  32. package/src/graph/mutations/rehash.cjs +17 -0
  33. package/src/graph/mutations/tags.cjs +120 -0
  34. package/src/graph/mutations/update.cjs +210 -0
  35. package/src/graph/mutations/versification.cjs +96 -0
  36. package/src/graph/queries/block.cjs +228 -0
  37. package/src/graph/queries/cIndex.cjs +87 -0
  38. package/src/graph/queries/cell.cjs +42 -0
  39. package/src/graph/queries/cv.cjs +19 -0
  40. package/src/graph/queries/cvBook.cjs +16 -0
  41. package/src/graph/queries/cvChapter.cjs +16 -0
  42. package/src/graph/queries/cvIndex.cjs +47 -0
  43. package/src/graph/queries/cvNavigation.cjs +116 -0
  44. package/src/graph/queries/cvVerseElement.cjs +84 -0
  45. package/src/graph/queries/cvVerses.cjs +14 -0
  46. package/src/graph/queries/doc_set.cjs +220 -0
  47. package/src/graph/queries/document.cjs +555 -0
  48. package/src/graph/queries/idParts.cjs +30 -0
  49. package/src/graph/queries/index.cjs +151 -0
  50. package/src/graph/queries/inputBlockSpec.cjs +17 -0
  51. package/src/graph/queries/inputItemObject.cjs +12 -0
  52. package/src/graph/queries/input_att_spec.cjs +14 -0
  53. package/src/graph/queries/input_key_matches.cjs +11 -0
  54. package/src/graph/queries/input_key_value.cjs +11 -0
  55. package/src/graph/queries/input_key_values.cjs +11 -0
  56. package/src/graph/queries/input_selector_spec.cjs +19 -0
  57. package/src/graph/queries/item.cjs +71 -0
  58. package/src/graph/queries/itemGroup.cjs +75 -0
  59. package/src/graph/queries/key_value.cjs +18 -0
  60. package/src/graph/queries/kv_entry.cjs +21 -0
  61. package/src/graph/queries/kv_sequence.cjs +151 -0
  62. package/src/graph/queries/node.cjs +44 -0
  63. package/src/graph/queries/orig.cjs +11 -0
  64. package/src/graph/queries/regex_index.cjs +18 -0
  65. package/src/graph/queries/row_equals_spec.cjs +11 -0
  66. package/src/graph/queries/row_match_spec.cjs +11 -0
  67. package/src/graph/queries/selector_spec.cjs +29 -0
  68. package/src/graph/queries/sequence.cjs +314 -0
  69. package/src/graph/queries/table_sequence.cjs +192 -0
  70. package/src/graph/queries/tree_sequence.cjs +58 -0
  71. package/src/graph/queries/verseNumber.cjs +44 -0
  72. package/src/graph/queries/verseRange.cjs +11 -0
  73. package/src/graph/queries/versification.cjs +25 -0
  74. package/src/index.cjs +583 -0
  75. package/src/model/doc_set.cjs +389 -0
  76. package/src/model/doc_set_helpers/block.cjs +232 -0
  77. package/src/model/doc_set_helpers/enum.cjs +87 -0
  78. package/src/model/doc_set_helpers/item.cjs +198 -0
  79. package/src/model/doc_set_helpers/rehash.cjs +53 -0
  80. package/src/model/doc_set_helpers/selectors.cjs +58 -0
  81. package/src/model/doc_set_helpers/serialize.cjs +22 -0
  82. package/src/model/doc_set_helpers/unsuccinctify.cjs +288 -0
  83. package/src/model/doc_set_helpers/update.cjs +290 -0
  84. package/src/model/document.cjs +369 -0
  85. package/src/model/document_helpers/blocks.cjs +135 -0
  86. package/src/model/document_helpers/chapter_verse.cjs +291 -0
  87. package/src/model/document_helpers/pre_enums.cjs +67 -0
  88. package/src/model/document_helpers/sequences.cjs +205 -0
  89. package/src/model/document_helpers/serialize_succinct.cjs +55 -0
  90. package/src/model/document_helpers/succinct_filter.cjs +102 -0
  91. package/src/model/versifications/eng_vrs.cjs +455 -0
  92. package/src/model/versifications/index.cjs +38 -0
  93. package/src/model/versifications/lxx_vrs.cjs +950 -0
  94. package/src/model/versifications/org_vrs.cjs +155 -0
  95. package/src/model/versifications/rsc_vrs.cjs +342 -0
  96. package/src/model/versifications/rso_vrs.cjs +541 -0
  97. package/src/model/versifications/vul_vrs.cjs +835 -0
  98. package/src/parser/index.cjs +506 -0
  99. package/src/parser/lexers/index.cjs +11 -0
  100. package/src/parser/lexers/lexingRegexes.cjs +45 -0
  101. package/src/parser/lexers/nodes.cjs +123 -0
  102. package/src/parser/lexers/object_for_fragment.cjs +123 -0
  103. package/src/parser/lexers/tsv.cjs +45 -0
  104. package/src/parser/lexers/usfm.cjs +17 -0
  105. package/src/parser/lexers/usx/index.cjs +7 -0
  106. package/src/parser/lexers/usx/usx_lexer.cjs +321 -0
  107. package/src/parser/lib/tokenize.cjs +37 -0
  108. package/src/parser/model/index.cjs +637 -0
  109. package/src/parser/parser_specs.cjs +781 -0
  110. package/src/pipelines/perf2x/index.cjs +7 -0
  111. package/src/pipelines/perf2x/perf2PkJsonPipeline.json +41 -0
  112. package/src/pipelines/perf2x/perf2usfmPipeline.json +65 -0
  113. package/src/transforms/calculateUsfmChapterPositions.cjs +106 -0
  114. package/src/transforms/index.cjs +9 -0
  115. package/src/transforms/perf2PkJson.cjs +534 -0
  116. package/src/transforms/perf2usfm.cjs +294 -0
  117. package/src/util/byteArray.cjs +251 -0
  118. package/src/util/canons.cjs +117 -0
  119. package/src/util/enums.cjs +41 -0
  120. package/src/util/generateId.cjs +6 -0
  121. package/src/util/graftDefs.cjs +15 -0
  122. package/src/util/index.cjs +29 -0
  123. package/src/util/inspectSuccinct.cjs +59 -0
  124. package/src/util/itemDefs.cjs +33 -0
  125. package/src/util/parserConstantDefs.cjs +30 -0
  126. package/src/util/scopeDefs.cjs +173 -0
  127. package/src/util/scriptlike/blocksSpec.cjs +192 -0
  128. package/src/util/scriptlike/dodson_lexicon.xsl +19 -0
  129. package/src/util/scriptlike/dodson_lexicon_to_entries.cjs +85 -0
  130. package/src/util/scriptlike/open_scriptures_hebrew_lexicon.xsl +28 -0
  131. package/src/util/scriptlike/open_scriptures_hebrew_lexicon_to_entries.cjs +85 -0
  132. package/src/util/succinct.cjs +159 -0
  133. package/src/util/tags.cjs +28 -0
  134. package/src/util/tokenDefs.cjs +27 -0
  135. package/src/util/versification.cjs +364 -0
  136. package/test/code/main/bad.cjs +79 -0
  137. package/test/code/main/basics.cjs +534 -0
  138. package/test/code/main/block.cjs +586 -0
  139. package/test/code/main/block_scope_numbers.cjs +31 -0
  140. package/test/code/main/blocks_with_atts.cjs +150 -0
  141. package/test/code/main/blocks_with_cv.cjs +250 -0
  142. package/test/code/main/break.cjs +73 -0
  143. package/test/code/main/checksum.cjs +36 -0
  144. package/test/code/main/cl_global.cjs +35 -0
  145. package/test/code/main/class_for_fragment.cjs +18 -0
  146. package/test/code/main/clean_usfm.cjs +46 -0
  147. package/test/code/main/cp_vp.cjs +158 -0
  148. package/test/code/main/custom.cjs +124 -0
  149. package/test/code/main/cv.cjs +249 -0
  150. package/test/code/main/cvMatching.cjs +155 -0
  151. package/test/code/main/cv_indexes.cjs +189 -0
  152. package/test/code/main/cv_navigation.cjs +124 -0
  153. package/test/code/main/document.cjs +382 -0
  154. package/test/code/main/empty_blocks.cjs +71 -0
  155. package/test/code/main/entries.cjs +402 -0
  156. package/test/code/main/export_lexing_regexes.cjs +19 -0
  157. package/test/code/main/fig.cjs +67 -0
  158. package/test/code/main/filter.cjs +222 -0
  159. package/test/code/main/glossary.cjs +36 -0
  160. package/test/code/main/graft_headings.cjs +36 -0
  161. package/test/code/main/graft_introduction.cjs +96 -0
  162. package/test/code/main/graft_note.cjs +104 -0
  163. package/test/code/main/graft_rems.cjs +34 -0
  164. package/test/code/main/graft_sidebars.cjs +62 -0
  165. package/test/code/main/graft_title.cjs +36 -0
  166. package/test/code/main/hello.cjs +105 -0
  167. package/test/code/main/import_document.cjs +22 -0
  168. package/test/code/main/import_usfm_int.cjs +48 -0
  169. package/test/code/main/item_groups.cjs +133 -0
  170. package/test/code/main/items_with_cv.cjs +311 -0
  171. package/test/code/main/milestone_attributes.cjs +163 -0
  172. package/test/code/main/mixed_sequence_documents.cjs +137 -0
  173. package/test/code/main/mixed_sequences.cjs +217 -0
  174. package/test/code/main/modify_sequence.cjs +29 -0
  175. package/test/code/main/multiple_chapters.cjs +58 -0
  176. package/test/code/main/multiple_content.cjs +105 -0
  177. package/test/code/main/mutate_add.cjs +180 -0
  178. package/test/code/main/mutate_delete.cjs +236 -0
  179. package/test/code/main/mutate_rehash.cjs +68 -0
  180. package/test/code/main/mutate_tags.cjs +90 -0
  181. package/test/code/main/mutate_update.cjs +538 -0
  182. package/test/code/main/selectors.cjs +289 -0
  183. package/test/code/main/sequence.cjs +361 -0
  184. package/test/code/main/serialize.cjs +104 -0
  185. package/test/code/main/spans.cjs +51 -0
  186. package/test/code/main/split_long_tokens.cjs +30 -0
  187. package/test/code/main/standard_vrs.cjs +76 -0
  188. package/test/code/main/subclass.cjs +25 -0
  189. package/test/code/main/table.cjs +119 -0
  190. package/test/code/main/tags.cjs +248 -0
  191. package/test/code/main/token_alignment.cjs +84 -0
  192. package/test/code/main/trees.cjs +211 -0
  193. package/test/code/main/tribos.cjs +865 -0
  194. package/test/code/main/tsv.cjs +385 -0
  195. package/test/code/main/usx_ref.cjs +65 -0
  196. package/test/code/main/verse_mapping.cjs +252 -0
  197. package/test/code/main/verse_range.cjs +31 -0
  198. package/test/code/main/word_likes.cjs +41 -0
  199. package/test/code/utils/byte_array.cjs +271 -0
  200. package/test/code/utils/canons.cjs +20 -0
  201. package/test/code/utils/generate_id.cjs +17 -0
  202. package/test/code/utils/graft_defs.cjs +16 -0
  203. package/test/code/utils/inspect.cjs +130 -0
  204. package/test/code/utils/items.cjs +56 -0
  205. package/test/code/utils/push_succinct.cjs +69 -0
  206. package/test/code/utils/scope_defs.cjs +79 -0
  207. package/test/code/utils/serialize.cjs +28 -0
  208. package/test/code/utils/splice.cjs +67 -0
  209. package/test/code/utils/tags.cjs +69 -0
  210. package/test/code/utils/versification.cjs +249 -0
  211. package/test/lib/load.js +110 -0
  212. package/test/skipped_code/diff.js +53 -0
  213. package/test/test_data/inputBlockSpec/dodson.json +1654 -0
  214. package/test/test_data/inputBlockSpec/kv.json +326 -0
  215. package/test/test_data/inputBlockSpec/mk1.json +1019 -0
  216. package/test/test_data/inputBlockSpec/table.json +170 -0
  217. package/test/test_data/tree/genealogy.json +55 -0
  218. package/test/test_data/tree/jude.json +15965 -0
  219. package/test/test_data/tsv/en_tn_66-JUD.tsv +75 -0
  220. package/test/test_data/tsv/twl_JUD.tsv +144 -0
  221. package/test/test_data/usfm/1pe_webbe.usfm +13 -0
  222. package/test/test_data/usfm/66-JUD-ust.usfm +1089 -0
  223. package/test/test_data/usfm/78-GALspavbl.usfm +10 -0
  224. package/test/test_data/usfm/add_test.usfm +15 -0
  225. package/test/test_data/usfm/backslash.usfm +4 -0
  226. package/test/test_data/usfm/cl.usfm +14 -0
  227. package/test/test_data/usfm/cp_vp.usfm +8 -0
  228. package/test/test_data/usfm/custom.usfm +13 -0
  229. package/test/test_data/usfm/en_ust_oba.usfm +875 -0
  230. package/test/test_data/usfm/en_ust_psa_1.usfm +20 -0
  231. package/test/test_data/usfm/fig.usfm +3 -0
  232. package/test/test_data/usfm/filter.usfm +7 -0
  233. package/test/test_data/usfm/footnote.usfm +11 -0
  234. package/test/test_data/usfm/frt.usfm +4 -0
  235. package/test/test_data/usfm/headings.usfm +7 -0
  236. package/test/test_data/usfm/hello.usfm +8 -0
  237. package/test/test_data/usfm/int.usfm +7 -0
  238. package/test/test_data/usfm/milestone_attributes.usfm +7 -0
  239. package/test/test_data/usfm/milestone_attributes_default.usfm +7 -0
  240. package/test/test_data/usfm/no_break_space.usfm +4 -0
  241. package/test/test_data/usfm/no_mt.usfm +6 -0
  242. package/test/test_data/usfm/rems.usfm +6 -0
  243. package/test/test_data/usfm/section_intros.usfm +26 -0
  244. package/test/test_data/usfm/sidebars.usfm +25 -0
  245. package/test/test_data/usfm/slash_in_att.usfm +6 -0
  246. package/test/test_data/usfm/soft_line_break.usfm +4 -0
  247. package/test/test_data/usfm/spans.usfm +5 -0
  248. package/test/test_data/usfm/split_long_tokens.usfm +6 -0
  249. package/test/test_data/usfm/table.usfm +18 -0
  250. package/test/test_data/usfm/table_at_end.usfm +11 -0
  251. package/test/test_data/usfm/table_in_intro.usfm +22 -0
  252. package/test/test_data/usfm/table_no_end_cells.usfm +18 -0
  253. package/test/test_data/usfm/tit_kitchen_sink.usfm +73 -0
  254. package/test/test_data/usfm/titus_template.usfm +58 -0
  255. package/test/test_data/usfm/ugnt_3jn.usfm +265 -0
  256. package/test/test_data/usfm/ult_3jn.usfm +335 -0
  257. package/test/test_data/usfm/unknown.usfm +5 -0
  258. package/test/test_data/usfm/ust_psa.usfm +29 -0
  259. package/test/test_data/usfm/ust_psa_verse_ranges.usfm +24 -0
  260. package/test/test_data/usfm/ust_psa_with_ts.usfm +29 -0
  261. package/test/test_data/usfm/verse_breaks_in_blocks.usfm +20 -0
  262. package/test/test_data/usfm/verse_range.usfm +7 -0
  263. package/test/test_data/usfm/web_ecc.usfm +391 -0
  264. package/test/test_data/usfm/web_psa51.usfm +71 -0
  265. package/test/test_data/usfm/whitespace.usfm +12 -0
  266. package/test/test_data/usfm/xref.usfm +11 -0
  267. package/test/test_data/usx/bad_element.usx +2 -0
  268. package/test/test_data/usx/cp_vp.usx +12 -0
  269. package/test/test_data/usx/diff1.usx +59 -0
  270. package/test/test_data/usx/diff2.usx +74 -0
  271. package/test/test_data/usx/douay_rheims_ecc.usx +58 -0
  272. package/test/test_data/usx/douay_rheims_psa.usx +5366 -0
  273. package/test/test_data/usx/douay_rheims_psa_40_60.usx +666 -0
  274. package/test/test_data/usx/douay_rheims_rut.usx +26 -0
  275. package/test/test_data/usx/esg3.usx +47 -0
  276. package/test/test_data/usx/fig.usx +6 -0
  277. package/test/test_data/usx/milestone_attributes.usx +11 -0
  278. package/test/test_data/usx/not_nfc18_glo.usx +9 -0
  279. package/test/test_data/usx/not_nfc18_phm.usx +24 -0
  280. package/test/test_data/usx/opt_break.usx +10 -0
  281. package/test/test_data/usx/sidebars.usx +29 -0
  282. package/test/test_data/usx/table.usx +23 -0
  283. package/test/test_data/usx/web_psa.usx +8489 -0
  284. package/test/test_data/usx/web_psa150.usx +33 -0
  285. package/test/test_data/usx/web_psa_40_60.usx +1079 -0
  286. package/test/test_data/usx/web_rut.usx +95 -0
  287. package/test/test_data/usx/web_rut_1.usx +17 -0
  288. package/test/test_data/utils/douay_rheims.vrs +520 -0
  289. package/test/test_data/utils/douay_rheims_PSA.usx +5366 -0
  290. package/test/test_data/utils/serialize_example.json +91 -0
  291. package/test/test_data/utils/truncated_versification.vrs +29 -0
  292. package/test/test_data/utils/web_rut_items.json +2977 -0
  293. package/test/test_data/utils/webbe.vrs +395 -0
  294. package/test/test_data/utils/webbe_PSA.usx +8489 -0
  295. package/test/test_data/vrs/douay_rheims.vrs +520 -0
  296. package/test/test_data/vrs/truncated_versification.vrs +27 -0
  297. package/test/test_data/vrs/webbe.vrs +397 -0
  298. package/webpack.prod.js +50 -0
  299. package/dist/index.js +0 -8
  300. package/dist/index.js.LICENSE.txt +0 -23
@@ -0,0 +1,538 @@
1
+ /* eslint-disable no-unused-vars */
2
+ const path = require('path');
3
+ const fse = require('fs-extra');
4
+ const test = require('tape');
5
+ const deepCopy = require('deep-copy-all');
6
+ const { pkWithDoc } = require('../../lib/load.js');
7
+ const {
8
+ blocksSpec2Query, object2Query, oneObject2Query,
9
+ } = require('../../../src/util/scriptlike/blocksSpec.cjs');
10
+
11
+ const testGroup = 'Mutate Update Operations';
12
+
13
+ const cleanPk = pkWithDoc('../test_data/usx/web_rut.usx', {
14
+ lang: 'eng',
15
+ abbr: 'ust',
16
+ }, {}, {}, [], [])[0];
17
+
18
+ const cleanPk2 = pkWithDoc('../test_data/usfm/ust_psa.usfm', {
19
+ lang: 'eng',
20
+ abbr: 'ust',
21
+ }, {}, {}, [], [])[0];
22
+
23
+ const cleanPk3 = pkWithDoc('../test_data/usfm/milestone_attributes.usfm', {
24
+ lang: 'eng',
25
+ abbr: 'ust',
26
+ }, {}, {}, [], [])[0];
27
+
28
+ const blockSetup = async t => {
29
+ const pk = deepCopy(cleanPk);
30
+ let query = '{docSets { id documents { id nSequences sequences { id type } mainSequence { id blocks(positions: [0]) { bs { payload } text items { type subType payload } } } } } }';
31
+ let result = await pk.gqlQuery(query);
32
+ t.equal(result.errors, undefined);
33
+ t.equal(result.data.docSets.length, 1);
34
+ const docSet = result.data.docSets[0];
35
+ const document = docSet.documents[0];
36
+ const sequence = document.mainSequence;
37
+ let block = sequence.blocks[0];
38
+ const items = block.items;
39
+ return [pk, docSet, document, sequence, block, items];
40
+ };
41
+
42
+ const perfSetup = async t => {
43
+ const pk = deepCopy(cleanPk3);
44
+ let query = '{docSets { id documents { id perf mainSequence { id } } } }';
45
+ let result = await pk.gqlQuery(query);
46
+ t.equal(result.errors, undefined);
47
+ t.equal(result.data.docSets.length, 1);
48
+ const docSetId = result.data.docSets[0].id;
49
+ const documentId = result.data.docSets[0].documents[0].id;
50
+ const sequenceId = result.data.docSets[0].documents[0].mainSequence.id;
51
+ const perf = JSON.parse(result.data.docSets[0].documents[0].perf);
52
+ const perfSequence = JSON.stringify(perf.sequences[perf.main_sequence_id]);
53
+ return [pk, docSetId, documentId, sequenceId, perfSequence];
54
+ };
55
+
56
+ const searchScopes = (items, searchStr) => items.filter(i => i.type === 'scope' && i.payload.includes(searchStr));
57
+ const searchGrafts = (items, searchStr) => items.filter(i => i.type === 'graft' && i.subType.includes(searchStr));
58
+
59
+ const blocksSpec = fse.readJSONSync(path.resolve(__dirname, '../../test_data/inputBlockSpec/mk1.json'));
60
+
61
+ test(
62
+ `updateItems args exceptions (${testGroup})`,
63
+ async function (t) {
64
+ try {
65
+ t.plan(6);
66
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
67
+ let query = `mutation { updateItems(` +
68
+ `docSetId: "1234"` +
69
+ ` documentId: "${document.id}"` +
70
+ ` sequenceId: "${sequence.id}"` +
71
+ ` blockPosition: 0` +
72
+ ` items: ${object2Query(items)}) }`;
73
+ let result = await pk.gqlQuery(query);
74
+ t.equal(result.errors[0].message, 'DocSet \'1234\' not found');
75
+ query = `mutation { updateItems(` +
76
+ `docSetId: "${docSet.id}"` +
77
+ ` documentId: "5678"` +
78
+ ` sequenceId: "${sequence.id}"` +
79
+ ` blockPosition: 0` +
80
+ ` items: ${object2Query(items)}) }`;
81
+ result = await pk.gqlQuery(query);
82
+ t.equal(result.errors[0].message, 'Document \'5678\' not found');
83
+ query = `mutation { updateItems(` +
84
+ `docSetId: "${docSet.id}"` +
85
+ ` documentId: "${document.id}"` +
86
+ ` sequenceId: "9012"` +
87
+ ` blockPosition: 0` +
88
+ ` items: ${object2Query(items)}) }`;
89
+ result = await pk.gqlQuery(query);
90
+ t.equal(result.errors[0].message, 'Sequence \'9012\' not found');
91
+ query = `mutation { updateItems(` +
92
+ `docSetId: "${docSet.id}"` +
93
+ ` documentId: "${document.id}"` +
94
+ ` sequenceId: "${sequence.id}"` +
95
+ ` blockPosition: 1000` +
96
+ ` items: ${object2Query(items)}) }`;
97
+ result = await pk.gqlQuery(query);
98
+ t.equal(result.errors[0].message, 'Could not find block 1000 (length=42)');
99
+ } catch (err) {
100
+ console.log(err);
101
+ }
102
+ },
103
+ );
104
+
105
+ test(
106
+ `updateItems, existing token enums (${testGroup})`,
107
+ async function (t) {
108
+ try {
109
+ t.plan(10);
110
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
111
+ t.ok(block.text.includes('country'));
112
+ t.ok(block.text.includes('land'));
113
+
114
+ const newItems = items
115
+ .map(i => (
116
+ {
117
+ type: i.type,
118
+ subType: i.subType,
119
+ payload: i.payload.replace('country', 'land'),
120
+ }
121
+ ));
122
+
123
+ let query = `mutation { updateItems(` +
124
+ `docSetId: "${docSet.id}"` +
125
+ ` documentId: "${document.id}"` +
126
+ ` sequenceId: "${sequence.id}"` +
127
+ ` blockPosition: 0` +
128
+ ` items: ${object2Query(newItems)}) }`;
129
+ let result = await pk.gqlQuery(query);
130
+ t.equal(result.errors, undefined);
131
+ t.equal(result.data.updateItems, true);
132
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { text } } } } }';
133
+ result = await pk.gqlQuery(query);
134
+ t.equal(result.errors, undefined);
135
+ t.equal(result.data.docSets.length, 1);
136
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
137
+ t.ok(!block.text.includes('country'));
138
+ t.ok(block.text.includes('land'));
139
+ } catch (err) {
140
+ console.log(err);
141
+ }
142
+ },
143
+ );
144
+
145
+ test(
146
+ `updateItems, new token enum (${testGroup})`,
147
+ async function (t) {
148
+ try {
149
+ t.plan(10);
150
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
151
+ t.ok(block.text.includes('country'));
152
+ t.ok(!block.text.includes('nation'));
153
+
154
+ const newItemObjects = items
155
+ .map(i => (
156
+ {
157
+ type: i.type,
158
+ subType: i.subType,
159
+ payload: i.payload.replace('country', 'nation'),
160
+ }
161
+ ));
162
+
163
+ let query = `mutation { updateItems(` +
164
+ `docSetId: "${docSet.id}"` +
165
+ ` documentId: "${document.id}"` +
166
+ ` sequenceId: "${sequence.id}"` +
167
+ ` blockPosition: 0` +
168
+ ` items: ${object2Query(newItemObjects)}) }`;
169
+ let result = await pk.gqlQuery(query);
170
+ t.equal(result.errors, undefined);
171
+ t.equal(result.data.updateItems, true);
172
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { text } } } } }';
173
+ result = await pk.gqlQuery(query);
174
+ t.equal(result.errors, undefined);
175
+ t.equal(result.data.docSets.length, 1);
176
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
177
+ t.ok(!block.text.includes('country'));
178
+ t.ok(block.text.includes('nation'));
179
+ } catch (err) {
180
+ console.log(err);
181
+ }
182
+ },
183
+ );
184
+
185
+ test(
186
+ `updateItems - add blockGraft (${testGroup})`,
187
+ async function (t) {
188
+ try {
189
+ t.plan(9);
190
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
191
+ const titleId = document.sequences.filter(s => s.type === 'title')[0].id;
192
+ let query = `mutation { updateItems(` +
193
+ `docSetId: "${docSet.id}"` +
194
+ ` documentId: "${document.id}"` +
195
+ ` sequenceId: "${sequence.id}"` +
196
+ ` blockPosition: 0` +
197
+ ` items: ${object2Query(items)}` +
198
+ ` blockGrafts: ${object2Query([{
199
+ type: 'graft',
200
+ subType: 'title',
201
+ payload: titleId,
202
+ }])}` +
203
+ `) }`;
204
+ let result = await pk.gqlQuery(query);
205
+ t.equal(result.errors, undefined);
206
+ t.equal(result.data.updateItems, true);
207
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { bg { subType payload } text } } } } }';
208
+ result = await pk.gqlQuery(query);
209
+ t.equal(result.errors, undefined);
210
+ t.equal(result.data.docSets.length, 1);
211
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
212
+ t.equal(block.bg.length, 1);
213
+ t.equal(block.bg[0].subType, 'title');
214
+ t.equal(block.bg[0].payload, titleId);
215
+ } catch (err) {
216
+ console.log(err);
217
+ }
218
+ },
219
+ );
220
+
221
+ test(
222
+ `updateItems - change BlockScope (${testGroup})`,
223
+ async function (t) {
224
+ try {
225
+ t.plan(8);
226
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
227
+ const bs = block.bs.payload;
228
+ t.equal(bs, 'blockTag/p');
229
+ let query = `mutation { updateItems(` +
230
+ `docSetId: "${docSet.id}"` +
231
+ ` documentId: "${document.id}"` +
232
+ ` sequenceId: "${sequence.id}"` +
233
+ ` blockPosition: 0` +
234
+ ` items: ${object2Query(items)}` +
235
+ ` blockScope: ${oneObject2Query({
236
+ type: 'scope',
237
+ subType: 'start',
238
+ payload: 'blockTag/q',
239
+ })}` +
240
+ `) }`;
241
+ let result = await pk.gqlQuery(query);
242
+ t.equal(result.errors, undefined);
243
+ t.equal(result.data.updateItems, true);
244
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { bs { payload } text } } } } }';
245
+ result = await pk.gqlQuery(query);
246
+ t.equal(result.errors, undefined);
247
+ t.equal(result.data.docSets.length, 1);
248
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
249
+ t.equal(block.bs.payload, 'blockTag/q');
250
+ } catch (err) {
251
+ console.log(err);
252
+ }
253
+ },
254
+ );
255
+
256
+ test(
257
+ `updateItems, new scope enum (${testGroup})`,
258
+ async function (t) {
259
+ try {
260
+ t.plan(10);
261
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
262
+ t.equal(searchScopes(items, '/1').length, 5);
263
+ t.equal(searchScopes(items, '/23').length, 0);
264
+
265
+ const newItemObjects = items
266
+ .map(i => (
267
+ {
268
+ type: i.type,
269
+ subType: i.subType,
270
+ payload: i.payload.replace(/1$/g, '23'),
271
+ }
272
+ ));
273
+
274
+ let query = `mutation { updateItems(` +
275
+ `docSetId: "${docSet.id}"` +
276
+ ` documentId: "${document.id}"` +
277
+ ` sequenceId: "${sequence.id}"` +
278
+ ` blockPosition: 0` +
279
+ ` items: ${object2Query(newItemObjects)}) }`;
280
+ let result = await pk.gqlQuery(query);
281
+ t.equal(result.errors, undefined);
282
+ t.equal(result.data.updateItems, true);
283
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { text items { type subType payload } } } } } }';
284
+ result = await pk.gqlQuery(query);
285
+ t.equal(result.errors, undefined);
286
+ t.equal(result.data.docSets.length, 1);
287
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
288
+ t.equal(searchScopes(block.items, '/1').length, 0);
289
+ t.equal(searchScopes(block.items, '/23').length, 5);
290
+ } catch (err) {
291
+ console.log(err);
292
+ }
293
+ },
294
+ );
295
+
296
+ test(
297
+ `updateItems, new open-and-closed scope (${testGroup})`,
298
+ async function (t) {
299
+ try {
300
+ t.plan(8);
301
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
302
+ t.ok(!block.text.includes('banana'));
303
+
304
+ const newItems = items.concat([
305
+ {
306
+ type: 'scope',
307
+ subType: 'start',
308
+ payload: 'span/bd',
309
+ },
310
+ {
311
+ type: 'token',
312
+ subType: 'wordLike',
313
+ payload: 'banana',
314
+ },
315
+ {
316
+ type: 'scope',
317
+ subType: 'end',
318
+ payload: 'span/bd',
319
+ },
320
+ ]);
321
+ let query = `mutation { updateItems(` +
322
+ `docSetId: "${docSet.id}"` +
323
+ ` documentId: "${document.id}"` +
324
+ ` sequenceId: "${sequence.id}"` +
325
+ ` blockPosition: 0` +
326
+ ` items: ${object2Query(newItems)}) }`;
327
+ let result = await pk.gqlQuery(query);
328
+ t.equal(result.errors, undefined);
329
+ t.equal(result.data.updateItems, true);
330
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { text } } } } }';
331
+ result = await pk.gqlQuery(query);
332
+ t.equal(result.errors, undefined);
333
+ t.equal(result.data.docSets.length, 1);
334
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
335
+ t.ok(block.text.includes('banana'));
336
+ } catch (err) {
337
+ console.log(err);
338
+ }
339
+ },
340
+ );
341
+
342
+ test(
343
+ `updateItems, scope type exception (${testGroup})`,
344
+ async function (t) {
345
+ try {
346
+ t.plan(4);
347
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
348
+
349
+ const newItemObjects = items
350
+ .map(i => (
351
+ {
352
+ type: i.type,
353
+ subType: i.subType,
354
+ payload: i.payload.replace(/chapter/g, 'BANANA'),
355
+ }
356
+ ));
357
+
358
+ let query = `mutation { updateItems(` +
359
+ `docSetId: "${docSet.id}"` +
360
+ ` documentId: "${document.id}"` +
361
+ ` blockPosition: 0` +
362
+ ` items: ${object2Query(newItemObjects)}) }`;
363
+ let result = await pk.gqlQuery(query);
364
+ t.equal(result.errors.length, 1);
365
+ t.ok(result.errors[0].message.includes('BANANA'));
366
+ } catch (err) {
367
+ console.log(err);
368
+ }
369
+ },
370
+ );
371
+
372
+ test(
373
+ `updateItems, new graft enum (${testGroup})`,
374
+ async function (t) {
375
+ try {
376
+ t.plan(10);
377
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
378
+ t.equal(searchGrafts(items, 'footnote').length, 1);
379
+ t.equal(searchGrafts(items, 'BANANA').length, 0);
380
+
381
+ const newItemObjects = items
382
+ .map(i => (
383
+ {
384
+ type: i.type,
385
+ subType: i.subType.replace(/footnote/g, 'BANANA'),
386
+ payload: i.payload,
387
+ }
388
+ ));
389
+
390
+ let query = `mutation { updateItems(` +
391
+ `docSetId: "${docSet.id}"` +
392
+ ` documentId: "${document.id}"` +
393
+ ` sequenceId: "${sequence.id}"` +
394
+ ` blockPosition: 0` +
395
+ ` items: ${object2Query(newItemObjects)}) }`;
396
+ let result = await pk.gqlQuery(query);
397
+ t.equal(result.errors, undefined);
398
+ t.equal(result.data.updateItems, true);
399
+ query = '{docSets { id documents { id mainSequence { id blocks(positions: [0]) { text items { type subType payload } } } } } }';
400
+ result = await pk.gqlQuery(query);
401
+ t.equal(result.errors, undefined);
402
+ t.equal(result.data.docSets.length, 1);
403
+ block = result.data.docSets[0].documents[0].mainSequence.blocks[0];
404
+ t.equal(searchGrafts(block.items, 'footnote').length, 0);
405
+ t.equal(searchGrafts(block.items, 'BANANA').length, 1);
406
+ } catch (err) {
407
+ console.log(err);
408
+ }
409
+ },
410
+ );
411
+
412
+ test(
413
+ `updateBlocks (${testGroup})`,
414
+ async function (t) {
415
+ try {
416
+ t.plan(16);
417
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
418
+ const blockQuery = blocksSpec2Query(blocksSpec);
419
+ let query = `mutation { updateAllBlocks(` +
420
+ `docSetId: "${docSet.id}"` +
421
+ ` documentId: "${document.id}"` +
422
+ ` sequenceId: "${sequence.id}"` +
423
+ ` blocksSpec: ${blockQuery}) }`;
424
+ let result = await pk.gqlQuery(query);
425
+ t.equal(result.errors, undefined);
426
+ t.equal(result.data.updateAllBlocks, true);
427
+ query = '{documents { mainSequence { id blocks { text bs {payload} bg {subType payload} } } } }';
428
+ result = await pk.gqlQuery(query);
429
+ t.equal(result.errors, undefined);
430
+ const mainSequence = result.data.documents[0].mainSequence;
431
+ t.equal(mainSequence.blocks.length, 7);
432
+ t.ok(mainSequence.blocks[0].text.startsWith('Start of'));
433
+ t.equal(mainSequence.blocks[0].bs.payload, 'blockTag/m');
434
+ t.equal(mainSequence.blocks[0].bg.length, 1);
435
+ t.equal(mainSequence.blocks[0].bg[0].subType, 'title');
436
+ query = '{documents { mainSequence { id blocks { is {payload} os {payload} tokens { type subType payload } } } } }';
437
+ result = await pk.gqlQuery(query);
438
+ t.equal(result.errors, undefined);
439
+ t.equal(result.data.documents[0].mainSequence.blocks[0].tokens[0].payload, 'Start');
440
+ t.ok(result.data.documents[0].mainSequence.blocks[0].is.map(s => s.payload).includes('chapter/1'));
441
+ t.ok(result.data.documents[0].mainSequence.blocks[1].os.map(s => s.payload).includes('chapter/1'));
442
+ t.ok(result.data.documents[0].mainSequence.blocks[0].is.map(s => s.payload).includes('verse/1'));
443
+ t.ok(result.data.documents[0].mainSequence.blocks[4].is.map(s => s.payload).includes('verses/3'));
444
+ } catch (err) {
445
+ console.log(err);
446
+ }
447
+ },
448
+ );
449
+
450
+ test(
451
+ `Roundtrip (non-)update from PERF (${testGroup})`,
452
+ async function (t) {
453
+ try {
454
+ t.plan(6);
455
+ let [pk, docSetId, documentId, sequenceId, perf] = await perfSetup(t);
456
+ let query = `mutation { updateSequenceFromPerf(` +
457
+ `docSetId: "${docSetId}"` +
458
+ ` documentId: "${documentId}"` +
459
+ ` sequenceId: "${sequenceId}"` +
460
+ ` perf: """${perf}""") }`;
461
+ let result = await pk.gqlQuery(query);
462
+ t.equal(result.errors, undefined);
463
+ t.equal(result.data.updateSequenceFromPerf, true);
464
+ query = '{documents { perf } }';
465
+ result = await pk.gqlQuery(query);
466
+ t.equal(result.errors, undefined);
467
+ const newPerf = Object.values(JSON.parse(result.data.documents[0].perf).sequences).filter(s => s.type === 'main')[0];
468
+ t.equal(perf, JSON.stringify(newPerf));
469
+ } catch (err) {
470
+ console.log(err);
471
+ }
472
+ },
473
+ );
474
+
475
+ test(
476
+ `Update from PERF (${testGroup})`,
477
+ async function (t) {
478
+ try {
479
+ t.plan(7);
480
+ let [pk, docSetId, documentId, sequenceId, perf] = await perfSetup(t);
481
+ perf = perf.replace(/Obadiah/g, 'OBADIAH');
482
+ let query = `mutation { updateSequenceFromPerf(` +
483
+ `docSetId: "${docSetId}"` +
484
+ ` documentId: "${documentId}"` +
485
+ ` sequenceId: "${sequenceId}"` +
486
+ ` perf: """${perf}""") }`;
487
+ let result = await pk.gqlQuery(query);
488
+ t.equal(result.errors, undefined);
489
+ t.equal(result.data.updateSequenceFromPerf, true);
490
+ query = '{documents { perf } }';
491
+ result = await pk.gqlQuery(query);
492
+ t.equal(result.errors, undefined);
493
+ const newPerf = JSON.stringify(Object.values(JSON.parse(result.data.documents[0].perf).sequences).filter(s => s.type === 'main')[0]);
494
+ t.notOk(newPerf.includes('Obadiah'));
495
+ t.ok(newPerf.includes('OBADIAH'));
496
+ } catch (err) {
497
+ console.log(err);
498
+ }
499
+ },
500
+ );
501
+
502
+ test(
503
+ `gcSequences (${testGroup})`,
504
+ async function (t) {
505
+ try {
506
+ t.plan(10);
507
+ let [pk, docSet, document, sequence, block, items] = await blockSetup(t);
508
+ const nSequences = document.nSequences;
509
+ const newItemObjects = items.filter(i => i.type !== 'graft');
510
+ let query = `mutation { updateItems(` +
511
+ `docSetId: "${docSet.id}"` +
512
+ ` documentId: "${document.id}"` +
513
+ ` sequenceId: "${sequence.id}"` +
514
+ ` blockPosition: 0` +
515
+ ` items: ${object2Query(newItemObjects)}) }`;
516
+ let result = await pk.gqlQuery(query);
517
+ t.equal(result.errors, undefined);
518
+ t.equal(result.data.updateItems, true);
519
+ query = '{docSets { documents { nSequences } } }';
520
+ result = await pk.gqlQuery(query);
521
+ t.equal(result.errors, undefined);
522
+ t.equal(result.data.docSets[0].documents[0].nSequences, nSequences);
523
+ query = `mutation { gcSequences(` +
524
+ `docSetId: "${docSet.id}"` +
525
+ ` documentId: "${document.id}"` +
526
+ `) }`;
527
+ result = await pk.gqlQuery(query);
528
+ t.equal(result.errors, undefined);
529
+ t.equal(result.data.gcSequences, true);
530
+ query = '{docSets { documents { nSequences } } }';
531
+ result = await pk.gqlQuery(query);
532
+ t.equal(result.errors, undefined);
533
+ t.equal(result.data.docSets[0].documents[0].nSequences, nSequences - 2);
534
+ } catch (err) {
535
+ console.log(err);
536
+ }
537
+ },
538
+ );