@carlonicora/nextjs-jsonapi 1.38.0 → 1.38.2
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-WQUJTVJL.mjs → BlockNoteEditor-5CEV5TZT.mjs} +2 -2
- package/dist/{BlockNoteEditor-3S2B36O3.js → BlockNoteEditor-VB72JQEO.js} +6 -6
- package/dist/{BlockNoteEditor-3S2B36O3.js.map → BlockNoteEditor-VB72JQEO.js.map} +1 -1
- package/dist/billing/index.js +299 -299
- package/dist/billing/index.mjs +1 -1
- package/dist/{chunk-T2JCZYWK.js → chunk-BYMBRMKS.js} +12 -4
- package/dist/chunk-BYMBRMKS.js.map +1 -0
- package/dist/{chunk-4PHADEKA.mjs → chunk-VMK2N3TQ.mjs} +12 -4
- package/dist/{chunk-4PHADEKA.mjs.map → chunk-VMK2N3TQ.mjs.map} +1 -1
- 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/scripts/generate-web-module/generator.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/generator.js +5 -0
- package/dist/scripts/generate-web-module/generator.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/container.template.js +7 -7
- package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/content.template.js +1 -1
- package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/deleter.template.js +2 -2
- package/dist/scripts/generate-web-module/templates/components/deleter.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/details.template.js +1 -1
- package/dist/scripts/generate-web-module/templates/components/details.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/editor.template.js +8 -13
- package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/list-container.template.js +1 -1
- package/dist/scripts/generate-web-module/templates/components/list-container.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/list.template.js +5 -5
- package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js +2 -2
- package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/components/selector.template.js +2 -2
- package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/context.template.js +4 -4
- package/dist/scripts/generate-web-module/templates/context.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/interface.template.js +3 -3
- package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/model.template.js +2 -2
- package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/data/service.template.js +1 -1
- package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/module.template.js +1 -1
- package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js +4 -4
- package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/pages/list-page.template.js +2 -2
- package/dist/scripts/generate-web-module/templates/pages/list-page.template.js.map +1 -1
- package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts.map +1 -1
- package/dist/scripts/generate-web-module/templates/table-hook.template.js +10 -6
- package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -1
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +2 -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/generator.ts +5 -0
- package/scripts/generate-web-module/templates/components/container.template.ts +7 -7
- package/scripts/generate-web-module/templates/components/content.template.ts +1 -1
- package/scripts/generate-web-module/templates/components/deleter.template.ts +2 -2
- package/scripts/generate-web-module/templates/components/details.template.ts +1 -1
- package/scripts/generate-web-module/templates/components/editor.template.ts +23 -18
- package/scripts/generate-web-module/templates/components/list-container.template.ts +1 -1
- package/scripts/generate-web-module/templates/components/list.template.ts +5 -5
- package/scripts/generate-web-module/templates/components/multi-selector.template.ts +2 -2
- package/scripts/generate-web-module/templates/components/selector.template.ts +2 -2
- package/scripts/generate-web-module/templates/context.template.ts +4 -4
- package/scripts/generate-web-module/templates/data/interface.template.ts +5 -11
- package/scripts/generate-web-module/templates/data/model.template.ts +2 -2
- package/scripts/generate-web-module/templates/data/service.template.ts +1 -1
- package/scripts/generate-web-module/templates/module.template.ts +1 -1
- package/scripts/generate-web-module/templates/pages/detail-page.template.ts +4 -4
- package/scripts/generate-web-module/templates/pages/list-page.template.ts +2 -2
- package/scripts/generate-web-module/templates/table-hook.template.ts +16 -8
- package/scripts/generate-web-module/types/template-data.interface.ts +9 -1
- package/src/features/auth/components/forms/Login.tsx +14 -2
- package/dist/chunk-T2JCZYWK.js.map +0 -1
- /package/dist/{BlockNoteEditor-WQUJTVJL.mjs.map → BlockNoteEditor-5CEV5TZT.mjs.map} +0 -0
|
@@ -30,8 +30,8 @@ import {
|
|
|
30
30
|
PopoverContent,
|
|
31
31
|
PopoverTrigger,
|
|
32
32
|
} from "@carlonicora/nextjs-jsonapi/components";
|
|
33
|
-
import { ${names.pascalCase}Interface } from "@/features/${data.
|
|
34
|
-
import { ${names.pascalCase}Service } from "@/features/${data.
|
|
33
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
34
|
+
import { ${names.pascalCase}Service } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
35
35
|
import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/client";
|
|
36
36
|
import { useDebounce } from "@carlonicora/nextjs-jsonapi/client";
|
|
37
37
|
import { Modules } from "@carlonicora/nextjs-jsonapi/core";
|
|
@@ -17,10 +17,10 @@ export function generateContextTemplate(data: FrontendTemplateData): string {
|
|
|
17
17
|
|
|
18
18
|
return `"use client";
|
|
19
19
|
|
|
20
|
-
import ${names.pascalCase}Deleter from "@/features/${data.
|
|
21
|
-
import ${names.pascalCase}Editor from "@/features/${data.
|
|
22
|
-
import { ${names.pascalCase}Interface } from "@/features/${data.
|
|
23
|
-
import { ${names.pascalCase}Service } from "@/features/${data.
|
|
20
|
+
import ${names.pascalCase}Deleter from "@/features/${data.importTargetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Deleter";
|
|
21
|
+
import ${names.pascalCase}Editor from "@/features/${data.importTargetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Editor";
|
|
22
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
23
|
+
import { ${names.pascalCase}Service } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
24
24
|
import { SharedProvider } from "@carlonicora/nextjs-jsonapi/contexts";
|
|
25
25
|
import { usePageUrlGenerator } from "@carlonicora/nextjs-jsonapi/client";
|
|
26
26
|
import { BreadcrumbItemData } from "@carlonicora/nextjs-jsonapi/core";
|
|
@@ -37,20 +37,14 @@ function generateImports(data: FrontendTemplateData): string {
|
|
|
37
37
|
|
|
38
38
|
// Relationship interface imports
|
|
39
39
|
relationships.forEach((rel) => {
|
|
40
|
-
imports.push(
|
|
41
|
-
`import { ${rel.interfaceName} } from "${rel.interfaceImportPath}";`
|
|
42
|
-
);
|
|
40
|
+
imports.push(`import { ${rel.interfaceName} } from "${rel.interfaceImportPath}";`);
|
|
43
41
|
});
|
|
44
42
|
|
|
45
43
|
// Base interface import
|
|
46
44
|
if (extendsContent) {
|
|
47
|
-
imports.push(
|
|
48
|
-
`import { ContentInput, ContentInterface } from "@/features/features/content/data/ContentInterface";`
|
|
49
|
-
);
|
|
45
|
+
imports.push(`import { ContentInput, ContentInterface } from "@/features/content/data/ContentInterface";`);
|
|
50
46
|
} else {
|
|
51
|
-
imports.push(
|
|
52
|
-
`import { ApiDataInterface } from "@carlonicora/nextjs-jsonapi/core";`
|
|
53
|
-
);
|
|
47
|
+
imports.push(`import { ApiDataInterface } from "@carlonicora/nextjs-jsonapi/core";`);
|
|
54
48
|
}
|
|
55
49
|
|
|
56
50
|
return imports.join("\n");
|
|
@@ -132,7 +126,7 @@ function generateInterface(data: FrontendTemplateData): string {
|
|
|
132
126
|
// Build return type - use intersection if relationship has fields
|
|
133
127
|
let baseType = rel.interfaceName;
|
|
134
128
|
if (rel.fields && rel.fields.length > 0) {
|
|
135
|
-
const metaFields = rel.fields.map(f => `${f.name}?: ${f.tsType}`).join("; ");
|
|
129
|
+
const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
|
|
136
130
|
baseType = `${rel.interfaceName} & { ${metaFields} }`;
|
|
137
131
|
}
|
|
138
132
|
|
|
@@ -142,7 +136,7 @@ function generateInterface(data: FrontendTemplateData): string {
|
|
|
142
136
|
const propertyName = pluralize(toCamelCase(rel.name));
|
|
143
137
|
// Use intersection type if relationship has fields (edge properties)
|
|
144
138
|
if (rel.fields && rel.fields.length > 0) {
|
|
145
|
-
const metaFields = rel.fields.map(f => `${f.name}?: ${f.tsType}`).join("; ");
|
|
139
|
+
const metaFields = rel.fields.map((f) => `${f.name}?: ${f.tsType}`).join("; ");
|
|
146
140
|
getterLines.push(` get ${propertyName}(): (${rel.interfaceName} & { ${metaFields} })[];`);
|
|
147
141
|
} else {
|
|
148
142
|
getterLines.push(` get ${propertyName}(): ${rel.interfaceName}[];`);
|
|
@@ -48,7 +48,7 @@ function generateImports(data: FrontendTemplateData): string {
|
|
|
48
48
|
|
|
49
49
|
// Own interface import
|
|
50
50
|
imports.push(
|
|
51
|
-
`import { ${names.pascalCase}Input, ${names.pascalCase}Interface } from "@/features/${data.
|
|
51
|
+
`import { ${names.pascalCase}Input, ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";`,
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
// Relationship interface imports
|
|
@@ -58,7 +58,7 @@ function generateImports(data: FrontendTemplateData): string {
|
|
|
58
58
|
|
|
59
59
|
// Base class and core imports
|
|
60
60
|
if (extendsContent) {
|
|
61
|
-
imports.push(`import { Content } from "@/features/
|
|
61
|
+
imports.push(`import { Content } from "@/features/content/data/Content";`);
|
|
62
62
|
imports.push(`import { JsonApiHydratedDataInterface, Modules } from "@carlonicora/nextjs-jsonapi/core";`);
|
|
63
63
|
} else {
|
|
64
64
|
imports.push(
|
|
@@ -49,7 +49,7 @@ function generateImports(data: FrontendTemplateData): string {
|
|
|
49
49
|
|
|
50
50
|
return `import { AbstractService, HttpMethod, NextRef, PreviousRef } from "@carlonicora/nextjs-jsonapi/core";
|
|
51
51
|
import { EndpointCreator } from "@carlonicora/nextjs-jsonapi/core";
|
|
52
|
-
import { ${names.pascalCase}Input, ${names.pascalCase}Interface } from "@/features/${data.
|
|
52
|
+
import { ${names.pascalCase}Input, ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
53
53
|
import { Modules } from "@carlonicora/nextjs-jsonapi/core";`;
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -20,7 +20,7 @@ export function generateModuleTemplate(data: FrontendTemplateData): string {
|
|
|
20
20
|
const listFieldNames = getListFieldNames(data);
|
|
21
21
|
const listInclusionFields = listFieldNames.map((f) => `\`${f}\``).join(", ");
|
|
22
22
|
|
|
23
|
-
return `import { ${names.pascalCase} } from "@/features/${data.
|
|
23
|
+
return `import { ${names.pascalCase} } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}";
|
|
24
24
|
import { createJsonApiInclusion } from "@carlonicora/nextjs-jsonapi/core";
|
|
25
25
|
import { ModuleFactory } from "@carlonicora/nextjs-jsonapi/core";
|
|
26
26
|
import { ${DEFAULT_MODULE_ICON} } from "lucide-react";
|
|
@@ -15,10 +15,10 @@ import { FrontendTemplateData } from "../../types/template-data.interface";
|
|
|
15
15
|
export function generateDetailPageTemplate(data: FrontendTemplateData): string {
|
|
16
16
|
const { names } = data;
|
|
17
17
|
|
|
18
|
-
return `import ${names.pascalCase}Container from "@/features/${data.
|
|
19
|
-
import { ${names.pascalCase}Provider } from "@/features/${data.
|
|
20
|
-
import { ${names.pascalCase}Interface } from "@/features/${data.
|
|
21
|
-
import { ${names.pascalCase}Service } from "@/features/${data.
|
|
18
|
+
return `import ${names.pascalCase}Container from "@/features/${data.importTargetDir}/${names.kebabCase}/components/containers/${names.pascalCase}Container";
|
|
19
|
+
import { ${names.pascalCase}Provider } from "@/features/${data.importTargetDir}/${names.kebabCase}/contexts/${names.pascalCase}Context";
|
|
20
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
21
|
+
import { ${names.pascalCase}Service } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
22
22
|
import { generateSpecificMetadata } from "@/utils/metadata";
|
|
23
23
|
import { PageContainer } from "@carlonicora/nextjs-jsonapi/components";
|
|
24
24
|
import { Modules } from "@carlonicora/nextjs-jsonapi/core";
|
|
@@ -15,8 +15,8 @@ import { FrontendTemplateData } from "../../types/template-data.interface";
|
|
|
15
15
|
export function generateListPageTemplate(data: FrontendTemplateData): string {
|
|
16
16
|
const { names } = data;
|
|
17
17
|
|
|
18
|
-
return `import ${names.pascalCase}ListContainer from "@/features/${data.
|
|
19
|
-
import { ${names.pascalCase}Provider } from "@/features/${data.
|
|
18
|
+
return `import ${names.pascalCase}ListContainer from "@/features/${data.importTargetDir}/${names.kebabCase}/components/containers/${names.pascalCase}ListContainer";
|
|
19
|
+
import { ${names.pascalCase}Provider } from "@/features/${data.importTargetDir}/${names.kebabCase}/contexts/${names.pascalCase}Context";
|
|
20
20
|
import { PageContainer } from "@carlonicora/nextjs-jsonapi/components";
|
|
21
21
|
import { Modules } from "@carlonicora/nextjs-jsonapi/core";
|
|
22
22
|
import { Action } from "@carlonicora/nextjs-jsonapi/core";
|
|
@@ -22,11 +22,15 @@ export function generateTableHookTemplate(data: FrontendTemplateData): string {
|
|
|
22
22
|
|
|
23
23
|
return `"use client";
|
|
24
24
|
|
|
25
|
-
import { ${names.pascalCase}Fields } from "@/features/${data.
|
|
26
|
-
import { ${names.pascalCase}Interface } from "@/features/${data.
|
|
25
|
+
import { ${names.pascalCase}Fields } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Fields";
|
|
26
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.importTargetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
27
27
|
import { cellDate, cellId${hasAuthors ? ", ContributorsList" : ""} } from "@carlonicora/nextjs-jsonapi/components";
|
|
28
|
-
import { Modules } from "@carlonicora/nextjs-jsonapi/core";${
|
|
29
|
-
|
|
28
|
+
import { Modules } from "@carlonicora/nextjs-jsonapi/core";${
|
|
29
|
+
extendsContent
|
|
30
|
+
? `
|
|
31
|
+
import { ContentInterface } from "@carlonicora/nextjs-jsonapi/core";`
|
|
32
|
+
: ""
|
|
33
|
+
}
|
|
30
34
|
import {
|
|
31
35
|
registerTableGenerator,
|
|
32
36
|
TableContent,
|
|
@@ -107,9 +111,13 @@ function generateFieldColumnEntries(data: FrontendTemplateData): string {
|
|
|
107
111
|
<Tooltip>
|
|
108
112
|
<TooltipTrigger>
|
|
109
113
|
<Link href={generateUrl({ page: Modules.${names.pascalCase}, id: ${names.camelCase}.id })}>{${names.camelCase}.name}</Link>
|
|
110
|
-
</TooltipTrigger>${
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
</TooltipTrigger>${
|
|
115
|
+
extendsContent
|
|
116
|
+
? `
|
|
117
|
+
<TooltipContent>{${names.camelCase}.tldr}</TooltipContent>`
|
|
118
|
+
: `
|
|
119
|
+
<TooltipContent>{${names.camelCase}.name}</TooltipContent>`
|
|
120
|
+
}
|
|
113
121
|
</Tooltip>
|
|
114
122
|
);
|
|
115
123
|
},
|
|
@@ -135,7 +143,7 @@ function generateFieldColumnEntries(data: FrontendTemplateData): string {
|
|
|
135
143
|
|
|
136
144
|
// Other displayable fields (excluding id, name, tldr, abstract, content, dates)
|
|
137
145
|
const displayableFields = fields.filter(
|
|
138
|
-
(f) => !["id", "name", "tldr", "abstract", "content", "createdAt", "updatedAt"].includes(f.name)
|
|
146
|
+
(f) => !["id", "name", "tldr", "abstract", "content", "createdAt", "updatedAt"].includes(f.name),
|
|
139
147
|
);
|
|
140
148
|
|
|
141
149
|
displayableFields.forEach((field) => {
|
|
@@ -35,7 +35,13 @@ export interface FrontendField {
|
|
|
35
35
|
/**
|
|
36
36
|
* Form component types
|
|
37
37
|
*/
|
|
38
|
-
export type FormComponentType =
|
|
38
|
+
export type FormComponentType =
|
|
39
|
+
| "FormInput"
|
|
40
|
+
| "FormTextarea"
|
|
41
|
+
| "BlockNoteEditor"
|
|
42
|
+
| "Checkbox"
|
|
43
|
+
| "DatePicker"
|
|
44
|
+
| "FormInputNumber";
|
|
39
45
|
|
|
40
46
|
/**
|
|
41
47
|
* Frontend relationship representation
|
|
@@ -121,6 +127,8 @@ export interface FrontendTemplateData {
|
|
|
121
127
|
moduleId: string;
|
|
122
128
|
endpoint: string;
|
|
123
129
|
targetDir: string;
|
|
130
|
+
/** Stripped version of targetDir for use in imports (e.g., "culling" instead of "features/culling") */
|
|
131
|
+
importTargetDir: string;
|
|
124
132
|
|
|
125
133
|
// Parent class detection
|
|
126
134
|
extendsContent: boolean;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
4
4
|
import { useTranslations } from "next-intl";
|
|
5
5
|
import Image from "next/image";
|
|
6
|
+
import { useRouter, useSearchParams } from "next/navigation";
|
|
6
7
|
import { SubmitHandler, useForm } from "react-hook-form";
|
|
7
8
|
import { z } from "zod";
|
|
8
9
|
import { getApiUrl } from "../../../../client/config";
|
|
@@ -31,7 +32,10 @@ export function Login() {
|
|
|
31
32
|
const { setUser } = useCurrentUserContext<UserInterface>();
|
|
32
33
|
const { setComponentType } = useAuthContext();
|
|
33
34
|
const generateUrl = usePageUrlGenerator();
|
|
34
|
-
const
|
|
35
|
+
const i18nRouter = useI18nRouter();
|
|
36
|
+
const nativeRouter = useRouter(); // For URLs that already include locale
|
|
37
|
+
const searchParams = useSearchParams();
|
|
38
|
+
const callbackUrl = searchParams.get("callbackUrl");
|
|
35
39
|
|
|
36
40
|
const formSchema = z.object({
|
|
37
41
|
email: z.string().email({
|
|
@@ -56,7 +60,15 @@ export function Login() {
|
|
|
56
60
|
})) as UserInterface;
|
|
57
61
|
|
|
58
62
|
setUser(user);
|
|
59
|
-
|
|
63
|
+
|
|
64
|
+
// Redirect to callback URL if present, otherwise go to home
|
|
65
|
+
// Use native router for callbackUrl since it already includes the locale prefix
|
|
66
|
+
// Use i18n router for normal navigation which adds locale automatically
|
|
67
|
+
if (callbackUrl) {
|
|
68
|
+
nativeRouter.replace(callbackUrl);
|
|
69
|
+
} else {
|
|
70
|
+
i18nRouter.replace(generateUrl({ page: `/` }));
|
|
71
|
+
}
|
|
60
72
|
} catch (e) {
|
|
61
73
|
errorToast({
|
|
62
74
|
title: t(`common.errors.error`),
|