@snowtop/ent 0.1.0-alpha159 → 0.1.0-alpha160-test1

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.
@@ -36,7 +36,7 @@ const executor_1 = require("./executor");
36
36
  const logger_1 = require("../core/logger");
37
37
  const memoizee_1 = __importDefault(require("memoizee"));
38
38
  const clause = __importStar(require("../core/clause"));
39
- const util_1 = require("util");
39
+ const types_1 = require("util/types");
40
40
  const operations_2 = require("./operations");
41
41
  var edgeDirection;
42
42
  (function (edgeDirection) {
@@ -341,7 +341,7 @@ class Orchestrator {
341
341
  }
342
342
  if (field.valid) {
343
343
  let valid = field.valid(val);
344
- if (util_1.types.isPromise(valid)) {
344
+ if ((0, types_1.isPromise)(valid)) {
345
345
  valid = await valid;
346
346
  }
347
347
  // if not valid, don't format and don't pass to ent?
@@ -353,7 +353,7 @@ class Orchestrator {
353
353
  }
354
354
  // nested so it's not JSON stringified or anything like that
355
355
  val = field.format(formatted[dbKey], true);
356
- if (util_1.types.isPromise(val)) {
356
+ if ((0, types_1.isPromise)(val)) {
357
357
  val = await val;
358
358
  }
359
359
  formatted[dbKey] = val;
@@ -673,7 +673,7 @@ class Orchestrator {
673
673
  if (defaultValue === undefined) {
674
674
  throw new Error(`defaultValueOnCreate() returned undefined for field ${fieldName}`);
675
675
  }
676
- if (util_1.types.isPromise(defaultValue)) {
676
+ if ((0, types_1.isPromise)(defaultValue)) {
677
677
  defaultValue = await defaultValue;
678
678
  }
679
679
  }
@@ -681,7 +681,7 @@ class Orchestrator {
681
681
  if (field.defaultValueOnEdit &&
682
682
  this.actualOperation === action_1.WriteOperation.Edit) {
683
683
  defaultValue = field.defaultValueOnEdit(builder, input);
684
- if (util_1.types.isPromise(defaultValue)) {
684
+ if ((0, types_1.isPromise)(defaultValue)) {
685
685
  defaultValue = await defaultValue;
686
686
  }
687
687
  }
@@ -741,7 +741,7 @@ class Orchestrator {
741
741
  else if (this.isBuilder(value)) {
742
742
  if (field.valid) {
743
743
  let valid = field.valid(value);
744
- if (util_1.types.isPromise(valid)) {
744
+ if ((0, types_1.isPromise)(valid)) {
745
745
  valid = await valid;
746
746
  }
747
747
  if (!valid) {
@@ -756,7 +756,7 @@ class Orchestrator {
756
756
  else {
757
757
  if (field.valid) {
758
758
  let valid = field.valid(value);
759
- if (util_1.types.isPromise(valid)) {
759
+ if ((0, types_1.isPromise)(valid)) {
760
760
  valid = await valid;
761
761
  }
762
762
  if (!valid) {
package/core/db.js CHANGED
@@ -139,7 +139,9 @@ class DB {
139
139
  }
140
140
  else {
141
141
  let sqlite = require("better-sqlite3");
142
- this.q = new Sqlite(sqlite(db.filePath || ""));
142
+ const dbb = sqlite(db.filePath || "");
143
+ dbb.pragma("journal_mode = WAL");
144
+ this.q = new Sqlite(dbb);
143
145
  }
144
146
  }
145
147
  getConnection() {
package/core/ent.d.ts CHANGED
@@ -1,8 +1,38 @@
1
1
  import { Queryer, SyncQueryer } from "./db";
2
- import { Viewer, Ent, ID, LoadRowsOptions, LoadRowOptions, Data, DataOptions, QueryableDataOptions, EditRowOptions, LoadEntOptions, LoadCustomEntOptions, EdgeQueryableDataOptions, Context, CreateRowOptions, QueryDataOptions, SelectCustomDataOptions } from "./base";
2
+ import { Viewer, Ent, ID, LoadRowsOptions, LoadRowOptions, Data, DataOptions, QueryableDataOptions, EditRowOptions, LoadEntOptions, LoadCustomEntOptions, EdgeQueryableDataOptions, Context, CreateRowOptions, QueryDataOptions, SelectCustomDataOptions, LoaderWithLoadMany } from "./base";
3
3
  import * as clause from "./clause";
4
4
  import DataLoader from "dataloader";
5
5
  import { OrderBy } from "./query_impl";
6
+ declare class entCacheMap<TViewer extends Viewer, TEnt extends Ent<TViewer>> {
7
+ private viewer;
8
+ private options;
9
+ private m;
10
+ private logEnabled;
11
+ constructor(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>);
12
+ get(id: ID): any;
13
+ set(key: string, value: any): Map<any, any>;
14
+ delete(key: string): boolean;
15
+ clear(): void;
16
+ }
17
+ declare class ErrorWrapper {
18
+ error: Error;
19
+ constructor(error: Error);
20
+ }
21
+ export declare function rowIsError(row: any): row is Error;
22
+ declare class EntLoader<TViewer extends Viewer, TEnt extends Ent<TViewer>> implements LoaderWithLoadMany<ID, TEnt | ErrorWrapper | Error> {
23
+ private viewer;
24
+ private options;
25
+ private loader;
26
+ private map;
27
+ constructor(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>);
28
+ getMap(): entCacheMap<TViewer, TEnt>;
29
+ load(id: ID): Promise<TEnt | ErrorWrapper>;
30
+ loadMany(ids: ID[]): Promise<Array<TEnt | ErrorWrapper | Error>>;
31
+ prime(id: ID, ent: TEnt | ErrorWrapper): void;
32
+ clear(id: ID): void;
33
+ clearAll(): void;
34
+ }
35
+ export declare function getEntLoader<TViewer extends Viewer, TEnt extends Ent<TViewer>>(viewer: TViewer, options: LoadEntOptions<TEnt, TViewer>): EntLoader<TViewer, TEnt>;
6
36
  export declare function getEntKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): string;
7
37
  export declare function loadEnt<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, id: ID, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
8
38
  export declare function loadEntViaKey<TEnt extends Ent<TViewer>, TViewer extends Viewer>(viewer: TViewer, key: any, options: LoadEntOptions<TEnt, TViewer>): Promise<TEnt | null>;
package/core/ent.js CHANGED
@@ -26,7 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.getEdgeTypeInGroup = exports.applyPrivacyPolicyForRows = exports.applyPrivacyPolicyForRow = exports.loadNodesByEdge = exports.loadEdgeForID2 = exports.loadRawEdgeCountX = exports.loadUniqueNode = exports.loadUniqueEdge = exports.loadCustomEdges = exports.getEdgeClauseAndFields = exports.loadEdges = exports.getDefaultLimit = exports.setDefaultLimit = exports.loadEdgeDatas = exports.loadEdgeData = exports.assocEdgeLoader = exports.AssocEdgeData = exports.getCursor = exports.AssocEdge = exports.deleteRowsSync = exports.deleteRows = exports.editRowSync = exports.editRow = exports.buildUpdateQuery = exports.createRowSync = exports.createRow = exports.buildInsertQuery = exports.buildGroupQuery = exports.buildQuery = exports.loadRows = exports.performRawQuery = exports.___setLogQueryErrorWithError = exports.loadRow = exports.loadRowX = exports.logQuery = exports.loadDerivedEntX = exports.loadDerivedEnt = exports.loadCustomCount = exports.loadCustomData = exports.loadCustomEnts = exports.loadEntsFromClause = exports.loadEntsList = exports.loadEnts = exports.loadEntXFromClause = exports.loadEntFromClause = exports.loadEntXViaKey = exports.loadEntX = exports.loadEntViaKey = exports.loadEnt = exports.getEntKey = void 0;
29
+ exports.applyPrivacyPolicyForRow = exports.loadNodesByEdge = exports.loadEdgeForID2 = exports.loadRawEdgeCountX = exports.loadUniqueNode = exports.loadUniqueEdge = exports.loadCustomEdges = exports.getEdgeClauseAndFields = exports.loadEdges = exports.getDefaultLimit = exports.setDefaultLimit = exports.loadEdgeDatas = exports.loadEdgeData = exports.assocEdgeLoader = exports.AssocEdgeData = exports.getCursor = exports.AssocEdge = exports.deleteRowsSync = exports.deleteRows = exports.editRowSync = exports.editRow = exports.buildUpdateQuery = exports.createRowSync = exports.createRow = exports.buildInsertQuery = exports.buildGroupQuery = exports.buildQuery = exports.loadRows = exports.performRawQuery = exports.___setLogQueryErrorWithError = exports.loadRow = exports.loadRowX = exports.logQuery = exports.loadDerivedEntX = exports.loadDerivedEnt = exports.loadCustomCount = exports.loadCustomData = exports.loadCustomEnts = exports.loadEntsFromClause = exports.loadEntsList = exports.loadEnts = exports.loadEntXFromClause = exports.loadEntFromClause = exports.loadEntXViaKey = exports.loadEntX = exports.loadEntViaKey = exports.loadEnt = exports.getEntKey = exports.getEntLoader = exports.rowIsError = void 0;
30
+ exports.getEdgeTypeInGroup = exports.applyPrivacyPolicyForRows = void 0;
30
31
  const db_1 = __importStar(require("./db"));
31
32
  const privacy_1 = require("./privacy");
32
33
  const clause = __importStar(require("./clause"));
@@ -102,6 +103,13 @@ class ErrorWrapper {
102
103
  this.error = error;
103
104
  }
104
105
  }
106
+ // note if storing the result of this in something that checks instanceof Error e.g. DataLoader, we need to check instanceof at that callsite
107
+ function rowIsError(row) {
108
+ // jest does things that break instanceof checks
109
+ // so we need to check the name as well for native error SqliteError
110
+ return row instanceof Error || row?.constructor?.name === "SqliteError";
111
+ }
112
+ exports.rowIsError = rowIsError;
105
113
  function createEntLoader(viewer, options, map) {
106
114
  // share the cache across loaders even if we create a new instance
107
115
  const loaderOptions = {};
@@ -119,8 +127,14 @@ function createEntLoader(viewer, options, map) {
119
127
  for (let idx = 0; idx < rows.length; idx++) {
120
128
  const row = rows[idx];
121
129
  // db error
122
- if (row instanceof Error) {
123
- result[idx] = row;
130
+ if (rowIsError(row)) {
131
+ if (row instanceof Error) {
132
+ result[idx] = row;
133
+ }
134
+ else {
135
+ // @ts-ignore SqliteError
136
+ result[idx] = new Error(row.message);
137
+ }
124
138
  continue;
125
139
  }
126
140
  else if (!row) {
@@ -133,7 +147,7 @@ function createEntLoader(viewer, options, map) {
133
147
  }
134
148
  else {
135
149
  const r = await applyPrivacyPolicyForRowImpl(viewer, options, row);
136
- if (r instanceof Error) {
150
+ if (rowIsError(r)) {
137
151
  result[idx] = new ErrorWrapper(r);
138
152
  }
139
153
  else {
@@ -177,6 +191,7 @@ function getEntLoader(viewer, options) {
177
191
  const name = `ent-loader:${viewer.instanceKey()}:${options.loaderFactory.name}`;
178
192
  return viewer.context.cache.getLoaderWithLoadMany(name, () => new EntLoader(viewer, options));
179
193
  }
194
+ exports.getEntLoader = getEntLoader;
180
195
  function getEntKey(viewer, id, options) {
181
196
  return `${viewer.instanceKey()}:${options.loaderFactory.name}:${id}`;
182
197
  }
@@ -207,7 +222,7 @@ loader) {
207
222
  return result;
208
223
  }
209
224
  const r = await applyPrivacyPolicyForRowImpl(viewer, options, row);
210
- if (r instanceof Error) {
225
+ if (rowIsError(r)) {
211
226
  loader.prime(id, new ErrorWrapper(r));
212
227
  return new ErrorWrapper(r);
213
228
  }
@@ -297,7 +312,7 @@ async function loadEnts(viewer, options, ...ids) {
297
312
  let m = new Map();
298
313
  const ret = await getEntLoader(viewer, options).loadMany(ids);
299
314
  for (const r of ret) {
300
- if (r instanceof Error) {
315
+ if (rowIsError(r)) {
301
316
  throw r;
302
317
  }
303
318
  if (r instanceof ErrorWrapper) {
@@ -450,7 +465,7 @@ async function loadDerivedEnt(viewer, data, loader) {
450
465
  const r = await applyPrivacyPolicyForEnt(viewer, ent, data, {
451
466
  ent: loader,
452
467
  });
453
- if (r instanceof Error) {
468
+ if (rowIsError(r)) {
454
469
  return null;
455
470
  }
456
471
  return r;
@@ -473,7 +488,7 @@ async function applyPrivacyPolicyForEnt(viewer, ent, data, fieldPrivacyOptions)
473
488
  }
474
489
  async function applyPrivacyPolicyForEntX(viewer, ent, data, options) {
475
490
  const r = await applyPrivacyPolicyForEnt(viewer, ent, data, options);
476
- if (r instanceof Error) {
491
+ if (rowIsError(r)) {
477
492
  throw r;
478
493
  }
479
494
  if (r === null) {
@@ -919,7 +934,7 @@ async function loadEdgeDatas(...edgeTypes) {
919
934
  if (!row) {
920
935
  return;
921
936
  }
922
- if (row instanceof Error) {
937
+ if (rowIsError(row)) {
923
938
  throw row;
924
939
  }
925
940
  m.set(row["edge_type"], new AssocEdgeData(row));
@@ -1088,7 +1103,7 @@ async function loadNodesByEdge(viewer, id1, edgeType, options) {
1088
1103
  exports.loadNodesByEdge = loadNodesByEdge;
1089
1104
  async function applyPrivacyPolicyForRow(viewer, options, row) {
1090
1105
  const r = await applyPrivacyPolicyForRowImpl(viewer, options, row);
1091
- return r instanceof Error ? null : r;
1106
+ return rowIsError(r) ? null : r;
1092
1107
  }
1093
1108
  exports.applyPrivacyPolicyForRow = applyPrivacyPolicyForRow;
1094
1109
  async function applyPrivacyPolicyForRowImpl(viewer, options, row) {
package/core/privacy.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AllowIfViewerHasIdentityPrivacyPolicy = exports.AllowIfViewerPrivacyPolicy = exports.AlwaysDenyPrivacyPolicy = exports.AlwaysAllowPrivacyPolicy = exports.applyPrivacyPolicyImpl = exports.applyPrivacyPolicyX = exports.applyPrivacyPolicy = exports.AllowIfSubPolicyAllowsRule = exports.DelayedResultRule = exports.AllowIfConditionAppliesRule = exports.DenyIfViewerOutboundEdgeDoesNotExistRule = exports.DenyIfViewerInboundEdgeDoesNotExistRule = exports.DenyIfEdgeDoesNotExistRule = exports.DenyIfViewerOutboundEdgeExistsRule = exports.DenyIfViewerInboundEdgeExistsRule = exports.DenyIfEdgeExistsRule = exports.AllowIfViewerOutboundEdgeExistsRule = exports.AllowIfViewerInboundEdgeExistsRule = exports.AllowIfEdgeExistsRule = exports.DenyIfEntIsNotVisibleRule = exports.DenyIfEntIsVisibleRule = exports.DenyIfEntIsVisiblePolicy = exports.AllowIfEntIsVisiblePolicy = exports.AllowIfEntIsNotVisibleRule = exports.AllowIfEntIsVisibleRule = exports.DenyIfEntPropertyIsRule = exports.AllowIfEntPropertyIsRule = exports.AllowIfViewerIsEntPropertyRule = exports.AllowIfViewerIsRule = exports.DenyIfFuncRule = exports.AllowIfFuncRule = exports.DenyIfViewerEqualsRule = exports.AllowIfViewerEqualsRule = exports.AllowIfViewerRule = exports.AllowIfHasIdentity = exports.DenyIfLoggedInRule = exports.DenyIfLoggedOutRule = exports.AlwaysDenyRule = exports.AlwaysAllowRule = exports.EntPrivacyError = void 0;
4
+ const types_1 = require("util/types");
4
5
  const base_1 = require("./base");
5
6
  const ent_1 = require("./ent");
6
7
  // copied from ./base
@@ -102,7 +103,10 @@ class AllowIfFuncRule {
102
103
  this.fn = fn;
103
104
  }
104
105
  async apply(v, ent) {
105
- const result = await this.fn(v, ent);
106
+ let result = this.fn(v, ent);
107
+ if ((0, types_1.isPromise)(result)) {
108
+ result = await result;
109
+ }
106
110
  if (result) {
107
111
  return (0, base_1.Allow)();
108
112
  }
@@ -115,7 +119,10 @@ class DenyIfFuncRule {
115
119
  this.fn = fn;
116
120
  }
117
121
  async apply(v, ent) {
118
- const result = await this.fn(v, ent);
122
+ let result = this.fn(v, ent);
123
+ if ((0, types_1.isPromise)(result)) {
124
+ result = await result;
125
+ }
119
126
  if (result) {
120
127
  return (0, base_1.Deny)();
121
128
  }
@@ -424,12 +431,14 @@ class DelayedResultRule {
424
431
  this.fn = fn;
425
432
  }
426
433
  async apply(v, ent) {
427
- const rule = await this.fn(v, ent);
434
+ let rule = this.fn(v, ent);
435
+ if ((0, types_1.isPromise)(rule)) {
436
+ rule = await rule;
437
+ }
428
438
  if (!rule) {
429
439
  return (0, base_1.Skip)();
430
440
  }
431
- const res = await rule.apply(v, ent);
432
- return res;
441
+ return rule.apply(v, ent);
433
442
  }
434
443
  }
435
444
  exports.DelayedResultRule = DelayedResultRule;
@@ -32,8 +32,8 @@ const clause = __importStar(require("../clause"));
32
32
  const memoizee_1 = __importDefault(require("memoizee"));
33
33
  const privacy_1 = require("../privacy");
34
34
  const uuid_1 = require("uuid");
35
- const util_1 = require("util");
36
35
  const query_impl_1 = require("../query_impl");
36
+ const types_1 = require("util/types");
37
37
  // TODO can we generalize EdgeQuery to support any clause
38
38
  function assertPositive(n) {
39
39
  if (n < 0) {
@@ -108,7 +108,7 @@ class FirstFilter {
108
108
  });
109
109
  if (this.offset) {
110
110
  const res = this.edgeQuery.getTableName();
111
- const tableName = util_1.types.isPromise(res) ? await res : res;
111
+ const tableName = (0, types_1.isPromise)(res) ? await res : res;
112
112
  // inner col time
113
113
  options.clause = clause.PaginationMultipleColsSubQuery(this.sortCol, less ? "<" : ">", tableName, this.options.cursorCol, this.offset);
114
114
  }
@@ -174,7 +174,7 @@ class LastFilter {
174
174
  options.limit = this.options.limit + 1; // fetch an extra so we know if previous pag
175
175
  if (this.options.cursorCol !== this.sortCol) {
176
176
  const res = this.edgeQuery.getTableName();
177
- const tableName = util_1.types.isPromise(res) ? await res : res;
177
+ const tableName = (0, types_1.isPromise)(res) ? await res : res;
178
178
  if (this.offset) {
179
179
  // inner col time
180
180
  options.clause = clause.PaginationMultipleColsSubQuery(this.sortCol, greater ? ">" : "<", tableName, this.options.cursorCol, this.offset);
@@ -389,7 +389,7 @@ class BaseEdgeQuery {
389
389
  for (const filter of this.filters) {
390
390
  if (filter.query) {
391
391
  let res = filter.query(options);
392
- options = util_1.types.isPromise(res) ? await res : res;
392
+ options = (0, types_1.isPromise)(res) ? await res : res;
393
393
  }
394
394
  }
395
395
  await this.loadRawData(idsInfo, options);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snowtop/ent",
3
- "version": "0.1.0-alpha159",
3
+ "version": "0.1.0-alpha160-test1",
4
4
  "description": "snowtop ent framework",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -8,7 +8,6 @@
8
8
  "example": "examples"
9
9
  },
10
10
  "dependencies": {
11
- "@swc-node/register": "^1.6.5",
12
11
  "@types/node": "^20.2.5",
13
12
  "camel-case": "^4.1.2",
14
13
  "cosmiconfig": "^8.1.3",
@@ -31,7 +30,7 @@
31
30
  "uuid": "^9.0.0"
32
31
  },
33
32
  "peerDependencies": {
34
- "better-sqlite3": "^7.4.1",
33
+ "better-sqlite3": "^8.4.0",
35
34
  "graphql": "^16.5.0"
36
35
  },
37
36
  "peerDependenciesMeta": {
@@ -40,7 +39,7 @@
40
39
  }
41
40
  },
42
41
  "engines": {
43
- "node": ">=14.0"
42
+ "node": ">=16.0"
44
43
  },
45
44
  "devDependencies": {},
46
45
  "scripts": {},
package/schema/field.js CHANGED
@@ -26,7 +26,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.UUIDListType = exports.IntegerEnumListType = exports.EnumListType = exports.DateListType = exports.TimetzListType = exports.TimeListType = exports.TimestamptzListType = exports.TimestampListType = exports.BooleanListType = exports.BigIntegerListType = exports.FloatListType = exports.IntegerListType = exports.IntListType = exports.StringListType = exports.ListField = exports.IntegerEnumType = exports.IntegerEnumField = exports.EnumType = exports.StringEnumField = exports.EnumField = exports.DateType = exports.DateField = exports.TimetzType = exports.TimeType = exports.TimeField = exports.leftPad = exports.TimestamptzType = exports.TimestampType = exports.TimestampField = exports.StringType = exports.PolymorphicStringField = exports.StringField = exports.BooleanType = exports.BooleanField = exports.FloatType = exports.FloatField = exports.BigIntegerType = exports.BigIntegerField = exports.IntegerType = exports.IntegerField = exports.NumberField = exports.UUIDType = exports.UUIDField = exports.BaseField = void 0;
27
27
  const luxon_1 = require("luxon");
28
28
  const camel_case_1 = require("camel-case");
29
- const util_1 = require("util");
29
+ const types_1 = require("util/types");
30
30
  const uuid_1 = require("uuid");
31
31
  const base_1 = require("../core/base");
32
32
  const db_1 = __importStar(require("../core/db"));
@@ -727,7 +727,7 @@ class ListField extends BaseField {
727
727
  return true;
728
728
  }
729
729
  const res = valid.apply(this.field, [val[0]]);
730
- if (util_1.types.isPromise(res)) {
730
+ if ((0, types_1.isPromise)(res)) {
731
731
  const ret = await Promise.all(val.map(async (v) => await valid.apply(this.field, [v])));
732
732
  return ret.every((v) => v);
733
733
  }
@@ -496,7 +496,14 @@ class TempDB {
496
496
  if (this.dialect === db_1.Dialect.SQLite) {
497
497
  this.sqlite.close();
498
498
  if (!this.sqlite.memory) {
499
- fs.rmSync(this.getSqliteClient().name);
499
+ const f = this.getSqliteClient().name;
500
+ fs.rmSync(f);
501
+ fs.rmSync(`${f}-shm`, {
502
+ force: true,
503
+ });
504
+ fs.rmSync(`${f}-wal`, {
505
+ force: true,
506
+ });
500
507
  }
501
508
  return;
502
509
  }