@snowtop/ent 0.1.0-alpha160-test5 → 0.1.0-alpha160-test7
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/package.json +64 -0
- package/package.json +52 -7
- package/src/action/action.ts +330 -0
- package/src/action/executor.ts +453 -0
- package/src/action/experimental_action.ts +277 -0
- package/src/action/index.ts +31 -0
- package/src/action/operations.ts +967 -0
- package/src/action/orchestrator.ts +1527 -0
- package/src/action/privacy.ts +37 -0
- package/src/action/relative_value.ts +242 -0
- package/src/action/transaction.ts +38 -0
- package/src/auth/auth.ts +77 -0
- package/src/auth/index.ts +8 -0
- package/src/core/base.ts +367 -0
- package/src/core/clause.ts +1065 -0
- package/src/core/config.ts +219 -0
- package/src/core/const.ts +5 -0
- package/src/core/context.ts +135 -0
- package/src/core/convert.ts +106 -0
- package/src/core/date.ts +23 -0
- package/src/core/db.ts +498 -0
- package/src/core/ent.ts +1740 -0
- package/src/core/global_schema.ts +49 -0
- package/src/core/loaders/assoc_count_loader.ts +99 -0
- package/src/core/loaders/assoc_edge_loader.ts +250 -0
- package/src/core/loaders/index.ts +12 -0
- package/src/core/loaders/loader.ts +66 -0
- package/src/core/loaders/object_loader.ts +489 -0
- package/src/core/loaders/query_loader.ts +314 -0
- package/src/core/loaders/raw_count_loader.ts +175 -0
- package/src/core/logger.ts +49 -0
- package/src/core/privacy.ts +660 -0
- package/src/core/query/assoc_query.ts +240 -0
- package/src/core/query/custom_clause_query.ts +174 -0
- package/src/core/query/custom_query.ts +302 -0
- package/src/core/query/index.ts +9 -0
- package/src/core/query/query.ts +674 -0
- package/src/core/query_impl.ts +32 -0
- package/src/core/viewer.ts +52 -0
- package/src/ent.code-workspace +73 -0
- package/src/graphql/builtins/connection.ts +25 -0
- package/src/graphql/builtins/edge.ts +16 -0
- package/src/graphql/builtins/node.ts +12 -0
- package/src/graphql/graphql.ts +891 -0
- package/src/graphql/graphql_field_helpers.ts +221 -0
- package/src/graphql/index.ts +42 -0
- package/src/graphql/mutations/union.ts +39 -0
- package/src/graphql/node_resolver.ts +122 -0
- package/src/graphql/query/connection_type.ts +113 -0
- package/src/graphql/query/edge_connection.ts +171 -0
- package/src/graphql/query/page_info.ts +34 -0
- package/src/graphql/query/shared_edge_connection.ts +287 -0
- package/src/graphql/scalars/orderby_direction.ts +13 -0
- package/src/graphql/scalars/time.ts +38 -0
- package/src/imports/dataz/example1/_auth.ts +51 -0
- package/src/imports/dataz/example1/_viewer.ts +35 -0
- package/src/imports/index.ts +213 -0
- package/src/index.ts +145 -0
- package/src/parse_schema/parse.ts +585 -0
- package/src/schema/base_schema.ts +224 -0
- package/src/schema/field.ts +1087 -0
- package/src/schema/index.ts +53 -0
- package/src/schema/json_field.ts +94 -0
- package/src/schema/schema.ts +1028 -0
- package/src/schema/struct_field.ts +234 -0
- package/src/schema/union_field.ts +105 -0
- package/src/scripts/custom_compiler.ts +331 -0
- package/src/scripts/custom_graphql.ts +550 -0
- package/src/scripts/migrate_v0.1.ts +41 -0
- package/src/scripts/move_types.ts +131 -0
- package/src/scripts/read_schema.ts +67 -0
- package/src/setupPackage.js +42 -0
- package/src/testutils/action/complex_schemas.ts +517 -0
- package/src/testutils/builder.ts +422 -0
- package/src/testutils/context/test_context.ts +25 -0
- package/src/testutils/db/fixture.ts +32 -0
- package/src/testutils/db/temp_db.ts +941 -0
- package/src/testutils/db/value.ts +294 -0
- package/src/testutils/db_mock.ts +351 -0
- package/src/testutils/db_time_zone.ts +40 -0
- package/src/testutils/ent-graphql-tests/index.ts +653 -0
- package/src/testutils/fake_comms.ts +50 -0
- package/src/testutils/fake_data/const.ts +64 -0
- package/src/testutils/fake_data/events_query.ts +145 -0
- package/src/testutils/fake_data/fake_contact.ts +150 -0
- package/src/testutils/fake_data/fake_event.ts +150 -0
- package/src/testutils/fake_data/fake_tag.ts +139 -0
- package/src/testutils/fake_data/fake_user.ts +232 -0
- package/src/testutils/fake_data/index.ts +1 -0
- package/src/testutils/fake_data/internal.ts +8 -0
- package/src/testutils/fake_data/tag_query.ts +56 -0
- package/src/testutils/fake_data/test_helpers.ts +388 -0
- package/src/testutils/fake_data/user_query.ts +524 -0
- package/src/testutils/fake_log.ts +52 -0
- package/src/testutils/mock_date.ts +10 -0
- package/src/testutils/mock_log.ts +39 -0
- package/src/testutils/parse_sql.ts +685 -0
- package/src/testutils/test_edge_global_schema.ts +49 -0
- package/src/testutils/write.ts +70 -0
- package/src/tsc/ast.ts +351 -0
- package/src/tsc/compilerOptions.ts +85 -0
- package/src/tsc/move_generated.ts +191 -0
- package/src/tsc/transform.ts +226 -0
- package/src/tsc/transform_action.ts +224 -0
- package/src/tsc/transform_ent.ts +66 -0
- package/src/tsc/transform_schema.ts +546 -0
- package/tsconfig.json +20 -0
- package/core/query/shared_assoc_test.d.ts +0 -2
- package/core/query/shared_assoc_test.js +0 -804
- package/core/query/shared_test.d.ts +0 -21
- package/core/query/shared_test.js +0 -736
- package/graphql/query/shared_assoc_test.d.ts +0 -1
- package/graphql/query/shared_assoc_test.js +0 -203
- /package/{action → dist/action}/action.d.ts +0 -0
- /package/{action → dist/action}/action.js +0 -0
- /package/{action → dist/action}/executor.d.ts +0 -0
- /package/{action → dist/action}/executor.js +0 -0
- /package/{action → dist/action}/experimental_action.d.ts +0 -0
- /package/{action → dist/action}/experimental_action.js +0 -0
- /package/{action → dist/action}/index.d.ts +0 -0
- /package/{action → dist/action}/index.js +0 -0
- /package/{action → dist/action}/operations.d.ts +0 -0
- /package/{action → dist/action}/operations.js +0 -0
- /package/{action → dist/action}/orchestrator.d.ts +0 -0
- /package/{action → dist/action}/orchestrator.js +0 -0
- /package/{action → dist/action}/privacy.d.ts +0 -0
- /package/{action → dist/action}/privacy.js +0 -0
- /package/{action → dist/action}/relative_value.d.ts +0 -0
- /package/{action → dist/action}/relative_value.js +0 -0
- /package/{action → dist/action}/transaction.d.ts +0 -0
- /package/{action → dist/action}/transaction.js +0 -0
- /package/{auth → dist/auth}/auth.d.ts +0 -0
- /package/{auth → dist/auth}/auth.js +0 -0
- /package/{auth → dist/auth}/index.d.ts +0 -0
- /package/{auth → dist/auth}/index.js +0 -0
- /package/{core → dist/core}/base.d.ts +0 -0
- /package/{core → dist/core}/base.js +0 -0
- /package/{core → dist/core}/clause.d.ts +0 -0
- /package/{core → dist/core}/clause.js +0 -0
- /package/{core → dist/core}/config.d.ts +0 -0
- /package/{core → dist/core}/config.js +0 -0
- /package/{core → dist/core}/const.d.ts +0 -0
- /package/{core → dist/core}/const.js +0 -0
- /package/{core → dist/core}/context.d.ts +0 -0
- /package/{core → dist/core}/context.js +0 -0
- /package/{core → dist/core}/convert.d.ts +0 -0
- /package/{core → dist/core}/convert.js +0 -0
- /package/{core → dist/core}/date.d.ts +0 -0
- /package/{core → dist/core}/date.js +0 -0
- /package/{core → dist/core}/db.d.ts +0 -0
- /package/{core → dist/core}/db.js +0 -0
- /package/{core → dist/core}/ent.d.ts +0 -0
- /package/{core → dist/core}/ent.js +0 -0
- /package/{core → dist/core}/global_schema.d.ts +0 -0
- /package/{core → dist/core}/global_schema.js +0 -0
- /package/{core → dist/core}/loaders/assoc_count_loader.d.ts +0 -0
- /package/{core → dist/core}/loaders/assoc_count_loader.js +0 -0
- /package/{core → dist/core}/loaders/assoc_edge_loader.d.ts +0 -0
- /package/{core → dist/core}/loaders/assoc_edge_loader.js +0 -0
- /package/{core → dist/core}/loaders/index.d.ts +0 -0
- /package/{core → dist/core}/loaders/index.js +0 -0
- /package/{core → dist/core}/loaders/loader.d.ts +0 -0
- /package/{core → dist/core}/loaders/loader.js +0 -0
- /package/{core → dist/core}/loaders/object_loader.d.ts +0 -0
- /package/{core → dist/core}/loaders/object_loader.js +0 -0
- /package/{core → dist/core}/loaders/query_loader.d.ts +0 -0
- /package/{core → dist/core}/loaders/query_loader.js +0 -0
- /package/{core → dist/core}/loaders/raw_count_loader.d.ts +0 -0
- /package/{core → dist/core}/loaders/raw_count_loader.js +0 -0
- /package/{core → dist/core}/logger.d.ts +0 -0
- /package/{core → dist/core}/logger.js +0 -0
- /package/{core → dist/core}/privacy.d.ts +0 -0
- /package/{core → dist/core}/privacy.js +0 -0
- /package/{core → dist/core}/query/assoc_query.d.ts +0 -0
- /package/{core → dist/core}/query/assoc_query.js +0 -0
- /package/{core → dist/core}/query/custom_clause_query.d.ts +0 -0
- /package/{core → dist/core}/query/custom_clause_query.js +0 -0
- /package/{core → dist/core}/query/custom_query.d.ts +0 -0
- /package/{core → dist/core}/query/custom_query.js +0 -0
- /package/{core → dist/core}/query/index.d.ts +0 -0
- /package/{core → dist/core}/query/index.js +0 -0
- /package/{core → dist/core}/query/query.d.ts +0 -0
- /package/{core → dist/core}/query/query.js +0 -0
- /package/{core → dist/core}/query_impl.d.ts +0 -0
- /package/{core → dist/core}/query_impl.js +0 -0
- /package/{core → dist/core}/viewer.d.ts +0 -0
- /package/{core → dist/core}/viewer.js +0 -0
- /package/{graphql → dist/graphql}/builtins/connection.d.ts +0 -0
- /package/{graphql → dist/graphql}/builtins/connection.js +0 -0
- /package/{graphql → dist/graphql}/builtins/edge.d.ts +0 -0
- /package/{graphql → dist/graphql}/builtins/edge.js +0 -0
- /package/{graphql → dist/graphql}/builtins/node.d.ts +0 -0
- /package/{graphql → dist/graphql}/builtins/node.js +0 -0
- /package/{graphql → dist/graphql}/graphql.d.ts +0 -0
- /package/{graphql → dist/graphql}/graphql.js +0 -0
- /package/{graphql → dist/graphql}/graphql_field_helpers.d.ts +0 -0
- /package/{graphql → dist/graphql}/graphql_field_helpers.js +0 -0
- /package/{graphql → dist/graphql}/index.d.ts +0 -0
- /package/{graphql → dist/graphql}/index.js +0 -0
- /package/{graphql → dist/graphql}/mutations/union.d.ts +0 -0
- /package/{graphql → dist/graphql}/mutations/union.js +0 -0
- /package/{graphql → dist/graphql}/node_resolver.d.ts +0 -0
- /package/{graphql → dist/graphql}/node_resolver.js +0 -0
- /package/{graphql → dist/graphql}/query/connection_type.d.ts +0 -0
- /package/{graphql → dist/graphql}/query/connection_type.js +0 -0
- /package/{graphql → dist/graphql}/query/edge_connection.d.ts +0 -0
- /package/{graphql → dist/graphql}/query/edge_connection.js +0 -0
- /package/{graphql → dist/graphql}/query/page_info.d.ts +0 -0
- /package/{graphql → dist/graphql}/query/page_info.js +0 -0
- /package/{graphql → dist/graphql}/query/shared_edge_connection.d.ts +0 -0
- /package/{graphql → dist/graphql}/query/shared_edge_connection.js +0 -0
- /package/{graphql → dist/graphql}/scalars/orderby_direction.d.ts +0 -0
- /package/{graphql → dist/graphql}/scalars/orderby_direction.js +0 -0
- /package/{graphql → dist/graphql}/scalars/time.d.ts +0 -0
- /package/{graphql → dist/graphql}/scalars/time.js +0 -0
- /package/{imports → dist/imports}/dataz/example1/_auth.d.ts +0 -0
- /package/{imports → dist/imports}/dataz/example1/_auth.js +0 -0
- /package/{imports → dist/imports}/dataz/example1/_viewer.d.ts +0 -0
- /package/{imports → dist/imports}/dataz/example1/_viewer.js +0 -0
- /package/{imports → dist/imports}/index.d.ts +0 -0
- /package/{imports → dist/imports}/index.js +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{index.js → dist/index.js} +0 -0
- /package/{parse_schema → dist/parse_schema}/parse.d.ts +0 -0
- /package/{parse_schema → dist/parse_schema}/parse.js +0 -0
- /package/{schema → dist/schema}/base_schema.d.ts +0 -0
- /package/{schema → dist/schema}/base_schema.js +0 -0
- /package/{schema → dist/schema}/field.d.ts +0 -0
- /package/{schema → dist/schema}/field.js +0 -0
- /package/{schema → dist/schema}/index.d.ts +0 -0
- /package/{schema → dist/schema}/index.js +0 -0
- /package/{schema → dist/schema}/json_field.d.ts +0 -0
- /package/{schema → dist/schema}/json_field.js +0 -0
- /package/{schema → dist/schema}/schema.d.ts +0 -0
- /package/{schema → dist/schema}/schema.js +0 -0
- /package/{schema → dist/schema}/struct_field.d.ts +0 -0
- /package/{schema → dist/schema}/struct_field.js +0 -0
- /package/{schema → dist/schema}/union_field.d.ts +0 -0
- /package/{schema → dist/schema}/union_field.js +0 -0
- /package/{scripts → dist/scripts}/custom_compiler.d.ts +0 -0
- /package/{scripts → dist/scripts}/custom_compiler.js +0 -0
- /package/{scripts → dist/scripts}/custom_graphql.d.ts +0 -0
- /package/{scripts → dist/scripts}/custom_graphql.js +0 -0
- /package/{scripts → dist/scripts}/migrate_v0.1.d.ts +0 -0
- /package/{scripts → dist/scripts}/migrate_v0.1.js +0 -0
- /package/{scripts → dist/scripts}/move_types.d.ts +0 -0
- /package/{scripts → dist/scripts}/move_types.js +0 -0
- /package/{scripts → dist/scripts}/read_schema.d.ts +0 -0
- /package/{scripts → dist/scripts}/read_schema.js +0 -0
- /package/{testutils → dist/testutils}/action/complex_schemas.d.ts +0 -0
- /package/{testutils → dist/testutils}/action/complex_schemas.js +0 -0
- /package/{testutils → dist/testutils}/builder.d.ts +0 -0
- /package/{testutils → dist/testutils}/builder.js +0 -0
- /package/{testutils → dist/testutils}/context/test_context.d.ts +0 -0
- /package/{testutils → dist/testutils}/context/test_context.js +0 -0
- /package/{testutils → dist/testutils}/db/fixture.d.ts +0 -0
- /package/{testutils → dist/testutils}/db/fixture.js +0 -0
- /package/{testutils → dist/testutils}/db/temp_db.d.ts +0 -0
- /package/{testutils → dist/testutils}/db/temp_db.js +0 -0
- /package/{testutils → dist/testutils}/db/value.d.ts +0 -0
- /package/{testutils → dist/testutils}/db/value.js +0 -0
- /package/{testutils → dist/testutils}/db_mock.d.ts +0 -0
- /package/{testutils → dist/testutils}/db_mock.js +0 -0
- /package/{testutils → dist/testutils}/db_time_zone.d.ts +0 -0
- /package/{testutils → dist/testutils}/db_time_zone.js +0 -0
- /package/{testutils → dist/testutils}/ent-graphql-tests/index.d.ts +0 -0
- /package/{testutils → dist/testutils}/ent-graphql-tests/index.js +0 -0
- /package/{testutils → dist/testutils}/fake_comms.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_comms.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/const.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/const.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/events_query.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/events_query.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_contact.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_contact.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_event.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_event.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_tag.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_tag.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_user.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/fake_user.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/index.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/index.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/internal.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/internal.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/tag_query.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/tag_query.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/test_helpers.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/test_helpers.js +0 -0
- /package/{testutils → dist/testutils}/fake_data/user_query.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_data/user_query.js +0 -0
- /package/{testutils → dist/testutils}/fake_log.d.ts +0 -0
- /package/{testutils → dist/testutils}/fake_log.js +0 -0
- /package/{testutils → dist/testutils}/mock_date.d.ts +0 -0
- /package/{testutils → dist/testutils}/mock_date.js +0 -0
- /package/{testutils → dist/testutils}/mock_log.d.ts +0 -0
- /package/{testutils → dist/testutils}/mock_log.js +0 -0
- /package/{testutils → dist/testutils}/parse_sql.d.ts +0 -0
- /package/{testutils → dist/testutils}/parse_sql.js +0 -0
- /package/{testutils → dist/testutils}/test_edge_global_schema.d.ts +0 -0
- /package/{testutils → dist/testutils}/test_edge_global_schema.js +0 -0
- /package/{testutils → dist/testutils}/write.d.ts +0 -0
- /package/{testutils → dist/testutils}/write.js +0 -0
- /package/{tsc → dist/tsc}/ast.d.ts +0 -0
- /package/{tsc → dist/tsc}/ast.js +0 -0
- /package/{tsc → dist/tsc}/compilerOptions.d.ts +0 -0
- /package/{tsc → dist/tsc}/compilerOptions.js +0 -0
- /package/{tsc → dist/tsc}/move_generated.d.ts +0 -0
- /package/{tsc → dist/tsc}/move_generated.js +0 -0
- /package/{tsc → dist/tsc}/transform.d.ts +0 -0
- /package/{tsc → dist/tsc}/transform.js +0 -0
- /package/{tsc → dist/tsc}/transform_action.d.ts +0 -0
- /package/{tsc → dist/tsc}/transform_action.js +0 -0
- /package/{tsc → dist/tsc}/transform_ent.d.ts +0 -0
- /package/{tsc → dist/tsc}/transform_ent.js +0 -0
- /package/{tsc → dist/tsc}/transform_schema.d.ts +0 -0
- /package/{tsc → dist/tsc}/transform_schema.js +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@snowtop/ent",
|
|
3
|
+
"version": "0.1.0-alpha160-test6",
|
|
4
|
+
"description": "snowtop ent framework",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"directories": {
|
|
8
|
+
"example": "examples"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@types/node": "^20.2.5",
|
|
12
|
+
"camel-case": "^4.1.2",
|
|
13
|
+
"cosmiconfig": "^8.1.3",
|
|
14
|
+
"dataloader": "^2.2.2",
|
|
15
|
+
"glob": "^10.2.6",
|
|
16
|
+
"graph-data-structure": "^3.3.0",
|
|
17
|
+
"js-yaml": "^4.1.0",
|
|
18
|
+
"json5": "^2.2.3",
|
|
19
|
+
"luxon": "^3.3.0",
|
|
20
|
+
"memoizee": "^0.4.15",
|
|
21
|
+
"minimist": "^1.2.8",
|
|
22
|
+
"pascal-case": "^3.1.2",
|
|
23
|
+
"pg": "^8.11.0",
|
|
24
|
+
"prettier": "^2.8.8",
|
|
25
|
+
"snake-case": "^3.0.4",
|
|
26
|
+
"ts-node": "^10.9.1",
|
|
27
|
+
"tsconfig-paths": "^4.2.0",
|
|
28
|
+
"tslib": "^2.5.2",
|
|
29
|
+
"typescript": "^5.0.4",
|
|
30
|
+
"uuid": "^9.0.0"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@swc-node/register": "^1.6.5",
|
|
34
|
+
"better-sqlite3": "^8.4.0",
|
|
35
|
+
"graphql": "^16.5.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependenciesMeta": {
|
|
38
|
+
"better-sqlite3": {
|
|
39
|
+
"optional": true
|
|
40
|
+
},
|
|
41
|
+
"@swc-node/register": {
|
|
42
|
+
"optional": true
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=16.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {},
|
|
49
|
+
"scripts": {},
|
|
50
|
+
"bin": {
|
|
51
|
+
"ent-custom-graphql": "scripts/custom_graphql.js",
|
|
52
|
+
"ent-custom-compiler": "scripts/custom_compiler.js"
|
|
53
|
+
},
|
|
54
|
+
"author": "lolopinto",
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "git+ssh://git@github.com/lolopinto/ent.git"
|
|
59
|
+
},
|
|
60
|
+
"bugs": {
|
|
61
|
+
"url": "https://github.com/lolopinto/ent/issues"
|
|
62
|
+
},
|
|
63
|
+
"homepage": "https://github.com/lolopinto/ent#readme"
|
|
64
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@snowtop/ent",
|
|
3
|
-
"version": "0.1.0-alpha160-
|
|
3
|
+
"version": "0.1.0-alpha160-test7",
|
|
4
4
|
"description": "snowtop ent framework",
|
|
5
|
-
"main": "index.js",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"directories": {
|
|
8
8
|
"example": "examples"
|
|
@@ -45,11 +45,56 @@
|
|
|
45
45
|
"engines": {
|
|
46
46
|
"node": ">=16.0"
|
|
47
47
|
},
|
|
48
|
-
"devDependencies": {
|
|
49
|
-
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@swc/core": "^1.3.57",
|
|
50
|
+
"@swc/jest": "^0.2.26",
|
|
51
|
+
"@types/bcryptjs": "^2.4.2",
|
|
52
|
+
"@types/better-sqlite3": "^7.6.4",
|
|
53
|
+
"@types/express": "^4.17.15",
|
|
54
|
+
"@types/glob": "^8.0.0",
|
|
55
|
+
"@types/graphql-upload": "^8.0.12",
|
|
56
|
+
"@types/jest": "^29.2.4",
|
|
57
|
+
"@types/js-yaml": "^4.0.5",
|
|
58
|
+
"@types/luxon": "^3.1.0",
|
|
59
|
+
"@types/memoizee": "^0.4.8",
|
|
60
|
+
"@types/minimist": "^1.2.2",
|
|
61
|
+
"@types/passport": "^1.0.11",
|
|
62
|
+
"@types/passport-jwt": "^3.0.8",
|
|
63
|
+
"@types/pg": "^8.6.6",
|
|
64
|
+
"@types/pluralize": "0.0.29",
|
|
65
|
+
"@types/supertest": "^2.0.12",
|
|
66
|
+
"@types/uuid": "^9.0.0",
|
|
67
|
+
"better-sqlite3": "^8.4.0",
|
|
68
|
+
"email-addresses": "^5.0.0",
|
|
69
|
+
"express": "^4.18.2",
|
|
70
|
+
"graphql": "^16.6.0",
|
|
71
|
+
"graphql-helix": "^1.13.0",
|
|
72
|
+
"graphql-type-json": "^0.3.2",
|
|
73
|
+
"graphql-upload": "^13.0.0",
|
|
74
|
+
"jest": "^29.3.1",
|
|
75
|
+
"jest-date-mock": "^1.0.8",
|
|
76
|
+
"jest-each": "^29.5.0",
|
|
77
|
+
"jest-expect-message": "^1.1.3",
|
|
78
|
+
"jest-mock": "^29.3.1",
|
|
79
|
+
"node-sql-parser": "^3.9.4",
|
|
80
|
+
"object-path": "^0.11.8",
|
|
81
|
+
"pg-copy-streams": "^6.0.5",
|
|
82
|
+
"pluralize": "^8.0.0",
|
|
83
|
+
"supertest": "^6.3.3",
|
|
84
|
+
"ts-jest": "^29.1.0"
|
|
85
|
+
},
|
|
86
|
+
"scripts": {
|
|
87
|
+
"compile": "tsc",
|
|
88
|
+
"test": "jest",
|
|
89
|
+
"clean": "rm -rf dist",
|
|
90
|
+
"prepublish": "npm run clean && npm run compile && node src/setupPackage.js"
|
|
91
|
+
},
|
|
50
92
|
"bin": {
|
|
51
|
-
"ent-custom-graphql": "scripts/custom_graphql.js",
|
|
52
|
-
"ent-custom-compiler": "scripts/custom_compiler.js"
|
|
93
|
+
"ent-custom-graphql": "dist/scripts/custom_graphql.js",
|
|
94
|
+
"ent-custom-compiler": "dist/scripts/custom_compiler.js",
|
|
95
|
+
"ent-read-schema": "dist/scripts/read_schema.js",
|
|
96
|
+
"ent-move-types": "dist/scripts/move-types.js",
|
|
97
|
+
"ent-migrate-v0.1": "dist/scripts/migrate-v0.1"
|
|
53
98
|
},
|
|
54
99
|
"author": "lolopinto",
|
|
55
100
|
"license": "MIT",
|
|
@@ -61,4 +106,4 @@
|
|
|
61
106
|
"url": "https://github.com/lolopinto/ent/issues"
|
|
62
107
|
},
|
|
63
108
|
"homepage": "https://github.com/lolopinto/ent#readme"
|
|
64
|
-
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Ent,
|
|
3
|
+
EntConstructor,
|
|
4
|
+
Viewer,
|
|
5
|
+
ID,
|
|
6
|
+
Data,
|
|
7
|
+
PrivacyPolicy,
|
|
8
|
+
Context,
|
|
9
|
+
WriteOperation,
|
|
10
|
+
} from "../core/base";
|
|
11
|
+
import { loadEdgeForID2, AssocEdge } from "../core/ent";
|
|
12
|
+
import { DataOperation, AssocEdgeInputOptions } from "./operations";
|
|
13
|
+
import { Queryer } from "../core/db";
|
|
14
|
+
import { log } from "../core/logger";
|
|
15
|
+
import { TransformedUpdateOperation, UpdateOperation } from "../schema";
|
|
16
|
+
import { FieldInfoMap } from "../schema/schema";
|
|
17
|
+
|
|
18
|
+
export { WriteOperation };
|
|
19
|
+
|
|
20
|
+
type MaybeNull<T extends Ent> = T | null;
|
|
21
|
+
type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
|
|
22
|
+
|
|
23
|
+
interface BuilderOrchestrator {
|
|
24
|
+
__getOptions(): {
|
|
25
|
+
fieldInfo: FieldInfoMap;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface Builder<
|
|
30
|
+
TEnt extends Ent<TViewer>,
|
|
31
|
+
TViewer extends Viewer = Viewer,
|
|
32
|
+
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
33
|
+
> {
|
|
34
|
+
existingEnt: TExistingEnt;
|
|
35
|
+
ent: EntConstructor<TEnt, TViewer>;
|
|
36
|
+
placeholderID: ID;
|
|
37
|
+
readonly viewer: TViewer;
|
|
38
|
+
build(): Promise<Changeset>;
|
|
39
|
+
buildWithOptions_BETA?(options: ChangesetOptions): Promise<Changeset>;
|
|
40
|
+
operation: WriteOperation;
|
|
41
|
+
editedEnt?(): Promise<TEnt | null>;
|
|
42
|
+
nodeType: string;
|
|
43
|
+
// TODO TInput in Builder
|
|
44
|
+
getInput(): Data;
|
|
45
|
+
// TODO full orchestrator...
|
|
46
|
+
orchestrator: BuilderOrchestrator;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// PS: this is a private API subject to change
|
|
50
|
+
export interface Executor
|
|
51
|
+
extends Iterable<DataOperation>,
|
|
52
|
+
Iterator<DataOperation> {
|
|
53
|
+
placeholderID: ID;
|
|
54
|
+
// this returns a non-privacy checked "ent"
|
|
55
|
+
resolveValue(val: any): Ent | null;
|
|
56
|
+
builderOpChanged(builder: Builder<any>): boolean;
|
|
57
|
+
builder?: Builder<Ent>;
|
|
58
|
+
|
|
59
|
+
execute(): Promise<void>;
|
|
60
|
+
|
|
61
|
+
// TODO add this so we can differentiate btw when ops are being executed?
|
|
62
|
+
// vs gathered for other use
|
|
63
|
+
// or change how execute() works?
|
|
64
|
+
// right now have to reset at the end of next() if we call for (const op of executor) {}
|
|
65
|
+
// also want to throw if DataOperation.returnedRow or DataOperation.createdEnt
|
|
66
|
+
// called too early
|
|
67
|
+
// getSortedOps(): DataOperation[];
|
|
68
|
+
|
|
69
|
+
// these 3 are to help chained/contained executors
|
|
70
|
+
preFetch?(queryer: Queryer, context?: Context): Promise<void>;
|
|
71
|
+
postFetch?(queryer: Queryer, context?: Context): Promise<void>;
|
|
72
|
+
executeObservers?(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface Changeset {
|
|
76
|
+
executor(): Executor;
|
|
77
|
+
viewer: Viewer;
|
|
78
|
+
placeholderID: ID;
|
|
79
|
+
// ent: EntConstructor<T>;
|
|
80
|
+
changesets?: Changeset[];
|
|
81
|
+
dependencies?: Map<ID, Builder<Ent>>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type TriggerReturn =
|
|
85
|
+
| void
|
|
86
|
+
| Promise<Changeset | void | (Changeset | void)[]>
|
|
87
|
+
| Promise<Changeset>[];
|
|
88
|
+
|
|
89
|
+
export interface Trigger<
|
|
90
|
+
TEnt extends Ent<TViewer>,
|
|
91
|
+
TBuilder extends Builder<TEnt, TViewer, TExistingEnt>,
|
|
92
|
+
TViewer extends Viewer = Viewer,
|
|
93
|
+
TInput extends Data = Data,
|
|
94
|
+
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
95
|
+
> {
|
|
96
|
+
// TODO: way in the future. detect any writes happening in changesets and optionally throw if configured to do so
|
|
97
|
+
// can throw if it wants. not expected to throw tho.
|
|
98
|
+
// input passed in here !== builder.getInput()
|
|
99
|
+
// builder.getInput() can have other default fields
|
|
100
|
+
changeset(builder: TBuilder, input: TInput): TriggerReturn;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface Observer<
|
|
104
|
+
TEnt extends Ent<TViewer>,
|
|
105
|
+
TBuilder extends Builder<TEnt, TViewer, TExistingEnt>,
|
|
106
|
+
TViewer extends Viewer = Viewer,
|
|
107
|
+
TInput extends Data = Data,
|
|
108
|
+
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
109
|
+
> {
|
|
110
|
+
// input passed in here !== builder.getInput()
|
|
111
|
+
// builder.getInput() can have other default fields
|
|
112
|
+
observe(builder: TBuilder, input: TInput): void | Promise<void>;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface Validator<
|
|
116
|
+
TEnt extends Ent<TViewer>,
|
|
117
|
+
TBuilder extends Builder<TEnt, TViewer, TExistingEnt>,
|
|
118
|
+
TViewer extends Viewer = Viewer,
|
|
119
|
+
TInput extends Data = Data,
|
|
120
|
+
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
121
|
+
> {
|
|
122
|
+
// can throw if it wants
|
|
123
|
+
// input passed in here !== builder.getInput()
|
|
124
|
+
// builder.getInput() can have other default fields
|
|
125
|
+
validate(
|
|
126
|
+
builder: TBuilder,
|
|
127
|
+
input: TInput,
|
|
128
|
+
): Promise<void | undefined | Error> | void | Error | undefined;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface ChangesetOptions {
|
|
132
|
+
// conditional on builder operation remaining the same
|
|
133
|
+
// TODO I don't really like this
|
|
134
|
+
// https://github.com/lolopinto/ent/issues/1437
|
|
135
|
+
conditionalBuilder: Builder<any, any>;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface Action<
|
|
139
|
+
TEnt extends Ent<TViewer>,
|
|
140
|
+
TBuilder extends Builder<TEnt, TViewer, TExistingEnt>,
|
|
141
|
+
TViewer extends Viewer = Viewer,
|
|
142
|
+
TInput extends Data = Data,
|
|
143
|
+
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
144
|
+
> {
|
|
145
|
+
readonly viewer: Viewer;
|
|
146
|
+
changeset(): Promise<Changeset>;
|
|
147
|
+
changesetWithOptions_BETA?(options: ChangesetOptions): Promise<Changeset>;
|
|
148
|
+
builder: TBuilder;
|
|
149
|
+
getPrivacyPolicy(): PrivacyPolicy<TEnt>;
|
|
150
|
+
|
|
151
|
+
// we allow grouping triggers to indicate dependency trees
|
|
152
|
+
// so that you can say one or more triggers is higher priority
|
|
153
|
+
// than the others and should be run first
|
|
154
|
+
// any encountered list is a different priority from prior and subsequent triggers
|
|
155
|
+
getTriggers?(): (
|
|
156
|
+
| Trigger<TEnt, TBuilder, TViewer, TInput, TExistingEnt>
|
|
157
|
+
| Trigger<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[]
|
|
158
|
+
)[];
|
|
159
|
+
getObservers?(): Observer<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
|
|
160
|
+
getValidators?(): Validator<TEnt, TBuilder, TViewer, TInput, TExistingEnt>[];
|
|
161
|
+
getInput(): TInput; // this input is passed to Triggers, Observers, Validators
|
|
162
|
+
transformWrite?: (
|
|
163
|
+
stmt: UpdateOperation<TEnt, TViewer>,
|
|
164
|
+
) =>
|
|
165
|
+
| Promise<TransformedUpdateOperation<TEnt, TViewer>>
|
|
166
|
+
| TransformedUpdateOperation<TEnt, TViewer>
|
|
167
|
+
| null;
|
|
168
|
+
|
|
169
|
+
valid(): Promise<boolean>;
|
|
170
|
+
// throws if invalid
|
|
171
|
+
validX(): Promise<void>;
|
|
172
|
+
|
|
173
|
+
// this is used to load the ent after the action
|
|
174
|
+
// you can imagine this being overwritten for a create user or create account
|
|
175
|
+
// action to load the just-created user after the fact
|
|
176
|
+
viewerForEntLoad?(
|
|
177
|
+
data: Data,
|
|
178
|
+
context?: Context<TViewer>,
|
|
179
|
+
): TViewer | Promise<TViewer>;
|
|
180
|
+
|
|
181
|
+
// if we have overloads we need to provide all which sucks
|
|
182
|
+
// so maybe don't make the ones below required
|
|
183
|
+
// save(): Promise<T | null>;
|
|
184
|
+
// save(): Promise<void>;
|
|
185
|
+
// saveX(): Promise<T>;
|
|
186
|
+
// saveX(): Promise<T>;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export async function saveBuilder<
|
|
190
|
+
TEnt extends Ent<TViewer>,
|
|
191
|
+
TViewer extends Viewer,
|
|
192
|
+
>(builder: Builder<TEnt, TViewer>): Promise<void> {
|
|
193
|
+
await saveBuilderImpl(builder, false);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export async function saveBuilderX<
|
|
197
|
+
TEnt extends Ent<TViewer>,
|
|
198
|
+
TViewer extends Viewer,
|
|
199
|
+
>(builder: Builder<TEnt, TViewer>): Promise<void> {
|
|
200
|
+
await saveBuilderImpl(builder, true);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function saveBuilderImpl<
|
|
204
|
+
TEnt extends Ent<TViewer>,
|
|
205
|
+
TViewer extends Viewer,
|
|
206
|
+
>(builder: Builder<TEnt, TViewer>, throwErr: boolean): Promise<void> {
|
|
207
|
+
let changeset: Changeset;
|
|
208
|
+
try {
|
|
209
|
+
changeset = await builder.build();
|
|
210
|
+
} catch (e) {
|
|
211
|
+
log("error", e);
|
|
212
|
+
if (throwErr) {
|
|
213
|
+
throw e;
|
|
214
|
+
} else {
|
|
215
|
+
// expected...
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const executor = changeset.executor();
|
|
220
|
+
if (throwErr) {
|
|
221
|
+
return executor.execute();
|
|
222
|
+
} else {
|
|
223
|
+
try {
|
|
224
|
+
return executor.execute();
|
|
225
|
+
} catch (e) {
|
|
226
|
+
// it's already caught and logged upstream
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Orchestrator in orchestrator.ts in generated Builders
|
|
232
|
+
// we indicate the API we expect here. Not typing it to Orchestrator class in Orchestrator.ts
|
|
233
|
+
// for flexibility
|
|
234
|
+
interface Orchestrator {
|
|
235
|
+
addOutboundEdge<T2 extends Ent>(
|
|
236
|
+
id2: ID | Builder<T2>,
|
|
237
|
+
edgeType: string,
|
|
238
|
+
nodeType: string,
|
|
239
|
+
options?: AssocEdgeInputOptions,
|
|
240
|
+
): void;
|
|
241
|
+
removeOutboundEdge(id2: ID, edgeType: string): void;
|
|
242
|
+
viewer: Viewer;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async function modifyEdgeSet<T extends string>(
|
|
246
|
+
orchestrator: Orchestrator,
|
|
247
|
+
id1: ID,
|
|
248
|
+
id2: ID,
|
|
249
|
+
inputEnumValue: string,
|
|
250
|
+
enumValue: string,
|
|
251
|
+
edgeType: T,
|
|
252
|
+
nodeType: string,
|
|
253
|
+
) {
|
|
254
|
+
let edge = await loadEdgeForID2({
|
|
255
|
+
id1: id1,
|
|
256
|
+
id2: id2,
|
|
257
|
+
edgeType: edgeType,
|
|
258
|
+
ctr: AssocEdge,
|
|
259
|
+
context: orchestrator.viewer.context,
|
|
260
|
+
});
|
|
261
|
+
// always add the edge because the data field may be getting overwritten later on
|
|
262
|
+
// and we need to give that operation a chance to succeed
|
|
263
|
+
// TODO: can save a write here by checking in EdgeOperation and not doing this write if nothing
|
|
264
|
+
// has changed.
|
|
265
|
+
if (inputEnumValue === enumValue) {
|
|
266
|
+
orchestrator.addOutboundEdge(id2, edgeType, nodeType);
|
|
267
|
+
}
|
|
268
|
+
if (edge) {
|
|
269
|
+
if (enumValue !== inputEnumValue) {
|
|
270
|
+
orchestrator.removeOutboundEdge(id2, edgeType);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// This sets one edge in a group
|
|
276
|
+
// used for assoc groups where setting the value of one edge in the group
|
|
277
|
+
// unsets the other
|
|
278
|
+
// e.g. 3 states for event rsvp: attending, maybe, declined. user can't be rsvped as more than one at a time so this helps you
|
|
279
|
+
// so that setting an rsvp status for one clears the others (if set)
|
|
280
|
+
// or for friendship status: incoming_friend_request, outgoing_friend_request, are_friends
|
|
281
|
+
// accepting a friend request should clear an incoming or outgoing friend request
|
|
282
|
+
// @args
|
|
283
|
+
// orchestrator: see interface
|
|
284
|
+
// inputEnumValue: the value of the enum. should be one of the keys of m
|
|
285
|
+
// id1: source ID in Orchestrator. We take this as extra param because we need it to check if edge exists
|
|
286
|
+
// id2: target id
|
|
287
|
+
// nodeType: nodeType of ent in question
|
|
288
|
+
// m: Map<enumType, to EdgeType to check>
|
|
289
|
+
export async function setEdgeTypeInGroup<T extends string>(
|
|
290
|
+
orchestrator: Orchestrator,
|
|
291
|
+
inputEnumValue: string,
|
|
292
|
+
id1: ID,
|
|
293
|
+
id2: ID,
|
|
294
|
+
nodeType: string,
|
|
295
|
+
m: Map<T, string>,
|
|
296
|
+
) {
|
|
297
|
+
let promises: Promise<void>[] = [];
|
|
298
|
+
for (const [k, v] of m) {
|
|
299
|
+
promises.push(
|
|
300
|
+
modifyEdgeSet(orchestrator, id1, id2, inputEnumValue, k, v, nodeType),
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
await Promise.all(promises);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export async function clearEdgeTypeInGroup<T extends string>(
|
|
307
|
+
orchestrator: Orchestrator,
|
|
308
|
+
id1: ID,
|
|
309
|
+
id2: ID,
|
|
310
|
+
m: Map<T, string>,
|
|
311
|
+
) {
|
|
312
|
+
let promises: Promise<void>[] = [];
|
|
313
|
+
for (const [_, edgeType] of m) {
|
|
314
|
+
promises.push(
|
|
315
|
+
(async () => {
|
|
316
|
+
let edge = await loadEdgeForID2({
|
|
317
|
+
id1,
|
|
318
|
+
id2,
|
|
319
|
+
edgeType,
|
|
320
|
+
ctr: AssocEdge,
|
|
321
|
+
context: orchestrator.viewer.context,
|
|
322
|
+
});
|
|
323
|
+
if (edge) {
|
|
324
|
+
orchestrator.removeOutboundEdge(id2, edgeType);
|
|
325
|
+
}
|
|
326
|
+
})(),
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
await Promise.all(promises);
|
|
330
|
+
}
|