@unchainedshop/cockpit-api 1.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/.nvmrc +1 -0
- package/README.md +148 -0
- package/dist/api.d.ts +39 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +316 -0
- package/dist/api.js.map +1 -0
- package/dist/cockpit-logger.d.ts +26 -0
- package/dist/cockpit-logger.d.ts.map +1 -0
- package/dist/cockpit-logger.js +58 -0
- package/dist/cockpit-logger.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/package.json +27 -0
- package/src/api.ts +315 -0
- package/src/cockpit-logger.ts +24 -0
- package/src/index.ts +25 -0
- package/tsconfig.json +20 -0
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
20
|
package/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
Sure! Here's a well-structured `README.md` for your `cockpit-api` package:
|
|
2
|
+
|
|
3
|
+
```markdown
|
|
4
|
+
# Cockpit API
|
|
5
|
+
|
|
6
|
+
A package to interact with the Cockpit CMS API, including functionalities to handle GraphQL requests and various CMS content manipulations.
|
|
7
|
+
|
|
8
|
+
## Table of Contents
|
|
9
|
+
|
|
10
|
+
- [Installation](#installation)
|
|
11
|
+
- [Usage](#usage)
|
|
12
|
+
- [Initialization](#initialization)
|
|
13
|
+
- [GraphQL Requests](#graphql-requests)
|
|
14
|
+
- [Content Operations](#content-operations)
|
|
15
|
+
- [API Reference](#api-reference)
|
|
16
|
+
- [generateCmsRouteReplacements](#generatecmsroutereplacements)
|
|
17
|
+
- [FixImagePaths](#fiximagepaths)
|
|
18
|
+
- [CockpitAPI](#cockpitapi)
|
|
19
|
+
- [makeCockpitSchema](#makecockpitschema)
|
|
20
|
+
- [Contributing](#contributing)
|
|
21
|
+
- [License](#license)
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
Install the package via npm:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npm install cockpit-api
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
### Initialization
|
|
34
|
+
|
|
35
|
+
First, import and initialize the API:
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
import CockpitAPI from 'cockpit-api';
|
|
39
|
+
|
|
40
|
+
const cockpit = await CockpitAPI();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### GraphQL Requests
|
|
44
|
+
|
|
45
|
+
You can make GraphQL requests using the `graphQL` method:
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
import { gql } from 'graphql-tag';
|
|
49
|
+
|
|
50
|
+
const query = gql`
|
|
51
|
+
query {
|
|
52
|
+
allPosts {
|
|
53
|
+
title
|
|
54
|
+
content
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
const result = await cockpit.graphQL(query, {});
|
|
60
|
+
console.log(result);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Content Operations
|
|
64
|
+
|
|
65
|
+
You can perform various content operations such as fetching items, aggregating models, and manipulating pages.
|
|
66
|
+
|
|
67
|
+
Example to get a content item:
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
const contentItem = await cockpit.getContentItem({ model: 'posts', id: '123' });
|
|
71
|
+
console.log(contentItem);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## API Reference
|
|
75
|
+
|
|
76
|
+
### generateCmsRouteReplacements
|
|
77
|
+
|
|
78
|
+
Generates route replacements for CMS.
|
|
79
|
+
|
|
80
|
+
```javascript
|
|
81
|
+
import { generateCmsRouteReplacements } from 'cockpit-api';
|
|
82
|
+
|
|
83
|
+
const replacements = await generateCmsRouteReplacements();
|
|
84
|
+
console.log(replacements);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### FixImagePaths
|
|
88
|
+
|
|
89
|
+
Transforms and fixes image paths in CMS responses.
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
import { FixImagePaths } from 'cockpit-api';
|
|
93
|
+
|
|
94
|
+
const replacements = await generateCmsRouteReplacements();
|
|
95
|
+
const { transformResult } = FixImagePaths(replacements);
|
|
96
|
+
|
|
97
|
+
const fixedResponse = transformResult(originalResponse);
|
|
98
|
+
console.log(fixedResponse);
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### CockpitAPI
|
|
102
|
+
|
|
103
|
+
Provides various methods to interact with the Cockpit CMS.
|
|
104
|
+
|
|
105
|
+
**Methods:**
|
|
106
|
+
- `graphQL(document, variables)`
|
|
107
|
+
- `getContentItem({ model, id }, locale, queryParams)`
|
|
108
|
+
- `getAggregateModel({ model, pipeline }, locale)`
|
|
109
|
+
- `getContentItems(model, locale, queryParams)`
|
|
110
|
+
- `getContentTree(model, locale, queryParams)`
|
|
111
|
+
- `postContentItem(model, item)`
|
|
112
|
+
- `deleteContentItem(model, id)`
|
|
113
|
+
- `pages(locale, queryParams)`
|
|
114
|
+
- `pageById({ page, id }, locale, queryParams)`
|
|
115
|
+
- `pageByRoute(route, locale)`
|
|
116
|
+
- `pagesMenus(locale)`
|
|
117
|
+
- `pagesMenu(name, locale)`
|
|
118
|
+
- `pagesRoutes(locale)`
|
|
119
|
+
- `pagesSitemap()`
|
|
120
|
+
- `pagesSetting(locale)`
|
|
121
|
+
|
|
122
|
+
### makeCockpitSchema
|
|
123
|
+
|
|
124
|
+
Creates a GraphQL schema from the Cockpit CMS API.
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
import { makeCockpitSchema } from 'cockpit-api';
|
|
128
|
+
|
|
129
|
+
const schema = await makeCockpitSchema();
|
|
130
|
+
console.log(schema);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Contributing
|
|
134
|
+
|
|
135
|
+
Contributions are welcome! Please open an issue or submit a pull request.
|
|
136
|
+
|
|
137
|
+
1. Fork the repository.
|
|
138
|
+
2. Create a new branch: `git checkout -b feature-branch-name`.
|
|
139
|
+
3. Make your changes and commit them: `git commit -m 'Add new feature'`.
|
|
140
|
+
4. Push to the branch: `git push origin feature-branch-name`.
|
|
141
|
+
5. Open a pull request.
|
|
142
|
+
|
|
143
|
+
## License
|
|
144
|
+
|
|
145
|
+
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
This `README.md` covers installation, basic usage, detailed API reference, contribution guidelines, and licensing information. Adjust the details as needed for your specific implementation.
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const getTenantIds: () => string[];
|
|
2
|
+
export declare const generateCmsRouteReplacements: (tenant?: string) => Promise<any>;
|
|
3
|
+
export declare const generateCollectionAndSingletonSlugRouteMap: (tenant?: string) => Promise<any>;
|
|
4
|
+
export declare const FixImagePaths: (replacements: any, tenant?: string) => {
|
|
5
|
+
transformResult(originalResponse: any): any;
|
|
6
|
+
};
|
|
7
|
+
declare const CockpitAPI: (tenant?: string) => Promise<{
|
|
8
|
+
graphQL(document: any, variables: any): Promise<any>;
|
|
9
|
+
getContentItem({ model, id }: {
|
|
10
|
+
model: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
}, locale?: string, queryParams?: {}, { useAdminAccess }?: {
|
|
13
|
+
useAdminAccess?: boolean;
|
|
14
|
+
}): Promise<any>;
|
|
15
|
+
getAggregateModel({ model, pipeline }: {
|
|
16
|
+
model: string;
|
|
17
|
+
pipeline: any[];
|
|
18
|
+
}, locale?: string): Promise<any>;
|
|
19
|
+
getContentItems(model: string, locale?: string, queryParams?: any): Promise<any>;
|
|
20
|
+
getContentTree(model: string, locale?: string, queryParams?: {
|
|
21
|
+
filter: {};
|
|
22
|
+
}): Promise<any>;
|
|
23
|
+
postContentItem(model: string, item: any): Promise<any>;
|
|
24
|
+
deleteContentItem(model: string, id?: string): Promise<any>;
|
|
25
|
+
pages(locale?: string, queryParams?: {}): Promise<any>;
|
|
26
|
+
pageById({ page, id }: {
|
|
27
|
+
page: string;
|
|
28
|
+
id: string;
|
|
29
|
+
}, locale?: string, queryParams?: {}): Promise<any>;
|
|
30
|
+
pageByRoute(route: string, locale?: string): Promise<any>;
|
|
31
|
+
pagesMenus(locale?: string): Promise<any>;
|
|
32
|
+
pagesMenu(name: string, locale?: string): Promise<any>;
|
|
33
|
+
pagesRoutes(locale?: string): Promise<any>;
|
|
34
|
+
pagesSitemap(): Promise<any>;
|
|
35
|
+
pagesSetting(locale?: string): Promise<any>;
|
|
36
|
+
getFullRouteForSlug(slug: string): Promise<any>;
|
|
37
|
+
}>;
|
|
38
|
+
export default CockpitAPI;
|
|
39
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,YAAY,gBAcxB,CAAC;AAEF,eAAO,MAAM,4BAA4B,YAAmB,MAAM,iBAoBjE,CAAC;AAEF,eAAO,MAAM,0CAA0C,YAAmB,MAAM,iBAuB/E,CAAC;AAEF,eAAO,MAAM,aAAa,iBAAkB,GAAG,WAAW,MAAM;sCAI1B,GAAG;CAoBxC,CAAC;AAkBF,QAAA,MAAM,UAAU,YAAmB,MAAM;sBAoDb,GAAG,aAAa,GAAG;kCAe1B;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,0DAGjB;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE;2CAWb;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,EAAE,CAAA;KAAE;2BAYlD,MAAM,iCAAmC,GAAG;0BAUhE,MAAM;;;2BAYc,MAAM,QAAQ,GAAG;6BAWf,MAAM,OAAO,MAAM;;2BAoBrB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;uBAUhC,MAAM;;oBAaT,MAAM;;;;8BAkBI,MAAM;EAMzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.FixImagePaths = exports.generateCollectionAndSingletonSlugRouteMap = exports.generateCmsRouteReplacements = exports.getTenantIds = void 0;
|
|
24
|
+
const graphql_1 = require("graphql");
|
|
25
|
+
const cockpit_logger_js_1 = require("./cockpit-logger.js");
|
|
26
|
+
const lru_cache_1 = require("lru-cache");
|
|
27
|
+
const dataCache = new lru_cache_1.LRUCache({
|
|
28
|
+
max: 100,
|
|
29
|
+
ttl: 10000 * 10,
|
|
30
|
+
allowStale: false,
|
|
31
|
+
});
|
|
32
|
+
const { COCKPIT_GRAPHQL_ENDPOINT = '' } = process.env;
|
|
33
|
+
const cockpitURL = new URL(COCKPIT_GRAPHQL_ENDPOINT);
|
|
34
|
+
const getTenantIds = () => {
|
|
35
|
+
const env = Object.assign({}, process.env);
|
|
36
|
+
const cockpitSecretKeys = Object.keys(env).filter((key) => key.includes("COCKPIT_SECRET") &&
|
|
37
|
+
key !== "COCKPIT_SECRET" &&
|
|
38
|
+
!key.endsWith("_FILE"));
|
|
39
|
+
const tenantIds = cockpitSecretKeys.map((key) => {
|
|
40
|
+
return key.slice("COCKPIT_SECRET_".length).toLowerCase();
|
|
41
|
+
});
|
|
42
|
+
return tenantIds;
|
|
43
|
+
};
|
|
44
|
+
exports.getTenantIds = getTenantIds;
|
|
45
|
+
const generateCmsRouteReplacements = (tenant) => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
+
const cachedReplacement = dataCache.get(`ROUTE_REPLACEMENT_MAP${tenant}`);
|
|
47
|
+
if (cachedReplacement)
|
|
48
|
+
return cachedReplacement;
|
|
49
|
+
const filterParams = {
|
|
50
|
+
fields: JSON.stringify({ _id: 1, slug: 1, _r: 1 }),
|
|
51
|
+
};
|
|
52
|
+
const cmsPages = yield fetch(`${cockpitURL.origin}${tenant ? `/:${tenant}/api` : "/api"}/pages/pages?${new URLSearchParams(filterParams).toString()}`);
|
|
53
|
+
const pagesArr = (yield cmsPages.json()) || [];
|
|
54
|
+
const replacement = pagesArr.reduce((result, item) => {
|
|
55
|
+
const key = `pages://${item._id}`;
|
|
56
|
+
const value = item._r;
|
|
57
|
+
return Object.assign(Object.assign({}, result), { [key]: value });
|
|
58
|
+
}, {});
|
|
59
|
+
dataCache.set(`ROUTE_REPLACEMENT_MAP${tenant}`, replacement);
|
|
60
|
+
return replacement;
|
|
61
|
+
});
|
|
62
|
+
exports.generateCmsRouteReplacements = generateCmsRouteReplacements;
|
|
63
|
+
const generateCollectionAndSingletonSlugRouteMap = (tenant) => __awaiter(void 0, void 0, void 0, function* () {
|
|
64
|
+
const cachedMap = dataCache.get(`SLUG_ROUTE_MAP_${tenant}`);
|
|
65
|
+
if (cachedMap)
|
|
66
|
+
return cachedMap;
|
|
67
|
+
const cmsPages = yield fetch(`${cockpitURL.origin}${tenant ? `/:${tenant}/api` : "/api"}/pages/pages?locale=default&${new URLSearchParams({
|
|
68
|
+
fields: JSON.stringify({
|
|
69
|
+
data: { collection: 1, singleton: 1 },
|
|
70
|
+
_r: 1,
|
|
71
|
+
type: 1,
|
|
72
|
+
}),
|
|
73
|
+
filter: JSON.stringify({ "data.collection": { $ne: null } }),
|
|
74
|
+
}).toString()}`);
|
|
75
|
+
const pagesArr = (yield cmsPages.json()) || [];
|
|
76
|
+
const pageMap = pagesArr.reduce((result, { data, _r }) => {
|
|
77
|
+
const entityName = (data === null || data === void 0 ? void 0 : data.collection) || (data === null || data === void 0 ? void 0 : data.singleton);
|
|
78
|
+
if (!entityName)
|
|
79
|
+
return result;
|
|
80
|
+
return Object.assign(Object.assign({}, result), { [entityName]: _r });
|
|
81
|
+
}, {});
|
|
82
|
+
dataCache.set(`SLUG_ROUTE_MAP_${tenant}`, pageMap);
|
|
83
|
+
return pageMap;
|
|
84
|
+
});
|
|
85
|
+
exports.generateCollectionAndSingletonSlugRouteMap = generateCollectionAndSingletonSlugRouteMap;
|
|
86
|
+
const FixImagePaths = (replacements, tenant) => {
|
|
87
|
+
const pattern = new RegExp(Object.keys(replacements).join("|"), "g");
|
|
88
|
+
const url = `${cockpitURL.origin}${tenant ? `/:${tenant}` : ""}`;
|
|
89
|
+
return {
|
|
90
|
+
transformResult(originalResponse) {
|
|
91
|
+
try {
|
|
92
|
+
const rawResponseDataString = JSON.stringify(originalResponse);
|
|
93
|
+
const fixedDataString = rawResponseDataString
|
|
94
|
+
// fixes asset paths
|
|
95
|
+
.replace(/"path":"\//g, `"path":"${url}/storage/uploads/`)
|
|
96
|
+
.replace(/src=\\"\/storage/gi, `src=\\"${url}/storage`)
|
|
97
|
+
.replace(pattern, (match) => replacements[match])
|
|
98
|
+
// fixes image paths which already had a path including storage/uploads
|
|
99
|
+
.replace(/"path":"\/storage\/uploads\/storage\/uploads\//g, `"path":"/storage/uploads/`);
|
|
100
|
+
return JSON.parse(fixedDataString);
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
return originalResponse;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
exports.FixImagePaths = FixImagePaths;
|
|
109
|
+
const encodeQueryParam = (key, value) => {
|
|
110
|
+
return `${encodeURIComponent(key)}=${encodeURIComponent(typeof value !== "string" ? JSON.stringify(value) : value)}`;
|
|
111
|
+
};
|
|
112
|
+
const buildQueryString = (params) => {
|
|
113
|
+
if (!Object.keys(params).length)
|
|
114
|
+
return null;
|
|
115
|
+
return Object.entries(params)
|
|
116
|
+
.map(([key, value]) => encodeQueryParam(key, value))
|
|
117
|
+
.join("&");
|
|
118
|
+
};
|
|
119
|
+
const handleErrorAndLog = (e) => {
|
|
120
|
+
console.error(e);
|
|
121
|
+
return null;
|
|
122
|
+
};
|
|
123
|
+
const CockpitAPI = (tenant) => __awaiter(void 0, void 0, void 0, function* () {
|
|
124
|
+
const secretName = ["COCKPIT_SECRET", tenant].filter(Boolean).join("_");
|
|
125
|
+
const token = process.env[secretName];
|
|
126
|
+
const buildUrl = (path, { locale = "de", queryParams = {} }) => {
|
|
127
|
+
const normalizedLocale = locale === "de" ? "default" : locale;
|
|
128
|
+
const url = new URL(cockpitURL);
|
|
129
|
+
url.pathname = `${tenant ? `/:${tenant}/api` : "/api"}${path}`;
|
|
130
|
+
const queryString = buildQueryString(Object.assign(Object.assign({}, queryParams), { locale: normalizedLocale }));
|
|
131
|
+
url.search = queryString;
|
|
132
|
+
return url;
|
|
133
|
+
};
|
|
134
|
+
const routeReplaceMents = yield (0, exports.generateCmsRouteReplacements)(tenant);
|
|
135
|
+
const { transformResult } = (0, exports.FixImagePaths)(routeReplaceMents, tenant);
|
|
136
|
+
const handleResponse = (result) => __awaiter(void 0, void 0, void 0, function* () {
|
|
137
|
+
if (result.status === 404)
|
|
138
|
+
return null;
|
|
139
|
+
if (result.status !== 200) {
|
|
140
|
+
cockpit_logger_js_1.logger.error(`Error accessing ${result.url}`, result);
|
|
141
|
+
throw new Error(`Cockpit: Error accessing ${result.url} ${yield result.text()}`);
|
|
142
|
+
}
|
|
143
|
+
return transformResult(yield result.json());
|
|
144
|
+
});
|
|
145
|
+
const fetchData = (url_1, ...args_1) => __awaiter(void 0, [url_1, ...args_1], void 0, function* (url, _a = {}) {
|
|
146
|
+
var _b;
|
|
147
|
+
var { useAdminAccess } = _a, options = __rest(_a, ["useAdminAccess"]);
|
|
148
|
+
const headers = (_b = options === null || options === void 0 ? void 0 : options.headers) !== null && _b !== void 0 ? _b : {};
|
|
149
|
+
if (useAdminAccess) {
|
|
150
|
+
headers["API-Key"] = token;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
cockpit_logger_js_1.logger.verbose(`requesting ${url}`);
|
|
154
|
+
const result = yield fetch(url, Object.assign(Object.assign({}, options), { headers: Object.assign({}, headers) }));
|
|
155
|
+
return handleResponse(result);
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
return handleErrorAndLog(e);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return {
|
|
162
|
+
graphQL(document, variables) {
|
|
163
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
164
|
+
const query = (0, graphql_1.print)(document);
|
|
165
|
+
const cockpitEndpointUrl = new URL(COCKPIT_GRAPHQL_ENDPOINT);
|
|
166
|
+
if (tenant) {
|
|
167
|
+
cockpitEndpointUrl.pathname = `/:${tenant}${cockpitEndpointUrl.pathname}`;
|
|
168
|
+
}
|
|
169
|
+
const fetchResult = yield fetchData(cockpitEndpointUrl, {
|
|
170
|
+
method: "POST",
|
|
171
|
+
headers: { "Content-Type": "application/json" },
|
|
172
|
+
body: JSON.stringify({ query, variables }),
|
|
173
|
+
});
|
|
174
|
+
return fetchResult;
|
|
175
|
+
});
|
|
176
|
+
},
|
|
177
|
+
getContentItem(_a) {
|
|
178
|
+
return __awaiter(this, arguments, void 0, function* ({ model, id }, locale = "default", queryParams = {}, { useAdminAccess = false } = {}) {
|
|
179
|
+
if (!model)
|
|
180
|
+
throw new Error("Cockpit: Please provide a model");
|
|
181
|
+
const url = buildUrl(`/content/item/${model}${id ? `/${id}` : ""}`, {
|
|
182
|
+
locale,
|
|
183
|
+
queryParams,
|
|
184
|
+
});
|
|
185
|
+
return fetchData(url, { useAdminAccess });
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
getAggregateModel(_a) {
|
|
189
|
+
return __awaiter(this, arguments, void 0, function* ({ model, pipeline }, locale = "default") {
|
|
190
|
+
if (!model)
|
|
191
|
+
throw new Error("Cockpit: Please provide a model");
|
|
192
|
+
const url = buildUrl(`/content/aggregate/${model}`, {
|
|
193
|
+
locale,
|
|
194
|
+
queryParams: {
|
|
195
|
+
pipeline,
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
return fetchData(url);
|
|
199
|
+
});
|
|
200
|
+
},
|
|
201
|
+
getContentItems(model_1) {
|
|
202
|
+
return __awaiter(this, arguments, void 0, function* (model, locale = "default", queryParams = {}) {
|
|
203
|
+
if (!model)
|
|
204
|
+
throw new Error("Cockpit: Please provide a model");
|
|
205
|
+
const url = buildUrl(`/content/items/${model}`, {
|
|
206
|
+
locale,
|
|
207
|
+
queryParams,
|
|
208
|
+
});
|
|
209
|
+
return fetchData(url);
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
getContentTree(model_1) {
|
|
213
|
+
return __awaiter(this, arguments, void 0, function* (model, locale = "default", queryParams = { filter: {} }) {
|
|
214
|
+
if (!model)
|
|
215
|
+
throw new Error("Cockpit: Please provide a model");
|
|
216
|
+
const url = buildUrl(`/content/tree/${model}`, {
|
|
217
|
+
locale,
|
|
218
|
+
queryParams,
|
|
219
|
+
});
|
|
220
|
+
return fetchData(url);
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
postContentItem(model, item) {
|
|
224
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
225
|
+
if (!model)
|
|
226
|
+
throw new Error("Cockpit: Please provide a model");
|
|
227
|
+
const url = buildUrl(`/content/item/${model}`, {});
|
|
228
|
+
const result = yield fetchData(url, {
|
|
229
|
+
method: "POST",
|
|
230
|
+
headers: { "Content-Type": "application/json" },
|
|
231
|
+
body: JSON.stringify({ data: item }),
|
|
232
|
+
});
|
|
233
|
+
return result;
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
deleteContentItem(model, id) {
|
|
237
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
238
|
+
if (!model || !id)
|
|
239
|
+
throw new Error("Cockpit: Please provide a model and id");
|
|
240
|
+
const url = buildUrl(`/content/item/${model}/${id}`, {});
|
|
241
|
+
const result = yield fetchData(url, {
|
|
242
|
+
method: "DELETE",
|
|
243
|
+
headers: { "Content-Type": "application/json" },
|
|
244
|
+
});
|
|
245
|
+
return result;
|
|
246
|
+
});
|
|
247
|
+
},
|
|
248
|
+
pages() {
|
|
249
|
+
return __awaiter(this, arguments, void 0, function* (locale = "default", queryParams = {}) {
|
|
250
|
+
const url = buildUrl("/pages/pages", {
|
|
251
|
+
locale,
|
|
252
|
+
queryParams,
|
|
253
|
+
});
|
|
254
|
+
return fetchData(url);
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
pageById(_a) {
|
|
258
|
+
return __awaiter(this, arguments, void 0, function* ({ page, id }, locale = "default", queryParams = {}) {
|
|
259
|
+
if (!page || !id)
|
|
260
|
+
throw new Error("GetCockpit: Please provide a page and id");
|
|
261
|
+
const url = buildUrl(`/pages/page/${page}/${id}`, {
|
|
262
|
+
locale,
|
|
263
|
+
queryParams,
|
|
264
|
+
});
|
|
265
|
+
return fetchData(url);
|
|
266
|
+
});
|
|
267
|
+
},
|
|
268
|
+
pageByRoute(route_1) {
|
|
269
|
+
return __awaiter(this, arguments, void 0, function* (route, locale = "default") {
|
|
270
|
+
const url = buildUrl("/pages/page", {
|
|
271
|
+
locale,
|
|
272
|
+
queryParams: { route },
|
|
273
|
+
});
|
|
274
|
+
return fetchData(url);
|
|
275
|
+
});
|
|
276
|
+
},
|
|
277
|
+
pagesMenus() {
|
|
278
|
+
return __awaiter(this, arguments, void 0, function* (locale = "default") {
|
|
279
|
+
const url = buildUrl("/pages/menus", { locale });
|
|
280
|
+
return fetchData(url);
|
|
281
|
+
});
|
|
282
|
+
},
|
|
283
|
+
pagesMenu(name_1) {
|
|
284
|
+
return __awaiter(this, arguments, void 0, function* (name, locale = "default") {
|
|
285
|
+
const url = buildUrl(`/pages/menu/${name}`, { locale });
|
|
286
|
+
return fetchData(url);
|
|
287
|
+
});
|
|
288
|
+
},
|
|
289
|
+
pagesRoutes() {
|
|
290
|
+
return __awaiter(this, arguments, void 0, function* (locale = "default") {
|
|
291
|
+
const url = buildUrl("/pages/routes", { locale });
|
|
292
|
+
return fetchData(url);
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
pagesSitemap() {
|
|
296
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
297
|
+
const url = buildUrl("/pages/sitemap", {});
|
|
298
|
+
return fetchData(url);
|
|
299
|
+
});
|
|
300
|
+
},
|
|
301
|
+
pagesSetting() {
|
|
302
|
+
return __awaiter(this, arguments, void 0, function* (locale = "default") {
|
|
303
|
+
const url = buildUrl("/pages/settings", { locale });
|
|
304
|
+
return fetchData(url);
|
|
305
|
+
});
|
|
306
|
+
},
|
|
307
|
+
getFullRouteForSlug(slug) {
|
|
308
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
309
|
+
const routeSlugMap = yield (0, exports.generateCollectionAndSingletonSlugRouteMap)(tenant);
|
|
310
|
+
return routeSlugMap === null || routeSlugMap === void 0 ? void 0 : routeSlugMap[slug];
|
|
311
|
+
});
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
});
|
|
315
|
+
exports.default = CockpitAPI;
|
|
316
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAgC;AAChC,2DAA6C;AAC7C,yCAAoC;AAEpC,MAAM,SAAS,GAAG,IAAI,oBAAQ,CAAC;IAC7B,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,KAAK,GAAG,EAAE;IACf,UAAU,EAAE,KAAK;CAClB,CAAC,CAAC;AAEH,MAAM,EAAE,wBAAwB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAEtD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE9C,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,GAAG,qBAAQ,OAAO,CAAC,GAAG,CAAE,CAAC;IAC/B,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAC/C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC9B,GAAG,KAAK,gBAAgB;QACxB,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9C,OAAO,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAdW,QAAA,YAAY,gBAcvB;AAEK,MAAM,4BAA4B,GAAG,CAAO,MAAe,EAAE,EAAE;IACpE,MAAM,iBAAiB,GAAG,SAAS,CAAC,GAAG,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IAC1E,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAChD,MAAM,YAAY,GAAG;QACnB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;KACnD,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,MAAM,gBAAgB,IAAI,eAAe,CAC3F,YAAY,CACb,CAAC,QAAQ,EAAE,EAAE,CACf,CAAC;IACF,MAAM,QAAQ,GAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAEtD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACnD,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;QACtB,uCAAY,MAAM,KAAE,CAAC,GAAG,CAAC,EAAE,KAAK,IAAG;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,SAAS,CAAC,GAAG,CAAC,wBAAwB,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC;AACrB,CAAC,CAAA,CAAC;AApBW,QAAA,4BAA4B,gCAoBvC;AAEK,MAAM,0CAA0C,GAAG,CAAO,MAAe,EAAE,EAAE;IAClF,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;IAC5D,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,MAAM,+BAA+B,IAAI,eAAe,CAC1G;QACE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;YACrC,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,CAAC;SACR,CAAC;QACF,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;KAC7D,CACF,CAAC,QAAQ,EAAE,EAAE,CACf,CAAC;IACF,MAAM,QAAQ,GAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;QACvD,MAAM,UAAU,GAAG,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,MAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,CAAA,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO,MAAM,CAAC;QAC/B,uCAAY,MAAM,KAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAG;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,SAAS,CAAC,GAAG,CAAC,kBAAkB,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAA,CAAC;AAvBW,QAAA,0CAA0C,8CAuBrD;AAEK,MAAM,aAAa,GAAG,CAAC,YAAiB,EAAE,MAAe,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACjE,OAAO;QACL,eAAe,CAAC,gBAAqB;YACnC,IAAI,CAAC;gBACH,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;gBAC/D,MAAM,eAAe,GAAG,qBAAqB;oBAC3C,oBAAoB;qBACnB,OAAO,CAAC,aAAa,EAAE,WAAW,GAAG,mBAAmB,CAAC;qBACzD,OAAO,CAAC,oBAAoB,EAAE,UAAU,GAAG,UAAU,CAAC;qBACtD,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBACjD,uEAAuE;qBACtE,OAAO,CACN,iDAAiD,EACjD,2BAA2B,CAC5B,CAAC;gBAEJ,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,gBAAgB,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,aAAa,iBAwBxB;AAEF,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,EAAE;IACnD,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AACvH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAW,EAAE,EAAE;IACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACnD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAQ,EAAE,EAAE;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAO,MAAe,EAAE,EAAE;IAC3C,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,EAAE,EAAE;QACrE,MAAM,gBAAgB,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAChC,GAAG,CAAC,QAAQ,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAC/D,MAAM,WAAW,GAAG,gBAAgB,iCAC/B,WAAW,KACd,MAAM,EAAE,gBAAgB,IACxB,CAAC;QACH,GAAG,CAAC,MAAM,GAAG,WAAqB,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,MAAM,IAAA,oCAA4B,EAAC,MAAM,CAAC,CAAC;IACrE,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,qBAAa,EAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAErE,MAAM,cAAc,GAAG,CAAO,MAAW,EAAE,EAAE;QAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,0BAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,CAAC,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,eAAe,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAA,CAAC;IAEF,MAAM,SAAS,GAAG,mBAA2D,EAAE,0DAAtD,GAAQ,EAAE,KAAsC,EAAE;;YAAxC,EAAE,cAAc,OAAwB,EAAnB,OAAO,cAA5B,kBAA8B,CAAF;QAC7D,MAAM,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,EAAE,CAAC;QAEvC,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC;YACH,0BAAM,CAAC,OAAO,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,kCACzB,OAAO,KACV,OAAO,oBACF,OAAO,KAEZ,CAAC;YACH,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAA,CAAC;IAEF,OAAO;QACC,OAAO,CAAC,QAAa,EAAE,SAAc;;gBACzC,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,QAAQ,CAAC,CAAC;gBAC9B,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,wBAAkC,CAAC,CAAC;gBACvE,IAAI,MAAM,EAAE,CAAC;oBACX,kBAAkB,CAAC,QAAQ,GAAG,KAAK,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,CAAC;gBAC5E,CAAC;gBACD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,kBAAkB,EAAE;oBACtD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;iBAC3C,CAAC,CAAC;gBACH,OAAO,WAAW,CAAC;YACrB,CAAC;SAAA;QAEK,cAAc;iEAClB,EAAE,KAAK,EAAE,EAAE,EAAkC,EAC7C,MAAM,GAAG,SAAS,EAClB,WAAW,GAAG,EAAE,EAChB,EAAE,cAAc,GAAG,KAAK,KAAmC,EAAE;gBAE7D,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAE/D,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;oBAClE,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YAC5C,CAAC;SAAA;QAEK,iBAAiB;iEAAC,EAAE,KAAK,EAAE,QAAQ,EAAsC,EAAE,MAAM,GAAG,SAAS;gBACjG,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAE/D,MAAM,GAAG,GAAG,QAAQ,CAAC,sBAAsB,KAAK,EAAE,EAAE;oBAClD,MAAM;oBACN,WAAW,EAAE;wBACX,QAAQ;qBACT;iBACF,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,eAAe;iEAAC,KAAa,EAAE,MAAM,GAAG,SAAS,EAAE,cAAmB,EAAE;gBAC5E,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,kBAAkB,KAAK,EAAE,EAAE;oBAC9C,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,cAAc;iEAClB,KAAa,EACb,MAAM,GAAG,SAAS,EAClB,WAAW,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;gBAE5B,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,KAAK,EAAE,EAAE;oBAC7C,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,eAAe,CAAC,KAAa,EAAE,IAAS;;gBAC5C,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;oBAClC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;iBACrC,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC;SAAA;QACK,iBAAiB,CAAC,KAAa,EAAE,EAAW;;gBAChD,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;oBACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;oBAClC,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC;SAAA;QAEK,KAAK;iEAAC,MAAM,GAAG,SAAS,EAAE,WAAW,GAAG,EAAE;gBAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE;oBACnC,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,QAAQ;iEAAC,EAAE,IAAI,EAAE,EAAE,EAAgC,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,GAAG,EAAE;gBAC7F,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;oBACd,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,IAAI,IAAI,EAAE,EAAE,EAAE;oBAChD,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,WAAW;iEAAC,KAAa,EAAE,MAAM,GAAG,SAAS;gBACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,EAAE;oBAClC,MAAM;oBACN,WAAW,EAAE,EAAE,KAAK,EAAE;iBACvB,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,UAAU;iEAAC,MAAM,GAAG,SAAS;gBACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,SAAS;iEAAC,IAAY,EAAE,MAAM,GAAG,SAAS;gBAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,WAAW;iEAAC,MAAM,GAAG,SAAS;gBAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QAEK,YAAY;;gBAChB,MAAM,GAAG,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBAC3C,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QACK,YAAY;iEAAC,MAAM,GAAG,SAAS;gBACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;SAAA;QACK,mBAAmB,CAAC,IAAY;;gBACpC,MAAM,YAAY,GAChB,MAAM,IAAA,kDAA0C,EAAC,MAAM,CAAC,CAAC;gBAC3D,OAAO,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,IAAI,CAAC,CAAC;YAC9B,CAAC;SAAA;KACF,CAAC;AACJ,CAAC,CAAA,CAAC;AAEF,kBAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
declare let logger: {
|
|
2
|
+
log: {
|
|
3
|
+
(...data: any[]): void;
|
|
4
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
5
|
+
};
|
|
6
|
+
info: {
|
|
7
|
+
(...data: any[]): void;
|
|
8
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
9
|
+
};
|
|
10
|
+
error: {
|
|
11
|
+
(...data: any[]): void;
|
|
12
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
13
|
+
};
|
|
14
|
+
warn: {
|
|
15
|
+
(...data: any[]): void;
|
|
16
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
17
|
+
};
|
|
18
|
+
verbose: {
|
|
19
|
+
(...data: any[]): void;
|
|
20
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
declare const log: (...args: any) => void;
|
|
24
|
+
export { logger };
|
|
25
|
+
export default log;
|
|
26
|
+
//# sourceMappingURL=cockpit-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit-logger.d.ts","sourceRoot":"","sources":["../src/cockpit-logger.ts"],"names":[],"mappings":"AAAA,QAAA,IAAI,MAAM;;;;;;;;;;;;;;;;;;;;;CAMT,CAAC;AAaF,QAAA,MAAM,GAAG,YAAa,GAAG,SAAyB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,CAAC;AAElB,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.logger = void 0;
|
|
36
|
+
let logger = {
|
|
37
|
+
log: console.log,
|
|
38
|
+
info: console.log,
|
|
39
|
+
error: console.error,
|
|
40
|
+
warn: console.warn,
|
|
41
|
+
verbose: console.debug,
|
|
42
|
+
};
|
|
43
|
+
exports.logger = logger;
|
|
44
|
+
function loadLogger() {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
try {
|
|
47
|
+
const { createLogger } = yield Promise.resolve().then(() => __importStar(require("@unchainedshop/logger")));
|
|
48
|
+
exports.logger = logger = createLogger("cockpit") || logger;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
// console.warn(e);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
loadLogger();
|
|
56
|
+
const log = (...args) => logger.info(...args);
|
|
57
|
+
exports.default = log;
|
|
58
|
+
//# sourceMappingURL=cockpit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cockpit-logger.js","sourceRoot":"","sources":["../src/cockpit-logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAI,MAAM,GAAG;IACX,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC,GAAG;IACjB,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,OAAO,EAAE,OAAO,CAAC,KAAK;CACvB,CAAC;AAeO,wBAAM;AAbf,SAAe,UAAU;;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,wDAAa,uBAAuB,GAAC,CAAC;YAC/D,iBAAA,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mBAAmB;QACrB,CAAC;IACH,CAAC;CAAA;AAED,UAAU,EAAE,CAAC;AAEb,MAAM,GAAG,GAAG,CAAC,GAAG,IAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAInD,kBAAe,GAAG,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,iBAAiB,gDAW7B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.makeCockpitSchema = void 0;
|
|
16
|
+
const wrap_1 = require("@graphql-tools/wrap");
|
|
17
|
+
const api_1 = __importDefault(require("./api"));
|
|
18
|
+
function remoteExecutor(_a) {
|
|
19
|
+
return __awaiter(this, arguments, void 0, function* ({ document, variables, context }) {
|
|
20
|
+
var _b, _c;
|
|
21
|
+
const cockpitSpace = (_c = (_b = context === null || context === void 0 ? void 0 : context.req) === null || _b === void 0 ? void 0 : _b.headers) === null || _c === void 0 ? void 0 : _c["x-cockpit-space"];
|
|
22
|
+
const getCockpit = yield (0, api_1.default)(cockpitSpace);
|
|
23
|
+
return getCockpit.graphQL(document, variables);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const makeCockpitSchema = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
const getCockpitSchema = (0, wrap_1.wrapSchema)({
|
|
28
|
+
schema: yield (0, wrap_1.schemaFromExecutor)(remoteExecutor),
|
|
29
|
+
executor: remoteExecutor,
|
|
30
|
+
transforms: [
|
|
31
|
+
new wrap_1.FilterRootFields((operationName) => {
|
|
32
|
+
return operationName !== "Mutation";
|
|
33
|
+
}),
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
return getCockpitSchema;
|
|
37
|
+
});
|
|
38
|
+
exports.makeCockpitSchema = makeCockpitSchema;
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,8CAI6B;AAC7B,gDAA+B;AAE/B,SAAe,cAAc;yDAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAO;;QAC/D,MAAM,YAAY,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,0CAAE,OAAO,0CAAG,iBAAiB,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,MAAM,IAAA,aAAU,EAAC,YAAY,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;CAAA;AAEM,MAAM,iBAAiB,GAAG,GAAS,EAAE;IACxC,MAAM,gBAAgB,GAAG,IAAA,iBAAU,EAAC;QAChC,MAAM,EAAE,MAAM,IAAA,yBAAkB,EAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,cAAc;QACxB,UAAU,EAAE;YACR,IAAI,uBAAgB,CAAC,CAAC,aAAa,EAAE,EAAE;gBACnC,OAAO,aAAa,KAAK,UAAU,CAAC;YACxC,CAAC,CAAC;SACL;KACJ,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC;AAC5B,CAAC,CAAA,CAAC;AAXW,QAAA,iBAAiB,qBAW5B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@unchainedshop/cockpit-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Cokpit api endpoints",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"prepublishOnly": "npm run build"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"unchainedshop",
|
|
12
|
+
"cockpit",
|
|
13
|
+
"api"
|
|
14
|
+
],
|
|
15
|
+
"author": "unchainedshop",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@graphql-tools/wrap": "^10.0.5",
|
|
19
|
+
"@unchainedshop/logger": "^2.10.5",
|
|
20
|
+
"graphql": "^16.8.2",
|
|
21
|
+
"lru-cache": "^10.2.2"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^20.14.2",
|
|
25
|
+
"typescript": "^5.4.5"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/src/api.ts
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { print } from "graphql";
|
|
2
|
+
import { logger } from "./cockpit-logger.js";
|
|
3
|
+
import { LRUCache } from 'lru-cache'
|
|
4
|
+
|
|
5
|
+
const dataCache = new LRUCache({
|
|
6
|
+
max: 100,
|
|
7
|
+
ttl: 10000 * 10,
|
|
8
|
+
allowStale: false,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const { COCKPIT_GRAPHQL_ENDPOINT = '' } = process.env;
|
|
12
|
+
|
|
13
|
+
const cockpitURL = new URL(COCKPIT_GRAPHQL_ENDPOINT);
|
|
14
|
+
|
|
15
|
+
export const getTenantIds = () => {
|
|
16
|
+
const env = { ...process.env };
|
|
17
|
+
const cockpitSecretKeys = Object.keys(env).filter(
|
|
18
|
+
(key) =>
|
|
19
|
+
key.includes("COCKPIT_SECRET") &&
|
|
20
|
+
key !== "COCKPIT_SECRET" &&
|
|
21
|
+
!key.endsWith("_FILE"),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
const tenantIds = cockpitSecretKeys.map((key) => {
|
|
25
|
+
return key.slice("COCKPIT_SECRET_".length).toLowerCase();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return tenantIds;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const generateCmsRouteReplacements = async (tenant?: string) => {
|
|
32
|
+
const cachedReplacement = dataCache.get(`ROUTE_REPLACEMENT_MAP${tenant}`);
|
|
33
|
+
if (cachedReplacement) return cachedReplacement;
|
|
34
|
+
const filterParams = {
|
|
35
|
+
fields: JSON.stringify({ _id: 1, slug: 1, _r: 1 }),
|
|
36
|
+
};
|
|
37
|
+
const cmsPages = await fetch(
|
|
38
|
+
`${cockpitURL.origin}${tenant ? `/:${tenant}/api` : "/api"}/pages/pages?${new URLSearchParams(
|
|
39
|
+
filterParams,
|
|
40
|
+
).toString()}`,
|
|
41
|
+
);
|
|
42
|
+
const pagesArr: any[] = (await cmsPages.json()) || [];
|
|
43
|
+
|
|
44
|
+
const replacement = pagesArr.reduce((result, item) => {
|
|
45
|
+
const key = `pages://${item._id}`;
|
|
46
|
+
const value = item._r;
|
|
47
|
+
return { ...result, [key]: value };
|
|
48
|
+
}, {});
|
|
49
|
+
dataCache.set(`ROUTE_REPLACEMENT_MAP${tenant}`, replacement);
|
|
50
|
+
return replacement;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const generateCollectionAndSingletonSlugRouteMap = async (tenant?: string) => {
|
|
54
|
+
const cachedMap = dataCache.get(`SLUG_ROUTE_MAP_${tenant}`);
|
|
55
|
+
if (cachedMap) return cachedMap;
|
|
56
|
+
const cmsPages = await fetch(
|
|
57
|
+
`${cockpitURL.origin}${tenant ? `/:${tenant}/api` : "/api"}/pages/pages?locale=default&${new URLSearchParams(
|
|
58
|
+
{
|
|
59
|
+
fields: JSON.stringify({
|
|
60
|
+
data: { collection: 1, singleton: 1 },
|
|
61
|
+
_r: 1,
|
|
62
|
+
type: 1,
|
|
63
|
+
}),
|
|
64
|
+
filter: JSON.stringify({ "data.collection": { $ne: null } }),
|
|
65
|
+
},
|
|
66
|
+
).toString()}`,
|
|
67
|
+
);
|
|
68
|
+
const pagesArr: any[] = (await cmsPages.json()) || [];
|
|
69
|
+
const pageMap = pagesArr.reduce((result, { data, _r }) => {
|
|
70
|
+
const entityName = data?.collection || data?.singleton;
|
|
71
|
+
if (!entityName) return result;
|
|
72
|
+
return { ...result, [entityName]: _r };
|
|
73
|
+
}, {});
|
|
74
|
+
dataCache.set(`SLUG_ROUTE_MAP_${tenant}`, pageMap);
|
|
75
|
+
return pageMap;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const FixImagePaths = (replacements: any, tenant?: string) => {
|
|
79
|
+
const pattern = new RegExp(Object.keys(replacements).join("|"), "g");
|
|
80
|
+
const url = `${cockpitURL.origin}${tenant ? `/:${tenant}` : ""}`;
|
|
81
|
+
return {
|
|
82
|
+
transformResult(originalResponse: any) {
|
|
83
|
+
try {
|
|
84
|
+
const rawResponseDataString = JSON.stringify(originalResponse);
|
|
85
|
+
const fixedDataString = rawResponseDataString
|
|
86
|
+
// fixes asset paths
|
|
87
|
+
.replace(/"path":"\//g, `"path":"${url}/storage/uploads/`)
|
|
88
|
+
.replace(/src=\\"\/storage/gi, `src=\\"${url}/storage`)
|
|
89
|
+
.replace(pattern, (match) => replacements[match])
|
|
90
|
+
// fixes image paths which already had a path including storage/uploads
|
|
91
|
+
.replace(
|
|
92
|
+
/"path":"\/storage\/uploads\/storage\/uploads\//g,
|
|
93
|
+
`"path":"/storage/uploads/`,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
return JSON.parse(fixedDataString);
|
|
97
|
+
} catch (e) {
|
|
98
|
+
return originalResponse;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const encodeQueryParam = (key: string, value: any) => {
|
|
105
|
+
return `${encodeURIComponent(key)}=${encodeURIComponent(typeof value !== "string" ? JSON.stringify(value) : value)}`;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const buildQueryString = (params: any) => {
|
|
109
|
+
if (!Object.keys(params).length) return null;
|
|
110
|
+
return Object.entries(params)
|
|
111
|
+
.map(([key, value]) => encodeQueryParam(key, value))
|
|
112
|
+
.join("&");
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const handleErrorAndLog = (e: Error) => {
|
|
116
|
+
console.error(e);
|
|
117
|
+
return null;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
const CockpitAPI = async (tenant?: string) => {
|
|
121
|
+
const secretName = ["COCKPIT_SECRET", tenant].filter(Boolean).join("_");
|
|
122
|
+
const token = process.env[secretName];
|
|
123
|
+
|
|
124
|
+
const buildUrl = (path: string, { locale = "de", queryParams = {} }) => {
|
|
125
|
+
const normalizedLocale = locale === "de" ? "default" : locale;
|
|
126
|
+
const url = new URL(cockpitURL);
|
|
127
|
+
url.pathname = `${tenant ? `/:${tenant}/api` : "/api"}${path}`;
|
|
128
|
+
const queryString = buildQueryString({
|
|
129
|
+
...queryParams,
|
|
130
|
+
locale: normalizedLocale,
|
|
131
|
+
});
|
|
132
|
+
url.search = queryString as string;
|
|
133
|
+
return url;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const routeReplaceMents = await generateCmsRouteReplacements(tenant);
|
|
137
|
+
const { transformResult } = FixImagePaths(routeReplaceMents, tenant);
|
|
138
|
+
|
|
139
|
+
const handleResponse = async (result: any) => {
|
|
140
|
+
if (result.status === 404) return null;
|
|
141
|
+
if (result.status !== 200) {
|
|
142
|
+
logger.error(`Error accessing ${result.url}`, result);
|
|
143
|
+
throw new Error(
|
|
144
|
+
`Cockpit: Error accessing ${result.url} ${await result.text()}`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return transformResult(await result.json());
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const fetchData = async (url: any, { useAdminAccess, ...options }: any = {}) => {
|
|
151
|
+
const headers = options?.headers ?? {};
|
|
152
|
+
|
|
153
|
+
if (useAdminAccess) {
|
|
154
|
+
headers["API-Key"] = token;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
logger.verbose(`requesting ${url}`);
|
|
159
|
+
const result = await fetch(url, {
|
|
160
|
+
...options,
|
|
161
|
+
headers: {
|
|
162
|
+
...headers,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
return handleResponse(result);
|
|
166
|
+
} catch (e: any) {
|
|
167
|
+
return handleErrorAndLog(e);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
async graphQL(document: any, variables: any) {
|
|
173
|
+
const query = print(document);
|
|
174
|
+
const cockpitEndpointUrl = new URL(COCKPIT_GRAPHQL_ENDPOINT as string);
|
|
175
|
+
if (tenant) {
|
|
176
|
+
cockpitEndpointUrl.pathname = `/:${tenant}${cockpitEndpointUrl.pathname}`;
|
|
177
|
+
}
|
|
178
|
+
const fetchResult = await fetchData(cockpitEndpointUrl, {
|
|
179
|
+
method: "POST",
|
|
180
|
+
headers: { "Content-Type": "application/json" },
|
|
181
|
+
body: JSON.stringify({ query, variables }),
|
|
182
|
+
});
|
|
183
|
+
return fetchResult;
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
async getContentItem(
|
|
187
|
+
{ model, id }: { model: string; id?: string },
|
|
188
|
+
locale = "default",
|
|
189
|
+
queryParams = {},
|
|
190
|
+
{ useAdminAccess = false }: { useAdminAccess?: boolean } = {},
|
|
191
|
+
) {
|
|
192
|
+
if (!model) throw new Error("Cockpit: Please provide a model");
|
|
193
|
+
|
|
194
|
+
const url = buildUrl(`/content/item/${model}${id ? `/${id}` : ""}`, {
|
|
195
|
+
locale,
|
|
196
|
+
queryParams,
|
|
197
|
+
});
|
|
198
|
+
return fetchData(url, { useAdminAccess });
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
async getAggregateModel({ model, pipeline }: { model: string, pipeline: any[] }, locale = "default") {
|
|
202
|
+
if (!model) throw new Error("Cockpit: Please provide a model");
|
|
203
|
+
|
|
204
|
+
const url = buildUrl(`/content/aggregate/${model}`, {
|
|
205
|
+
locale,
|
|
206
|
+
queryParams: {
|
|
207
|
+
pipeline,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
return fetchData(url);
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
async getContentItems(model: string, locale = "default", queryParams: any = {}) {
|
|
214
|
+
if (!model) throw new Error("Cockpit: Please provide a model");
|
|
215
|
+
const url = buildUrl(`/content/items/${model}`, {
|
|
216
|
+
locale,
|
|
217
|
+
queryParams,
|
|
218
|
+
});
|
|
219
|
+
return fetchData(url);
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
async getContentTree(
|
|
223
|
+
model: string,
|
|
224
|
+
locale = "default",
|
|
225
|
+
queryParams = { filter: {} },
|
|
226
|
+
) {
|
|
227
|
+
if (!model) throw new Error("Cockpit: Please provide a model");
|
|
228
|
+
const url = buildUrl(`/content/tree/${model}`, {
|
|
229
|
+
locale,
|
|
230
|
+
queryParams,
|
|
231
|
+
});
|
|
232
|
+
return fetchData(url);
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
async postContentItem(model: string, item: any) {
|
|
236
|
+
if (!model) throw new Error("Cockpit: Please provide a model");
|
|
237
|
+
const url = buildUrl(`/content/item/${model}`, {});
|
|
238
|
+
const result = await fetchData(url, {
|
|
239
|
+
method: "POST",
|
|
240
|
+
headers: { "Content-Type": "application/json" },
|
|
241
|
+
body: JSON.stringify({ data: item }),
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
return result;
|
|
245
|
+
},
|
|
246
|
+
async deleteContentItem(model: string, id?: string) {
|
|
247
|
+
if (!model || !id)
|
|
248
|
+
throw new Error("Cockpit: Please provide a model and id");
|
|
249
|
+
const url = buildUrl(`/content/item/${model}/${id}`, {});
|
|
250
|
+
const result = await fetchData(url, {
|
|
251
|
+
method: "DELETE",
|
|
252
|
+
headers: { "Content-Type": "application/json" },
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
return result;
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
async pages(locale = "default", queryParams = {}) {
|
|
259
|
+
const url = buildUrl("/pages/pages", {
|
|
260
|
+
locale,
|
|
261
|
+
queryParams,
|
|
262
|
+
});
|
|
263
|
+
return fetchData(url);
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
async pageById({ page, id }: { page: string; id: string }, locale = "default", queryParams = {}) {
|
|
267
|
+
if (!page || !id)
|
|
268
|
+
throw new Error("GetCockpit: Please provide a page and id");
|
|
269
|
+
const url = buildUrl(`/pages/page/${page}/${id}`, {
|
|
270
|
+
locale,
|
|
271
|
+
queryParams,
|
|
272
|
+
});
|
|
273
|
+
return fetchData(url);
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
async pageByRoute(route: string, locale = "default") {
|
|
277
|
+
const url = buildUrl("/pages/page", {
|
|
278
|
+
locale,
|
|
279
|
+
queryParams: { route },
|
|
280
|
+
});
|
|
281
|
+
return fetchData(url);
|
|
282
|
+
},
|
|
283
|
+
|
|
284
|
+
async pagesMenus(locale = "default") {
|
|
285
|
+
const url = buildUrl("/pages/menus", { locale });
|
|
286
|
+
return fetchData(url);
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
async pagesMenu(name: string, locale = "default") {
|
|
290
|
+
const url = buildUrl(`/pages/menu/${name}`, { locale });
|
|
291
|
+
return fetchData(url);
|
|
292
|
+
},
|
|
293
|
+
|
|
294
|
+
async pagesRoutes(locale = "default") {
|
|
295
|
+
const url = buildUrl("/pages/routes", { locale });
|
|
296
|
+
return fetchData(url);
|
|
297
|
+
},
|
|
298
|
+
|
|
299
|
+
async pagesSitemap() {
|
|
300
|
+
const url = buildUrl("/pages/sitemap", {});
|
|
301
|
+
return fetchData(url);
|
|
302
|
+
},
|
|
303
|
+
async pagesSetting(locale = "default") {
|
|
304
|
+
const url = buildUrl("/pages/settings", { locale });
|
|
305
|
+
return fetchData(url);
|
|
306
|
+
},
|
|
307
|
+
async getFullRouteForSlug(slug: string) {
|
|
308
|
+
const routeSlugMap =
|
|
309
|
+
await generateCollectionAndSingletonSlugRouteMap(tenant);
|
|
310
|
+
return routeSlugMap?.[slug];
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
export default CockpitAPI;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
let logger = { // eslint-disable-line
|
|
2
|
+
log: console.log,
|
|
3
|
+
info: console.log,
|
|
4
|
+
error: console.error,
|
|
5
|
+
warn: console.warn,
|
|
6
|
+
verbose: console.debug,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
async function loadLogger() {
|
|
10
|
+
try {
|
|
11
|
+
const { createLogger } = await import("@unchainedshop/logger");
|
|
12
|
+
logger = createLogger("cockpit") || logger;
|
|
13
|
+
} catch (e) {
|
|
14
|
+
// console.warn(e);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
loadLogger();
|
|
19
|
+
|
|
20
|
+
const log = (...args: any) => logger.info(...args);
|
|
21
|
+
|
|
22
|
+
export { logger };
|
|
23
|
+
|
|
24
|
+
export default log;
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FilterRootFields,
|
|
3
|
+
schemaFromExecutor,
|
|
4
|
+
wrapSchema,
|
|
5
|
+
} from "@graphql-tools/wrap";
|
|
6
|
+
import CockpitAPI from "./api";
|
|
7
|
+
|
|
8
|
+
async function remoteExecutor({ document, variables, context }: any) {
|
|
9
|
+
const cockpitSpace = context?.req?.headers?.["x-cockpit-space"];
|
|
10
|
+
const getCockpit = await CockpitAPI(cockpitSpace);
|
|
11
|
+
return getCockpit.graphQL(document, variables);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const makeCockpitSchema = async () => {
|
|
15
|
+
const getCockpitSchema = wrapSchema({
|
|
16
|
+
schema: await schemaFromExecutor(remoteExecutor),
|
|
17
|
+
executor: remoteExecutor,
|
|
18
|
+
transforms: [
|
|
19
|
+
new FilterRootFields((operationName) => {
|
|
20
|
+
return operationName !== "Mutation";
|
|
21
|
+
}),
|
|
22
|
+
],
|
|
23
|
+
});
|
|
24
|
+
return getCockpitSchema;
|
|
25
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES6",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"strict": true,
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"outDir": "./dist",
|
|
10
|
+
"rootDir": "./src",
|
|
11
|
+
"resolveJsonModule": true,
|
|
12
|
+
"declaration": true,
|
|
13
|
+
"declarationMap": true,
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"typeRoots": ["./node_modules/@types", "./src/types"]
|
|
16
|
+
},
|
|
17
|
+
"include": ["src/**/*"],
|
|
18
|
+
"exclude": ["node_modules", "**/*.spec.ts"]
|
|
19
|
+
}
|
|
20
|
+
|