@pylonts/dsl 1.0.5 → 1.0.6

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.
package/dist/dto.d.ts CHANGED
@@ -21,7 +21,8 @@ export interface ImportRef {
21
21
  export type DtoArrayFieldDef = BaseField & {
22
22
  type: 'array';
23
23
  jsType: 'array';
24
- items: DtoField;
24
+ /** Element type: inline DtoField, or a reference to an existing DTO (rendered by name) */
25
+ items: DtoField | DtoMessage;
25
26
  };
26
27
  export type DtoObjectFieldDef = BaseField & {
27
28
  type: 'object';
@@ -58,7 +59,8 @@ export declare class DtoField implements SchemaBase {
58
59
  }
59
60
  export declare class DtoArrayField extends DtoField {
60
61
  field: DtoArrayFieldDef;
61
- items(): DtoField;
62
+ /** Element type: inline DtoField or a referenced DtoMessage (rendered by name). */
63
+ items(): DtoField | DtoMessage;
62
64
  }
63
65
  export declare class DtoObjectField extends DtoField {
64
66
  field: DtoObjectFieldDef;
package/dist/dto.js CHANGED
@@ -66,6 +66,7 @@ class DtoField {
66
66
  }
67
67
  exports.DtoField = DtoField;
68
68
  class DtoArrayField extends DtoField {
69
+ /** Element type: inline DtoField or a referenced DtoMessage (rendered by name). */
69
70
  items() {
70
71
  return this.field.items;
71
72
  }
@@ -110,11 +111,9 @@ function dtoField(field) {
110
111
  return new DtoField(field);
111
112
  }
112
113
  function dtoArrayField(def) {
113
- // Reuse an existing DTO as the array element: expand its fields into an object.
114
- const items = def.items instanceof DtoMessage
115
- ? new DtoObjectField({ name: '', type: 'object', jsType: 'object', properties: def.items.fields })
116
- : def.items;
117
- return new DtoArrayField({ name: '', type: 'array', jsType: 'array', ...def, items });
114
+ // Items stay as-is: an inline DtoField is rendered inline, a DtoMessage is
115
+ // referenced by name (the driver renders Type.Array(<DtoName>)).
116
+ return new DtoArrayField({ name: '', type: 'array', jsType: 'array', ...def });
118
117
  }
119
118
  function dtoObjectField(def) {
120
119
  return new DtoObjectField({ name: '', type: 'object', jsType: 'object', ...def });
@@ -84,7 +84,11 @@ function renderField(f, indent, resolver) {
84
84
  }
85
85
  function renderValue(f, indent, resolver) {
86
86
  if (f instanceof dto_1.DtoArrayField) {
87
- return `Type.Array(${renderField(f.items(), indent + 1, resolver)})`;
87
+ const items = f.items();
88
+ // Referenced DTO element — render by name (same-file export), not expanded.
89
+ if (items instanceof dto_1.DtoMessage)
90
+ return `Type.Array(${items.name})`;
91
+ return `Type.Array(${renderField(items, indent + 1, resolver)})`;
88
92
  }
89
93
  if (f instanceof dto_1.DtoObjectField) {
90
94
  return renderObject(f.properties(), indent + 1, resolver);
@@ -97,7 +101,9 @@ function renderValue(f, indent, resolver) {
97
101
  }
98
102
  function collectEnumImports(f, resolver, out) {
99
103
  if (f instanceof dto_1.DtoArrayField) {
100
- collectEnumImports(f.items(), resolver, out);
104
+ const items = f.items();
105
+ if (!(items instanceof dto_1.DtoMessage))
106
+ collectEnumImports(items, resolver, out);
101
107
  return;
102
108
  }
103
109
  if (f instanceof dto_1.DtoObjectField) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pylonts/dsl",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Schema definition DSL with drivers: MySQL DDL, TS enum, TypeBox schema codegen.",
5
5
  "type": "commonjs",
6
6
  "main": "src/index.ts",
package/src/dto.ts CHANGED
@@ -29,7 +29,8 @@ export interface ImportRef {
29
29
  export type DtoArrayFieldDef = BaseField & {
30
30
  type: 'array';
31
31
  jsType: 'array';
32
- items: DtoField;
32
+ /** Element type: inline DtoField, or a reference to an existing DTO (rendered by name) */
33
+ items: DtoField | DtoMessage;
33
34
  };
34
35
 
35
36
  export type DtoObjectFieldDef = BaseField & {
@@ -104,7 +105,8 @@ export class DtoField implements SchemaBase {
104
105
  export class DtoArrayField extends DtoField {
105
106
  declare field: DtoArrayFieldDef;
106
107
 
107
- items(): DtoField {
108
+ /** Element type: inline DtoField or a referenced DtoMessage (rendered by name). */
109
+ items(): DtoField | DtoMessage {
108
110
  return this.field.items;
109
111
  }
110
112
  }
@@ -153,11 +155,9 @@ export function dtoField(field: Field): DtoField {
153
155
  }
154
156
 
155
157
  export function dtoArrayField(def: { items: DtoField | DtoMessage } & Omit<BaseField, 'name'>): DtoArrayField {
156
- // Reuse an existing DTO as the array element: expand its fields into an object.
157
- const items = def.items instanceof DtoMessage
158
- ? new DtoObjectField({ name: '', type: 'object', jsType: 'object', properties: def.items.fields })
159
- : def.items;
160
- return new DtoArrayField({ name: '', type: 'array', jsType: 'array', ...def, items });
158
+ // Items stay as-is: an inline DtoField is rendered inline, a DtoMessage is
159
+ // referenced by name (the driver renders Type.Array(<DtoName>)).
160
+ return new DtoArrayField({ name: '', type: 'array', jsType: 'array', ...def });
161
161
  }
162
162
 
163
163
  export function dtoObjectField(def: { properties: Record<string, DtoField> } & Omit<BaseField, 'name'>): DtoObjectField {
@@ -95,7 +95,10 @@ function renderField(f: DtoField, indent: number, resolver: EnumResolver | undef
95
95
 
96
96
  function renderValue(f: DtoField, indent: number, resolver: EnumResolver | undefined): string {
97
97
  if (f instanceof DtoArrayField) {
98
- return `Type.Array(${renderField(f.items(), indent + 1, resolver)})`;
98
+ const items = f.items();
99
+ // Referenced DTO element — render by name (same-file export), not expanded.
100
+ if (items instanceof DtoMessage) return `Type.Array(${items.name})`;
101
+ return `Type.Array(${renderField(items, indent + 1, resolver)})`;
99
102
  }
100
103
  if (f instanceof DtoObjectField) {
101
104
  return renderObject(f.properties(), indent + 1, resolver);
@@ -113,7 +116,8 @@ function collectEnumImports(
113
116
  out: Map<string, ImportRef>,
114
117
  ): void {
115
118
  if (f instanceof DtoArrayField) {
116
- collectEnumImports(f.items(), resolver, out);
119
+ const items = f.items();
120
+ if (!(items instanceof DtoMessage)) collectEnumImports(items, resolver, out);
117
121
  return;
118
122
  }
119
123
  if (f instanceof DtoObjectField) {