@snowtop/ent 0.1.0-alpha1 → 0.1.0-alpha100

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 (172) hide show
  1. package/action/action.d.ts +38 -30
  2. package/action/action.js +22 -7
  3. package/action/executor.d.ts +4 -4
  4. package/action/executor.js +8 -3
  5. package/action/experimental_action.d.ts +32 -22
  6. package/action/experimental_action.js +35 -9
  7. package/action/index.d.ts +2 -0
  8. package/action/index.js +7 -1
  9. package/action/orchestrator.d.ts +48 -16
  10. package/action/orchestrator.js +343 -81
  11. package/action/privacy.d.ts +2 -2
  12. package/action/relative_value.d.ts +47 -0
  13. package/action/relative_value.js +125 -0
  14. package/action/transaction.d.ts +10 -0
  15. package/action/transaction.js +23 -0
  16. package/auth/auth.d.ts +1 -1
  17. package/core/base.d.ts +54 -27
  18. package/core/base.js +23 -1
  19. package/core/clause.d.ts +105 -3
  20. package/core/clause.js +563 -30
  21. package/core/config.d.ts +30 -1
  22. package/core/config.js +24 -1
  23. package/core/context.d.ts +5 -3
  24. package/core/context.js +20 -2
  25. package/core/convert.d.ts +1 -1
  26. package/core/date.js +1 -5
  27. package/core/db.d.ts +14 -11
  28. package/core/db.js +22 -8
  29. package/core/ent.d.ts +82 -28
  30. package/core/ent.js +692 -202
  31. package/core/loaders/assoc_count_loader.d.ts +3 -2
  32. package/core/loaders/assoc_count_loader.js +10 -2
  33. package/core/loaders/assoc_edge_loader.d.ts +3 -3
  34. package/core/loaders/assoc_edge_loader.js +13 -15
  35. package/core/loaders/index.d.ts +1 -1
  36. package/core/loaders/index.js +1 -3
  37. package/core/loaders/index_loader.d.ts +2 -2
  38. package/core/loaders/index_loader.js +1 -0
  39. package/core/loaders/loader.js +5 -5
  40. package/core/loaders/object_loader.d.ts +13 -7
  41. package/core/loaders/object_loader.js +95 -32
  42. package/core/loaders/query_loader.d.ts +6 -12
  43. package/core/loaders/query_loader.js +52 -11
  44. package/core/loaders/raw_count_loader.d.ts +2 -2
  45. package/core/loaders/raw_count_loader.js +5 -1
  46. package/core/logger.d.ts +1 -1
  47. package/core/logger.js +1 -0
  48. package/core/privacy.d.ts +26 -25
  49. package/core/privacy.js +23 -24
  50. package/core/query/assoc_query.d.ts +7 -6
  51. package/core/query/assoc_query.js +9 -1
  52. package/core/query/custom_clause_query.d.ts +26 -0
  53. package/core/query/custom_clause_query.js +78 -0
  54. package/core/query/custom_query.d.ts +20 -5
  55. package/core/query/custom_query.js +87 -12
  56. package/core/query/index.d.ts +1 -0
  57. package/core/query/index.js +3 -1
  58. package/core/query/query.d.ts +8 -4
  59. package/core/query/query.js +101 -53
  60. package/core/query/shared_assoc_test.d.ts +2 -1
  61. package/core/query/shared_assoc_test.js +35 -45
  62. package/core/query/shared_test.d.ts +8 -1
  63. package/core/query/shared_test.js +469 -236
  64. package/core/viewer.d.ts +4 -3
  65. package/core/viewer.js +5 -1
  66. package/graphql/builtins/connection.js +3 -3
  67. package/graphql/builtins/edge.js +2 -2
  68. package/graphql/builtins/node.js +1 -1
  69. package/graphql/graphql.d.ts +17 -9
  70. package/graphql/graphql.js +47 -30
  71. package/graphql/index.d.ts +1 -1
  72. package/graphql/index.js +3 -4
  73. package/graphql/mutations/union.d.ts +2 -0
  74. package/graphql/mutations/union.js +35 -0
  75. package/graphql/node_resolver.d.ts +0 -1
  76. package/graphql/query/connection_type.d.ts +9 -9
  77. package/graphql/query/connection_type.js +6 -6
  78. package/graphql/query/edge_connection.d.ts +9 -9
  79. package/graphql/query/page_info.d.ts +1 -1
  80. package/graphql/query/page_info.js +4 -4
  81. package/graphql/query/shared_assoc_test.js +3 -3
  82. package/graphql/query/shared_edge_connection.js +1 -19
  83. package/graphql/scalars/time.d.ts +1 -1
  84. package/imports/index.d.ts +6 -1
  85. package/imports/index.js +19 -4
  86. package/index.d.ts +23 -1
  87. package/index.js +32 -6
  88. package/package.json +18 -17
  89. package/parse_schema/parse.d.ts +45 -8
  90. package/parse_schema/parse.js +193 -15
  91. package/schema/base_schema.d.ts +38 -1
  92. package/schema/base_schema.js +53 -2
  93. package/schema/field.d.ts +75 -21
  94. package/schema/field.js +185 -72
  95. package/schema/index.d.ts +4 -2
  96. package/schema/index.js +15 -2
  97. package/schema/json_field.d.ts +13 -1
  98. package/schema/json_field.js +28 -1
  99. package/schema/schema.d.ts +125 -10
  100. package/schema/schema.js +133 -5
  101. package/schema/struct_field.d.ts +27 -0
  102. package/schema/struct_field.js +138 -0
  103. package/schema/union_field.d.ts +23 -0
  104. package/schema/union_field.js +79 -0
  105. package/scripts/custom_compiler.js +10 -6
  106. package/scripts/custom_graphql.js +224 -36
  107. package/scripts/{transform_schema.d.ts → migrate_v0.1.d.ts} +0 -0
  108. package/scripts/migrate_v0.1.js +36 -0
  109. package/scripts/move_types.d.ts +1 -0
  110. package/scripts/move_types.js +117 -0
  111. package/scripts/read_schema.js +35 -6
  112. package/testutils/action/complex_schemas.d.ts +69 -0
  113. package/testutils/action/complex_schemas.js +398 -0
  114. package/testutils/builder.d.ts +52 -49
  115. package/testutils/builder.js +143 -44
  116. package/testutils/context/test_context.d.ts +2 -2
  117. package/testutils/context/test_context.js +7 -1
  118. package/testutils/db/fixture.d.ts +10 -0
  119. package/testutils/db/fixture.js +26 -0
  120. package/testutils/db/{test_db.d.ts → temp_db.d.ts} +26 -9
  121. package/testutils/db/{test_db.js → temp_db.js} +190 -46
  122. package/testutils/db/value.d.ts +7 -0
  123. package/testutils/db/value.js +251 -0
  124. package/testutils/db_mock.d.ts +16 -4
  125. package/testutils/db_mock.js +51 -6
  126. package/testutils/db_time_zone.d.ts +4 -0
  127. package/testutils/db_time_zone.js +41 -0
  128. package/testutils/ent-graphql-tests/index.d.ts +9 -1
  129. package/testutils/ent-graphql-tests/index.js +53 -25
  130. package/testutils/fake_data/const.d.ts +2 -1
  131. package/testutils/fake_data/const.js +3 -0
  132. package/testutils/fake_data/fake_contact.d.ts +10 -10
  133. package/testutils/fake_data/fake_contact.js +23 -21
  134. package/testutils/fake_data/fake_event.d.ts +8 -9
  135. package/testutils/fake_data/fake_event.js +25 -28
  136. package/testutils/fake_data/fake_tag.d.ts +36 -0
  137. package/testutils/fake_data/fake_tag.js +89 -0
  138. package/testutils/fake_data/fake_user.d.ts +10 -11
  139. package/testutils/fake_data/fake_user.js +20 -23
  140. package/testutils/fake_data/index.js +5 -1
  141. package/testutils/fake_data/internal.d.ts +2 -0
  142. package/testutils/fake_data/internal.js +7 -1
  143. package/testutils/fake_data/tag_query.d.ts +13 -0
  144. package/testutils/fake_data/tag_query.js +43 -0
  145. package/testutils/fake_data/test_helpers.d.ts +11 -4
  146. package/testutils/fake_data/test_helpers.js +29 -13
  147. package/testutils/fake_data/user_query.d.ts +13 -6
  148. package/testutils/fake_data/user_query.js +54 -22
  149. package/testutils/fake_log.d.ts +3 -3
  150. package/testutils/parse_sql.d.ts +6 -0
  151. package/testutils/parse_sql.js +16 -2
  152. package/testutils/test_edge_global_schema.d.ts +15 -0
  153. package/testutils/test_edge_global_schema.js +62 -0
  154. package/testutils/write.d.ts +2 -2
  155. package/testutils/write.js +33 -7
  156. package/tsc/ast.d.ts +44 -0
  157. package/tsc/ast.js +277 -0
  158. package/tsc/compilerOptions.d.ts +6 -0
  159. package/tsc/compilerOptions.js +45 -2
  160. package/tsc/move_generated.d.ts +1 -0
  161. package/tsc/move_generated.js +164 -0
  162. package/tsc/transform.d.ts +22 -0
  163. package/tsc/transform.js +181 -0
  164. package/tsc/transform_action.d.ts +22 -0
  165. package/tsc/transform_action.js +183 -0
  166. package/tsc/transform_ent.d.ts +17 -0
  167. package/tsc/transform_ent.js +59 -0
  168. package/tsc/transform_schema.d.ts +27 -0
  169. package/tsc/transform_schema.js +383 -0
  170. package/graphql/enums.d.ts +0 -3
  171. package/graphql/enums.js +0 -25
  172. package/scripts/transform_schema.js +0 -288
@@ -1,79 +1,81 @@
1
- import { Ent, ID, Viewer, Data, EntConstructor } from "../core/base";
1
+ import { Ent, ID, Viewer, Data, EntConstructor, PrivacyPolicy } from "../core/base";
2
2
  import { Orchestrator } from "../action/orchestrator";
3
3
  import { Action, Builder, Changeset, WriteOperation, Validator, Trigger, Observer } from "../action";
4
- import { Schema } from "../schema";
5
- export declare class User implements Ent {
4
+ import { FieldMap, Schema } from "../schema";
5
+ import { SchemaConfig, EntSchema } from "../schema/base_schema";
6
+ import { FieldInfoMap } from "../schema/schema";
7
+ import { Clause } from "src/core/clause";
8
+ export declare class BaseEnt {
9
+ viewer: Viewer;
10
+ readonly data: Data;
11
+ readonly id: ID;
12
+ constructor(viewer: Viewer, data: Data);
13
+ getKey(): string;
14
+ getPrivacyPolicy(): PrivacyPolicy;
15
+ __setRawDBData(data: Data): void;
16
+ }
17
+ export declare class User extends BaseEnt implements Ent {
6
18
  viewer: Viewer;
7
19
  data: Data;
8
- id: ID;
9
20
  accountID: string;
10
21
  nodeType: string;
11
- privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
12
22
  firstName: string;
13
23
  constructor(viewer: Viewer, data: Data);
14
24
  }
15
- export declare class Event implements Ent {
16
- viewer: Viewer;
17
- data: Data;
18
- id: ID;
25
+ export declare class Event extends BaseEnt implements Ent {
19
26
  accountID: string;
20
27
  nodeType: string;
21
- privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
22
- constructor(viewer: Viewer, data: Data);
23
28
  }
24
- export declare class Contact implements Ent {
25
- viewer: Viewer;
26
- data: Data;
27
- id: ID;
29
+ export declare class Contact extends BaseEnt implements Ent {
28
30
  accountID: string;
29
31
  nodeType: string;
30
- privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
31
- constructor(viewer: Viewer, data: Data);
32
+ getPrivacyPolicy(): PrivacyPolicy<this>;
32
33
  }
33
- export declare class Group implements Ent {
34
- viewer: Viewer;
35
- data: Data;
36
- id: ID;
34
+ export declare class Group extends BaseEnt implements Ent {
37
35
  accountID: string;
38
36
  nodeType: string;
39
- privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
40
- constructor(viewer: Viewer, data: Data);
37
+ getPrivacyPolicy(): PrivacyPolicy<this>;
41
38
  }
42
- export declare class Message implements Ent {
43
- viewer: Viewer;
44
- data: Data;
45
- id: ID;
39
+ export declare class Message extends BaseEnt implements Ent {
46
40
  accountID: string;
47
41
  nodeType: string;
48
- privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
49
- constructor(viewer: Viewer, data: Data);
50
42
  }
51
- export declare class Address implements Ent {
52
- viewer: Viewer;
53
- data: Data;
54
- id: ID;
43
+ export declare class Address extends BaseEnt implements Ent {
55
44
  accountID: string;
56
45
  nodeType: string;
57
- privacyPolicy: import("../core/base").PrivacyPolicy<Ent>;
58
- constructor(viewer: Viewer, data: Data);
59
46
  }
60
47
  export interface BuilderSchema<T extends Ent> extends Schema {
61
48
  ent: EntConstructor<T>;
62
49
  }
50
+ export declare class EntBuilderSchema<T extends Ent> extends EntSchema {
51
+ ent: EntConstructor<T>;
52
+ constructor(ent: EntConstructor<T>, cfg: SchemaConfig);
53
+ }
54
+ export declare function getBuilderSchema<T extends Ent>(cfg: SchemaConfig, ent: EntConstructor<T>): BuilderSchema<T>;
55
+ export declare function getBuilderSchemaFromFields<T extends Ent>(fields: FieldMap, ent: EntConstructor<T>, opts?: Partial<Exclude<SchemaConfig, "fields">>): BuilderSchema<T>;
56
+ export declare function getBuilderSchemaTZFromFields<T extends Ent>(fields: FieldMap, ent: EntConstructor<T>): BuilderSchema<T>;
63
57
  export declare function getSchemaName(value: BuilderSchema<Ent>): string;
64
58
  export declare function getTableName(value: BuilderSchema<Ent>): string;
65
- export declare class SimpleBuilder<T extends Ent> implements Builder<T> {
59
+ export declare function getFieldInfo(value: BuilderSchema<Ent>): FieldInfoMap;
60
+ type MaybeNull<T extends Ent> = T | null;
61
+ type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
62
+ export declare class SimpleBuilder<T extends Ent, TExistingEnt extends TMaybleNullableEnt<T> = MaybeNull<T>> implements Builder<T, Viewer, TExistingEnt> {
66
63
  viewer: Viewer;
67
64
  private schema;
68
65
  operation: WriteOperation;
69
- existingEnt: T | undefined;
70
- ent: EntConstructor<T>;
66
+ existingEnt: TExistingEnt;
67
+ ent: EntConstructor<T, Viewer>;
71
68
  placeholderID: ID;
72
- orchestrator: Orchestrator<T, Data>;
69
+ orchestrator: Orchestrator<T, Data, Viewer, TExistingEnt>;
73
70
  fields: Map<string, any>;
74
71
  nodeType: string;
75
- constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined, action?: Action<T, SimpleBuilder<T>, Data> | undefined);
76
- build(): Promise<Changeset<T>>;
72
+ m: Map<string, any>;
73
+ constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation, existingEnt: TExistingEnt, action?: Action<T, SimpleBuilder<T, TExistingEnt>, Viewer, Data, TExistingEnt> | undefined, expressions?: Map<string, Clause>);
74
+ getInput(): Data;
75
+ updateInput(input: Data): void;
76
+ storeData(k: string, v: any): void;
77
+ getStoredData(k: string): any;
78
+ build(): Promise<Changeset>;
77
79
  editedEnt(): Promise<T | null>;
78
80
  editedEntX(): Promise<T>;
79
81
  save(): Promise<void>;
@@ -84,20 +86,21 @@ export declare class SimpleBuilder<T extends Ent> implements Builder<T> {
84
86
  interface viewerEntLoadFunc {
85
87
  (data: Data): Viewer | Promise<Viewer>;
86
88
  }
87
- export declare class SimpleAction<T extends Ent> implements Action<T, SimpleBuilder<T>, Data> {
89
+ export declare class SimpleAction<T extends Ent, TExistingEnt extends TMaybleNullableEnt<T> = MaybeNull<T>> implements Action<T, SimpleBuilder<T, TExistingEnt>, Viewer, Data, TExistingEnt> {
88
90
  viewer: Viewer;
89
91
  private fields;
90
- builder: SimpleBuilder<T>;
91
- validators: Validator<SimpleBuilder<T>, Data>[];
92
- triggers: Trigger<SimpleBuilder<T>, Data>[];
93
- observers: Observer<SimpleBuilder<T>, Data>[];
92
+ builder: SimpleBuilder<T, TExistingEnt>;
94
93
  viewerForEntLoad: viewerEntLoadFunc | undefined;
95
- constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation?: WriteOperation, existingEnt?: T | undefined);
96
- getPrivacyPolicy(): import("../core/base").PrivacyPolicy<Ent>;
94
+ constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation | undefined, existingEnt: TExistingEnt, expressions?: Map<string, Clause>);
95
+ getTriggers(): (Trigger<T, SimpleBuilder<T>> | Array<Trigger<T, SimpleBuilder<T>>>)[];
96
+ getValidators(): Validator<T, SimpleBuilder<T>>[];
97
+ getObservers(): Observer<T, SimpleBuilder<T>>[];
98
+ getPrivacyPolicy(): PrivacyPolicy<Ent<Viewer<Ent<any> | null, ID | null>>, Viewer<Ent<any> | null, ID | null>>;
97
99
  getInput(): Data;
98
- changeset(): Promise<Changeset<T>>;
100
+ changeset(): Promise<Changeset>;
99
101
  valid(): Promise<boolean>;
100
102
  validX(): Promise<void>;
103
+ validWithErrors(): Promise<Error[]>;
101
104
  save(): Promise<T | null>;
102
105
  saveX(): Promise<T>;
103
106
  editedEnt(): Promise<T | null>;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SimpleAction = exports.SimpleBuilder = exports.getTableName = exports.getSchemaName = exports.Address = exports.Message = exports.Group = exports.Contact = exports.Event = exports.User = void 0;
6
+ exports.SimpleAction = exports.SimpleBuilder = exports.getFieldInfo = exports.getTableName = exports.getSchemaName = exports.getBuilderSchemaTZFromFields = exports.getBuilderSchemaFromFields = exports.getBuilderSchema = exports.EntBuilderSchema = exports.Address = exports.Message = exports.Group = exports.Contact = exports.Event = exports.User = exports.BaseEnt = void 0;
7
7
  const privacy_1 = require("../core/privacy");
8
8
  const orchestrator_1 = require("../action/orchestrator");
9
9
  const action_1 = require("../action");
@@ -14,77 +14,112 @@ const snake_case_1 = require("snake-case");
14
14
  const loaders_1 = require("../core/loaders");
15
15
  const convert_1 = require("../core/convert");
16
16
  const camel_case_1 = require("camel-case");
17
- class User {
17
+ const base_schema_1 = require("../schema/base_schema");
18
+ const schema_2 = require("../schema/schema");
19
+ class BaseEnt {
18
20
  constructor(viewer, data) {
19
21
  this.viewer = viewer;
20
22
  this.data = data;
21
- this.accountID = "";
22
- this.nodeType = "User";
23
- this.privacyPolicy = privacy_1.AlwaysAllowPrivacyPolicy;
24
23
  this.data.created_at = (0, convert_1.convertDate)(data.created_at);
25
24
  this.data.updated_at = (0, convert_1.convertDate)(data.updated_at);
26
- this.id = data.id;
27
- this.firstName = data.first_name;
25
+ this.id = data[this.getKey()];
26
+ }
27
+ getKey() {
28
+ return "id";
29
+ }
30
+ getPrivacyPolicy() {
31
+ return privacy_1.AlwaysAllowPrivacyPolicy;
32
+ }
33
+ __setRawDBData(data) {
34
+ // doesn't apply here so ignore...
28
35
  }
29
36
  }
30
- exports.User = User;
31
- class Event {
37
+ exports.BaseEnt = BaseEnt;
38
+ class User extends BaseEnt {
32
39
  constructor(viewer, data) {
40
+ super(viewer, data);
33
41
  this.viewer = viewer;
34
42
  this.data = data;
35
43
  this.accountID = "";
44
+ this.nodeType = "User";
45
+ this.firstName = data.first_name;
46
+ }
47
+ }
48
+ exports.User = User;
49
+ class Event extends BaseEnt {
50
+ constructor() {
51
+ super(...arguments);
52
+ this.accountID = "";
36
53
  this.nodeType = "Event";
37
- this.privacyPolicy = privacy_1.AlwaysAllowPrivacyPolicy;
38
- this.id = data.id;
39
54
  }
40
55
  }
41
56
  exports.Event = Event;
42
- class Contact {
43
- constructor(viewer, data) {
44
- this.viewer = viewer;
45
- this.data = data;
57
+ class Contact extends BaseEnt {
58
+ constructor() {
59
+ super(...arguments);
46
60
  this.accountID = "";
47
61
  this.nodeType = "Contact";
48
- this.privacyPolicy = privacy_1.AlwaysAllowPrivacyPolicy;
49
- this.data.created_at = (0, convert_1.convertDate)(data.created_at);
50
- this.data.updated_at = (0, convert_1.convertDate)(data.updated_at);
51
- this.id = data.id;
62
+ }
63
+ getPrivacyPolicy() {
64
+ return privacy_1.AlwaysAllowPrivacyPolicy;
52
65
  }
53
66
  }
54
67
  exports.Contact = Contact;
55
- class Group {
56
- constructor(viewer, data) {
57
- this.viewer = viewer;
58
- this.data = data;
68
+ class Group extends BaseEnt {
69
+ constructor() {
70
+ super(...arguments);
59
71
  this.accountID = "";
60
72
  this.nodeType = "Group";
61
- this.privacyPolicy = privacy_1.AlwaysAllowPrivacyPolicy;
62
- this.id = data.id;
73
+ }
74
+ getPrivacyPolicy() {
75
+ return privacy_1.AlwaysAllowPrivacyPolicy;
63
76
  }
64
77
  }
65
78
  exports.Group = Group;
66
- class Message {
67
- constructor(viewer, data) {
68
- this.viewer = viewer;
69
- this.data = data;
79
+ class Message extends BaseEnt {
80
+ constructor() {
81
+ super(...arguments);
70
82
  this.accountID = "";
71
83
  this.nodeType = "Message";
72
- this.privacyPolicy = privacy_1.AlwaysAllowPrivacyPolicy;
73
- this.id = data.id;
74
84
  }
75
85
  }
76
86
  exports.Message = Message;
77
- class Address {
78
- constructor(viewer, data) {
79
- this.viewer = viewer;
80
- this.data = data;
87
+ class Address extends BaseEnt {
88
+ constructor() {
89
+ super(...arguments);
81
90
  this.accountID = "";
82
91
  this.nodeType = "Address";
83
- this.privacyPolicy = privacy_1.AlwaysAllowPrivacyPolicy;
84
- this.id = data.id;
85
92
  }
86
93
  }
87
94
  exports.Address = Address;
95
+ class EntBuilderSchema extends base_schema_1.EntSchema {
96
+ constructor(ent, cfg) {
97
+ super(cfg);
98
+ this.ent = ent;
99
+ }
100
+ }
101
+ exports.EntBuilderSchema = EntBuilderSchema;
102
+ function getBuilderSchema(cfg, ent) {
103
+ return {
104
+ ...new base_schema_1.EntSchema(cfg),
105
+ ent,
106
+ };
107
+ }
108
+ exports.getBuilderSchema = getBuilderSchema;
109
+ function getBuilderSchemaFromFields(fields, ent, opts) {
110
+ return {
111
+ ...new base_schema_1.EntSchema({ ...opts, fields }),
112
+ ent,
113
+ };
114
+ }
115
+ exports.getBuilderSchemaFromFields = getBuilderSchemaFromFields;
116
+ function getBuilderSchemaTZFromFields(fields, ent) {
117
+ return {
118
+ ...new base_schema_1.EntSchemaWithTZ({ fields }),
119
+ ent,
120
+ };
121
+ }
122
+ exports.getBuilderSchemaTZFromFields = getBuilderSchemaTZFromFields;
88
123
  function getSchemaName(value) {
89
124
  return value.ent.name;
90
125
  }
@@ -96,13 +131,27 @@ exports.getTableName = getTableName;
96
131
  function randomNum() {
97
132
  return Math.random().toString(10).substring(2);
98
133
  }
134
+ function getFieldInfo(value) {
135
+ const fields = (0, schema_1.getFields)(value);
136
+ let ret = {};
137
+ for (const [k, f] of fields) {
138
+ ret[k] = {
139
+ dbCol: (0, schema_2.getStorageKey)(f, k),
140
+ // in tests (anything using SimpleBuilder), make it be the same as the fieldName
141
+ inputKey: k,
142
+ };
143
+ }
144
+ return ret;
145
+ }
146
+ exports.getFieldInfo = getFieldInfo;
99
147
  // reuses orchestrator and standard things
100
148
  class SimpleBuilder {
101
- constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt = undefined, action) {
149
+ constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt, action, expressions) {
102
150
  this.viewer = viewer;
103
151
  this.schema = schema;
104
152
  this.operation = operation;
105
153
  this.existingEnt = existingEnt;
154
+ this.m = new Map();
106
155
  // create dynamic placeholder
107
156
  // TODO: do we need to use this as the node when there's an existingEnt
108
157
  // same for generated builders.
@@ -128,11 +177,13 @@ class SimpleBuilder {
128
177
  this.ent = schema.ent;
129
178
  const tableName = getTableName(schema);
130
179
  this.nodeType = (0, camel_case_1.camelCase)(schema.ent.name);
180
+ const fieldInfo = getFieldInfo(schema);
131
181
  this.orchestrator = new orchestrator_1.Orchestrator({
132
182
  viewer: this.viewer,
133
183
  operation: operation,
134
184
  tableName: tableName,
135
185
  key,
186
+ fieldInfo,
136
187
  loaderOptions: {
137
188
  loaderFactory: new loaders_1.ObjectLoaderFactory({
138
189
  tableName: tableName,
@@ -142,15 +193,54 @@ class SimpleBuilder {
142
193
  ent: schema.ent,
143
194
  tableName: tableName,
144
195
  fields: [],
196
+ fieldPrivacy: (0, schema_1.getFieldsWithPrivacy)(schema, fieldInfo),
145
197
  },
146
198
  builder: this,
147
199
  action: action,
200
+ expressions,
148
201
  schema: this.schema,
149
202
  editedFields: () => {
150
- return this.fields;
203
+ // to simulate what we do in generated builders where we return a new Map
204
+ const m = new Map();
205
+ for (const [k, v] of this.fields) {
206
+ m.set(k, v);
207
+ }
208
+ return m;
151
209
  },
210
+ updateInput: this.updateInput.bind(this),
152
211
  });
153
212
  }
213
+ getInput() {
214
+ let ret = {};
215
+ for (const [k, v] of this.fields) {
216
+ ret[k] = v;
217
+ }
218
+ return ret;
219
+ }
220
+ updateInput(input) {
221
+ const knownFields = (0, schema_1.getFields)(this.schema);
222
+ for (const k in input) {
223
+ if (knownFields.has(k)) {
224
+ this.fields.set(k, input[k]);
225
+ }
226
+ else {
227
+ // related to #510. we do camelCase to pass fields in here but fields may be snakeCase and we want that to pass in tests
228
+ // we do camelCase in
229
+ const sc = (0, snake_case_1.snakeCase)(k);
230
+ if (knownFields.has(sc)) {
231
+ this.fields.set(sc, input[k]);
232
+ }
233
+ }
234
+ }
235
+ }
236
+ // store data in Builder that can be retrieved by another validator, trigger, observer later in the action
237
+ storeData(k, v) {
238
+ this.m.set(k, v);
239
+ }
240
+ // retrieve data stored in this Builder with key
241
+ getStoredData(k) {
242
+ return this.m.get(k);
243
+ }
154
244
  build() {
155
245
  return this.orchestrator.build();
156
246
  }
@@ -175,13 +265,19 @@ class SimpleBuilder {
175
265
  }
176
266
  exports.SimpleBuilder = SimpleBuilder;
177
267
  class SimpleAction {
178
- constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt = undefined) {
268
+ constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt, expressions) {
179
269
  this.viewer = viewer;
180
270
  this.fields = fields;
181
- this.validators = [];
182
- this.triggers = [];
183
- this.observers = [];
184
- this.builder = new SimpleBuilder(this.viewer, schema, fields, operation, existingEnt, this);
271
+ this.builder = new SimpleBuilder(this.viewer, schema, fields, operation, existingEnt, this, expressions);
272
+ }
273
+ getTriggers() {
274
+ return [];
275
+ }
276
+ getValidators() {
277
+ return [];
278
+ }
279
+ getObservers() {
280
+ return [];
185
281
  }
186
282
  getPrivacyPolicy() {
187
283
  return privacy_1.AlwaysAllowPrivacyPolicy;
@@ -202,6 +298,9 @@ class SimpleAction {
202
298
  validX() {
203
299
  return this.builder.orchestrator.validX();
204
300
  }
301
+ validWithErrors() {
302
+ return this.builder.orchestrator.validWithErrors();
303
+ }
205
304
  async save() {
206
305
  await (0, action_1.saveBuilder)(this.builder);
207
306
  if (this.builder.operation !== action_1.WriteOperation.Delete) {
@@ -1,8 +1,8 @@
1
1
  import { Context, Viewer } from "../../core/base";
2
2
  import { ContextCache } from "../../core/context";
3
- import { LoggedOutViewer } from "../../core/viewer";
4
3
  export declare class TestContext implements Context {
4
+ constructor(viewer?: Viewer);
5
5
  cache: ContextCache;
6
- viewer: LoggedOutViewer;
6
+ viewer: Viewer;
7
7
  getViewer(): Viewer;
8
8
  }
@@ -4,9 +4,15 @@ exports.TestContext = void 0;
4
4
  const context_1 = require("../../core/context");
5
5
  const viewer_1 = require("../../core/viewer");
6
6
  class TestContext {
7
- constructor() {
7
+ constructor(viewer) {
8
8
  this.cache = new context_1.ContextCache();
9
9
  this.viewer = new viewer_1.LoggedOutViewer(this);
10
+ if (viewer) {
11
+ this.viewer = viewer;
12
+ if (viewer.setContext !== undefined) {
13
+ viewer.setContext(this);
14
+ }
15
+ }
10
16
  }
11
17
  getViewer() {
12
18
  return this.viewer;
@@ -0,0 +1,10 @@
1
+ import { Client } from "pg";
2
+ import { Data } from "../../core/base";
3
+ import { Schema } from "../../schema";
4
+ interface Options {
5
+ overrides?: Data;
6
+ client: Client;
7
+ tableName: string;
8
+ }
9
+ export declare function writeFixture(schema: Schema, opts: Options): Promise<void>;
10
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeFixture = void 0;
4
+ const schema_1 = require("../../schema");
5
+ const value_1 = require("./value");
6
+ const ent_1 = require("../../core/ent");
7
+ async function writeFixture(schema, opts) {
8
+ const fields = (0, schema_1.getFields)(schema);
9
+ const d = {};
10
+ for (const [fieldName, field] of fields) {
11
+ const col = (0, schema_1.getStorageKey)(field, fieldName);
12
+ const val = (0, value_1.getDefaultValue)(field, col);
13
+ d[col] = val;
14
+ }
15
+ if (opts.overrides) {
16
+ for (const k in opts.overrides) {
17
+ d[k] = opts.overrides[k];
18
+ }
19
+ }
20
+ const q = (0, ent_1.buildInsertQuery)({
21
+ tableName: opts.tableName,
22
+ fields: d,
23
+ });
24
+ await opts.client.query(q[0], q[1]);
25
+ }
26
+ exports.writeFixture = writeFixture;
@@ -1,6 +1,7 @@
1
1
  import { Client as PGClient } from "pg";
2
2
  import { Dialect } from "../../core/db";
3
3
  import { Database as SqliteDatabase } from "better-sqlite3";
4
+ import { Field } from "../../schema";
4
5
  import { BuilderSchema } from "../builder";
5
6
  import { Ent } from "../../core/base";
6
7
  interface SchemaItem {
@@ -12,6 +13,7 @@ interface Column extends SchemaItem {
12
13
  primaryKey?: boolean;
13
14
  unique?: boolean;
14
15
  default?: string;
16
+ index?: boolean | indexOptions;
15
17
  foreignKey?: {
16
18
  table: string;
17
19
  col: string;
@@ -20,22 +22,32 @@ interface Column extends SchemaItem {
20
22
  interface Constraint extends SchemaItem {
21
23
  generate(): string;
22
24
  }
25
+ interface Index extends SchemaItem {
26
+ generate(): string;
27
+ postCreate?(): boolean;
28
+ }
23
29
  export interface CoreConcept {
24
30
  name: string;
25
31
  create(): string;
32
+ postCreate?(): string[];
26
33
  drop(): string;
27
34
  }
28
35
  export interface Table extends CoreConcept {
29
36
  columns: Column[];
30
37
  constraints?: Constraint[];
31
38
  }
32
- declare type options = Pick<Column, "nullable" | "primaryKey" | "default" | "foreignKey" | "unique">;
39
+ type options = Pick<Column, "nullable" | "primaryKey" | "default" | "foreignKey" | "unique" | "index">;
33
40
  export declare function primaryKey(name: string, cols: string[]): Constraint;
34
41
  export declare function foreignKey(name: string, cols: string[], fkey: {
35
42
  table: string;
36
43
  cols: string[];
37
44
  }): Constraint;
38
- export declare function uniqueIndex(name: string): Constraint;
45
+ export declare function check(name: string, condition: string): Constraint;
46
+ interface indexOptions {
47
+ type?: string;
48
+ unique?: boolean;
49
+ }
50
+ export declare function index(tableName: string, cols: string[], opts?: indexOptions): Index;
39
51
  export declare function uuid(name: string, opts?: options): Column;
40
52
  export declare function text(name: string, opts?: options): Column;
41
53
  export declare function enumCol(name: string, type: string): Column;
@@ -67,23 +79,28 @@ export declare class TempDB {
67
79
  private tables;
68
80
  private dialect;
69
81
  private sqlite;
70
- constructor(dialect: Dialect, tables?: CoreConcept[]);
71
- constructor(tables: CoreConcept[]);
82
+ private setTables;
83
+ constructor(dialect: Dialect, tables?: CoreConcept[] | (() => CoreConcept[]));
72
84
  getDialect(): Dialect;
73
- getTables(): Map<string, CoreConcept>;
74
- beforeAll(): Promise<void>;
85
+ __getTables(): Map<string, CoreConcept>;
86
+ beforeAll(setupConnString?: boolean): Promise<void>;
87
+ createImpl(table: CoreConcept): Promise<void>;
75
88
  getSqliteClient(): SqliteDatabase;
76
89
  getPostgresClient(): PGClient;
77
90
  afterAll(): Promise<void>;
91
+ getDB(): string;
78
92
  dropAll(): Promise<void>;
79
93
  drop(...tables: string[]): Promise<void>;
80
94
  create(...tables: CoreConcept[]): Promise<void>;
81
95
  }
82
96
  export declare function assoc_edge_config_table(): Table;
83
- export declare function assoc_edge_table(name: string): Table;
84
- interface sqliteSetupOptions {
97
+ export declare function assoc_edge_table(name: string, global?: boolean): Table;
98
+ interface setupOptions {
85
99
  disableDeleteAfterEachTest?: boolean;
86
100
  }
87
- export declare function setupSqlite(connString: string, tables: () => Table[], opts?: sqliteSetupOptions): void;
101
+ export declare function setupSqlite(connString: string, tables: () => Table[], opts?: setupOptions): TempDB;
102
+ export declare function setupPostgres(tables: () => Table[], opts?: setupOptions): void;
103
+ export declare function doSQLiteTestFromSchemas(schemas: BuilderSchema<Ent>[], doTest: () => Promise<void>, db?: string): Promise<TempDB>;
88
104
  export declare function getSchemaTable(schema: BuilderSchema<Ent>, dialect: Dialect): Table;
105
+ export declare function getColumnFromField(fieldName: string, f: Field, dialect: Dialect): Column;
89
106
  export {};