@agentuity/migrate 3.0.0-beta.2 → 3.0.0-beta.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"schema-to-zod.d.ts","sourceRoot":"","sources":["../../../src/transforms/v3/schema-to-zod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAkF7D"}
1
+ {"version":3,"file":"schema-to-zod.d.ts","sourceRoot":"","sources":["../../../src/transforms/v3/schema-to-zod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CA4F7D"}
@@ -94,8 +94,45 @@ export function schemaToZod(source) {
94
94
  if (output !== unionBefore) {
95
95
  changes.push('Rewrote z.union(a, b, c) → z.union([a, b, c])');
96
96
  }
97
+ // 6. @agentuity/schema's `.pick(['a', 'b'])` / `.omit(['a', 'b'])` use
98
+ // the array form; zod 4 only accepts the object/mask form
99
+ // (`{ a: true, b: true }`). Rewrite call sites where the sole
100
+ // argument is a string-array literal.
101
+ const maskBefore = output;
102
+ output = rewritePickOmitCalls(output);
103
+ if (output !== maskBefore) {
104
+ changes.push("Rewrote .pick(['a']) / .omit(['a']) to .pick({a: true}) / .omit({a: true})");
105
+ }
97
106
  return { source: output, changed: changes.length > 0, changes };
98
107
  }
108
+ /**
109
+ * Walk `.pick([...])` / `.omit([...])` call sites and rewrite the
110
+ * string-array argument as a `{ key: true, ... }` mask, which is the
111
+ * only form zod 4 accepts. We only transform calls whose single
112
+ * argument is a literal array of string literals — anything more
113
+ * complex (a variable, a spread, mixed types) is left alone with a
114
+ * TODO comment so the user can hand-translate it.
115
+ */
116
+ function rewritePickOmitCalls(source) {
117
+ const pattern = /\.(pick|omit)\s*\(\s*\[([^\]]*)\]\s*\)/g;
118
+ return source.replace(pattern, (match, method, body) => {
119
+ const keys = [];
120
+ const keyPattern = /['"`]([^'"`]+)['"`]/g;
121
+ let m;
122
+ // biome-ignore lint/suspicious/noAssignInExpressions: standard global-regex drain pattern
123
+ while ((m = keyPattern.exec(body)) !== null) {
124
+ keys.push(m[1]);
125
+ }
126
+ // If the array contained anything other than string literals, leave
127
+ // the call alone with a TODO so the user can hand-translate.
128
+ const stripped = body.replace(/['"`][^'"`]+['"`]/g, '').replace(/[\s,]+/g, '');
129
+ if (stripped.length > 0 || keys.length === 0) {
130
+ return `/* TODO: rewrite as zod 4 mask: ${match} */ ${match}`;
131
+ }
132
+ const mask = keys.map((k) => `${k}: true`).join(', ');
133
+ return `.${method}({ ${mask} })`;
134
+ });
135
+ }
99
136
  /**
100
137
  * Walk `z.union(…)` call sites and wrap the args in an array literal unless
101
138
  * they already are one. We scan with a brace-depth counter so nested parens
@@ -1 +1 @@
1
- {"version":3,"file":"schema-to-zod.js","sourceRoot":"","sources":["../../../src/transforms/v3/schema-to-zod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,MAAM,QAAQ,GAAG;IAChB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,YAAY;IACZ,SAAS;IACT,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,MAAM;IACN,OAAO;IACP,cAAc;IACd,cAAc;IACd,eAAe;IACf,YAAY;CACZ,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAc;IACzC,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,uFAAuF;IACvF,MAAM,YAAY,GAAG,MAAM,CAAC;IAC5B,MAAM,GAAG,MAAM,CAAC,OAAO,CACtB,gEAAgE,EAChE,0BAA0B,CAC1B,CAAC;IACF,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CACX,iFAAiF,CACjF,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,wCAAwC;IACxC,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAChC,MAAM,GAAG,MAAM,CAAC,OAAO,CACtB,2EAA2E,EAC3E,EAAE,CACF,CAAC;IACF,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;IAED,qDAAqD;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,sCAAsC;IACtC,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,0BAA0B,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;QACzE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,GAAW,EAAE,EAAE;YACpD,gBAAgB,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBACvD,OAAO,GAAG,GAAG,YAAY,IAAI,EAAE,CAAC;YACjC,CAAC;YACD,oEAAoE;YACpE,qEAAqE;YACrE,8DAA8D;YAC9D,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,KAAK,OAAO;gBAAE,MAAM,GAAG,MAAM,CAAC;YACtC,IAAI,IAAI,KAAK,YAAY;gBAAE,MAAM,GAAG,WAAW,CAAC;YAChD,OAAO,GAAG,GAAG,KAAK,MAAM,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,YAAY,gBAAgB,2CAA2C,CAAC,CAAC;IACvF,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,MAAM,CAAC;IAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACpD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,mEAAmE;IACnE,MAAM,gBAAgB,GAAG,MAAM,CAAC;IAChC,MAAM,GAAG,MAAM,CAAC,OAAO,CACtB,sBAAsB,EACtB,kHAAkH,CAClH,CAAC;IACF,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACnF,CAAC;IAED,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,WAAW,GAAG,MAAM,CAAC;IAC3B,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM;QACP,CAAC;QACD,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACrB,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC;oBAAE,MAAM;YACxB,CAAC;YACD,CAAC,EAAE,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,OAAO,GAAG,GAAG,CAAC;QACzB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"schema-to-zod.js","sourceRoot":"","sources":["../../../src/transforms/v3/schema-to-zod.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/migrate",
3
- "version": "3.0.0-beta.2",
3
+ "version": "3.0.0-beta.4",
4
4
  "description": "Migration tool for Agentuity SDK (v1→v2 and v2→v3)",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Agentuity employees and contributors",
@@ -119,9 +119,48 @@ export function schemaToZod(source: string): SchemaToZodResult {
119
119
  changes.push('Rewrote z.union(a, b, c) → z.union([a, b, c])');
120
120
  }
121
121
 
122
+ // 6. @agentuity/schema's `.pick(['a', 'b'])` / `.omit(['a', 'b'])` use
123
+ // the array form; zod 4 only accepts the object/mask form
124
+ // (`{ a: true, b: true }`). Rewrite call sites where the sole
125
+ // argument is a string-array literal.
126
+ const maskBefore = output;
127
+ output = rewritePickOmitCalls(output);
128
+ if (output !== maskBefore) {
129
+ changes.push("Rewrote .pick(['a']) / .omit(['a']) to .pick({a: true}) / .omit({a: true})");
130
+ }
131
+
122
132
  return { source: output, changed: changes.length > 0, changes };
123
133
  }
124
134
 
135
+ /**
136
+ * Walk `.pick([...])` / `.omit([...])` call sites and rewrite the
137
+ * string-array argument as a `{ key: true, ... }` mask, which is the
138
+ * only form zod 4 accepts. We only transform calls whose single
139
+ * argument is a literal array of string literals — anything more
140
+ * complex (a variable, a spread, mixed types) is left alone with a
141
+ * TODO comment so the user can hand-translate it.
142
+ */
143
+ function rewritePickOmitCalls(source: string): string {
144
+ const pattern = /\.(pick|omit)\s*\(\s*\[([^\]]*)\]\s*\)/g;
145
+ return source.replace(pattern, (match, method: string, body: string) => {
146
+ const keys: string[] = [];
147
+ const keyPattern = /['"`]([^'"`]+)['"`]/g;
148
+ let m: RegExpExecArray | null;
149
+ // biome-ignore lint/suspicious/noAssignInExpressions: standard global-regex drain pattern
150
+ while ((m = keyPattern.exec(body)) !== null) {
151
+ keys.push(m[1]!);
152
+ }
153
+ // If the array contained anything other than string literals, leave
154
+ // the call alone with a TODO so the user can hand-translate.
155
+ const stripped = body.replace(/['"`][^'"`]+['"`]/g, '').replace(/[\s,]+/g, '');
156
+ if (stripped.length > 0 || keys.length === 0) {
157
+ return `/* TODO: rewrite as zod 4 mask: ${match} */ ${match}`;
158
+ }
159
+ const mask = keys.map((k) => `${k}: true`).join(', ');
160
+ return `.${method}({ ${mask} })`;
161
+ });
162
+ }
163
+
125
164
  /**
126
165
  * Walk `z.union(…)` call sites and wrap the args in an array literal unless
127
166
  * they already are one. We scan with a brace-depth counter so nested parens