@saltcorn/admin-models 1.6.3-beta.1 → 1.7.0-alpha.1

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 (99) hide show
  1. package/cjs/index.cjs +18 -0
  2. package/cjs/models/backup-retention.cjs +18 -0
  3. package/cjs/models/backup.cjs +18 -0
  4. package/cjs/models/config-check.cjs +18 -0
  5. package/cjs/models/file-globs.cjs +18 -0
  6. package/cjs/models/pack.cjs +18 -0
  7. package/cjs/models/snapshot.cjs +18 -0
  8. package/cjs/models/tenant.cjs +18 -0
  9. package/cjs/models/zip-extract.cjs +18 -0
  10. package/cjs/models/zip-format.cjs +18 -0
  11. package/cjs/models/zip-worker.cjs +18 -0
  12. package/cjs/models/zip-writer.cjs +18 -0
  13. package/cjs/models/zip.cjs +18 -0
  14. package/dist/index.d.ts +6 -5
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +12 -18
  17. package/dist/index.js.map +1 -1
  18. package/dist/models/backup-retention.d.ts +57 -0
  19. package/dist/models/backup-retention.d.ts.map +1 -0
  20. package/dist/models/backup-retention.js +108 -0
  21. package/dist/models/backup-retention.js.map +1 -0
  22. package/dist/models/backup.d.ts +7 -3
  23. package/dist/models/backup.d.ts.map +1 -1
  24. package/dist/models/backup.js +479 -409
  25. package/dist/models/backup.js.map +1 -1
  26. package/dist/models/config-check.d.ts +2 -1
  27. package/dist/models/config-check.d.ts.map +1 -1
  28. package/dist/models/config-check.js +16 -23
  29. package/dist/models/config-check.js.map +1 -1
  30. package/dist/models/file-globs.d.ts +34 -0
  31. package/dist/models/file-globs.d.ts.map +1 -0
  32. package/dist/models/file-globs.js +47 -0
  33. package/dist/models/file-globs.js.map +1 -0
  34. package/dist/models/pack.d.ts +3 -2
  35. package/dist/models/pack.d.ts.map +1 -1
  36. package/dist/models/pack.js +147 -151
  37. package/dist/models/pack.js.map +1 -1
  38. package/dist/models/snapshot.d.ts +1 -1
  39. package/dist/models/snapshot.d.ts.map +1 -1
  40. package/dist/models/snapshot.js +26 -29
  41. package/dist/models/snapshot.js.map +1 -1
  42. package/dist/models/tenant.d.ts +1 -1
  43. package/dist/models/tenant.d.ts.map +1 -1
  44. package/dist/models/tenant.js +45 -48
  45. package/dist/models/tenant.js.map +1 -1
  46. package/dist/models/zip-extract.d.ts +14 -0
  47. package/dist/models/zip-extract.d.ts.map +1 -0
  48. package/dist/models/zip-extract.js +110 -0
  49. package/dist/models/zip-extract.js.map +1 -0
  50. package/dist/models/zip-format.d.ts +57 -0
  51. package/dist/models/zip-format.d.ts.map +1 -0
  52. package/dist/models/zip-format.js +106 -0
  53. package/dist/models/zip-format.js.map +1 -0
  54. package/dist/models/zip-worker.d.ts +2 -0
  55. package/dist/models/zip-worker.d.ts.map +1 -0
  56. package/dist/models/zip-worker.js +177 -0
  57. package/dist/models/zip-worker.js.map +1 -0
  58. package/dist/models/zip-writer.d.ts +75 -0
  59. package/dist/models/zip-writer.d.ts.map +1 -0
  60. package/dist/models/zip-writer.js +321 -0
  61. package/dist/models/zip-writer.js.map +1 -0
  62. package/dist/models/zip.d.ts +101 -0
  63. package/dist/models/zip.d.ts.map +1 -0
  64. package/dist/models/zip.js +211 -0
  65. package/dist/models/zip.js.map +1 -0
  66. package/dist/tests/backup-retention.test.d.ts +2 -0
  67. package/dist/tests/backup-retention.test.d.ts.map +1 -0
  68. package/dist/tests/backup-retention.test.js +134 -0
  69. package/dist/tests/backup-retention.test.js.map +1 -0
  70. package/dist/tests/backup.test.d.ts +2 -0
  71. package/dist/tests/backup.test.d.ts.map +1 -0
  72. package/dist/tests/backup.test.js +385 -0
  73. package/dist/tests/backup.test.js.map +1 -0
  74. package/dist/tests/cfgcheck.test.d.ts +2 -0
  75. package/dist/tests/cfgcheck.test.d.ts.map +1 -0
  76. package/dist/tests/cfgcheck.test.js +32 -0
  77. package/dist/tests/cfgcheck.test.js.map +1 -0
  78. package/dist/tests/file-globs.test.d.ts +2 -0
  79. package/dist/tests/file-globs.test.d.ts.map +1 -0
  80. package/dist/tests/file-globs.test.js +66 -0
  81. package/dist/tests/file-globs.test.js.map +1 -0
  82. package/dist/tests/pack.test.d.ts +2 -0
  83. package/dist/tests/pack.test.d.ts.map +1 -0
  84. package/dist/tests/pack.test.js +780 -0
  85. package/dist/tests/pack.test.js.map +1 -0
  86. package/dist/tests/random.test.d.ts +2 -0
  87. package/dist/tests/random.test.d.ts.map +1 -0
  88. package/dist/tests/random.test.js +150 -0
  89. package/dist/tests/random.test.js.map +1 -0
  90. package/dist/tests/tenant.test.d.ts +2 -0
  91. package/dist/tests/tenant.test.d.ts.map +1 -0
  92. package/dist/tests/tenant.test.js +106 -0
  93. package/dist/tests/tenant.test.js.map +1 -0
  94. package/dist/tests/zip.test.d.ts +2 -0
  95. package/dist/tests/zip.test.d.ts.map +1 -0
  96. package/dist/tests/zip.test.js +319 -0
  97. package/dist/tests/zip.test.js.map +1 -0
  98. package/gen-cjs-shims.cjs +71 -0
  99. package/package.json +39 -29
@@ -1,68 +1,33 @@
1
- "use strict";
2
1
  /**
3
2
  * Packs
4
3
  * @category saltcorn-admin-models
5
4
  * @module pack
6
5
  */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- var __importDefault = (this && this.__importDefault) || function (mod) {
41
- return (mod && mod.__esModule) ? mod : { "default": mod };
42
- };
43
- const table_1 = __importDefault(require("@saltcorn/data/models/table"));
44
- const index_1 = __importDefault(require("@saltcorn/data/db/index"));
45
- const view_1 = __importDefault(require("@saltcorn/data/models/view"));
46
- const field_1 = __importDefault(require("@saltcorn/data/models/field"));
47
- const trigger_1 = __importDefault(require("@saltcorn/data/models/trigger"));
48
- const workflow_step_1 = __importDefault(require("@saltcorn/data/models/workflow_step"));
49
- const { getState } = require("@saltcorn/data/db/state");
50
- const node_fetch_1 = __importDefault(require("node-fetch"));
51
- const page_1 = __importDefault(require("@saltcorn/data/models/page"));
52
- const page_group_1 = __importDefault(require("@saltcorn/data/models/page_group"));
53
- const table_constraints_1 = __importDefault(require("@saltcorn/data/models/table_constraints"));
54
- const role_1 = __importDefault(require("@saltcorn/data/models/role"));
55
- const library_1 = __importDefault(require("@saltcorn/data/models/library"));
56
- const tag_1 = __importDefault(require("@saltcorn/data/models/tag"));
57
- const tag_entry_1 = __importDefault(require("@saltcorn/data/models/tag_entry"));
58
- const model_1 = __importDefault(require("@saltcorn/data/models/model"));
59
- const model_instance_1 = __importDefault(require("@saltcorn/data/models/model_instance"));
60
- const eventlog_1 = __importDefault(require("@saltcorn/data/models/eventlog"));
61
- const user_1 = __importDefault(require("@saltcorn/data/models/user"));
62
- const config_1 = __importDefault(require("@saltcorn/data/models/config"));
63
- const { save_menu_items } = config_1.default;
64
- const lodash_1 = require("lodash");
65
- const { isStale, getFetchProxyOptions } = require("@saltcorn/data/utils");
6
+ import Table from "@saltcorn/data/models/table";
7
+ import db from "@saltcorn/data/db/index";
8
+ import View from "@saltcorn/data/models/view";
9
+ import Field from "@saltcorn/data/models/field";
10
+ import Trigger from "@saltcorn/data/models/trigger";
11
+ import WorkflowStep from "@saltcorn/data/models/workflow_step";
12
+ import { getState } from "@saltcorn/data/db/state";
13
+ import fetchLib from "node-fetch";
14
+ const fetch = fetchLib; // NodeNext default-import interop for node-fetch
15
+ import Page from "@saltcorn/data/models/page";
16
+ import PageGroup from "@saltcorn/data/models/page_group";
17
+ import TableConstraint from "@saltcorn/data/models/table_constraints";
18
+ import Role from "@saltcorn/data/models/role";
19
+ import Library from "@saltcorn/data/models/library";
20
+ import Tag from "@saltcorn/data/models/tag";
21
+ import TagEntry from "@saltcorn/data/models/tag_entry";
22
+ import Model from "@saltcorn/data/models/model";
23
+ import ModelInstance from "@saltcorn/data/models/model_instance";
24
+ import EventLog from "@saltcorn/data/models/eventlog";
25
+ import User from "@saltcorn/data/models/user";
26
+ import * as config from "@saltcorn/data/models/config";
27
+ const { save_menu_items } = config;
28
+ import lodash from "lodash";
29
+ const { isEqual } = lodash;
30
+ import { isStale, getFetchProxyOptions } from "@saltcorn/data/utils";
66
31
  /**
67
32
  * Table Pack
68
33
  * @function
@@ -71,7 +36,7 @@ const { isStale, getFetchProxyOptions } = require("@saltcorn/data/utils");
71
36
  const table_pack = async (nameOrTable) => {
72
37
  // todo check this change
73
38
  const table = typeof nameOrTable === "string"
74
- ? table_1.default.findOne({ name: nameOrTable })
39
+ ? Table.findOne({ name: nameOrTable })
75
40
  : nameOrTable;
76
41
  if (!table)
77
42
  throw new Error(`Unable to find table '${nameOrTable}'`);
@@ -82,7 +47,7 @@ const table_pack = async (nameOrTable) => {
82
47
  return o;
83
48
  };
84
49
  //const triggers = await Trigger.find({ table_id: table.id });
85
- const constraints = await table_constraints_1.default.find({ table_id: table.id });
50
+ const constraints = await TableConstraint.find({ table_id: table.id });
86
51
  return {
87
52
  name: table.name,
88
53
  description: table.description,
@@ -94,6 +59,7 @@ const table_pack = async (nameOrTable) => {
94
59
  provider_name: table.provider_name,
95
60
  provider_cfg: table.provider_cfg,
96
61
  ownership_formula: table.ownership_formula,
62
+ rls_enabled: table.rls_enabled,
97
63
  fields: fields.map((f) => strip_ids(f.toJson)),
98
64
  //triggers: triggers.map((tr) => tr.toJson),
99
65
  constraints: constraints.map((c) => c.toJson),
@@ -107,10 +73,10 @@ const table_pack = async (nameOrTable) => {
107
73
  * @param name
108
74
  */
109
75
  const view_pack = async (name) => {
110
- const view = typeof name === "string" ? await view_1.default.findOne({ name }) : name;
76
+ const view = typeof name === "string" ? await View.findOne({ name }) : name;
111
77
  if (!view)
112
78
  throw new Error(`Unable to find view '${name}'`);
113
- const table = table_1.default.findOne({ id: view.table_id });
79
+ const table = Table.findOne({ id: view.table_id });
114
80
  //if (!table)
115
81
  // throw new Error(`Unable to find table with id '${view.table_id}'`);
116
82
  return {
@@ -132,7 +98,7 @@ const view_pack = async (name) => {
132
98
  * @param name
133
99
  */
134
100
  const plugin_pack = async (name) => {
135
- const Plugin = (await Promise.resolve().then(() => __importStar(require("@saltcorn/data/models/plugin")))).default;
101
+ const Plugin = (await import("@saltcorn/data/models/plugin")).default;
136
102
  const plugin = await Plugin.findOne({ name });
137
103
  if (!plugin)
138
104
  throw new Error(`Unable to find plugin '${name}'`);
@@ -160,7 +126,7 @@ const plugin_pack = async (name) => {
160
126
  * @param name name of the page
161
127
  */
162
128
  const page_pack = async (name) => {
163
- const page = typeof name === "string" ? page_1.default.findOne({ name }) : name;
129
+ const page = typeof name === "string" ? Page.findOne({ name }) : name;
164
130
  if (!page)
165
131
  throw new Error(`Unable to find page '${name}'`);
166
132
  const root_page_for_roles = await page.is_root_page_for_roles();
@@ -181,7 +147,7 @@ const page_pack = async (name) => {
181
147
  * @param name name of the page group
182
148
  */
183
149
  const page_group_pack = async (name) => {
184
- const group = page_group_1.default.findOne({ name });
150
+ const group = PageGroup.findOne({ name });
185
151
  if (!group)
186
152
  throw new Error(`Unable to find page group '${name}'`);
187
153
  return {
@@ -191,7 +157,7 @@ const page_group_pack = async (name) => {
191
157
  random_allocation: group.random_allocation,
192
158
  members: group.members.map((m) => {
193
159
  // could get slow (caching ?)
194
- const page = page_1.default.findOne({ id: m.page_id });
160
+ const page = Page.findOne({ id: m.page_id });
195
161
  if (!page)
196
162
  throw new Error(`Unable to find page '${m.page_id}'`);
197
163
  return {
@@ -209,7 +175,7 @@ const page_group_pack = async (name) => {
209
175
  * @param name
210
176
  */
211
177
  const library_pack = async (name) => {
212
- const lib = await library_1.default.findOne({ name });
178
+ const lib = await Library.findOne({ name });
213
179
  return lib.toJson;
214
180
  };
215
181
  const orderWorkflowSteps = (steps) => {
@@ -318,10 +284,10 @@ const orderWorkflowSteps = (steps) => {
318
284
  * @param name
319
285
  */
320
286
  const trigger_pack = async (name) => {
321
- const trig = typeof name === "string" ? await trigger_1.default.findOne({ name }) : name;
287
+ const trig = typeof name === "string" ? await Trigger.findOne({ name }) : name;
322
288
  const pack = trig.toJson;
323
289
  if (trig.action === "Workflow") {
324
- const steps = await workflow_step_1.default.find({ trigger_id: trig.id });
290
+ const steps = await WorkflowStep.find({ trigger_id: trig.id });
325
291
  const ordered = orderWorkflowSteps(steps.map((s) => s.toJson));
326
292
  pack.steps = ordered;
327
293
  }
@@ -334,7 +300,7 @@ const trigger_pack = async (name) => {
334
300
  * @returns {Promise<object>}
335
301
  */
336
302
  const role_pack = async (role) => {
337
- return await role_1.default.findOne({ role });
303
+ return await Role.findOne({ role });
338
304
  };
339
305
  /**
340
306
  * 'page/view/table/trigger' ids are replaced by names
@@ -342,32 +308,32 @@ const role_pack = async (role) => {
342
308
  * @returns
343
309
  */
344
310
  const tag_pack = async (name) => {
345
- const tag = typeof name === "string" ? await tag_1.default.findOne({ name }) : name;
311
+ const tag = typeof name === "string" ? await Tag.findOne({ name }) : name;
346
312
  if (!tag)
347
313
  throw new Error(`Unable to find tag '${name}'`);
348
314
  const entries = await tag.getEntries();
349
315
  const withNames = entries.map((e) => {
350
316
  const result = {};
351
317
  if (e.page_id) {
352
- const page = page_1.default.findOne({ id: e.page_id });
318
+ const page = Page.findOne({ id: e.page_id });
353
319
  if (!page)
354
320
  throw new Error(`Unable to find page '${e.page_id}'`);
355
321
  result.page_name = page.name;
356
322
  }
357
323
  if (e.view_id) {
358
- const view = view_1.default.findOne({ id: e.view_id });
324
+ const view = View.findOne({ id: e.view_id });
359
325
  if (!view)
360
326
  throw new Error(`Unable to find view '${e.view_id}'`);
361
327
  result.view_name = view.name;
362
328
  }
363
329
  if (e.table_id) {
364
- const table = table_1.default.findOne({ id: e.table_id });
330
+ const table = Table.findOne({ id: e.table_id });
365
331
  if (!table)
366
332
  throw new Error(`Unable to find table '${e.table_id}'`);
367
333
  result.table_name = table.name;
368
334
  }
369
335
  if (e.trigger_id) {
370
- const trigger = trigger_1.default.findOne({ id: e.trigger_id });
336
+ const trigger = Trigger.findOne({ id: e.trigger_id });
371
337
  if (!trigger)
372
338
  throw new Error(`Unable to find trigger '${e.trigger_id}'`);
373
339
  result.trigger_name = trigger.name;
@@ -386,10 +352,10 @@ const tag_pack = async (name) => {
386
352
  * @returns
387
353
  */
388
354
  const model_pack = async (name, tableName) => {
389
- const table = table_1.default.findOne({ name: tableName });
355
+ const table = Table.findOne({ name: tableName });
390
356
  if (!table)
391
357
  throw new Error(`Model-table '${tableName}' not found`);
392
- const model = await model_1.default.findOne({ name, table_id: table.id });
358
+ const model = await Model.findOne({ name, table_id: table.id });
393
359
  if (!model)
394
360
  throw new Error(`Model '${name}' not found`);
395
361
  return model.toJson;
@@ -402,13 +368,13 @@ const model_pack = async (name, tableName) => {
402
368
  * @returns
403
369
  */
404
370
  const model_instance_pack = async (instanceName, modelName, tableName) => {
405
- const table = table_1.default.findOne({ name: tableName });
371
+ const table = Table.findOne({ name: tableName });
406
372
  if (!table)
407
373
  throw new Error(`Model-table '${tableName}' not found`);
408
- const model = await model_1.default.findOne({ name: modelName, table_id: table.id });
374
+ const model = await Model.findOne({ name: modelName, table_id: table.id });
409
375
  if (!model)
410
376
  throw new Error(`Unable to find model '${modelName}'`);
411
- const instance = await model_instance_1.default.findOne({
377
+ const instance = await ModelInstance.findOne({
412
378
  name: instanceName,
413
379
  model_id: model.id,
414
380
  });
@@ -432,7 +398,7 @@ const event_log_pack = async (eventLog) => {
432
398
  const userId = result.user_id;
433
399
  if (result.user_id)
434
400
  delete result.user_id;
435
- const user = await user_1.default.findOne({ id: userId });
401
+ const user = await User.findOne({ id: userId });
436
402
  if (user)
437
403
  result.user_email = user.email;
438
404
  }
@@ -444,16 +410,16 @@ const event_log_pack = async (eventLog) => {
444
410
  */
445
411
  const can_install_pack = async (pack) => {
446
412
  const warns = new Array();
447
- const allViews = (await view_1.default.find()).map((t) => ({
413
+ const allViews = (await View.find()).map((t) => ({
448
414
  name: t.name,
449
- table: table_1.default.findOne({ id: t.table_id })?.name,
415
+ table: Table.findOne({ id: t.table_id })?.name,
450
416
  }));
451
417
  for (const pt of pack.tables || []) {
452
- const matchTable = table_1.default.findOne({ name: pt.name });
418
+ const matchTable = Table.findOne({ name: pt.name });
453
419
  if (!matchTable)
454
420
  continue;
455
421
  //failure conditions: existing field with different type (warn)
456
- pt.fields.forEach((f) => {
422
+ (pt.fields || []).forEach((f) => {
457
423
  const ex = matchTable.getField(f.name);
458
424
  if (ex && ex.type_name !== f.type) {
459
425
  warns.push(`Clashing field types for ${f.name} on table ${pt.name}`);
@@ -463,8 +429,8 @@ const can_install_pack = async (pack) => {
463
429
  const matchViews = allViews.filter((dbt) => (pack.views || []).some((pv) => pv.name === dbt.name && dbt.table && pv.table !== dbt.table));
464
430
  pack.tables.forEach((t) => {
465
431
  if (t.name === "users") {
466
- const userTable = table_1.default.findOne({ name: "users" });
467
- t.fields.forEach((f) => {
432
+ const userTable = Table.findOne({ name: "users" });
433
+ (t.fields || []).forEach((f) => {
468
434
  if (f.required) {
469
435
  const ex = userTable?.getField(f.name);
470
436
  if (!ex || !ex.required)
@@ -488,22 +454,22 @@ const can_install_pack = async (pack) => {
488
454
  */
489
455
  const uninstall_pack = async (pack, name) => {
490
456
  for (const pageGroupSpec of pack.page_groups || []) {
491
- const pageGroup = page_group_1.default.findOne({ name: pageGroupSpec.name });
457
+ const pageGroup = PageGroup.findOne({ name: pageGroupSpec.name });
492
458
  if (pageGroup)
493
459
  await pageGroup.delete();
494
460
  }
495
461
  for (const pageSpec of pack.pages || []) {
496
- const page = page_1.default.findOne({ name: pageSpec.name });
462
+ const page = Page.findOne({ name: pageSpec.name });
497
463
  if (page)
498
464
  await page.delete();
499
465
  }
500
466
  for (const viewSpec of pack.views) {
501
- const view = view_1.default.findOne({ name: viewSpec.name });
467
+ const view = View.findOne({ name: viewSpec.name });
502
468
  if (view)
503
469
  await view.delete();
504
470
  }
505
471
  for (const tableSpec of pack.tables) {
506
- const table = table_1.default.findOne({ name: tableSpec.name });
472
+ const table = Table.findOne({ name: tableSpec.name });
507
473
  if (table && table.name === "users")
508
474
  continue;
509
475
  if (table) {
@@ -512,14 +478,14 @@ const uninstall_pack = async (pack, name) => {
512
478
  if (field.is_fkey)
513
479
  await field.delete();
514
480
  }
515
- const triggers = trigger_1.default.find({ table_id: table.id });
481
+ const triggers = Trigger.find({ table_id: table.id });
516
482
  for (const trigger of triggers) {
517
483
  await trigger.delete();
518
484
  }
519
485
  }
520
486
  }
521
487
  for (const tableSpec of pack.tables) {
522
- const table = table_1.default.findOne({ name: tableSpec.name });
488
+ const table = Table.findOne({ name: tableSpec.name });
523
489
  if (table && table.name !== "users")
524
490
  await table.delete();
525
491
  }
@@ -594,8 +560,11 @@ const filter_pack = (pack, options) => {
594
560
  * @param loadAndSaveNewPlugin
595
561
  * @param bare_tables
596
562
  */
597
- const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = false) => {
598
- const Plugin = (await Promise.resolve().then(() => __importStar(require("@saltcorn/data/models/plugin")))).default;
563
+ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = false, onLog) => {
564
+ const log = (msg) => onLog?.(msg);
565
+ const Plugin = (await import("@saltcorn/data/models/plugin")).default;
566
+ if (pack.plugins?.length)
567
+ log("Restoring plugins");
599
568
  for (const plugin of pack.plugins) {
600
569
  if (plugin.source === "npm" && plugin.name.startsWith("@saltcorn/"))
601
570
  plugin.name = plugin.name.replace("@saltcorn/", "");
@@ -611,31 +580,37 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
611
580
  }
612
581
  }
613
582
  }
583
+ if (pack.roles?.length)
584
+ log("Restoring roles");
614
585
  for (const role of pack.roles || []) {
615
586
  role.id = old_to_new_role(role.id);
616
- const existing = await role_1.default.findOne({ id: role.id });
587
+ const existing = await Role.findOne({ id: role.id });
617
588
  if (existing)
618
589
  await existing.update(role);
619
590
  else
620
- await role_1.default.create(role);
591
+ await Role.create(role);
621
592
  }
593
+ if (pack.library?.length)
594
+ log("Restoring library");
622
595
  for (const lib of pack.library || []) {
623
- const exisiting = await library_1.default.findOne({ name: lib.name });
596
+ const exisiting = await Library.findOne({ name: lib.name });
624
597
  if (exisiting)
625
598
  await exisiting.update(lib);
626
599
  else
627
- await library_1.default.create(lib);
600
+ await Library.create(lib);
628
601
  }
629
602
  // create tables (users skipped because created by other ways)
630
603
  // tables with a provider go last because they can depend on presence
631
604
  // of other tables
632
605
  const packTables = pack.tables.sort((left, right) => left.provider_name ? 1 : right.provider_name ? -1 : 0);
606
+ if (packTables.length)
607
+ log("Restoring table definitions");
633
608
  for (const tableSpec of packTables) {
634
609
  const { id, ownership_field_id, ownership_field_name, triggers, constraints, fields, ...updrow } = tableSpec;
635
610
  if (tableSpec.name !== "users") {
636
611
  let tbl_pk;
637
- const existing = table_1.default.findOne({ name: tableSpec.name });
638
- getState().log(5, `Restoring table pack name=${tableSpec.name} existing=${!!existing} tenant=${index_1.default.getTenantSchema()}`);
612
+ const existing = Table.findOne({ name: tableSpec.name });
613
+ getState().log(5, `Restoring table pack name=${tableSpec.name} existing=${!!existing} tenant=${db.getTenantSchema()}`);
639
614
  if (existing) {
640
615
  tbl_pk = await existing.getField(existing.pk_name);
641
616
  await existing.update(updrow);
@@ -643,34 +618,34 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
643
618
  else {
644
619
  tableSpec.min_role_read = old_to_new_role(tableSpec.min_role_read);
645
620
  tableSpec.min_role_write = old_to_new_role(tableSpec.min_role_write);
646
- const table = await table_1.default.create(tableSpec.name, tableSpec);
621
+ const table = await Table.create(tableSpec.name, tableSpec);
647
622
  [tbl_pk] = table.getFields();
648
623
  } //set pk
649
- const pack_pk = tableSpec.fields.find((f) => f.primary_key);
624
+ const pack_pk = (tableSpec.fields || []).find((f) => f.primary_key);
650
625
  if (pack_pk && tbl_pk) {
651
626
  await tbl_pk.update(pack_pk);
652
627
  }
653
628
  }
654
629
  else {
655
- await user_1.default.table.update(updrow);
630
+ await User.table.update(updrow);
656
631
  }
657
632
  }
658
633
  await getState().refresh_tables(true);
659
634
  for (const tableSpec of pack.tables) {
660
- const _table = table_1.default.findOne({ name: tableSpec.name });
635
+ const _table = Table.findOne({ name: tableSpec.name });
661
636
  if (!_table)
662
637
  throw new Error(`Unable to find table '${tableSpec.name}'`);
663
638
  const exfields = _table.getFields();
664
639
  if (!_table.provider_name)
665
- for (const field of tableSpec.fields) {
640
+ for (const field of tableSpec.fields || []) {
666
641
  const exfield = exfields.find((f) => f.name === field.name);
667
642
  if (!((_table.name === "users" &&
668
643
  (field.name === "email" || field.name === "role_id")) ||
669
644
  exfield)) {
670
645
  if (_table.name === "users" && field.required)
671
- await field_1.default.create({ table: _table, ...field, required: false }, bare_tables);
646
+ await Field.create({ table: _table, ...field, required: false }, bare_tables);
672
647
  else
673
- await field_1.default.create({ table: _table, ...field }, bare_tables);
648
+ await Field.create({ table: _table, ...field }, bare_tables);
674
649
  }
675
650
  else if (exfield &&
676
651
  !(_table.name === "users" &&
@@ -682,33 +657,40 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
682
657
  }
683
658
  for (const { table, ...trigger } of tableSpec.triggers || []) {
684
659
  trigger.min_role = old_to_new_role(trigger.min_role);
685
- await trigger_1.default.create({ table: _table, ...trigger }); //legacy, not in new packs
660
+ await Trigger.create({ table: _table, ...trigger }); //legacy, not in new packs
686
661
  }
687
662
  const existing_constraints = _table.constraints;
688
663
  for (const constraint of tableSpec.constraints || []) {
689
664
  if (!existing_constraints.find((excon) => excon.type === constraint.type &&
690
- (0, lodash_1.isEqual)(excon.configuration, constraint.configuration)))
691
- await table_constraints_1.default.create({ table: _table, ...constraint });
665
+ isEqual(excon.configuration, constraint.configuration)))
666
+ await TableConstraint.create({ table: _table, ...constraint });
692
667
  }
693
668
  if (tableSpec.ownership_field_name) {
694
- const owner_field = await field_1.default.findOne({
669
+ const owner_field = await Field.findOne({
695
670
  table_id: _table.id,
696
671
  name: tableSpec.ownership_field_name,
697
672
  });
698
673
  await _table.update({ ownership_field_id: owner_field.id });
699
674
  }
675
+ else if (tableSpec.rls_enabled && tableSpec.ownership_formula) {
676
+ const freshTable = Table.findOne({ name: _table.name });
677
+ if (freshTable)
678
+ await freshTable.enableOwnershipRLS();
679
+ }
700
680
  }
701
681
  await getState().refresh_tables(true);
682
+ if (pack.views?.length)
683
+ log("Restoring views");
702
684
  for (const viewSpec of pack.views) {
703
685
  viewSpec.min_role = old_to_new_role(viewSpec.min_role);
704
686
  const { table, on_menu, menu_label, on_root_page, ...viewNoTable } = viewSpec;
705
- const vtable = table_1.default.findOne({ name: table });
706
- const existing = view_1.default.findOne({ name: viewNoTable.name });
687
+ const vtable = Table.findOne({ name: table });
688
+ const existing = View.findOne({ name: viewNoTable.name });
707
689
  if (existing?.id) {
708
- await view_1.default.update(viewNoTable, existing.id);
690
+ await View.update(viewNoTable, existing.id);
709
691
  }
710
692
  else {
711
- await view_1.default.create({
693
+ await View.create({
712
694
  ...viewNoTable,
713
695
  table_id: vtable ? vtable.id : null,
714
696
  });
@@ -722,37 +704,41 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
722
704
  });
723
705
  }
724
706
  await getState().refresh_views(true);
707
+ if (pack.triggers?.length)
708
+ log("Restoring triggers");
725
709
  for (const triggerSpec of pack.triggers || []) {
726
710
  triggerSpec.min_role = old_to_new_role(triggerSpec.min_role);
727
711
  let id;
728
- const existing = await trigger_1.default.findOne({ name: triggerSpec.name });
712
+ const existing = await Trigger.findOne({ name: triggerSpec.name });
729
713
  if (existing) {
730
714
  const { table_name, steps, ...tsNoTableName } = triggerSpec;
731
715
  if (table_name)
732
- tsNoTableName.table_id = table_1.default.findOne({ name: table_name })?.id;
733
- await trigger_1.default.update(existing.id, tsNoTableName);
716
+ tsNoTableName.table_id = Table.findOne({ name: table_name })?.id;
717
+ await Trigger.update(existing.id, tsNoTableName);
734
718
  id = existing.id;
735
719
  }
736
720
  else {
737
- const newTrigger = await trigger_1.default.create(triggerSpec);
721
+ const newTrigger = await Trigger.create(triggerSpec);
738
722
  id = newTrigger.id;
739
723
  }
740
724
  if (triggerSpec.action === "Workflow" && triggerSpec.steps) {
741
- await workflow_step_1.default.deleteForTrigger(id);
725
+ await WorkflowStep.deleteForTrigger(id);
742
726
  for (const step of triggerSpec.steps) {
743
- await workflow_step_1.default.create({ ...step, trigger_id: id });
727
+ await WorkflowStep.create({ ...step, trigger_id: id });
744
728
  }
745
729
  }
746
730
  }
747
731
  await getState().refresh_triggers(true);
732
+ if (pack.pages?.length)
733
+ log("Restoring pages");
748
734
  for (const pageFullSpec of pack.pages || []) {
749
735
  pageFullSpec.min_role = old_to_new_role(pageFullSpec.min_role);
750
736
  const { root_page_for_roles, menu_label, ...pageSpec } = pageFullSpec;
751
- const existing = page_1.default.findOne({ name: pageSpec.name });
737
+ const existing = Page.findOne({ name: pageSpec.name });
752
738
  if (existing?.id)
753
- await page_1.default.update(existing.id, pageSpec);
739
+ await Page.update(existing.id, pageSpec);
754
740
  else
755
- await page_1.default.create(pageSpec);
741
+ await Page.create(pageSpec);
756
742
  for (const role of root_page_for_roles || []) {
757
743
  const current_root = getState().getConfigCopy(role + "_home", "");
758
744
  if (!current_root || current_root === "")
@@ -767,51 +753,55 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
767
753
  });
768
754
  }
769
755
  await getState().refresh_pages(true);
756
+ if (pack.page_groups?.length)
757
+ log("Restoring page groups");
770
758
  for (const pageGroupSpec of pack.page_groups || []) {
771
759
  pageGroupSpec.min_role = old_to_new_role(pageGroupSpec.min_role);
772
760
  const { members, ...pageGroupNoMembers } = pageGroupSpec;
773
- let existing = page_group_1.default.findOne({ name: pageGroupSpec.name });
761
+ let existing = PageGroup.findOne({ name: pageGroupSpec.name });
774
762
  if (existing?.id) {
775
763
  await existing.clearMembers(); // or merge ?
776
- await page_group_1.default.update(existing.id, pageGroupNoMembers);
764
+ await PageGroup.update(existing.id, pageGroupNoMembers);
777
765
  }
778
766
  else
779
- existing = await page_group_1.default.create(pageGroupNoMembers);
767
+ existing = await PageGroup.create(pageGroupNoMembers);
780
768
  const group = existing;
781
769
  if (!group)
782
770
  throw new Error(`Unable to create page group '${pageGroupSpec.name}'`);
783
771
  for (const member of members || []) {
784
772
  const { page_name, ...memberNoPageName } = member;
785
- const page = page_1.default.findOne({ name: page_name });
773
+ const page = Page.findOne({ name: page_name });
786
774
  if (!page)
787
775
  throw new Error(`Unable to find page '${member.page_name}'`);
788
776
  await group.addMember({ ...memberNoPageName, page_id: page.id });
789
777
  }
790
778
  }
779
+ if (pack.tags?.length)
780
+ log("Restoring tags");
791
781
  for (const tag of pack.tags || []) {
792
782
  const entries = tag.entries
793
783
  ? tag.entries.map((e) => {
794
784
  const result = {};
795
785
  if (e.page_name) {
796
- const page = page_1.default.findOne({ name: e.page_name });
786
+ const page = Page.findOne({ name: e.page_name });
797
787
  if (!page)
798
788
  throw new Error(`Unable to find page '${e.page_name}'`);
799
789
  result.page_id = page.id;
800
790
  }
801
791
  if (e.view_name) {
802
- const view = view_1.default.findOne({ name: e.view_name });
792
+ const view = View.findOne({ name: e.view_name });
803
793
  if (!view)
804
794
  throw new Error(`Unable to find view '${e.view_name}'`);
805
795
  result.view_id = view.id;
806
796
  }
807
797
  if (e.table_name) {
808
- const table = table_1.default.findOne({ name: e.table_name });
798
+ const table = Table.findOne({ name: e.table_name });
809
799
  if (!table)
810
800
  throw new Error(`Unable to find table '${e.table_name}'`);
811
801
  result.table_id = table.id;
812
802
  }
813
803
  if (e.trigger_name) {
814
- const trigger = trigger_1.default.findOne({ name: e.trigger_name });
804
+ const trigger = Trigger.findOne({ name: e.trigger_name });
815
805
  if (!trigger)
816
806
  throw new Error(`Unable to find trigger '${e.trigger_name}'`);
817
807
  result.trigger_id = trigger.id;
@@ -819,17 +809,19 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
819
809
  return result;
820
810
  })
821
811
  : undefined;
822
- const existing = await tag_1.default.findOne({ name: tag.name });
812
+ const existing = await Tag.findOne({ name: tag.name });
823
813
  if (!existing)
824
- await tag_1.default.create({ name: tag.name, entries });
814
+ await Tag.create({ name: tag.name, entries });
825
815
  else {
826
816
  for (const entry of entries || []) {
827
- await tag_entry_1.default.create({ tag_id: existing.id, ...entry });
817
+ await TagEntry.create({ tag_id: existing.id, ...entry });
828
818
  }
829
819
  }
830
820
  }
821
+ if (pack.models?.length)
822
+ log("Restoring models");
831
823
  for (const model of pack.models || []) {
832
- const mTbl = table_1.default.findOne({ name: model.table_name });
824
+ const mTbl = Table.findOne({ name: model.table_name });
833
825
  if (!mTbl)
834
826
  throw new Error(`Unable to find table '${model.table_name}'`);
835
827
  if (!mTbl.id)
@@ -839,13 +831,13 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
839
831
  if (table_name === mTbl.name)
840
832
  cfg.table_id = mTbl.id;
841
833
  else {
842
- const cfgTbl = table_1.default.findOne({ name: table_name });
834
+ const cfgTbl = Table.findOne({ name: table_name });
843
835
  if (!cfgTbl)
844
836
  throw new Error(`Unable to find table '${table_name}'`);
845
837
  cfg.table_id = cfgTbl.id;
846
838
  }
847
839
  }
848
- const existing = await model_1.default.findOne({
840
+ const existing = await Model.findOne({
849
841
  name: model.name,
850
842
  table_id: mTbl.id,
851
843
  });
@@ -855,18 +847,20 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
855
847
  configuration: cfg,
856
848
  });
857
849
  else
858
- await model_1.default.create({
850
+ await Model.create({
859
851
  name: model.name,
860
852
  table_id: mTbl.id,
861
853
  modelpattern: model.modelpattern,
862
854
  configuration: cfg,
863
855
  });
864
856
  }
857
+ if (pack.model_instances?.length)
858
+ log("Restoring model instances");
865
859
  for (const modelInst of pack.model_instances || []) {
866
- const table = table_1.default.findOne({ name: modelInst.table_name });
860
+ const table = Table.findOne({ name: modelInst.table_name });
867
861
  if (!table)
868
862
  throw new Error(`Unable to find table '${modelInst.table_name}'`);
869
- const model = await model_1.default.findOne({
863
+ const model = await Model.findOne({
870
864
  name: modelInst.model_name,
871
865
  table_id: table.id,
872
866
  });
@@ -874,7 +868,7 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
874
868
  throw new Error(`Unable to find table '${modelInst.model_name}'`);
875
869
  const { model_name, ...mICfg } = modelInst;
876
870
  mICfg.model_id = model.id;
877
- const existing = await model_instance_1.default.findOne({
871
+ const existing = await ModelInstance.findOne({
878
872
  name: modelInst.name,
879
873
  model_id: model.id,
880
874
  });
@@ -883,20 +877,22 @@ const install_pack = async (pack, name, loadAndSaveNewPlugin, bare_tables = fals
883
877
  await existing.update(updrow);
884
878
  }
885
879
  else
886
- await model_instance_1.default.create(mICfg);
880
+ await ModelInstance.create(mICfg);
887
881
  }
882
+ if (pack.event_logs?.length)
883
+ log("Restoring event logs");
888
884
  for (const eventLog of pack.event_logs || []) {
889
885
  const { user_email, ...rest } = eventLog;
890
886
  const eventLogCfg = rest;
891
887
  if (user_email) {
892
- const user = await user_1.default.findOne({ email: user_email });
888
+ const user = await User.findOne({ email: user_email });
893
889
  if (user)
894
890
  eventLogCfg.user_id = user.id;
895
891
  else {
896
892
  getState().log(3, `User '${user_email}' not found for event log ${eventLog.event_type}`);
897
893
  }
898
894
  }
899
- await eventlog_1.default.create(eventLogCfg);
895
+ await EventLog.create(eventLogCfg);
900
896
  }
901
897
  if (pack.config) {
902
898
  const state = getState();
@@ -958,7 +954,7 @@ const fetch_available_packs_from_store = async () => {
958
954
  //const { getState } = require("../db/state");
959
955
  const packs_store_endpoint = getState().getConfig("packs_store_endpoint", false);
960
956
  //console.log(`[fetch_available_packs_from_store] packs_store_endpoint:%s`, packs_store_endpoint);
961
- const response = await (0, node_fetch_1.default)(
957
+ const response = await fetch(
962
958
  //"http://store.saltcorn.com/api/packs?fields=name,description"
963
959
  packs_store_endpoint + "?fields=name,description", getFetchProxyOptions());
964
960
  const json = await response.json();
@@ -973,7 +969,7 @@ const fetch_pack_by_name = async (name) => {
973
969
  //const { getState } = require("../db/state");
974
970
  const packs_store_endpoint = getState().getConfig("packs_store_endpoint", false);
975
971
  //console.log(`[fetch_pack_by_name] packs_store_endpoint:%s`, packs_store_endpoint);
976
- const response = await (0, node_fetch_1.default)(
972
+ const response = await fetch(
977
973
  //"http://store.saltcorn.com/api/packs?name=" + encodeURIComponent(name)
978
974
  packs_store_endpoint + "?name=" + encodeURIComponent(name), getFetchProxyOptions());
979
975
  const json = await response.json();
@@ -1026,7 +1022,7 @@ const create_pack_from_tag = async (tag) => {
1026
1022
  return pack;
1027
1023
  //TODO add models, plugins
1028
1024
  };
1029
- module.exports = {
1025
+ export default {
1030
1026
  table_pack,
1031
1027
  view_pack,
1032
1028
  plugin_pack,