@carlonicora/nextjs-jsonapi 1.110.0 → 1.111.0

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 (123) hide show
  1. package/dist/scripts/generate-web-module/__tests__/container.spec.d.ts +2 -0
  2. package/dist/scripts/generate-web-module/__tests__/container.spec.d.ts.map +1 -0
  3. package/dist/scripts/generate-web-module/__tests__/container.spec.js +54 -0
  4. package/dist/scripts/generate-web-module/__tests__/container.spec.js.map +1 -0
  5. package/dist/scripts/generate-web-module/__tests__/data-service.spec.d.ts +2 -0
  6. package/dist/scripts/generate-web-module/__tests__/data-service.spec.d.ts.map +1 -0
  7. package/dist/scripts/generate-web-module/__tests__/data-service.spec.js +19 -0
  8. package/dist/scripts/generate-web-module/__tests__/data-service.spec.js.map +1 -0
  9. package/dist/scripts/generate-web-module/__tests__/editor.spec.d.ts +2 -0
  10. package/dist/scripts/generate-web-module/__tests__/editor.spec.d.ts.map +1 -0
  11. package/dist/scripts/generate-web-module/__tests__/editor.spec.js +35 -0
  12. package/dist/scripts/generate-web-module/__tests__/editor.spec.js.map +1 -0
  13. package/dist/scripts/generate-web-module/__tests__/fixtures.d.ts +4 -0
  14. package/dist/scripts/generate-web-module/__tests__/fixtures.d.ts.map +1 -0
  15. package/dist/scripts/generate-web-module/__tests__/fixtures.js +45 -0
  16. package/dist/scripts/generate-web-module/__tests__/fixtures.js.map +1 -0
  17. package/dist/scripts/generate-web-module/__tests__/model-interface.spec.d.ts +2 -0
  18. package/dist/scripts/generate-web-module/__tests__/model-interface.spec.d.ts.map +1 -0
  19. package/dist/scripts/generate-web-module/__tests__/model-interface.spec.js +74 -0
  20. package/dist/scripts/generate-web-module/__tests__/model-interface.spec.js.map +1 -0
  21. package/dist/scripts/generate-web-module/__tests__/plumbing.spec.d.ts +2 -0
  22. package/dist/scripts/generate-web-module/__tests__/plumbing.spec.d.ts.map +1 -0
  23. package/dist/scripts/generate-web-module/__tests__/plumbing.spec.js +21 -0
  24. package/dist/scripts/generate-web-module/__tests__/plumbing.spec.js.map +1 -0
  25. package/dist/scripts/generate-web-module/__tests__/selector.spec.d.ts +2 -0
  26. package/dist/scripts/generate-web-module/__tests__/selector.spec.d.ts.map +1 -0
  27. package/dist/scripts/generate-web-module/__tests__/selector.spec.js +25 -0
  28. package/dist/scripts/generate-web-module/__tests__/selector.spec.js.map +1 -0
  29. package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.d.ts +2 -0
  30. package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.d.ts.map +1 -0
  31. package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.js +55 -0
  32. package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.js.map +1 -0
  33. package/dist/scripts/generate-web-module/generator.d.ts.map +1 -1
  34. package/dist/scripts/generate-web-module/generator.js +14 -11
  35. package/dist/scripts/generate-web-module/generator.js.map +1 -1
  36. package/dist/scripts/generate-web-module/templates/components/container.template.d.ts +5 -1
  37. package/dist/scripts/generate-web-module/templates/components/container.template.d.ts.map +1 -1
  38. package/dist/scripts/generate-web-module/templates/components/container.template.js +43 -63
  39. package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -1
  40. package/dist/scripts/generate-web-module/templates/components/content.template.d.ts +7 -4
  41. package/dist/scripts/generate-web-module/templates/components/content.template.d.ts.map +1 -1
  42. package/dist/scripts/generate-web-module/templates/components/content.template.js +103 -14
  43. package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -1
  44. package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts +1 -1
  45. package/dist/scripts/generate-web-module/templates/components/editor.template.js +139 -150
  46. package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -1
  47. package/dist/scripts/generate-web-module/templates/components/index.d.ts +0 -1
  48. package/dist/scripts/generate-web-module/templates/components/index.d.ts.map +1 -1
  49. package/dist/scripts/generate-web-module/templates/components/index.js +1 -3
  50. package/dist/scripts/generate-web-module/templates/components/index.js.map +1 -1
  51. package/dist/scripts/generate-web-module/templates/components/list-container.template.js +2 -2
  52. package/dist/scripts/generate-web-module/templates/components/list.template.d.ts.map +1 -1
  53. package/dist/scripts/generate-web-module/templates/components/list.template.js +6 -1
  54. package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -1
  55. package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts.map +1 -1
  56. package/dist/scripts/generate-web-module/templates/components/selector.template.js +48 -52
  57. package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -1
  58. package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts.map +1 -1
  59. package/dist/scripts/generate-web-module/templates/data/interface.template.js +38 -11
  60. package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -1
  61. package/dist/scripts/generate-web-module/templates/data/model.template.d.ts.map +1 -1
  62. package/dist/scripts/generate-web-module/templates/data/model.template.js +83 -26
  63. package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -1
  64. package/dist/scripts/generate-web-module/templates/data/service.template.d.ts.map +1 -1
  65. package/dist/scripts/generate-web-module/templates/data/service.template.js +21 -1
  66. package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -1
  67. package/dist/scripts/generate-web-module/templates/index.d.ts +1 -1
  68. package/dist/scripts/generate-web-module/templates/index.d.ts.map +1 -1
  69. package/dist/scripts/generate-web-module/templates/index.js +1 -2
  70. package/dist/scripts/generate-web-module/templates/index.js.map +1 -1
  71. package/dist/scripts/generate-web-module/templates/module.template.d.ts.map +1 -1
  72. package/dist/scripts/generate-web-module/templates/module.template.js +11 -3
  73. package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -1
  74. package/dist/scripts/generate-web-module/templates/table-hook.template.js +31 -1
  75. package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -1
  76. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts +0 -1
  77. package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts.map +1 -1
  78. package/dist/scripts/generate-web-module/transformers/import-resolver.js +0 -1
  79. package/dist/scripts/generate-web-module/transformers/import-resolver.js.map +1 -1
  80. package/dist/scripts/generate-web-module/transformers/relationship-key.d.ts +5 -0
  81. package/dist/scripts/generate-web-module/transformers/relationship-key.d.ts.map +1 -0
  82. package/dist/scripts/generate-web-module/transformers/relationship-key.js +21 -0
  83. package/dist/scripts/generate-web-module/transformers/relationship-key.js.map +1 -0
  84. package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -1
  85. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +2 -0
  86. package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -1
  87. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +21 -0
  88. package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -1
  89. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +17 -0
  90. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -1
  91. package/package.json +1 -1
  92. package/scripts/generate-web-module/__tests__/container.spec.ts +58 -0
  93. package/scripts/generate-web-module/__tests__/data-service.spec.ts +18 -0
  94. package/scripts/generate-web-module/__tests__/editor.spec.ts +36 -0
  95. package/scripts/generate-web-module/__tests__/fixtures.ts +43 -0
  96. package/scripts/generate-web-module/__tests__/model-interface.spec.ts +77 -0
  97. package/scripts/generate-web-module/__tests__/plumbing.spec.ts +21 -0
  98. package/scripts/generate-web-module/__tests__/selector.spec.ts +24 -0
  99. package/scripts/generate-web-module/__tests__/table-module-list.spec.ts +59 -0
  100. package/scripts/generate-web-module/generator.ts +14 -13
  101. package/scripts/generate-web-module/templates/components/container.template.ts +51 -66
  102. package/scripts/generate-web-module/templates/components/content.template.ts +107 -15
  103. package/scripts/generate-web-module/templates/components/editor.template.ts +140 -152
  104. package/scripts/generate-web-module/templates/components/index.ts +0 -1
  105. package/scripts/generate-web-module/templates/components/list-container.template.ts +2 -2
  106. package/scripts/generate-web-module/templates/components/list.template.ts +6 -1
  107. package/scripts/generate-web-module/templates/components/selector.template.ts +48 -52
  108. package/scripts/generate-web-module/templates/data/interface.template.ts +44 -12
  109. package/scripts/generate-web-module/templates/data/model.template.ts +88 -28
  110. package/scripts/generate-web-module/templates/data/service.template.ts +23 -1
  111. package/scripts/generate-web-module/templates/index.ts +0 -1
  112. package/scripts/generate-web-module/templates/module.template.ts +13 -3
  113. package/scripts/generate-web-module/templates/table-hook.template.ts +31 -2
  114. package/scripts/generate-web-module/transformers/import-resolver.ts +0 -2
  115. package/scripts/generate-web-module/transformers/relationship-key.ts +18 -0
  116. package/scripts/generate-web-module/transformers/relationship-resolver.ts +2 -0
  117. package/scripts/generate-web-module/types/json-schema.interface.ts +9 -0
  118. package/scripts/generate-web-module/types/template-data.interface.ts +7 -0
  119. package/dist/scripts/generate-web-module/templates/components/details.template.d.ts +0 -14
  120. package/dist/scripts/generate-web-module/templates/components/details.template.d.ts.map +0 -1
  121. package/dist/scripts/generate-web-module/templates/components/details.template.js +0 -112
  122. package/dist/scripts/generate-web-module/templates/components/details.template.js.map +0 -1
  123. package/scripts/generate-web-module/templates/components/details.template.ts +0 -116
@@ -22,8 +22,8 @@ import { Modules } from "@carlonicora/nextjs-jsonapi/core";
22
22
 
23
23
  function ${names.pascalCase}ListContainerInternal() {
24
24
  return (
25
- <RoundPageContainer module={Modules.${names.pascalCase}}>
26
- <${names.pascalCase}List />
25
+ <RoundPageContainer module={Modules.${names.pascalCase}} fullWidth>
26
+ <${names.pascalCase}List fullWidth />
27
27
  </RoundPageContainer>
28
28
  );
29
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAyCvE"}
1
+ {"version":3,"file":"list.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA8CvE"}
@@ -30,7 +30,11 @@ import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jso
30
30
  import { useTranslations } from "next-intl";
31
31
  import { ReactNode } from "react";
32
32
 
33
- export default function ${names.pascalCase}List() {
33
+ type ${names.pascalCase}ListProps = {
34
+ fullWidth?: boolean;
35
+ };
36
+
37
+ export default function ${names.pascalCase}List({ fullWidth }: ${names.pascalCase}ListProps) {
34
38
  const t = useTranslations();
35
39
 
36
40
  const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
@@ -48,6 +52,7 @@ export default function ${names.pascalCase}List() {
48
52
  tableGeneratorType={Modules.${names.pascalCase}}
49
53
  functions={functions}
50
54
  title={t(\`entities.${names.pluralCamel.toLowerCase()}\`, { count: 2 })}
55
+ fullWidth={fullWidth}
51
56
  />
52
57
  );
53
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list.template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list.template.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA4K3E"}
1
+ {"version":3,"file":"selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAwK3E"}
@@ -20,11 +20,14 @@ function generateSelectorTemplate(data) {
20
20
  return `"use client";
21
21
 
22
22
  import {
23
+ Button,
23
24
  Command,
25
+ CommandEmpty,
26
+ CommandGroup,
27
+ CommandInput,
24
28
  CommandItem,
25
29
  CommandList,
26
30
  FormFieldWrapper,
27
- Input,
28
31
  Popover,
29
32
  PopoverContent,
30
33
  PopoverTrigger,
@@ -35,7 +38,7 @@ import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jso
35
38
  import { useDebounce } from "@carlonicora/nextjs-jsonapi/client";
36
39
  import { Modules } from "@carlonicora/nextjs-jsonapi/core";
37
40
 
38
- import { CircleX, RefreshCwIcon, SearchIcon, XIcon } from "lucide-react";
41
+ import { ChevronsUpDown, Loader2, XIcon } from "lucide-react";
39
42
  import { useTranslations } from "next-intl";
40
43
  import { useCallback, useEffect, useRef, useState } from "react";
41
44
 
@@ -97,12 +100,12 @@ export default function ${names.pascalCase}Selector({
97
100
  const set${names.pascalCase} = (${names.camelCase}?: ${names.pascalCase}Interface) => {
98
101
  if (onChange) onChange(${names.camelCase});
99
102
  if (!${names.camelCase}) {
100
- form.setValue(id, undefined, { shouldDirty: true });
103
+ form.setValue(id, undefined);
101
104
  setOpen(false);
102
105
  return;
103
106
  }
104
107
 
105
- form.setValue(id, { id: ${names.camelCase}.id, name: ${names.camelCase}.${displayProp} }, { shouldDirty: true });
108
+ form.setValue(id, { id: ${names.camelCase}.id, name: ${names.camelCase}.${displayProp} });
106
109
  setOpen(false);
107
110
 
108
111
  setTimeout(() => {
@@ -117,62 +120,55 @@ export default function ${names.pascalCase}Selector({
117
120
  <Popover open={open} onOpenChange={setOpen} modal={true}>
118
121
  <div className="flex w-full flex-row items-center justify-between">
119
122
  <PopoverTrigger className="w-full">
120
- <div className="flex w-full flex-row items-center justify-start rounded-md">
121
- {field.value ? (
122
- <div className="bg-input/20 dark:bg-input/30 border-input flex h-7 w-full flex-row items-center justify-start rounded-md border px-2 py-0.5 text-sm md:text-xs/relaxed">
123
- <span>{field.value?.name ?? ""}</span>
124
- </div>
125
- ) : (
126
- <div className="bg-input/20 dark:bg-input/30 border-input text-muted-foreground flex h-7 w-full flex-row items-center justify-start rounded-md border px-2 py-0.5 text-sm md:text-xs/relaxed">
127
- {placeholder ?? t(\`generic.search.placeholder\`, { type: t(\`entities.${i18nKey}\`, { count: 1 }) })}
128
- </div>
129
- )}
130
- </div>
123
+ <Button
124
+ variant="outline"
125
+ role="combobox"
126
+ aria-expanded={open}
127
+ className="h-auto min-h-10 w-full justify-between px-3 py-2"
128
+ >
129
+ <span className={field.value ? "" : "text-muted-foreground"}>
130
+ {field.value?.name ?? placeholder ?? t(\`generic.search.placeholder\`, { type: t(\`entities.${i18nKey}\`, { count: 1 }) })}
131
+ </span>
132
+ <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
133
+ </Button>
131
134
  </PopoverTrigger>
132
135
  {field.value && (
133
- <CircleX
134
- className="text-muted hover:text-destructive ml-2 h-4 w-4 shrink-0 cursor-pointer"
136
+ <XIcon
137
+ className="text-muted-foreground hover:text-destructive ml-2 h-5 w-5 cursor-pointer"
135
138
  onClick={() => set${names.pascalCase}()}
136
139
  />
137
140
  )}
138
141
  </div>
139
- <PopoverContent align="start" className="w-(--anchor-width)">
142
+ <PopoverContent className="w-(--radix-popover-trigger-width) p-0" align="start">
140
143
  <Command shouldFilter={false}>
141
- <div className="relative mb-2 w-full">
142
- <SearchIcon className="text-muted-foreground absolute top-2.5 left-2.5 h-4 w-4" />
143
- <Input
144
- placeholder={t(\`generic.search.placeholder\`, { type: t(\`entities.${i18nKey}\`, { count: 1 }) })}
145
- type="text"
146
- className="w-full pr-8 pl-8"
147
- onChange={(e) => setSearchTerm(e.target.value)}
148
- value={searchTerm}
149
- />
150
- {isSearching ? (
151
- <RefreshCwIcon className="text-muted-foreground absolute top-2.5 right-2.5 h-4 w-4 animate-spin" />
152
- ) : searchTermRef.current ? (
153
- <XIcon
154
- className={\`absolute top-2.5 right-2.5 h-4 w-4 \${searchTermRef.current ? "cursor-pointer" : "text-muted-foreground"}\`}
155
- onClick={() => {
156
- setSearchTerm("");
157
- search("");
158
- }}
159
- />
160
- ) : (
161
- <></>
162
- )}
163
- </div>
144
+ <CommandInput
145
+ placeholder={t(\`generic.search.placeholder\`, { type: t(\`entities.${i18nKey}\`, { count: 1 }) })}
146
+ value={searchTerm}
147
+ onValueChange={setSearchTerm}
148
+ />
164
149
  <CommandList>
165
- {data.data &&
166
- data.data.length > 0 &&
167
- (data.data as ${names.pascalCase}Interface[]).map((${names.camelCase}: ${names.pascalCase}Interface) => (
168
- <CommandItem
169
- className="cursor-pointer hover:bg-muted data-selected:hover:bg-muted bg-transparent data-selected:bg-transparent"
170
- key={${names.camelCase}.id}
171
- onSelect={() => set${names.pascalCase}(${names.camelCase})}
172
- >
173
- {${names.camelCase}.${displayProp}}
174
- </CommandItem>
175
- ))}
150
+ {isSearching && (
151
+ <div className="flex items-center justify-center py-6">
152
+ <Loader2 className="text-muted-foreground h-4 w-4 animate-spin" />
153
+ </div>
154
+ )}
155
+ {!isSearching && data.data && data.data.length === 0 && (
156
+ <CommandEmpty>{t(\`generic.search.no_results\`)}</CommandEmpty>
157
+ )}
158
+ {!isSearching && data.data && data.data.length > 0 && (
159
+ <CommandGroup>
160
+ {(data.data as ${names.pascalCase}Interface[]).map((${names.camelCase}: ${names.pascalCase}Interface) => (
161
+ <CommandItem
162
+ key={${names.camelCase}.id}
163
+ value={${names.camelCase}.id}
164
+ onSelect={() => set${names.pascalCase}(${names.camelCase})}
165
+ className="hover:bg-muted data-selected:hover:bg-muted bg-transparent data-selected:bg-transparent cursor-pointer"
166
+ >
167
+ {${names.camelCase}.${displayProp}}
168
+ </CommandItem>
169
+ ))}
170
+ </CommandGroup>
171
+ )}
176
172
  </CommandList>
177
173
  </Command>
178
174
  </PopoverContent>
@@ -1 +1 @@
1
- {"version":3,"file":"selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,4DA4KC;AAlLD;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,YAAY,GAAG,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,OAAO;;;;;;;;;;;;WAYE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAChH,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;;OASlH,KAAK,CAAC,UAAU;;;;;gBAKP,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;;;;0BAI3B,KAAK,CAAC,UAAU;;;;;;;KAOrC,KAAK,CAAC,UAAU;;;;;;;;;;kCAUa,KAAK,CAAC,UAAU;;eAEnC,KAAK,CAAC,UAAU;;;sBAGT,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;aAwBzB,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;6BAC5C,KAAK,CAAC,SAAS;WACjC,KAAK,CAAC,SAAS;;;;;;8BAMI,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,SAAS,IAAI,WAAW;;;;;;;;;;;;;;;;;;;;;;+FAsBM,OAAO;;;;;;;;sCAQhE,KAAK,CAAC,UAAU;;;;;;;;;0FASoC,OAAO;;;;;;;;;;;;;;;;;;;;;;;oCAuB7D,KAAK,CAAC,UAAU,qBAAqB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU;;;+BAG9E,KAAK,CAAC,SAAS;6CACD,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS;;2BAErD,KAAK,CAAC,SAAS,IAAI,WAAW;;;;;;;;;;;;CAYxD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,4DAwKC;AA9KD;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC/C,MAAM,YAAY,GAAG,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,OAAO;;;;;;;;;;;;;;;WAeE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAChH,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;;OASlH,KAAK,CAAC,UAAU;;;;;gBAKP,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;;;;0BAI3B,KAAK,CAAC,UAAU;;;;;;;KAOrC,KAAK,CAAC,UAAU;;;;;;;;;;kCAUa,KAAK,CAAC,UAAU;;eAEnC,KAAK,CAAC,UAAU;;;sBAGT,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;aAwBzB,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;6BAC5C,KAAK,CAAC,SAAS;WACjC,KAAK,CAAC,SAAS;;;;;;8BAMI,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,SAAS,IAAI,WAAW;;;;;;;;;;;;;;;;;;;;;;kHAsByB,OAAO;;;;;;;;sCAQnF,KAAK,CAAC,UAAU;;;;;;;wFAOkC,OAAO;;;;;;;;;;;;;;;uCAexD,KAAK,CAAC,UAAU,qBAAqB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU;;iCAE/E,KAAK,CAAC,SAAS;mCACb,KAAK,CAAC,SAAS;+CACH,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS;;;6BAGrD,KAAK,CAAC,SAAS,IAAI,WAAW;;;;;;;;;;;;;;CAc1D,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"interface.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/data/interface.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAuC,MAAM,qCAAqC,CAAC;AAGhH;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAa5E"}
1
+ {"version":3,"file":"interface.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/data/interface.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAuC,MAAM,qCAAqC,CAAC;AAWhH;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAc5E"}
@@ -7,6 +7,13 @@
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.generateInterfaceTemplate = generateInterfaceTemplate;
9
9
  const name_transformer_1 = require("../../transformers/name-transformer");
10
+ /**
11
+ * Build the named `<Pascal>RelationshipMeta` interface name for a relationship
12
+ * that carries edge fields (mirrors live OpportunityInterface.ts).
13
+ */
14
+ function relationshipMetaName(rel) {
15
+ return `${(0, name_transformer_1.toPascalCase)(rel.alias ?? rel.name)}RelationshipMeta`;
16
+ }
10
17
  /**
11
18
  * Generate the interface file content
12
19
  *
@@ -16,15 +23,32 @@ const name_transformer_1 = require("../../transformers/name-transformer");
16
23
  function generateInterfaceTemplate(data) {
17
24
  const { names, extendsContent, fields, relationships } = data;
18
25
  const imports = generateImports(data);
26
+ const metaInterfaces = generateMetaInterfaces(data);
19
27
  const inputType = generateInputType(data);
20
28
  const interfaceDefinition = generateInterface(data);
21
29
  return `${imports}
22
-
30
+ ${metaInterfaces ? `\n${metaInterfaces}\n` : ""}
23
31
  ${inputType}
24
32
 
25
33
  ${interfaceDefinition}
26
34
  `;
27
35
  }
36
+ /**
37
+ * Generate named `<Pascal>RelationshipMeta` interfaces for relationships that
38
+ * carry edge fields. Reused by getters and the Input type's meta arrays.
39
+ */
40
+ function generateMetaInterfaces(data) {
41
+ return data.relationships
42
+ .filter((rel) => rel.fields && rel.fields.length > 0)
43
+ .map((rel) => {
44
+ const metaName = relationshipMetaName(rel);
45
+ const body = rel
46
+ .fields.map((f) => ` ${f.name}${f.nullable ? "?" : ""}: ${f.tsType};`)
47
+ .join("\n");
48
+ return `export interface ${metaName} {\n${body}\n}`;
49
+ })
50
+ .join("\n\n");
51
+ }
28
52
  /**
29
53
  * Generate import statements
30
54
  */
@@ -57,10 +81,9 @@ function generateImports(data) {
57
81
  function generateInputType(data) {
58
82
  const { names, extendsContent, fields, relationships } = data;
59
83
  const fieldLines = [" id: string;"];
60
- // Add fields (excluding inherited ones if extending Content)
61
- const fieldsToInclude = extendsContent
62
- ? fields.filter((f) => !["name", "tldr", "abstract"].includes(f.name))
63
- : fields;
84
+ // Add fields (excluding inherited ones if extending Content, and read-only
85
+ // fields which are server-derived and never sent back in the Input).
86
+ const fieldsToInclude = (extendsContent ? fields.filter((f) => !["name", "tldr", "abstract"].includes(f.name)) : fields).filter((f) => !f.readOnly);
64
87
  fieldsToInclude.forEach((field) => {
65
88
  const optional = field.nullable ? "?" : "";
66
89
  fieldLines.push(` ${field.name}${optional}: ${field.tsType};`);
@@ -84,6 +107,11 @@ function generateInputType(data) {
84
107
  const effectiveMany = rel.alias || rel.name;
85
108
  const key = `${(0, name_transformer_1.toCamelCase)(effectiveMany)}Ids`;
86
109
  fieldLines.push(` ${key}?: string[];`);
110
+ // For many relationships with edge fields, also emit a parallel meta array.
111
+ if (rel.fields && rel.fields.length > 0) {
112
+ const metaShape = rel.fields.map((f) => `${f.name}: ${f.tsType}`).join("; ");
113
+ fieldLines.push(` ${(0, name_transformer_1.toCamelCase)(effectiveMany)}Meta?: { id: string; ${metaShape} }[];`);
114
+ }
87
115
  }
88
116
  });
89
117
  if (extendsContent) {
@@ -115,11 +143,11 @@ function generateInterface(data) {
115
143
  const effectiveName = rel.alias || rel.variant || rel.name;
116
144
  if (rel.single) {
117
145
  const propertyName = (0, name_transformer_1.toCamelCase)(effectiveName);
118
- // Build return type - use intersection if relationship has fields
146
+ // Build return type - intersect with the named meta interface if the
147
+ // relationship has edge fields.
119
148
  let baseType = rel.interfaceName;
120
149
  if (rel.fields && rel.fields.length > 0) {
121
- const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
122
- baseType = `${rel.interfaceName} & { ${metaFields} }`;
150
+ baseType = `${rel.interfaceName} & ${relationshipMetaName(rel)}`;
123
151
  }
124
152
  const type = rel.nullable ? `(${baseType}) | undefined` : baseType;
125
153
  getterLines.push(` get ${propertyName}(): ${type};`);
@@ -127,10 +155,9 @@ function generateInterface(data) {
127
155
  else {
128
156
  const effectiveMany = rel.alias || rel.name;
129
157
  const propertyName = (0, name_transformer_1.pluralize)((0, name_transformer_1.toCamelCase)(effectiveMany));
130
- // Use intersection type if relationship has fields (edge properties)
158
+ // Intersect with the named meta interface if the relationship has edge fields.
131
159
  if (rel.fields && rel.fields.length > 0) {
132
- const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
133
- getterLines.push(` get ${propertyName}(): (${rel.interfaceName} & { ${metaFields} })[];`);
160
+ getterLines.push(` get ${propertyName}(): (${rel.interfaceName} & ${relationshipMetaName(rel)})[];`);
134
161
  }
135
162
  else {
136
163
  getterLines.push(` get ${propertyName}(): ${rel.interfaceName}[];`);
@@ -1 +1 @@
1
- {"version":3,"file":"interface.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/data/interface.template.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interface.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/data/interface.template.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/data/model.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAiB,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE1F;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAuBxE"}
1
+ {"version":3,"file":"model.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/data/model.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAuC,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAyBhH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAuBxE"}
@@ -7,7 +7,30 @@
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.generateModelTemplate = generateModelTemplate;
9
9
  const name_transformer_1 = require("../../transformers/name-transformer");
10
+ const relationship_key_1 = require("../../transformers/relationship-key");
10
11
  const field_mapping_types_1 = require("../../types/field-mapping.types");
12
+ /**
13
+ * Build the named `<Pascal>RelationshipMeta` interface name for a relationship
14
+ * that carries edge fields (mirrors live Opportunity.ts / OpportunityInterface.ts).
15
+ *
16
+ * These named interfaces are declared in the module's OWN `<Module>Interface.ts`
17
+ * (emitted by interface.template.ts), so the model imports them from there.
18
+ */
19
+ function relMetaName(rel) {
20
+ return `${(0, name_transformer_1.toPascalCase)(rel.alias ?? rel.name)}RelationshipMeta`;
21
+ }
22
+ /**
23
+ * Determine whether the model needs the `formatLocalDate` helper imported.
24
+ *
25
+ * True when any data field is a date/datetime, or any relationship edge field
26
+ * is a date/datetime (edge dates would also be serialized via the helper).
27
+ */
28
+ function hasDateField(data) {
29
+ const fieldIsDate = (type) => type === "date" || type === "datetime";
30
+ if (data.fields.some((f) => fieldIsDate(f.type)))
31
+ return true;
32
+ return data.relationships.some((rel) => (rel.fields ?? []).some((f) => fieldIsDate(f.type)));
33
+ }
11
34
  /**
12
35
  * Generate the model file content
13
36
  *
@@ -41,8 +64,21 @@ ${createJsonApiMethod}
41
64
  function generateImports(data) {
42
65
  const { names, extendsContent, relationships } = data;
43
66
  const imports = [];
44
- // Own interface import
45
- imports.push(`import { ${names.pascalCase}Input, ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";`);
67
+ // Own interface import — also pull in the named `<Pascal>RelationshipMeta`
68
+ // interfaces, which are all declared in this module's own Interface file.
69
+ const ownNamedImports = [`${names.pascalCase}Input`, `${names.pascalCase}Interface`];
70
+ const seenMeta = new Set();
71
+ relationships.forEach((rel) => {
72
+ if (!rel.fields || rel.fields.length === 0)
73
+ return;
74
+ const metaName = relMetaName(rel);
75
+ if (seenMeta.has(metaName))
76
+ return;
77
+ seenMeta.add(metaName);
78
+ ownNamedImports.push(metaName);
79
+ });
80
+ ownNamedImports.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
81
+ imports.push(`import { ${ownNamedImports.join(", ")} } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";`);
46
82
  // Relationship interface imports (deduplicated, skip self-referential)
47
83
  const seenInterfaces = new Set();
48
84
  relationships.forEach((rel) => {
@@ -54,13 +90,17 @@ function generateImports(data) {
54
90
  seenInterfaces.add(rel.interfaceName);
55
91
  imports.push(`import { ${rel.interfaceName} } from "${rel.interfaceImportPath}";`);
56
92
  });
57
- // Base class and core imports
93
+ // Base class and core imports (sorted case-insensitively to match live output)
94
+ const byName = (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
95
+ const coreNames = ["JsonApiHydratedDataInterface", "Modules"];
96
+ if (hasDateField(data))
97
+ coreNames.push("formatLocalDate");
58
98
  if (extendsContent) {
59
99
  imports.push(`import { Content } from "@/features/content/data/Content";`);
60
- imports.push(`import { JsonApiHydratedDataInterface, Modules } from "@carlonicora/nextjs-jsonapi/core";`);
100
+ imports.push(`import { ${coreNames.sort(byName).join(", ")} } from "@carlonicora/nextjs-jsonapi/core";`);
61
101
  }
62
102
  else {
63
- imports.push(`import { AbstractApiData, JsonApiHydratedDataInterface, Modules } from "@carlonicora/nextjs-jsonapi/core";`);
103
+ imports.push(`import { ${["AbstractApiData", ...coreNames].sort(byName).join(", ")} } from "@carlonicora/nextjs-jsonapi/core";`);
64
104
  }
65
105
  return imports.join("\n");
66
106
  }
@@ -83,21 +123,19 @@ function generatePrivateFields(data) {
83
123
  const effectiveName = rel.alias || rel.variant || rel.name;
84
124
  if (rel.single) {
85
125
  const propName = (0, name_transformer_1.toCamelCase)(effectiveName);
86
- // Use intersection type if relationship has fields
126
+ // Use intersection with the named meta interface if relationship has fields
87
127
  let typeDecl = rel.interfaceName;
88
128
  if (rel.fields && rel.fields.length > 0) {
89
- const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
90
- typeDecl = `${rel.interfaceName} & { ${metaFields} }`;
129
+ typeDecl = `${rel.interfaceName} & ${relMetaName(rel)}`;
91
130
  }
92
131
  lines.push(` private _${propName}?: ${typeDecl};`);
93
132
  }
94
133
  else {
95
134
  const effectiveMany = rel.alias || rel.name;
96
135
  const propName = (0, name_transformer_1.pluralize)((0, name_transformer_1.toCamelCase)(effectiveMany));
97
- // Use intersection type if relationship has fields (edge properties)
136
+ // Use intersection with the named meta interface if relationship has fields (edge properties)
98
137
  if (rel.fields && rel.fields.length > 0) {
99
- const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
100
- lines.push(` private _${propName}?: (${rel.interfaceName} & { ${metaFields} })[];`);
138
+ lines.push(` private _${propName}?: (${rel.interfaceName} & ${relMetaName(rel)})[];`);
101
139
  }
102
140
  else {
103
141
  lines.push(` private _${propName}?: ${rel.interfaceName}[];`);
@@ -129,11 +167,10 @@ function generateGetters(data) {
129
167
  const effectiveName = rel.alias || rel.variant || rel.name;
130
168
  if (rel.single) {
131
169
  const propName = (0, name_transformer_1.toCamelCase)(effectiveName);
132
- // Build return type - use intersection if relationship has fields
170
+ // Build return type - intersect with the named meta interface if relationship has fields
133
171
  let baseType = rel.interfaceName;
134
172
  if (rel.fields && rel.fields.length > 0) {
135
- const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
136
- baseType = `${rel.interfaceName} & { ${metaFields} }`;
173
+ baseType = `${rel.interfaceName} & ${relMetaName(rel)}`;
137
174
  }
138
175
  if (rel.nullable) {
139
176
  lines.push(` get ${propName}(): (${baseType}) | undefined {
@@ -150,10 +187,9 @@ function generateGetters(data) {
150
187
  else {
151
188
  const effectiveMany = rel.alias || rel.name;
152
189
  const propName = (0, name_transformer_1.pluralize)((0, name_transformer_1.toCamelCase)(effectiveMany));
153
- // Use intersection type if relationship has fields (edge properties)
190
+ // Intersect with the named meta interface if relationship has fields (edge properties)
154
191
  if (rel.fields && rel.fields.length > 0) {
155
- const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
156
- lines.push(` get ${propName}(): (${rel.interfaceName} & { ${metaFields} })[] {
192
+ lines.push(` get ${propName}(): (${rel.interfaceName} & ${relMetaName(rel)})[] {
157
193
  return this._${propName} ?? [];
158
194
  }`);
159
195
  }
@@ -199,10 +235,10 @@ function generateRehydrateMethod(data) {
199
235
  const effectiveName = rel.alias || rel.variant || rel.name;
200
236
  if (rel.single) {
201
237
  const propName = (0, name_transformer_1.toCamelCase)(effectiveName);
202
- const relationshipKey = (0, name_transformer_1.toCamelCase)(effectiveName);
238
+ const relationshipKey = (0, relationship_key_1.resolveRelationshipKey)(rel);
203
239
  // Use _readIncludedWithMeta for relationships with fields
204
240
  if (rel.fields && rel.fields.length > 0) {
205
- const metaType = `{ ${rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ")} }`;
241
+ const metaType = relMetaName(rel);
206
242
  const singleCast = rel.nullable
207
243
  ? ` as (${rel.interfaceName} & ${metaType}) | undefined`
208
244
  : ` as ${rel.interfaceName} & ${metaType}`;
@@ -215,10 +251,10 @@ function generateRehydrateMethod(data) {
215
251
  else {
216
252
  const effectiveMany = rel.alias || rel.name;
217
253
  const propName = (0, name_transformer_1.pluralize)((0, name_transformer_1.toCamelCase)(effectiveMany));
218
- const relationshipKey = (0, name_transformer_1.toCamelCase)(effectiveMany);
254
+ const relationshipKey = (0, relationship_key_1.resolveRelationshipKey)(rel);
219
255
  // Use _readIncludedWithMeta for relationships with fields (edge properties)
220
256
  if (rel.fields && rel.fields.length > 0) {
221
- const metaType = `{ ${rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ")} }`;
257
+ const metaType = relMetaName(rel);
222
258
  lines.push(` this._${propName} = this._readIncludedWithMeta<${rel.interfaceName}, ${metaType}>(data, "${relationshipKey}", Modules.${rel.name}) as (${rel.interfaceName} & ${metaType})[];`);
223
259
  }
224
260
  else {
@@ -255,14 +291,19 @@ function generateCreateJsonApiMethod(data) {
255
291
  lines.push(` super.addContentInput(response, data);`);
256
292
  lines.push(``);
257
293
  }
258
- // Field serialization (excluding inherited)
259
- const fieldsToInclude = extendsContent
260
- ? fields.filter((f) => !["name", "tldr", "abstract"].includes(f.name))
261
- : fields;
294
+ // Field serialization (excluding inherited and read-only fields).
295
+ // read-only fields are server-derived: present in rehydrate/getters but never sent back.
296
+ const fieldsToInclude = (extendsContent ? fields.filter((f) => !["name", "tldr", "abstract"].includes(f.name)) : fields).filter((f) => !f.readOnly);
262
297
  fieldsToInclude.forEach((field) => {
263
298
  if (field.isContentField) {
264
299
  lines.push(` if (data.${field.name} !== undefined) response.data.attributes.${field.name} = JSON.stringify(data.${field.name});`);
265
300
  }
301
+ else if (field.type === "date") {
302
+ lines.push(` if (data.${field.name} !== undefined) response.data.attributes.${field.name} = formatLocalDate(data.${field.name});`);
303
+ }
304
+ else if (field.type === "datetime") {
305
+ lines.push(` if (data.${field.name} !== undefined) response.data.attributes.${field.name} = data.${field.name}.toISOString();`);
306
+ }
266
307
  else {
267
308
  lines.push(` if (data.${field.name} !== undefined) response.data.attributes.${field.name} = data.${field.name};`);
268
309
  }
@@ -274,7 +315,7 @@ function generateCreateJsonApiMethod(data) {
274
315
  relationshipsToSerialize.forEach((rel) => {
275
316
  const effectiveName = rel.alias || rel.variant || rel.name;
276
317
  const payloadKey = rel.single ? `${(0, name_transformer_1.toCamelCase)(effectiveName)}Id` : `${(0, name_transformer_1.toCamelCase)(effectiveName)}Ids`;
277
- const relationshipKey = (0, name_transformer_1.toCamelCase)(effectiveName);
318
+ const relationshipKey = (0, relationship_key_1.resolveRelationshipKey)(rel);
278
319
  if (rel.single) {
279
320
  lines.push(` if (data.${payloadKey}) {`);
280
321
  lines.push(` response.data.relationships.${relationshipKey} = {`);
@@ -294,6 +335,22 @@ function generateCreateJsonApiMethod(data) {
294
335
  lines.push(` };`);
295
336
  lines.push(` }`);
296
337
  }
338
+ else if (rel.fields && rel.fields.length > 0) {
339
+ // MANY relationship with edge fields: per-item meta resolved from a meta array.
340
+ const metaProp = `${(0, name_transformer_1.toCamelCase)(effectiveName)}Meta`;
341
+ lines.push(` if (data.${payloadKey} !== undefined) {`);
342
+ lines.push(` response.data.relationships.${relationshipKey} = {`);
343
+ lines.push(` data: data.${payloadKey}.map((id) => {`);
344
+ lines.push(` const meta = data.${metaProp}?.find((m) => m.id === id);`);
345
+ lines.push(` return {`);
346
+ lines.push(` type: Modules.${rel.name}.name,`);
347
+ lines.push(` id,`);
348
+ lines.push(` ...(meta ? { meta: { ${rel.fields.map((f) => `${f.name}: meta.${f.name}`).join(", ")} } } : {}),`);
349
+ lines.push(` };`);
350
+ lines.push(` }),`);
351
+ lines.push(` };`);
352
+ lines.push(` }`);
353
+ }
297
354
  else {
298
355
  lines.push(` if (data.${payloadKey} && data.${payloadKey}.length > 0) {`);
299
356
  lines.push(` response.data.relationships.${relationshipKey} = {`);