@saltcorn/data 0.6.1 → 0.6.2-beta.3
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.
- package/dist/base-plugin/actions.d.ts +141 -0
- package/dist/base-plugin/actions.d.ts.map +1 -0
- package/dist/base-plugin/actions.js +551 -0
- package/dist/base-plugin/actions.js.map +1 -0
- package/dist/base-plugin/base.test.d.ts +2 -0
- package/dist/base-plugin/base.test.d.ts.map +1 -0
- package/dist/base-plugin/base.test.js +15 -0
- package/dist/base-plugin/base.test.js.map +1 -0
- package/dist/base-plugin/fieldviews.d.ts +25 -0
- package/dist/base-plugin/fieldviews.d.ts.map +1 -0
- package/dist/base-plugin/fieldviews.js +159 -0
- package/dist/base-plugin/fieldviews.js.map +1 -0
- package/dist/base-plugin/fileviews.d.ts +52 -0
- package/dist/base-plugin/fileviews.d.ts.map +1 -0
- package/dist/base-plugin/fileviews.js +59 -0
- package/dist/base-plugin/fileviews.js.map +1 -0
- package/dist/base-plugin/index.d.ts +524 -0
- package/dist/base-plugin/index.d.ts.map +1 -0
- package/{base-plugin → dist/base-plugin}/index.js +22 -24
- package/dist/base-plugin/index.js.map +1 -0
- package/dist/base-plugin/types.d.ts +383 -0
- package/dist/base-plugin/types.d.ts.map +1 -0
- package/dist/base-plugin/types.js +1080 -0
- package/dist/base-plugin/types.js.map +1 -0
- package/dist/base-plugin/viewtemplates/edit.d.ts +116 -0
- package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/edit.js +561 -0
- package/dist/base-plugin/viewtemplates/edit.js.map +1 -0
- package/dist/base-plugin/viewtemplates/feed.d.ts +73 -0
- package/dist/base-plugin/viewtemplates/feed.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/feed.js +348 -0
- package/dist/base-plugin/viewtemplates/feed.js.map +1 -0
- package/dist/base-plugin/viewtemplates/filter.d.ts +46 -0
- package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/filter.js +267 -0
- package/dist/base-plugin/viewtemplates/filter.js.map +1 -0
- package/dist/base-plugin/viewtemplates/list.d.ts +99 -0
- package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/list.js +471 -0
- package/dist/base-plugin/viewtemplates/list.js.map +1 -0
- package/dist/base-plugin/viewtemplates/listshowlist.d.ts +41 -0
- package/dist/base-plugin/viewtemplates/listshowlist.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/listshowlist.js +248 -0
- package/dist/base-plugin/viewtemplates/listshowlist.js.map +1 -0
- package/dist/base-plugin/viewtemplates/room.d.ts +140 -0
- package/dist/base-plugin/viewtemplates/room.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/room.js +469 -0
- package/dist/base-plugin/viewtemplates/room.js.map +1 -0
- package/dist/base-plugin/viewtemplates/show.d.ts +101 -0
- package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/show.js +562 -0
- package/dist/base-plugin/viewtemplates/show.js.map +1 -0
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +108 -0
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -0
- package/dist/base-plugin/viewtemplates/viewable_fields.js +563 -0
- package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -0
- package/dist/contracts.d.ts +49 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +212 -0
- package/dist/contracts.js.map +1 -0
- package/dist/coverage/lcov-report/block-navigation.d.ts +2 -0
- package/dist/coverage/lcov-report/block-navigation.d.ts.map +1 -0
- package/dist/coverage/lcov-report/block-navigation.js +66 -0
- package/dist/coverage/lcov-report/block-navigation.js.map +1 -0
- package/dist/coverage/lcov-report/prettify.d.ts +1 -0
- package/dist/coverage/lcov-report/prettify.d.ts.map +1 -0
- package/dist/coverage/lcov-report/prettify.js +478 -0
- package/dist/coverage/lcov-report/prettify.js.map +1 -0
- package/dist/coverage/lcov-report/sorter.d.ts +2 -0
- package/dist/coverage/lcov-report/sorter.d.ts.map +1 -0
- package/dist/coverage/lcov-report/sorter.js +141 -0
- package/dist/coverage/lcov-report/sorter.js.map +1 -0
- package/dist/db/connect.d.ts +40 -0
- package/dist/db/connect.d.ts.map +1 -0
- package/dist/db/connect.js +150 -0
- package/dist/db/connect.js.map +1 -0
- package/dist/db/db.test.d.ts +2 -0
- package/dist/db/db.test.d.ts.map +1 -0
- package/dist/db/db.test.js +28 -0
- package/dist/db/db.test.js.map +1 -0
- package/dist/db/fixtures.d.ts +8 -0
- package/dist/db/fixtures.d.ts.map +1 -0
- package/dist/db/fixtures.js +300 -0
- package/dist/db/fixtures.js.map +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +41 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/reset_schema.d.ts +13 -0
- package/dist/db/reset_schema.d.ts.map +1 -0
- package/{db → dist/db}/reset_schema.js +45 -55
- package/dist/db/reset_schema.js.map +1 -0
- package/dist/db/state.d.ts +56 -0
- package/dist/db/state.d.ts.map +1 -0
- package/dist/db/state.js +608 -0
- package/dist/db/state.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/{index.js → dist/index.js} +2 -1
- package/dist/index.js.map +1 -0
- package/dist/migrate.d.ts +12 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +94 -0
- package/dist/migrate.js.map +1 -0
- package/dist/migrations/202005141503.d.ts +2 -0
- package/dist/migrations/202005141503.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202005141503.js +2 -1
- package/dist/migrations/202005141503.js.map +1 -0
- package/dist/migrations/202005241712.d.ts +2 -0
- package/dist/migrations/202005241712.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202005241712.js +2 -1
- package/dist/migrations/202005241712.js.map +1 -0
- package/dist/migrations/202005251037.d.ts +2 -0
- package/dist/migrations/202005251037.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202005251037.js +2 -1
- package/dist/migrations/202005251037.js.map +1 -0
- package/dist/migrations/202005282134.d.ts +2 -0
- package/dist/migrations/202005282134.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202005282134.js +2 -1
- package/dist/migrations/202005282134.js.map +1 -0
- package/dist/migrations/202006022156.d.ts +2 -0
- package/dist/migrations/202006022156.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202006022156.js +2 -1
- package/dist/migrations/202006022156.js.map +1 -0
- package/dist/migrations/202006051507.d.ts +2 -0
- package/dist/migrations/202006051507.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202006051507.js +2 -1
- package/dist/migrations/202006051507.js.map +1 -0
- package/dist/migrations/202006240906.d.ts +2 -0
- package/dist/migrations/202006240906.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202006240906.js +2 -1
- package/dist/migrations/202006240906.js.map +1 -0
- package/dist/migrations/202007091707.d.ts +2 -0
- package/dist/migrations/202007091707.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202007091707.js +2 -1
- package/dist/migrations/202007091707.js.map +1 -0
- package/dist/migrations/202007202144.d.ts +2 -0
- package/dist/migrations/202007202144.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202007202144.js +2 -1
- package/dist/migrations/202007202144.js.map +1 -0
- package/dist/migrations/202008031500.d.ts +2 -0
- package/dist/migrations/202008031500.d.ts.map +1 -0
- package/dist/migrations/202008031500.js +4 -0
- package/dist/migrations/202008031500.js.map +1 -0
- package/dist/migrations/202008051415.d.ts +2 -0
- package/dist/migrations/202008051415.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202008051415.js +2 -1
- package/dist/migrations/202008051415.js.map +1 -0
- package/dist/migrations/202008121149.d.ts +3 -0
- package/dist/migrations/202008121149.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202008121149.js +2 -2
- package/dist/migrations/202008121149.js.map +1 -0
- package/dist/migrations/202009112140.d.ts +3 -0
- package/dist/migrations/202009112140.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202009112140.js +2 -2
- package/dist/migrations/202009112140.js.map +1 -0
- package/dist/migrations/202009181655.d.ts +2 -0
- package/dist/migrations/202009181655.d.ts.map +1 -0
- package/dist/migrations/202009181655.js +7 -0
- package/dist/migrations/202009181655.js.map +1 -0
- package/dist/migrations/202009221105.d.ts +2 -0
- package/dist/migrations/202009221105.d.ts.map +1 -0
- package/dist/migrations/202009221105.js +4 -0
- package/dist/migrations/202009221105.js.map +1 -0
- package/dist/migrations/202009231331.d.ts +2 -0
- package/dist/migrations/202009231331.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202009231331.js +2 -1
- package/dist/migrations/202009231331.js.map +1 -0
- package/dist/migrations/202009301531.d.ts +2 -0
- package/dist/migrations/202009301531.d.ts.map +1 -0
- package/dist/migrations/202009301531.js +8 -0
- package/dist/migrations/202009301531.js.map +1 -0
- package/dist/migrations/202010231444.d.ts +2 -0
- package/dist/migrations/202010231444.d.ts.map +1 -0
- package/dist/migrations/202010231444.js +4 -0
- package/dist/migrations/202010231444.js.map +1 -0
- package/dist/migrations/202010251412.d.ts +2 -0
- package/dist/migrations/202010251412.d.ts.map +1 -0
- package/dist/migrations/202010251412.js +10 -0
- package/dist/migrations/202010251412.js.map +1 -0
- package/dist/migrations/202011021749.d.ts +2 -0
- package/dist/migrations/202011021749.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202011021749.js +2 -1
- package/dist/migrations/202011021749.js.map +1 -0
- package/dist/migrations/202011051353.d.ts +2 -0
- package/dist/migrations/202011051353.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202011051353.js +2 -1
- package/dist/migrations/202011051353.js.map +1 -0
- package/dist/migrations/202011111127.d.ts +2 -0
- package/dist/migrations/202011111127.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202011111127.js +2 -1
- package/dist/migrations/202011111127.js.map +1 -0
- package/dist/migrations/202012011203.d.ts +2 -0
- package/dist/migrations/202012011203.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202012011203.js +2 -1
- package/dist/migrations/202012011203.js.map +1 -0
- package/dist/migrations/202012100841.d.ts +2 -0
- package/dist/migrations/202012100841.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202012100841.js +2 -1
- package/dist/migrations/202012100841.js.map +1 -0
- package/dist/migrations/202012281835.d.ts +2 -0
- package/dist/migrations/202012281835.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202012281835.js +2 -1
- package/dist/migrations/202012281835.js.map +1 -0
- package/dist/migrations/202101061051.d.ts +2 -0
- package/dist/migrations/202101061051.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202101061051.js +2 -1
- package/dist/migrations/202101061051.js.map +1 -0
- package/dist/migrations/202101141128.d.ts +2 -0
- package/dist/migrations/202101141128.d.ts.map +1 -0
- package/dist/migrations/202101141128.js +4 -0
- package/dist/migrations/202101141128.js.map +1 -0
- package/dist/migrations/202102091312.d.ts +3 -0
- package/dist/migrations/202102091312.d.ts.map +1 -0
- package/dist/migrations/202102091312.js +19 -0
- package/dist/migrations/202102091312.js.map +1 -0
- package/dist/migrations/202102101624.d.ts +2 -0
- package/dist/migrations/202102101624.d.ts.map +1 -0
- package/dist/migrations/202102101624.js +7 -0
- package/dist/migrations/202102101624.js.map +1 -0
- package/dist/migrations/202102172148.d.ts +2 -0
- package/dist/migrations/202102172148.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202102172148.js +2 -2
- package/dist/migrations/202102172148.js.map +1 -0
- package/dist/migrations/202102261650.d.ts +2 -0
- package/dist/migrations/202102261650.d.ts.map +1 -0
- package/dist/migrations/202102261650.js +7 -0
- package/dist/migrations/202102261650.js.map +1 -0
- package/dist/migrations/202106102347.d.ts +2 -0
- package/dist/migrations/202106102347.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202106102347.js +2 -3
- package/dist/migrations/202106102347.js.map +1 -0
- package/dist/migrations/202106112120.d.ts +2 -0
- package/dist/migrations/202106112120.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202106112120.js +2 -3
- package/dist/migrations/202106112120.js.map +1 -0
- package/dist/migrations/202106120012.d.ts +2 -0
- package/dist/migrations/202106120012.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202106120012.js +2 -3
- package/dist/migrations/202106120012.js.map +1 -0
- package/dist/migrations/202106120220.d.ts +2 -0
- package/dist/migrations/202106120220.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202106120220.js +2 -4
- package/dist/migrations/202106120220.js.map +1 -0
- package/dist/migrations/202106121701.d.ts +2 -0
- package/dist/migrations/202106121701.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202106121701.js +2 -3
- package/dist/migrations/202106121701.js.map +1 -0
- package/dist/migrations/202106121703.d.ts +3 -0
- package/dist/migrations/202106121703.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202106121703.js +2 -3
- package/dist/migrations/202106121703.js.map +1 -0
- package/dist/migrations/202106251126.d.ts +2 -0
- package/dist/migrations/202106251126.d.ts.map +1 -0
- package/dist/migrations/202106251126.js +6 -0
- package/dist/migrations/202106251126.js.map +1 -0
- package/dist/migrations/202107281619.d.ts +2 -0
- package/dist/migrations/202107281619.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202107281619.js +2 -1
- package/dist/migrations/202107281619.js.map +1 -0
- package/dist/migrations/202107302158.d.ts +3 -0
- package/dist/migrations/202107302158.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202107302158.js +2 -3
- package/dist/migrations/202107302158.js.map +1 -0
- package/dist/migrations/202108022257.d.ts +2 -0
- package/dist/migrations/202108022257.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202108022257.js +3 -4
- package/dist/migrations/202108022257.js.map +1 -0
- package/dist/migrations/202109201624.d.ts +2 -0
- package/dist/migrations/202109201624.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202109201624.js +2 -1
- package/dist/migrations/202109201624.js.map +1 -0
- package/dist/migrations/202109301031.d.ts +3 -0
- package/dist/migrations/202109301031.d.ts.map +1 -0
- package/{migrations → dist/migrations}/202109301031.js +2 -2
- package/dist/migrations/202109301031.js.map +1 -0
- package/dist/migrations/202111290253.d.ts +3 -0
- package/dist/migrations/202111290253.d.ts.map +1 -0
- package/dist/migrations/202111290253.js +5 -0
- package/dist/migrations/202111290253.js.map +1 -0
- package/dist/models/backup.d.ts +22 -0
- package/dist/models/backup.d.ts.map +1 -0
- package/{models → dist/models}/backup.js +95 -192
- package/dist/models/backup.js.map +1 -0
- package/dist/models/config.d.ts +180 -0
- package/dist/models/config.d.ts.map +1 -0
- package/dist/models/config.js +758 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/crash.d.ts +74 -0
- package/dist/models/crash.d.ts.map +1 -0
- package/dist/models/crash.js +118 -0
- package/dist/models/crash.js.map +1 -0
- package/dist/models/discovery.d.ts +28 -0
- package/dist/models/discovery.d.ts.map +1 -0
- package/dist/models/discovery.js +163 -0
- package/dist/models/discovery.js.map +1 -0
- package/dist/models/email.d.ts +16 -0
- package/dist/models/email.d.ts.map +1 -0
- package/dist/models/email.js +90 -0
- package/dist/models/email.js.map +1 -0
- package/dist/models/eventlog.d.ts +77 -0
- package/dist/models/eventlog.d.ts.map +1 -0
- package/dist/models/eventlog.js +132 -0
- package/dist/models/eventlog.js.map +1 -0
- package/dist/models/expression.d.ts +54 -0
- package/dist/models/expression.d.ts.map +1 -0
- package/dist/models/expression.js +274 -0
- package/dist/models/expression.js.map +1 -0
- package/dist/models/field.d.ts +217 -0
- package/dist/models/field.d.ts.map +1 -0
- package/dist/models/field.js +619 -0
- package/dist/models/field.js.map +1 -0
- package/dist/models/fieldrepeat.d.ts +49 -0
- package/dist/models/fieldrepeat.d.ts.map +1 -0
- package/dist/models/fieldrepeat.js +88 -0
- package/dist/models/fieldrepeat.js.map +1 -0
- package/dist/models/file.d.ts +122 -0
- package/dist/models/file.d.ts.map +1 -0
- package/dist/models/file.js +224 -0
- package/dist/models/file.js.map +1 -0
- package/dist/models/form.d.ts +82 -0
- package/dist/models/form.d.ts.map +1 -0
- package/dist/models/form.js +163 -0
- package/dist/models/form.js.map +1 -0
- package/dist/models/index.d.ts +1 -0
- package/dist/models/index.d.ts.map +1 -0
- package/{models → dist/models}/index.js +42 -42
- package/dist/models/index.js.map +1 -0
- package/dist/models/layout.d.ts +34 -0
- package/dist/models/layout.d.ts.map +1 -0
- package/dist/models/layout.js +153 -0
- package/dist/models/layout.js.map +1 -0
- package/dist/models/library.d.ts +50 -0
- package/dist/models/library.d.ts.map +1 -0
- package/dist/models/library.js +129 -0
- package/dist/models/library.js.map +1 -0
- package/dist/models/pack.d.ts +89 -0
- package/dist/models/pack.d.ts.map +1 -0
- package/dist/models/pack.js +390 -0
- package/dist/models/pack.js.map +1 -0
- package/dist/models/page.d.ts +101 -0
- package/dist/models/page.d.ts.map +1 -0
- package/dist/models/page.js +223 -0
- package/dist/models/page.js.map +1 -0
- package/dist/models/plugin.d.ts +100 -0
- package/dist/models/plugin.d.ts.map +1 -0
- package/dist/models/plugin.js +204 -0
- package/dist/models/plugin.js.map +1 -0
- package/dist/models/random.d.ts +24 -0
- package/dist/models/random.d.ts.map +1 -0
- package/dist/models/random.js +186 -0
- package/dist/models/random.js.map +1 -0
- package/dist/models/role.d.ts +42 -0
- package/dist/models/role.d.ts.map +1 -0
- package/dist/models/role.js +64 -0
- package/dist/models/role.js.map +1 -0
- package/dist/models/scheduler.d.ts +18 -0
- package/dist/models/scheduler.d.ts.map +1 -0
- package/dist/models/scheduler.js +159 -0
- package/dist/models/scheduler.js.map +1 -0
- package/dist/models/table.d.ts +326 -0
- package/dist/models/table.d.ts.map +1 -0
- package/dist/models/table.js +1006 -0
- package/dist/models/table.js.map +1 -0
- package/dist/models/table_constraints.d.ts +69 -0
- package/dist/models/table_constraints.d.ts.map +1 -0
- package/dist/models/table_constraints.js +118 -0
- package/dist/models/table_constraints.js.map +1 -0
- package/dist/models/tenant.d.ts +55 -0
- package/dist/models/tenant.d.ts.map +1 -0
- package/{models → dist/models}/tenant.js +40 -63
- package/dist/models/tenant.js.map +1 -0
- package/dist/models/trigger.d.ts +133 -0
- package/dist/models/trigger.d.ts.map +1 -0
- package/dist/models/trigger.js +292 -0
- package/dist/models/trigger.js.map +1 -0
- package/dist/models/user.d.ts +235 -0
- package/dist/models/user.d.ts.map +1 -0
- package/dist/models/user.js +434 -0
- package/dist/models/user.js.map +1 -0
- package/dist/models/view.d.ts +204 -0
- package/dist/models/view.d.ts.map +1 -0
- package/dist/models/view.js +497 -0
- package/dist/models/view.js.map +1 -0
- package/dist/models/workflow.d.ts +48 -0
- package/dist/models/workflow.d.ts.map +1 -0
- package/dist/models/workflow.js +190 -0
- package/dist/models/workflow.js.map +1 -0
- package/dist/plugin-helper.d.ts +145 -0
- package/dist/plugin-helper.d.ts.map +1 -0
- package/dist/plugin-helper.js +1158 -0
- package/dist/plugin-helper.js.map +1 -0
- package/dist/plugin-testing.d.ts +3 -0
- package/dist/plugin-testing.d.ts.map +1 -0
- package/dist/plugin-testing.js +120 -0
- package/dist/plugin-testing.js.map +1 -0
- package/dist/tests/actions.test.d.ts +2 -0
- package/dist/tests/actions.test.d.ts.map +1 -0
- package/dist/tests/actions.test.js +205 -0
- package/dist/tests/actions.test.js.map +1 -0
- package/dist/tests/auxtest.test.d.ts +2 -0
- package/dist/tests/auxtest.test.d.ts.map +1 -0
- package/dist/tests/auxtest.test.js +48 -0
- package/dist/tests/auxtest.test.js.map +1 -0
- package/dist/tests/backup.test.d.ts +2 -0
- package/dist/tests/backup.test.d.ts.map +1 -0
- package/dist/tests/backup.test.js +88 -0
- package/dist/tests/backup.test.js.map +1 -0
- package/dist/tests/calc.test.d.ts +2 -0
- package/dist/tests/calc.test.d.ts.map +1 -0
- package/dist/tests/calc.test.js +231 -0
- package/dist/tests/calc.test.js.map +1 -0
- package/dist/tests/config.test.d.ts +2 -0
- package/dist/tests/config.test.d.ts.map +1 -0
- package/dist/tests/config.test.js +83 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/discover.test.d.ts +2 -0
- package/dist/tests/discover.test.d.ts.map +1 -0
- package/dist/tests/discover.test.js +106 -0
- package/dist/tests/discover.test.js.map +1 -0
- package/dist/tests/exact_views.test.d.ts +2 -0
- package/dist/tests/exact_views.test.d.ts.map +1 -0
- package/dist/tests/exact_views.test.js +511 -0
- package/dist/tests/exact_views.test.js.map +1 -0
- package/dist/tests/field.test.d.ts +2 -0
- package/dist/tests/field.test.d.ts.map +1 -0
- package/dist/tests/field.test.js +237 -0
- package/dist/tests/field.test.js.map +1 -0
- package/dist/tests/form.test.d.ts +2 -0
- package/dist/tests/form.test.d.ts.map +1 -0
- package/dist/tests/form.test.js +191 -0
- package/dist/tests/form.test.js.map +1 -0
- package/dist/tests/mocks.d.ts +111 -0
- package/dist/tests/mocks.d.ts.map +1 -0
- package/dist/tests/mocks.js +165 -0
- package/dist/tests/mocks.js.map +1 -0
- package/dist/tests/models.test.d.ts +2 -0
- package/dist/tests/models.test.d.ts.map +1 -0
- package/dist/tests/models.test.js +210 -0
- package/dist/tests/models.test.js.map +1 -0
- package/dist/tests/pack.test.d.ts +2 -0
- package/dist/tests/pack.test.d.ts.map +1 -0
- package/dist/tests/pack.test.js +331 -0
- package/dist/tests/pack.test.js.map +1 -0
- package/dist/tests/plugin.test.d.ts +2 -0
- package/dist/tests/plugin.test.d.ts.map +1 -0
- package/dist/tests/plugin.test.js +53 -0
- package/dist/tests/plugin.test.js.map +1 -0
- package/dist/tests/random.test.d.ts +2 -0
- package/dist/tests/random.test.d.ts.map +1 -0
- package/dist/tests/random.test.js +138 -0
- package/dist/tests/random.test.js.map +1 -0
- package/dist/tests/table.test.d.ts +2 -0
- package/dist/tests/table.test.d.ts.map +1 -0
- package/dist/tests/table.test.js +1048 -0
- package/dist/tests/table.test.js.map +1 -0
- package/dist/tests/tenant.test.d.ts +2 -0
- package/dist/tests/tenant.test.d.ts.map +1 -0
- package/dist/tests/tenant.test.js +45 -0
- package/dist/tests/tenant.test.js.map +1 -0
- package/dist/tests/user.test.d.ts +2 -0
- package/dist/tests/user.test.d.ts.map +1 -0
- package/dist/tests/user.test.js +190 -0
- package/dist/tests/user.test.js.map +1 -0
- package/dist/tests/view.test.d.ts +2 -0
- package/dist/tests/view.test.d.ts.map +1 -0
- package/dist/tests/view.test.js +238 -0
- package/dist/tests/view.test.js.map +1 -0
- package/dist/tests/workflow.test.d.ts +2 -0
- package/dist/tests/workflow.test.d.ts.map +1 -0
- package/dist/tests/workflow.test.js +115 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/dist/tsconfig.ref.tsbuildinfo +1 -0
- package/dist/utils.d.ts +26 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +124 -0
- package/dist/utils.js.map +1 -0
- package/package.json +37 -8
- package/base-plugin/actions.js +0 -629
- package/base-plugin/base.test.js +0 -15
- package/base-plugin/fieldviews.js +0 -192
- package/base-plugin/fileviews.js +0 -65
- package/base-plugin/types.js +0 -1025
- package/base-plugin/viewtemplates/edit.js +0 -665
- package/base-plugin/viewtemplates/feed.js +0 -434
- package/base-plugin/viewtemplates/filter.js +0 -311
- package/base-plugin/viewtemplates/list.js +0 -575
- package/base-plugin/viewtemplates/listshowlist.js +0 -292
- package/base-plugin/viewtemplates/room.js +0 -650
- package/base-plugin/viewtemplates/show.js +0 -689
- package/base-plugin/viewtemplates/viewable_fields.js +0 -714
- package/contracts.js +0 -311
- package/db/connect.js +0 -151
- package/db/db.test.js +0 -33
- package/db/fixtures.js +0 -303
- package/db/index.js +0 -60
- package/db/state.js +0 -674
- package/migrate.js +0 -99
- package/migrations/202008031500.js +0 -4
- package/migrations/202009181655.js +0 -6
- package/migrations/202009221105.js +0 -4
- package/migrations/202009301531.js +0 -7
- package/migrations/202010231444.js +0 -4
- package/migrations/202010251412.js +0 -9
- package/migrations/202101141128.js +0 -4
- package/migrations/202102091312.js +0 -19
- package/migrations/202102101624.js +0 -5
- package/migrations/202102261650.js +0 -6
- package/migrations/202106251126.js +0 -5
- package/models/config.js +0 -680
- package/models/crash.js +0 -126
- package/models/discovery.js +0 -195
- package/models/email.js +0 -92
- package/models/eventlog.js +0 -146
- package/models/expression.js +0 -264
- package/models/field.js +0 -740
- package/models/fieldrepeat.js +0 -96
- package/models/file.js +0 -234
- package/models/form.js +0 -168
- package/models/layout.js +0 -146
- package/models/library.js +0 -135
- package/models/pack.js +0 -466
- package/models/page.js +0 -255
- package/models/plugin.js +0 -219
- package/models/random.js +0 -206
- package/models/role.js +0 -94
- package/models/scheduler.js +0 -163
- package/models/table.js +0 -1211
- package/models/table_constraints.js +0 -133
- package/models/trigger.js +0 -327
- package/models/user.js +0 -503
- package/models/view.js +0 -622
- package/models/workflow.js +0 -205
- package/plugin-helper.js +0 -1291
- package/plugin-testing.js +0 -124
- package/tests/actions.test.js +0 -232
- package/tests/auxtest.test.js +0 -52
- package/tests/backup.test.js +0 -92
- package/tests/calc.test.js +0 -221
- package/tests/config.test.js +0 -91
- package/tests/discover.test.js +0 -114
- package/tests/exact_views.test.js +0 -526
- package/tests/field.test.js +0 -253
- package/tests/form.test.js +0 -198
- package/tests/mocks.js +0 -173
- package/tests/models.test.js +0 -221
- package/tests/pack.test.js +0 -350
- package/tests/plugin.test.js +0 -59
- package/tests/random.test.js +0 -154
- package/tests/table.test.js +0 -1091
- package/tests/tenant.test.js +0 -56
- package/tests/user.test.js +0 -196
- package/tests/view.test.js +0 -251
- package/tests/workflow.test.js +0 -119
- package/utils.js +0 -137
|
@@ -0,0 +1,1048 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const Table = require("../models/table");
|
|
3
|
+
const TableConstraint = require("../models/table_constraints");
|
|
4
|
+
const Field = require("../models/field");
|
|
5
|
+
const View = require("../models/view");
|
|
6
|
+
const db = require("../db");
|
|
7
|
+
const { getState } = require("../db/state");
|
|
8
|
+
getState().registerPlugin("base", require("../base-plugin"));
|
|
9
|
+
const fs = require("fs").promises;
|
|
10
|
+
const { rick_file, plugin_with_routes, mockReqRes } = require("./mocks");
|
|
11
|
+
afterAll(db.close);
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
await require("../db/reset_schema")();
|
|
14
|
+
await require("../db/fixtures")();
|
|
15
|
+
});
|
|
16
|
+
jest.setTimeout(30000);
|
|
17
|
+
describe("TableIO", () => {
|
|
18
|
+
it("should store attributes", async () => {
|
|
19
|
+
const tc = await Table.create("mytesttable");
|
|
20
|
+
await Field.create({
|
|
21
|
+
table: tc,
|
|
22
|
+
name: "foo_height1",
|
|
23
|
+
label: "height1",
|
|
24
|
+
type: "Integer",
|
|
25
|
+
attributes: { max: 18 },
|
|
26
|
+
});
|
|
27
|
+
const fs = await db.selectOne("_sc_fields", { name: "foo_height1" });
|
|
28
|
+
expect(fs.table_id).toBe(tc.id);
|
|
29
|
+
expect(fs.table_id > 0).toBe(true);
|
|
30
|
+
expect(fs.id > 0).toBe(true);
|
|
31
|
+
const fields = await tc.getFields();
|
|
32
|
+
expect(fields[1].attributes).toStrictEqual({ max: 18 });
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("Table create", () => {
|
|
36
|
+
it("should create", async () => {
|
|
37
|
+
const tc = await Table.create("mytable1");
|
|
38
|
+
const tf = await Table.findOne({ id: tc.id });
|
|
39
|
+
expect(tf.external).toBe(false);
|
|
40
|
+
expect(tc.external).toBe(false);
|
|
41
|
+
expect(tf.name).toStrictEqual("mytable1");
|
|
42
|
+
expect(tf.sql_name).toStrictEqual(db.isSQLite ? '"mytable1"' : '"public"."mytable1"');
|
|
43
|
+
});
|
|
44
|
+
it("toggle bools", async () => {
|
|
45
|
+
const tc = await Table.create("mytable17");
|
|
46
|
+
await Field.create({
|
|
47
|
+
table: tc,
|
|
48
|
+
label: "Group",
|
|
49
|
+
type: "Bool",
|
|
50
|
+
required: true,
|
|
51
|
+
});
|
|
52
|
+
const tall_id = await tc.insertRow({ group: true });
|
|
53
|
+
await tc.toggleBool(tall_id, "group");
|
|
54
|
+
const row = await tc.getRow({ id: tall_id });
|
|
55
|
+
expect(row.group).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it("should create required field in empty table without default", async () => {
|
|
58
|
+
const mytable1 = await Table.findOne({ name: "mytable1" });
|
|
59
|
+
expect(!!mytable1).toBe(true);
|
|
60
|
+
await Field.create({
|
|
61
|
+
table: mytable1,
|
|
62
|
+
name: "height1",
|
|
63
|
+
label: "height1",
|
|
64
|
+
type: "Integer",
|
|
65
|
+
required: true,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it("should insert", async () => {
|
|
69
|
+
const mytable1 = await Table.findOne({ name: "mytable1" });
|
|
70
|
+
expect(mytable1.name).toBe("mytable1");
|
|
71
|
+
const id = await db.insert(mytable1.name, { height1: 6 });
|
|
72
|
+
expect(typeof id).toBe("number");
|
|
73
|
+
expect(id > 0).toBe(true);
|
|
74
|
+
const row = await db.selectOne(mytable1.name, { id });
|
|
75
|
+
expect(row.height1).toBe(6);
|
|
76
|
+
await db.update(mytable1.name, { height1: 7 }, id);
|
|
77
|
+
const rowup = await db.selectOne(mytable1.name, { id });
|
|
78
|
+
expect(rowup.height1).toBe(7);
|
|
79
|
+
});
|
|
80
|
+
it("should select one or zero", async () => {
|
|
81
|
+
const rows = await db.select("mytable1", {});
|
|
82
|
+
expect(rows.length).toBe(1);
|
|
83
|
+
const row = await db.selectMaybeOne("mytable1", { id: rows[0].id });
|
|
84
|
+
expect(row.height1).toBe(7);
|
|
85
|
+
const norow = await db.selectMaybeOne("mytable1", { id: 789 });
|
|
86
|
+
expect(norow).toBe(null);
|
|
87
|
+
await expect((async () => await db.selectOne("mytable1", { id: 789 }))()).rejects.toThrow(Error);
|
|
88
|
+
});
|
|
89
|
+
it("should get distinct values", async () => {
|
|
90
|
+
const table = await Table.findOne({ name: "mytable1" });
|
|
91
|
+
const vs = await table.distinctValues("height1");
|
|
92
|
+
expect(vs).toEqual([7]);
|
|
93
|
+
});
|
|
94
|
+
it("should delete", async () => {
|
|
95
|
+
const table = await Table.findOne({ name: "mytable1" });
|
|
96
|
+
await table.delete();
|
|
97
|
+
const table1 = await Table.find({ name: "mytable1" });
|
|
98
|
+
expect(table1.length).toBe(0);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("Table get data", () => {
|
|
102
|
+
it("should get rows", async () => {
|
|
103
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
104
|
+
const all = await patients.getRows();
|
|
105
|
+
expect(all.length).toStrictEqual(2);
|
|
106
|
+
});
|
|
107
|
+
it("should get rows where name is Michael", async () => {
|
|
108
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
109
|
+
const michaels = await patients.getRows({ name: "Michael Douglas" });
|
|
110
|
+
expect(michaels.length).toStrictEqual(1);
|
|
111
|
+
});
|
|
112
|
+
it("should get limited rows", async () => {
|
|
113
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
114
|
+
const michaels = await patients.getRows({ name: { ilike: "Douglas" } }, { limit: 1, orderBy: "id", offset: 1 });
|
|
115
|
+
expect(michaels.length).toStrictEqual(1);
|
|
116
|
+
expect(michaels[0].name).toStrictEqual("Michael Douglas");
|
|
117
|
+
});
|
|
118
|
+
it("should get joined rows where name is Michael", async () => {
|
|
119
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
120
|
+
const michaels = await patients.getJoinedRows({
|
|
121
|
+
where: { name: "Michael Douglas" },
|
|
122
|
+
});
|
|
123
|
+
expect(michaels.length).toStrictEqual(1);
|
|
124
|
+
expect(michaels[0].favbook).toBe(2);
|
|
125
|
+
});
|
|
126
|
+
it("should get rows in id range", async () => {
|
|
127
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
128
|
+
const rows = await patients.getRows({ id: [{ gt: 0 }, { lt: 10 }] });
|
|
129
|
+
expect(rows.length).toStrictEqual(2);
|
|
130
|
+
});
|
|
131
|
+
it("should get rows by subselect", async () => {
|
|
132
|
+
const books = await Table.findOne({ name: "books" });
|
|
133
|
+
const nrows = await books.countRows({
|
|
134
|
+
id: {
|
|
135
|
+
inSelect: {
|
|
136
|
+
table: "patients",
|
|
137
|
+
field: "favbook",
|
|
138
|
+
where: { author: "Leo Tolstoy" },
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
expect(nrows).toStrictEqual(1);
|
|
143
|
+
});
|
|
144
|
+
it("should get joined rows with limit and order", async () => {
|
|
145
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
146
|
+
const all = await patients.getJoinedRows({
|
|
147
|
+
limit: 2,
|
|
148
|
+
orderBy: "id",
|
|
149
|
+
});
|
|
150
|
+
expect(all.length).toStrictEqual(2);
|
|
151
|
+
expect(all[1].favbook).toBe(2);
|
|
152
|
+
});
|
|
153
|
+
it("should get joined rows with limit and desc order", async () => {
|
|
154
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
155
|
+
const all = await patients.getJoinedRows({
|
|
156
|
+
limit: 2,
|
|
157
|
+
orderBy: "id",
|
|
158
|
+
orderDesc: true,
|
|
159
|
+
});
|
|
160
|
+
expect(all.length).toStrictEqual(2);
|
|
161
|
+
expect(all[0].favbook).toBe(2);
|
|
162
|
+
});
|
|
163
|
+
it("should get joined rows with aggregations", async () => {
|
|
164
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
165
|
+
const michaels = await patients.getJoinedRows({
|
|
166
|
+
orderBy: "id",
|
|
167
|
+
aggregations: {
|
|
168
|
+
avg_temp: {
|
|
169
|
+
table: "readings",
|
|
170
|
+
ref: "patient_id",
|
|
171
|
+
field: "temperature",
|
|
172
|
+
aggregate: "avg",
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
expect(michaels.length).toStrictEqual(2);
|
|
177
|
+
expect(Math.round(michaels[0].avg_temp)).toBe(38);
|
|
178
|
+
});
|
|
179
|
+
it("should get joined rows with latest aggregations", async () => {
|
|
180
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
181
|
+
const michaels = await patients.getJoinedRows({
|
|
182
|
+
orderBy: "id",
|
|
183
|
+
aggregations: {
|
|
184
|
+
last_temp: {
|
|
185
|
+
table: "readings",
|
|
186
|
+
ref: "patient_id",
|
|
187
|
+
field: "temperature",
|
|
188
|
+
aggregate: "Latest date",
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
expect(michaels.length).toStrictEqual(2);
|
|
193
|
+
expect(Math.round(michaels[0].last_temp)).toBe(37);
|
|
194
|
+
});
|
|
195
|
+
it("should get double joined rows", async () => {
|
|
196
|
+
const readings = await Table.findOne({ name: "readings" });
|
|
197
|
+
const reads = await readings.getJoinedRows({
|
|
198
|
+
orderBy: "id",
|
|
199
|
+
joinFields: {
|
|
200
|
+
author: { ref: "patient_id", through: "favbook", target: "author" },
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
expect(reads.length).toStrictEqual(3);
|
|
204
|
+
expect(reads[0].author).toBe("Herman Melville");
|
|
205
|
+
});
|
|
206
|
+
it("should get joined rows with aggregations and joins", async () => {
|
|
207
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
208
|
+
const michaels = await patients.getJoinedRows({
|
|
209
|
+
orderBy: "id",
|
|
210
|
+
aggregations: {
|
|
211
|
+
avg_temp: {
|
|
212
|
+
table: "readings",
|
|
213
|
+
ref: "patient_id",
|
|
214
|
+
field: "temperature",
|
|
215
|
+
aggregate: "avg",
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
joinFields: {
|
|
219
|
+
pages: { ref: "favbook", target: "pages" },
|
|
220
|
+
author: { ref: "favbook", target: "author" },
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
expect(michaels.length).toStrictEqual(2);
|
|
224
|
+
expect(Math.round(michaels[0].avg_temp)).toBe(38);
|
|
225
|
+
expect(michaels[1].author).toBe("Leo Tolstoy");
|
|
226
|
+
});
|
|
227
|
+
it("should support full text search", async () => {
|
|
228
|
+
const table = await Table.findOne({ name: "patients" });
|
|
229
|
+
const fields = await table.getFields();
|
|
230
|
+
const rows = await db.select("patients", {
|
|
231
|
+
_fts: { fields, searchTerm: "Douglas" },
|
|
232
|
+
});
|
|
233
|
+
expect(rows.length).toBe(2);
|
|
234
|
+
});
|
|
235
|
+
it("should enable versioning", async () => {
|
|
236
|
+
const table = await Table.findOne({ name: "patients" });
|
|
237
|
+
table.versioned = true;
|
|
238
|
+
await table.update(table);
|
|
239
|
+
});
|
|
240
|
+
it("should save version on insert", async () => {
|
|
241
|
+
const table = await Table.findOne({ name: "patients" });
|
|
242
|
+
await table.insertRow({ name: "Bunny foo-foo", favbook: 1 });
|
|
243
|
+
const bunnyFooFoo = await table.getRow({ name: "Bunny foo-foo" });
|
|
244
|
+
const history1 = await table.get_history(bunnyFooFoo.id);
|
|
245
|
+
expect(history1.length).toBe(1);
|
|
246
|
+
expect(history1[0].id).toBe(bunnyFooFoo.id);
|
|
247
|
+
expect(history1[0]._version).toBe(1);
|
|
248
|
+
expect(history1[0].name).toBe("Bunny foo-foo");
|
|
249
|
+
});
|
|
250
|
+
it("should save version on update", async () => {
|
|
251
|
+
const table = await Table.findOne({ name: "patients" });
|
|
252
|
+
const bunnyFooFoo = await table.getRow({ name: "Bunny foo-foo" });
|
|
253
|
+
await table.updateRow({ name: "Goon" }, bunnyFooFoo.id);
|
|
254
|
+
const history2 = await table.get_history(bunnyFooFoo.id);
|
|
255
|
+
expect(history2.length).toBe(2);
|
|
256
|
+
expect(history2[0].id).toBe(bunnyFooFoo.id);
|
|
257
|
+
expect(history2[0]._version).toBe(1);
|
|
258
|
+
expect(history2[0].name).toBe("Bunny foo-foo");
|
|
259
|
+
expect(history2[0].favbook).toBe(1);
|
|
260
|
+
expect(history2[1].id).toBe(bunnyFooFoo.id);
|
|
261
|
+
expect(history2[1]._version).toBe(2);
|
|
262
|
+
expect(history2[1].name).toBe("Goon");
|
|
263
|
+
expect(history2[1].favbook).toBe(1);
|
|
264
|
+
const goon = await table.getRow({ id: bunnyFooFoo.id });
|
|
265
|
+
expect(goon.name).toBe("Goon");
|
|
266
|
+
expect(goon.favbook).toBe(1);
|
|
267
|
+
});
|
|
268
|
+
it("create field on version table", async () => {
|
|
269
|
+
const table = await Table.findOne({ name: "patients" });
|
|
270
|
+
const fc = await Field.create({
|
|
271
|
+
table: table,
|
|
272
|
+
name: "Height19",
|
|
273
|
+
label: "height19",
|
|
274
|
+
type: "Integer",
|
|
275
|
+
required: true,
|
|
276
|
+
attributes: { default: 6 },
|
|
277
|
+
});
|
|
278
|
+
await fc.delete();
|
|
279
|
+
});
|
|
280
|
+
it("should disable versioning", async () => {
|
|
281
|
+
const table = await Table.findOne({ name: "patients" });
|
|
282
|
+
await table.getFields();
|
|
283
|
+
await table.update({ versioned: false });
|
|
284
|
+
});
|
|
285
|
+
it("should rename", async () => {
|
|
286
|
+
const table = await Table.create("notsurename");
|
|
287
|
+
await Field.create({
|
|
288
|
+
table,
|
|
289
|
+
label: "tall",
|
|
290
|
+
type: "Bool",
|
|
291
|
+
required: true,
|
|
292
|
+
});
|
|
293
|
+
const table1 = await Table.create("refsunsure");
|
|
294
|
+
await Field.create({
|
|
295
|
+
table: table1,
|
|
296
|
+
label: "also_tall",
|
|
297
|
+
type: "Bool",
|
|
298
|
+
required: true,
|
|
299
|
+
});
|
|
300
|
+
await Field.create({
|
|
301
|
+
table: table1,
|
|
302
|
+
label: "theref",
|
|
303
|
+
type: "Key to notsurename",
|
|
304
|
+
required: true,
|
|
305
|
+
});
|
|
306
|
+
const id = await table.insertRow({ tall: false });
|
|
307
|
+
await table1.insertRow({ also_tall: true, theref: id });
|
|
308
|
+
const joinFields = { reftall: { ref: "theref", target: "tall" } };
|
|
309
|
+
const rows = await table1.getJoinedRows({ joinFields });
|
|
310
|
+
expect(rows[0].theref).toBe(id);
|
|
311
|
+
expect(!!rows[0].reftall).toBe(false); //for sqlite
|
|
312
|
+
if (!db.isSQLite) {
|
|
313
|
+
await table.rename("isthisbetter");
|
|
314
|
+
const table3 = await Table.findOne({ name: "refsunsure" });
|
|
315
|
+
const rows1 = await table3.getJoinedRows({ joinFields });
|
|
316
|
+
expect(rows1[0].theref).toBe(id);
|
|
317
|
+
expect(rows1[0].reftall).toBe(false);
|
|
318
|
+
const table2 = await Table.findOne({ name: "isthisbetter" });
|
|
319
|
+
expect(!!table2).toBe(true);
|
|
320
|
+
table2.versioned = true;
|
|
321
|
+
await table2.update(table2);
|
|
322
|
+
await table2.rename("thisisthebestname");
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
it("should get joined rows with arbitrary fieldnames", async () => {
|
|
326
|
+
const patients = await Table.findOne({ name: "patients" });
|
|
327
|
+
const michaels = await patients.getJoinedRows({
|
|
328
|
+
where: { name: "Michael Douglas" },
|
|
329
|
+
joinFields: {
|
|
330
|
+
pages: { ref: "favbook", target: "pages" },
|
|
331
|
+
author: { ref: "favbook", target: "author" },
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
expect(michaels.length).toStrictEqual(1);
|
|
335
|
+
expect(michaels[0].pages).toBe(728);
|
|
336
|
+
expect(michaels[0].author).toBe("Leo Tolstoy");
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
describe("relations", () => {
|
|
340
|
+
it("get parent relations", async () => {
|
|
341
|
+
const table = await Table.findOne({ name: "patients" });
|
|
342
|
+
const rels = await table.get_parent_relations();
|
|
343
|
+
expect(rels.parent_field_list).toContain("favbook.author");
|
|
344
|
+
expect(rels.parent_relations.length).toBe(2);
|
|
345
|
+
});
|
|
346
|
+
it("get parent relations", async () => {
|
|
347
|
+
const table = await Table.findOne({ name: "books" });
|
|
348
|
+
const rels = await table.get_child_relations();
|
|
349
|
+
expect(rels.child_field_list).toEqual([
|
|
350
|
+
"discusses_books.book",
|
|
351
|
+
"patients.favbook",
|
|
352
|
+
]);
|
|
353
|
+
expect(rels.child_relations.length).toBe(2);
|
|
354
|
+
});
|
|
355
|
+
it("get grandparent relations", async () => {
|
|
356
|
+
const table = await Table.findOne({ name: "readings" });
|
|
357
|
+
const rels = await table.get_parent_relations(true);
|
|
358
|
+
expect(rels.parent_field_list).toEqual([
|
|
359
|
+
"patient_id.favbook",
|
|
360
|
+
"patient_id.favbook.author",
|
|
361
|
+
"patient_id.favbook.id",
|
|
362
|
+
"patient_id.favbook.pages",
|
|
363
|
+
"patient_id.id",
|
|
364
|
+
"patient_id.name",
|
|
365
|
+
"patient_id.parent",
|
|
366
|
+
"patient_id.parent.favbook",
|
|
367
|
+
"patient_id.parent.id",
|
|
368
|
+
"patient_id.parent.name",
|
|
369
|
+
"patient_id.parent.parent",
|
|
370
|
+
]);
|
|
371
|
+
expect(rels.parent_relations.length).toBe(3);
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
describe("CSV import", () => {
|
|
375
|
+
it("should import into existing table", async () => {
|
|
376
|
+
const csv = `author,Pages
|
|
377
|
+
Joe Celko, 856
|
|
378
|
+
Gordon Kane, 217`;
|
|
379
|
+
const fnm = "/tmp/test1ok.csv";
|
|
380
|
+
await fs.writeFile(fnm, csv);
|
|
381
|
+
const table = await Table.findOne({ name: "books" });
|
|
382
|
+
expect(!!table).toBe(true);
|
|
383
|
+
const impres = await table.import_csv_file(fnm);
|
|
384
|
+
expect(impres).toEqual({ success: "Imported 2 rows into table books" });
|
|
385
|
+
const rows = await table.getRows({ author: "Gordon Kane" });
|
|
386
|
+
expect(rows.length).toBe(1);
|
|
387
|
+
expect(rows[0].pages).toBe(217);
|
|
388
|
+
});
|
|
389
|
+
it("fail on required field", async () => {
|
|
390
|
+
const csv = `author,Pagez
|
|
391
|
+
Joe Celko, 856
|
|
392
|
+
Gordon Kane, 217`;
|
|
393
|
+
const fnm = "/tmp/test1f.csv";
|
|
394
|
+
await fs.writeFile(fnm, csv);
|
|
395
|
+
const table = await Table.findOne({ name: "books" });
|
|
396
|
+
expect(!!table).toBe(true);
|
|
397
|
+
const impres = await table.import_csv_file(fnm);
|
|
398
|
+
expect(impres).toEqual({ error: "Required field missing: Pages" });
|
|
399
|
+
});
|
|
400
|
+
it("fail on strings in ints", async () => {
|
|
401
|
+
const csv = `author,Pages
|
|
402
|
+
Leonardo Boff, 99
|
|
403
|
+
David MacKay, ITILA`;
|
|
404
|
+
const fnm = "/tmp/test1.csv";
|
|
405
|
+
await fs.writeFile(fnm, csv);
|
|
406
|
+
const table = await Table.create("books_not_req_pages", {
|
|
407
|
+
min_role_read: 10,
|
|
408
|
+
});
|
|
409
|
+
await Field.create({
|
|
410
|
+
table,
|
|
411
|
+
name: "author",
|
|
412
|
+
label: "Author",
|
|
413
|
+
type: "String",
|
|
414
|
+
required: true,
|
|
415
|
+
});
|
|
416
|
+
await Field.create({
|
|
417
|
+
table,
|
|
418
|
+
name: "pages",
|
|
419
|
+
label: "Pages",
|
|
420
|
+
type: "Integer",
|
|
421
|
+
attributes: { min: 0 },
|
|
422
|
+
});
|
|
423
|
+
expect(!!table).toBe(true);
|
|
424
|
+
const impres = await table.import_csv_file(fnm);
|
|
425
|
+
expect(impres).toEqual({
|
|
426
|
+
success: "Imported 1 rows into table books_not_req_pages. Rejected 1 rows.",
|
|
427
|
+
});
|
|
428
|
+
const rows = await table.getRows({ author: "David MacKay" });
|
|
429
|
+
expect(rows.length).toBe(0);
|
|
430
|
+
});
|
|
431
|
+
it("should create by importing", async () => {
|
|
432
|
+
//db.set_sql_logging();
|
|
433
|
+
const csv = `item,cost,count, vatable
|
|
434
|
+
Book, 5,4, f
|
|
435
|
+
Pencil, 0.5,2, t`;
|
|
436
|
+
const fnm = "/tmp/test2impok.csv";
|
|
437
|
+
await fs.writeFile(fnm, csv);
|
|
438
|
+
const { table } = await Table.create_from_csv("Invoice", fnm);
|
|
439
|
+
const fields = await table.getFields();
|
|
440
|
+
const vatField = fields.find((f) => f.name === "vatable");
|
|
441
|
+
expect(vatField.type.name).toBe("Bool");
|
|
442
|
+
const costField = fields.find((f) => f.name === "cost");
|
|
443
|
+
expect(costField.type.name).toBe("Float");
|
|
444
|
+
const countField = fields.find((f) => f.name === "count");
|
|
445
|
+
expect(countField.type.name).toBe("Integer");
|
|
446
|
+
const rows = await table.getRows({ item: "Pencil" });
|
|
447
|
+
expect(rows.length).toBe(1);
|
|
448
|
+
expect(rows[0].vatable).toBe(true);
|
|
449
|
+
const allrows = await table.getRows();
|
|
450
|
+
expect(allrows.length).toBe(2);
|
|
451
|
+
});
|
|
452
|
+
it("should fail on bad col nm", async () => {
|
|
453
|
+
const csv = `item,cost,!, vatable
|
|
454
|
+
Book, 5,4, f
|
|
455
|
+
Pencil, 0.5,2, t`;
|
|
456
|
+
const fnm = "/tmp/test2.csv";
|
|
457
|
+
await fs.writeFile(fnm, csv);
|
|
458
|
+
const res = await Table.create_from_csv("Invoice1", fnm);
|
|
459
|
+
expect(res).toEqual({
|
|
460
|
+
error: "Invalid column name ! - Use A-Z, a-z, 0-9, _ only",
|
|
461
|
+
});
|
|
462
|
+
const table = await Table.findOne({ name: "Invoice1" });
|
|
463
|
+
expect(table).toBe(null);
|
|
464
|
+
});
|
|
465
|
+
it("ignores a col on duplicate col nm", async () => {
|
|
466
|
+
const csv = `item,cost,cost, vatable
|
|
467
|
+
Book, 5,4, f
|
|
468
|
+
Pencil, 0.5,2, t`;
|
|
469
|
+
const fnm = "/tmp/test2.csv";
|
|
470
|
+
await fs.writeFile(fnm, csv);
|
|
471
|
+
const res = await Table.create_from_csv("Invoice1", fnm);
|
|
472
|
+
expect(res.table.fields.length).toEqual(4); //and id
|
|
473
|
+
});
|
|
474
|
+
it("should fail non-int id", async () => {
|
|
475
|
+
const csv = `id,cost,!, vatable
|
|
476
|
+
Book, 5,4, f
|
|
477
|
+
Pencil, 0.5,2, t`;
|
|
478
|
+
const fnm = "/tmp/test2.csv";
|
|
479
|
+
await fs.writeFile(fnm, csv);
|
|
480
|
+
const res = await Table.create_from_csv("Invoice2", fnm);
|
|
481
|
+
expect(res).toEqual({
|
|
482
|
+
error: `Columns named "id" must have only integers`,
|
|
483
|
+
});
|
|
484
|
+
const table = await Table.findOne({ name: "Invoice2" });
|
|
485
|
+
expect(table).toBe(null);
|
|
486
|
+
});
|
|
487
|
+
it("should fail missing id", async () => {
|
|
488
|
+
const csv = `id,cost,!, vatable
|
|
489
|
+
1, 5,4, f
|
|
490
|
+
, 0.5,2, t`;
|
|
491
|
+
const fnm = "/tmp/test2.csv";
|
|
492
|
+
await fs.writeFile(fnm, csv);
|
|
493
|
+
const res = await Table.create_from_csv("Invoice3", fnm);
|
|
494
|
+
expect(res).toEqual({
|
|
495
|
+
error: `Columns named "id" must not have missing values`,
|
|
496
|
+
});
|
|
497
|
+
const table = await Table.findOne({ name: "Invoice3" });
|
|
498
|
+
expect(table).toBe(null);
|
|
499
|
+
});
|
|
500
|
+
it("should succeed on good id", async () => {
|
|
501
|
+
const csv = `id,cost,count, vatable
|
|
502
|
+
1, 5,4, f
|
|
503
|
+
2, 0.5,2, t`;
|
|
504
|
+
const fnm = "/tmp/test2.csv";
|
|
505
|
+
await fs.writeFile(fnm, csv);
|
|
506
|
+
const res = await Table.create_from_csv("Invoice3", fnm);
|
|
507
|
+
expect(res.table.fields.length).toEqual(4); // incl id
|
|
508
|
+
const table = await Table.findOne({ name: "Invoice3" });
|
|
509
|
+
const rows = await table.getRows();
|
|
510
|
+
expect(rows.length).toBe(2);
|
|
511
|
+
await table.insertRow({ cost: 0.2, count: 1, vatable: true });
|
|
512
|
+
const rows3 = await table.getRows();
|
|
513
|
+
expect(rows3.length).toBe(3);
|
|
514
|
+
});
|
|
515
|
+
it("should fail on repeat id", async () => {
|
|
516
|
+
const csv = `id,cost,count, vatable
|
|
517
|
+
1, 5,4, f
|
|
518
|
+
1, 0.5,2, t`;
|
|
519
|
+
const fnm = "/tmp/test2.csv";
|
|
520
|
+
await fs.writeFile(fnm, csv);
|
|
521
|
+
const res = await Table.create_from_csv("Invoice4", fnm);
|
|
522
|
+
expect(res.error).toContain("Invoice4");
|
|
523
|
+
const table = await Table.findOne({ name: "Invoice4" });
|
|
524
|
+
expect(table).toBe(null);
|
|
525
|
+
});
|
|
526
|
+
it("should import with missing", async () => {
|
|
527
|
+
const csv = `item,cost,count, vatable
|
|
528
|
+
Book, 5,4, f
|
|
529
|
+
Pencil, 0.5,, t`;
|
|
530
|
+
const fnm = "/tmp/test2.csv";
|
|
531
|
+
await fs.writeFile(fnm, csv);
|
|
532
|
+
const { table, error } = await Table.create_from_csv("InvoiceMissing", fnm);
|
|
533
|
+
expect(error).toBe(undefined);
|
|
534
|
+
expect(!!table).toBe(true);
|
|
535
|
+
const fields = await table.getFields();
|
|
536
|
+
const countField = fields.find((f) => f.name === "count");
|
|
537
|
+
expect(countField.type.name).toBe("Integer");
|
|
538
|
+
expect(countField.required).toBe(false);
|
|
539
|
+
const rows = await table.getRows({ item: "Pencil" });
|
|
540
|
+
expect(rows.length).toBe(1);
|
|
541
|
+
expect(rows[0].count).toBe(null);
|
|
542
|
+
const brows = await table.getRows({ item: "Book" });
|
|
543
|
+
expect(brows[0].count).toBe(4);
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
describe("Table field uppercase", () => {
|
|
547
|
+
it("should create by importing", async () => {
|
|
548
|
+
const csv = `Item,cost,Count,Vatable
|
|
549
|
+
Book, 5,4, f
|
|
550
|
+
Pencil, 0.5,2, t`;
|
|
551
|
+
const fnm = "/tmp/test_uc.csv";
|
|
552
|
+
await fs.writeFile(fnm, csv);
|
|
553
|
+
const { table } = await Table.create_from_csv("InvoiceUC", fnm);
|
|
554
|
+
const fields = await table.getFields();
|
|
555
|
+
const rows1 = await table.getJoinedRows({
|
|
556
|
+
where: { item: { ilike: "East" } },
|
|
557
|
+
});
|
|
558
|
+
expect(rows1.length).toBe(0);
|
|
559
|
+
const rows2 = await table.getJoinedRows({
|
|
560
|
+
where: { count: 2 },
|
|
561
|
+
});
|
|
562
|
+
expect(rows2.length).toBe(1);
|
|
563
|
+
const rows3 = await table.getJoinedRows({
|
|
564
|
+
where: { _fts: { searchTerm: "Book", fields } },
|
|
565
|
+
});
|
|
566
|
+
expect(rows3.length).toBe(1);
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
describe("Table unique constraint", () => {
|
|
570
|
+
it("should create table", async () => {
|
|
571
|
+
//db.set_sql_logging()
|
|
572
|
+
const table = await Table.create("TableWithUniques");
|
|
573
|
+
const field = await Field.create({
|
|
574
|
+
table,
|
|
575
|
+
name: "name",
|
|
576
|
+
type: "String",
|
|
577
|
+
is_unique: true,
|
|
578
|
+
});
|
|
579
|
+
await table.insertRow({ name: "Bill" });
|
|
580
|
+
const ted_id = await table.insertRow({ name: "Ted" });
|
|
581
|
+
const ins_res = await table.tryInsertRow({ name: "Bill" });
|
|
582
|
+
expect(ins_res).toEqual({
|
|
583
|
+
error: "Duplicate value for unique field: name",
|
|
584
|
+
});
|
|
585
|
+
const ins_res1 = await table.tryInsertRow({ name: "Billy" });
|
|
586
|
+
expect(typeof ins_res1.success).toEqual("number");
|
|
587
|
+
const upd_res = await table.tryUpdateRow({ name: "Bill" }, ted_id);
|
|
588
|
+
expect(upd_res).toEqual({
|
|
589
|
+
error: "Duplicate value for unique field: name",
|
|
590
|
+
});
|
|
591
|
+
const upd_res1 = await table.tryUpdateRow({ name: "teddy" }, ted_id);
|
|
592
|
+
expect(upd_res1.success).toEqual(true);
|
|
593
|
+
await field.update({ is_unique: false });
|
|
594
|
+
const field1 = await Field.findOne({ id: field.id });
|
|
595
|
+
expect(field1.is_unique).toBe(false);
|
|
596
|
+
//const bill2_id = await table.insertRow({ name: "Bill" });
|
|
597
|
+
await field1.update({ is_unique: true });
|
|
598
|
+
const field2 = await Field.findOne({ id: field.id });
|
|
599
|
+
expect(field2.is_unique).toBe(true);
|
|
600
|
+
expect(field1.is_unique).toBe(true);
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
describe("Table not null constraint", () => {
|
|
604
|
+
it("should create table", async () => {
|
|
605
|
+
//db.set_sql_logging()
|
|
606
|
+
const table = await Table.create("TableWithNotNulls");
|
|
607
|
+
const field = await Field.create({
|
|
608
|
+
table,
|
|
609
|
+
name: "name",
|
|
610
|
+
type: "String",
|
|
611
|
+
required: true,
|
|
612
|
+
});
|
|
613
|
+
await Field.create({
|
|
614
|
+
table,
|
|
615
|
+
name: "age",
|
|
616
|
+
type: "Integer",
|
|
617
|
+
});
|
|
618
|
+
await table.insertRow({ name: "Bill", age: 13 });
|
|
619
|
+
await table.insertRow({ name: "Bill", age: 13 });
|
|
620
|
+
const ins_res = await table.tryInsertRow({ age: 17, name: null });
|
|
621
|
+
expect(!!ins_res.error).toBe(true);
|
|
622
|
+
expect(ins_res.error).toContain("name");
|
|
623
|
+
if (!db.isSQLite) {
|
|
624
|
+
await field.update({ required: false });
|
|
625
|
+
const ted_id = await table.insertRow({ age: 17 });
|
|
626
|
+
await table.deleteRows({ id: ted_id });
|
|
627
|
+
await field.update({ required: true });
|
|
628
|
+
const ins_res1 = await table.tryInsertRow({ age: 167 });
|
|
629
|
+
expect(!!ins_res1.error).toBe(true);
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
it("should query null", async () => {
|
|
633
|
+
const table = await Table.findOne({ name: "TableWithNotNulls" });
|
|
634
|
+
await table.insertRow({ name: "Ageless", age: null });
|
|
635
|
+
const rows = await table.getRows({ age: null });
|
|
636
|
+
expect(rows.length).toBe(1);
|
|
637
|
+
expect(rows[0].name).toBe("Ageless");
|
|
638
|
+
const rows1 = await table.getRows({ age: null, name: "Ageless" });
|
|
639
|
+
expect(rows1.length).toBe(1);
|
|
640
|
+
expect(rows1[0].name).toBe("Ageless");
|
|
641
|
+
const rows2 = await table.getRows({ name: "Ageless", age: null });
|
|
642
|
+
expect(rows2.length).toBe(1);
|
|
643
|
+
expect(rows2[0].name).toBe("Ageless");
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
describe("Table with users and files", () => {
|
|
647
|
+
it("should create table", async () => {
|
|
648
|
+
//db.set_sql_logging()
|
|
649
|
+
const rick = await rick_file();
|
|
650
|
+
const table = await Table.create("TableWithUsers");
|
|
651
|
+
await Field.create({
|
|
652
|
+
table,
|
|
653
|
+
name: "name",
|
|
654
|
+
type: "String",
|
|
655
|
+
is_unique: true,
|
|
656
|
+
});
|
|
657
|
+
await Field.create({
|
|
658
|
+
table,
|
|
659
|
+
name: "owner",
|
|
660
|
+
type: "Key to users",
|
|
661
|
+
});
|
|
662
|
+
await Field.create({
|
|
663
|
+
table,
|
|
664
|
+
name: "mugshot",
|
|
665
|
+
type: "File",
|
|
666
|
+
});
|
|
667
|
+
await table.insertRow({ name: "Rocket", owner: 1, mugshot: rick.id });
|
|
668
|
+
const rels = await table.get_parent_relations();
|
|
669
|
+
expect(rels.parent_field_list).toEqual(["owner.email", "owner.id"]);
|
|
670
|
+
const joined = await table.getJoinedRows();
|
|
671
|
+
// expect(joined).toEqual("rick.png")
|
|
672
|
+
expect(joined[0].mugshot__filename).toEqual("rick.png");
|
|
673
|
+
});
|
|
674
|
+
});
|
|
675
|
+
describe("Table and view deletion ", () => {
|
|
676
|
+
it("should setup", async () => {
|
|
677
|
+
const tc = await Table.create("mytable19");
|
|
678
|
+
await Field.create({
|
|
679
|
+
table: tc,
|
|
680
|
+
name: "name",
|
|
681
|
+
type: "String",
|
|
682
|
+
is_unique: true,
|
|
683
|
+
});
|
|
684
|
+
const v = await View.create({
|
|
685
|
+
table_id: tc.id,
|
|
686
|
+
name: "anewview",
|
|
687
|
+
viewtemplate: "List",
|
|
688
|
+
configuration: { columns: [], default_state: {} },
|
|
689
|
+
min_role: 10,
|
|
690
|
+
});
|
|
691
|
+
let error;
|
|
692
|
+
try {
|
|
693
|
+
await tc.delete();
|
|
694
|
+
}
|
|
695
|
+
catch (e) {
|
|
696
|
+
error = e;
|
|
697
|
+
}
|
|
698
|
+
//expect(error).toBeInstanceOf(Error); - not on SQLite
|
|
699
|
+
await v.delete();
|
|
700
|
+
});
|
|
701
|
+
it("should delete table after view delete", async () => {
|
|
702
|
+
const tc = await Table.findOne({ name: "mytable19" });
|
|
703
|
+
if (tc)
|
|
704
|
+
await tc.delete();
|
|
705
|
+
});
|
|
706
|
+
});
|
|
707
|
+
describe("Table with date", () => {
|
|
708
|
+
it("should create table", async () => {
|
|
709
|
+
//db.set_sql_logging()
|
|
710
|
+
const table = await Table.create("TableWithDates");
|
|
711
|
+
await Field.create({
|
|
712
|
+
table,
|
|
713
|
+
name: "time",
|
|
714
|
+
type: "Date",
|
|
715
|
+
});
|
|
716
|
+
await table.insertRow({ time: new Date() });
|
|
717
|
+
const rows = await table.getRows();
|
|
718
|
+
var dif = new Date(rows[0].time).getTime() - new Date().getTime();
|
|
719
|
+
expect(Math.abs(dif)).toBeLessThanOrEqual(1000);
|
|
720
|
+
});
|
|
721
|
+
});
|
|
722
|
+
describe("Tables with name clashes", () => {
|
|
723
|
+
it("should create tables", async () => {
|
|
724
|
+
//db.set_sql_logging()
|
|
725
|
+
const cars = await Table.create("TableClashCar");
|
|
726
|
+
const persons = await Table.create("TableClashPerson");
|
|
727
|
+
await Field.create({
|
|
728
|
+
table: persons,
|
|
729
|
+
name: "name",
|
|
730
|
+
type: "String",
|
|
731
|
+
});
|
|
732
|
+
await Field.create({
|
|
733
|
+
table: cars,
|
|
734
|
+
name: "name",
|
|
735
|
+
type: "String",
|
|
736
|
+
});
|
|
737
|
+
await Field.create({
|
|
738
|
+
table: cars,
|
|
739
|
+
name: "owner",
|
|
740
|
+
type: "Key to TableClashPerson",
|
|
741
|
+
});
|
|
742
|
+
const sally = await persons.insertRow({ name: "Sally" });
|
|
743
|
+
await cars.insertRow({ name: "Mustang", owner: sally });
|
|
744
|
+
});
|
|
745
|
+
it("should query", async () => {
|
|
746
|
+
const cars = await Table.findOne({ name: "TableClashCar" });
|
|
747
|
+
const rows = await cars.getJoinedRows({
|
|
748
|
+
joinFields: {
|
|
749
|
+
owner_name: { ref: "owner", target: "name" },
|
|
750
|
+
},
|
|
751
|
+
});
|
|
752
|
+
expect(rows[0]).toEqual({
|
|
753
|
+
id: 1,
|
|
754
|
+
name: "Mustang",
|
|
755
|
+
owner: 1,
|
|
756
|
+
owner_name: "Sally",
|
|
757
|
+
});
|
|
758
|
+
});
|
|
759
|
+
it("should show list view", async () => {
|
|
760
|
+
const cars = await Table.findOne({ name: "TableClashCar" });
|
|
761
|
+
const v = await View.create({
|
|
762
|
+
table_id: cars.id,
|
|
763
|
+
name: "patientlist",
|
|
764
|
+
viewtemplate: "List",
|
|
765
|
+
configuration: {
|
|
766
|
+
columns: [
|
|
767
|
+
{ type: "Field", field_name: "name" },
|
|
768
|
+
{ type: "JoinField", join_field: "owner.name" },
|
|
769
|
+
],
|
|
770
|
+
},
|
|
771
|
+
min_role: 10,
|
|
772
|
+
});
|
|
773
|
+
const res = await v.run({}, mockReqRes);
|
|
774
|
+
expect(res).toContain("Mustang");
|
|
775
|
+
expect(res).toContain("Sally");
|
|
776
|
+
});
|
|
777
|
+
it("should show show view", async () => {
|
|
778
|
+
const cars = await Table.findOne({ name: "TableClashCar" });
|
|
779
|
+
const v = await View.create({
|
|
780
|
+
table_id: cars.id,
|
|
781
|
+
name: "patientlist",
|
|
782
|
+
viewtemplate: "Show",
|
|
783
|
+
configuration: {
|
|
784
|
+
columns: [
|
|
785
|
+
{ type: "Field", field_name: "name" },
|
|
786
|
+
{ type: "JoinField", join_field: "owner.name" },
|
|
787
|
+
],
|
|
788
|
+
layout: {
|
|
789
|
+
above: [
|
|
790
|
+
{ type: "field", fieldview: "show", field_name: "name" },
|
|
791
|
+
{ type: "join_field", join_field: "owner.name" },
|
|
792
|
+
],
|
|
793
|
+
},
|
|
794
|
+
},
|
|
795
|
+
min_role: 10,
|
|
796
|
+
});
|
|
797
|
+
const res = await v.run({ id: 1 }, mockReqRes);
|
|
798
|
+
expect(res).toContain("Mustang");
|
|
799
|
+
expect(res).toContain("Sally");
|
|
800
|
+
});
|
|
801
|
+
});
|
|
802
|
+
describe("Table joint unique constraint", () => {
|
|
803
|
+
it("should create table", async () => {
|
|
804
|
+
const table = await Table.findOne({ name: "books" });
|
|
805
|
+
const rows = await table.getRows();
|
|
806
|
+
const { id, ...row0 } = rows[0];
|
|
807
|
+
const tc = await TableConstraint.create({
|
|
808
|
+
table_id: table.id,
|
|
809
|
+
type: "Unique",
|
|
810
|
+
configuration: { fields: ["author", "pages"] },
|
|
811
|
+
});
|
|
812
|
+
const res = await table.tryInsertRow(row0);
|
|
813
|
+
expect(!!res.error).toBe(true);
|
|
814
|
+
await tc.delete();
|
|
815
|
+
const res1 = await table.tryInsertRow(row0);
|
|
816
|
+
expect(!!res1.error).toBe(false);
|
|
817
|
+
});
|
|
818
|
+
});
|
|
819
|
+
describe("Table with row ownership", () => {
|
|
820
|
+
it("should create and delete table", async () => {
|
|
821
|
+
const persons = await Table.create("TableOwned");
|
|
822
|
+
const name = await Field.create({
|
|
823
|
+
table: persons,
|
|
824
|
+
name: "name",
|
|
825
|
+
type: "String",
|
|
826
|
+
});
|
|
827
|
+
const age = await Field.create({
|
|
828
|
+
table: persons,
|
|
829
|
+
name: "age",
|
|
830
|
+
type: "String",
|
|
831
|
+
});
|
|
832
|
+
const owner = await Field.create({
|
|
833
|
+
table: persons,
|
|
834
|
+
name: "owner",
|
|
835
|
+
type: "Key to users",
|
|
836
|
+
});
|
|
837
|
+
await persons.update({ ownership_field_id: owner.id });
|
|
838
|
+
if (!db.isSQLite) {
|
|
839
|
+
await age.update({ type: "Integer" });
|
|
840
|
+
await name.update({ name: "lastname" });
|
|
841
|
+
await persons.insertRow({ lastname: "Joe", age: 12 });
|
|
842
|
+
await persons.insertRow({ lastname: "Sam", age: 13, owner: 1 });
|
|
843
|
+
const row = await persons.getRow({ age: 12 });
|
|
844
|
+
expect(row.lastname).toBe("Joe");
|
|
845
|
+
expect(row.age).toBe(12);
|
|
846
|
+
const owner_fnm = await persons.owner_fieldname();
|
|
847
|
+
expect(owner_fnm).toBe("owner");
|
|
848
|
+
const is_owner = await persons.is_owner({ id: 6 }, row);
|
|
849
|
+
expect(is_owner).toBe(false);
|
|
850
|
+
const row1 = await persons.getRow({ age: 13 });
|
|
851
|
+
const is_owner1 = await persons.is_owner({ id: 1 }, row1);
|
|
852
|
+
expect(is_owner1).toBe(true);
|
|
853
|
+
}
|
|
854
|
+
await persons.delete();
|
|
855
|
+
});
|
|
856
|
+
});
|
|
857
|
+
describe("Table with row ownership", () => {
|
|
858
|
+
it("should create and delete table", async () => {
|
|
859
|
+
const persons = await Table.create("TableOwnedFml");
|
|
860
|
+
const name = await Field.create({
|
|
861
|
+
table: persons,
|
|
862
|
+
name: "name",
|
|
863
|
+
type: "String",
|
|
864
|
+
});
|
|
865
|
+
const age = await Field.create({
|
|
866
|
+
table: persons,
|
|
867
|
+
name: "age",
|
|
868
|
+
type: "String",
|
|
869
|
+
});
|
|
870
|
+
const owner = await Field.create({
|
|
871
|
+
table: persons,
|
|
872
|
+
name: "owner",
|
|
873
|
+
type: "Key to users",
|
|
874
|
+
});
|
|
875
|
+
await persons.update({ ownership_formula: "user.id===owner" });
|
|
876
|
+
if (!db.isSQLite) {
|
|
877
|
+
await age.update({ type: "Integer" });
|
|
878
|
+
await name.update({ name: "lastname" });
|
|
879
|
+
await persons.insertRow({ lastname: "Joe", age: 12 });
|
|
880
|
+
await persons.insertRow({ lastname: "Sam", age: 13, owner: 1 });
|
|
881
|
+
const row = await persons.getRow({ age: 12 });
|
|
882
|
+
expect(row.lastname).toBe("Joe");
|
|
883
|
+
expect(row.age).toBe(12);
|
|
884
|
+
const is_owner = await persons.is_owner({ id: 6 }, row);
|
|
885
|
+
expect(is_owner).toBe(false);
|
|
886
|
+
const row1 = await persons.getRow({ age: 13 });
|
|
887
|
+
const is_owner1 = await persons.is_owner({ id: 1 }, row1);
|
|
888
|
+
expect(is_owner1).toBe(true);
|
|
889
|
+
}
|
|
890
|
+
await persons.delete();
|
|
891
|
+
});
|
|
892
|
+
});
|
|
893
|
+
describe("Table with UUID pks", () => {
|
|
894
|
+
if (!db.isSQLite) {
|
|
895
|
+
it("should select uuid", async () => {
|
|
896
|
+
await db.query('create extension if not exists "uuid-ossp";');
|
|
897
|
+
const { rows } = await db.query("select uuid_generate_v4();");
|
|
898
|
+
expect(rows.length).toBe(1);
|
|
899
|
+
expect(typeof rows[0].uuid_generate_v4).toBe("string");
|
|
900
|
+
});
|
|
901
|
+
it("should create and insert stuff in table", async () => {
|
|
902
|
+
getState().registerPlugin("mock_plugin", plugin_with_routes);
|
|
903
|
+
const table = await Table.create("TableUUID");
|
|
904
|
+
const [pk] = await table.getFields();
|
|
905
|
+
await pk.update({ type: "UUID" });
|
|
906
|
+
const name = await Field.create({
|
|
907
|
+
table: table,
|
|
908
|
+
name: "name",
|
|
909
|
+
type: "String",
|
|
910
|
+
});
|
|
911
|
+
table.fields = null;
|
|
912
|
+
await table.insertRow({ name: "Sam" });
|
|
913
|
+
const rows = await table.getRows();
|
|
914
|
+
expect(rows.length).toBe(1);
|
|
915
|
+
expect(typeof rows[0].id).toBe("string");
|
|
916
|
+
expect(rows[0].id.length > 10).toBe(true);
|
|
917
|
+
expect(rows[0].name).toBe("Sam");
|
|
918
|
+
await table.updateRow({ name: "Jim" }, rows[0].id);
|
|
919
|
+
const rows1 = await table.getJoinedRows();
|
|
920
|
+
expect(rows1.length).toBe(1);
|
|
921
|
+
expect(typeof rows1[0].id).toBe("string");
|
|
922
|
+
expect(rows1[0].id).toBe(rows[0].id);
|
|
923
|
+
expect(rows1[0].name).toBe("Jim");
|
|
924
|
+
const row = await table.getRow({ id: rows[0].id });
|
|
925
|
+
expect(row.name).toBe("Jim");
|
|
926
|
+
});
|
|
927
|
+
it("should import json", async () => {
|
|
928
|
+
const json = [
|
|
929
|
+
{ name: "Alex", id: "750d07fc-943d-4afc-9084-3911bcdbd0f7" },
|
|
930
|
+
];
|
|
931
|
+
const fnm = "/tmp/test1.json";
|
|
932
|
+
await fs.writeFile(fnm, JSON.stringify(json));
|
|
933
|
+
const table = await Table.findOne({ name: "TableUUID" });
|
|
934
|
+
expect(!!table).toBe(true);
|
|
935
|
+
const impres = await table.import_json_file(fnm);
|
|
936
|
+
expect(impres).toEqual({
|
|
937
|
+
success: "Imported 1 rows into table TableUUID",
|
|
938
|
+
});
|
|
939
|
+
const rows = await table.getRows();
|
|
940
|
+
expect(rows.length).toBe(2);
|
|
941
|
+
});
|
|
942
|
+
it("should be joinable to", async () => {
|
|
943
|
+
const uuidtable1 = await Table.findOne({ name: "TableUUID" });
|
|
944
|
+
const table = await Table.create("JoinUUID");
|
|
945
|
+
await Field.create({
|
|
946
|
+
table: table,
|
|
947
|
+
name: "myname",
|
|
948
|
+
type: "String",
|
|
949
|
+
});
|
|
950
|
+
//db.set_sql_logging();
|
|
951
|
+
await Field.create({
|
|
952
|
+
table: table,
|
|
953
|
+
name: "follows",
|
|
954
|
+
type: "Key to TableUUID",
|
|
955
|
+
});
|
|
956
|
+
const refrows = await uuidtable1.getRows({});
|
|
957
|
+
await table.insertRow({ myname: "Fred", follows: refrows[0].id });
|
|
958
|
+
const rows = await table.getJoinedRows({
|
|
959
|
+
where: {},
|
|
960
|
+
joinFields: {
|
|
961
|
+
leader: { ref: "follows", target: "name" },
|
|
962
|
+
},
|
|
963
|
+
});
|
|
964
|
+
//trying to debug intermittant CI failure
|
|
965
|
+
if (rows.length === 0) {
|
|
966
|
+
const allRows = await table.getRows();
|
|
967
|
+
console.log(allRows);
|
|
968
|
+
}
|
|
969
|
+
expect(rows.length).toBe(1);
|
|
970
|
+
expect(rows[0].leader).toBe("Jim");
|
|
971
|
+
expect(rows[0].myname).toBe("Fred");
|
|
972
|
+
await table.delete();
|
|
973
|
+
await uuidtable1.delete();
|
|
974
|
+
});
|
|
975
|
+
it("should create and delete table", async () => {
|
|
976
|
+
getState().registerPlugin("mock_plugin", plugin_with_routes);
|
|
977
|
+
const table = await Table.create("TableUUID1");
|
|
978
|
+
const [pk] = await table.getFields();
|
|
979
|
+
await pk.update({ type: "UUID" });
|
|
980
|
+
table.fields = null;
|
|
981
|
+
const [pk1] = await table.getFields();
|
|
982
|
+
await pk1.update({ type: "Integer" });
|
|
983
|
+
await table.delete();
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
});
|
|
987
|
+
describe("external tables", () => {
|
|
988
|
+
it("should register plugin", async () => {
|
|
989
|
+
getState().registerPlugin("mock_plugin", plugin_with_routes);
|
|
990
|
+
});
|
|
991
|
+
it("should find table", async () => {
|
|
992
|
+
const table = await Table.findOne({ name: "exttab" });
|
|
993
|
+
expect(!!table).toBe(true);
|
|
994
|
+
const notable = await Table.findOne({ name: "exttnosuchab" });
|
|
995
|
+
expect(!!notable).toBe(false);
|
|
996
|
+
const tables = await Table.find_with_external();
|
|
997
|
+
expect(tables.map((t) => t.name)).toContain("exttab");
|
|
998
|
+
expect(tables.map((t) => t.name)).toContain("books");
|
|
999
|
+
const etables = await Table.find_with_external({ external: true });
|
|
1000
|
+
expect(etables.map((t) => t.name)).toEqual(["exttab"]);
|
|
1001
|
+
const dbtables = await Table.find_with_external({ external: false });
|
|
1002
|
+
expect(dbtables.map((t) => t.name)).not.toContain("exttab");
|
|
1003
|
+
expect(dbtables.map((t) => t.name)).toContain("books");
|
|
1004
|
+
});
|
|
1005
|
+
});
|
|
1006
|
+
describe("distance ordering", () => {
|
|
1007
|
+
it("should create table", async () => {
|
|
1008
|
+
const tc = await Table.create("geotable1");
|
|
1009
|
+
await Field.create({
|
|
1010
|
+
table: tc,
|
|
1011
|
+
label: "Name",
|
|
1012
|
+
type: "String",
|
|
1013
|
+
required: true,
|
|
1014
|
+
});
|
|
1015
|
+
await Field.create({
|
|
1016
|
+
table: tc,
|
|
1017
|
+
label: "Lat",
|
|
1018
|
+
type: "Float",
|
|
1019
|
+
required: true,
|
|
1020
|
+
});
|
|
1021
|
+
await Field.create({
|
|
1022
|
+
table: tc,
|
|
1023
|
+
label: "Long",
|
|
1024
|
+
type: "Float",
|
|
1025
|
+
required: true,
|
|
1026
|
+
});
|
|
1027
|
+
await tc.insertRow({ name: "Fred", lat: 10, long: 10 });
|
|
1028
|
+
await tc.insertRow({ name: "George", lat: 20, long: 20 });
|
|
1029
|
+
});
|
|
1030
|
+
it("should query", async () => {
|
|
1031
|
+
const table = await Table.findOne({ name: "geotable1" });
|
|
1032
|
+
const fred_rows = await table.getRows({}, {
|
|
1033
|
+
orderBy: {
|
|
1034
|
+
distance: { lat: 11, long: 11, latField: "lat", longField: "long" },
|
|
1035
|
+
},
|
|
1036
|
+
});
|
|
1037
|
+
expect(fred_rows.length).toBe(2);
|
|
1038
|
+
expect(fred_rows[0].name).toBe("Fred");
|
|
1039
|
+
const george_rows = await table.getJoinedRows({
|
|
1040
|
+
orderBy: {
|
|
1041
|
+
distance: { lat: 19, long: 19, latField: "lat", longField: "long" },
|
|
1042
|
+
},
|
|
1043
|
+
});
|
|
1044
|
+
expect(george_rows.length).toBe(2);
|
|
1045
|
+
expect(george_rows[0].name).toBe("George");
|
|
1046
|
+
});
|
|
1047
|
+
});
|
|
1048
|
+
//# sourceMappingURL=table.test.js.map
|