@jungvonmatt/contentful-typings 5.0.0 → 6.0.0
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/cli.js +0 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.js +18 -14
- package/dist/index.js.map +1 -1
- package/dist/renderer/contentTypeRenderer.d.ts +2 -5
- package/dist/renderer/contentTypeRenderer.js +3 -8
- package/dist/renderer/contentTypeRenderer.js.map +1 -1
- package/dist/renderer/context.d.ts +0 -1
- package/dist/renderer/context.js +2 -8
- package/dist/renderer/context.js.map +1 -1
- package/dist/renderer/index.d.ts +1 -1
- package/dist/renderer/index.js +1 -1
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/localizedContentRenderer.d.ts +2 -2
- package/dist/renderer/localizedContentRenderer.js +2 -2
- package/dist/renderer/localizedContentRenderer.js.map +1 -1
- package/dist/renderer/typeGuardRenderer.d.ts +2 -2
- package/dist/renderer/typeGuardRenderer.js +5 -5
- package/dist/renderer/typeGuardRenderer.js.map +1 -1
- package/package.json +13 -13
- package/src/cli.test.ts +141 -0
- package/src/cli.ts +0 -3
- package/src/index.test.ts +50 -26
- package/src/index.ts +30 -16
- package/src/renderer/contentTypeRenderer.ts +3 -10
- package/src/renderer/context.ts +2 -12
- package/src/renderer/index.ts +1 -1
- package/src/renderer/localizedContentRenderer.ts +2 -2
- package/src/renderer/renderer.test.ts +11 -9
- package/src/renderer/typeGuardRenderer.ts +4 -5
package/dist/cli.js
CHANGED
|
@@ -28,14 +28,12 @@ program
|
|
|
28
28
|
.option('-l, --localized', 'Add localized types')
|
|
29
29
|
.option('-d, --jsdoc', 'Add JSDoc comments')
|
|
30
30
|
.option('-g, --typeguard', 'Add type guards')
|
|
31
|
-
.option('-l, --legacy', 'Use legacy types (before contentful@10)')
|
|
32
31
|
.action(actionRunner(async (cmd) => {
|
|
33
32
|
const output = cmd?.output ?? '';
|
|
34
33
|
const typings = await generateTypings({
|
|
35
34
|
typeguard: cmd.typeguard,
|
|
36
35
|
jsdoc: cmd.jsdoc,
|
|
37
36
|
localized: cmd.localized,
|
|
38
|
-
legacy: cmd.legacy,
|
|
39
37
|
cwd: cmd?.cwd || process.cwd(),
|
|
40
38
|
configFile: cmd?.config || undefined,
|
|
41
39
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc7C,MAAM,YAAY,GAAG,CAAC,KAAmB,EAAE,OAAgB,EAAE,EAAE;IAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,YAAY,GAChB,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,CACnB,CAAC,GAAG,IAAI,EAAE,EAAE,CAEV,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAmB,EAAE,EAAE;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEP,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CACL,uBAAuB,EACvB,oEAAoE,CACrE;KACA,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,CAAC;KAC3E,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,EAAE,sBAAsB,CAAC;KAChF,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC;KAC3C,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;KAC5C,MAAM,CACL,YAAY,CAAC,KAAK,EAAE,GAAgB,EAAE,EAAE;IACtC,MAAM,MAAM,GAAW,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACpC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QAC9B,UAAU,EAAE,GAAG,EAAE,MAAM,IAAI,SAAS;KACrC,CAAC,CAAC;IAEH,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CACH,CAAC;AAEJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import pico from 'picocolors';
|
|
3
3
|
import { loadContentfulConfig } from '@jungvonmatt/contentful-config';
|
|
4
|
-
import { getEnvironment
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { getEnvironment } from '@jungvonmatt/contentful-ssg/lib/contentful';
|
|
5
|
+
import { getManagementClient } from '@jungvonmatt/contentful-client';
|
|
6
|
+
import { fetchAll } from 'contentful-management';
|
|
7
|
+
import { CFDefinitionsBuilder, } from 'cf-content-types-generator';
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
7
9
|
import semiver from 'semiver';
|
|
8
|
-
import { DefaultContentTypeRenderer,
|
|
10
|
+
import { DefaultContentTypeRenderer, V10TypeGuardRenderer, JsDocRenderer, LocalizedContentTypeRenderer, TypeGuardRenderer, } from './renderer/index.js';
|
|
9
11
|
const isLegacyVersion = async (dir) => {
|
|
10
12
|
try {
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
+
const pkgPath = path.join(dir || process.cwd(), 'node_modules', 'contentful', 'package.json');
|
|
14
|
+
const packageJson = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
13
15
|
if (packageJson.name === 'contentful' &&
|
|
14
16
|
semiver(packageJson.version, '10.0.0-beta-v10.33') < 0) {
|
|
15
17
|
return true;
|
|
@@ -24,15 +26,17 @@ export const generateTypings = async (options = {}) => {
|
|
|
24
26
|
cwd: options?.cwd,
|
|
25
27
|
required: ['managementToken', 'environmentId', 'spaceId'],
|
|
26
28
|
});
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const config = loaderResult.config;
|
|
30
|
+
const environment = await getEnvironment(config);
|
|
31
|
+
const client = getManagementClient(config);
|
|
32
|
+
console.log(`Generating typescript definitions for: ${pico.gray('spaces/')}${pico.green(config.spaceId)}${pico.gray('/environments/')}${pico.green(config.environmentId)}`);
|
|
33
|
+
const contentTypes = await fetchAll((params) => client.contentType.getMany({
|
|
34
|
+
spaceId: config.spaceId,
|
|
35
|
+
environmentId: config.environmentId ?? environment.sys.id,
|
|
36
|
+
...params,
|
|
37
|
+
}), {});
|
|
32
38
|
const legacyVersion = typeof options.legacy === 'undefined' ? await isLegacyVersion() : options.legacy;
|
|
33
|
-
const renderers = [
|
|
34
|
-
legacyVersion ? new DefaultContentTypeRenderer() : new V10ContentTypeRenderer(),
|
|
35
|
-
];
|
|
39
|
+
const renderers = [new DefaultContentTypeRenderer()];
|
|
36
40
|
if (options.localized) {
|
|
37
41
|
renderers.push(new LocalizedContentTypeRenderer());
|
|
38
42
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare class DefaultContentTypeRenderer extends
|
|
3
|
-
createContext(): RenderContext;
|
|
4
|
-
}
|
|
5
|
-
export declare class V10ContentTypeRenderer extends V10ContentTypeRendererOriginal {
|
|
1
|
+
import { ContentTypeRenderer as ContentTypeRendererOriginal, type RenderContext } from 'cf-content-types-generator';
|
|
2
|
+
export declare class DefaultContentTypeRenderer extends ContentTypeRendererOriginal {
|
|
6
3
|
createContext(): RenderContext;
|
|
7
4
|
}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { context
|
|
3
|
-
export class DefaultContentTypeRenderer extends
|
|
1
|
+
import { ContentTypeRenderer as ContentTypeRendererOriginal, } from 'cf-content-types-generator';
|
|
2
|
+
import { context } from './context.js';
|
|
3
|
+
export class DefaultContentTypeRenderer extends ContentTypeRendererOriginal {
|
|
4
4
|
createContext() {
|
|
5
5
|
return context;
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
|
-
export class V10ContentTypeRenderer extends V10ContentTypeRendererOriginal {
|
|
9
|
-
createContext() {
|
|
10
|
-
return v10context;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
8
|
//# sourceMappingURL=contentTypeRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentTypeRenderer.js","sourceRoot":"","sources":["../../src/renderer/contentTypeRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"contentTypeRenderer.js","sourceRoot":"","sources":["../../src/renderer/contentTypeRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,IAAI,2BAA2B,GAEnD,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,0BAA2B,SAAQ,2BAA2B;IAClE,aAAa;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -3,4 +3,3 @@ export declare const moduleName: (name: string) => string;
|
|
|
3
3
|
export declare const moduleFieldsName: (name: string) => string;
|
|
4
4
|
export declare const moduleSkeletonName: (name: string) => string;
|
|
5
5
|
export declare const context: RenderContext;
|
|
6
|
-
export declare const v10context: RenderContext;
|
package/dist/renderer/context.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
import { pascalCase } from 'change-case';
|
|
2
|
-
import {
|
|
2
|
+
import { createContext } from 'cf-content-types-generator';
|
|
3
3
|
export const moduleName = (name) => pascalCase(name);
|
|
4
4
|
export const moduleFieldsName = (name) => `${moduleName(name)}Fields`;
|
|
5
5
|
export const moduleSkeletonName = (name) => `${moduleName(name)}Skeleton`;
|
|
6
6
|
export const context = {
|
|
7
|
-
...
|
|
8
|
-
moduleName,
|
|
9
|
-
moduleFieldsName,
|
|
10
|
-
moduleSkeletonName,
|
|
11
|
-
};
|
|
12
|
-
export const v10context = {
|
|
13
|
-
...createV10Context(),
|
|
7
|
+
...createContext(),
|
|
14
8
|
moduleName,
|
|
15
9
|
moduleFieldsName,
|
|
16
10
|
moduleSkeletonName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/renderer/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/renderer/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAsB,MAAM,4BAA4B,CAAC;AAE/E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AAC1F,MAAM,CAAC,MAAM,OAAO,GAAkB;IACpC,GAAG,aAAa,EAAE;IAClB,UAAU;IACV,gBAAgB;IAChB,kBAAkB;CACnB,CAAC"}
|
package/dist/renderer/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DefaultContentTypeRenderer
|
|
1
|
+
export { DefaultContentTypeRenderer } from './contentTypeRenderer.js';
|
|
2
2
|
export { JsDocRenderer } from './jsDocRenderer.js';
|
|
3
3
|
export { TypeGuardRenderer, V10TypeGuardRenderer } from './typeGuardRenderer.js';
|
|
4
4
|
export { LocalizedContentTypeRenderer } from './localizedContentRenderer.js';
|
package/dist/renderer/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DefaultContentTypeRenderer
|
|
1
|
+
export { DefaultContentTypeRenderer } from './contentTypeRenderer.js';
|
|
2
2
|
export { JsDocRenderer } from './jsDocRenderer.js';
|
|
3
3
|
export { TypeGuardRenderer, V10TypeGuardRenderer } from './typeGuardRenderer.js';
|
|
4
4
|
export { LocalizedContentTypeRenderer } from './localizedContentRenderer.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare class LocalizedContentTypeRenderer extends
|
|
1
|
+
import { ContentTypeRenderer as ContentTypeRendererBase, type RenderContext } from 'cf-content-types-generator';
|
|
2
|
+
export declare class LocalizedContentTypeRenderer extends ContentTypeRendererBase {
|
|
3
3
|
createContext(): RenderContext;
|
|
4
4
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ContentTypeRenderer as ContentTypeRendererBase, } from 'cf-content-types-generator';
|
|
2
2
|
import { context } from './context.js';
|
|
3
|
-
export class LocalizedContentTypeRenderer extends
|
|
3
|
+
export class LocalizedContentTypeRenderer extends ContentTypeRendererBase {
|
|
4
4
|
createContext() {
|
|
5
5
|
return context;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localizedContentRenderer.js","sourceRoot":"","sources":["../../src/renderer/localizedContentRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"localizedContentRenderer.js","sourceRoot":"","sources":["../../src/renderer/localizedContentRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,IAAI,uBAAuB,GAE/C,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,4BAA6B,SAAQ,uBAAuB;IAChE,aAAa;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { TypeGuardRenderer as TypeGuardRendererOriginal,
|
|
1
|
+
import { TypeGuardRenderer as TypeGuardRendererOriginal, type RenderContext, type CFContentType } from 'cf-content-types-generator';
|
|
2
2
|
import { type SourceFile } from 'ts-morph';
|
|
3
3
|
export declare class TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
4
4
|
createContext(): RenderContext;
|
|
5
5
|
render: (contentType: CFContentType, file: SourceFile) => void;
|
|
6
6
|
}
|
|
7
|
-
export declare class V10TypeGuardRenderer extends
|
|
7
|
+
export declare class V10TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
8
8
|
createContext(): RenderContext;
|
|
9
9
|
render: (contentType: CFContentType, file: SourceFile) => void;
|
|
10
10
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { TypeGuardRenderer as TypeGuardRendererOriginal,
|
|
2
|
-
import { context,
|
|
1
|
+
import { TypeGuardRenderer as TypeGuardRendererOriginal, renderTypeGeneric, } from 'cf-content-types-generator';
|
|
2
|
+
import { context, moduleName } from './context.js';
|
|
3
3
|
export class TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
4
4
|
createContext() {
|
|
5
5
|
return context;
|
|
@@ -29,15 +29,15 @@ export class TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
|
29
29
|
file.formatText();
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
-
export class V10TypeGuardRenderer extends
|
|
32
|
+
export class V10TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
33
33
|
createContext() {
|
|
34
|
-
return
|
|
34
|
+
return context;
|
|
35
35
|
}
|
|
36
36
|
render = (contentType, file) => {
|
|
37
37
|
const entryInterfaceName = moduleName(contentType.sys.id);
|
|
38
38
|
file.addImportDeclaration({
|
|
39
39
|
moduleSpecifier: `contentful`,
|
|
40
|
-
namedImports: ['ChainModifiers', 'Entry', 'LocaleCode'],
|
|
40
|
+
namedImports: ['ChainModifiers', 'Entry', 'EntrySkeletonType', 'LocaleCode'],
|
|
41
41
|
isTypeOnly: true,
|
|
42
42
|
});
|
|
43
43
|
file.addFunction({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeGuardRenderer.js","sourceRoot":"","sources":["../../src/renderer/typeGuardRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,IAAI,yBAAyB,
|
|
1
|
+
{"version":3,"file":"typeGuardRenderer.js","sourceRoot":"","sources":["../../src/renderer/typeGuardRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,IAAI,yBAAyB,EAG9C,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,OAAO,iBAAkB,SAAQ,yBAAyB;IACvD,aAAa;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM,GAAG,CAAC,WAA0B,EAAE,IAAgB,EAAQ,EAAE;QACrE,MAAM,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,oBAAoB,CAAC;YACxB,eAAe,EAAE,uBAAuB;YACxC,YAAY,EAAE,CAAC,qBAAqB,CAAC;YACrC,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC;YACf,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,KAAK,kBAAkB,EAAE;YAC/B,UAAU,EAAE,YAAY,kBAAkB,EAAE;YAC5C,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,qBAAqB;iBAC5B;aACF;YACD,UAAU,EAAE,4CAA4C,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG;SAC9E,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC;YACnB,wBAAwB,EAAE,IAAI;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC,CAAC;CACH;AAED,MAAM,OAAO,oBAAqB,SAAQ,yBAAyB;IAC1D,aAAa;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM,GAAG,CAAC,WAA0B,EAAE,IAAgB,EAAQ,EAAE;QACrE,MAAM,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,oBAAoB,CAAC;YACxB,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,EAAE,YAAY,CAAC;YAC5E,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,CAAC;YACf,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,iBAAiB,CACrB,KAAK,kBAAkB,EAAE,EACzB,kCAAkC,EAClC,4BAA4B,CAC7B;YACD,UAAU,EAAE,YAAY,iBAAiB,CAAC,kBAAkB,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;YACvF,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,SAAS,CAAC;iBAC9E;aACF;YACD,UAAU,EAAE,4CAA4C,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG;SAC9E,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC;YACnB,wBAAwB,EAAE,IAAI;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC,CAAC;CACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jungvonmatt/contentful-typings",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"homepage": "https://github.com/jungvonmatt/contentful-ssg#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/jungvonmatt/contentful-ssg/issues"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
29
29
|
"clean": "rimraf ./dist",
|
|
30
|
-
"test": "vitest run",
|
|
30
|
+
"test": "vitest run --root ../.. packages/contentful-typings/src",
|
|
31
31
|
"lint": "oxlint --type-aware --fix src",
|
|
32
32
|
"precompile": "pnpm run clean",
|
|
33
33
|
"compile": "tsc --build",
|
|
@@ -36,27 +36,27 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@faker-js/faker": "^8.3.1",
|
|
39
|
-
"@jungvonmatt/contentful-
|
|
40
|
-
"@jungvonmatt/contentful-
|
|
41
|
-
"
|
|
39
|
+
"@jungvonmatt/contentful-client": "6.0.0",
|
|
40
|
+
"@jungvonmatt/contentful-config": "6.0.0",
|
|
41
|
+
"@jungvonmatt/contentful-ssg": "6.0.0",
|
|
42
|
+
"cf-content-types-generator": "^3.0.1",
|
|
42
43
|
"change-case": "^5.4.2",
|
|
43
|
-
"commander": "^
|
|
44
|
-
"contentful": "^11.
|
|
45
|
-
"contentful-management": "^
|
|
46
|
-
"exit-hook": "^
|
|
44
|
+
"commander": "^14.0.3",
|
|
45
|
+
"contentful": "^11.12.2",
|
|
46
|
+
"contentful-management": "^12.5.0",
|
|
47
|
+
"exit-hook": "^5.1.0",
|
|
47
48
|
"fs-extra": "^11.1.0",
|
|
48
49
|
"picocolors": "^1.0.0",
|
|
49
|
-
"read-pkg-up": "^11.0.0",
|
|
50
50
|
"semiver": "^1.1.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/chance": "^1.1.6",
|
|
54
54
|
"@types/fs-extra": "^11.0.4",
|
|
55
|
-
"rimraf": "^
|
|
56
|
-
"ts-morph": "^
|
|
55
|
+
"rimraf": "^6.0.1",
|
|
56
|
+
"ts-morph": "^27.0.0"
|
|
57
57
|
},
|
|
58
58
|
"engines": {
|
|
59
59
|
"node": ">=22"
|
|
60
60
|
},
|
|
61
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "72a840af083dd2739517cd30c4a7b8277c462d81"
|
|
62
62
|
}
|
package/src/cli.test.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { vi, describe, test, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
|
|
3
|
+
const generateTypings = vi.fn();
|
|
4
|
+
const outputFile = vi.fn();
|
|
5
|
+
|
|
6
|
+
vi.mock('./index.js', () => ({
|
|
7
|
+
generateTypings: (...args: unknown[]) => generateTypings(...args),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
vi.mock('fs-extra', () => ({
|
|
11
|
+
outputFile: (...args: unknown[]) => outputFile(...args),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
vi.mock('@jungvonmatt/contentful-ssg/lib/ui', () => ({
|
|
15
|
+
logError: vi.fn(),
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
vi.mock('exit-hook', () => ({
|
|
19
|
+
gracefulExit: vi.fn(),
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
describe('contentful-typings CLI', () => {
|
|
23
|
+
let originalArgv: string[];
|
|
24
|
+
let consoleLog: ReturnType<typeof vi.fn>;
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
originalArgv = process.argv;
|
|
28
|
+
consoleLog = vi.fn();
|
|
29
|
+
vi.spyOn(console, 'log').mockImplementation(consoleLog);
|
|
30
|
+
vi.resetModules();
|
|
31
|
+
generateTypings.mockReset();
|
|
32
|
+
outputFile.mockReset();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
process.argv = originalArgv;
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('generate command calls generateTypings and writes output', async () => {
|
|
41
|
+
generateTypings.mockResolvedValue('// generated types\nexport type Page = {};');
|
|
42
|
+
outputFile.mockResolvedValue(undefined);
|
|
43
|
+
|
|
44
|
+
process.argv = ['node', 'cli', 'generate', '--output', 'types.ts'];
|
|
45
|
+
|
|
46
|
+
await import('./cli.js');
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
48
|
+
|
|
49
|
+
expect(generateTypings).toHaveBeenCalledWith(
|
|
50
|
+
expect.objectContaining({
|
|
51
|
+
typeguard: undefined,
|
|
52
|
+
jsdoc: undefined,
|
|
53
|
+
localized: undefined,
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
expect(outputFile).toHaveBeenCalledWith(
|
|
57
|
+
'types.ts',
|
|
58
|
+
'// generated types\nexport type Page = {};',
|
|
59
|
+
);
|
|
60
|
+
expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining('types.ts'));
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('generate uses default output path', async () => {
|
|
64
|
+
generateTypings.mockResolvedValue('// types');
|
|
65
|
+
outputFile.mockResolvedValue(undefined);
|
|
66
|
+
|
|
67
|
+
process.argv = ['node', 'cli', 'generate'];
|
|
68
|
+
await import('./cli.js');
|
|
69
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
70
|
+
|
|
71
|
+
expect(outputFile).toHaveBeenCalledWith('@types/contentful.ts', '// types');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('generate passes --typeguard flag', async () => {
|
|
75
|
+
generateTypings.mockResolvedValue('// types');
|
|
76
|
+
outputFile.mockResolvedValue(undefined);
|
|
77
|
+
|
|
78
|
+
process.argv = ['node', 'cli', 'generate', '--typeguard'];
|
|
79
|
+
await import('./cli.js');
|
|
80
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
81
|
+
|
|
82
|
+
expect(generateTypings).toHaveBeenCalledWith(expect.objectContaining({ typeguard: true }));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('generate passes --jsdoc flag', async () => {
|
|
86
|
+
generateTypings.mockResolvedValue('// types');
|
|
87
|
+
outputFile.mockResolvedValue(undefined);
|
|
88
|
+
|
|
89
|
+
process.argv = ['node', 'cli', 'generate', '--jsdoc'];
|
|
90
|
+
await import('./cli.js');
|
|
91
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
92
|
+
|
|
93
|
+
expect(generateTypings).toHaveBeenCalledWith(expect.objectContaining({ jsdoc: true }));
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('generate passes --localized flag', async () => {
|
|
97
|
+
generateTypings.mockResolvedValue('// types');
|
|
98
|
+
outputFile.mockResolvedValue(undefined);
|
|
99
|
+
|
|
100
|
+
process.argv = ['node', 'cli', 'generate', '--localized'];
|
|
101
|
+
await import('./cli.js');
|
|
102
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
103
|
+
|
|
104
|
+
expect(generateTypings).toHaveBeenCalledWith(expect.objectContaining({ localized: true }));
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test('generate passes --cwd option', async () => {
|
|
108
|
+
generateTypings.mockResolvedValue('// types');
|
|
109
|
+
outputFile.mockResolvedValue(undefined);
|
|
110
|
+
|
|
111
|
+
process.argv = ['node', 'cli', 'generate', '--cwd', '/custom/dir'];
|
|
112
|
+
await import('./cli.js');
|
|
113
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
114
|
+
|
|
115
|
+
expect(generateTypings).toHaveBeenCalledWith(expect.objectContaining({ cwd: '/custom/dir' }));
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('generate passes --config option', async () => {
|
|
119
|
+
generateTypings.mockResolvedValue('// types');
|
|
120
|
+
outputFile.mockResolvedValue(undefined);
|
|
121
|
+
|
|
122
|
+
process.argv = ['node', 'cli', 'generate', '--config', 'my.config.js'];
|
|
123
|
+
await import('./cli.js');
|
|
124
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
125
|
+
|
|
126
|
+
expect(generateTypings).toHaveBeenCalledWith(
|
|
127
|
+
expect.objectContaining({ configFile: 'my.config.js' }),
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('generate handles error from generateTypings', async () => {
|
|
132
|
+
const { gracefulExit } = await import('exit-hook');
|
|
133
|
+
generateTypings.mockRejectedValue(new Error('Generation failed'));
|
|
134
|
+
|
|
135
|
+
process.argv = ['node', 'cli', 'generate'];
|
|
136
|
+
await import('./cli.js');
|
|
137
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
138
|
+
|
|
139
|
+
expect(gracefulExit).toHaveBeenCalledWith(1);
|
|
140
|
+
});
|
|
141
|
+
});
|
package/src/cli.ts
CHANGED
|
@@ -13,7 +13,6 @@ type CommandArgs = {
|
|
|
13
13
|
typeguard?: boolean;
|
|
14
14
|
jsdoc?: boolean;
|
|
15
15
|
localized?: boolean;
|
|
16
|
-
legacy?: boolean;
|
|
17
16
|
cwd?: string;
|
|
18
17
|
config?: string;
|
|
19
18
|
};
|
|
@@ -55,7 +54,6 @@ program
|
|
|
55
54
|
.option('-l, --localized', 'Add localized types')
|
|
56
55
|
.option('-d, --jsdoc', 'Add JSDoc comments')
|
|
57
56
|
.option('-g, --typeguard', 'Add type guards')
|
|
58
|
-
.option('-l, --legacy', 'Use legacy types (before contentful@10)')
|
|
59
57
|
.action(
|
|
60
58
|
actionRunner(async (cmd: CommandArgs) => {
|
|
61
59
|
const output: string = cmd?.output ?? '';
|
|
@@ -63,7 +61,6 @@ program
|
|
|
63
61
|
typeguard: cmd.typeguard,
|
|
64
62
|
jsdoc: cmd.jsdoc,
|
|
65
63
|
localized: cmd.localized,
|
|
66
|
-
legacy: cmd.legacy,
|
|
67
64
|
cwd: cmd?.cwd || process.cwd(),
|
|
68
65
|
configFile: cmd?.config || undefined,
|
|
69
66
|
});
|
package/src/index.test.ts
CHANGED
|
@@ -15,38 +15,62 @@ vi.mock('@jungvonmatt/contentful-ssg/lib/contentful', async (importOriginal) =>
|
|
|
15
15
|
const actual = (await importOriginal()) as Record<string, unknown>;
|
|
16
16
|
return {
|
|
17
17
|
...actual,
|
|
18
|
-
getEnvironment: vi.fn().mockResolvedValue({}),
|
|
19
|
-
pagedGet: vi.fn().mockResolvedValue({
|
|
20
|
-
items: [
|
|
21
|
-
{
|
|
22
|
-
sys: { id: 'page', type: 'ContentType' },
|
|
23
|
-
name: 'Page',
|
|
24
|
-
displayField: 'title',
|
|
25
|
-
description: '',
|
|
26
|
-
fields: [
|
|
27
|
-
{
|
|
28
|
-
id: 'title',
|
|
29
|
-
name: 'Title',
|
|
30
|
-
type: 'Symbol',
|
|
31
|
-
required: true,
|
|
32
|
-
localized: false,
|
|
33
|
-
omitted: false,
|
|
34
|
-
disabled: false,
|
|
35
|
-
validations: [],
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
}),
|
|
18
|
+
getEnvironment: vi.fn().mockResolvedValue({ sys: { id: 'master' } }),
|
|
41
19
|
};
|
|
42
20
|
});
|
|
43
21
|
|
|
44
|
-
vi.mock('
|
|
45
|
-
|
|
46
|
-
|
|
22
|
+
vi.mock('contentful-management', async (importOriginal) => {
|
|
23
|
+
const actual = await importOriginal<typeof import('contentful-management')>();
|
|
24
|
+
return {
|
|
25
|
+
...actual,
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
vi.mock('@jungvonmatt/contentful-client', () => ({
|
|
30
|
+
getManagementClient: vi.fn().mockReturnValue({
|
|
31
|
+
contentType: {
|
|
32
|
+
getMany: vi.fn().mockResolvedValue({
|
|
33
|
+
items: [
|
|
34
|
+
{
|
|
35
|
+
sys: { id: 'page', type: 'ContentType' },
|
|
36
|
+
name: 'Page',
|
|
37
|
+
displayField: 'title',
|
|
38
|
+
description: '',
|
|
39
|
+
fields: [
|
|
40
|
+
{
|
|
41
|
+
id: 'title',
|
|
42
|
+
name: 'Title',
|
|
43
|
+
type: 'Symbol',
|
|
44
|
+
required: true,
|
|
45
|
+
localized: false,
|
|
46
|
+
omitted: false,
|
|
47
|
+
disabled: false,
|
|
48
|
+
validations: [],
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
total: 1,
|
|
54
|
+
skip: 0,
|
|
55
|
+
limit: 100,
|
|
56
|
+
}),
|
|
57
|
+
},
|
|
47
58
|
}),
|
|
48
59
|
}));
|
|
49
60
|
|
|
61
|
+
vi.mock('node:fs/promises', async (importOriginal) => {
|
|
62
|
+
const actual = await importOriginal<typeof import('node:fs/promises')>();
|
|
63
|
+
return {
|
|
64
|
+
...actual,
|
|
65
|
+
readFile: vi.fn().mockImplementation((filePath: string) => {
|
|
66
|
+
if (typeof filePath === 'string' && filePath.includes('contentful/package.json')) {
|
|
67
|
+
return Promise.resolve(JSON.stringify({ name: 'contentful', version: '10.5.0' }));
|
|
68
|
+
}
|
|
69
|
+
return actual.readFile(filePath, 'utf-8');
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
|
|
50
74
|
describe('generateTypings', () => {
|
|
51
75
|
test('renders V10 skeleton types by default', async () => {
|
|
52
76
|
console.log = vi.fn();
|
package/src/index.ts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
/* _eslint-disable @typescript-eslint/no-unsafe-call */
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import pico from 'picocolors';
|
|
4
|
-
import { type ContentfulConfig
|
|
4
|
+
import { type ContentfulConfig } from '@jungvonmatt/contentful-ssg';
|
|
5
5
|
import { loadContentfulConfig } from '@jungvonmatt/contentful-config';
|
|
6
|
-
import { getEnvironment
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { getEnvironment } from '@jungvonmatt/contentful-ssg/lib/contentful';
|
|
7
|
+
import { getManagementClient } from '@jungvonmatt/contentful-client';
|
|
8
|
+
import { fetchAll } from 'contentful-management';
|
|
9
|
+
import {
|
|
10
|
+
CFDefinitionsBuilder,
|
|
11
|
+
type CFContentType,
|
|
12
|
+
type Renderer,
|
|
13
|
+
} from 'cf-content-types-generator';
|
|
14
|
+
import { readFile } from 'node:fs/promises';
|
|
9
15
|
import semiver from 'semiver';
|
|
10
16
|
|
|
11
17
|
import {
|
|
12
18
|
DefaultContentTypeRenderer,
|
|
13
|
-
V10ContentTypeRenderer,
|
|
14
19
|
V10TypeGuardRenderer,
|
|
15
20
|
JsDocRenderer,
|
|
16
21
|
LocalizedContentTypeRenderer,
|
|
@@ -28,8 +33,11 @@ type Options = {
|
|
|
28
33
|
|
|
29
34
|
const isLegacyVersion = async (dir?: string) => {
|
|
30
35
|
try {
|
|
31
|
-
const
|
|
32
|
-
const
|
|
36
|
+
const pkgPath = path.join(dir || process.cwd(), 'node_modules', 'contentful', 'package.json');
|
|
37
|
+
const packageJson = JSON.parse(await readFile(pkgPath, 'utf-8')) as {
|
|
38
|
+
name: string;
|
|
39
|
+
version: string;
|
|
40
|
+
};
|
|
33
41
|
// New skeleton types were released in contentful v10.0.0-beta-v10.33
|
|
34
42
|
if (
|
|
35
43
|
packageJson.name === 'contentful' &&
|
|
@@ -50,22 +58,28 @@ export const generateTypings = async (options: Options = {}) => {
|
|
|
50
58
|
required: ['managementToken', 'environmentId', 'spaceId'],
|
|
51
59
|
});
|
|
52
60
|
|
|
53
|
-
const
|
|
61
|
+
const config = loaderResult.config;
|
|
62
|
+
const environment = await getEnvironment(config);
|
|
63
|
+
const client = getManagementClient(config);
|
|
54
64
|
|
|
55
65
|
console.log(
|
|
56
|
-
`Generating typescript definitions for: ${pico.gray('spaces/')}${pico.green(
|
|
66
|
+
`Generating typescript definitions for: ${pico.gray('spaces/')}${pico.green(config.spaceId)}${pico.gray('/environments/')}${pico.green(config.environmentId)}`,
|
|
57
67
|
);
|
|
58
68
|
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
const contentTypes = await fetchAll(
|
|
70
|
+
(params) =>
|
|
71
|
+
client.contentType.getMany({
|
|
72
|
+
spaceId: config.spaceId,
|
|
73
|
+
environmentId: config.environmentId ?? environment.sys.id,
|
|
74
|
+
...params,
|
|
75
|
+
}),
|
|
76
|
+
{},
|
|
77
|
+
);
|
|
62
78
|
|
|
63
79
|
const legacyVersion =
|
|
64
80
|
typeof options.legacy === 'undefined' ? await isLegacyVersion() : options.legacy;
|
|
65
81
|
|
|
66
|
-
const renderers:
|
|
67
|
-
legacyVersion ? new DefaultContentTypeRenderer() : new V10ContentTypeRenderer(),
|
|
68
|
-
];
|
|
82
|
+
const renderers: Renderer[] = [new DefaultContentTypeRenderer()];
|
|
69
83
|
if (options.localized) {
|
|
70
84
|
renderers.push(new LocalizedContentTypeRenderer());
|
|
71
85
|
}
|
|
@@ -81,7 +95,7 @@ export const generateTypings = async (options: Options = {}) => {
|
|
|
81
95
|
const builder = new CFDefinitionsBuilder(renderers);
|
|
82
96
|
|
|
83
97
|
for (const model of contentTypes) {
|
|
84
|
-
builder.appendType(model);
|
|
98
|
+
builder.appendType(model as CFContentType);
|
|
85
99
|
}
|
|
86
100
|
|
|
87
101
|
return builder.toString();
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
V10ContentTypeRenderer as V10ContentTypeRendererOriginal,
|
|
2
|
+
ContentTypeRenderer as ContentTypeRendererOriginal,
|
|
4
3
|
type RenderContext,
|
|
5
4
|
} from 'cf-content-types-generator';
|
|
6
|
-
import { context
|
|
5
|
+
import { context } from './context.js';
|
|
7
6
|
|
|
8
|
-
export class DefaultContentTypeRenderer extends
|
|
7
|
+
export class DefaultContentTypeRenderer extends ContentTypeRendererOriginal {
|
|
9
8
|
public createContext(): RenderContext {
|
|
10
9
|
return context;
|
|
11
10
|
}
|
|
12
11
|
}
|
|
13
|
-
|
|
14
|
-
export class V10ContentTypeRenderer extends V10ContentTypeRendererOriginal {
|
|
15
|
-
public createContext(): RenderContext {
|
|
16
|
-
return v10context;
|
|
17
|
-
}
|
|
18
|
-
}
|
package/src/renderer/context.ts
CHANGED
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
import { pascalCase } from 'change-case';
|
|
2
|
-
import {
|
|
3
|
-
createDefaultContext,
|
|
4
|
-
createV10Context,
|
|
5
|
-
type RenderContext,
|
|
6
|
-
} from 'cf-content-types-generator';
|
|
2
|
+
import { createContext, type RenderContext } from 'cf-content-types-generator';
|
|
7
3
|
|
|
8
4
|
export const moduleName = (name: string) => pascalCase(name);
|
|
9
5
|
export const moduleFieldsName = (name: string) => `${moduleName(name)}Fields`;
|
|
10
6
|
export const moduleSkeletonName = (name: string): string => `${moduleName(name)}Skeleton`;
|
|
11
7
|
export const context: RenderContext = {
|
|
12
|
-
...
|
|
13
|
-
moduleName,
|
|
14
|
-
moduleFieldsName,
|
|
15
|
-
moduleSkeletonName,
|
|
16
|
-
};
|
|
17
|
-
export const v10context: RenderContext = {
|
|
18
|
-
...createV10Context(),
|
|
8
|
+
...createContext(),
|
|
19
9
|
moduleName,
|
|
20
10
|
moduleFieldsName,
|
|
21
11
|
moduleSkeletonName,
|
package/src/renderer/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DefaultContentTypeRenderer
|
|
1
|
+
export { DefaultContentTypeRenderer } from './contentTypeRenderer.js';
|
|
2
2
|
export { JsDocRenderer } from './jsDocRenderer.js';
|
|
3
3
|
export { TypeGuardRenderer, V10TypeGuardRenderer } from './typeGuardRenderer.js';
|
|
4
4
|
export { LocalizedContentTypeRenderer } from './localizedContentRenderer.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
ContentTypeRenderer as ContentTypeRendererBase,
|
|
3
3
|
type RenderContext,
|
|
4
4
|
} from 'cf-content-types-generator';
|
|
5
5
|
import { context } from './context.js';
|
|
6
6
|
|
|
7
|
-
export class LocalizedContentTypeRenderer extends
|
|
7
|
+
export class LocalizedContentTypeRenderer extends ContentTypeRendererBase {
|
|
8
8
|
public createContext(): RenderContext {
|
|
9
9
|
return context;
|
|
10
10
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { describe, test, expect } from 'vitest';
|
|
1
2
|
import { CFDefinitionsBuilder, type CFContentType } from 'cf-content-types-generator';
|
|
2
3
|
import { moduleName, moduleFieldsName, moduleSkeletonName } from './context.js';
|
|
3
|
-
import { DefaultContentTypeRenderer
|
|
4
|
+
import { DefaultContentTypeRenderer } from './contentTypeRenderer.js';
|
|
4
5
|
import { JsDocRenderer } from './jsDocRenderer.js';
|
|
5
6
|
import { LocalizedContentTypeRenderer } from './localizedContentRenderer.js';
|
|
6
7
|
import { TypeGuardRenderer, V10TypeGuardRenderer } from './typeGuardRenderer.js';
|
|
@@ -8,8 +9,6 @@ import { TypeGuardRenderer, V10TypeGuardRenderer } from './typeGuardRenderer.js'
|
|
|
8
9
|
const contentType: CFContentType = {
|
|
9
10
|
sys: { id: 'page-block', type: 'ContentType' } as CFContentType['sys'],
|
|
10
11
|
name: 'Page Block',
|
|
11
|
-
displayField: 'title',
|
|
12
|
-
description: '',
|
|
13
12
|
fields: [
|
|
14
13
|
{
|
|
15
14
|
id: 'title',
|
|
@@ -47,8 +46,8 @@ describe('renderer/contentTypeRenderer', () => {
|
|
|
47
46
|
expect(out).toContain('PageBlock');
|
|
48
47
|
});
|
|
49
48
|
|
|
50
|
-
test('
|
|
51
|
-
const builder = new CFDefinitionsBuilder([new
|
|
49
|
+
test('DefaultContentTypeRenderer produces skeleton types', () => {
|
|
50
|
+
const builder = new CFDefinitionsBuilder([new DefaultContentTypeRenderer()]);
|
|
52
51
|
builder.appendType(contentType);
|
|
53
52
|
const out = builder.toString();
|
|
54
53
|
expect(out).toContain('PageBlock');
|
|
@@ -58,7 +57,10 @@ describe('renderer/contentTypeRenderer', () => {
|
|
|
58
57
|
|
|
59
58
|
describe('renderer/jsDocRenderer', () => {
|
|
60
59
|
test('emits JSDoc comments referencing Pascal cased name', () => {
|
|
61
|
-
const builder = new CFDefinitionsBuilder([
|
|
60
|
+
const builder = new CFDefinitionsBuilder([
|
|
61
|
+
new DefaultContentTypeRenderer(),
|
|
62
|
+
new JsDocRenderer(),
|
|
63
|
+
]);
|
|
62
64
|
builder.appendType(contentType);
|
|
63
65
|
const out = builder.toString();
|
|
64
66
|
expect(out).toMatch(/\/\*\*[\s\S]*PageBlock/);
|
|
@@ -68,12 +70,12 @@ describe('renderer/jsDocRenderer', () => {
|
|
|
68
70
|
describe('renderer/localizedContentRenderer', () => {
|
|
69
71
|
test('emits localized type when included', () => {
|
|
70
72
|
const builder = new CFDefinitionsBuilder([
|
|
71
|
-
new
|
|
73
|
+
new DefaultContentTypeRenderer(),
|
|
72
74
|
new LocalizedContentTypeRenderer(),
|
|
73
75
|
]);
|
|
74
76
|
builder.appendType(contentType);
|
|
75
77
|
const out = builder.toString();
|
|
76
|
-
expect(out).toContain('
|
|
78
|
+
expect(out).toContain('LocaleCode');
|
|
77
79
|
});
|
|
78
80
|
});
|
|
79
81
|
|
|
@@ -91,7 +93,7 @@ describe('renderer/typeGuardRenderer', () => {
|
|
|
91
93
|
|
|
92
94
|
test('V10TypeGuardRenderer emits skeleton-aware guard', () => {
|
|
93
95
|
const builder = new CFDefinitionsBuilder([
|
|
94
|
-
new
|
|
96
|
+
new DefaultContentTypeRenderer(),
|
|
95
97
|
new V10TypeGuardRenderer(),
|
|
96
98
|
]);
|
|
97
99
|
builder.appendType(contentType);
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TypeGuardRenderer as TypeGuardRendererOriginal,
|
|
3
|
-
V10TypeGuardRenderer as V10TypeGuardRendererOriginal,
|
|
4
3
|
type RenderContext,
|
|
5
4
|
type CFContentType,
|
|
6
5
|
renderTypeGeneric,
|
|
7
6
|
} from 'cf-content-types-generator';
|
|
8
7
|
import { type SourceFile } from 'ts-morph';
|
|
9
|
-
import { context,
|
|
8
|
+
import { context, moduleName } from './context.js';
|
|
10
9
|
|
|
11
10
|
export class TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
12
11
|
public createContext(): RenderContext {
|
|
@@ -43,9 +42,9 @@ export class TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
|
43
42
|
};
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
export class V10TypeGuardRenderer extends
|
|
45
|
+
export class V10TypeGuardRenderer extends TypeGuardRendererOriginal {
|
|
47
46
|
public createContext(): RenderContext {
|
|
48
|
-
return
|
|
47
|
+
return context;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
public render = (contentType: CFContentType, file: SourceFile): void => {
|
|
@@ -53,7 +52,7 @@ export class V10TypeGuardRenderer extends V10TypeGuardRendererOriginal {
|
|
|
53
52
|
|
|
54
53
|
file.addImportDeclaration({
|
|
55
54
|
moduleSpecifier: `contentful`,
|
|
56
|
-
namedImports: ['ChainModifiers', 'Entry', 'LocaleCode'],
|
|
55
|
+
namedImports: ['ChainModifiers', 'Entry', 'EntrySkeletonType', 'LocaleCode'],
|
|
57
56
|
isTypeOnly: true,
|
|
58
57
|
});
|
|
59
58
|
|