@constructor-io/constructorio-connect-cli 1.4.4 → 1.5.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 +2 -2
- package/boilerplate-repo/.github/workflows/deploy.yml +6 -0
- package/boilerplate-repo/.github/workflows/test.yml +9 -1
- package/boilerplate-repo/README.md +4 -4
- package/dist/functions/execute-template.js +5 -2
- package/dist/prompt-data/filter-connections-by-template.d.ts +4 -0
- package/dist/prompt-data/filter-connections-by-template.d.ts.map +1 -1
- package/dist/prompt-data/filter-connections-by-template.js +18 -10
- package/dist/prompt-data/get-candidate-fixtures.d.ts.map +1 -1
- package/dist/prompt-data/get-candidate-fixtures.js +6 -4
- package/dist/prompt-data/get-template-files.d.ts +0 -1
- package/dist/prompt-data/get-template-files.d.ts.map +1 -1
- package/dist/prompt-data/get-template-files.js +1 -17
- package/dist/types.d.ts +3 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ This package is a CLI tool that helps you **build, test and deploy your connecto
|
|
|
12
12
|
## 1. Review the Requirements
|
|
13
13
|
|
|
14
14
|
Before you begin, note that this package is intended for use with partner connections. If you don't have a connector
|
|
15
|
-
running yet, please take a look at [our documentation](https://docs
|
|
15
|
+
running yet, please take a look at [our documentation](https://docs.constructor.com/docs/integrating-with-constructor-platform-connectors) to see how you can get started.
|
|
16
16
|
|
|
17
17
|
Finally, make sure you have your **connect auth token** available. If you don't have this yet, please get in touch with our team and we'll set this up.
|
|
18
18
|
|
|
@@ -26,7 +26,7 @@ npx @constructor-io/constructorio-connect-cli init my-repo
|
|
|
26
26
|
|
|
27
27
|
Where `my-repo` is the name of the folder and repository you want to create.
|
|
28
28
|
|
|
29
|
-
With the new repository initialized, you can start developing your catalog integration. Please refer to our [documentation](https://docs
|
|
29
|
+
With the new repository initialized, you can start developing your catalog integration. Please refer to our [documentation](https://docs.constructor.com/docs/integrating-with-constructor-platform-connectors) for more information on how to build your templates.
|
|
30
30
|
|
|
31
31
|
## 3. Commands
|
|
32
32
|
|
|
@@ -39,6 +39,12 @@ jobs:
|
|
|
39
39
|
steps:
|
|
40
40
|
- uses: actions/checkout@v4
|
|
41
41
|
|
|
42
|
+
- name: Check secrets
|
|
43
|
+
env:
|
|
44
|
+
CONNECT_AUTH_TOKEN: ${{ secrets.CONNECT_AUTH_TOKEN }}
|
|
45
|
+
if: env.CONNECT_AUTH_TOKEN == ''
|
|
46
|
+
run: echo "Missing CONNECT_AUTH_TOKEN secret" && exit 1
|
|
47
|
+
|
|
42
48
|
- name: Setup node
|
|
43
49
|
uses: actions/setup-node@v4
|
|
44
50
|
with:
|
|
@@ -16,11 +16,17 @@ jobs:
|
|
|
16
16
|
|
|
17
17
|
strategy:
|
|
18
18
|
matrix:
|
|
19
|
-
node: ["20.
|
|
19
|
+
node: ["20.18.0"]
|
|
20
20
|
|
|
21
21
|
steps:
|
|
22
22
|
- uses: actions/checkout@v3
|
|
23
23
|
|
|
24
|
+
- name: Check secrets
|
|
25
|
+
env:
|
|
26
|
+
CONNECT_AUTH_TOKEN: ${{ secrets.CONNECT_AUTH_TOKEN }}
|
|
27
|
+
if: env.CONNECT_AUTH_TOKEN == ''
|
|
28
|
+
run: echo "Missing CONNECT_AUTH_TOKEN secret" && exit 1
|
|
29
|
+
|
|
24
30
|
- name: Setup node
|
|
25
31
|
uses: actions/setup-node@v2
|
|
26
32
|
with:
|
|
@@ -31,3 +37,5 @@ jobs:
|
|
|
31
37
|
|
|
32
38
|
- name: Run unit tests
|
|
33
39
|
run: npm run test
|
|
40
|
+
env:
|
|
41
|
+
CONNECT_AUTH_TOKEN: ${{ secrets.CONNECT_AUTH_TOKEN }}
|
|
@@ -194,11 +194,11 @@ Keep in mind that the template will have access to `externalData` and `targetDat
|
|
|
194
194
|
|
|
195
195
|
Note that all template files must return the expected data types. To know which properties you can override inside `item`, `variation` or `item_group`, take a look into the type definitions:
|
|
196
196
|
|
|
197
|
-
- [Item](https://docs
|
|
198
|
-
- [Variation](https://docs
|
|
199
|
-
- [Item Group](https://docs
|
|
197
|
+
- [Item](https://docs.constructor.com/docs/integrating-with-constructor-product-catalog-csv-csv-feed-format-items-products)
|
|
198
|
+
- [Variation](https://docs.constructor.com/docs/integrating-with-constructor-product-catalog-csv-csv-feed-format-variations)
|
|
199
|
+
- [Item Group](https://docs.constructor.com/docs/integrating-with-constructor-product-catalog-csv-csv-feed-format-item-groups-categories)
|
|
200
200
|
|
|
201
|
-
You can also refer to the [Constructor API docs](https://docs
|
|
201
|
+
You can also refer to the [Constructor API docs](https://docs.constructor.com/reference/v1-catalog-create-or-replace-catalog) for more details.
|
|
202
202
|
|
|
203
203
|
## 🗑️ Removing Entities
|
|
204
204
|
|
|
@@ -27,11 +27,11 @@ exports.TYPE_OPTIONS = [
|
|
|
27
27
|
* @returns Promise<Record<string, any>>
|
|
28
28
|
*/
|
|
29
29
|
async function executeTemplate(options) {
|
|
30
|
-
const {
|
|
30
|
+
const { name, fixture, externalData } = initializeOptions(options);
|
|
31
31
|
const connection = await getConnection(options);
|
|
32
32
|
const config = await (0, config_1.getRepositoryConfigFile)();
|
|
33
33
|
const result = await (0, send_template_execute_request_1.sendTemplateExecuteRequest)({
|
|
34
|
-
template: (0, file_loaders_1.getJSONataTemplate)(
|
|
34
|
+
template: (0, file_loaders_1.getJSONataTemplate)(name).toString(),
|
|
35
35
|
helpers: (await (0, template_source_code_1.getHelpersSourceCode)(config.helpers)) ?? "",
|
|
36
36
|
connectionId: connection.id,
|
|
37
37
|
targetData: fixture,
|
|
@@ -56,6 +56,9 @@ function initializeOptions(options) {
|
|
|
56
56
|
if (!options.name) {
|
|
57
57
|
throw new Error("No name provided");
|
|
58
58
|
}
|
|
59
|
+
if (!options.name.includes("/")) {
|
|
60
|
+
options.name = `${options.type}/${options.name}`;
|
|
61
|
+
}
|
|
59
62
|
if (!options.fixture) {
|
|
60
63
|
options.fixture = {};
|
|
61
64
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { type ConnectionResponseDto } from "../http/get-connections-request";
|
|
2
2
|
import { type PromptChoices } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Returns all connections that are associated with a template by checking
|
|
5
|
+
* the config file.
|
|
6
|
+
*/
|
|
3
7
|
export declare function filterConnectionsByTemplate(templatePath: string, connections: ConnectionResponseDto[]): Promise<PromptChoices<ConnectionResponseDto>>;
|
|
4
8
|
//# sourceMappingURL=filter-connections-by-template.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-connections-by-template.d.ts","sourceRoot":"","sources":["../../src/prompt-data/filter-connections-by-template.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,qBAAqB,EAAE,GACnC,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"filter-connections-by-template.d.ts","sourceRoot":"","sources":["../../src/prompt-data/filter-connections-by-template.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,qBAAqB,EAAE,GACnC,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAmC/C"}
|
|
@@ -6,24 +6,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.filterConnectionsByTemplate = filterConnectionsByTemplate;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const config_1 = require("../customer/config");
|
|
9
|
+
/**
|
|
10
|
+
* Returns all connections that are associated with a template by checking
|
|
11
|
+
* the config file.
|
|
12
|
+
*/
|
|
9
13
|
async function filterConnectionsByTemplate(templatePath, connections) {
|
|
10
14
|
const config = await (0, config_1.getRepositoryConfigFile)();
|
|
11
15
|
const fullPath = path_1.default.join("src/templates", templatePath);
|
|
12
|
-
//
|
|
13
|
-
const
|
|
14
|
-
|
|
16
|
+
// All connection ids that references this template
|
|
17
|
+
const configConnectionIds = config.environments.reduce((connectionIds, environment) => {
|
|
18
|
+
for (const templateConfig of environment.templates) {
|
|
15
19
|
const templatePaths = Object.values(templateConfig.paths);
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
// environment doesn't even target this template
|
|
21
|
+
if (!templatePaths.includes(fullPath)) {
|
|
22
|
+
continue;
|
|
18
23
|
}
|
|
19
|
-
|
|
24
|
+
for (const id of templateConfig.connection_ids) {
|
|
25
|
+
connectionIds.add(id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
20
28
|
return connectionIds;
|
|
21
29
|
}, new Set());
|
|
22
|
-
const filteredConnections = connections.filter((
|
|
23
|
-
return filteredConnections.map((
|
|
30
|
+
const filteredConnections = connections.filter((connection) => configConnectionIds.has(connection.id));
|
|
31
|
+
return filteredConnections.map((connection) => {
|
|
24
32
|
return {
|
|
25
|
-
name:
|
|
26
|
-
value:
|
|
33
|
+
name: connection.name,
|
|
34
|
+
value: connection,
|
|
27
35
|
};
|
|
28
36
|
});
|
|
29
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-candidate-fixtures.d.ts","sourceRoot":"","sources":["../../src/prompt-data/get-candidate-fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"get-candidate-fixtures.d.ts","sourceRoot":"","sources":["../../src/prompt-data/get-candidate-fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAEhF,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,GACnB,aAAa,CAAC,MAAM,CAAC,CAkDvB"}
|
|
@@ -7,7 +7,7 @@ exports.getCandidateFixtures = getCandidateFixtures;
|
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const errors_1 = require("@oclif/core/lib/errors");
|
|
9
9
|
const find_deep_files_1 = require("../helpers/find-deep-files");
|
|
10
|
-
const
|
|
10
|
+
const types_1 = require("../types");
|
|
11
11
|
function getCandidateFixtures(templatePath) {
|
|
12
12
|
const templateType = extractTemplateType(templatePath);
|
|
13
13
|
if (!templateType) {
|
|
@@ -16,11 +16,13 @@ function getCandidateFixtures(templatePath) {
|
|
|
16
16
|
"Check that the template file path is correct",
|
|
17
17
|
"Check that your templates are in the correctly named directory for their type (e.g. 'item.jsonata' in the 'templates/item' directory",
|
|
18
18
|
"Check that you are using a valid template type: " +
|
|
19
|
-
|
|
19
|
+
types_1.TemplateTypes.join(", "),
|
|
20
20
|
],
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
|
-
const fixtureType = templateType === "grouping"
|
|
23
|
+
const fixtureType = templateType === "grouping"
|
|
24
|
+
? "variation" //
|
|
25
|
+
: templateType;
|
|
24
26
|
let fixtureFullPaths;
|
|
25
27
|
try {
|
|
26
28
|
fixtureFullPaths = (0, find_deep_files_1.findDeepFiles)(`src/fixtures/${fixtureType}`);
|
|
@@ -50,7 +52,7 @@ function getCandidateFixtures(templatePath) {
|
|
|
50
52
|
* Checks for any nested folder that matches a known template type.
|
|
51
53
|
*/
|
|
52
54
|
function extractTemplateType(templatePath) {
|
|
53
|
-
for (const type of
|
|
55
|
+
for (const type of types_1.TemplateTypes) {
|
|
54
56
|
if (templatePath.includes(`${type}/`)) {
|
|
55
57
|
return type;
|
|
56
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-template-files.d.ts","sourceRoot":"","sources":["../../src/prompt-data/get-template-files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-template-files.d.ts","sourceRoot":"","sources":["../../src/prompt-data/get-template-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAWvE"}
|
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.templateTypes = void 0;
|
|
7
3
|
exports.getTemplateFiles = getTemplateFiles;
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
4
|
const find_deep_files_1 = require("../helpers/find-deep-files");
|
|
10
|
-
exports.templateTypes = [
|
|
11
|
-
"item",
|
|
12
|
-
"variation",
|
|
13
|
-
"item_group",
|
|
14
|
-
"grouping",
|
|
15
|
-
"mapping",
|
|
16
|
-
];
|
|
17
5
|
/**
|
|
18
6
|
* Get a prompt-ready list of template files in the user repository
|
|
19
7
|
*/
|
|
20
8
|
async function getTemplateFiles() {
|
|
21
|
-
|
|
22
|
-
for (const type of exports.templateTypes) {
|
|
23
|
-
const typePath = path_1.default.join("src/templates", type);
|
|
24
|
-
files = files.concat(getTemplatePaths(typePath));
|
|
25
|
-
}
|
|
9
|
+
const files = getTemplatePaths("src/templates");
|
|
26
10
|
const filteredFiles = files.filter((file) => file.endsWith(".jsonata") && !file.includes("helpers"));
|
|
27
11
|
return filteredFiles.map((file) => ({
|
|
28
12
|
name: file.replace("src/templates/", ""),
|
package/dist/types.d.ts
CHANGED
|
@@ -4,13 +4,7 @@ export interface Config {
|
|
|
4
4
|
environments: Array<{
|
|
5
5
|
environment: string;
|
|
6
6
|
templates: Array<{
|
|
7
|
-
paths:
|
|
8
|
-
item?: string;
|
|
9
|
-
variation?: string;
|
|
10
|
-
item_group?: string;
|
|
11
|
-
grouping?: string;
|
|
12
|
-
mapping?: string;
|
|
13
|
-
};
|
|
7
|
+
paths: Partial<Record<TemplateType, string>>;
|
|
14
8
|
connection_ids: string[];
|
|
15
9
|
}>;
|
|
16
10
|
}>;
|
|
@@ -48,5 +42,7 @@ export declare enum CatalogFixtureType {
|
|
|
48
42
|
EXTERNAL_DATA = "external_data",
|
|
49
43
|
MAPPING = "mapping"
|
|
50
44
|
}
|
|
45
|
+
export declare const TemplateTypes: readonly ["item", "variation", "item_group", "grouping", "mapping"];
|
|
46
|
+
export type TemplateType = (typeof TemplateTypes)[number];
|
|
51
47
|
export {};
|
|
52
48
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,2BAA2B,EAAE,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,KAAK,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,KAAK,CAAC;YACf,KAAK,EAAE
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,2BAA2B,EAAE,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,KAAK,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,KAAK,CAAC;YACf,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;YAC7C,cAAc,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAErE,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAEjE,UAAU,aAAa;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,oBAAY,kBAAkB;IAC5B,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,UAAU,eAAe;IACzB,aAAa,kBAAkB;IAC/B,OAAO,YAAY;CACpB;AAED,eAAO,MAAM,aAAa,qEAMhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CatalogFixtureType = void 0;
|
|
3
|
+
exports.TemplateTypes = exports.CatalogFixtureType = void 0;
|
|
4
4
|
var CatalogFixtureType;
|
|
5
5
|
(function (CatalogFixtureType) {
|
|
6
6
|
CatalogFixtureType["ITEM"] = "item";
|
|
@@ -9,3 +9,10 @@ var CatalogFixtureType;
|
|
|
9
9
|
CatalogFixtureType["EXTERNAL_DATA"] = "external_data";
|
|
10
10
|
CatalogFixtureType["MAPPING"] = "mapping";
|
|
11
11
|
})(CatalogFixtureType || (exports.CatalogFixtureType = CatalogFixtureType = {}));
|
|
12
|
+
exports.TemplateTypes = [
|
|
13
|
+
"item",
|
|
14
|
+
"variation",
|
|
15
|
+
"item_group",
|
|
16
|
+
"grouping",
|
|
17
|
+
"mapping",
|
|
18
|
+
];
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@constructor-io/constructorio-connect-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "CLI tool to enable users to interface with the Constructor Connect Ecosystem",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
},
|
|
62
62
|
"homepage": "https://github.com/Constructor-io/constructorio-connect-cli#readme",
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@inquirer/prompts": "^
|
|
64
|
+
"@inquirer/prompts": "^7.0.1",
|
|
65
65
|
"@oclif/core": "3.25.3",
|
|
66
66
|
"@oclif/plugin-help": "^6.0.21",
|
|
67
67
|
"axios": "^1.6.8",
|