@carlonicora/nextjs-jsonapi 1.38.1 → 1.38.3

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-VB72JQEO.js → BlockNoteEditor-RG5BCHLC.js} +6 -6
  2. package/dist/{BlockNoteEditor-VB72JQEO.js.map → BlockNoteEditor-RG5BCHLC.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-5CEV5TZT.mjs → BlockNoteEditor-YP7ZYOPD.mjs} +2 -2
  4. package/dist/billing/index.js +299 -299
  5. package/dist/billing/index.mjs +1 -1
  6. package/dist/{chunk-BYMBRMKS.js → chunk-6CYZMNDG.js} +6 -6
  7. package/dist/{chunk-BYMBRMKS.js.map → chunk-6CYZMNDG.js.map} +1 -1
  8. package/dist/{chunk-VMK2N3TQ.mjs → chunk-XPWXQWXX.mjs} +6 -6
  9. package/dist/{chunk-VMK2N3TQ.mjs.map → chunk-XPWXQWXX.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/components/containers/PageContainer.tsx +1 -1
  78. package/src/components/pages/PageContentContainer.tsx +5 -5
  79. /package/dist/{BlockNoteEditor-5CEV5TZT.mjs.map → BlockNoteEditor-YP7ZYOPD.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;
@@ -12,7 +12,7 @@ export function PageContainer({ children, testId, className }: PageContainerProp
12
12
  return (
13
13
  <div className={`flex h-full w-full flex-col`} data-testid={testId}>
14
14
  <Header>{headerChildren}</Header>
15
- <main className={cn(`flex w-full flex-1 flex-col gap-y-4 pt-4 pl-4 pr-4 pb-20`, className)}>{children}</main>
15
+ <main className={cn(`flex w-full flex-1 flex-col gap-y-4 pt-4 pl-4 pr-0 pb-20`, className)}>{children}</main>
16
16
  </div>
17
17
  );
18
18
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { ReactNode, useEffect, useState } from "react";
4
4
  import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "../../shadcnui";
5
- import { useIsMobile } from "../../utils";
5
+ import { cn, useIsMobile } from "../../utils";
6
6
 
7
7
  type PageContentContainerProps = {
8
8
  header?: ReactNode;
@@ -27,7 +27,7 @@ export function PageContentContainer({ header, details, footer, content }: PageC
27
27
 
28
28
  return (
29
29
  <div className="flex h-[calc(100vh-4rem)] w-full flex-col transition-opacity duration-150 animate-in fade-in">
30
- {header && <div className="mb-4 flex w-full shrink-0 border-b">{header}</div>}
30
+ {header && <div className="mb-4 flex w-full shrink-0 border-b pr-4">{header}</div>}
31
31
  <div className="min-h-0 flex-1">
32
32
  {details || footer ? (
33
33
  <ResizablePanelGroup
@@ -49,12 +49,12 @@ export function PageContentContainer({ header, details, footer, content }: PageC
49
49
  </div>
50
50
  </ResizablePanel>
51
51
  <ResizableHandle withHandle />
52
- <ResizablePanel id="right-panel" className={isMobile ? "pt-4" : "pl-4"}>
53
- <div className="h-full overflow-x-hidden overflow-y-auto p-2 pb-20">{content}</div>
52
+ <ResizablePanel id="right-panel" className={cn("w-full", isMobile ? "pt-4" : "")}>
53
+ <div className="h-full overflow-x-hidden overflow-y-auto px-4 pb-20">{content}</div>
54
54
  </ResizablePanel>
55
55
  </ResizablePanelGroup>
56
56
  ) : (
57
- <div className="h-full overflow-x-hidden overflow-y-auto p-2 pb-20">{content}</div>
57
+ <div className="h-full overflow-x-hidden overflow-y-auto px-4 pb-20">{content}</div>
58
58
  )}
59
59
  </div>
60
60
  </div>