@jungvonmatt/contentful-config 4.1.2 → 5.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/README.md +13 -13
- package/dist/cli.js +0 -0
- package/dist/contentful.js +3 -3
- package/dist/contentful.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +20 -22
- package/src/contentful.test.ts +122 -0
- package/src/contentful.ts +3 -5
- package/src/index.test.ts +236 -0
- package/src/index.ts +1 -1
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ import { loadContentfulConfig } from '@jungvonmatt/contentful-config';
|
|
|
41
41
|
// If required values are not found in configuration files or
|
|
42
42
|
// environment variables, an interactive prompt will be displayed
|
|
43
43
|
const { config } = await loadContentfulConfig('myapp', {
|
|
44
|
-
required: ['spaceId', 'accessToken']
|
|
44
|
+
required: ['spaceId', 'accessToken'],
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
// The configuration now contains all required values,
|
|
@@ -60,12 +60,12 @@ contentful-config [options]
|
|
|
60
60
|
|
|
61
61
|
### Options
|
|
62
62
|
|
|
63
|
-
| Option
|
|
64
|
-
|
|
|
65
|
-
| `-n, --name <name>`
|
|
66
|
-
| `-o, --output <file>`
|
|
63
|
+
| Option | Description |
|
|
64
|
+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
65
|
+
| `-n, --name <name>` | Config name (default: `contentful`) |
|
|
66
|
+
| `-o, --output <file>` | Write output to a file instead of stdout |
|
|
67
67
|
| `-r, --required <keys>` | Required config keys, comma-separated or repeated (default: `spaceId,environmentId,accessToken,previewAccessToken`) |
|
|
68
|
-
| `-h, --help`
|
|
68
|
+
| `-h, --help` | Show help message |
|
|
69
69
|
|
|
70
70
|
### Examples
|
|
71
71
|
|
|
@@ -93,13 +93,13 @@ contentful-config -r spaceId -r accessToken -r environmentId
|
|
|
93
93
|
- **File merging**: When using `-o`, existing file content is preserved. Matching keys are updated in place, new keys are appended. Comments and unrelated entries remain untouched.
|
|
94
94
|
- **Output**: The following environment variables are generated:
|
|
95
95
|
|
|
96
|
-
| Config Key
|
|
97
|
-
|
|
|
98
|
-
| `spaceId`
|
|
99
|
-
| `environmentId`
|
|
100
|
-
| `accessToken`
|
|
101
|
-
| `previewAccessToken` | `CONTENTFUL_PREVIEW_ACCESS_TOKEN`
|
|
102
|
-
| `host`
|
|
96
|
+
| Config Key | Environment Variable |
|
|
97
|
+
| -------------------- | ---------------------------------- |
|
|
98
|
+
| `spaceId` | `CONTENTFUL_SPACE_ID` |
|
|
99
|
+
| `environmentId` | `CONTENTFUL_ENVIRONMENT_ID` |
|
|
100
|
+
| `accessToken` | `CONTENTFUL_DELIVERY_ACCESS_TOKEN` |
|
|
101
|
+
| `previewAccessToken` | `CONTENTFUL_PREVIEW_ACCESS_TOKEN` |
|
|
102
|
+
| `host` | `CONTENTFUL_HOST` |
|
|
103
103
|
|
|
104
104
|
> **Note:** The management token is intentionally excluded from the output as it is read from the Contentful CLI config file.
|
|
105
105
|
|
package/dist/cli.js
CHANGED
|
File without changes
|
package/dist/contentful.js
CHANGED
|
@@ -66,11 +66,11 @@ export const getEnvironment = async (options) => {
|
|
|
66
66
|
const { environmentId, spaceId } = options || {};
|
|
67
67
|
const space = await getSpace(options);
|
|
68
68
|
const { items: environments } = await space.getEnvironments();
|
|
69
|
-
const environmentIds = (environments || []).map((env) => env.sys.id);
|
|
70
|
-
if (environmentId && environmentIds.
|
|
69
|
+
const environmentIds = new Set((environments || []).map((env) => env.sys.id));
|
|
70
|
+
if (environmentId && environmentIds.has(environmentId)) {
|
|
71
71
|
return space.getEnvironment(environmentId);
|
|
72
72
|
}
|
|
73
|
-
if (environmentId && !environmentIds.
|
|
73
|
+
if (environmentId && !environmentIds.has(environmentId)) {
|
|
74
74
|
throw new Error(`Environment "${environmentId}" is not available in space ${spaceId}"`);
|
|
75
75
|
}
|
|
76
76
|
throw new Error('Missing required parameter: environmentId');
|
package/dist/contentful.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentful.js","sourceRoot":"","sources":["../src/contentful.ts"],"names":[],"mappings":"AASA,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,IAAI,MAAiB,CAAC;AActB,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAK/B,MAAM,SAAS,GAAG,CAAC,OAA0B,EAAE,EAAE;IAC/C,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAE7D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,WAAW,EAAE,eAAe,IAAI,WAAW;KAC5C,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;AACJ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"contentful.js","sourceRoot":"","sources":["../src/contentful.ts"],"names":[],"mappings":"AASA,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAE/C,IAAI,MAAiB,CAAC;AActB,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAK/B,MAAM,SAAS,GAAG,CAAC,OAA0B,EAAE,EAAE;IAC/C,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAE7D,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,WAAW,EAAE,eAAe,IAAI,WAAW;KAC5C,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAKzB,EAAK,EACsB,EAAE;IAC7B,MAAM,WAAW,GAAG,KAAK,EACvB,UAGI,EAAE,EACN,EAAE;QACF,IAAI,kBAAkB,GAAG,OAAO,EAAE,kBAAkB,CAAC;QACrD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG;YACZ,IAAI;YACJ,KAAK,EAAE,iBAAiB;SACzB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAO,EAAE,CAAC,KAAiB,CAAsB,CAAC;QACnE,MAAM,EAAE,KAAK,GAAG,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;QAE7D,IAAI,kBAAkB,EAAE,CAAC;YACvB,kBAAkB,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,kBAAkB,GAAG,QAAQ,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,OAAO,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAA0D,EAC1D,EAAE;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,OAA0D,EAAE,EAAE;IAC5F,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,OAAsE,EACtE,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,OAAsE,EACtE,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,OAAwF,EACxF,EAAE;IACF,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;IAE9D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,IAAI,aAAa,IAAI,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,aAAa,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,gBAAgB,aAAa,+BAA+B,OAAO,GAAG,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/D,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,OAAsE,EACtE,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;IACjE,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;IAErC,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAAsE,EACtE,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACvE,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,CAAC;IACvC,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,aAAuB,CAAC;IAEpE,OAAO,kBAAkB,CAAC;AAC5B,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export const getPrompts = (data = {}) => {
|
|
|
28
28
|
if (managementToken) {
|
|
29
29
|
const organizations = await getOrganizations({ managementToken, host });
|
|
30
30
|
return organizations.map((organization) => ({
|
|
31
|
-
message:
|
|
31
|
+
message: organization.name,
|
|
32
32
|
name: organization.sys.id,
|
|
33
33
|
value: organization.sys.id,
|
|
34
34
|
}));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAEL,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,GACV,MAAM,iBAAiB,CAAC;AAgBzB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAmC,EAAE,EAAE,EAAE;IAClE,OAAO;QACL;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,IAAI,CAAC,eAAe;SAC9B;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,IAAI,CAAC,IAAI;YAClB,OAAO,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,CAAC;SACzD;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,cAAc;YACvB,KAAK,CAAC,OAAO;gBACX,MAAM,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;gBACxC,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,EAAE,eAAe,CAAC;gBAC1E,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC;gBACzC,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;wBAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jungvonmatt/contentful-config",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "5.0.0",
|
|
4
|
+
"homepage": "https://github.com/jungvonmatt/contentful-ssg#readme",
|
|
5
|
+
"bugs": {
|
|
6
|
+
"url": "https://github.com/jungvonmatt/contentful-ssg/issues"
|
|
7
|
+
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"author": "",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/jungvonmatt/contentful-ssg.git"
|
|
13
|
+
},
|
|
7
14
|
"bin": {
|
|
8
15
|
"contentful-config": "./dist/cli.js"
|
|
9
16
|
},
|
|
@@ -11,33 +18,22 @@
|
|
|
11
18
|
"src",
|
|
12
19
|
"dist"
|
|
13
20
|
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"exports": "./dist/index.js",
|
|
14
24
|
"publishConfig": {
|
|
15
25
|
"access": "public"
|
|
16
26
|
},
|
|
17
|
-
"engines": {
|
|
18
|
-
"node": ">=20"
|
|
19
|
-
},
|
|
20
27
|
"scripts": {
|
|
21
28
|
"clean": "rimraf ./dist",
|
|
22
|
-
"test": "
|
|
23
|
-
"lint": "
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"lint": "oxlint --type-aware --fix src",
|
|
24
31
|
"precompile": "pnpm run clean",
|
|
25
32
|
"compile": "tsc --build",
|
|
26
33
|
"watch": "tsc --build --watch"
|
|
27
34
|
},
|
|
28
|
-
"repository": {
|
|
29
|
-
"type": "git",
|
|
30
|
-
"url": "git+https://github.com/jungvonmatt/contentful-ssg.git"
|
|
31
|
-
},
|
|
32
|
-
"author": "",
|
|
33
|
-
"license": "MIT",
|
|
34
|
-
"bugs": {
|
|
35
|
-
"url": "https://github.com/jungvonmatt/contentful-ssg/issues"
|
|
36
|
-
},
|
|
37
|
-
"homepage": "https://github.com/jungvonmatt/contentful-ssg#readme",
|
|
38
35
|
"dependencies": {
|
|
39
36
|
"@jungvonmatt/config-loader": "^0.6.0",
|
|
40
|
-
"contentful-cli": "^3.9.0",
|
|
41
37
|
"contentful-management": "^11.54.4",
|
|
42
38
|
"node-homedir": "^2.0.0",
|
|
43
39
|
"package-up": "^5.0.0",
|
|
@@ -46,8 +42,10 @@
|
|
|
46
42
|
},
|
|
47
43
|
"devDependencies": {
|
|
48
44
|
"@types/node": "^20.11.5",
|
|
49
|
-
"eslint": "^8.56.0",
|
|
50
45
|
"rimraf": "^5.0.5"
|
|
51
46
|
},
|
|
52
|
-
"
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=22"
|
|
49
|
+
},
|
|
50
|
+
"gitHead": "dfbefe2c66877ed9411bdb242327e6915f58cf3e"
|
|
53
51
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { vi, beforeEach } from 'vitest';
|
|
2
|
+
|
|
3
|
+
const getOrganizations = vi.fn();
|
|
4
|
+
const getSpaces = vi.fn();
|
|
5
|
+
const getSpace = vi.fn();
|
|
6
|
+
const createClient = vi.fn();
|
|
7
|
+
|
|
8
|
+
vi.mock('contentful-management', () => ({
|
|
9
|
+
default: { createClient },
|
|
10
|
+
createClient,
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
let contentfulModule: typeof import('./contentful.js');
|
|
14
|
+
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
vi.resetModules();
|
|
17
|
+
vi.clearAllMocks();
|
|
18
|
+
|
|
19
|
+
getOrganizations.mockResolvedValue({
|
|
20
|
+
items: [{ sys: { id: 'org-1' }, name: 'Org 1' }],
|
|
21
|
+
limit: 1000,
|
|
22
|
+
total: 1,
|
|
23
|
+
});
|
|
24
|
+
getSpaces.mockResolvedValue({
|
|
25
|
+
items: [{ sys: { id: 'space-1', organization: { sys: { id: 'org-1' } } }, name: 'Space 1' }],
|
|
26
|
+
limit: 1000,
|
|
27
|
+
total: 1,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const space = {
|
|
31
|
+
getEnvironments: vi.fn().mockResolvedValue({
|
|
32
|
+
items: [{ sys: { id: 'master' } }],
|
|
33
|
+
limit: 1000,
|
|
34
|
+
total: 1,
|
|
35
|
+
}),
|
|
36
|
+
getEnvironment: vi.fn().mockResolvedValue({ sys: { id: 'master' } }),
|
|
37
|
+
getApiKeys: vi.fn().mockResolvedValue({
|
|
38
|
+
items: [{ accessToken: 'access-token' }],
|
|
39
|
+
}),
|
|
40
|
+
getPreviewApiKeys: vi.fn().mockResolvedValue({
|
|
41
|
+
items: [{ accessToken: 'preview-token' }],
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
getSpace.mockResolvedValue(space);
|
|
45
|
+
|
|
46
|
+
createClient.mockReturnValue({
|
|
47
|
+
getOrganizations,
|
|
48
|
+
getSpaces,
|
|
49
|
+
getSpace,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
contentfulModule = await import('./contentful.js');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('contentful client helpers', () => {
|
|
56
|
+
test('getOrganizations returns flattened items', async () => {
|
|
57
|
+
const orgs = await contentfulModule.getOrganizations({ managementToken: 'mt' });
|
|
58
|
+
expect(orgs).toEqual([{ sys: { id: 'org-1' }, name: 'Org 1' }]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('getSpaces returns flattened items', async () => {
|
|
62
|
+
const spaces = await contentfulModule.getSpaces({ managementToken: 'mt' });
|
|
63
|
+
expect(spaces[0].sys.id).toBe('space-1');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('getEnvironments returns space environments', async () => {
|
|
67
|
+
const envs = await contentfulModule.getEnvironments({
|
|
68
|
+
managementToken: 'mt',
|
|
69
|
+
spaceId: 's',
|
|
70
|
+
});
|
|
71
|
+
expect(envs[0].sys.id).toBe('master');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('getEnvironment returns existing environment', async () => {
|
|
75
|
+
const env = await contentfulModule.getEnvironment({
|
|
76
|
+
managementToken: 'mt',
|
|
77
|
+
spaceId: 's',
|
|
78
|
+
environmentId: 'master',
|
|
79
|
+
});
|
|
80
|
+
expect(env.sys.id).toBe('master');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('getEnvironment throws on unknown environmentId', async () => {
|
|
84
|
+
await expect(
|
|
85
|
+
contentfulModule.getEnvironment({
|
|
86
|
+
managementToken: 'mt',
|
|
87
|
+
spaceId: 's',
|
|
88
|
+
environmentId: 'staging',
|
|
89
|
+
}),
|
|
90
|
+
).rejects.toThrow(/not available/);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('getApiKey returns first api access token', async () => {
|
|
94
|
+
const token = await contentfulModule.getApiKey({ managementToken: 'mt', spaceId: 's' });
|
|
95
|
+
expect(token).toBe('access-token');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('getPreviewApiKey returns first preview access token', async () => {
|
|
99
|
+
const token = await contentfulModule.getPreviewApiKey({
|
|
100
|
+
managementToken: 'mt',
|
|
101
|
+
spaceId: 's',
|
|
102
|
+
});
|
|
103
|
+
expect(token).toBe('preview-token');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('throws when no token is provided', async () => {
|
|
107
|
+
await expect(
|
|
108
|
+
contentfulModule.getOrganizations({} as { managementToken: string }),
|
|
109
|
+
).rejects.toThrow(/login first/);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('paginates results when total exceeds limit', async () => {
|
|
113
|
+
const items1 = Array.from({ length: 1000 }, (_, i) => ({ sys: { id: `s-${i}` } }));
|
|
114
|
+
const items2 = [{ sys: { id: 's-1000' } }];
|
|
115
|
+
getSpaces
|
|
116
|
+
.mockResolvedValueOnce({ items: items1, limit: 1000, total: 1001 })
|
|
117
|
+
.mockResolvedValueOnce({ items: items2, limit: 1000, total: 1001 });
|
|
118
|
+
|
|
119
|
+
const spaces = await contentfulModule.getSpaces({ managementToken: 'mt' });
|
|
120
|
+
expect(spaces).toHaveLength(1001);
|
|
121
|
+
});
|
|
122
|
+
});
|
package/src/contentful.ts
CHANGED
|
@@ -53,8 +53,6 @@ const getClient = (options: ContentfulOptions) => {
|
|
|
53
53
|
);
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
-
type AwaitedCollectionItem<T> = T extends { items: Array<infer U> } ? U : never;
|
|
57
|
-
|
|
58
56
|
export const getAll = async <
|
|
59
57
|
T extends (query?: QueryOptions) => Promise<Collection<any, any>>,
|
|
60
58
|
TArgs extends Parameters<T> = Parameters<T>,
|
|
@@ -150,13 +148,13 @@ export const getEnvironment = async (
|
|
|
150
148
|
|
|
151
149
|
const { items: environments } = await space.getEnvironments();
|
|
152
150
|
|
|
153
|
-
const environmentIds = (environments || []).map((env) => env.sys.id);
|
|
151
|
+
const environmentIds = new Set((environments || []).map((env) => env.sys.id));
|
|
154
152
|
|
|
155
|
-
if (environmentId && environmentIds.
|
|
153
|
+
if (environmentId && environmentIds.has(environmentId)) {
|
|
156
154
|
return space.getEnvironment(environmentId);
|
|
157
155
|
}
|
|
158
156
|
|
|
159
|
-
if (environmentId && !environmentIds.
|
|
157
|
+
if (environmentId && !environmentIds.has(environmentId)) {
|
|
160
158
|
throw new Error(`Environment "${environmentId}" is not available in space ${spaceId}"`);
|
|
161
159
|
}
|
|
162
160
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { vi, beforeEach } from 'vitest';
|
|
2
|
+
|
|
3
|
+
const getOrganizations = vi.fn();
|
|
4
|
+
const getSpaces = vi.fn();
|
|
5
|
+
const getApiKey = vi.fn();
|
|
6
|
+
const getPreviewApiKey = vi.fn();
|
|
7
|
+
const getEnvironments = vi.fn();
|
|
8
|
+
const loadConfig = vi.fn();
|
|
9
|
+
|
|
10
|
+
vi.mock('./contentful.js', () => ({
|
|
11
|
+
getOrganizations,
|
|
12
|
+
getSpaces,
|
|
13
|
+
getApiKey,
|
|
14
|
+
getPreviewApiKey,
|
|
15
|
+
getEnvironments,
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
vi.mock('@jungvonmatt/config-loader', () => ({
|
|
19
|
+
loadConfig,
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
vi.mock('node-homedir', () => ({
|
|
23
|
+
homedir: vi.fn().mockReturnValue('/home/user'),
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
vi.mock('package-up', () => ({
|
|
27
|
+
packageUp: vi.fn().mockResolvedValue('/proj/package.json'),
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
let mod: typeof import('./index.js');
|
|
31
|
+
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
vi.resetModules();
|
|
34
|
+
vi.clearAllMocks();
|
|
35
|
+
getOrganizations.mockResolvedValue([{ sys: { id: 'org-1' }, name: 'Org 1' }]);
|
|
36
|
+
getSpaces.mockResolvedValue([
|
|
37
|
+
{ sys: { id: 'space-1', organization: { sys: { id: 'org-1' } } }, name: 'Space 1' },
|
|
38
|
+
{ sys: { id: 'space-2', organization: { sys: { id: 'org-2' } } }, name: 'Space 2' },
|
|
39
|
+
]);
|
|
40
|
+
getEnvironments.mockResolvedValue([{ sys: { id: 'master' } }, { sys: { id: 'staging' } }]);
|
|
41
|
+
getApiKey.mockResolvedValue('access-token');
|
|
42
|
+
getPreviewApiKey.mockResolvedValue('preview-token');
|
|
43
|
+
loadConfig.mockResolvedValue({ config: { environmentId: 'master' } });
|
|
44
|
+
mod = await import('./index.js');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const ctx = (answers: Record<string, unknown> = {}) => ({
|
|
48
|
+
enquirer: { options: {}, answers },
|
|
49
|
+
choices: [],
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('getPrompts', () => {
|
|
53
|
+
test('returns prompts in expected order', () => {
|
|
54
|
+
const prompts = mod.getPrompts({});
|
|
55
|
+
expect(prompts.map((p) => p.name)).toEqual([
|
|
56
|
+
'managementToken',
|
|
57
|
+
'host',
|
|
58
|
+
'organizationId',
|
|
59
|
+
'spaceId',
|
|
60
|
+
'environmentId',
|
|
61
|
+
'accessToken',
|
|
62
|
+
'previewAccessToken',
|
|
63
|
+
]);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('organizationId.choices uses managementToken from answers', async () => {
|
|
67
|
+
const prompts = mod.getPrompts({});
|
|
68
|
+
const [, , organizationId] = prompts;
|
|
69
|
+
const result = await organizationId.choices.call(ctx({ managementToken: 'mt' }));
|
|
70
|
+
expect(getOrganizations).toHaveBeenCalledWith({ managementToken: 'mt', host: undefined });
|
|
71
|
+
expect(result).toEqual([{ message: 'Org 1', name: 'org-1', value: 'org-1' }]);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('organizationId.choices returns [] when no managementToken', async () => {
|
|
75
|
+
const prompts = mod.getPrompts({});
|
|
76
|
+
const [, , organizationId] = prompts;
|
|
77
|
+
const result = await organizationId.choices.call(ctx());
|
|
78
|
+
expect(result).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('spaceId.choices filters by selected organizationId', async () => {
|
|
82
|
+
const prompts = mod.getPrompts({});
|
|
83
|
+
const spaceId = prompts.find((p) => p.name === 'spaceId');
|
|
84
|
+
const result = await spaceId!.choices.call(
|
|
85
|
+
ctx({ managementToken: 'mt', organizationId: 'org-1' }),
|
|
86
|
+
);
|
|
87
|
+
expect(result).toHaveLength(1);
|
|
88
|
+
expect(result[0].value).toBe('space-1');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('spaceId.choices returns all spaces when no organizationId', async () => {
|
|
92
|
+
const prompts = mod.getPrompts({});
|
|
93
|
+
const spaceId = prompts.find((p) => p.name === 'spaceId');
|
|
94
|
+
const result = await spaceId!.choices.call(ctx({ managementToken: 'mt' }));
|
|
95
|
+
expect(result).toHaveLength(2);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('spaceId.format returns choice message', () => {
|
|
99
|
+
const prompts = mod.getPrompts({});
|
|
100
|
+
const spaceId = prompts.find((p) => p.name === 'spaceId');
|
|
101
|
+
const result = spaceId!.format.call(
|
|
102
|
+
{ choices: [{ message: 'Pretty', name: 'space-1', value: 'space-1' }] },
|
|
103
|
+
'space-1',
|
|
104
|
+
);
|
|
105
|
+
expect(result).toBe('Pretty');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('spaceId.format falls back to value when no matching choice', () => {
|
|
109
|
+
const prompts = mod.getPrompts({});
|
|
110
|
+
const spaceId = prompts.find((p) => p.name === 'spaceId');
|
|
111
|
+
const result = spaceId!.format.call({ choices: [] }, 'plain-value');
|
|
112
|
+
expect(result).toBe('plain-value');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('environmentId.choices returns environment ids when token+space provided', async () => {
|
|
116
|
+
const prompts = mod.getPrompts({});
|
|
117
|
+
const environmentId = prompts.find((p) => p.name === 'environmentId');
|
|
118
|
+
const result = await environmentId!.choices.call(
|
|
119
|
+
ctx({ managementToken: 'mt', spaceId: 'space-1' }),
|
|
120
|
+
);
|
|
121
|
+
expect(result).toEqual(['master', 'staging']);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('environmentId.choices returns [] without spaceId', async () => {
|
|
125
|
+
const prompts = mod.getPrompts({});
|
|
126
|
+
const environmentId = prompts.find((p) => p.name === 'environmentId');
|
|
127
|
+
const result = await environmentId!.choices.call(ctx({ managementToken: 'mt' }));
|
|
128
|
+
expect(result).toEqual([]);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('accessToken.skip true when no spaceId in answers/data', () => {
|
|
132
|
+
const prompts = mod.getPrompts({});
|
|
133
|
+
const accessToken = prompts.find((p) => p.name === 'accessToken');
|
|
134
|
+
expect(accessToken!.skip.call(ctx())).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('accessToken.skip false when spaceId in answers', () => {
|
|
138
|
+
const prompts = mod.getPrompts({});
|
|
139
|
+
const accessToken = prompts.find((p) => p.name === 'accessToken');
|
|
140
|
+
expect(accessToken!.skip.call(ctx({ spaceId: 'space-1' }))).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('accessToken.initial fetches via getApiKey when token+space available', async () => {
|
|
144
|
+
const prompts = mod.getPrompts({});
|
|
145
|
+
const accessToken = prompts.find((p) => p.name === 'accessToken');
|
|
146
|
+
const value = await accessToken!.initial.call(
|
|
147
|
+
ctx({ managementToken: 'mt', spaceId: 'space-1' }),
|
|
148
|
+
);
|
|
149
|
+
expect(value).toBe('access-token');
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('accessToken.initial returns supplied data.accessToken (string)', async () => {
|
|
153
|
+
const prompts = mod.getPrompts({ accessToken: 'preset' });
|
|
154
|
+
const accessToken = prompts.find((p) => p.name === 'accessToken');
|
|
155
|
+
const value = await accessToken!.initial.call(ctx());
|
|
156
|
+
expect(value).toBe('preset');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('accessToken.initial calls function-style data.accessToken', async () => {
|
|
160
|
+
const prompts = mod.getPrompts({ accessToken: (() => 'fn-token') as never });
|
|
161
|
+
const accessToken = prompts.find((p) => p.name === 'accessToken');
|
|
162
|
+
const value = await accessToken!.initial.call(ctx());
|
|
163
|
+
expect(value).toBe('fn-token');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('previewAccessToken.initial fetches via getPreviewApiKey', async () => {
|
|
167
|
+
const prompts = mod.getPrompts({});
|
|
168
|
+
const previewAccessToken = prompts.find((p) => p.name === 'previewAccessToken');
|
|
169
|
+
const value = await previewAccessToken!.initial.call(
|
|
170
|
+
ctx({ managementToken: 'mt', spaceId: 'space-1' }),
|
|
171
|
+
);
|
|
172
|
+
expect(value).toBe('preview-token');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe('loadContentfulConfig', () => {
|
|
177
|
+
test('delegates to loadConfig with merged options', async () => {
|
|
178
|
+
loadConfig.mockResolvedValueOnce({ config: { home: true } });
|
|
179
|
+
loadConfig.mockResolvedValueOnce({ config: { spaceId: 'space-1' } });
|
|
180
|
+
const result = await mod.loadContentfulConfig('contentful', { cwd: '/cwd' });
|
|
181
|
+
expect(result.config).toEqual({ spaceId: 'space-1' });
|
|
182
|
+
expect(loadConfig).toHaveBeenCalledTimes(2);
|
|
183
|
+
const secondCall = loadConfig.mock.calls[1][0];
|
|
184
|
+
expect(secondCall.name).toBe('contentful');
|
|
185
|
+
expect(secondCall.envMap.CONTENTFUL_SPACE_ID).toBe('spaceId');
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test('required adds organizationId when spaceId is required and missing', async () => {
|
|
189
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
190
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
191
|
+
await mod.loadContentfulConfig('contentful', { required: ['spaceId', 'environmentId'] });
|
|
192
|
+
const secondCall = loadConfig.mock.calls[1][0];
|
|
193
|
+
const requiredFn = secondCall.required;
|
|
194
|
+
const required = await requiredFn({});
|
|
195
|
+
expect(required).toEqual(['organizationId', 'spaceId', 'environmentId']);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test('required keeps original list when spaceId already in data', async () => {
|
|
199
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
200
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
201
|
+
await mod.loadContentfulConfig('contentful', { required: ['spaceId'] });
|
|
202
|
+
const secondCall = loadConfig.mock.calls[1][0];
|
|
203
|
+
const required = await secondCall.required({ spaceId: 'space-1' });
|
|
204
|
+
expect(required).toEqual(['spaceId']);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('mergePrompts keeps default prompts when prompts === undefined', async () => {
|
|
208
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
209
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
210
|
+
await mod.loadContentfulConfig('contentful');
|
|
211
|
+
const secondCall = loadConfig.mock.calls[1][0];
|
|
212
|
+
const prompts = secondCall.prompts({});
|
|
213
|
+
expect(Array.isArray(prompts)).toBe(true);
|
|
214
|
+
expect(prompts.length).toBeGreaterThan(0);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test('mergePrompts: prompts === false returns false', async () => {
|
|
218
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
219
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
220
|
+
await mod.loadContentfulConfig('contentful', { prompts: false });
|
|
221
|
+
const secondCall = loadConfig.mock.calls[1][0];
|
|
222
|
+
expect(secondCall.prompts).toBe(false);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test('mergePrompts merges custom array with defaults, override by name', async () => {
|
|
226
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
227
|
+
loadConfig.mockResolvedValueOnce({ config: {} });
|
|
228
|
+
await mod.loadContentfulConfig('contentful', {
|
|
229
|
+
prompts: [{ name: 'managementToken', message: 'custom' }] as never,
|
|
230
|
+
});
|
|
231
|
+
const secondCall = loadConfig.mock.calls[1][0];
|
|
232
|
+
const merged = secondCall.prompts({});
|
|
233
|
+
const custom = merged.find((p: { name: string }) => p.name === 'managementToken');
|
|
234
|
+
expect(custom.message).toBe('custom');
|
|
235
|
+
});
|
|
236
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -51,7 +51,7 @@ export const getPrompts = (data: Partial<ContentfulOptions> = {}) => {
|
|
|
51
51
|
if (managementToken) {
|
|
52
52
|
const organizations = await getOrganizations({ managementToken, host });
|
|
53
53
|
return organizations.map((organization) => ({
|
|
54
|
-
message:
|
|
54
|
+
message: organization.name,
|
|
55
55
|
name: organization.sys.id,
|
|
56
56
|
value: organization.sys.id,
|
|
57
57
|
}));
|