Skip to content

Commit d78da87

Browse files
committed
Get tests passing
1 parent 653e0b5 commit d78da87

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

.github/workflows/unit-tests.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ jobs:
3838
SESSION_SECRET: "secret"
3939
MAGIC_LINK_SECRET: "secret"
4040
ENCRYPTION_KEY: "secret"
41-
41+
42+
- name: 🧪 Run Package Unit Tests
43+
run: pnpm run test --filter "@trigger.dev/*"
4244

4345
- name: 🧪 Run Internal Unit Tests
4446
run: pnpm run test --filter "@internal/*"

packages/core/src/v3/utils/flattenAttributes.ts

+17-16
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,15 @@ export function unflattenAttributes(
9797
for (const [key, value] of Object.entries(obj)) {
9898
const parts = key.split(".").reduce(
9999
(acc, part) => {
100-
if (part.includes("[")) {
101-
// Handling nested array indices
100+
if (part.startsWith("[") && part.endsWith("]")) {
101+
// Handle array indices more precisely
102102
const match = part.match(/^\[(\d+)\]$/);
103-
const number = match?.[1];
104-
105-
if (number) {
106-
acc.push(parseInt(number));
107-
return acc;
103+
if (match && match[1]) {
104+
acc.push(parseInt(match[1]));
105+
} else {
106+
// Remove brackets for non-numeric array keys
107+
acc.push(part.slice(1, -1));
108108
}
109-
110-
acc.push(part.replace("[", "").replace("]", ""));
111109
} else {
112110
acc.push(part);
113111
}
@@ -119,22 +117,25 @@ export function unflattenAttributes(
119117
let current: any = result;
120118
for (let i = 0; i < parts.length - 1; i++) {
121119
const part = parts[i];
120+
const nextPart = parts[i + 1];
122121

123-
if (!part) {
122+
if (!part && part !== 0) {
124123
continue;
125124
}
126125

127-
const nextPart = parts[i + 1];
128-
const isArray = typeof nextPart === "number";
129-
if (isArray && !Array.isArray(current[part])) {
130-
current[part] = [];
131-
} else if (!isArray && current[part] === undefined) {
126+
if (typeof nextPart === "number") {
127+
// Ensure we create an array for numeric indices
128+
current[part] = Array.isArray(current[part]) ? current[part] : [];
129+
} else if (current[part] === undefined) {
130+
// Create an object for non-numeric paths
132131
current[part] = {};
133132
}
133+
134134
current = current[part];
135135
}
136+
136137
const lastPart = parts[parts.length - 1];
137-
if (lastPart) {
138+
if (lastPart !== undefined) {
138139
current[lastPart] = rehydrateNull(value);
139140
}
140141
}

packages/core/test/flattenAttributes.test.ts

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
import { flattenAttributes, unflattenAttributes } from "../src/v3/utils/flattenAttributes.js";
22

33
describe("flattenAttributes", () => {
4+
it("handles number keys correctl", () => {
5+
expect(flattenAttributes({ bar: { "25": "foo" } })).toEqual({ "bar.25": "foo" });
6+
expect(unflattenAttributes({ "bar.25": "foo" })).toEqual({ bar: { "25": "foo" } });
7+
expect(flattenAttributes({ bar: ["foo", "baz"] })).toEqual({
8+
"bar.[0]": "foo",
9+
"bar.[1]": "baz",
10+
});
11+
expect(unflattenAttributes({ "bar.[0]": "foo", "bar.[1]": "baz" })).toEqual({
12+
bar: ["foo", "baz"],
13+
});
14+
expect(flattenAttributes({ bar: { 25: "foo" } })).toEqual({ "bar.25": "foo" });
15+
expect(unflattenAttributes({ "bar.25": "foo" })).toEqual({ bar: { 25: "foo" } });
16+
});
17+
418
it("handles null correctly", () => {
519
expect(flattenAttributes(null)).toEqual({ "": "$@null((" });
620
expect(unflattenAttributes({ "": "$@null((" })).toEqual(null);

0 commit comments

Comments
 (0)