@baeta/plugin-pagination 1.0.11 → 2.0.0-next.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/CHANGELOG.md +30 -0
- package/dist/index.js +48 -12
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/index.d.ts +0 -74
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# @baeta/plugin-pagination
|
|
2
2
|
|
|
3
|
+
## 2.0.0-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fix release version
|
|
8
|
+
|
|
9
|
+
- Updated dependencies []:
|
|
10
|
+
- @baeta/generator-sdk@2.0.0-next.1
|
|
11
|
+
- @baeta/util-path@2.0.0-next.1
|
|
12
|
+
|
|
13
|
+
## 2.0.0-next.0
|
|
14
|
+
|
|
15
|
+
### Major Changes
|
|
16
|
+
|
|
17
|
+
- [#214](https://github.com/andreisergiu98/baeta/pull/214) [`31d1a50`](https://github.com/andreisergiu98/baeta/commit/31d1a509f96535b43ae85d19c770eb1a5f09dc94) Thanks [@andreisergiu98](https://github.com/andreisergiu98)! - Baeta v2 – major refactor
|
|
18
|
+
- **Side-effect-free type generation & resolver definitions.**
|
|
19
|
+
The types generator and resolver definitions were reworked to be side-effect free, improving type safety.
|
|
20
|
+
- **Stricter type safety.**
|
|
21
|
+
You must now **explicitly define resolvers for every field** during development—breakages that used to surface at runtime are now caught at compile time.
|
|
22
|
+
- **Removed `@baeta/compiler`.**
|
|
23
|
+
Since modern runtimes can execute TypeScript natively, the separate compiler package is no longer needed. Use your runtime’s native TS support or your existing build setup.
|
|
24
|
+
- **Subscriptions update.**
|
|
25
|
+
`@baeta/subscriptions-pubsub` now targets **`graphql-subscriptions` v3**.
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies [[`31d1a50`](https://github.com/andreisergiu98/baeta/commit/31d1a509f96535b43ae85d19c770eb1a5f09dc94)]:
|
|
30
|
+
- @baeta/generator-sdk@2.0.0-next.0
|
|
31
|
+
- @baeta/util-path@2.0.0-next.0
|
|
32
|
+
|
|
3
33
|
## 1.0.11
|
|
4
34
|
|
|
5
35
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// index.ts
|
|
2
|
-
import { createPluginV1,
|
|
2
|
+
import { createPluginV1, getModuleExportName } from "@baeta/generator-sdk";
|
|
3
3
|
import { join, parse } from "@baeta/util-path";
|
|
4
4
|
function printFields(fields) {
|
|
5
5
|
return fields.map((field) => ` ${field}`).join("\n");
|
|
@@ -20,15 +20,53 @@ function printPageInfo(addFields = []) {
|
|
|
20
20
|
"hasNextPage: Boolean!"
|
|
21
21
|
]);
|
|
22
22
|
}
|
|
23
|
-
function
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
function printResolversForType(module, type, fields) {
|
|
24
|
+
return `${type}: ${module}.${type}.$fields({
|
|
25
|
+
${fields.map((field) => printResolverForField(module, type, field)).map(indent(4)).join(",\n")}
|
|
26
|
+
})`;
|
|
27
|
+
}
|
|
28
|
+
function printResolverForField(module, type, field) {
|
|
29
|
+
return `${field}: ${module}.${type}.${field}.key('${field}').undefinedAsNull()`;
|
|
30
|
+
}
|
|
31
|
+
function getFieldNameFromFieldWithType(field) {
|
|
32
|
+
const [fieldName] = field.split(":");
|
|
33
|
+
return fieldName;
|
|
34
|
+
}
|
|
35
|
+
function printExport(moduleDefinitionName, moduleName, importExt, options) {
|
|
36
|
+
const module = getModuleExportName(moduleName);
|
|
37
|
+
const typedef = parse(moduleDefinitionName).name + importExt;
|
|
38
|
+
const pageInfoResolver = printResolversForType(module, "PageInfo", [
|
|
39
|
+
"hasNextPage",
|
|
40
|
+
"hasPreviousPage",
|
|
41
|
+
...options.pageInfoFields?.map(getFieldNameFromFieldWithType) ?? []
|
|
42
|
+
]);
|
|
43
|
+
const typesResolvers = Object.entries(options.types).flatMap(([type, typeOptions]) => {
|
|
44
|
+
if (typeOptions == null || typeOptions === false) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const extraEdgeFields = (typeOptions === true ? [] : typeOptions.edgeFields ?? []).map(
|
|
48
|
+
getFieldNameFromFieldWithType
|
|
49
|
+
);
|
|
50
|
+
const extraConnectionFields = (typeOptions === true ? [] : typeOptions.connectionFields ?? []).map(getFieldNameFromFieldWithType);
|
|
51
|
+
return [
|
|
52
|
+
printResolversForType(module, `${type}Connection`, [
|
|
53
|
+
"pageInfo",
|
|
54
|
+
"edges",
|
|
55
|
+
...extraConnectionFields
|
|
56
|
+
]),
|
|
57
|
+
printResolversForType(module, `${type}Edge`, ["cursor", "node", ...extraEdgeFields])
|
|
58
|
+
];
|
|
59
|
+
});
|
|
60
|
+
return `import { ${module} } from "./${typedef}";
|
|
28
61
|
|
|
29
|
-
export
|
|
62
|
+
export default ${module}.$schema({
|
|
63
|
+
${[pageInfoResolver, ...typesResolvers].map(indent(4)).join(",\n")}
|
|
64
|
+
});
|
|
30
65
|
`;
|
|
31
66
|
}
|
|
67
|
+
function indent(size) {
|
|
68
|
+
return (text) => text.split("\n").map((line) => " ".repeat(size) + line).join("\n");
|
|
69
|
+
}
|
|
32
70
|
function printConnectionTypes(name, typeOptions, options) {
|
|
33
71
|
const {
|
|
34
72
|
cursorType = "ID!",
|
|
@@ -69,7 +107,7 @@ function paginationPlugin(options) {
|
|
|
69
107
|
const types = [printPageInfo(options.pageInfoFields)];
|
|
70
108
|
for (const name in options.types) {
|
|
71
109
|
const typeOptions = options.types[name];
|
|
72
|
-
if (typeOptions === false) {
|
|
110
|
+
if (typeOptions == null || typeOptions === false) {
|
|
73
111
|
continue;
|
|
74
112
|
}
|
|
75
113
|
const connectionTypes = printConnectionTypes(
|
|
@@ -87,15 +125,13 @@ function paginationPlugin(options) {
|
|
|
87
125
|
);
|
|
88
126
|
await definitionFile.write();
|
|
89
127
|
ctx.fileManager.add(definitionFile);
|
|
90
|
-
if (options.createExport === false) {
|
|
91
|
-
return next();
|
|
92
|
-
}
|
|
93
128
|
ctx.fileManager.createAndAdd(
|
|
94
129
|
createExportFilename(moduleDir),
|
|
95
130
|
printExport(
|
|
96
131
|
ctx.generatorOptions.moduleDefinitionName,
|
|
97
132
|
moduleName,
|
|
98
|
-
ctx.generatorOptions.importExtension
|
|
133
|
+
ctx.generatorOptions.importExtension,
|
|
134
|
+
options
|
|
99
135
|
),
|
|
100
136
|
"pagination"
|
|
101
137
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts"],"sourcesContent":["import { createPluginV1, getModuleGetName, getModuleVariableName } from '@baeta/generator-sdk';\nimport { join, parse } from '@baeta/util-path';\n\n/**\n * Configuration options for a specific pagination type\n */\nexport interface PaginationTypeOptions {\n\t/** The GraphQL type for nodes (e.g., \"User!\") */\n\tnodeType?: string;\n\t/** The GraphQL type for cursors\n\t * @defaultValue \"ID!\"\n\t */\n\tcursorType?: string;\n\t/**\n\t * Additional fields to add to the edge type\n\t * @example edgeFields: [\"hasPhotos: Boolean!\"]\n\t */\n\tedgeFields?: string[];\n\t/**\n\t * Additional fields to add to the connection type\n\t * @example connectionFields: [\"totalCount: Int!\"]\n\t */\n\tconnectionFields?: string[];\n}\n\n/**\n * Configuration options for the pagination plugin\n */\nexport interface PaginationOptions {\n\t/**\n\t * Map of type names to their pagination configuration.\n\t * @example\n\t * ```typescript\n\t * {\n\t * // Simple configuration\n\t * User: true,\n\t *\n\t * // Advanced configuration\n\t * UserCustom: {\n\t * nodeType: \"User\",\n\t * cursorType: \"UUID!\",\n\t * connectionFields: [\"totalCount: Int!\"],\n\t * edgeFields: [\"hasPhotos: Boolean!\"]\n\t * }\n\t * }\n\t * ```\n\t */\n\ttypes: Record<string, boolean | PaginationTypeOptions>;\n\t/**\n\t * Whether the node field should be nullable in all connections\n\t * @defaultValue true\n\t */\n\tnullableNode?: boolean;\n\t/**\n\t * Additional fields to add to the PageInfo type\n\t * @example [\"hasMorePages: Boolean!\"]\n\t */\n\tpageInfoFields?: string[];\n\t/** Whether to create an export file */\n\tcreateExport?: boolean;\n\t/**\n\t * Custom name for the pagination module\n\t * @defaultValue 'baeta-pagination'\n\t */\n\tmoduleName?: string;\n}\n\nfunction printFields(fields: string[]) {\n\treturn fields.map((field) => ` ${field}`).join('\\n');\n}\n\nfunction printType(name: string, fields: string[]) {\n\treturn `type ${name} {\n${printFields(fields)}\n}`;\n}\n\nfunction printTypes(types: string[]) {\n\treturn `${types.join('\\n\\n')}\\n`;\n}\n\nfunction printPageInfo(addFields: string[] = []) {\n\treturn printType('PageInfo', [\n\t\t...addFields,\n\t\t'hasPreviousPage: Boolean!',\n\t\t'hasNextPage: Boolean!',\n\t]);\n}\n\nfunction printExport(moduleDefinitionName: string, moduleName: string, importExt = '') {\n\tconst parsed = parse(moduleDefinitionName);\n\tconst method = getModuleGetName(moduleName);\n\tconst importName = parsed.ext === '.ts' ? parsed.name : moduleDefinitionName;\n\n\treturn `import { ${method} } from \"./${importName}${importExt}\";\n\nexport const ${getModuleVariableName(moduleName)} = ${method}();\n`;\n}\n\nfunction printConnectionTypes(\n\tname: string,\n\ttypeOptions: PaginationTypeOptions,\n\toptions: PaginationOptions,\n) {\n\tconst {\n\t\tcursorType = 'ID!',\n\t\tnodeType = name,\n\t\tconnectionFields = [],\n\t\tedgeFields = [],\n\t} = typeOptions;\n\n\tconst connection = printType(`${name}Connection`, [\n\t\t...connectionFields,\n\t\t'pageInfo: PageInfo!',\n\t\t`edges: [${name}Edge]`,\n\t]);\n\n\tconst edge = printType(`${name}Edge`, [\n\t\t...edgeFields,\n\t\t`cursor: ${cursorType}`,\n\t\t`node: ${nodeType}${options.nullableNode === false ? '!' : ''}`,\n\t]);\n\n\treturn [connection, edge];\n}\n\nfunction createConnectionModuleDir(modulesDir: string, moduleName: string) {\n\treturn join(modulesDir, moduleName);\n}\n\nfunction createGqlFilename(moduleDir: string) {\n\treturn `${moduleDir}/connections.gql`;\n}\n\nfunction createExportFilename(moduleDir: string) {\n\treturn `${moduleDir}/index.ts`;\n}\n\n/**\n * A plugin that generates Relay-style pagination types for GraphQL.\n * See https://baeta.io/docs/plugins/pagination for more details\n *\n * @param options - Configuration options for the pagination plugin\n * @returns A Baeta generator plugin\n */\nexport function paginationPlugin(options: PaginationOptions) {\n\tconst { moduleName = 'baeta-pagination' } = options;\n\n\treturn createPluginV1({\n\t\tname: 'pagination',\n\t\tactionName: 'pagination connections',\n\t\twatch: (generatorOptions, watcher) => {\n\t\t\twatcher.ignore(`${createConnectionModuleDir(generatorOptions.modulesDir, moduleName)}/**`);\n\t\t},\n\t\tgenerate: async (ctx, next) => {\n\t\t\tconst types: string[] = [printPageInfo(options.pageInfoFields)];\n\n\t\t\tfor (const name in options.types) {\n\t\t\t\tconst typeOptions = options.types[name];\n\n\t\t\t\tif (typeOptions === false) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connectionTypes = printConnectionTypes(\n\t\t\t\t\tname,\n\t\t\t\t\ttypeOptions === true ? {} : typeOptions,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\n\t\t\t\ttypes.push(...connectionTypes);\n\t\t\t}\n\n\t\t\tconst moduleDir = createConnectionModuleDir(ctx.generatorOptions.modulesDir, moduleName);\n\n\t\t\tconst definitionFile = ctx.fileManager.createAndAdd(\n\t\t\t\tcreateGqlFilename(moduleDir),\n\t\t\t\tprintTypes(types),\n\t\t\t\t'pagination',\n\t\t\t);\n\t\t\tawait definitionFile.write();\n\n\t\t\tctx.fileManager.add(definitionFile);\n\n\t\t\tif (options.createExport === false) {\n\t\t\t\treturn next();\n\t\t\t}\n\n\t\t\tctx.fileManager.createAndAdd(\n\t\t\t\tcreateExportFilename(moduleDir),\n\t\t\t\tprintExport(\n\t\t\t\t\tctx.generatorOptions.moduleDefinitionName,\n\t\t\t\t\tmoduleName,\n\t\t\t\t\tctx.generatorOptions.importExtension,\n\t\t\t\t),\n\t\t\t\t'pagination',\n\t\t\t);\n\n\t\t\treturn next();\n\t\t},\n\t});\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../index.ts"],"sourcesContent":["import { createPluginV1, getModuleExportName } from '@baeta/generator-sdk';\nimport { join, parse } from '@baeta/util-path';\n\n/**\n * Configuration options for a specific pagination type\n */\nexport interface PaginationTypeOptions {\n\t/** The GraphQL type for nodes (e.g., \"User!\") */\n\tnodeType?: string;\n\t/** The GraphQL type for cursors\n\t * @defaultValue \"ID!\"\n\t */\n\tcursorType?: string;\n\t/**\n\t * Additional fields to add to the edge type\n\t * @example edgeFields: [\"hasPhotos: Boolean!\"]\n\t */\n\tedgeFields?: string[];\n\t/**\n\t * Additional fields to add to the connection type\n\t * @example connectionFields: [\"totalCount: Int!\"]\n\t */\n\tconnectionFields?: string[];\n}\n\n/**\n * Configuration options for the pagination plugin\n */\nexport interface PaginationOptions<Keys extends string | number | symbol = string> {\n\t/**\n\t * Map of type names to their pagination configuration.\n\t * @example\n\t * ```typescript\n\t * {\n\t * // Simple configuration\n\t * User: true,\n\t *\n\t * // Advanced configuration\n\t * UserCustom: {\n\t * nodeType: \"User\",\n\t * cursorType: \"UUID!\",\n\t * connectionFields: [\"totalCount: Int!\"],\n\t * edgeFields: [\"hasPhotos: Boolean!\"]\n\t * }\n\t * }\n\t * ```\n\t */\n\ttypes: {\n\t\t[key in Keys]?: boolean | PaginationTypeOptions;\n\t};\n\t/**\n\t * Whether the node field should be nullable in all connections\n\t * @defaultValue true\n\t */\n\tnullableNode?: boolean;\n\t/**\n\t * Additional fields to add to the PageInfo type\n\t * @example [\"hasMorePages: Boolean!\"]\n\t */\n\tpageInfoFields?: string[];\n\t/**\n\t * Custom name for the pagination module\n\t * @defaultValue 'baeta-pagination'\n\t */\n\tmoduleName?: string;\n}\n\nfunction printFields(fields: string[]) {\n\treturn fields.map((field) => ` ${field}`).join('\\n');\n}\n\nfunction printType(name: string, fields: string[]) {\n\treturn `type ${name} {\n${printFields(fields)}\n}`;\n}\n\nfunction printTypes(types: string[]) {\n\treturn `${types.join('\\n\\n')}\\n`;\n}\n\nfunction printPageInfo(addFields: string[] = []) {\n\treturn printType('PageInfo', [\n\t\t...addFields,\n\t\t'hasPreviousPage: Boolean!',\n\t\t'hasNextPage: Boolean!',\n\t]);\n}\n\nfunction printResolversForType(module: string, type: string, fields: string[]) {\n\treturn `${type}: ${module}.${type}.$fields({\n${fields\n\t.map((field) => printResolverForField(module, type, field))\n\t.map(indent(4))\n\t.join(',\\n')}\n})`;\n}\n\nfunction printResolverForField(module: string, type: string, field: string) {\n\treturn `${field}: ${module}.${type}.${field}.key('${field}').undefinedAsNull()`;\n}\n\nfunction getFieldNameFromFieldWithType(field: string) {\n\tconst [fieldName] = field.split(':');\n\treturn fieldName;\n}\n\nfunction printExport(\n\tmoduleDefinitionName: string,\n\tmoduleName: string,\n\timportExt: string,\n\toptions: PaginationOptions,\n) {\n\tconst module = getModuleExportName(moduleName);\n\tconst typedef = parse(moduleDefinitionName).name + importExt;\n\n\tconst pageInfoResolver = printResolversForType(module, 'PageInfo', [\n\t\t'hasNextPage',\n\t\t'hasPreviousPage',\n\t\t...(options.pageInfoFields?.map(getFieldNameFromFieldWithType) ?? []),\n\t]);\n\n\tconst typesResolvers = Object.entries(options.types).flatMap(([type, typeOptions]) => {\n\t\tif (typeOptions == null || typeOptions === false) {\n\t\t\treturn [];\n\t\t}\n\t\tconst extraEdgeFields = (typeOptions === true ? [] : (typeOptions.edgeFields ?? [])).map(\n\t\t\tgetFieldNameFromFieldWithType,\n\t\t);\n\t\tconst extraConnectionFields = (\n\t\t\ttypeOptions === true ? [] : (typeOptions.connectionFields ?? [])\n\t\t).map(getFieldNameFromFieldWithType);\n\t\treturn [\n\t\t\tprintResolversForType(module, `${type}Connection`, [\n\t\t\t\t'pageInfo',\n\t\t\t\t'edges',\n\t\t\t\t...extraConnectionFields,\n\t\t\t]),\n\t\t\tprintResolversForType(module, `${type}Edge`, ['cursor', 'node', ...extraEdgeFields]),\n\t\t];\n\t});\n\n\treturn `import { ${module} } from \"./${typedef}\";\n\nexport default ${module}.$schema({\n${[pageInfoResolver, ...typesResolvers].map(indent(4)).join(',\\n')}\n});\n`;\n}\n\nfunction indent(size: number) {\n\treturn (text: string) =>\n\t\ttext\n\t\t\t.split('\\n')\n\t\t\t.map((line) => ' '.repeat(size) + line)\n\t\t\t.join('\\n');\n}\n\nfunction printConnectionTypes(\n\tname: string,\n\ttypeOptions: PaginationTypeOptions,\n\toptions: PaginationOptions,\n) {\n\tconst {\n\t\tcursorType = 'ID!',\n\t\tnodeType = name,\n\t\tconnectionFields = [],\n\t\tedgeFields = [],\n\t} = typeOptions;\n\n\tconst connection = printType(`${name}Connection`, [\n\t\t...connectionFields,\n\t\t'pageInfo: PageInfo!',\n\t\t`edges: [${name}Edge]`,\n\t]);\n\n\tconst edge = printType(`${name}Edge`, [\n\t\t...edgeFields,\n\t\t`cursor: ${cursorType}`,\n\t\t`node: ${nodeType}${options.nullableNode === false ? '!' : ''}`,\n\t]);\n\n\treturn [connection, edge];\n}\n\nfunction createConnectionModuleDir(modulesDir: string, moduleName: string) {\n\treturn join(modulesDir, moduleName);\n}\n\nfunction createGqlFilename(moduleDir: string) {\n\treturn `${moduleDir}/connections.gql`;\n}\n\nfunction createExportFilename(moduleDir: string) {\n\treturn `${moduleDir}/index.ts`;\n}\n\n/**\n * A plugin that generates Relay-style pagination types for GraphQL.\n * See https://baeta.io/docs/plugins/pagination for more details\n *\n * @param options - Configuration options for the pagination plugin\n * @returns A Baeta generator plugin\n */\nexport function paginationPlugin<T>(options: PaginationOptions<keyof T>) {\n\tconst { moduleName = 'baeta-pagination' } = options;\n\n\treturn createPluginV1({\n\t\tname: 'pagination',\n\t\tactionName: 'pagination connections',\n\t\twatch: (generatorOptions, watcher) => {\n\t\t\twatcher.ignore(`${createConnectionModuleDir(generatorOptions.modulesDir, moduleName)}/**`);\n\t\t},\n\t\tgenerate: async (ctx, next) => {\n\t\t\tconst types: string[] = [printPageInfo(options.pageInfoFields)];\n\n\t\t\tfor (const name in options.types) {\n\t\t\t\tconst typeOptions = options.types[name];\n\t\t\t\tif (typeOptions == null || typeOptions === false) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connectionTypes = printConnectionTypes(\n\t\t\t\t\tname,\n\t\t\t\t\ttypeOptions === true ? {} : typeOptions,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\n\t\t\t\ttypes.push(...connectionTypes);\n\t\t\t}\n\n\t\t\tconst moduleDir = createConnectionModuleDir(ctx.generatorOptions.modulesDir, moduleName);\n\n\t\t\tconst definitionFile = ctx.fileManager.createAndAdd(\n\t\t\t\tcreateGqlFilename(moduleDir),\n\t\t\t\tprintTypes(types),\n\t\t\t\t'pagination',\n\t\t\t);\n\t\t\tawait definitionFile.write();\n\n\t\t\tctx.fileManager.add(definitionFile);\n\n\t\t\tctx.fileManager.createAndAdd(\n\t\t\t\tcreateExportFilename(moduleDir),\n\t\t\t\tprintExport(\n\t\t\t\t\tctx.generatorOptions.moduleDefinitionName,\n\t\t\t\t\tmoduleName,\n\t\t\t\t\tctx.generatorOptions.importExtension,\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t\t'pagination',\n\t\t\t);\n\n\t\t\treturn next();\n\t\t},\n\t});\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@baeta/plugin-pagination",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-next.1",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"baeta",
|
|
6
6
|
"graphql",
|
|
@@ -43,21 +43,21 @@
|
|
|
43
43
|
"types": "tsc --noEmit"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@baeta/generator-sdk": "^
|
|
47
|
-
"@baeta/util-path": "^
|
|
46
|
+
"@baeta/generator-sdk": "^2.0.0-next.1",
|
|
47
|
+
"@baeta/util-path": "^2.0.0-next.1"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@baeta/builder": "^0.0.0",
|
|
51
51
|
"@baeta/tsconfig": "^0.0.0",
|
|
52
|
-
"@types/node": "^22.
|
|
52
|
+
"@types/node": "^22.18.11",
|
|
53
53
|
"graphql": "^16.11.0",
|
|
54
|
-
"typescript": "^5.
|
|
54
|
+
"typescript": "^5.9.3"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"graphql": "^16.6.0"
|
|
58
58
|
},
|
|
59
59
|
"engines": {
|
|
60
|
-
"node": ">=22.
|
|
60
|
+
"node": ">=22.20.0"
|
|
61
61
|
},
|
|
62
62
|
"publishConfig": {
|
|
63
63
|
"access": "public",
|
package/dist/index.d.ts
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import * as _baeta_generator_sdk from '@baeta/generator-sdk';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Configuration options for a specific pagination type
|
|
5
|
-
*/
|
|
6
|
-
interface PaginationTypeOptions {
|
|
7
|
-
/** The GraphQL type for nodes (e.g., "User!") */
|
|
8
|
-
nodeType?: string;
|
|
9
|
-
/** The GraphQL type for cursors
|
|
10
|
-
* @defaultValue "ID!"
|
|
11
|
-
*/
|
|
12
|
-
cursorType?: string;
|
|
13
|
-
/**
|
|
14
|
-
* Additional fields to add to the edge type
|
|
15
|
-
* @example edgeFields: ["hasPhotos: Boolean!"]
|
|
16
|
-
*/
|
|
17
|
-
edgeFields?: string[];
|
|
18
|
-
/**
|
|
19
|
-
* Additional fields to add to the connection type
|
|
20
|
-
* @example connectionFields: ["totalCount: Int!"]
|
|
21
|
-
*/
|
|
22
|
-
connectionFields?: string[];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Configuration options for the pagination plugin
|
|
26
|
-
*/
|
|
27
|
-
interface PaginationOptions {
|
|
28
|
-
/**
|
|
29
|
-
* Map of type names to their pagination configuration.
|
|
30
|
-
* @example
|
|
31
|
-
* ```typescript
|
|
32
|
-
* {
|
|
33
|
-
* // Simple configuration
|
|
34
|
-
* User: true,
|
|
35
|
-
*
|
|
36
|
-
* // Advanced configuration
|
|
37
|
-
* UserCustom: {
|
|
38
|
-
* nodeType: "User",
|
|
39
|
-
* cursorType: "UUID!",
|
|
40
|
-
* connectionFields: ["totalCount: Int!"],
|
|
41
|
-
* edgeFields: ["hasPhotos: Boolean!"]
|
|
42
|
-
* }
|
|
43
|
-
* }
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
types: Record<string, boolean | PaginationTypeOptions>;
|
|
47
|
-
/**
|
|
48
|
-
* Whether the node field should be nullable in all connections
|
|
49
|
-
* @defaultValue true
|
|
50
|
-
*/
|
|
51
|
-
nullableNode?: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Additional fields to add to the PageInfo type
|
|
54
|
-
* @example ["hasMorePages: Boolean!"]
|
|
55
|
-
*/
|
|
56
|
-
pageInfoFields?: string[];
|
|
57
|
-
/** Whether to create an export file */
|
|
58
|
-
createExport?: boolean;
|
|
59
|
-
/**
|
|
60
|
-
* Custom name for the pagination module
|
|
61
|
-
* @defaultValue 'baeta-pagination'
|
|
62
|
-
*/
|
|
63
|
-
moduleName?: string;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* A plugin that generates Relay-style pagination types for GraphQL.
|
|
67
|
-
* See https://baeta.io/docs/plugins/pagination for more details
|
|
68
|
-
*
|
|
69
|
-
* @param options - Configuration options for the pagination plugin
|
|
70
|
-
* @returns A Baeta generator plugin
|
|
71
|
-
*/
|
|
72
|
-
declare function paginationPlugin(options: PaginationOptions): _baeta_generator_sdk.GeneratorPluginV1<unknown>;
|
|
73
|
-
|
|
74
|
-
export { type PaginationOptions, type PaginationTypeOptions, paginationPlugin };
|