@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.
Files changed (79) hide show
  1. package/dist/{BlockNoteEditor-WQUJTVJL.mjs → BlockNoteEditor-5CEV5TZT.mjs} +2 -2
  2. package/dist/{BlockNoteEditor-3S2B36O3.js → BlockNoteEditor-VB72JQEO.js} +6 -6
  3. package/dist/{BlockNoteEditor-3S2B36O3.js.map → BlockNoteEditor-VB72JQEO.js.map} +1 -1
  4. package/dist/billing/index.js +299 -299
  5. package/dist/billing/index.mjs +1 -1
  6. package/dist/{chunk-T2JCZYWK.js → chunk-BYMBRMKS.js} +12 -4
  7. package/dist/chunk-BYMBRMKS.js.map +1 -0
  8. package/dist/{chunk-4PHADEKA.mjs → chunk-VMK2N3TQ.mjs} +12 -4
  9. package/dist/{chunk-4PHADEKA.mjs.map → chunk-VMK2N3TQ.mjs.map} +1 -1
  10. package/dist/client/index.js +2 -2
  11. package/dist/client/index.mjs +1 -1
  12. package/dist/components/index.js +2 -2
  13. package/dist/components/index.mjs +1 -1
  14. package/dist/contexts/index.js +2 -2
  15. package/dist/contexts/index.mjs +1 -1
  16. package/dist/scripts/generate-web-module/generator.d.ts.map +1 -1
  17. package/dist/scripts/generate-web-module/generator.js +5 -0
  18. package/dist/scripts/generate-web-module/generator.js.map +1 -1
  19. package/dist/scripts/generate-web-module/templates/components/container.template.js +7 -7
  20. package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -1
  21. package/dist/scripts/generate-web-module/templates/components/content.template.js +1 -1
  22. package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -1
  23. package/dist/scripts/generate-web-module/templates/components/deleter.template.js +2 -2
  24. package/dist/scripts/generate-web-module/templates/components/deleter.template.js.map +1 -1
  25. package/dist/scripts/generate-web-module/templates/components/details.template.js +1 -1
  26. package/dist/scripts/generate-web-module/templates/components/details.template.js.map +1 -1
  27. package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts.map +1 -1
  28. package/dist/scripts/generate-web-module/templates/components/editor.template.js +8 -13
  29. package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -1
  30. package/dist/scripts/generate-web-module/templates/components/list-container.template.js +1 -1
  31. package/dist/scripts/generate-web-module/templates/components/list-container.template.js.map +1 -1
  32. package/dist/scripts/generate-web-module/templates/components/list.template.js +5 -5
  33. package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -1
  34. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js +2 -2
  35. package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js.map +1 -1
  36. package/dist/scripts/generate-web-module/templates/components/selector.template.js +2 -2
  37. package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -1
  38. package/dist/scripts/generate-web-module/templates/context.template.js +4 -4
  39. package/dist/scripts/generate-web-module/templates/context.template.js.map +1 -1
  40. package/dist/scripts/generate-web-module/templates/data/interface.template.js +3 -3
  41. package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -1
  42. package/dist/scripts/generate-web-module/templates/data/model.template.js +2 -2
  43. package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -1
  44. package/dist/scripts/generate-web-module/templates/data/service.template.js +1 -1
  45. package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -1
  46. package/dist/scripts/generate-web-module/templates/module.template.js +1 -1
  47. package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -1
  48. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js +4 -4
  49. package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js.map +1 -1
  50. package/dist/scripts/generate-web-module/templates/pages/list-page.template.js +2 -2
  51. package/dist/scripts/generate-web-module/templates/pages/list-page.template.js.map +1 -1
  52. package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts.map +1 -1
  53. package/dist/scripts/generate-web-module/templates/table-hook.template.js +10 -6
  54. package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -1
  55. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +2 -0
  56. package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -1
  57. package/package.json +1 -1
  58. package/scripts/generate-web-module/generator.ts +5 -0
  59. package/scripts/generate-web-module/templates/components/container.template.ts +7 -7
  60. package/scripts/generate-web-module/templates/components/content.template.ts +1 -1
  61. package/scripts/generate-web-module/templates/components/deleter.template.ts +2 -2
  62. package/scripts/generate-web-module/templates/components/details.template.ts +1 -1
  63. package/scripts/generate-web-module/templates/components/editor.template.ts +23 -18
  64. package/scripts/generate-web-module/templates/components/list-container.template.ts +1 -1
  65. package/scripts/generate-web-module/templates/components/list.template.ts +5 -5
  66. package/scripts/generate-web-module/templates/components/multi-selector.template.ts +2 -2
  67. package/scripts/generate-web-module/templates/components/selector.template.ts +2 -2
  68. package/scripts/generate-web-module/templates/context.template.ts +4 -4
  69. package/scripts/generate-web-module/templates/data/interface.template.ts +5 -11
  70. package/scripts/generate-web-module/templates/data/model.template.ts +2 -2
  71. package/scripts/generate-web-module/templates/data/service.template.ts +1 -1
  72. package/scripts/generate-web-module/templates/module.template.ts +1 -1
  73. package/scripts/generate-web-module/templates/pages/detail-page.template.ts +4 -4
  74. package/scripts/generate-web-module/templates/pages/list-page.template.ts +2 -2
  75. package/scripts/generate-web-module/templates/table-hook.template.ts +16 -8
  76. package/scripts/generate-web-module/types/template-data.interface.ts +9 -1
  77. package/src/features/auth/components/forms/Login.tsx +14 -2
  78. package/dist/chunk-T2JCZYWK.js.map +0 -1
  79. /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.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
34
- import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
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.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Deleter";
21
- import ${names.pascalCase}Editor from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Editor";
22
- import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
23
- import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
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.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";`,
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/features/content/data/Content";`);
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.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
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.targetDir}/${names.kebabCase}/data/${names.pascalCase}";
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.targetDir}/${names.kebabCase}/components/containers/${names.pascalCase}Container";
19
- import { ${names.pascalCase}Provider } from "@/features/${data.targetDir}/${names.kebabCase}/contexts/${names.pascalCase}Context";
20
- import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
21
- import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
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.targetDir}/${names.kebabCase}/components/containers/${names.pascalCase}ListContainer";
19
- import { ${names.pascalCase}Provider } from "@/features/${data.targetDir}/${names.kebabCase}/contexts/${names.pascalCase}Context";
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.targetDir}/${names.kebabCase}/data/${names.pascalCase}Fields";
26
- import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
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";${extendsContent ? `
29
- import { ContentInterface } from "@carlonicora/nextjs-jsonapi/core";` : ""}
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>${extendsContent ? `
111
- <TooltipContent>{${names.camelCase}.tldr}</TooltipContent>` : `
112
- <TooltipContent>{${names.camelCase}.name}</TooltipContent>`}
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 = "FormInput" | "FormTextarea" | "BlockNoteEditor" | "Checkbox" | "DatePicker" | "FormInputNumber";
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 router = useI18nRouter();
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
- router.replace(generateUrl({ page: `/` }));
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`),