@saltcorn/server 1.6.0-beta.5 → 1.6.0-beta.7

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 (743) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/app.js +9 -5
  3. package/auth/routes.js +2 -1
  4. package/docs/assets/hierarchy.js +1 -1
  5. package/docs/assets/navigation.js +1 -1
  6. package/docs/assets/search.js +1 -1
  7. package/docs/classes/_saltcorn_admin-models.models_snapshot.Snapshot.html +2 -2
  8. package/docs/classes/_saltcorn_common-code.relations_relation.Relation.html +3 -3
  9. package/docs/classes/_saltcorn_common-code.relations_relations_finder.RelationsFinder.html +5 -5
  10. package/docs/classes/_saltcorn_data.diagram_cy_raster.CytoscapeRaster.html +4 -4
  11. package/docs/classes/_saltcorn_data.diagram_nodes_dummy_node.DummyNode.html +4 -4
  12. package/docs/classes/_saltcorn_data.diagram_nodes_node.Node.html +4 -4
  13. package/docs/classes/_saltcorn_data.diagram_nodes_page_node.PageNode.html +4 -4
  14. package/docs/classes/_saltcorn_data.diagram_nodes_table_node.TableNode.html +4 -4
  15. package/docs/classes/_saltcorn_data.diagram_nodes_trigger_node.TriggerNode.html +4 -4
  16. package/docs/classes/_saltcorn_data.diagram_nodes_view_node.ViewNode.html +4 -4
  17. package/docs/classes/_saltcorn_data.mobile-mocks_node_async_hooks.AsyncLocalStorage.html +2 -2
  18. package/docs/classes/_saltcorn_data.models_crash.Crash.html +2 -2
  19. package/docs/classes/_saltcorn_data.models_eventlog.EventLog.html +2 -2
  20. package/docs/classes/_saltcorn_data.models_field.Field.html +9 -9
  21. package/docs/classes/_saltcorn_data.models_fieldrepeat.FieldRepeat.html +2 -2
  22. package/docs/classes/_saltcorn_data.models_file.File.html +21 -21
  23. package/docs/classes/_saltcorn_data.models_form.Form.html +2 -2
  24. package/docs/classes/_saltcorn_data.models_internal_mail_queue.MailQueue.html +4 -4
  25. package/docs/classes/_saltcorn_data.models_internal_push_message_helper.PushMessageHelper.html +7 -7
  26. package/docs/classes/_saltcorn_data.models_library.Library.html +2 -2
  27. package/docs/classes/_saltcorn_data.models_model.Model.html +2 -2
  28. package/docs/classes/_saltcorn_data.models_model_instance.ModelInstance.html +2 -2
  29. package/docs/classes/_saltcorn_data.models_notification.Notification.html +2 -2
  30. package/docs/classes/_saltcorn_data.models_page.Page.html +11 -11
  31. package/docs/classes/_saltcorn_data.models_page_group.PageGroup.html +16 -16
  32. package/docs/classes/_saltcorn_data.models_page_group_member.PageGroupMember.html +8 -8
  33. package/docs/classes/_saltcorn_data.models_plugin.Plugin.html +17 -16
  34. package/docs/classes/_saltcorn_data.models_role.Role.html +2 -2
  35. package/docs/classes/_saltcorn_data.models_table.Table.html +66 -66
  36. package/docs/classes/_saltcorn_data.models_table_constraints.TableConstraint.html +2 -2
  37. package/docs/classes/_saltcorn_data.models_tag.Tag.html +2 -2
  38. package/docs/classes/_saltcorn_data.models_tag_entry.TagEntry.html +2 -2
  39. package/docs/classes/_saltcorn_data.models_trigger.Trigger.html +19 -19
  40. package/docs/classes/_saltcorn_data.models_user.User.html +32 -32
  41. package/docs/classes/_saltcorn_data.models_view.View.html +15 -15
  42. package/docs/classes/_saltcorn_data.models_workflow.Workflow.html +2 -2
  43. package/docs/classes/_saltcorn_data.models_workflow_run.WorkflowRun.html +2 -2
  44. package/docs/classes/_saltcorn_data.models_workflow_step.WorkflowStep.html +2 -2
  45. package/docs/classes/_saltcorn_data.models_workflow_trace.MetaData.html +2 -2
  46. package/docs/classes/_saltcorn_data.models_workflow_trace.WorkflowTrace.html +2 -2
  47. package/docs/classes/_saltcorn_mobile-builder.mobile-builder.MobileBuilder.html +2 -3
  48. package/docs/classes/_saltcorn_mobile-builder.utils_capacitor-helper.CapacitorHelper.html +2 -2
  49. package/docs/enums/_saltcorn_common-code.relations_relation_types.RelationType.html +2 -2
  50. package/docs/enums/_saltcorn_common-code.relations_relation_types.ViewDisplayType.html +2 -2
  51. package/docs/functions/_saltcorn_admin-models.models_config-check.runConfigurationCheck.html +1 -1
  52. package/docs/functions/_saltcorn_common-code.relations_relation_helpers.buildRelationPath.html +1 -1
  53. package/docs/functions/_saltcorn_common-code.relations_relation_helpers.buildTableCaches.html +1 -1
  54. package/docs/functions/_saltcorn_common-code.relations_relation_helpers.parseLegacyRelation.html +1 -1
  55. package/docs/functions/_saltcorn_common-code.relations_relation_helpers.parseRelationPath.html +1 -1
  56. package/docs/functions/_saltcorn_common-code.tests_test_data.fixturesData.html +1 -1
  57. package/docs/functions/_saltcorn_common-code.tests_test_data.withAnotherUserField.html +1 -1
  58. package/docs/functions/_saltcorn_common-code.tests_test_data.withKeyFromLayerThree.html +1 -1
  59. package/docs/functions/_saltcorn_common-code.tests_test_data.withKeyFromLayerTwo.html +1 -1
  60. package/docs/functions/_saltcorn_common-code.tests_test_data.withMultipleInbounds.html +1 -1
  61. package/docs/functions/_saltcorn_common-code.tests_test_data.withSecondTopicField.html +1 -1
  62. package/docs/functions/_saltcorn_common-code.tests_test_data.withSimplePostTopicrelation.html +1 -1
  63. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.action_link.html +1 -1
  64. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.action_url.html +1 -1
  65. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.fill_presets.html +1 -1
  66. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.getForm.html +1 -1
  67. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.get_view_link_query.html +1 -1
  68. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.get_viewable_fields.html +1 -1
  69. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.get_viewable_fields_from_layout.html +1 -1
  70. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.make_link.html +1 -1
  71. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.objToQueryString.html +1 -1
  72. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.parse_view_select.html +1 -1
  73. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.setDateLocales.html +1 -1
  74. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.splitUniques.html +1 -1
  75. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.standardBlockDispatch.html +1 -1
  76. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.standardLayoutRowVisitor.html +1 -1
  77. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.transformForm.html +1 -1
  78. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.updateViewSelect.html +1 -1
  79. package/docs/functions/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.view_linker.html +1 -1
  80. package/docs/functions/_saltcorn_data.db_connect_mobile.getConnectObject.html +1 -1
  81. package/docs/functions/_saltcorn_data.db_reset_schema.reset.html +1 -1
  82. package/docs/functions/_saltcorn_data.diagram_cy_generate_utils.generateCyCode.html +1 -1
  83. package/docs/functions/_saltcorn_data.diagram_cy_generate_utils.genereateCyCfg.html +1 -1
  84. package/docs/functions/_saltcorn_data.diagram_node_extract_utils.buildObjectTrees.html +1 -1
  85. package/docs/functions/_saltcorn_data.diagram_node_extract_utils.extractFromColumns.html +1 -1
  86. package/docs/functions/_saltcorn_data.diagram_node_extract_utils.extractFromLayout.html +1 -1
  87. package/docs/functions/_saltcorn_data.diagram_node_extract_utils.extractViewToCreate.html +1 -1
  88. package/docs/functions/_saltcorn_data.migrate.create_blank_migration.html +1 -1
  89. package/docs/functions/_saltcorn_data.migrate.getMigrationsInDB.html +1 -1
  90. package/docs/functions/_saltcorn_data.migrate.migrate.html +1 -1
  91. package/docs/functions/_saltcorn_data.migrations_202102091312.js.html +1 -1
  92. package/docs/functions/_saltcorn_data.migrations_202210051058.js.html +1 -1
  93. package/docs/functions/_saltcorn_data.migrations_202210101540.js.html +1 -1
  94. package/docs/functions/_saltcorn_data.migrations_202304281224.js.html +1 -1
  95. package/docs/functions/_saltcorn_data.migrations_202307211459.js.html +1 -1
  96. package/docs/functions/_saltcorn_data.migrations_202502131103.js.html +1 -1
  97. package/docs/functions/_saltcorn_data.migrations_202508011455.js.html +1 -1
  98. package/docs/functions/_saltcorn_data.migrations_202510152058.js.html +1 -1
  99. package/docs/functions/_saltcorn_data.migrations_202603101553.sql_pg.html +1 -1
  100. package/docs/functions/_saltcorn_data.migrations_202604111200.js.html +1 -0
  101. package/docs/functions/_saltcorn_data.migrations_202604141200.js.html +1 -0
  102. package/docs/functions/_saltcorn_data.mobile-mocks_node_child_process.execSync.html +1 -1
  103. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs.createReadStream.html +1 -1
  104. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs.readdirSync.html +1 -1
  105. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs.writeFileSync.html +1 -1
  106. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.mkdir.html +1 -1
  107. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.readFile.html +1 -1
  108. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.readdir.html +1 -1
  109. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.stat.html +1 -1
  110. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.unlink.html +1 -1
  111. package/docs/functions/_saltcorn_data.mobile-mocks_node_fs_promises.writeFile.html +1 -1
  112. package/docs/functions/_saltcorn_data.mobile-mocks_node_latest-version.latestVersion.html +1 -1
  113. package/docs/functions/_saltcorn_data.mobile-mocks_node_v8.deserialize.html +1 -1
  114. package/docs/functions/_saltcorn_data.mobile-mocks_node_v8.serialize.html +1 -1
  115. package/docs/functions/_saltcorn_data.mobile-mocks_npm_env-paths.envPaths.html +1 -1
  116. package/docs/functions/_saltcorn_data.model-helper.get_predictor.html +1 -1
  117. package/docs/functions/_saltcorn_data.model-helper.run_jupyter_model.html +1 -1
  118. package/docs/functions/_saltcorn_data.model-helper.shorten_trackback.html +1 -1
  119. package/docs/functions/_saltcorn_data.model-helper.write_csv.html +1 -1
  120. package/docs/functions/_saltcorn_data.models_internal_async_json_stream.async_json_stream.html +1 -1
  121. package/docs/functions/_saltcorn_data.models_internal_query.aggregation_query_fields.html +1 -1
  122. package/docs/functions/_saltcorn_data.models_internal_query.getAggAndField.html +1 -1
  123. package/docs/functions/_saltcorn_data.models_internal_query.joinfield_renamer.html +1 -1
  124. package/docs/functions/_saltcorn_data.models_internal_query.process_aggregations.html +1 -1
  125. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.buildKeyFromRelative.html +1 -1
  126. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.copyObject.html +1 -1
  127. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.deleteObject.html +1 -1
  128. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.downloadBuffer.html +1 -1
  129. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getPublicFileUrl.html +1 -1
  130. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getResolvedBucket.html +1 -1
  131. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getS3Client.html +1 -1
  132. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getServeUrl.html +1 -1
  133. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.getSignedFileUrl.html +1 -1
  134. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.headObject.html +1 -1
  135. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.isS3Enabled.html +1 -1
  136. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.listS3Folder.html +1 -1
  137. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.publicUrlToRelativePath.html +1 -1
  138. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.relativeKeyToPath.html +1 -1
  139. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.setObjectMetadata.html +1 -1
  140. package/docs/functions/_saltcorn_data.models_internal_s3_helpers.uploadBuffer.html +1 -1
  141. package/docs/functions/_saltcorn_data.models_internal_table_helper.boolExamples.html +1 -1
  142. package/docs/functions/_saltcorn_data.models_internal_table_helper.colorExamples.html +1 -1
  143. package/docs/functions/_saltcorn_data.models_internal_table_helper.floatExamples.html +1 -1
  144. package/docs/functions/_saltcorn_data.models_internal_table_helper.get_formula_examples.html +1 -1
  145. package/docs/functions/_saltcorn_data.models_internal_table_helper.intExamples.html +1 -1
  146. package/docs/functions/_saltcorn_data.models_internal_table_helper.stringExamples.html +1 -1
  147. package/docs/functions/_saltcorn_data.plugin-helper.build_schema_data.html +1 -1
  148. package/docs/functions/_saltcorn_data.plugin-helper.calcfldViewConfig.html +1 -1
  149. package/docs/functions/_saltcorn_data.plugin-helper.calcfldViewOptions.html +1 -1
  150. package/docs/functions/_saltcorn_data.plugin-helper.calcrelViewOptions.html +1 -1
  151. package/docs/functions/_saltcorn_data.plugin-helper.displayType.html +1 -1
  152. package/docs/functions/_saltcorn_data.plugin-helper.field_picker_fields.html +1 -1
  153. package/docs/functions/_saltcorn_data.plugin-helper.generate_joined_query.html +1 -1
  154. package/docs/functions/_saltcorn_data.plugin-helper.getActionConfigFields.html +1 -1
  155. package/docs/functions/_saltcorn_data.plugin-helper.get_child_views.html +1 -1
  156. package/docs/functions/_saltcorn_data.plugin-helper.get_inbound_relation_opts.html +1 -1
  157. package/docs/functions/_saltcorn_data.plugin-helper.get_inbound_self_relation_opts.html +1 -1
  158. package/docs/functions/_saltcorn_data.plugin-helper.get_link_view_opts.html +1 -1
  159. package/docs/functions/_saltcorn_data.plugin-helper.get_many_to_many_relation_opts.html +1 -1
  160. package/docs/functions/_saltcorn_data.plugin-helper.get_parent_views.html +1 -1
  161. package/docs/functions/_saltcorn_data.plugin-helper.initial_config_all_fields.html +1 -1
  162. package/docs/functions/_saltcorn_data.plugin-helper.json_list_to_external_table.html +1 -1
  163. package/docs/functions/_saltcorn_data.plugin-helper.link_view.html +1 -1
  164. package/docs/functions/_saltcorn_data.plugin-helper.pathToState.html +1 -1
  165. package/docs/functions/_saltcorn_data.plugin-helper.picked_fields_to_query.html +1 -1
  166. package/docs/functions/_saltcorn_data.plugin-helper.readState.html +1 -1
  167. package/docs/functions/_saltcorn_data.plugin-helper.readStateStrict.html +1 -1
  168. package/docs/functions/_saltcorn_data.plugin-helper.runCollabEvents.html +1 -1
  169. package/docs/functions/_saltcorn_data.plugin-helper.run_action_column.html +1 -1
  170. package/docs/functions/_saltcorn_data.plugin-helper.stateFieldsToQuery.html +1 -1
  171. package/docs/functions/_saltcorn_data.plugin-helper.stateFieldsToWhere.html +1 -1
  172. package/docs/functions/_saltcorn_data.plugin-helper.stateToQueryString.html +1 -1
  173. package/docs/functions/_saltcorn_data.plugin-helper.strictParseInt.html +1 -1
  174. package/docs/functions/_saltcorn_data.plugin-testing.auto_test_plugin.html +1 -1
  175. package/docs/functions/_saltcorn_data.plugin-testing.check_view_columns.html +1 -1
  176. package/docs/functions/_saltcorn_data.plugin-testing.generate_attributes.html +1 -1
  177. package/docs/functions/_saltcorn_data.standard-menu.create_standard_menu.html +1 -1
  178. package/docs/functions/_saltcorn_data.tests_assertions.assertIsErrorMsg.html +1 -1
  179. package/docs/functions/_saltcorn_data.tests_assertions.assertIsErrorsMsg.html +1 -1
  180. package/docs/functions/_saltcorn_data.tests_assertions.assertIsRow.html +1 -1
  181. package/docs/functions/_saltcorn_data.tests_assertions.assertIsSet.html +1 -1
  182. package/docs/functions/_saltcorn_data.tests_assertions.assertIsType.html +1 -1
  183. package/docs/functions/_saltcorn_data.tests_assertions.assertsIsSuccessMessage.html +1 -1
  184. package/docs/functions/_saltcorn_data.tests_assertions.assertsObjectIsUser.html +1 -1
  185. package/docs/functions/_saltcorn_data.tests_common_helpers.createAnotherUserField.html +1 -1
  186. package/docs/functions/_saltcorn_data.tests_common_helpers.createKeyFromLevelTwo.html +1 -1
  187. package/docs/functions/_saltcorn_data.tests_common_helpers.createLevelThreeInbound.html +1 -1
  188. package/docs/functions/_saltcorn_data.tests_common_helpers.createMultipleInbounds.html +1 -1
  189. package/docs/functions/_saltcorn_data.tests_common_helpers.createSecondTopicField.html +1 -1
  190. package/docs/functions/_saltcorn_data.tests_common_helpers.prepareEmployeeDepartment.html +1 -1
  191. package/docs/functions/_saltcorn_data.tests_common_helpers.prepareSimpleTopicPostRelation.html +1 -1
  192. package/docs/functions/_saltcorn_data.tests_remote_query_helper.deleteViewFromServer.html +1 -1
  193. package/docs/functions/_saltcorn_data.tests_remote_query_helper.prepareQueryEnviroment.html +1 -1
  194. package/docs/functions/_saltcorn_data.tests_remote_query_helper.sendViewToServer.html +1 -1
  195. package/docs/functions/_saltcorn_data.translate.hasLLM.html +1 -1
  196. package/docs/functions/_saltcorn_data.translate.translate.html +1 -1
  197. package/docs/functions/_saltcorn_db-common.internal.ftsFieldsSqlExpr.html +1 -1
  198. package/docs/functions/_saltcorn_db-common.internal.mkSelectOptions.html +1 -1
  199. package/docs/functions/_saltcorn_db-common.internal.mkWhere.html +1 -1
  200. package/docs/functions/_saltcorn_db-common.internal.orderByIsObject.html +1 -1
  201. package/docs/functions/_saltcorn_db-common.internal.orderByIsOperator.html +1 -1
  202. package/docs/functions/_saltcorn_db-common.internal.prefixFieldsInWhere.html +1 -1
  203. package/docs/functions/_saltcorn_db-common.internal.sqlBinOp.html +1 -1
  204. package/docs/functions/_saltcorn_db-common.internal.sqlFun.html +1 -1
  205. package/docs/functions/_saltcorn_db-common.internal.sqlsanitize.html +1 -1
  206. package/docs/functions/_saltcorn_db-common.internal.sqlsanitizeAllowDots.html +1 -1
  207. package/docs/functions/_saltcorn_db-common.internal.subSelectWhere.html +1 -1
  208. package/docs/functions/_saltcorn_db-common.multi-tenant.enable_multi_tenant.html +1 -1
  209. package/docs/functions/_saltcorn_db-common.multi-tenant.getRequestContext.html +1 -1
  210. package/docs/functions/_saltcorn_db-common.multi-tenant.getTenantSchema.html +1 -1
  211. package/docs/functions/_saltcorn_db-common.multi-tenant.init.html +1 -1
  212. package/docs/functions/_saltcorn_db-common.multi-tenant.is_it_multi_tenant.html +1 -1
  213. package/docs/functions/_saltcorn_db-common.multi-tenant.runWithTenant.html +1 -1
  214. package/docs/functions/_saltcorn_db-common.sqlite-commons.buildInsertBulkSql.html +1 -1
  215. package/docs/functions/_saltcorn_db-common.sqlite-commons.buildInsertSql.html +1 -1
  216. package/docs/functions/_saltcorn_db-common.sqlite-commons.commitAndBeginNewTransaction.html +1 -1
  217. package/docs/functions/_saltcorn_db-common.sqlite-commons.doCount.html +1 -1
  218. package/docs/functions/_saltcorn_db-common.sqlite-commons.doDeleteWhere.html +1 -1
  219. package/docs/functions/_saltcorn_db-common.sqlite-commons.doListScTables.html +1 -1
  220. package/docs/functions/_saltcorn_db-common.sqlite-commons.doListTables.html +1 -1
  221. package/docs/functions/_saltcorn_db-common.sqlite-commons.doListUserDefinedTables.html +1 -1
  222. package/docs/functions/_saltcorn_db-common.sqlite-commons.do_add_index.html +1 -1
  223. package/docs/functions/_saltcorn_db-common.sqlite-commons.do_drop_index.html +1 -1
  224. package/docs/functions/_saltcorn_db-common.sqlite-commons.mkVal.html +1 -1
  225. package/docs/functions/_saltcorn_db-common.sqlite-commons.openOrUseTransaction.html +1 -1
  226. package/docs/functions/_saltcorn_db-common.sqlite-commons.reprAsJson.html +1 -1
  227. package/docs/functions/_saltcorn_db-common.sqlite-commons.slugify.html +1 -1
  228. package/docs/functions/_saltcorn_db-common.sqlite-commons.tryCatchInTransaction.html +1 -1
  229. package/docs/functions/_saltcorn_db-common.sqlite-commons.whenTransactionisFree.html +1 -1
  230. package/docs/functions/_saltcorn_db-common.sqlite-commons.withTransaction.html +1 -1
  231. package/docs/functions/_saltcorn_markup.mktag.mkTag.html +1 -1
  232. package/docs/functions/_saltcorn_markup.tabs.tabs.html +1 -1
  233. package/docs/functions/_saltcorn_markup.workflow.renderWorkflow.html +1 -1
  234. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.androidFeatures.html +1 -1
  235. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.androidPermissions.html +1 -1
  236. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.buildTablesFile.html +1 -1
  237. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyPrepopulatedDb.html +1 -1
  238. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyServerFiles.html +1 -1
  239. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyShareExtFiles.html +1 -1
  240. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copySiteLogo.html +1 -1
  241. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.copyTranslationFiles.html +1 -1
  242. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.createSqliteDb.html +1 -1
  243. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.extractDomain.html +1 -1
  244. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.generateAndroidVersionCode.html +1 -1
  245. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.hasAuthMethod.html +1 -1
  246. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyAndroidManifest.html +1 -1
  247. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyAppDelegate.html +1 -1
  248. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyConfigXml.html +1 -1
  249. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyGradleConfig.html +1 -1
  250. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyInfoPlist.html +1 -1
  251. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyShareViewController.html +1 -1
  252. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.modifyXcodeProjectFile.html +1 -1
  253. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepAppIcon.html +1 -1
  254. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareAppIcon.html +1 -1
  255. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareBuildDir.html +1 -1
  256. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareExportOptionsPlist.html +1 -1
  257. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareSplashIcon.html +1 -1
  258. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.prepareSplashPage.html +1 -1
  259. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.runAddEntitlementsScript.html +1 -1
  260. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeCapacitorConfig.html +1 -1
  261. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeCfgFile.html +1 -1
  262. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeDataExtractionRules.html +1 -1
  263. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeEntitlementsPlist.html +1 -1
  264. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writeNetworkSecurityConfig.html +1 -1
  265. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writePodfile.html +1 -1
  266. package/docs/functions/_saltcorn_mobile-builder.utils_common-build-utils.writePrivacyInfo.html +1 -1
  267. package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.bundleMobileAppCode.html +1 -1
  268. package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.bundlePackagesAndPlugins.html +1 -1
  269. package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyOptionalSource.html +1 -1
  270. package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyPluginMobileAppDirs.html +1 -1
  271. package/docs/functions/_saltcorn_mobile-builder.utils_package-bundle-utils.copyPublicDirs.html +1 -1
  272. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.add_index.html +1 -1
  273. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.add_unique_constraint.html +1 -1
  274. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.count.html +1 -1
  275. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.deleteWhere.html +1 -1
  276. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.drop_index.html +1 -1
  277. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.drop_reset_schema.html +1 -1
  278. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.drop_unique_constraint.html +1 -1
  279. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.init.html +1 -1
  280. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.insert.html +1 -1
  281. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.insertRows.html +1 -1
  282. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.listScTables.html +1 -1
  283. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.listTables.html +1 -1
  284. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.listUserDefinedTables.html +1 -1
  285. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.query.html +1 -1
  286. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.select.html +1 -1
  287. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.selectMaybeOne.html +1 -1
  288. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.selectOne.html +1 -1
  289. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.setConnectionObject.html +1 -1
  290. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.tableExists.html +1 -1
  291. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.time.html +1 -1
  292. package/docs/functions/_saltcorn_sqlite-mobile.sqlite_capacitor.update.html +1 -1
  293. package/docs/functions/_saltcorn_sqlite.sqlite.add_index.html +1 -1
  294. package/docs/functions/_saltcorn_sqlite.sqlite.add_unique_constraint.html +1 -1
  295. package/docs/functions/_saltcorn_sqlite.sqlite.begin.html +1 -1
  296. package/docs/functions/_saltcorn_sqlite.sqlite.changeConnection.html +1 -1
  297. package/docs/functions/_saltcorn_sqlite.sqlite.close.html +1 -1
  298. package/docs/functions/_saltcorn_sqlite.sqlite.commit.html +1 -1
  299. package/docs/functions/_saltcorn_sqlite.sqlite.count.html +1 -1
  300. package/docs/functions/_saltcorn_sqlite.sqlite.deleteWhere.html +1 -1
  301. package/docs/functions/_saltcorn_sqlite.sqlite.dropTable.html +1 -1
  302. package/docs/functions/_saltcorn_sqlite.sqlite.dropTables.html +1 -1
  303. package/docs/functions/_saltcorn_sqlite.sqlite.drop_index.html +1 -1
  304. package/docs/functions/_saltcorn_sqlite.sqlite.drop_reset_schema.html +1 -1
  305. package/docs/functions/_saltcorn_sqlite.sqlite.drop_unique_constraint.html +1 -1
  306. package/docs/functions/_saltcorn_sqlite.sqlite.getVersion.html +1 -1
  307. package/docs/functions/_saltcorn_sqlite.sqlite.get_db_filepath.html +1 -1
  308. package/docs/functions/_saltcorn_sqlite.sqlite.get_sql_logging.html +1 -1
  309. package/docs/functions/_saltcorn_sqlite.sqlite.init.html +1 -1
  310. package/docs/functions/_saltcorn_sqlite.sqlite.insert.html +1 -1
  311. package/docs/functions/_saltcorn_sqlite.sqlite.listScTables.html +1 -1
  312. package/docs/functions/_saltcorn_sqlite.sqlite.listTables.html +1 -1
  313. package/docs/functions/_saltcorn_sqlite.sqlite.listUserDefinedTables.html +1 -1
  314. package/docs/functions/_saltcorn_sqlite.sqlite.query.html +1 -1
  315. package/docs/functions/_saltcorn_sqlite.sqlite.rollback.html +1 -1
  316. package/docs/functions/_saltcorn_sqlite.sqlite.select.html +1 -1
  317. package/docs/functions/_saltcorn_sqlite.sqlite.selectMaybeOne.html +1 -1
  318. package/docs/functions/_saltcorn_sqlite.sqlite.selectOne.html +1 -1
  319. package/docs/functions/_saltcorn_sqlite.sqlite.set_sql_logging.html +1 -1
  320. package/docs/functions/_saltcorn_sqlite.sqlite.sql_log.html +1 -1
  321. package/docs/functions/_saltcorn_sqlite.sqlite.update.html +1 -1
  322. package/docs/functions/_saltcorn_sqlite.sqlite.updateWhere.html +1 -1
  323. package/docs/functions/_saltcorn_types.base_types.instanceOWithHtmlFile.html +1 -1
  324. package/docs/functions/_saltcorn_types.base_types.instanceOfFieldViewEdit.html +1 -1
  325. package/docs/functions/_saltcorn_types.base_types.instanceOfFieldViewShow.html +1 -1
  326. package/docs/functions/_saltcorn_types.base_types.instanceOfPack.html +1 -1
  327. package/docs/functions/_saltcorn_types.common_types.instanceOfErrorMsg.html +1 -1
  328. package/docs/functions/_saltcorn_types.common_types.instanceOfSuccessMsg.html +1 -1
  329. package/docs/functions/_saltcorn_types.common_types.instanceOfType.html +1 -1
  330. package/docs/functions/_saltcorn_types.model-abstracts_abstract_field.instanceOfField.html +1 -1
  331. package/docs/functions/_saltcorn_types.model-abstracts_abstract_page.instanceOfPage.html +1 -1
  332. package/docs/functions/_saltcorn_types.model-abstracts_abstract_plugin.instanceOfPlugin.html +1 -1
  333. package/docs/functions/_saltcorn_types.model-abstracts_abstract_table.instanceOfTable.html +1 -1
  334. package/docs/functions/_saltcorn_types.model-abstracts_abstract_view.instanceOfView.html +1 -1
  335. package/docs/hierarchy.html +1 -1
  336. package/docs/interfaces/_saltcorn_db-common.dbtypes.UserLike.html +2 -2
  337. package/docs/interfaces/_saltcorn_markup.types.TagExports.html +2 -2
  338. package/docs/interfaces/_saltcorn_mobile-builder.utils_common-build-utils.ScCapacitorConfig.html +2 -2
  339. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_field.AbstractField.html +2 -2
  340. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_field.AbstractFieldRepeat.html +2 -2
  341. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_form.AbstractForm.html +2 -2
  342. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_page.AbstractPage.html +2 -2
  343. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_page_group.AbstractPageGroup.html +2 -2
  344. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_page_group_member.AbstractPageGroupMember.html +2 -2
  345. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_plugin.AbstractPlugin.html +2 -2
  346. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_role.AbstractRole.html +2 -2
  347. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_table.AbstractTable.html +2 -2
  348. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_tag.AbstractTag.html +2 -2
  349. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_tag_entry.AbstractTagEntry.html +2 -2
  350. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_trigger.AbstractTrigger.html +2 -2
  351. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_user.AbstractUser.html +2 -2
  352. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_user.ForUserRequest.html +2 -2
  353. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_view.AbstractView.html +2 -2
  354. package/docs/interfaces/_saltcorn_types.model-abstracts_abstract_workflow.AbstractWorkflow.html +2 -2
  355. package/docs/modules/_saltcorn_data.html +1 -1
  356. package/docs/modules/_saltcorn_data.migrations_202604111200.html +1 -1
  357. package/docs/modules/_saltcorn_data.migrations_202604141200.html +1 -0
  358. package/docs/types/_saltcorn_data.diagram_node_extract_utils.ExtractOpts.html +2 -2
  359. package/docs/types/_saltcorn_data.diagram_node_extract_utils.ExtractResult.html +2 -2
  360. package/docs/types/_saltcorn_data.diagram_nodes_node.NodeType.html +1 -1
  361. package/docs/types/_saltcorn_data.models_config.ConfigTypes.html +1 -1
  362. package/docs/types/_saltcorn_data.models_config.SingleConfig.html +1 -1
  363. package/docs/types/_saltcorn_data.models_eventlog.EventLogCfg.html +2 -2
  364. package/docs/types/_saltcorn_data.models_file.FileCfg.html +2 -2
  365. package/docs/types/_saltcorn_data.models_form.AdditionalButton.html +1 -1
  366. package/docs/types/_saltcorn_data.models_form.FormCfg.html +2 -2
  367. package/docs/types/_saltcorn_data.models_internal_push_message_helper.MobileSubscription.html +2 -2
  368. package/docs/types/_saltcorn_data.models_internal_push_message_helper.WebPushSubscription.html +2 -2
  369. package/docs/types/_saltcorn_data.models_internal_s3_helpers.S3HeadResult.html +1 -1
  370. package/docs/types/_saltcorn_data.models_internal_s3_helpers.S3ListResult.html +2 -2
  371. package/docs/types/_saltcorn_data.models_page_group.ScreenInfoParams.html +2 -2
  372. package/docs/types/_saltcorn_data.models_table.ChildRelations.html +2 -2
  373. package/docs/types/_saltcorn_data.models_table.ParentRelations.html +2 -2
  374. package/docs/types/_saltcorn_data.models_table.RelationData.html +2 -2
  375. package/docs/types/_saltcorn_data.models_tag_entry.TagEntryCfg.html +1 -1
  376. package/docs/types/_saltcorn_data.models_view.FindViewsPred.html +1 -1
  377. package/docs/types/_saltcorn_db-common.dbtypes.AggregationOptions.html +2 -2
  378. package/docs/types/_saltcorn_db-common.dbtypes.CoordOpts.html +2 -2
  379. package/docs/types/_saltcorn_db-common.dbtypes.DatabaseClient.html +2 -2
  380. package/docs/types/_saltcorn_db-common.dbtypes.JoinField.html +2 -2
  381. package/docs/types/_saltcorn_db-common.dbtypes.JoinFields.html +1 -1
  382. package/docs/types/_saltcorn_db-common.dbtypes.JoinOptions.html +1 -1
  383. package/docs/types/_saltcorn_db-common.dbtypes.JsonPath.html +1 -1
  384. package/docs/types/_saltcorn_db-common.dbtypes.JsonPathElem.html +1 -1
  385. package/docs/types/_saltcorn_db-common.dbtypes.Operator.html +1 -1
  386. package/docs/types/_saltcorn_db-common.dbtypes.PartialSome.html +1 -1
  387. package/docs/types/_saltcorn_db-common.dbtypes.PrimaryKeyValue.html +1 -1
  388. package/docs/types/_saltcorn_db-common.dbtypes.Row.html +1 -1
  389. package/docs/types/_saltcorn_db-common.dbtypes.SelectOptions.html +2 -2
  390. package/docs/types/_saltcorn_db-common.dbtypes.StrongRow.html +1 -1
  391. package/docs/types/_saltcorn_db-common.dbtypes.SubselectOptions.html +2 -2
  392. package/docs/types/_saltcorn_db-common.dbtypes.Value.html +1 -1
  393. package/docs/types/_saltcorn_db-common.dbtypes.Where.html +2 -2
  394. package/docs/types/_saltcorn_db-common.sqlite-commons.SqlAndValues.html +2 -2
  395. package/docs/types/_saltcorn_db-common.types.DbExportsType.html +2 -2
  396. package/docs/types/_saltcorn_db-common.types.GenObj.html +1 -1
  397. package/docs/types/_saltcorn_markup.emergency_layout.WrapParams.html +2 -2
  398. package/docs/types/_saltcorn_markup.helpers.CheckBoxGroupOpts.html +2 -2
  399. package/docs/types/_saltcorn_markup.helpers.PaginationOpts.html +2 -2
  400. package/docs/types/_saltcorn_markup.helpers.RadioGroupOpts.html +2 -2
  401. package/docs/types/_saltcorn_markup.helpers.SearchBarOpts.html +2 -2
  402. package/docs/types/_saltcorn_markup.layout.RenderOpts-1.html +2 -2
  403. package/docs/types/_saltcorn_markup.layout.RenderOpts.html +2 -2
  404. package/docs/types/_saltcorn_markup.mjml-layout.RenderOpts.html +2 -2
  405. package/docs/types/_saltcorn_markup.table.HeadersParams.html +2 -2
  406. package/docs/types/_saltcorn_markup.table.OptsParams.html +2 -2
  407. package/docs/types/_saltcorn_markup.types.AttributeVal.html +1 -1
  408. package/docs/types/_saltcorn_markup.types.Attributes.html +2 -2
  409. package/docs/types/_saltcorn_markup.types.ClassVal.html +1 -1
  410. package/docs/types/_saltcorn_markup.types.Element.html +1 -1
  411. package/docs/types/_saltcorn_markup.types.Falsy.html +1 -1
  412. package/docs/types/_saltcorn_markup.types.StyleVal.html +1 -1
  413. package/docs/types/_saltcorn_markup.types.TagFunction.html +1 -1
  414. package/docs/types/_saltcorn_mobile-builder.mobile-builder.IosCfg.html +2 -2
  415. package/docs/types/_saltcorn_mobile-builder.utils_capacitor-helper.CapacitorCfg.html +2 -2
  416. package/docs/types/_saltcorn_types.base_types.Action.html +3 -3
  417. package/docs/types/_saltcorn_types.base_types.AuthenticationMethod.html +2 -2
  418. package/docs/types/_saltcorn_types.base_types.CalcJoinfield.html +2 -2
  419. package/docs/types/_saltcorn_types.base_types.CapacitorPlugin.html +2 -2
  420. package/docs/types/_saltcorn_types.base_types.CodePagePack.html +2 -2
  421. package/docs/types/_saltcorn_types.base_types.Column.html +2 -2
  422. package/docs/types/_saltcorn_types.base_types.ConnectObjType.html +2 -2
  423. package/docs/types/_saltcorn_types.base_types.ConnectedObjects.html +2 -2
  424. package/docs/types/_saltcorn_types.base_types.CopilotSkill.html +2 -2
  425. package/docs/types/_saltcorn_types.base_types.ErrorObj.html +2 -2
  426. package/docs/types/_saltcorn_types.base_types.FieldLike.html +1 -1
  427. package/docs/types/_saltcorn_types.base_types.FieldView.html +1 -1
  428. package/docs/types/_saltcorn_types.base_types.Header.html +2 -2
  429. package/docs/types/_saltcorn_types.base_types.JoinFieldOption.html +2 -2
  430. package/docs/types/_saltcorn_types.base_types.Layout.html +1 -1
  431. package/docs/types/_saltcorn_types.base_types.MenuItem.html +2 -2
  432. package/docs/types/_saltcorn_types.base_types.MobileConfig.html +2 -3
  433. package/docs/types/_saltcorn_types.base_types.ModelPattern.html +6 -6
  434. package/docs/types/_saltcorn_types.base_types.Pack.html +2 -2
  435. package/docs/types/_saltcorn_types.base_types.Plugin.html +1 -1
  436. package/docs/types/_saltcorn_types.base_types.PluginFunction.html +2 -2
  437. package/docs/types/_saltcorn_types.base_types.PluginLayout.html +2 -2
  438. package/docs/types/_saltcorn_types.base_types.PluginRoute.html +2 -2
  439. package/docs/types/_saltcorn_types.base_types.PluginSourceType.html +1 -1
  440. package/docs/types/_saltcorn_types.base_types.PluginType.html +2 -2
  441. package/docs/types/_saltcorn_types.base_types.PluginWrap.html +1 -1
  442. package/docs/types/_saltcorn_types.base_types.PluginWrapArg.html +2 -2
  443. package/docs/types/_saltcorn_types.base_types.RelationOption.html +2 -2
  444. package/docs/types/_saltcorn_types.base_types.Req.html +2 -2
  445. package/docs/types/_saltcorn_types.base_types.Res.html +2 -2
  446. package/docs/types/_saltcorn_types.base_types.ResultType.html +2 -2
  447. package/docs/types/_saltcorn_types.base_types.RouteAction.html +1 -1
  448. package/docs/types/_saltcorn_types.base_types.RunExtra.html +1 -1
  449. package/docs/types/_saltcorn_types.base_types.SlugStepType.html +2 -2
  450. package/docs/types/_saltcorn_types.base_types.StepResType.html +1 -1
  451. package/docs/types/_saltcorn_types.base_types.SubField.html +2 -2
  452. package/docs/types/_saltcorn_types.base_types.TableProvider.html +2 -2
  453. package/docs/types/_saltcorn_types.base_types.TableQuery.html +2 -2
  454. package/docs/types/_saltcorn_types.base_types.Tablely.html +1 -1
  455. package/docs/types/_saltcorn_types.base_types.ViewTemplate.html +2 -2
  456. package/docs/types/_saltcorn_types.common_types.ErrorMessage.html +2 -2
  457. package/docs/types/_saltcorn_types.common_types.GenObj.html +1 -1
  458. package/docs/types/_saltcorn_types.common_types.ReqRes.html +2 -2
  459. package/docs/types/_saltcorn_types.common_types.ResultMessage.html +1 -1
  460. package/docs/types/_saltcorn_types.common_types.SuccessMessage.html +2 -2
  461. package/docs/types/_saltcorn_types.common_types.Type.html +2 -2
  462. package/docs/types/_saltcorn_types.model-abstracts_abstract_event_log.EventLogPack.html +2 -2
  463. package/docs/types/_saltcorn_types.model-abstracts_abstract_field.FieldCfg.html +2 -2
  464. package/docs/types/_saltcorn_types.model-abstracts_abstract_field.InputType.html +1 -1
  465. package/docs/types/_saltcorn_types.model-abstracts_abstract_form.AdditionalButton.html +2 -2
  466. package/docs/types/_saltcorn_types.model-abstracts_abstract_library.LibraryCfg.html +2 -2
  467. package/docs/types/_saltcorn_types.model-abstracts_abstract_library.LibraryPack.html +1 -1
  468. package/docs/types/_saltcorn_types.model-abstracts_abstract_model.ModelCfg.html +2 -2
  469. package/docs/types/_saltcorn_types.model-abstracts_abstract_model.ModelPack.html +1 -1
  470. package/docs/types/_saltcorn_types.model-abstracts_abstract_model_instance.ModelInstanceCfg.html +2 -2
  471. package/docs/types/_saltcorn_types.model-abstracts_abstract_model_instance.ModelInstancePack.html +1 -1
  472. package/docs/types/_saltcorn_types.model-abstracts_abstract_page.PageCfg.html +2 -2
  473. package/docs/types/_saltcorn_types.model-abstracts_abstract_page.PagePack.html +1 -1
  474. package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group.PageGroupCfg.html +2 -2
  475. package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group.PageGroupPack.html +1 -1
  476. package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group_member.PageGroupMemberCfg.html +2 -2
  477. package/docs/types/_saltcorn_types.model-abstracts_abstract_page_group_member.PageGroupMemberPack.html +1 -1
  478. package/docs/types/_saltcorn_types.model-abstracts_abstract_plugin.PluginCfg.html +3 -2
  479. package/docs/types/_saltcorn_types.model-abstracts_abstract_plugin.PluginPack.html +1 -1
  480. package/docs/types/_saltcorn_types.model-abstracts_abstract_role.RoleCfg.html +1 -1
  481. package/docs/types/_saltcorn_types.model-abstracts_abstract_role.RolePack.html +1 -1
  482. package/docs/types/_saltcorn_types.model-abstracts_abstract_table.TableCfg.html +2 -2
  483. package/docs/types/_saltcorn_types.model-abstracts_abstract_table.TablePack.html +1 -1
  484. package/docs/types/_saltcorn_types.model-abstracts_abstract_tag.TagPack.html +2 -2
  485. package/docs/types/_saltcorn_types.model-abstracts_abstract_tag_entry.TagEntryPack.html +2 -2
  486. package/docs/types/_saltcorn_types.model-abstracts_abstract_trigger.TriggerCfg.html +2 -2
  487. package/docs/types/_saltcorn_types.model-abstracts_abstract_trigger.TriggerPack.html +1 -1
  488. package/docs/types/_saltcorn_types.model-abstracts_abstract_view.ViewCfg.html +2 -2
  489. package/docs/types/_saltcorn_types.model-abstracts_abstract_view.ViewPack.html +1 -1
  490. package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow.ConfigWorkflowStep.html +1 -1
  491. package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow.RunResult.html +2 -2
  492. package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_run.WorkflowRunCfg.html +2 -2
  493. package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_step.WorkflowStepCfg.html +2 -2
  494. package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_step.WorkflowStepPack.html +1 -1
  495. package/docs/types/_saltcorn_types.model-abstracts_abstract_workflow_trace.WorkflowTraceCfg.html +2 -2
  496. package/docs/variables/_saltcorn_admin-models..backup.create_backup.html +1 -1
  497. package/docs/variables/_saltcorn_admin-models..backup.create_csv_from_rows.html +1 -1
  498. package/docs/variables/_saltcorn_admin-models..backup.restore.html +1 -1
  499. package/docs/variables/_saltcorn_admin-models..pack.add_to_menu.html +1 -1
  500. package/docs/variables/_saltcorn_admin-models..pack.can_install_pack.html +1 -1
  501. package/docs/variables/_saltcorn_admin-models..pack.fetch_available_packs.html +1 -1
  502. package/docs/variables/_saltcorn_admin-models..pack.fetch_pack_by_name.html +1 -1
  503. package/docs/variables/_saltcorn_admin-models..pack.install_pack.html +1 -1
  504. package/docs/variables/_saltcorn_admin-models..pack.library_pack.html +1 -1
  505. package/docs/variables/_saltcorn_admin-models..pack.model_instance_pack.html +1 -1
  506. package/docs/variables/_saltcorn_admin-models..pack.model_pack.html +1 -1
  507. package/docs/variables/_saltcorn_admin-models..pack.page_group_pack.html +1 -1
  508. package/docs/variables/_saltcorn_admin-models..pack.page_pack.html +1 -1
  509. package/docs/variables/_saltcorn_admin-models..pack.plugin_pack.html +1 -1
  510. package/docs/variables/_saltcorn_admin-models..pack.role_pack.html +1 -1
  511. package/docs/variables/_saltcorn_admin-models..pack.table_pack.html +1 -1
  512. package/docs/variables/_saltcorn_admin-models..pack.trigger_pack.html +1 -1
  513. package/docs/variables/_saltcorn_admin-models..pack.uninstall_pack.html +1 -1
  514. package/docs/variables/_saltcorn_admin-models..pack.view_pack.html +1 -1
  515. package/docs/variables/_saltcorn_admin-models..tenant.copy_tenant_template.html +1 -1
  516. package/docs/variables/_saltcorn_admin-models..tenant.create_tenant.html +1 -1
  517. package/docs/variables/_saltcorn_admin-models..tenant.deleteTenant.html +1 -1
  518. package/docs/variables/_saltcorn_admin-models..tenant.domain_sanitize.html +1 -1
  519. package/docs/variables/_saltcorn_admin-models..tenant.eachTenant.html +1 -1
  520. package/docs/variables/_saltcorn_admin-models..tenant.getAllTenantRows.html +1 -1
  521. package/docs/variables/_saltcorn_admin-models..tenant.getAllTenants.html +1 -1
  522. package/docs/variables/_saltcorn_admin-models..tenant.insertTenant.html +1 -1
  523. package/docs/variables/_saltcorn_admin-models..tenant.switchToTenant.html +1 -1
  524. package/docs/variables/_saltcorn_admin-models.models_backup.backup.html +1 -1
  525. package/docs/variables/_saltcorn_admin-models.pack.pack.html +1 -1
  526. package/docs/variables/_saltcorn_admin-models.tenant.tenant.html +1 -1
  527. package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedFive.html +1 -1
  528. package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedFour.html +1 -1
  529. package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedOne.html +1 -1
  530. package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedSix.html +1 -1
  531. package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedThree.html +1 -1
  532. package/docs/variables/_saltcorn_common-code.tests_expected_relations.expectedTwo.html +1 -1
  533. package/docs/variables/_saltcorn_data..migrations.html +1 -1
  534. package/docs/variables/_saltcorn_data..plugin_helper.run_action_column.html +1 -1
  535. package/docs/variables/_saltcorn_data..utils.NotAuthorized.html +1 -1
  536. package/docs/variables/_saltcorn_data..utils.isPushEnabled.html +1 -1
  537. package/docs/variables/_saltcorn_data..utils.sleep.html +1 -1
  538. package/docs/variables/_saltcorn_data.base-plugin_actions.actions.html +4 -4
  539. package/docs/variables/_saltcorn_data.base-plugin_fieldviews.fieldviews.html +3 -3
  540. package/docs/variables/_saltcorn_data.base-plugin_fileview.fileviews.html +1 -1
  541. package/docs/variables/_saltcorn_data.base-plugin_index.index.html +6 -6
  542. package/docs/variables/_saltcorn_data.base-plugin_types.types.html +1 -1
  543. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_edit.edit.html +1 -1
  544. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_feed.feed.html +1 -1
  545. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_filter.filter.html +1 -1
  546. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_list.list.html +1 -1
  547. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_listshowlist.listshowlist.html +1 -1
  548. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_room.room-1.html +1 -1
  549. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_room.room.html +1 -1
  550. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_show.show.html +1 -1
  551. package/docs/variables/_saltcorn_data.base-plugin_viewtemplates_viewable_fields.edit_build_in_actions.html +1 -1
  552. package/docs/variables/_saltcorn_data.contract.contract.html +1 -1
  553. package/docs/variables/_saltcorn_data.db_connect.connect.html +1 -1
  554. package/docs/variables/_saltcorn_data.db_fa5-icons.fa5Icons.html +1 -1
  555. package/docs/variables/_saltcorn_data.db_fixtures.fixtures.html +1 -1
  556. package/docs/variables/_saltcorn_data.db_index.dbExports.html +1 -1
  557. package/docs/variables/_saltcorn_data.db_state.state.html +3 -3
  558. package/docs/variables/_saltcorn_data.migrations_202005141503.sql.html +1 -1
  559. package/docs/variables/_saltcorn_data.migrations_202005241712.sql.html +1 -1
  560. package/docs/variables/_saltcorn_data.migrations_202005251037.sql.html +1 -1
  561. package/docs/variables/_saltcorn_data.migrations_202005282134.sql.html +1 -1
  562. package/docs/variables/_saltcorn_data.migrations_202006022156.sql.html +1 -1
  563. package/docs/variables/_saltcorn_data.migrations_202006051507.sql.html +1 -1
  564. package/docs/variables/_saltcorn_data.migrations_202006240906.sql.html +1 -1
  565. package/docs/variables/_saltcorn_data.migrations_202007091707.sql.html +1 -1
  566. package/docs/variables/_saltcorn_data.migrations_202007202144.sql.html +1 -1
  567. package/docs/variables/_saltcorn_data.migrations_202008031500.sql.html +1 -1
  568. package/docs/variables/_saltcorn_data.migrations_202008051415.sql.html +1 -1
  569. package/docs/variables/_saltcorn_data.migrations_202008121149.sql_pg.html +1 -1
  570. package/docs/variables/_saltcorn_data.migrations_202008121149.sql_sqlite.html +1 -1
  571. package/docs/variables/_saltcorn_data.migrations_202009112140.sql_pg.html +1 -1
  572. package/docs/variables/_saltcorn_data.migrations_202009112140.sql_sqlite.html +1 -1
  573. package/docs/variables/_saltcorn_data.migrations_202009181655.sql.html +1 -1
  574. package/docs/variables/_saltcorn_data.migrations_202009221105.sql.html +1 -1
  575. package/docs/variables/_saltcorn_data.migrations_202009231331.sql.html +1 -1
  576. package/docs/variables/_saltcorn_data.migrations_202009301531.sql.html +1 -1
  577. package/docs/variables/_saltcorn_data.migrations_202010231444.sql.html +1 -1
  578. package/docs/variables/_saltcorn_data.migrations_202010251412.sql.html +1 -1
  579. package/docs/variables/_saltcorn_data.migrations_202011021749.sql.html +1 -1
  580. package/docs/variables/_saltcorn_data.migrations_202011051353.sql.html +1 -1
  581. package/docs/variables/_saltcorn_data.migrations_202011111127.sql.html +1 -1
  582. package/docs/variables/_saltcorn_data.migrations_202012011203.sql.html +1 -1
  583. package/docs/variables/_saltcorn_data.migrations_202012100841.sql.html +1 -1
  584. package/docs/variables/_saltcorn_data.migrations_202012281835.sql.html +1 -1
  585. package/docs/variables/_saltcorn_data.migrations_202101061051.sql.html +1 -1
  586. package/docs/variables/_saltcorn_data.migrations_202101141128.sql.html +1 -1
  587. package/docs/variables/_saltcorn_data.migrations_202102091312.sql.html +1 -1
  588. package/docs/variables/_saltcorn_data.migrations_202102101624.sql.html +1 -1
  589. package/docs/variables/_saltcorn_data.migrations_202102172148.sql.html +1 -1
  590. package/docs/variables/_saltcorn_data.migrations_202102261650.sql.html +1 -1
  591. package/docs/variables/_saltcorn_data.migrations_202106102347.sql.html +1 -1
  592. package/docs/variables/_saltcorn_data.migrations_202106112120.sql.html +1 -1
  593. package/docs/variables/_saltcorn_data.migrations_202106120012.sql.html +1 -1
  594. package/docs/variables/_saltcorn_data.migrations_202106120220.sql.html +1 -1
  595. package/docs/variables/_saltcorn_data.migrations_202106121701.sql.html +1 -1
  596. package/docs/variables/_saltcorn_data.migrations_202106121703.sql_pg.html +1 -1
  597. package/docs/variables/_saltcorn_data.migrations_202106121703.sql_sqlite.html +1 -1
  598. package/docs/variables/_saltcorn_data.migrations_202106251126.sql.html +1 -1
  599. package/docs/variables/_saltcorn_data.migrations_202107281619.sql.html +1 -1
  600. package/docs/variables/_saltcorn_data.migrations_202107302158.sql_pg.html +1 -1
  601. package/docs/variables/_saltcorn_data.migrations_202107302158.sql_sqlite.html +1 -1
  602. package/docs/variables/_saltcorn_data.migrations_202108022257.sql.html +1 -1
  603. package/docs/variables/_saltcorn_data.migrations_202109201624.sql.html +1 -1
  604. package/docs/variables/_saltcorn_data.migrations_202109301031.sql_pg.html +1 -1
  605. package/docs/variables/_saltcorn_data.migrations_202109301031.sql_sqlite.html +1 -1
  606. package/docs/variables/_saltcorn_data.migrations_202111290253.sql_pg.html +1 -1
  607. package/docs/variables/_saltcorn_data.migrations_202111290253.sql_sqlite.html +1 -1
  608. package/docs/variables/_saltcorn_data.migrations_202112282254.sql_pg.html +1 -1
  609. package/docs/variables/_saltcorn_data.migrations_202112282254.sql_sqlite.html +1 -1
  610. package/docs/variables/_saltcorn_data.migrations_202207022002.sql.html +1 -1
  611. package/docs/variables/_saltcorn_data.migrations_202207252150.sql_pg.html +1 -1
  612. package/docs/variables/_saltcorn_data.migrations_202207252150.sql_sqlite.html +1 -1
  613. package/docs/variables/_saltcorn_data.migrations_202207261221.sql.html +1 -1
  614. package/docs/variables/_saltcorn_data.migrations_202208101144.sql_pg.html +1 -1
  615. package/docs/variables/_saltcorn_data.migrations_202208101144.sql_sqlite.html +1 -1
  616. package/docs/variables/_saltcorn_data.migrations_202211040031.sql.html +1 -1
  617. package/docs/variables/_saltcorn_data.migrations_202212112152.sql_pg.html +1 -1
  618. package/docs/variables/_saltcorn_data.migrations_202212112152.sql_sqlite.html +1 -1
  619. package/docs/variables/_saltcorn_data.migrations_202301130917.sql.html +1 -1
  620. package/docs/variables/_saltcorn_data.migrations_202303201126.sql_pg.html +1 -1
  621. package/docs/variables/_saltcorn_data.migrations_202303201126.sql_sqlite.html +1 -1
  622. package/docs/variables/_saltcorn_data.migrations_202303221944.sql_pg.html +1 -1
  623. package/docs/variables/_saltcorn_data.migrations_202303221944.sql_sqlite.html +1 -1
  624. package/docs/variables/_saltcorn_data.migrations_202304281224.sql.html +1 -1
  625. package/docs/variables/_saltcorn_data.migrations_202305031518.sql_pg.html +1 -1
  626. package/docs/variables/_saltcorn_data.migrations_202305031518.sql_sqlite.html +1 -1
  627. package/docs/variables/_saltcorn_data.migrations_202308211648.sql.html +1 -1
  628. package/docs/variables/_saltcorn_data.migrations_202311011755.sql_pg.html +1 -1
  629. package/docs/variables/_saltcorn_data.migrations_202311011755.sql_sqlite.html +1 -1
  630. package/docs/variables/_saltcorn_data.migrations_202311231356.sql.html +1 -1
  631. package/docs/variables/_saltcorn_data.migrations_202402071125.sql.html +1 -1
  632. package/docs/variables/_saltcorn_data.migrations_202406260915.sql.html +1 -1
  633. package/docs/variables/_saltcorn_data.migrations_202412051957.sql_pg.html +1 -1
  634. package/docs/variables/_saltcorn_data.migrations_202412051957.sql_sqlite.html +1 -1
  635. package/docs/variables/_saltcorn_data.migrations_202412111526.sql_pg.html +1 -1
  636. package/docs/variables/_saltcorn_data.migrations_202412111526.sql_sqlite.html +1 -1
  637. package/docs/variables/_saltcorn_data.migrations_202501081226.sql_pg.html +1 -1
  638. package/docs/variables/_saltcorn_data.migrations_202501081226.sql_sqlite.html +1 -1
  639. package/docs/variables/_saltcorn_data.migrations_202501201239.sql_sqlite.html +1 -1
  640. package/docs/variables/_saltcorn_data.migrations_202501262157.sql.html +1 -1
  641. package/docs/variables/_saltcorn_data.migrations_202503071353.sql_pg.html +1 -1
  642. package/docs/variables/_saltcorn_data.migrations_202506050958.sql.html +1 -1
  643. package/docs/variables/_saltcorn_data.migrations_202510110312.sql_pg.html +1 -1
  644. package/docs/variables/_saltcorn_data.migrations_202510110312.sql_sqlite.html +1 -1
  645. package/docs/variables/_saltcorn_data.migrations_202511081024.sql.html +1 -1
  646. package/docs/variables/_saltcorn_data.migrations_202604091531.sql.html +1 -1
  647. package/docs/variables/_saltcorn_data.mobile-mocks_npm_npm-registry-fetch.npmRegistryFetch.html +1 -1
  648. package/docs/variables/_saltcorn_data.mobile-mocks_saltcorn_html-pdf-node.htmlPdfNode.html +1 -1
  649. package/docs/variables/_saltcorn_data.models_config.configExports.html +1 -1
  650. package/docs/variables/_saltcorn_data.models_discovery.discovery.html +1 -1
  651. package/docs/variables/_saltcorn_data.models_email.email.html +3 -3
  652. package/docs/variables/_saltcorn_data.models_expression.expression.html +3 -3
  653. package/docs/variables/_saltcorn_data.models_index.config.available_languages.html +1 -1
  654. package/docs/variables/_saltcorn_data.models_index.config.check_email_mask.html +1 -1
  655. package/docs/variables/_saltcorn_data.models_index.config.configTypes.html +1 -1
  656. package/docs/variables/_saltcorn_data.models_index.config.deleteConfig.html +1 -1
  657. package/docs/variables/_saltcorn_data.models_index.config.getAllConfig.html +1 -1
  658. package/docs/variables/_saltcorn_data.models_index.config.getConfig.html +1 -1
  659. package/docs/variables/_saltcorn_data.models_index.config.get_base_url.html +1 -1
  660. package/docs/variables/_saltcorn_data.models_index.config.get_latest_npm_version.html +1 -1
  661. package/docs/variables/_saltcorn_data.models_index.config.remove_from_menu.html +1 -1
  662. package/docs/variables/_saltcorn_data.models_index.config.save_menu_items.html +1 -1
  663. package/docs/variables/_saltcorn_data.models_index.config.setConfig.html +1 -1
  664. package/docs/variables/_saltcorn_data.models_index.discovery.discover_tables.html +1 -1
  665. package/docs/variables/_saltcorn_data.models_index.discovery.discoverable_tables.html +1 -1
  666. package/docs/variables/_saltcorn_data.models_index.discovery.findType.html +1 -1
  667. package/docs/variables/_saltcorn_data.models_index.discovery.get_existing_views.html +1 -1
  668. package/docs/variables/_saltcorn_data.models_index.discovery.implement_discovery.html +1 -1
  669. package/docs/variables/_saltcorn_data.models_index.email.getMailTransport.html +1 -1
  670. package/docs/variables/_saltcorn_data.models_index.email.send_verification_email.html +1 -1
  671. package/docs/variables/_saltcorn_data.models_index.email.viewToEmailHtml.html +1 -1
  672. package/docs/variables/_saltcorn_data.models_index.expression.apply_calculated_fields.html +1 -1
  673. package/docs/variables/_saltcorn_data.models_index.expression.apply_calculated_fields_stored.html +1 -1
  674. package/docs/variables/_saltcorn_data.models_index.expression.eval_expression.html +1 -1
  675. package/docs/variables/_saltcorn_data.models_index.expression.expressionValidator.html +1 -1
  676. package/docs/variables/_saltcorn_data.models_index.expression.get_async_expression_function.html +1 -1
  677. package/docs/variables/_saltcorn_data.models_index.expression.get_expression_function.html +1 -1
  678. package/docs/variables/_saltcorn_data.models_index.expression.jsexprToWhere.html +1 -1
  679. package/docs/variables/_saltcorn_data.models_index.expression.recalculate_for_stored.html +1 -1
  680. package/docs/variables/_saltcorn_data.models_index.expression.transform_for_async.html +1 -1
  681. package/docs/variables/_saltcorn_data.models_index.layout.eachView.html +1 -1
  682. package/docs/variables/_saltcorn_data.models_index.layout.getStringsForI18n.html +1 -1
  683. package/docs/variables/_saltcorn_data.models_index.layout.getViews.html +1 -1
  684. package/docs/variables/_saltcorn_data.models_index.layout.translateLayout.html +1 -1
  685. package/docs/variables/_saltcorn_data.models_index.layout.traverse.html +1 -1
  686. package/docs/variables/_saltcorn_data.models_index.layout.traverseSync.html +1 -1
  687. package/docs/variables/_saltcorn_data.models_index.random.all_views.html +1 -1
  688. package/docs/variables/_saltcorn_data.models_index.random.fill_table_row.html +1 -1
  689. package/docs/variables/_saltcorn_data.models_index.random.initial_view.html +1 -1
  690. package/docs/variables/_saltcorn_data.models_index.random.random_table.html +1 -1
  691. package/docs/variables/_saltcorn_data.models_index.scheduler.runScheduler.html +1 -1
  692. package/docs/variables/_saltcorn_data.models_layout.layout.html +1 -1
  693. package/docs/variables/_saltcorn_data.models_random.random.html +1 -1
  694. package/docs/variables/_saltcorn_data.models_scheduler.scheduler.html +1 -1
  695. package/docs/variables/_saltcorn_data.plugin-helper.add_free_variables_to_joinfields.html +1 -1
  696. package/docs/variables/_saltcorn_data.tests_mocks.mocks.html +1 -1
  697. package/docs/variables/_saltcorn_data.tests_remote_query_helper.renderEditInEditConfig.html +1 -1
  698. package/docs/variables/_saltcorn_data.utils.utils.html +10 -4
  699. package/docs/variables/_saltcorn_data.web-mobile-commons.webMobileCommons.html +1 -1
  700. package/docs/variables/_saltcorn_db-common.internal.dbCommonModulePath.html +1 -1
  701. package/docs/variables/_saltcorn_db-common.multi-tenant.tenantNamespace.html +1 -1
  702. package/docs/variables/_saltcorn_db-common.tenants.tenants.html +1 -1
  703. package/docs/variables/_saltcorn_markup..export_.html +1 -1
  704. package/docs/variables/_saltcorn_markup.builder.builder.html +1 -1
  705. package/docs/variables/_saltcorn_markup.emergency_layout.EmergencyLayoutExports.html +1 -1
  706. package/docs/variables/_saltcorn_markup.form.form.html +1 -1
  707. package/docs/variables/_saltcorn_markup.helpers.HelpersExports.html +1 -1
  708. package/docs/variables/_saltcorn_markup.layout.LayoutExports-1.html +1 -1
  709. package/docs/variables/_saltcorn_markup.layout.LayoutExports.html +1 -1
  710. package/docs/variables/_saltcorn_markup.layout_utils.layoutUtils.html +1 -1
  711. package/docs/variables/_saltcorn_markup.mjml-layout.LayoutExports.html +1 -1
  712. package/docs/variables/_saltcorn_markup.mjml-tags.tagsExports.html +1 -1
  713. package/docs/variables/_saltcorn_markup.table.TableExports.html +1 -1
  714. package/docs/variables/_saltcorn_markup.tags.tagsExports.html +1 -1
  715. package/docs/variables/_saltcorn_types..generators.generateBool.html +1 -1
  716. package/docs/variables/_saltcorn_types..generators.generateString.html +1 -1
  717. package/docs/variables/_saltcorn_types..generators.num_between.html +1 -1
  718. package/docs/variables/_saltcorn_types..generators.oneOf.html +1 -1
  719. package/docs/variables/_saltcorn_types.generators.generators.html +1 -1
  720. package/help/JavaScript action code.tmd +5 -1
  721. package/locales/en.json +3 -1
  722. package/package.json +13 -13
  723. package/public/saltcorn-common.js +5 -2
  724. package/public/saltcorn.js +23 -0
  725. package/routes/actions.js +9 -8
  726. package/routes/admin.js +67 -8
  727. package/routes/api.js +40 -37
  728. package/routes/fields.js +114 -10
  729. package/routes/files.js +13 -1
  730. package/routes/list.js +5 -4
  731. package/routes/plugins.js +29 -3
  732. package/routes/sync.js +45 -32
  733. package/routes/tables.js +166 -0
  734. package/routes/utils.js +9 -32
  735. package/serve.js +26 -9
  736. package/tests/admin.test.js +5 -5
  737. package/tests/api.test.js +130 -1
  738. package/tests/files.test.js +39 -0
  739. package/tests/plugin_install.test.js +120 -0
  740. package/tests/sync.test.js +62 -46
  741. package/tests/view.test.js +32 -0
  742. package/wrapper.js +1 -1
  743. package/docs/functions/_saltcorn_data.migrations_202604111200.sql_pg.html +0 -1
package/tests/api.test.js CHANGED
@@ -822,7 +822,10 @@ describe("API emit-event access control", () => {
822
822
  .set("Authorization", `jwt ${adminJwt}`)
823
823
  .send({ payload: {} })
824
824
  .expect(
825
- respondJsonWith(403, (resp) => resp.error === "Event type not allowed")
825
+ respondJsonWith(
826
+ 403,
827
+ (resp) => resp.error === "Event type not allowed"
828
+ )
826
829
  );
827
830
  }
828
831
  });
@@ -1150,4 +1153,130 @@ describe("API cross-table sub-select access control", () => {
1150
1153
  const rows2 = resp2.body.success || [];
1151
1154
  expect(rows1.length).toBe(rows2.length);
1152
1155
  });
1156
+
1157
+ it("should not allow probing restricted tables via _relation_path_ parameter", async () => {
1158
+ const app = await getApp({ disableCsrf: true });
1159
+ // The _relation_path_ query parameter accepts JSON that specifies a
1160
+ // relation path through arbitrary tables. handleRelationPath() constructs
1161
+ // an inSelectWithLevels subquery with NO authorization checks.
1162
+ //
1163
+ // Attack: query the public books table with a _relation_path_ that
1164
+ // traverses the restricted patients table (min_role_read=40):
1165
+ // ?_relation_path_={"relation":".books.patients$name","srcId":"Kirk Douglas"}
1166
+ // This generates:
1167
+ // WHERE id IN (SELECT id FROM patients WHERE name = 'Kirk Douglas')
1168
+ // A public user can determine whether a patient with a given name exists
1169
+ // by observing which books are returned.
1170
+ const patients = Table.findOne({ name: "patients" });
1171
+ expect(patients.min_role_read).toBe(40);
1172
+
1173
+ // srcId matching an existing patient name
1174
+ const resp1 = await request(app)
1175
+ .get("/api/books/")
1176
+ .query({
1177
+ _relation_path_: JSON.stringify({
1178
+ relation: ".books.patients$name",
1179
+ srcId: "Kirk Douglas",
1180
+ }),
1181
+ })
1182
+ .expect(200);
1183
+
1184
+ // srcId with a non-existent patient name
1185
+ const resp2 = await request(app)
1186
+ .get("/api/books/")
1187
+ .query({
1188
+ _relation_path_: JSON.stringify({
1189
+ relation: ".books.patients$name",
1190
+ srcId: "ZZZNONEXISTENT",
1191
+ }),
1192
+ })
1193
+ .expect(200);
1194
+
1195
+ // If the relation_path is allowed without authorization, resp1 returns
1196
+ // book id=1 (because patient "Kirk Douglas" has id=1) while resp2
1197
+ // returns nothing. The difference reveals that "Kirk Douglas" exists
1198
+ // in the restricted patients table.
1199
+ //
1200
+ // Secure behavior: both queries return the same results (the subquery
1201
+ // against the restricted table is blocked or ignored), OR the query
1202
+ // is rejected.
1203
+ const rows1 = resp1.body.success || [];
1204
+ const rows2 = resp2.body.success || [];
1205
+ expect(rows1.length).toBe(rows2.length);
1206
+ });
1207
+
1208
+ it("should not allow probing restricted tables via dot-prefix relation path", async () => {
1209
+ const app = await getApp({ disableCsrf: true });
1210
+ // The dot-prefix syntax (e.g. ?.books.patients$name=value) is another
1211
+ // way to invoke handleRelationPath, which has no authorization checks.
1212
+ // This constructs the same inSelectWithLevels subquery.
1213
+ const patients = Table.findOne({ name: "patients" });
1214
+ expect(patients.min_role_read).toBe(40);
1215
+
1216
+ const resp1 = await request(app)
1217
+ .get("/api/books/")
1218
+ .query({ ".books.patients$name": "Kirk Douglas" })
1219
+ .expect(200);
1220
+
1221
+ const resp2 = await request(app)
1222
+ .get("/api/books/")
1223
+ .query({ ".books.patients$name": "ZZZNONEXISTENT" })
1224
+ .expect(200);
1225
+
1226
+ const rows1 = resp1.body.success || [];
1227
+ const rows2 = resp2.body.success || [];
1228
+ expect(rows1.length).toBe(rows2.length);
1229
+ });
1230
+ });
1231
+
1232
+ describe("API CSRF protection", () => {
1233
+ let adminToken, adminJwt;
1234
+
1235
+ beforeAll(async () => {
1236
+ const admin = await User.findOne({ email: "admin@foo.com" });
1237
+ adminToken = await admin.getNewAPIToken();
1238
+ adminJwt = await getAdminJwt();
1239
+ });
1240
+
1241
+ it("should reject POST with session cookie but no CSRF token", async () => {
1242
+ const app = await getApp({ disableCsrf: false });
1243
+ const loginCookie = await getAdminLoginCookie();
1244
+ await request(app)
1245
+ .post("/api/books/")
1246
+ .set("Cookie", loginCookie)
1247
+ .send({ author: "CSRF Test", pages: 1 })
1248
+ .set("Content-Type", "application/json")
1249
+ .expect(302);
1250
+ });
1251
+
1252
+ it("should allow POST with bearer token and no CSRF token", async () => {
1253
+ const app = await getApp({ disableCsrf: false });
1254
+ await request(app)
1255
+ .post("/api/books/")
1256
+ .set("Authorization", "Bearer " + adminToken)
1257
+ .send({ author: "Bearer No CSRF", pages: 2 })
1258
+ .set("Content-Type", "application/json")
1259
+ .set("Accept", "application/json")
1260
+ .expect(succeedJsonWith((resp) => resp && typeof resp === "number"));
1261
+ });
1262
+
1263
+ it("should allow POST with valid JWT and no CSRF token", async () => {
1264
+ const app = await getApp({ disableCsrf: false });
1265
+ await request(app)
1266
+ .post("/api/books/")
1267
+ .set("Authorization", `jwt ${adminJwt}`)
1268
+ .send({ author: "JWT No CSRF", pages: 3 })
1269
+ .set("Content-Type", "application/json")
1270
+ .set("Accept", "application/json")
1271
+ .expect(succeedJsonWith((resp) => resp && typeof resp === "number"));
1272
+ });
1273
+
1274
+ it("should not bypass CSRF by appending a fake ?jwt= query parameter", async () => {
1275
+ const app = await getApp({ disableCsrf: false });
1276
+ await request(app)
1277
+ .post("/api/books/?jwt=fakejwt")
1278
+ .send({ author: "CSRF Bypass Attempt", pages: 4 })
1279
+ .set("Content-Type", "application/json")
1280
+ .expect(302);
1281
+ });
1153
1282
  });
@@ -107,6 +107,13 @@ beforeAll(async () => {
107
107
  "console.log('I am a script');",
108
108
  1
109
109
  );
110
+ await createTestFile(
111
+ "/",
112
+ "malicious.svg",
113
+ "image/svg+xml",
114
+ `<svg xmlns="http://www.w3.org/2000/svg"><script>alert('XSS')</script><circle cx="50" cy="50" r="40"/></svg>`,
115
+ 100
116
+ );
110
117
  });
111
118
  afterAll(db.close);
112
119
 
@@ -163,6 +170,16 @@ describe("files admin", () => {
163
170
  toSucceedWithImage({ lengthIs: (bs) => bs < 100000 && bs > 2000 })
164
171
  );
165
172
  });
173
+ it("sanitize SVG served via /files/resize (XSS bypass)", async () => {
174
+ const app = await getApp({ disableCsrf: true });
175
+ const res = await request(app).get("/files/resize/0/0/malicious.svg");
176
+ expect(res.status).toBe(200);
177
+ const body = res.text || Buffer.from(res.body).toString();
178
+ // The resize endpoint must also sanitize SVG files, just like /files/serve does.
179
+ // Without this, an attacker can bypass DOMPurify by requesting an SVG via
180
+ // /files/resize/0/0/path.svg (width=0 makes it serve the original file).
181
+ expect(body).not.toContain("<script>");
182
+ });
166
183
  it("serve resized file without height", async () => {
167
184
  const app = await getApp({ disableCsrf: true });
168
185
  await request(app)
@@ -538,4 +555,26 @@ describe("visible_entries test", () => {
538
555
  expect(body.files.length).toBe(0);
539
556
  expect(body.directories.length).toBe(0);
540
557
  });
558
+
559
+ it("should not crash on regex special characters in file_exts (CVE: regex injection)", async () => {
560
+ // The file_exts parameter is passed directly to new RegExp() without escaping.
561
+ // Regex metacharacters like ( [ cause SyntaxError → 500 Internal Server Error.
562
+ // This also enables ReDoS: patterns like (a+)+b cause exponential CPU usage.
563
+ // Confirmed: a file with 30 repeated chars + backtracking regex → 3.6s,
564
+ // 35 chars → 112s. The endpoint should escape regex metacharacters
565
+ // or use literal string matching, not raw user input in new RegExp().
566
+ const app = await getApp({ disableCsrf: true });
567
+ const adminCookie = await getAdminLoginCookie();
568
+ await getState().setConfig("min_role_edit_files", 1);
569
+ const resp = await request(app)
570
+ .get(
571
+ "/files/visible_entries?dir=_sc_test_subfolder_one&file_exts=" +
572
+ encodeURIComponent("([")
573
+ )
574
+ .set("Cookie", adminCookie);
575
+ // Should return 200 with valid JSON, not crash with 500
576
+ expect(resp.statusCode).toBe(200);
577
+ expect(resp.body).toBeDefined();
578
+ expect(resp.body.files).toBeDefined();
579
+ });
541
580
  });
@@ -9,6 +9,7 @@ const {
9
9
  } = require("@saltcorn/admin-models/models/tenant");
10
10
  const { resetToFixtures } = require("../auth/testhelp");
11
11
  const db = require("@saltcorn/data/db");
12
+ const { get_store_items } = require("../routes/plugins");
12
13
 
13
14
  beforeAll(async () => {
14
15
  if (!db.isSQLite) await db.query(`drop schema if exists test101 CASCADE `);
@@ -87,6 +88,64 @@ describe("Tenant cannot install unsafe plugins", () => {
87
88
  expect(dbPlugin).toBe(null);
88
89
  });
89
90
  });
91
+ it("cannot install git plugins on tenant when tenants_install_git is false", async () => {
92
+ await db.runWithTenant("test101", async () => {
93
+ const loadAndSaveNewPlugin = Plugin.loadAndSaveNewPlugin;
94
+
95
+ await install_pack(
96
+ plugin_pack({
97
+ name: "some-git-plugin",
98
+ source: "git",
99
+ location: "https://github.com/example/some-git-plugin",
100
+ }),
101
+ "Some git plugin",
102
+ loadAndSaveNewPlugin
103
+ );
104
+ const dbPlugin = await Plugin.findOne({ name: "some-git-plugin" });
105
+ expect(dbPlugin).toBe(null);
106
+ });
107
+ });
108
+ it("cannot install github plugins on tenant when tenants_install_git is false", async () => {
109
+ await db.runWithTenant("test101", async () => {
110
+ const loadAndSaveNewPlugin = Plugin.loadAndSaveNewPlugin;
111
+
112
+ await install_pack(
113
+ plugin_pack({
114
+ name: "some-github-plugin",
115
+ source: "github",
116
+ location: "example/some-github-plugin",
117
+ }),
118
+ "Some github plugin",
119
+ loadAndSaveNewPlugin
120
+ );
121
+ const dbPlugin = await Plugin.findOne({ name: "some-github-plugin" });
122
+ expect(dbPlugin).toBe(null);
123
+ });
124
+ });
125
+ it("loadPlugin skips git plugin on tenant when tenants_install_git is false", async () => {
126
+ await db.runWithTenant("test101", async () => {
127
+ const result = await Plugin.loadPlugin(
128
+ new Plugin({
129
+ name: "some-git-plugin",
130
+ source: "git",
131
+ location: "https://github.com/example/some-git-plugin",
132
+ })
133
+ );
134
+ expect(result).toBeUndefined();
135
+ });
136
+ });
137
+ it("loadPlugin skips github plugin on tenant when tenants_install_git is false", async () => {
138
+ await db.runWithTenant("test101", async () => {
139
+ const result = await Plugin.loadPlugin(
140
+ new Plugin({
141
+ name: "some-github-plugin",
142
+ source: "github",
143
+ location: "example/some-github-plugin",
144
+ })
145
+ );
146
+ expect(result).toBeUndefined();
147
+ });
148
+ });
90
149
  it("can install unsafe plugins on tenant when permitted", async () => {
91
150
  await getState().setConfig("tenants_unsafe_plugins", true);
92
151
  await db.runWithTenant("test101", async () => {
@@ -346,3 +405,64 @@ describe("Stable versioning upgrade", () => {
346
405
  expect(newPlugin.version).toBe("0.1.0");
347
406
  });
348
407
  });
408
+
409
+ describe("Tenant git plugin store filtering", () => {
410
+ const mockReq = { flash: () => {}, __: (s) => s };
411
+
412
+ if (!db.isSQLite) {
413
+ it("git plugin is excluded from installed list when tenants_install_git is false", async () => {
414
+ await db.runWithTenant("test101", async () => {
415
+ const gitPlugin = new Plugin({
416
+ name: "test-git-plugin",
417
+ source: "git",
418
+ location: "https://github.com/example/test-git-plugin",
419
+ });
420
+ await gitPlugin.upsert();
421
+
422
+ const items = await get_store_items(mockReq);
423
+ const names = items.map((i) => i.name);
424
+ expect(names).not.toContain("test-git-plugin");
425
+
426
+ await db.deleteWhere("_sc_plugins", { name: "test-git-plugin" });
427
+ });
428
+ });
429
+
430
+ it("github plugin is excluded from installed list when tenants_install_git is false", async () => {
431
+ await db.runWithTenant("test101", async () => {
432
+ const githubPlugin = new Plugin({
433
+ name: "test-github-plugin",
434
+ source: "github",
435
+ location: "example/test-github-plugin",
436
+ });
437
+ await githubPlugin.upsert();
438
+
439
+ const items = await get_store_items(mockReq);
440
+ const names = items.map((i) => i.name);
441
+ expect(names).not.toContain("test-github-plugin");
442
+
443
+ await db.deleteWhere("_sc_plugins", { name: "test-github-plugin" });
444
+ });
445
+ });
446
+
447
+ it("git plugin does not appear as installed in set=all when tenants_install_git is false", async () => {
448
+ await db.runWithTenant("test101", async () => {
449
+ const gitPlugin = new Plugin({
450
+ name: "test-git-plugin",
451
+ source: "git",
452
+ location: "https://github.com/example/test-git-plugin",
453
+ });
454
+ await gitPlugin.upsert();
455
+
456
+ const items = await get_store_items(mockReq);
457
+ const match = items.find((i) => i.name === "test-git-plugin");
458
+ expect(match).toBeUndefined();
459
+
460
+ await db.deleteWhere("_sc_plugins", { name: "test-git-plugin" });
461
+ });
462
+ });
463
+ } else {
464
+ it("does not support tenants on SQLite", async () => {
465
+ expect(db.isSQLite).toBe(true);
466
+ });
467
+ }
468
+ });
@@ -101,7 +101,7 @@ describe("load remote insert/updates", () => {
101
101
  loadUntil: loadUntil.valueOf(),
102
102
  syncInfos: {
103
103
  books: {
104
- maxLoadedId: 0,
104
+ lastModifiedAt: 0,
105
105
  },
106
106
  },
107
107
  });
@@ -111,15 +111,16 @@ describe("load remote insert/updates", () => {
111
111
  for (const row of data.books.rows) {
112
112
  const fromDb = await books.getRows({ id: row._sync_info_tbl_ref_ });
113
113
  expect(fromDb.length).toBe(1);
114
- expect(row._sync_info_tbl_last_modified_).toBe(loadUntil.valueOf());
115
- expect(row._sync_info_tbl_deleted_).toBe(null);
114
+ expect(typeof row._sync_info_tbl_last_modified_).toBe("number");
115
+ expect(row._sync_info_tbl_deleted_).toBe(false);
116
116
  }
117
117
  });
118
118
 
119
- it("with syncFrom, without sync_infos", async () => {
119
+ it("with syncFrom, no changes in window", async () => {
120
120
  const app = await getApp({ disableCsrf: true });
121
121
  const loginCookie = await getAdminLoginCookie();
122
122
  const loadUntil = new Date();
123
+ // syncFrom == loadUntil → empty time window → no rows
123
124
  const resp = await request(app)
124
125
  .post("/sync/load_changes")
125
126
  .set("Cookie", loginCookie)
@@ -127,8 +128,8 @@ describe("load remote insert/updates", () => {
127
128
  loadUntil: loadUntil.valueOf(),
128
129
  syncInfos: {
129
130
  books: {
130
- maxLoadedId: 0,
131
- syncFrom: 1000,
131
+ lastModifiedAt: 0,
132
+ syncFrom: loadUntil.valueOf(),
132
133
  },
133
134
  },
134
135
  });
@@ -154,7 +155,7 @@ describe("load remote insert/updates", () => {
154
155
  loadUntil: (await db.time()).valueOf(),
155
156
  syncInfos: {
156
157
  books: {
157
- maxLoadedId: 0,
158
+ lastModifiedAt: 0,
158
159
  syncFrom: dbTime.valueOf(),
159
160
  },
160
161
  },
@@ -169,7 +170,7 @@ describe("load remote insert/updates", () => {
169
170
  _sync_info_tbl_deleted_,
170
171
  ...rest
171
172
  } = data.books.rows[0];
172
- expect(_sync_info_tbl_ref_).toBe(2);
173
+ expect(Number(_sync_info_tbl_ref_)).toBe(2);
173
174
  expect(_sync_info_tbl_last_modified_).toBe(last_modified.valueOf());
174
175
  expect(_sync_info_tbl_deleted_).toBe(false);
175
176
  expect(rest.author).toBe("Leo Tolstoy");
@@ -183,7 +184,7 @@ describe("load remote insert/updates", () => {
183
184
  loadUntil: (await db.time()).valueOf(),
184
185
  syncInfos: {
185
186
  books: {
186
- maxLoadedId: 0,
187
+ lastModifiedAt: 0,
187
188
  syncFrom: dbTime.valueOf(),
188
189
  },
189
190
  },
@@ -198,13 +199,13 @@ describe("load remote insert/updates", () => {
198
199
  _sync_info_tbl_deleted_,
199
200
  ...rest
200
201
  } = row;
201
- expect(_sync_info_tbl_ref_).toBe(rest.id);
202
+ expect(Number(_sync_info_tbl_ref_)).toBe(rest.id);
202
203
  const { last_modified } = await books.latestSyncInfo(rest.id);
203
204
  expect(_sync_info_tbl_last_modified_).toBe(last_modified.valueOf());
204
205
  expect(_sync_info_tbl_deleted_).toBe(false);
205
206
  }
206
- expect(data.books.rows[0].author).toBe("Herman Melville");
207
- expect(data.books.rows[1].author).toBe("Leo Tolstoy");
207
+ expect(data.books.rows[0].author).toBe("Leo Tolstoy");
208
+ expect(data.books.rows[1].author).toBe("Herman Melville");
208
209
  }
209
210
  });
210
211
 
@@ -246,7 +247,7 @@ describe("load remote insert/updates", () => {
246
247
  loadUntil: (await db.time()).valueOf(),
247
248
  syncInfos: {
248
249
  "Table with capitals": {
249
- maxLoadedId: 0,
250
+ lastModifiedAt: 0,
250
251
  syncFrom: dbTime.valueOf(),
251
252
  },
252
253
  },
@@ -265,7 +266,7 @@ describe("load remote insert/updates", () => {
265
266
  loadUntil: loadUntil.valueOf(),
266
267
  syncInfos: {
267
268
  patients: {
268
- maxLoadedId: 0,
269
+ lastModifiedAt: 0,
269
270
  syncFrom: 1000,
270
271
  },
271
272
  },
@@ -304,7 +305,7 @@ describe("load remote insert/updates", () => {
304
305
  loadUntil: loadUntil.valueOf(),
305
306
  syncInfos: {
306
307
  patients: {
307
- maxLoadedId: 0,
308
+ lastModifiedAt: 0,
308
309
  },
309
310
  },
310
311
  });
@@ -334,7 +335,7 @@ describe("load remote insert/updates", () => {
334
335
  loadUntil: loadUntil.valueOf(),
335
336
  syncInfos: {
336
337
  patients: {
337
- maxLoadedId: 0,
338
+ lastModifiedAt: 0,
338
339
  syncFrom: 1000,
339
340
  },
340
341
  },
@@ -913,9 +914,9 @@ describe("SQL injection protection", () => {
913
914
  await initSyncInfo(["books"]);
914
915
  });
915
916
 
916
- // --- /sync/load_changes : maxLoadedId ---
917
+ // --- /sync/load_changes : lastModifiedAt ---
917
918
 
918
- it("rejects SQL injection in maxLoadedId (OR 1=1)", async () => {
919
+ it("rejects SQL injection in lastModifiedAt (OR 1=1)", async () => {
919
920
  const app = await getApp({ disableCsrf: true });
920
921
  const loginCookie = await getAdminLoginCookie();
921
922
  await request(app)
@@ -923,14 +924,17 @@ describe("SQL injection protection", () => {
923
924
  .set("Cookie", loginCookie)
924
925
  .send({
925
926
  loadUntil: new Date().valueOf(),
926
- syncInfos: { books: { maxLoadedId: "0 OR 1=1--" } },
927
+ syncInfos: { books: { lastModifiedAt: "0 OR 1=1--" } },
927
928
  })
928
929
  .expect(
929
- respondJsonWith(400, (resp) => resp.error === "Invalid maxLoadedId")
930
+ respondJsonWith(
931
+ 400,
932
+ (resp) => resp.error === "Invalid lastModifiedAt"
933
+ )
930
934
  );
931
935
  });
932
936
 
933
- it("rejects SQL injection in maxLoadedId (UNION SELECT)", async () => {
937
+ it("rejects SQL injection in lastModifiedAt (UNION SELECT)", async () => {
934
938
  const app = await getApp({ disableCsrf: true });
935
939
  const loginCookie = await getAdminLoginCookie();
936
940
  await request(app)
@@ -939,15 +943,18 @@ describe("SQL injection protection", () => {
939
943
  .send({
940
944
  loadUntil: new Date().valueOf(),
941
945
  syncInfos: {
942
- books: { maxLoadedId: "0 UNION SELECT * FROM users--" },
946
+ books: { lastModifiedAt: "0 UNION SELECT * FROM users--" },
943
947
  },
944
948
  })
945
949
  .expect(
946
- respondJsonWith(400, (resp) => resp.error === "Invalid maxLoadedId")
950
+ respondJsonWith(
951
+ 400,
952
+ (resp) => resp.error === "Invalid lastModifiedAt"
953
+ )
947
954
  );
948
955
  });
949
956
 
950
- it("rejects SQL injection in maxLoadedId (stacked query)", async () => {
957
+ it("rejects SQL injection in lastModifiedAt (stacked query)", async () => {
951
958
  const app = await getApp({ disableCsrf: true });
952
959
  const loginCookie = await getAdminLoginCookie();
953
960
  await request(app)
@@ -956,15 +963,18 @@ describe("SQL injection protection", () => {
956
963
  .send({
957
964
  loadUntil: new Date().valueOf(),
958
965
  syncInfos: {
959
- books: { maxLoadedId: "0; DROP TABLE books; --" },
966
+ books: { lastModifiedAt: "0; DROP TABLE books; --" },
960
967
  },
961
968
  })
962
969
  .expect(
963
- respondJsonWith(400, (resp) => resp.error === "Invalid maxLoadedId")
970
+ respondJsonWith(
971
+ 400,
972
+ (resp) => resp.error === "Invalid lastModifiedAt"
973
+ )
964
974
  );
965
975
  });
966
976
 
967
- it("rejects non-numeric string for maxLoadedId", async () => {
977
+ it("rejects non-numeric string for lastModifiedAt", async () => {
968
978
  const app = await getApp({ disableCsrf: true });
969
979
  const loginCookie = await getAdminLoginCookie();
970
980
  await request(app)
@@ -972,14 +982,17 @@ describe("SQL injection protection", () => {
972
982
  .set("Cookie", loginCookie)
973
983
  .send({
974
984
  loadUntil: new Date().valueOf(),
975
- syncInfos: { books: { maxLoadedId: "abc" } },
985
+ syncInfos: { books: { lastModifiedAt: "abc" } },
976
986
  })
977
987
  .expect(
978
- respondJsonWith(400, (resp) => resp.error === "Invalid maxLoadedId")
988
+ respondJsonWith(
989
+ 400,
990
+ (resp) => resp.error === "Invalid lastModifiedAt"
991
+ )
979
992
  );
980
993
  });
981
994
 
982
- it("rejects float maxLoadedId", async () => {
995
+ it("rejects float lastModifiedAt", async () => {
983
996
  const app = await getApp({ disableCsrf: true });
984
997
  const loginCookie = await getAdminLoginCookie();
985
998
  await request(app)
@@ -987,10 +1000,13 @@ describe("SQL injection protection", () => {
987
1000
  .set("Cookie", loginCookie)
988
1001
  .send({
989
1002
  loadUntil: new Date().valueOf(),
990
- syncInfos: { books: { maxLoadedId: 1.5 } },
1003
+ syncInfos: { books: { lastModifiedAt: 1.5 } },
991
1004
  })
992
1005
  .expect(
993
- respondJsonWith(400, (resp) => resp.error === "Invalid maxLoadedId")
1006
+ respondJsonWith(
1007
+ 400,
1008
+ (resp) => resp.error === "Invalid lastModifiedAt"
1009
+ )
994
1010
  );
995
1011
  });
996
1012
 
@@ -1004,7 +1020,7 @@ describe("SQL injection protection", () => {
1004
1020
  .set("Cookie", loginCookie)
1005
1021
  .send({
1006
1022
  loadUntil: new Date().valueOf(),
1007
- syncInfos: { books: { maxLoadedId: 0, syncFrom: "not-a-date" } },
1023
+ syncInfos: { books: { lastModifiedAt: 0, syncFrom: "not-a-date" } },
1008
1024
  })
1009
1025
  .expect(
1010
1026
  respondJsonWith(400, (resp) => resp.error === "Invalid syncFrom")
@@ -1020,7 +1036,7 @@ describe("SQL injection protection", () => {
1020
1036
  .send({
1021
1037
  loadUntil: new Date().valueOf(),
1022
1038
  syncInfos: {
1023
- books: { maxLoadedId: 0, syncFrom: "0); SELECT pg_sleep(5)--" },
1039
+ books: { lastModifiedAt: 0, syncFrom: "0); SELECT pg_sleep(5)--" },
1024
1040
  },
1025
1041
  })
1026
1042
  .expect(
@@ -1038,7 +1054,7 @@ describe("SQL injection protection", () => {
1038
1054
  .set("Cookie", loginCookie)
1039
1055
  .send({
1040
1056
  loadUntil: "not-a-date",
1041
- syncInfos: { books: { maxLoadedId: 0 } },
1057
+ syncInfos: { books: { lastModifiedAt: 0 } },
1042
1058
  })
1043
1059
  .expect(
1044
1060
  respondJsonWith(400, (resp) => resp.error === "Invalid syncUntil")
@@ -1113,7 +1129,7 @@ describe("SQL injection protection", () => {
1113
1129
 
1114
1130
  // --- regression: valid requests still succeed ---
1115
1131
 
1116
- it("valid maxLoadedId integer still works", async () => {
1132
+ it("valid lastModifiedAt value still works", async () => {
1117
1133
  const app = await getApp({ disableCsrf: true });
1118
1134
  const loginCookie = await getAdminLoginCookie();
1119
1135
  const resp = await request(app)
@@ -1121,7 +1137,7 @@ describe("SQL injection protection", () => {
1121
1137
  .set("Cookie", loginCookie)
1122
1138
  .send({
1123
1139
  loadUntil: new Date().valueOf(),
1124
- syncInfos: { books: { maxLoadedId: 0 } },
1140
+ syncInfos: { books: { lastModifiedAt: 0 } },
1125
1141
  });
1126
1142
  expect(resp.status).toBe(200);
1127
1143
  expect(resp._body.books).toBeDefined();
@@ -1135,7 +1151,7 @@ describe("SQL injection protection", () => {
1135
1151
  .set("Cookie", loginCookie)
1136
1152
  .send({
1137
1153
  loadUntil: new Date().valueOf(),
1138
- syncInfos: { books: { maxLoadedId: 0, syncFrom: 1000 } },
1154
+ syncInfos: { books: { lastModifiedAt: 0, syncFrom: 1000 } },
1139
1155
  });
1140
1156
  expect(resp.status).toBe(200);
1141
1157
  });
@@ -1322,7 +1338,7 @@ describe("deletes authorization with ownership_formula", () => {
1322
1338
  expect(resp.status).toBe(200);
1323
1339
  const deletes = resp._body.deletes?.sync_owned || [];
1324
1340
  expect(deletes.length).toBe(1);
1325
- expect(deletes[0].ref).toBe(itemId);
1341
+ expect(Number(deletes[0].ref)).toBe(itemId);
1326
1342
  });
1327
1343
 
1328
1344
  it("direct formula: non-owner does not see deleted rows", async () => {
@@ -1373,7 +1389,7 @@ describe("deletes authorization with ownership_formula", () => {
1373
1389
  expect(resp.status).toBe(200);
1374
1390
  const deletes = resp._body.deletes?.sync_child || [];
1375
1391
  expect(deletes.length).toBe(1);
1376
- expect(deletes[0].ref).toBe(childId);
1392
+ expect(Number(deletes[0].ref)).toBe(childId);
1377
1393
  });
1378
1394
 
1379
1395
  it("join formula: non-owner does not see deleted child rows", async () => {
@@ -1613,7 +1629,7 @@ describe("load_changes authorization with ownership_formula", () => {
1613
1629
  .send({
1614
1630
  loadUntil: loadUntil.valueOf(),
1615
1631
  syncInfos: {
1616
- lc_owned: { maxLoadedId: 0 },
1632
+ lc_owned: { lastModifiedAt: 0 },
1617
1633
  },
1618
1634
  });
1619
1635
  expect(resp.status).toBe(200);
@@ -1635,7 +1651,7 @@ describe("load_changes authorization with ownership_formula", () => {
1635
1651
  .send({
1636
1652
  loadUntil: loadUntil.valueOf(),
1637
1653
  syncInfos: {
1638
- lc_owned: { maxLoadedId: 0 },
1654
+ lc_owned: { lastModifiedAt: 0 },
1639
1655
  },
1640
1656
  });
1641
1657
  expect(resp.status).toBe(200);
@@ -1661,7 +1677,7 @@ describe("load_changes authorization with ownership_formula", () => {
1661
1677
  .send({
1662
1678
  loadUntil: loadUntil.valueOf(),
1663
1679
  syncInfos: {
1664
- lc_child: { maxLoadedId: 0 },
1680
+ lc_child: { lastModifiedAt: 0 },
1665
1681
  },
1666
1682
  });
1667
1683
  expect(resp.status).toBe(200);
@@ -1687,7 +1703,7 @@ describe("load_changes authorization with ownership_formula", () => {
1687
1703
  .send({
1688
1704
  loadUntil: loadUntil.valueOf(),
1689
1705
  syncInfos: {
1690
- lc_child: { maxLoadedId: 0 },
1706
+ lc_child: { lastModifiedAt: 0 },
1691
1707
  },
1692
1708
  });
1693
1709
  expect(resp.status).toBe(200);
@@ -1712,7 +1728,7 @@ describe("load_changes authorization with ownership_formula", () => {
1712
1728
  .send({
1713
1729
  loadUntil: loadUntil.valueOf(),
1714
1730
  syncInfos: {
1715
- lc_owned: { maxLoadedId: 0, syncFrom: syncFrom.valueOf() },
1731
+ lc_owned: { lastModifiedAt: 0, syncFrom: syncFrom.valueOf() },
1716
1732
  },
1717
1733
  });
1718
1734
  expect(resp.status).toBe(200);
@@ -1737,7 +1753,7 @@ describe("load_changes authorization with ownership_formula", () => {
1737
1753
  .send({
1738
1754
  loadUntil: loadUntil.valueOf(),
1739
1755
  syncInfos: {
1740
- lc_owned: { maxLoadedId: 0, syncFrom: syncFrom.valueOf() },
1756
+ lc_owned: { lastModifiedAt: 0, syncFrom: syncFrom.valueOf() },
1741
1757
  },
1742
1758
  });
1743
1759
  expect(resp.status).toBe(200);