@carlonicora/nextjs-jsonapi 1.110.0 → 1.111.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.
- package/dist/{BlockNoteEditor-K7IIWM3S.mjs → BlockNoteEditor-A5LNFWHW.mjs} +2 -2
- package/dist/{BlockNoteEditor-7OKW6HHN.js → BlockNoteEditor-HNQNKCFP.js} +9 -9
- package/dist/{BlockNoteEditor-7OKW6HHN.js.map → BlockNoteEditor-HNQNKCFP.js.map} +1 -1
- package/dist/billing/index.js +299 -299
- package/dist/billing/index.mjs +1 -1
- package/dist/{chunk-AKXUNE3A.js → chunk-DRJUN4R6.js} +22 -19
- package/dist/chunk-DRJUN4R6.js.map +1 -0
- package/dist/{chunk-TXVVZLUQ.mjs → chunk-LYLGU2BK.mjs} +67 -64
- package/dist/chunk-LYLGU2BK.mjs.map +1 -0
- package/dist/client/index.js +2 -2
- package/dist/client/index.mjs +1 -1
- package/dist/components/index.js +2 -2
- package/dist/components/index.mjs +1 -1
- package/dist/contexts/index.js +2 -2
- package/dist/contexts/index.mjs +1 -1
- package/dist/features/help/index.js +30 -30
- package/dist/features/help/index.mjs +1 -1
- package/dist/scripts/generate-web-module/__tests__/container.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/container.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/container.spec.js +54 -0
- package/dist/scripts/generate-web-module/__tests__/container.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/data-service.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/data-service.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/data-service.spec.js +19 -0
- package/dist/scripts/generate-web-module/__tests__/data-service.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/editor.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/editor.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/editor.spec.js +35 -0
- package/dist/scripts/generate-web-module/__tests__/editor.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/fixtures.d.ts +4 -0
- package/dist/scripts/generate-web-module/__tests__/fixtures.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/fixtures.js +45 -0
- package/dist/scripts/generate-web-module/__tests__/fixtures.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/model-interface.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/model-interface.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/model-interface.spec.js +74 -0
- package/dist/scripts/generate-web-module/__tests__/model-interface.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/plumbing.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/plumbing.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/plumbing.spec.js +21 -0
- package/dist/scripts/generate-web-module/__tests__/plumbing.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/selector.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/selector.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/selector.spec.js +25 -0
- package/dist/scripts/generate-web-module/__tests__/selector.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.d.ts +2 -0
- package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.js +55 -0
- package/dist/scripts/generate-web-module/__tests__/table-module-list.spec.js.map +1 -0
- package/dist/scripts/generate-web-module/generator.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/generator.js +14 -11
- package/dist/scripts/generate-web-module/generator.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/container.template.d.ts +5 -1
- package/dist/scripts/generate-web-module/templates/components/container.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/container.template.js +43 -63
- package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/content.template.d.ts +7 -4
- package/dist/scripts/generate-web-module/templates/components/content.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/content.template.js +103 -14
- package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts +1 -1
- package/dist/scripts/generate-web-module/templates/components/editor.template.js +139 -150
- package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/index.d.ts +0 -1
- package/dist/scripts/generate-web-module/templates/components/index.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/index.js +1 -3
- package/dist/scripts/generate-web-module/templates/components/index.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/list-container.template.js +2 -2
- package/dist/scripts/generate-web-module/templates/components/list.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/list.template.js +6 -1
- package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/selector.template.js +48 -52
- package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/interface.template.js +38 -11
- package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/model.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/model.template.js +83 -26
- package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/service.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/service.template.js +21 -1
- package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/index.d.ts +1 -1
- package/dist/scripts/generate-web-module/templates/index.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/index.js +1 -2
- package/dist/scripts/generate-web-module/templates/index.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/module.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/module.template.js +11 -3
- package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/table-hook.template.js +31 -1
- package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -1
- package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts +0 -1
- package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/transformers/import-resolver.js +0 -1
- package/dist/scripts/generate-web-module/transformers/import-resolver.js.map +1 -1
- package/dist/scripts/generate-web-module/transformers/relationship-key.d.ts +5 -0
- package/dist/scripts/generate-web-module/transformers/relationship-key.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/relationship-key.js +21 -0
- package/dist/scripts/generate-web-module/transformers/relationship-key.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +2 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -1
- package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +21 -0
- package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +17 -0
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/generate-web-module/__tests__/container.spec.ts +58 -0
- package/scripts/generate-web-module/__tests__/data-service.spec.ts +18 -0
- package/scripts/generate-web-module/__tests__/editor.spec.ts +36 -0
- package/scripts/generate-web-module/__tests__/fixtures.ts +43 -0
- package/scripts/generate-web-module/__tests__/model-interface.spec.ts +77 -0
- package/scripts/generate-web-module/__tests__/plumbing.spec.ts +21 -0
- package/scripts/generate-web-module/__tests__/selector.spec.ts +24 -0
- package/scripts/generate-web-module/__tests__/table-module-list.spec.ts +59 -0
- package/scripts/generate-web-module/generator.ts +14 -13
- package/scripts/generate-web-module/templates/components/container.template.ts +51 -66
- package/scripts/generate-web-module/templates/components/content.template.ts +107 -15
- package/scripts/generate-web-module/templates/components/editor.template.ts +140 -152
- package/scripts/generate-web-module/templates/components/index.ts +0 -1
- package/scripts/generate-web-module/templates/components/list-container.template.ts +2 -2
- package/scripts/generate-web-module/templates/components/list.template.ts +6 -1
- package/scripts/generate-web-module/templates/components/selector.template.ts +48 -52
- package/scripts/generate-web-module/templates/data/interface.template.ts +44 -12
- package/scripts/generate-web-module/templates/data/model.template.ts +88 -28
- package/scripts/generate-web-module/templates/data/service.template.ts +23 -1
- package/scripts/generate-web-module/templates/index.ts +0 -1
- package/scripts/generate-web-module/templates/module.template.ts +13 -3
- package/scripts/generate-web-module/templates/table-hook.template.ts +31 -2
- package/scripts/generate-web-module/transformers/import-resolver.ts +0 -2
- package/scripts/generate-web-module/transformers/relationship-key.ts +18 -0
- package/scripts/generate-web-module/transformers/relationship-resolver.ts +2 -0
- package/scripts/generate-web-module/types/json-schema.interface.ts +9 -0
- package/scripts/generate-web-module/types/template-data.interface.ts +7 -0
- package/src/features/notification/components/modals/NotificationModal.tsx +2 -5
- package/src/features/notification/contexts/NotificationContext.tsx +29 -13
- package/src/features/notification/contexts/__tests__/NotificationContext.spec.tsx +70 -0
- package/dist/chunk-AKXUNE3A.js.map +0 -1
- package/dist/chunk-TXVVZLUQ.mjs.map +0 -1
- package/dist/scripts/generate-web-module/templates/components/details.template.d.ts +0 -14
- package/dist/scripts/generate-web-module/templates/components/details.template.d.ts.map +0 -1
- package/dist/scripts/generate-web-module/templates/components/details.template.js +0 -112
- package/dist/scripts/generate-web-module/templates/components/details.template.js.map +0 -1
- package/scripts/generate-web-module/templates/components/details.template.ts +0 -116
- /package/dist/{BlockNoteEditor-K7IIWM3S.mjs.map → BlockNoteEditor-A5LNFWHW.mjs.map} +0 -0
|
@@ -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,
|
|
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
|
-
|
|
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":";AAAA;;;;GAIG;;AAWH,
|
|
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,
|
|
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 {
|
|
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
|
|
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} }
|
|
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
|
-
<
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
</
|
|
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
|
-
<
|
|
134
|
-
className="text-muted hover:text-destructive ml-2 h-
|
|
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
|
|
142
|
+
<PopoverContent className="w-(--radix-popover-trigger-width) p-0" align="start">
|
|
140
143
|
<Command shouldFilter={false}>
|
|
141
|
-
<
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
{
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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,
|
|
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;
|
|
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
|
-
|
|
62
|
-
|
|
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 -
|
|
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
|
-
|
|
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
|
-
//
|
|
158
|
+
// Intersect with the named meta interface if the relationship has edge fields.
|
|
131
159
|
if (rel.fields && rel.fields.length > 0) {
|
|
132
|
-
|
|
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":";AAAA;;;;GAIG;;
|
|
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;
|
|
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
|
-
|
|
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 {
|
|
100
|
+
imports.push(`import { ${coreNames.sort(byName).join(", ")} } from "@carlonicora/nextjs-jsonapi/core";`);
|
|
61
101
|
}
|
|
62
102
|
else {
|
|
63
|
-
imports.push(`import { AbstractApiData,
|
|
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
|
|
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
|
-
|
|
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
|
|
136
|
+
// Use intersection with the named meta interface if relationship has fields (edge properties)
|
|
98
137
|
if (rel.fields && rel.fields.length > 0) {
|
|
99
|
-
|
|
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 -
|
|
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
|
-
|
|
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
|
-
//
|
|
190
|
+
// Intersect with the named meta interface if relationship has fields (edge properties)
|
|
154
191
|
if (rel.fields && rel.fields.length > 0) {
|
|
155
|
-
|
|
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,
|
|
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 =
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
260
|
-
|
|
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,
|
|
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} = {`);
|