@arcaelas/dynamite 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/SECURITY.md +41 -0
  2. package/build/__tests__/crud.spec.d.ts +1 -0
  3. package/build/__tests__/crud.spec.js +123 -0
  4. package/build/__tests__/crud.spec.js.map +1 -0
  5. package/build/__tests__/decorators.spec.d.ts +1 -0
  6. package/build/__tests__/decorators.spec.js +183 -0
  7. package/build/__tests__/decorators.spec.js.map +1 -0
  8. package/build/__tests__/instance-crud.spec.d.ts +1 -0
  9. package/build/__tests__/instance-crud.spec.js +82 -0
  10. package/build/__tests__/instance-crud.spec.js.map +1 -0
  11. package/build/index.js +2 -0
  12. package/build/index.js.map +7 -0
  13. package/build/src/core/table.d.ts +17 -0
  14. package/build/src/core/table.js +223 -0
  15. package/build/src/core/table.js.map +1 -0
  16. package/build/src/core/wrapper.d.ts +47 -0
  17. package/build/src/core/wrapper.js +57 -0
  18. package/build/src/core/wrapper.js.map +1 -0
  19. package/build/src/decorators/created_at.d.ts +4 -0
  20. package/build/src/decorators/created_at.js +22 -0
  21. package/build/src/decorators/created_at.js.map +1 -0
  22. package/build/src/decorators/default.d.ts +1 -0
  23. package/build/src/decorators/default.js +55 -0
  24. package/build/src/decorators/default.js.map +1 -0
  25. package/build/src/decorators/index.d.ts +1 -0
  26. package/build/src/decorators/index.js +24 -0
  27. package/build/src/decorators/index.js.map +1 -0
  28. package/build/src/decorators/index_sort.d.ts +1 -0
  29. package/build/src/decorators/index_sort.js +27 -0
  30. package/build/src/decorators/index_sort.js.map +1 -0
  31. package/build/src/decorators/mutate.d.ts +2 -0
  32. package/build/src/decorators/mutate.js +53 -0
  33. package/build/src/decorators/mutate.js.map +1 -0
  34. package/build/src/decorators/name.d.ts +1 -0
  35. package/build/src/decorators/name.js +41 -0
  36. package/build/src/decorators/name.js.map +1 -0
  37. package/build/src/decorators/not_null.d.ts +4 -0
  38. package/build/src/decorators/not_null.js +28 -0
  39. package/build/src/decorators/not_null.js.map +1 -0
  40. package/build/src/decorators/primary_key.d.ts +7 -0
  41. package/build/src/decorators/primary_key.js +30 -0
  42. package/build/src/decorators/primary_key.js.map +1 -0
  43. package/build/src/decorators/updated_at.d.ts +4 -0
  44. package/build/src/decorators/updated_at.js +23 -0
  45. package/build/src/decorators/updated_at.js.map +1 -0
  46. package/build/src/decorators/validate.d.ts +1 -0
  47. package/build/src/decorators/validate.js +54 -0
  48. package/build/src/decorators/validate.js.map +1 -0
  49. package/{src/index.ts → build/src/index.d.ts} +0 -3
  50. package/build/src/index.js +31 -0
  51. package/build/src/index.js.map +1 -0
  52. package/build/src/utils/naming.d.ts +1 -0
  53. package/build/src/utils/naming.js +18 -0
  54. package/build/src/utils/naming.js.map +1 -0
  55. package/build/tests/crud.spec.d.ts +1 -0
  56. package/build/tests/crud.spec.js +123 -0
  57. package/build/tests/crud.spec.js.map +1 -0
  58. package/build/tests/decorators.spec.d.ts +1 -0
  59. package/build/tests/decorators.spec.js +183 -0
  60. package/build/tests/decorators.spec.js.map +1 -0
  61. package/build/tests/instance-crud.spec.d.ts +1 -0
  62. package/build/tests/instance-crud.spec.js +82 -0
  63. package/build/tests/instance-crud.spec.js.map +1 -0
  64. package/package.json +35 -11
  65. package/.eslintrc.js +0 -0
  66. package/.prettierrc +0 -0
  67. package/__tests__/crud.spec.ts +0 -77
  68. package/__tests__/decorators.spec.ts +0 -134
  69. package/__tests__/instance-crud.spec.ts +0 -86
  70. package/jest.config.ts +0 -23
  71. package/src/core/table.ts +0 -226
  72. package/src/core/wrapper.ts +0 -103
  73. package/src/decorators/created_at.ts +0 -17
  74. package/src/decorators/default.ts +0 -56
  75. package/src/decorators/index.ts +0 -26
  76. package/src/decorators/index_sort.ts +0 -32
  77. package/src/decorators/mutate.ts +0 -54
  78. package/src/decorators/name.ts +0 -50
  79. package/src/decorators/not_null.ts +0 -21
  80. package/src/decorators/primary_key.ts +0 -26
  81. package/src/decorators/updated_at.ts +0 -18
  82. package/src/decorators/validate.ts +0 -59
  83. package/src/utils/naming.ts +0 -12
@@ -0,0 +1,82 @@
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
+ /* __tests__/instance-crud.spec.ts
13
+ * ------------------------------------------------------------------
14
+ * CRUD usando métodos de **instancia** de Dinamite ORM con DynamoDB Local.
15
+ * Se asume que DynamoDB Local está corriendo en http://localhost:7007.
16
+ * ------------------------------------------------------------------ */
17
+ const src_1 = require("../src");
18
+ // ---------- conexión DynamoDB Local ----------
19
+ beforeAll(() => (0, src_1.connect)({
20
+ region: "local",
21
+ endpoint: "http://localhost:7007",
22
+ credentials: { accessKeyId: "x", secretAccessKey: "x" },
23
+ }));
24
+ // ---------- Modelo de prueba ----------
25
+ let User = class User extends src_1.Table {
26
+ };
27
+ __decorate([
28
+ (0, src_1.PrimaryKey)(),
29
+ __metadata("design:type", String)
30
+ ], User.prototype, "id", void 0);
31
+ __decorate([
32
+ (0, src_1.NotNull)() // ← registra la columna en el wrapper
33
+ ,
34
+ __metadata("design:type", String)
35
+ ], User.prototype, "email", void 0);
36
+ __decorate([
37
+ (0, src_1.CreatedAt)(),
38
+ __metadata("design:type", String)
39
+ ], User.prototype, "created", void 0);
40
+ __decorate([
41
+ (0, src_1.UpdatedAt)(),
42
+ __metadata("design:type", String)
43
+ ], User.prototype, "updated", void 0);
44
+ User = __decorate([
45
+ (0, src_1.Name)("users")
46
+ ], User);
47
+ describe("CRUD Dinamite ORM – instancia", () => {
48
+ it("where() antes de existir la tabla → []", async () => {
49
+ const rows = await User.where();
50
+ expect(rows).toEqual([]);
51
+ });
52
+ it("save() → crea, update() → modifica, destroy() → elimina", async () => {
53
+ /* ---------- save (create) ---------- */
54
+ const u = new User({ id: "u1", email: "a@b.com" });
55
+ await u.save();
56
+ let rows = await User.where();
57
+ expect(rows).toHaveLength(1);
58
+ expect(rows[0].email).toBe("a@b.com");
59
+ const firstCreated = rows[0].created;
60
+ const firstUpdated = rows[0].updated;
61
+ /* ---------- update ---------- */
62
+ await u.update({ email: "c@d.com" });
63
+ rows = await User.where();
64
+ expect(rows[0].email).toBe("c@d.com");
65
+ expect(rows[0].updated).not.toBe(firstUpdated);
66
+ expect(rows[0].created).toBe(firstCreated);
67
+ /* ---------- destroy ---------- */
68
+ await u.destroy();
69
+ rows = await User.where();
70
+ expect(rows).toEqual([]);
71
+ });
72
+ it("la tabla realmente contiene el ítem mientras existe", async () => {
73
+ const u = new User({ id: "u2", email: "real@test.com" });
74
+ await u.save();
75
+ let rows = await User.where();
76
+ expect(rows.map((x) => x.id)).toContain("u2");
77
+ await u.destroy();
78
+ rows = await User.where();
79
+ expect(rows.map((x) => x.id)).not.toContain("u2");
80
+ });
81
+ });
82
+ //# sourceMappingURL=instance-crud.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-crud.spec.js","sourceRoot":"","sources":["../../tests/instance-crud.spec.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA;;;;wEAIwE;AACxE,gCAQgB;AAEhB,gDAAgD;AAChD,SAAS,CAAC,GAAG,EAAE,CACb,IAAA,aAAO,EAAC;IACN,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,uBAAuB;IACjC,WAAW,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;CACxD,CAAC,CACH,CAAC;AAEF,yCAAyC;AAEzC,IAAM,IAAI,GAAV,MAAM,IAAK,SAAQ,WAAK;CAYvB,CAAA;AAVS;IADP,IAAA,gBAAU,GAAE;;gCACM;AAGX;IADP,IAAA,aAAO,GAAE,CAAC,sCAAsC;;;mCAC3B;AAGd;IADP,IAAA,eAAS,GAAE;;qCACY;AAGhB;IADP,IAAA,eAAS,GAAE;;qCACY;AAXpB,IAAI;IADT,IAAA,UAAI,EAAC,OAAO,CAAC;GACR,IAAI,CAYT;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,yCAAyC;QACzC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAErC,kCAAkC;QAClC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAErC,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE3C,mCAAmC;QACnC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAElB,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAElB,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,20 +1,19 @@
1
1
  {
2
- "name": "@arcaelas/dynamite",
3
- "version": "1.0.0",
4
- "main": "index.js",
5
- "license": "MIT",
2
+ "author": {
3
+ "email": "comunity@arcaelas.com",
4
+ "name": "Arcaelas Insiders",
5
+ "url": "https://github.com/arcaelas"
6
+ },
7
+ "bugs": {
8
+ "email": "community@arcaelas.com",
9
+ "url": "https://github.com/arcaelas/dynamite/issues"
10
+ },
6
11
  "dependencies": {
7
12
  "@aws-sdk/client-dynamodb": "3.329.0",
8
13
  "@aws-sdk/lib-dynamodb": "3.329.0",
9
14
  "pluralize": "^8.0.0",
10
15
  "uuid": "^11.1.0"
11
16
  },
12
- "scripts": {
13
- "test": "jest",
14
- "test:watch": "jest --watch",
15
- "test:coverage": "jest --coverage",
16
- "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand"
17
- },
18
17
  "devDependencies": {
19
18
  "@types/jest": "^30.0.0",
20
19
  "@types/node": "^24.0.6",
@@ -25,5 +24,30 @@
25
24
  "tsconfig-paths": "^4.2.0",
26
25
  "tsx": "^4.20.3",
27
26
  "typescript": "^5.8.3"
28
- }
27
+ },
28
+ "files": [
29
+ "build/",
30
+ "*.md",
31
+ "*.json"
32
+ ],
33
+ "homepage": "https://github.com/arcaelas/dynamite",
34
+ "license": "ISC",
35
+ "main": "build/index.js",
36
+ "name": "@arcaelas/dynamite",
37
+ "publishConfig": {
38
+ "access": "public",
39
+ "registry": "https://registry.npmjs.org/"
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/arcaelas/dynamite.git"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc && node esbuild.js",
47
+ "commit": "npm publish --access=public",
48
+ "postpublish": "rm -rf build",
49
+ "prepublishOnly": "yarn test && npm version patch",
50
+ "test": "yarn build && jest"
51
+ },
52
+ "version": "1.0.1"
29
53
  }
package/.eslintrc.js DELETED
File without changes
package/.prettierrc DELETED
File without changes
@@ -1,77 +0,0 @@
1
- /* __tests__/crud.spec.ts
2
- * -----------------------------------------------------------
3
- * CRUD end-to-end contra DynamoDB Local (puerto 7007)
4
- */
5
-
6
- import { DeleteTableCommand, DynamoDBClient } from "@aws-sdk/client-dynamodb";
7
-
8
- import { connect, default as Table } from "../src/core/table";
9
- import wrapper from "../src/core/wrapper";
10
-
11
- import Default from "../src/decorators/default";
12
- import Name from "../src/decorators/name";
13
- import NotNull from "../src/decorators/not_null";
14
- import PrimaryKey from "../src/decorators/primary_key";
15
-
16
- const ddbCfg = {
17
- region: "local",
18
- endpoint: "http://localhost:7007",
19
- credentials: { accessKeyId: "x", secretAccessKey: "x" },
20
- };
21
-
22
- beforeAll(() => connect(ddbCfg));
23
-
24
- afterEach(async () => {
25
- /* Eliminar todas las tablas creadas por los tests */
26
- const ddb = new DynamoDBClient(ddbCfg);
27
- for (const e of wrapper.values()) {
28
- try {
29
- await ddb.send(new DeleteTableCommand({ TableName: e.name }));
30
- } catch (_) {
31
- /* tabla puede no existir */
32
- }
33
- }
34
- wrapper.clear();
35
- });
36
-
37
- describe("CRUD Dinamite ORM (DynamoDB Local)", () => {
38
- jest.setTimeout(10_000);
39
-
40
- it("create → update → where → destroy", async () => {
41
- @Name("crud_users1")
42
- class User extends Table {
43
- @PrimaryKey()
44
- declare id: string;
45
-
46
- @NotNull()
47
- declare email: string;
48
-
49
- @Default(() => new Date().toISOString())
50
- declare created_at: string;
51
- }
52
-
53
- /* ---------- create (auto-crea tabla) ---------- */
54
- const u1 = await User.create({ id: "u1", email: "a@b.com" });
55
- expect(u1.email).toBe("a@b.com");
56
-
57
- /* ---------- update ---------- */
58
- await User.update("u1", { email: "c@d.com" });
59
- const [after] = await User.where();
60
- expect(after.email).toBe("c@d.com");
61
-
62
- /* ---------- destroy ---------- */
63
- await User.destroy("u1");
64
- expect(await User.where()).toHaveLength(0);
65
- });
66
-
67
- it("where() devuelve [] si la tabla no existe", async () => {
68
- @Name("ghosts")
69
- class Ghost extends Table {
70
- @PrimaryKey()
71
- declare id: string;
72
- }
73
-
74
- const rows = await Ghost.where();
75
- expect(rows).toEqual([]);
76
- });
77
- });
@@ -1,134 +0,0 @@
1
- /* __tests__/decorators.spec.ts
2
- * -----------------------------------------------------------
3
- * Suite para verificar todos los decoradores Dinamite ORM.
4
- */
5
-
6
- import wrapper, { STORE } from "../src/core/wrapper";
7
-
8
- import CreatedAt from "../src/decorators/created_at";
9
- import Default from "../src/decorators/default";
10
- import Index from "../src/decorators/index";
11
- import IndexSort from "../src/decorators/index_sort";
12
- import Mutate from "../src/decorators/mutate";
13
- import Name from "../src/decorators/name";
14
- import NotNull from "../src/decorators/not_null";
15
- import PrimaryKey from "../src/decorators/primary_key";
16
- import UpdatedAt from "../src/decorators/updated_at";
17
- import Validate from "../src/decorators/validate";
18
-
19
- describe("Decoradores Dinamite ORM", () => {
20
- beforeEach(() => wrapper.clear());
21
-
22
- /* ---------------------------------------------------------- */
23
- it("nombre de tabla por defecto (snake_plural) cuando no se usa @Name", () => {
24
- class Book {
25
- @NotNull()
26
- declare title: string;
27
- }
28
- const meta = wrapper.get(Book)!;
29
- expect(meta.name).toBe("books"); // Book → books
30
- });
31
-
32
- /* ---------------------------------------------------------- */
33
- it("@Name (clase y propiedad)", () => {
34
- @Name("usuarios")
35
- class User {
36
- @Name("correo")
37
- declare email: string;
38
- }
39
-
40
- const meta = wrapper.get(User)!;
41
- expect(meta.name).toBe("usuarios");
42
- expect(meta.columns.get("email")!.name).toBe("correo");
43
- });
44
-
45
- /* ---------------------------------------------------------- */
46
- it("@Index + @IndexSort (PK + SK)", () => {
47
- class Post {
48
- @Index() // Partition Key
49
- declare slug: string;
50
-
51
- @IndexSort() // Sort Key
52
- declare created: string;
53
- }
54
-
55
- const meta = wrapper.get(Post)!;
56
- const pkCol = meta.columns.get("slug")!;
57
- const skCol = meta.columns.get("created")!;
58
-
59
- expect(pkCol.index).toBe(true);
60
- expect(skCol.indexSort).toBe(true);
61
- });
62
-
63
- /* ---------------------------------------------------------- */
64
- it("@PrimaryKey (combinado)", () => {
65
- class Comment {
66
- @PrimaryKey()
67
- declare id: string;
68
- }
69
-
70
- const meta = wrapper.get(Comment)!;
71
- const col = meta.columns.get("id")!;
72
-
73
- expect(col.index).toBe(true);
74
- expect(col.indexSort).toBe(true);
75
- });
76
-
77
- /* ---------------------------------------------------------- */
78
- it("@Default + @Mutate + @Validate pipeline", () => {
79
- @Name("tests")
80
- class Model {
81
- @Default(() => 10)
82
- @Mutate((v) => (v as number) * 2)
83
- @Validate((v) => ((v as number) >= 20 ? true : "menor a 20"))
84
- declare score: number;
85
- }
86
-
87
- const m = new Model();
88
- (m as any).score = undefined; // dispara pipeline
89
- expect(m.score).toBe(20);
90
- expect((m as any)[STORE].score).toBe(20);
91
-
92
- expect(() => {
93
- m.score = 5 as any;
94
- }).toThrow("menor a 20");
95
- });
96
-
97
- /* ---------------------------------------------------------- */
98
- it("@NotNull rechaza null/undefined/cadena vacía", () => {
99
- class File {
100
- @NotNull()
101
- declare path: string;
102
- }
103
-
104
- const f = new File();
105
- expect(() => ((f as any).path = null)).toThrow();
106
- expect(() => ((f as any).path = " ")).toThrow();
107
- f.path = "/tmp/file";
108
- expect(f.path).toBe("/tmp/file");
109
- });
110
-
111
- /* ---------------------------------------------------------- */
112
- it("@CreatedAt y @UpdatedAt gestionan timestamps", () => {
113
- class Audit {
114
- @CreatedAt()
115
- declare created: string;
116
-
117
- @UpdatedAt()
118
- declare updated: string;
119
- }
120
-
121
- const a = new Audit();
122
- (a as any).created = undefined;
123
- (a as any).updated = undefined;
124
-
125
- const firstCreated = a.created;
126
- const firstUpdated = a.updated;
127
-
128
- return new Promise((r) => setTimeout(r, 10)).then(() => {
129
- (a as any).updated = undefined;
130
- expect(a.created).toBe(firstCreated);
131
- expect(a.updated).not.toBe(firstUpdated);
132
- });
133
- });
134
- });
@@ -1,86 +0,0 @@
1
- /* __tests__/instance-crud.spec.ts
2
- * ------------------------------------------------------------------
3
- * CRUD usando métodos de **instancia** de Dinamite ORM con DynamoDB Local.
4
- * Se asume que DynamoDB Local está corriendo en http://localhost:7007.
5
- * ------------------------------------------------------------------ */
6
- import {
7
- connect,
8
- CreatedAt,
9
- Name,
10
- NotNull,
11
- PrimaryKey,
12
- Table,
13
- UpdatedAt,
14
- } from "../src";
15
-
16
- // ---------- conexión DynamoDB Local ----------
17
- beforeAll(() =>
18
- connect({
19
- region: "local",
20
- endpoint: "http://localhost:7007",
21
- credentials: { accessKeyId: "x", secretAccessKey: "x" },
22
- })
23
- );
24
-
25
- // ---------- Modelo de prueba ----------
26
- @Name("users")
27
- class User extends Table {
28
- @PrimaryKey()
29
- declare id: string;
30
-
31
- @NotNull() // ← registra la columna en el wrapper
32
- declare email: string;
33
-
34
- @CreatedAt()
35
- declare created: string;
36
-
37
- @UpdatedAt()
38
- declare updated: string;
39
- }
40
-
41
- describe("CRUD Dinamite ORM – instancia", () => {
42
- it("where() antes de existir la tabla → []", async () => {
43
- const rows = await User.where();
44
- expect(rows).toEqual([]);
45
- });
46
-
47
- it("save() → crea, update() → modifica, destroy() → elimina", async () => {
48
- /* ---------- save (create) ---------- */
49
- const u = new User({ id: "u1", email: "a@b.com" });
50
- await u.save();
51
-
52
- let rows = await User.where();
53
- expect(rows).toHaveLength(1);
54
- expect(rows[0].email).toBe("a@b.com");
55
-
56
- const firstCreated = rows[0].created;
57
- const firstUpdated = rows[0].updated;
58
-
59
- /* ---------- update ---------- */
60
- await u.update({ email: "c@d.com" });
61
-
62
- rows = await User.where();
63
- expect(rows[0].email).toBe("c@d.com");
64
- expect(rows[0].updated).not.toBe(firstUpdated);
65
- expect(rows[0].created).toBe(firstCreated);
66
-
67
- /* ---------- destroy ---------- */
68
- await u.destroy();
69
-
70
- rows = await User.where();
71
- expect(rows).toEqual([]);
72
- });
73
-
74
- it("la tabla realmente contiene el ítem mientras existe", async () => {
75
- const u = new User({ id: "u2", email: "real@test.com" });
76
- await u.save();
77
-
78
- let rows = await User.where();
79
- expect(rows.map((x) => x.id)).toContain("u2");
80
-
81
- await u.destroy();
82
-
83
- rows = await User.where();
84
- expect(rows.map((x) => x.id)).not.toContain("u2");
85
- });
86
- });
package/jest.config.ts DELETED
@@ -1,23 +0,0 @@
1
- // jest.config.ts
2
- import type { Config } from "@jest/types";
3
-
4
- const config: Config.InitialOptions = {
5
- preset: "ts-jest",
6
- testEnvironment: "node",
7
- testMatch: ["**/__tests__/**/*.spec.ts"],
8
- collectCoverageFrom: ["src/**/*.ts"],
9
- coverageDirectory: "coverage",
10
- coverageReporters: ["text", "lcov"],
11
- verbose: true,
12
- clearMocks: true, // Limpia mocks automáticamente
13
- transform: {
14
- "^.+\\.tsx?$": "ts-jest",
15
- },
16
- moduleNameMapper: {
17
- "^@/(.*)$": "<rootDir>/src/$1",
18
- },
19
- // Ignorar node_modules y cobertura
20
- testPathIgnorePatterns: ["/node_modules/", "/coverage/"],
21
- };
22
-
23
- export default config;