@antelopejs/interface-database-decorators 0.1.10 → 0.1.12

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 (71) hide show
  1. package/README.md +9 -7
  2. package/dist/common.js.map +1 -1
  3. package/dist/database.js +18 -2
  4. package/dist/database.js.map +1 -1
  5. package/dist/model.js +48 -29
  6. package/dist/model.js.map +1 -1
  7. package/dist/modifiers/common.d.ts +24 -4
  8. package/dist/modifiers/common.js +104 -130
  9. package/dist/modifiers/common.js.map +1 -1
  10. package/dist/modifiers/encryption.js +14 -9
  11. package/dist/modifiers/encryption.js.map +1 -1
  12. package/dist/modifiers/hash.d.ts +46 -4
  13. package/dist/modifiers/hash.js +172 -14
  14. package/dist/modifiers/hash.js.map +1 -1
  15. package/dist/modifiers/internal/kinds.d.ts +13 -0
  16. package/dist/modifiers/internal/kinds.js +33 -0
  17. package/dist/modifiers/internal/kinds.js.map +1 -0
  18. package/dist/modifiers/internal/records.d.ts +31 -0
  19. package/dist/modifiers/internal/records.js +56 -0
  20. package/dist/modifiers/internal/records.js.map +1 -0
  21. package/dist/modifiers/localization.js +4 -2
  22. package/dist/modifiers/localization.js.map +1 -1
  23. package/dist/schema.js +1 -2
  24. package/dist/schema.js.map +1 -1
  25. package/dist/table.js +21 -6
  26. package/dist/table.js.map +1 -1
  27. package/dist/tests/codec_helpers.d.ts +6 -2
  28. package/dist/tests/codec_helpers.js +18 -14
  29. package/dist/tests/codec_helpers.js.map +1 -1
  30. package/dist/tests/common.test.js +38 -46
  31. package/dist/tests/common.test.js.map +1 -1
  32. package/dist/tests/cross_instance.test.js +27 -2
  33. package/dist/tests/cross_instance.test.js.map +1 -1
  34. package/dist/tests/database.test.js +278 -256
  35. package/dist/tests/database.test.js.map +1 -1
  36. package/dist/tests/hash_upgrade.test.d.ts +1 -0
  37. package/dist/tests/hash_upgrade.test.js +132 -0
  38. package/dist/tests/hash_upgrade.test.js.map +1 -0
  39. package/dist/tests/helpers/hash-rows.d.ts +40 -0
  40. package/dist/tests/helpers/hash-rows.js +41 -0
  41. package/dist/tests/helpers/hash-rows.js.map +1 -0
  42. package/dist/tests/helpers/other-instance.d.ts +1 -1
  43. package/dist/tests/helpers/other-instance.js +41 -9
  44. package/dist/tests/helpers/other-instance.js.map +1 -1
  45. package/dist/tests/integration.test.js +485 -485
  46. package/dist/tests/integration.test.js.map +1 -1
  47. package/dist/tests/model.test.js +293 -308
  48. package/dist/tests/model.test.js.map +1 -1
  49. package/dist/tests/modifiers/autodate.test.js +80 -86
  50. package/dist/tests/modifiers/autodate.test.js.map +1 -1
  51. package/dist/tests/modifiers/common.test.js +181 -195
  52. package/dist/tests/modifiers/common.test.js.map +1 -1
  53. package/dist/tests/modifiers/encryption.test.js +149 -155
  54. package/dist/tests/modifiers/encryption.test.js.map +1 -1
  55. package/dist/tests/modifiers/hash.test.js +386 -99
  56. package/dist/tests/modifiers/hash.test.js.map +1 -1
  57. package/dist/tests/modifiers/localization.test.js +186 -196
  58. package/dist/tests/modifiers/localization.test.js.map +1 -1
  59. package/dist/tests/partial_update.test.d.ts +1 -0
  60. package/dist/tests/partial_update.test.js +55 -0
  61. package/dist/tests/partial_update.test.js.map +1 -0
  62. package/dist/tests/relation.test.js +92 -97
  63. package/dist/tests/relation.test.js.map +1 -1
  64. package/dist/tests/schema.test.js +101 -106
  65. package/dist/tests/schema.test.js.map +1 -1
  66. package/dist/tests/table.test.js +124 -132
  67. package/dist/tests/table.test.js.map +1 -1
  68. package/docs/3.table-modifiers.md +36 -15
  69. package/package.json +14 -3
  70. package/skills/database-decorators-interface/SKILL.md +4 -2
  71. package/skills/database-decorators-interface/cases.json +71 -0
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const interface_database_1 = require("@antelopejs/interface-database");
14
+ const database_1 = require("../database");
15
+ const model_1 = require("../model");
16
+ const autodate_1 = require("../modifiers/autodate");
17
+ const common_1 = require("../modifiers/common");
18
+ const hash_1 = require("../modifiers/hash");
19
+ const schema_1 = require("../schema");
20
+ const table_1 = require("../table");
21
+ const hash_rows_1 = require("./helpers/hash-rows");
22
+ const SCHEMA_ID = "hash-upgrade-schema";
23
+ const WRONG_PASSWORD = "not the password";
24
+ let Account = class Account extends table_1.Table.with(hash_1.HashModifier) {
25
+ };
26
+ __decorate([
27
+ (0, table_1.Field)("string"),
28
+ __metadata("design:type", String)
29
+ ], Account.prototype, "name", void 0);
30
+ __decorate([
31
+ (0, autodate_1.UpdateTime)(),
32
+ (0, table_1.Field)("date"),
33
+ __metadata("design:type", Date)
34
+ ], Account.prototype, "updatedAt", void 0);
35
+ __decorate([
36
+ (0, hash_1.Hashed)(),
37
+ (0, table_1.Field)("string"),
38
+ __metadata("design:type", String)
39
+ ], Account.prototype, "password", void 0);
40
+ Account = __decorate([
41
+ (0, schema_1.RegisterTable)("hash_upgrade_accounts", SCHEMA_ID)
42
+ ], Account);
43
+ const AccountModel = (0, model_1.BasicDataModel)(Account, "hash_upgrade_accounts");
44
+ (0, hash_rows_1.scryptSuite)("Integration - upgrade of stored hashes", () => {
45
+ let model;
46
+ before(async () => {
47
+ await (0, database_1.RegisterSchema)(SCHEMA_ID);
48
+ const instance = interface_database_1.Schema.get(SCHEMA_ID)?.instance();
49
+ if (!instance)
50
+ throw new Error("Hash upgrade schema not found");
51
+ model = new AccountModel(instance);
52
+ });
53
+ async function storedRowFrom0_1_11() {
54
+ const _id = `from-0.1.11-${Math.random()}`;
55
+ await model.table
56
+ .insert(structuredClone({ ...hash_rows_1.ROW_FROM_0_1_11, _id }))
57
+ .run();
58
+ return _id;
59
+ }
60
+ async function storedCurrentRow() {
61
+ const [id] = await model.insert({ name: "Current", password: hash_rows_1.PASSWORD });
62
+ return id;
63
+ }
64
+ async function reload(id) {
65
+ const account = await model.get(id);
66
+ if (!account)
67
+ throw new Error(`Row ${id} not found`);
68
+ return account;
69
+ }
70
+ async function expectVerifies(account) {
71
+ (0, chai_1.expect)(account.testHash("password", hash_rows_1.PASSWORD)).to.equal(true);
72
+ (0, chai_1.expect)(await account.testHashAsync("password", hash_rows_1.PASSWORD)).to.equal(true);
73
+ (0, chai_1.expect)(account.testHash("password", WRONG_PASSWORD)).to.equal(false);
74
+ (0, chai_1.expect)(await account.testHashAsync("password", WRONG_PASSWORD)).to.equal(false);
75
+ }
76
+ it("verifies, flags, re-hashes and saves a row written by 0.1.11", async () => {
77
+ const id = await storedRowFrom0_1_11();
78
+ const before = await reload(id);
79
+ await expectVerifies(before);
80
+ (0, chai_1.expect)(before.isHashOutdated("password")).to.equal(true);
81
+ before.password = hash_rows_1.PASSWORD;
82
+ await model.update(before);
83
+ const after = await reload(id);
84
+ (0, chai_1.expect)(after.password).to.match(/^\$scrypt\$ln=15,r=8,p=3\$/);
85
+ await expectVerifies(after);
86
+ (0, chai_1.expect)(after.isHashOutdated("password")).to.equal(false);
87
+ });
88
+ it("re-hashes through a partial update of the hashed field", async () => {
89
+ const id = await storedRowFrom0_1_11();
90
+ await model.update(id, { password: hash_rows_1.PASSWORD });
91
+ const after = await reload(id);
92
+ await expectVerifies(after);
93
+ (0, chai_1.expect)(after.isHashOutdated("password")).to.equal(false);
94
+ (0, chai_1.expect)(after.name).to.equal(hash_rows_1.ROW_FROM_0_1_11.name);
95
+ });
96
+ for (const [kind, store] of [
97
+ ["from 0.1.11", storedRowFrom0_1_11],
98
+ ["current", storedCurrentRow],
99
+ ]) {
100
+ it(`a partial update of another field keeps the hash of a ${kind} row`, async () => {
101
+ const id = await store();
102
+ const stored = (await reload(id)).password;
103
+ await model.update(id, { name: "Renamed" });
104
+ const after = await reload(id);
105
+ (0, chai_1.expect)(after.name).to.equal("Renamed");
106
+ (0, chai_1.expect)(after.password).to.equal(stored);
107
+ await expectVerifies(after);
108
+ });
109
+ it(`a whole-row update of another field keeps the hash of a ${kind} row`, async () => {
110
+ const id = await store();
111
+ const account = await reload(id);
112
+ const stored = account.password;
113
+ account.name = "Renamed";
114
+ await model.update(account);
115
+ const after = await reload(id);
116
+ (0, chai_1.expect)(after.name).to.equal("Renamed");
117
+ (0, chai_1.expect)(after.password).to.equal(stored);
118
+ await expectVerifies(after);
119
+ });
120
+ it(`lock() then a whole-row update keeps the hash of a ${kind} row`, async () => {
121
+ const id = await store();
122
+ const account = await reload(id);
123
+ const stored = account.password;
124
+ (0, common_1.lock)(account, hash_1.HashModifier, undefined);
125
+ await model.update(account);
126
+ const after = await reload(id);
127
+ (0, chai_1.expect)(after.password).to.equal(stored);
128
+ await expectVerifies(after);
129
+ });
130
+ }
131
+ });
132
+ //# sourceMappingURL=hash_upgrade.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash_upgrade.test.js","sourceRoot":"","sources":["../../src/tests/hash_upgrade.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare const PASSWORD = "correct horse battery staple";
2
+ /**
3
+ * `describe` for tests that spend several scrypt runs. One run takes hundreds of
4
+ * milliseconds on a busy machine, which passes mocha's 2 s limit in a few runs.
5
+ */
6
+ export declare function scryptSuite(title: string, body: () => void): void;
7
+ /** A row as `@Hashed()` stored it in the published 0.1.11: a bare salted SHA-256. */
8
+ export declare const ROW_FROM_0_1_11: {
9
+ _id: string;
10
+ email: string;
11
+ name: string;
12
+ _internal: {
13
+ meta: {
14
+ HashModifier: {
15
+ salt: string;
16
+ };
17
+ };
18
+ data: {
19
+ password: string;
20
+ };
21
+ };
22
+ };
23
+ /**
24
+ * A row as the published 0.1.11 stored `@Hashed({ algorithm: "sha256" })` on
25
+ * `password` and `@Hashed({ algorithm: "md5" })` on `checksum`, set to `{ a: 1 }`.
26
+ */
27
+ export declare const FINGERPRINT_ROW_FROM_0_1_11: {
28
+ _id: string;
29
+ _internal: {
30
+ meta: {
31
+ HashModifier: {
32
+ salt: string;
33
+ };
34
+ };
35
+ data: {
36
+ password: string;
37
+ checksum: string;
38
+ };
39
+ };
40
+ };
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FINGERPRINT_ROW_FROM_0_1_11 = exports.ROW_FROM_0_1_11 = exports.PASSWORD = void 0;
4
+ exports.scryptSuite = scryptSuite;
5
+ exports.PASSWORD = "correct horse battery staple";
6
+ const SCRYPT_SUITE_TIMEOUT_MS = 30_000;
7
+ /**
8
+ * `describe` for tests that spend several scrypt runs. One run takes hundreds of
9
+ * milliseconds on a busy machine, which passes mocha's 2 s limit in a few runs.
10
+ */
11
+ function scryptSuite(title, body) {
12
+ describe(title, function () {
13
+ this.timeout(SCRYPT_SUITE_TIMEOUT_MS);
14
+ body();
15
+ });
16
+ }
17
+ /** A row as `@Hashed()` stored it in the published 0.1.11: a bare salted SHA-256. */
18
+ exports.ROW_FROM_0_1_11 = {
19
+ _id: "row-from-0.1.11",
20
+ email: "legacy@example.test",
21
+ name: "Legacy",
22
+ _internal: {
23
+ meta: { HashModifier: { salt: "BMNyCHwpLNt2tkqkyB5rwOj1q2wfDIo6" } },
24
+ data: { password: "nPamXXaKC8N+8W7xqxTSo8r+pS9jXMkjJu2XMZtUR+A=" },
25
+ },
26
+ };
27
+ /**
28
+ * A row as the published 0.1.11 stored `@Hashed({ algorithm: "sha256" })` on
29
+ * `password` and `@Hashed({ algorithm: "md5" })` on `checksum`, set to `{ a: 1 }`.
30
+ */
31
+ exports.FINGERPRINT_ROW_FROM_0_1_11 = {
32
+ _id: "fingerprint-from-0.1.11",
33
+ _internal: {
34
+ meta: { HashModifier: { salt: "lGSUI2bFDjUE9tTMDmgi4epfFNLsU0xY" } },
35
+ data: {
36
+ password: "UsoNNNsm8q4tIZffzzw9QX58b98ksdLC6JN+a1FN93g=",
37
+ checksum: "NbsXtgSCNhwxQV/eBQ+LKA==",
38
+ },
39
+ },
40
+ };
41
+ //# sourceMappingURL=hash-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-rows.js","sourceRoot":"","sources":["../../../src/tests/helpers/hash-rows.ts"],"names":[],"mappings":";;;AAQA,kCAKC;AAbY,QAAA,QAAQ,GAAG,8BAA8B,CAAC;AAEvD,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAa,EAAE,IAAgB;IACzD,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACxE,QAAA,eAAe,GAAG;IAC7B,GAAG,EAAE,iBAAiB;IACtB,KAAK,EAAE,qBAAqB;IAC5B,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE;QACT,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,kCAAkC,EAAE,EAAE;QACpE,IAAI,EAAE,EAAE,QAAQ,EAAE,8CAA8C,EAAE;KACnE;CACF,CAAC;AAEF;;;GAGG;AACU,QAAA,2BAA2B,GAAG;IACzC,GAAG,EAAE,yBAAyB;IAC9B,SAAS,EAAE;QACT,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,kCAAkC,EAAE,EAAE;QACpE,IAAI,EAAE;YACJ,QAAQ,EAAE,8CAA8C;YACxD,QAAQ,EAAE,0BAA0B;SACrC;KACF;CACF,CAAC"}
@@ -1,4 +1,4 @@
1
- type ModuleRequire = (request: string) => unknown;
1
+ type ModuleRequire = (request: string) => object;
2
2
  /**
3
3
  * Evaluates built packages a second time, the way the core gives each
4
4
  * provider binding its own copy of an interface: every file under `folders`
@@ -7,7 +7,31 @@ exports.CreateOtherInstance = CreateOtherInstance;
7
7
  const node_module_1 = __importDefault(require("node:module"));
8
8
  const node_fs_1 = require("node:fs");
9
9
  const node_path_1 = __importDefault(require("node:path"));
10
- const internals = node_module_1.default;
10
+ function hasInternals(candidate) {
11
+ return ("_resolveFilename" in candidate &&
12
+ typeof candidate._resolveFilename === "function" &&
13
+ "_nodeModulePaths" in candidate &&
14
+ typeof candidate._nodeModulePaths === "function");
15
+ }
16
+ function isLoadable(candidate) {
17
+ return "load" in candidate && typeof candidate.load === "function";
18
+ }
19
+ function isModuleExports(value) {
20
+ return ((typeof value === "object" || typeof value === "function") && value !== null);
21
+ }
22
+ function exportsOf(loaded) {
23
+ const exported = loaded.exports;
24
+ if (!isModuleExports(exported)) {
25
+ throw new Error(`${loaded.filename} does not export an object or a function`);
26
+ }
27
+ return exported;
28
+ }
29
+ function resolveInternals() {
30
+ if (!hasInternals(node_module_1.default)) {
31
+ throw new Error("node:module does not expose its resolution internals");
32
+ }
33
+ return node_module_1.default;
34
+ }
11
35
  /**
12
36
  * Evaluates built packages a second time, the way the core gives each
13
37
  * provider binding its own copy of an interface: every file under `folders`
@@ -24,22 +48,30 @@ function CreateOtherInstance(folders) {
24
48
  const load = (filename, parent) => {
25
49
  const cached = modules.get(filename);
26
50
  if (cached) {
27
- return cached.exports;
51
+ return exportsOf(cached);
28
52
  }
29
53
  const loaded = new node_module_1.default(filename, parent);
30
54
  loaded.filename = filename;
31
- loaded.paths = internals._nodeModulePaths(node_path_1.default.dirname(filename));
32
- loaded.require = ((request) => requireFrom(loaded, request));
55
+ loaded.paths = resolveInternals()._nodeModulePaths(node_path_1.default.dirname(filename));
56
+ loaded.require = (request) => requireFrom(loaded, request);
33
57
  modules.set(filename, loaded);
58
+ if (!isLoadable(loaded)) {
59
+ throw new Error("node:module instances cannot load a file directly");
60
+ }
34
61
  loaded.load(filename);
35
- return loaded.exports;
62
+ return exportsOf(loaded);
36
63
  };
37
64
  const requireFrom = (parent, request) => {
38
- const filename = internals._resolveFilename(request, parent);
65
+ const filename = resolveInternals()._resolveFilename(request, parent);
39
66
  const isOwned = owned.some((root) => filename.startsWith(root));
40
- return isOwned
41
- ? load(filename, parent)
42
- : node_module_1.default.prototype.require.call(parent, request);
67
+ if (isOwned) {
68
+ return load(filename, parent);
69
+ }
70
+ const required = node_module_1.default.prototype.require.call(parent, request);
71
+ if (!isModuleExports(required)) {
72
+ throw new Error(`${request} does not export an object or a function`);
73
+ }
74
+ return required;
43
75
  };
44
76
  return (request) => requireFrom(module, request);
45
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"other-instance.js","sourceRoot":"","sources":["../../../src/tests/helpers/other-instance.ts"],"names":[],"mappings":";;;;;AA2BA,kDA4BC;AAvDD,8DAAiC;AACjC,qCAAuC;AACvC,0DAA6B;AAa7B,MAAM,SAAS,GAAG,qBAAoC,CAAC;AAEvD;;;;;;;;;GASG;AACH,SAAgB,mBAAmB,CAAC,OAAiB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,MAAM,CAAC,GAAG,mBAAI,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,MAAM,IAAI,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAW,EAAE;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,qBAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,gBAAgB,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,OAAe,EAAE,EAAE,CACpC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAsB,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAoC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,OAAe,EAAW,EAAE;QAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,OAAO,OAAO;YACZ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;YACxB,CAAC,CAAC,qBAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,OAAO,CAAC,OAAe,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"other-instance.js","sourceRoot":"","sources":["../../../src/tests/helpers/other-instance.ts"],"names":[],"mappings":"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"}