@ecomweb/cli 0.6.1 → 0.8.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 +235 -40
- package/dist/base-command.d.ts +8 -0
- package/dist/base-command.js +43 -4
- package/dist/base-command.js.map +1 -1
- package/dist/commands/auth/login.d.ts +6 -4
- package/dist/commands/auth/login.js +117 -89
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +28 -9
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/profiles/delete.js +11 -0
- package/dist/commands/auth/profiles/delete.js.map +1 -1
- package/dist/commands/auth/profiles/list.js +2 -2
- package/dist/commands/auth/profiles/list.js.map +1 -1
- package/dist/commands/auth/status.js +17 -9
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/deploy.js +16 -3
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/deployments/promote.js +1 -1
- package/dist/commands/deployments/promote.js.map +1 -1
- package/dist/commands/deployments/rollback.js +1 -1
- package/dist/commands/deployments/rollback.js.map +1 -1
- package/dist/commands/deployments/unpublish.js +1 -1
- package/dist/commands/deployments/unpublish.js.map +1 -1
- package/dist/commands/describe.d.ts +1 -1
- package/dist/commands/describe.js +4 -4
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/{init.d.ts → metafield-definitions/create.d.ts} +4 -6
- package/dist/commands/metafield-definitions/create.js +34 -0
- package/dist/commands/metafield-definitions/create.js.map +1 -0
- package/dist/commands/metafield-definitions/delete.d.ts +21 -0
- package/dist/commands/metafield-definitions/delete.js +32 -0
- package/dist/commands/metafield-definitions/delete.js.map +1 -0
- package/dist/commands/metafield-definitions/get.d.ts +21 -0
- package/dist/commands/metafield-definitions/get.js +30 -0
- package/dist/commands/metafield-definitions/get.js.map +1 -0
- package/dist/commands/metafield-definitions/list.d.ts +19 -0
- package/dist/commands/metafield-definitions/list.js +35 -0
- package/dist/commands/metafield-definitions/list.js.map +1 -0
- package/dist/commands/metafield-definitions/update.d.ts +23 -0
- package/dist/commands/metafield-definitions/update.js +39 -0
- package/dist/commands/metafield-definitions/update.js.map +1 -0
- package/dist/commands/{auth/verify.d.ts → metafields/get.d.ts} +2 -3
- package/dist/commands/metafields/get.js +32 -0
- package/dist/commands/metafields/get.js.map +1 -0
- package/dist/commands/metafields/set.d.ts +24 -0
- package/dist/commands/metafields/set.js +83 -0
- package/dist/commands/metafields/set.js.map +1 -0
- package/dist/commands/metaobject-definitions/create.d.ts +20 -0
- package/dist/commands/metaobject-definitions/create.js +33 -0
- package/dist/commands/metaobject-definitions/create.js.map +1 -0
- package/dist/commands/metaobject-definitions/delete.d.ts +21 -0
- package/dist/commands/metaobject-definitions/delete.js +32 -0
- package/dist/commands/metaobject-definitions/delete.js.map +1 -0
- package/dist/commands/metaobject-definitions/get.d.ts +21 -0
- package/dist/commands/metaobject-definitions/get.js +31 -0
- package/dist/commands/metaobject-definitions/get.js.map +1 -0
- package/dist/commands/metaobject-definitions/list.d.ts +20 -0
- package/dist/commands/metaobject-definitions/list.js +41 -0
- package/dist/commands/metaobject-definitions/list.js.map +1 -0
- package/dist/commands/metaobject-definitions/update.d.ts +23 -0
- package/dist/commands/metaobject-definitions/update.js +38 -0
- package/dist/commands/metaobject-definitions/update.js.map +1 -0
- package/dist/commands/metaobjects/create.d.ts +24 -0
- package/dist/commands/metaobjects/create.js +40 -0
- package/dist/commands/metaobjects/create.js.map +1 -0
- package/dist/commands/metaobjects/delete.d.ts +22 -0
- package/dist/commands/metaobjects/delete.js +34 -0
- package/dist/commands/metaobjects/delete.js.map +1 -0
- package/dist/commands/metaobjects/get.d.ts +22 -0
- package/dist/commands/metaobjects/get.js +32 -0
- package/dist/commands/metaobjects/get.js.map +1 -0
- package/dist/commands/metaobjects/list.d.ts +24 -0
- package/dist/commands/metaobjects/list.js +56 -0
- package/dist/commands/metaobjects/list.js.map +1 -0
- package/dist/commands/metaobjects/update.d.ts +27 -0
- package/dist/commands/metaobjects/update.js +45 -0
- package/dist/commands/metaobjects/update.js.map +1 -0
- package/dist/commands/storefront/init.d.ts +3 -1
- package/dist/commands/storefront/init.js +23 -2
- package/dist/commands/storefront/init.js.map +1 -1
- package/dist/commands/stores/create.d.ts +21 -0
- package/dist/commands/stores/create.js +68 -0
- package/dist/commands/stores/create.js.map +1 -0
- package/dist/commands/stores/current.js +1 -1
- package/dist/commands/stores/current.js.map +1 -1
- package/dist/commands/stores/list.js +3 -3
- package/dist/commands/stores/list.js.map +1 -1
- package/dist/commands/stores/switch.js +14 -6
- package/dist/commands/stores/switch.js.map +1 -1
- package/dist/commands/theme/create.d.ts +20 -0
- package/dist/commands/theme/create.js +40 -0
- package/dist/commands/theme/create.js.map +1 -0
- package/dist/commands/{auth/register.d.ts → theme/duplicate.d.ts} +4 -2
- package/dist/commands/theme/duplicate.js +34 -0
- package/dist/commands/theme/duplicate.js.map +1 -0
- package/dist/commands/theme/link.d.ts +24 -0
- package/dist/commands/theme/link.js +60 -0
- package/dist/commands/theme/link.js.map +1 -0
- package/dist/commands/{setup.d.ts → theme/list.d.ts} +2 -3
- package/dist/commands/theme/list.js +32 -0
- package/dist/commands/theme/list.js.map +1 -0
- package/dist/commands/theme/publish.d.ts +22 -0
- package/dist/commands/theme/publish.js +68 -0
- package/dist/commands/theme/publish.js.map +1 -0
- package/dist/commands/theme/schema/push.d.ts +20 -0
- package/dist/commands/theme/schema/push.js +61 -0
- package/dist/commands/theme/schema/push.js.map +1 -0
- package/dist/commands/theme/update.d.ts +23 -0
- package/dist/commands/theme/update.js +62 -0
- package/dist/commands/theme/update.js.map +1 -0
- package/dist/commands/theme/use.d.ts +23 -0
- package/dist/commands/theme/use.js +71 -0
- package/dist/commands/theme/use.js.map +1 -0
- package/dist/commands/theme/versions.d.ts +21 -0
- package/dist/commands/theme/versions.js +33 -0
- package/dist/commands/theme/versions.js.map +1 -0
- package/dist/lib/api-client.d.ts +5 -4
- package/dist/lib/api-client.js +32 -16
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/codex-skill.d.ts +1 -1
- package/dist/lib/codex-skill.js +12 -8
- package/dist/lib/codex-skill.js.map +1 -1
- package/dist/lib/config.d.ts +6 -18
- package/dist/lib/config.js +35 -64
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/credential-store.d.ts +44 -0
- package/dist/lib/credential-store.js +137 -0
- package/dist/lib/credential-store.js.map +1 -0
- package/dist/lib/custom-data.d.ts +42 -0
- package/dist/lib/custom-data.js +167 -0
- package/dist/lib/custom-data.js.map +1 -0
- package/dist/lib/deployments.d.ts +8 -1
- package/dist/lib/deployments.js +58 -11
- package/dist/lib/deployments.js.map +1 -1
- package/dist/lib/describe-metafields.d.ts +9 -0
- package/dist/lib/describe-metafields.js +213 -0
- package/dist/lib/describe-metafields.js.map +1 -0
- package/dist/lib/device-login.d.ts +22 -0
- package/dist/lib/device-login.js +66 -0
- package/dist/lib/device-login.js.map +1 -0
- package/dist/lib/errors.d.ts +1 -0
- package/dist/lib/errors.js +6 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/file-lock.d.ts +6 -0
- package/dist/lib/file-lock.js +66 -0
- package/dist/lib/file-lock.js.map +1 -0
- package/dist/lib/live-confirm.d.ts +11 -0
- package/dist/lib/live-confirm.js +34 -0
- package/dist/lib/live-confirm.js.map +1 -0
- package/dist/lib/open-browser.d.ts +13 -0
- package/dist/lib/open-browser.js +38 -0
- package/dist/lib/open-browser.js.map +1 -0
- package/dist/lib/pending-login.d.ts +5 -0
- package/dist/lib/pending-login.js +39 -0
- package/dist/lib/pending-login.js.map +1 -0
- package/dist/lib/project-setup.d.ts +1 -0
- package/dist/lib/project-setup.js +20 -0
- package/dist/lib/project-setup.js.map +1 -1
- package/dist/lib/secure-file.d.ts +1 -0
- package/dist/lib/secure-file.js +15 -0
- package/dist/lib/secure-file.js.map +1 -0
- package/dist/lib/session.d.ts +40 -0
- package/dist/lib/session.js +80 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/store-selection.d.ts +19 -0
- package/dist/lib/store-selection.js +23 -0
- package/dist/lib/store-selection.js.map +1 -0
- package/dist/lib/template-scaffold.d.ts +1 -0
- package/dist/lib/template-scaffold.js +5 -2
- package/dist/lib/template-scaffold.js.map +1 -1
- package/dist/lib/theme-schema-export.d.ts +1 -1
- package/dist/lib/theme-schema-export.js +4 -5
- package/dist/lib/theme-schema-export.js.map +1 -1
- package/dist/lib/themes.d.ts +143 -0
- package/dist/lib/themes.js +277 -0
- package/dist/lib/themes.js.map +1 -0
- package/dist/lib/validators.js +16 -0
- package/dist/lib/validators.js.map +1 -1
- package/oclif.manifest.json +8168 -5388
- package/package.json +2 -1
- package/dist/commands/auth/register.js +0 -35
- package/dist/commands/auth/register.js.map +0 -1
- package/dist/commands/auth/verify.js +0 -43
- package/dist/commands/auth/verify.js.map +0 -1
- package/dist/commands/init.js +0 -84
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/setup.js +0 -186
- package/dist/commands/setup.js.map +0 -1
- package/dist/lib/email-login.d.ts +0 -35
- package/dist/lib/email-login.js +0 -86
- package/dist/lib/email-login.js.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.METAFIELD_TYPES = void 0;
|
|
4
|
+
exports.describeMetafieldDefinitionCreate = describeMetafieldDefinitionCreate;
|
|
5
|
+
exports.describeMetafieldDefinitionUpdate = describeMetafieldDefinitionUpdate;
|
|
6
|
+
exports.describeMetaobjectDefinitionCreate = describeMetaobjectDefinitionCreate;
|
|
7
|
+
exports.describeMetaobjectDefinitionUpdate = describeMetaobjectDefinitionUpdate;
|
|
8
|
+
exports.describeMetaobjectEntryCreate = describeMetaobjectEntryCreate;
|
|
9
|
+
exports.describeMetaobjectEntryUpdate = describeMetaobjectEntryUpdate;
|
|
10
|
+
exports.describeMetafieldsSet = describeMetafieldsSet;
|
|
11
|
+
const custom_data_1 = require("./custom-data");
|
|
12
|
+
exports.METAFIELD_TYPES = [
|
|
13
|
+
"single_line_text",
|
|
14
|
+
"multi_line_text",
|
|
15
|
+
"rich_text",
|
|
16
|
+
"email",
|
|
17
|
+
"integer",
|
|
18
|
+
"decimal",
|
|
19
|
+
"date",
|
|
20
|
+
"date_time",
|
|
21
|
+
"url",
|
|
22
|
+
"link",
|
|
23
|
+
"weight",
|
|
24
|
+
"volume",
|
|
25
|
+
"dimension",
|
|
26
|
+
"boolean",
|
|
27
|
+
"color",
|
|
28
|
+
"rating",
|
|
29
|
+
"money",
|
|
30
|
+
"language",
|
|
31
|
+
"json",
|
|
32
|
+
"file",
|
|
33
|
+
"image",
|
|
34
|
+
"video",
|
|
35
|
+
"product",
|
|
36
|
+
"variant",
|
|
37
|
+
"collection",
|
|
38
|
+
"page",
|
|
39
|
+
"blog_post",
|
|
40
|
+
"customer",
|
|
41
|
+
"order",
|
|
42
|
+
"metaobject_reference",
|
|
43
|
+
"mixed_reference",
|
|
44
|
+
];
|
|
45
|
+
const TYPE_DESCRIPTION = `One of: ${exports.METAFIELD_TYPES.join(", ")}. Prefix list. for a list of that type ` +
|
|
46
|
+
"(e.g. list.single_line_text). Immutable after create.";
|
|
47
|
+
const VALIDATIONS_DESCRIPTION = [
|
|
48
|
+
"Keys allowed per type; unknown keys are rejected.",
|
|
49
|
+
"single_line_text: min_length, max_length, regex (single_line_text only; full match (implicitly ^(?:...)$); max 200 chars; no backreferences or lookaround; no repetition after a group; at most 2 quantifiers and 4 alternatives; max_length defaults to 500 and may not exceed 500), choices (max 128 strings);",
|
|
50
|
+
"multi_line_text: min_length, max_length;",
|
|
51
|
+
"rich_text: max_length (text characters);",
|
|
52
|
+
"integer, decimal: min, max; decimal also max_precision (0 to 9);",
|
|
53
|
+
"date, date_time: min, max;",
|
|
54
|
+
"url, link: allowed_domains (max 20);",
|
|
55
|
+
"weight, volume, dimension: min, max, each {value, unit};",
|
|
56
|
+
"rating: scale_min, scale_max (both required);",
|
|
57
|
+
"file: file_types, a subset of image, video, document;",
|
|
58
|
+
"metaobject_reference: metaobject_definition_id (required);",
|
|
59
|
+
"mixed_reference: metaobject_definition_ids (2 to 10, required);",
|
|
60
|
+
"list.*: the item type's keys plus list_min, list_max (max 128).",
|
|
61
|
+
].join(" ");
|
|
62
|
+
const VALUE_DESCRIPTION = [
|
|
63
|
+
"Value JSON per type:",
|
|
64
|
+
"single_line_text, multi_line_text, email, url, language: string;",
|
|
65
|
+
"integer: number; decimal: string such as \"10.50\";",
|
|
66
|
+
"date: \"YYYY-MM-DD\"; date_time: \"YYYY-MM-DDTHH:mm:ssZ\";",
|
|
67
|
+
"boolean: true or false; color: \"#rrggbb\";",
|
|
68
|
+
"link: {url, text}; weight, volume, dimension: {value, unit} with value a decimal string;",
|
|
69
|
+
"rating: {value, scale_min, scale_max}; money: {amount, currency_code} in the store currency;",
|
|
70
|
+
"rich_text: {type: \"root\", children: [...]} with paragraph, heading (level 1 to 6), list and list-item nodes, inline text (bold, italic) and link (http, https or mailto);",
|
|
71
|
+
"file, image, video: asset id; product, variant, collection, page, blog_post, customer, order, metaobject_reference, mixed_reference: the target id as a string;",
|
|
72
|
+
"list.*: an array of item values; json: any JSON.",
|
|
73
|
+
].join(" ");
|
|
74
|
+
const KEY_CONSTRAINT = "2-64 chars: a-z, 0-9, _";
|
|
75
|
+
const METAFIELD_DEFINITION_FIELDS = [
|
|
76
|
+
{ name: "owner_type", type: "enum", required: true, values: [...custom_data_1.METAFIELD_OWNER_TYPES], description: "The resource the values attach to. Immutable." },
|
|
77
|
+
{ name: "namespace", type: "string", required: false, default: "custom", constraints: KEY_CONSTRAINT, description: "Immutable." },
|
|
78
|
+
{ name: "key", type: "string", required: true, constraints: KEY_CONSTRAINT, description: "Read as namespace.key, e.g. custom.care_guide. Immutable." },
|
|
79
|
+
{ name: "name", type: "string", required: true, constraints: "max 255 chars" },
|
|
80
|
+
{ name: "description", type: "string", required: false },
|
|
81
|
+
{ name: "type", type: "string", required: true, description: TYPE_DESCRIPTION },
|
|
82
|
+
{ name: "validations", type: "object", required: false, default: {}, description: VALIDATIONS_DESCRIPTION },
|
|
83
|
+
{ name: "storefront_access", type: "boolean", required: false, default: false, description: "Expose values on public storefront responses. Not available for customer, order and location owners." },
|
|
84
|
+
{ name: "customer_access", type: "enum", required: false, values: ["none", "read", "read_write"], default: "none", description: "read: customer and order owners only. read_write: customer owners only." },
|
|
85
|
+
{ name: "pinned", type: "boolean", required: false, description: "Show first on the owner's edit page (max 20 pinned per owner type)." },
|
|
86
|
+
];
|
|
87
|
+
const METAFIELD_IMMUTABLE = ["owner_type", "namespace", "key", "type"];
|
|
88
|
+
function describeMetafieldDefinitionCreate() {
|
|
89
|
+
return {
|
|
90
|
+
resource: "metafield-definitions",
|
|
91
|
+
operation: "create",
|
|
92
|
+
fields: METAFIELD_DEFINITION_FIELDS,
|
|
93
|
+
example: {
|
|
94
|
+
owner_type: "product",
|
|
95
|
+
namespace: "custom",
|
|
96
|
+
key: "care_guide",
|
|
97
|
+
name: "Care guide",
|
|
98
|
+
type: "rich_text",
|
|
99
|
+
storefront_access: true,
|
|
100
|
+
},
|
|
101
|
+
hint: [
|
|
102
|
+
`Create: ecomweb metafield-definitions create --stdin <<< '{"owner_type":"product","key":"care_guide","name":"Care guide","type":"rich_text","storefront_access":true}'`,
|
|
103
|
+
"Then: ecomweb metafields set --owner product:<id> --key custom.care_guide --value '<json>'",
|
|
104
|
+
].join("\n"),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function describeMetafieldDefinitionUpdate() {
|
|
108
|
+
return {
|
|
109
|
+
resource: "metafield-definitions",
|
|
110
|
+
operation: "update",
|
|
111
|
+
fields: METAFIELD_DEFINITION_FIELDS.filter((f) => !METAFIELD_IMMUTABLE.includes(f.name)).map((f) => ({ ...f, required: false })),
|
|
112
|
+
example: { validations: { max_length: 500 }, pinned: true },
|
|
113
|
+
hint: "ecomweb metafield-definitions update <id> --stdin <<< '{\"pinned\":true}' (owner_type, namespace, key and type cannot change)",
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const METAOBJECT_DEFINITION_FIELDS = [
|
|
117
|
+
{ name: "name", type: "string", required: true, constraints: "max 255 chars", description: "e.g. Feedbacks" },
|
|
118
|
+
{ name: "type", type: "string", required: false, constraints: "2-64 chars: a-z, 0-9, _, -", description: "Derived from name when left out (Feedbacks -> feedbacks). Immutable." },
|
|
119
|
+
{ name: "description", type: "string", required: false },
|
|
120
|
+
{
|
|
121
|
+
name: "fields",
|
|
122
|
+
type: "object[]",
|
|
123
|
+
required: true,
|
|
124
|
+
constraints: "1 to 40 fields",
|
|
125
|
+
description: "Ordered list of {key?, name, description?, type, required?, validations?}. key (" + KEY_CONSTRAINT + ") is derived from name when left out. " +
|
|
126
|
+
"type and validations as for metafield definitions (ecomweb describe metafield-definitions). key and type are immutable. " +
|
|
127
|
+
"On update the list replaces the stored one: a removed field's values are deleted from every entry.",
|
|
128
|
+
},
|
|
129
|
+
{ name: "display_name_key", type: "string", required: false, description: "Key of a single_line_text field shown as the entry's name. Defaults to the first one." },
|
|
130
|
+
{ name: "filter_keys", type: "string[]", required: false, default: [], constraints: "max 5", description: "Field keys usable as list filters (single_line_text, boolean, integer or date fields)." },
|
|
131
|
+
{ name: "has_status", type: "boolean", required: false, default: true, description: "Entries have active or draft status. Turning it off makes every entry active." },
|
|
132
|
+
{ name: "storefront_access", type: "boolean", required: false, default: false, description: "Serve active entries on the public storefront routes." },
|
|
133
|
+
{ name: "customer_access", type: "enum", required: false, values: ["none", "read"], default: "none", description: "read: signed-in customers can read the entries." },
|
|
134
|
+
];
|
|
135
|
+
function describeMetaobjectDefinitionCreate() {
|
|
136
|
+
return {
|
|
137
|
+
resource: "metaobject-definitions",
|
|
138
|
+
operation: "create",
|
|
139
|
+
fields: METAOBJECT_DEFINITION_FIELDS,
|
|
140
|
+
example: {
|
|
141
|
+
name: "Feedbacks",
|
|
142
|
+
storefront_access: true,
|
|
143
|
+
fields: [
|
|
144
|
+
{ name: "Name", type: "single_line_text", required: true },
|
|
145
|
+
{ name: "Content", type: "multi_line_text" },
|
|
146
|
+
{ name: "Rating", type: "integer", validations: { min: 1, max: 5 } },
|
|
147
|
+
],
|
|
148
|
+
filter_keys: ["rating"],
|
|
149
|
+
},
|
|
150
|
+
hint: "ecomweb metaobject-definitions create --file feedbacks.json; then ecomweb metaobjects create --type feedbacks --data '{\"name\":\"Lan Anh\"}'",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function describeMetaobjectDefinitionUpdate() {
|
|
154
|
+
return {
|
|
155
|
+
resource: "metaobject-definitions",
|
|
156
|
+
operation: "update",
|
|
157
|
+
fields: METAOBJECT_DEFINITION_FIELDS.filter((f) => f.name !== "type").map((f) => ({ ...f, required: false })),
|
|
158
|
+
example: { storefront_access: true, filter_keys: ["rating"] },
|
|
159
|
+
hint: "ecomweb metaobject-definitions update <id> --stdin <<< '{\"storefront_access\":true}' (send the full fields list to add or remove a field)",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const ENTRY_FIELDS = [
|
|
163
|
+
{ name: "handle", type: "string", required: false, constraints: "1-255 chars: a-z, 0-9, -", description: "Derived from the display name when left out, de-duplicated with -2, -3." },
|
|
164
|
+
{ name: "status", type: "enum", required: false, values: ["active", "draft"], default: "active", description: "Always active when the definition has no status." },
|
|
165
|
+
{ name: "fields", type: "object", required: true, description: `{"<field key>": <value>}. Required fields must be present; unknown keys are rejected. ${VALUE_DESCRIPTION}` },
|
|
166
|
+
];
|
|
167
|
+
function describeMetaobjectEntryCreate() {
|
|
168
|
+
return {
|
|
169
|
+
resource: "metaobjects",
|
|
170
|
+
operation: "create",
|
|
171
|
+
fields: ENTRY_FIELDS,
|
|
172
|
+
example: { fields: { name: "Lan Anh", content: "Great quality", rating: 5 } },
|
|
173
|
+
hint: "ecomweb metaobjects create --type feedbacks --data '{\"name\":\"Lan Anh\",\"rating\":5}' (field keys: ecomweb metaobject-definitions get <id>)",
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function describeMetaobjectEntryUpdate() {
|
|
177
|
+
return {
|
|
178
|
+
resource: "metaobjects",
|
|
179
|
+
operation: "update",
|
|
180
|
+
fields: ENTRY_FIELDS.map((f) => f.name === "fields"
|
|
181
|
+
? { ...f, required: false, description: `Merged per key into the stored fields; null clears a field. ${VALUE_DESCRIPTION}` }
|
|
182
|
+
: { ...f, required: false }),
|
|
183
|
+
example: { fields: { content: "Updated" }, status: "active" },
|
|
184
|
+
hint: "ecomweb metaobjects update <id> --type feedbacks --data '{\"content\":null}'",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function describeMetafieldsSet() {
|
|
188
|
+
return {
|
|
189
|
+
resource: "metafields",
|
|
190
|
+
operation: "set",
|
|
191
|
+
fields: [
|
|
192
|
+
{
|
|
193
|
+
name: "values",
|
|
194
|
+
type: "object[]",
|
|
195
|
+
required: true,
|
|
196
|
+
description: "[{namespace, key, value}], one per metafield of a definition for this owner type. All are validated first and written together, or none are. " +
|
|
197
|
+
`value null deletes. ${VALUE_DESCRIPTION}`,
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
example: {
|
|
201
|
+
values: [
|
|
202
|
+
{ namespace: "custom", key: "care_guide", value: { type: "root", children: [{ type: "paragraph", children: [{ type: "text", value: "Wash cold" }] }] } },
|
|
203
|
+
{ namespace: "custom", key: "featured_feedback", value: "41" },
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
hint: [
|
|
207
|
+
"One value: ecomweb metafields set --owner product:12 --key custom.care_guide --value '\"Wash cold\"'",
|
|
208
|
+
"Many: ecomweb metafields set --owner product:12 --file values.json",
|
|
209
|
+
"Owners: product:<id>, variant:<product id>/<variant id>, collection:<id>, customer:<id>, order:<id>, page:<id>, blog_post:<id>, location:<id>, shop",
|
|
210
|
+
].join("\n"),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=describe-metafields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-metafields.js","sourceRoot":"","sources":["../../src/lib/describe-metafields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CliError } from "./errors";
|
|
2
|
+
import { TokenResponse } from "./session";
|
|
3
|
+
export interface PendingLogin {
|
|
4
|
+
device_code: string;
|
|
5
|
+
user_code: string;
|
|
6
|
+
verification_uri_complete: string;
|
|
7
|
+
interval: number;
|
|
8
|
+
expires_at: number;
|
|
9
|
+
api_url: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DevicePoster {
|
|
12
|
+
post<T = any>(path: string, body?: unknown): Promise<T>;
|
|
13
|
+
}
|
|
14
|
+
export declare function deviceAuthExpired(): CliError;
|
|
15
|
+
export declare function deviceAuthDenied(): CliError;
|
|
16
|
+
export declare function requestDeviceCode(api: DevicePoster, deviceName: string, apiUrl: string, now: number): Promise<PendingLogin>;
|
|
17
|
+
export declare function pollUntil(api: DevicePoster, pending: PendingLogin, opts: {
|
|
18
|
+
deadline: number;
|
|
19
|
+
now: () => number;
|
|
20
|
+
sleep: (ms: number) => Promise<void>;
|
|
21
|
+
onInterval?: (interval: number) => void;
|
|
22
|
+
}): Promise<TokenResponse | undefined>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deviceAuthExpired = deviceAuthExpired;
|
|
4
|
+
exports.deviceAuthDenied = deviceAuthDenied;
|
|
5
|
+
exports.requestDeviceCode = requestDeviceCode;
|
|
6
|
+
exports.pollUntil = pollUntil;
|
|
7
|
+
const errors_1 = require("./errors");
|
|
8
|
+
function deviceAuthExpired() {
|
|
9
|
+
return new errors_1.CliError("DEVICE_AUTH_EXPIRED", "The sign-in code expired before it was approved", errors_1.ExitCode.AUTH_FAILURE, {
|
|
10
|
+
hint: "Run: ecomweb auth login",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function deviceAuthDenied() {
|
|
14
|
+
return new errors_1.CliError("DEVICE_AUTH_DENIED", "The sign-in was denied in the browser", errors_1.ExitCode.AUTH_FAILURE, {
|
|
15
|
+
hint: "Run: ecomweb auth login",
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async function requestDeviceCode(api, deviceName, apiUrl, now) {
|
|
19
|
+
const r = await api.post("/auth/device/code", { device_name: deviceName.slice(0, 100) });
|
|
20
|
+
return {
|
|
21
|
+
device_code: r.device_code,
|
|
22
|
+
user_code: r.user_code,
|
|
23
|
+
verification_uri_complete: r.verification_uri_complete,
|
|
24
|
+
interval: r.interval,
|
|
25
|
+
expires_at: now + r.expires_in * 1000,
|
|
26
|
+
api_url: apiUrl,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async function pollOnce(api, deviceCode, interval) {
|
|
30
|
+
try {
|
|
31
|
+
return { status: "approved", tokens: await api.post("/auth/device/token", { device_code: deviceCode }) };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
switch ((0, errors_1.apiErrorCode)(error)) {
|
|
35
|
+
case "DEVICE_AUTH_PENDING":
|
|
36
|
+
return { status: "pending", interval };
|
|
37
|
+
case "DEVICE_AUTH_SLOW_DOWN":
|
|
38
|
+
return { status: "pending", interval: interval + 5 };
|
|
39
|
+
case "DEVICE_AUTH_DENIED":
|
|
40
|
+
throw deviceAuthDenied();
|
|
41
|
+
case "DEVICE_AUTH_EXPIRED":
|
|
42
|
+
case "DEVICE_AUTH_INVALID_CODE":
|
|
43
|
+
throw deviceAuthExpired();
|
|
44
|
+
default:
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function pollUntil(api, pending, opts) {
|
|
50
|
+
let interval = pending.interval;
|
|
51
|
+
for (;;) {
|
|
52
|
+
if (opts.now() >= pending.expires_at)
|
|
53
|
+
throw deviceAuthExpired();
|
|
54
|
+
const outcome = await pollOnce(api, pending.device_code, interval);
|
|
55
|
+
if (outcome.status === "approved")
|
|
56
|
+
return outcome.tokens;
|
|
57
|
+
if (outcome.interval !== interval) {
|
|
58
|
+
interval = outcome.interval;
|
|
59
|
+
opts.onInterval?.(interval);
|
|
60
|
+
}
|
|
61
|
+
if (opts.now() + interval * 1000 > opts.deadline)
|
|
62
|
+
return undefined;
|
|
63
|
+
await opts.sleep(interval * 1000);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=device-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-login.js","sourceRoot":"","sources":["../../src/lib/device-login.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/errors.d.ts
CHANGED
package/dist/lib/errors.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CliError = exports.ExitCode = void 0;
|
|
4
4
|
exports.formatError = formatError;
|
|
5
|
+
exports.apiErrorCode = apiErrorCode;
|
|
5
6
|
var ExitCode;
|
|
6
7
|
(function (ExitCode) {
|
|
7
8
|
ExitCode[ExitCode["SUCCESS"] = 0] = "SUCCESS";
|
|
@@ -67,7 +68,7 @@ function mapHttpError(err) {
|
|
|
67
68
|
error: {
|
|
68
69
|
code: "FORBIDDEN",
|
|
69
70
|
message: serverMessage || "Insufficient permissions.",
|
|
70
|
-
hint: "
|
|
71
|
+
hint: "Your role in this store (or your API key's scopes) does not allow this.",
|
|
71
72
|
},
|
|
72
73
|
},
|
|
73
74
|
exitCode: ExitCode.AUTH_FAILURE,
|
|
@@ -115,4 +116,8 @@ function mapHttpError(err) {
|
|
|
115
116
|
};
|
|
116
117
|
}
|
|
117
118
|
}
|
|
119
|
+
function apiErrorCode(error) {
|
|
120
|
+
const code = error?.response?.data?.code;
|
|
121
|
+
return typeof code === "string" ? code : undefined;
|
|
122
|
+
}
|
|
118
123
|
//# sourceMappingURL=errors.js.map
|
package/dist/lib/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":";;;AAwDA,kCAcC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":";;;AAwDA,kCAcC;AAyFD,oCAGC;AArJD,IAAY,QAQX;AARD,WAAY,QAAQ;IAClB,6CAAW,CAAA;IACX,yCAAS,CAAA;IACT,mDAAc,CAAA;IACd,uDAAgB,CAAA;IAChB,iDAAa,CAAA;IACb,uDAAgB,CAAA;IAChB,2DAAkB,CAAA;AACpB,CAAC,EARW,QAAQ,wBAAR,QAAQ,QAQnB;AASD,MAAa,QAAS,SAAQ,KAAK;IAIjC,YACE,IAAY,EACZ,OAAe,EACf,WAAqB,QAAQ,CAAC,KAAK,EACnC,OAA8D;QAE9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG;YACb,IAAI;YACJ,OAAO;YACP,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5C,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACtD,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;CACF;AAxBD,4BAwBC;AAED,SAAgB,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO;QACL,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE;QACtD,QAAQ,EAAE,QAAQ,CAAC,KAAK;KACzB,CAAC;AACJ,CAAC;AAYD,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,cAAc,IAAI,GAAG,IAAK,GAAW,CAAC,YAAY,KAAK,IAAI,CAAC;AAChH,CAAC;AAED,SAAS,YAAY,CAAC,GAAmB;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC;IAChC,MAAM,aAAa,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC;IAElE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO;gBACL,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,aAAa,IAAI,0BAA0B;wBACpD,IAAI,EAAE,yBAAyB;qBAChC;iBACF;gBACD,QAAQ,EAAE,QAAQ,CAAC,YAAY;aAChC,CAAC;QACJ,KAAK,GAAG;YACN,OAAO;gBACL,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,aAAa,IAAI,2BAA2B;wBACrD,IAAI,EAAE,yEAAyE;qBAChF;iBACF;gBACD,QAAQ,EAAE,QAAQ,CAAC,YAAY;aAChC,CAAC;QACJ,KAAK,GAAG;YACN,OAAO;gBACL,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,aAAa,IAAI,qBAAqB;qBAChD;iBACF;gBACD,QAAQ,EAAE,QAAQ,CAAC,SAAS;aAC7B,CAAC;QACJ,KAAK,GAAG;YACN,OAAO;gBACL,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,aAAa,IAAI,oBAAoB;wBAC9C,GAAG,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAA+B,EAAE,CAAC;qBAC1D;iBACF;gBACD,QAAQ,EAAE,QAAQ,CAAC,UAAU;aAC9B,CAAC;QACJ,KAAK,GAAG;YACN,OAAO;gBACL,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,uCAAuC;qBACjD;iBACF;gBACD,QAAQ,EAAE,QAAQ,CAAC,KAAK;aACzB,CAAC;QACJ;YACE,OAAO;gBACL,IAAI,EAAE;oBACJ,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ,MAAM,IAAI,SAAS,EAAE;wBACnC,OAAO,EAAE,aAAa,IAAI,cAAc,MAAM,EAAE;qBACjD;iBACF;gBACD,QAAQ,EAAE,QAAQ,CAAC,KAAK;aACzB,CAAC;IACN,CAAC;AACH,CAAC;AAGD,SAAgB,YAAY,CAAC,KAAc;IACzC,MAAM,IAAI,GAAI,KAAsD,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IAC3F,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.withFileLock = withFileLock;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const errors_1 = require("./errors");
|
|
11
|
+
function isStale(lockPath, staleMs) {
|
|
12
|
+
try {
|
|
13
|
+
return Date.now() - (0, node_fs_1.statSync)(lockPath).mtimeMs > staleMs;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function release(lockPath, token) {
|
|
20
|
+
let content;
|
|
21
|
+
try {
|
|
22
|
+
content = (0, node_fs_1.readFileSync)(lockPath, "utf8");
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (content.includes(token))
|
|
28
|
+
(0, node_fs_1.rmSync)(lockPath, { force: true });
|
|
29
|
+
}
|
|
30
|
+
async function withFileLock(lockPath, fn, opts = {}) {
|
|
31
|
+
const staleMs = opts.staleMs ?? 30_000;
|
|
32
|
+
const timeoutMs = opts.timeoutMs ?? 10_000;
|
|
33
|
+
const pollMs = opts.pollMs ?? 100;
|
|
34
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(lockPath), { recursive: true, mode: 0o700 });
|
|
35
|
+
const token = (0, node_crypto_1.randomBytes)(16).toString("hex");
|
|
36
|
+
const deadline = Date.now() + timeoutMs;
|
|
37
|
+
let fd;
|
|
38
|
+
while (fd === undefined) {
|
|
39
|
+
try {
|
|
40
|
+
fd = (0, node_fs_1.openSync)(lockPath, "wx", 0o600);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code !== "EEXIST")
|
|
44
|
+
throw error;
|
|
45
|
+
if (isStale(lockPath, staleMs)) {
|
|
46
|
+
(0, node_fs_1.rmSync)(lockPath, { force: true });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (Date.now() >= deadline) {
|
|
50
|
+
throw new errors_1.CliError("CREDENTIAL_LOCK_TIMEOUT", `Another ecomweb command is holding ${lockPath}`, errors_1.ExitCode.ERROR, {
|
|
51
|
+
hint: `If no other ecomweb command is running, delete ${lockPath}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
await new Promise((r) => setTimeout(r, pollMs));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
(0, node_fs_1.writeSync)(fd, `${process.pid} ${new Date().toISOString()} ${token}\n`);
|
|
59
|
+
return await fn();
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
(0, node_fs_1.closeSync)(fd);
|
|
63
|
+
release(lockPath, token);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=file-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../src/lib/file-lock.ts"],"names":[],"mappings":";;;;;AAoCA,oCA2CC;AA/ED,6CAA0C;AAC1C,qCAAoG;AACpG,0DAA6B;AAC7B,qCAA8C;AAS9C,SAAS,OAAO,CAAC,QAAgB,EAAE,OAAe;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAA,kBAAQ,EAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAGD,SAAS,OAAO,CAAC,QAAgB,EAAE,KAAa;IAC9C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,IAAA,sBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,IAAA,gBAAM,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAOM,KAAK,UAAU,YAAY,CAAI,QAAgB,EAAE,EAAoB,EAAE,OAAwB,EAAE;IACtG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAClC,IAAA,mBAAS,EAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAGpE,MAAM,KAAK,GAAG,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,EAAsB,CAAC;IAC3B,OAAO,EAAE,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,EAAE,GAAG,IAAA,kBAAQ,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;YACpE,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC/B,IAAA,gBAAM,EAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClC,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,iBAAQ,CAAC,yBAAyB,EAAE,sCAAsC,QAAQ,EAAE,EAAE,iBAAQ,CAAC,KAAK,EAAE;oBAC9G,IAAI,EAAE,kDAAkD,QAAQ,EAAE;iBACnE,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,IAAA,mBAAS,EAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC;QACvE,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,IAAA,mBAAS,EAAC,EAAE,CAAC,CAAC;QASd,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CliError } from "./errors";
|
|
2
|
+
export declare function isInteractive(): boolean;
|
|
3
|
+
export declare const promptCancelled: (error: unknown) => boolean;
|
|
4
|
+
export interface LiveConfirm {
|
|
5
|
+
yes: boolean;
|
|
6
|
+
question: string;
|
|
7
|
+
required: string;
|
|
8
|
+
retry: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function confirmationRequired(message: string, retry: string): CliError;
|
|
11
|
+
export declare function confirmLiveChange(opts: LiveConfirm): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.promptCancelled = void 0;
|
|
4
|
+
exports.isInteractive = isInteractive;
|
|
5
|
+
exports.confirmationRequired = confirmationRequired;
|
|
6
|
+
exports.confirmLiveChange = confirmLiveChange;
|
|
7
|
+
const prompts_1 = require("@inquirer/prompts");
|
|
8
|
+
const errors_1 = require("./errors");
|
|
9
|
+
function isInteractive() {
|
|
10
|
+
return Boolean(process.stdin.isTTY && process.stderr.isTTY) && !process.env.CI;
|
|
11
|
+
}
|
|
12
|
+
const promptCancelled = (error) => error instanceof Error && (error.name === "ExitPromptError" || error.name === "AbortPromptError");
|
|
13
|
+
exports.promptCancelled = promptCancelled;
|
|
14
|
+
function confirmationRequired(message, retry) {
|
|
15
|
+
return new errors_1.CliError("CONFIRMATION_REQUIRED", message, errors_1.ExitCode.VALIDATION, { hint: retry });
|
|
16
|
+
}
|
|
17
|
+
async function confirmLiveChange(opts) {
|
|
18
|
+
if (opts.yes)
|
|
19
|
+
return;
|
|
20
|
+
if (!isInteractive())
|
|
21
|
+
throw confirmationRequired(opts.required, opts.retry);
|
|
22
|
+
let ok = false;
|
|
23
|
+
try {
|
|
24
|
+
ok = await (0, prompts_1.confirm)({ message: opts.question, default: false }, { output: process.stderr });
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (!(0, exports.promptCancelled)(error))
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
if (!ok) {
|
|
31
|
+
throw new errors_1.CliError("CANCELLED", "Nothing changed: the shop is as it was.", errors_1.ExitCode.ERROR, { hint: opts.retry });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=live-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-confirm.js","sourceRoot":"","sources":["../../src/lib/live-confirm.ts"],"names":[],"mappings":";;;AAIA,sCAEC;AAkBD,oDAEC;AAOD,8CAaC;AA9CD,+CAA4C;AAC5C,qCAA8C;AAG9C,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACjF,CAAC;AAGM,MAAM,eAAe,GAAG,CAAC,KAAc,EAAE,EAAE,CAChD,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;AADvF,QAAA,eAAe,mBACwE;AAcpG,SAAgB,oBAAoB,CAAC,OAAe,EAAE,KAAa;IACjE,OAAO,IAAI,iBAAQ,CAAC,uBAAuB,EAAE,OAAO,EAAE,iBAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9F,CAAC;AAOM,KAAK,UAAU,iBAAiB,CAAC,IAAiB;IACvD,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO;IACrB,IAAI,CAAC,aAAa,EAAE;QAAE,MAAM,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,CAAC;QAEH,EAAE,GAAG,MAAM,IAAA,iBAAO,EAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,IAAA,uBAAe,EAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,iBAAQ,CAAC,WAAW,EAAE,yCAAyC,EAAE,iBAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type SpawnLike = (command: string, args: string[], options: {
|
|
2
|
+
detached: boolean;
|
|
3
|
+
stdio: "ignore";
|
|
4
|
+
}) => {
|
|
5
|
+
on(event: "error", listener: () => void): unknown;
|
|
6
|
+
unref(): void;
|
|
7
|
+
};
|
|
8
|
+
export declare function openBrowser(url: string, deps?: {
|
|
9
|
+
platform?: NodeJS.Platform;
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
spawn?: SpawnLike;
|
|
12
|
+
}): boolean;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openBrowser = openBrowser;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
function openBrowser(url, deps = {}) {
|
|
6
|
+
const platform = deps.platform ?? process.platform;
|
|
7
|
+
const env = deps.env ?? process.env;
|
|
8
|
+
const spawn = deps.spawn ?? node_child_process_1.spawn;
|
|
9
|
+
if (env.ECOMWEB_NO_BROWSER)
|
|
10
|
+
return false;
|
|
11
|
+
if (!/^https?:\/\//i.test(url))
|
|
12
|
+
return false;
|
|
13
|
+
if (platform === "win32" && /[&|^<>"%\s]/.test(url))
|
|
14
|
+
return false;
|
|
15
|
+
let command;
|
|
16
|
+
let args;
|
|
17
|
+
if (platform === "darwin") {
|
|
18
|
+
[command, args] = ["open", [url]];
|
|
19
|
+
}
|
|
20
|
+
else if (platform === "win32") {
|
|
21
|
+
[command, args] = ["cmd", ["/c", "start", "", url]];
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
if (!env.DISPLAY && !env.WAYLAND_DISPLAY)
|
|
25
|
+
return false;
|
|
26
|
+
[command, args] = ["xdg-open", [url]];
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const child = spawn(command, args, { detached: true, stdio: "ignore" });
|
|
30
|
+
child.on("error", () => { });
|
|
31
|
+
child.unref();
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=open-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.js","sourceRoot":"","sources":["../../src/lib/open-browser.ts"],"names":[],"mappings":";;AAaA,kCAgCC;AA7CD,2DAAwD;AAaxD,SAAgB,WAAW,CACzB,GAAW,EACX,OAAmF,EAAE;IAErF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAK,0BAAkC,CAAC;IAChE,IAAI,GAAG,CAAC,kBAAkB;QAAE,OAAO,KAAK,CAAC;IAIzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,QAAQ,KAAK,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAElE,IAAI,OAAe,CAAC;IACpB,IAAI,IAAc,CAAC;IACnB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QACvD,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PendingLogin } from "./device-login";
|
|
2
|
+
export declare const PENDING_REUSE_MARGIN_MS = 30000;
|
|
3
|
+
export declare function writePending(dir: string, profile: string, pending: PendingLogin): void;
|
|
4
|
+
export declare function deletePending(dir: string, profile: string): void;
|
|
5
|
+
export declare function readPending(dir: string, profile: string, apiUrl: string, now: number): PendingLogin | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PENDING_REUSE_MARGIN_MS = void 0;
|
|
7
|
+
exports.writePending = writePending;
|
|
8
|
+
exports.deletePending = deletePending;
|
|
9
|
+
exports.readPending = readPending;
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const secure_file_1 = require("./secure-file");
|
|
13
|
+
exports.PENDING_REUSE_MARGIN_MS = 30_000;
|
|
14
|
+
const pendingPath = (dir, profile) => node_path_1.default.join(dir, `${profile}.pending.json`);
|
|
15
|
+
function writePending(dir, profile, pending) {
|
|
16
|
+
(0, secure_file_1.writePrivateFile)(pendingPath(dir, profile), JSON.stringify(pending));
|
|
17
|
+
}
|
|
18
|
+
function deletePending(dir, profile) {
|
|
19
|
+
(0, node_fs_1.rmSync)(pendingPath(dir, profile), { force: true });
|
|
20
|
+
}
|
|
21
|
+
function readPending(dir, profile, apiUrl, now) {
|
|
22
|
+
let pending;
|
|
23
|
+
try {
|
|
24
|
+
pending = JSON.parse((0, node_fs_1.readFileSync)(pendingPath(dir, profile), "utf8"));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
if (typeof pending?.device_code !== "string" ||
|
|
30
|
+
!Number.isFinite(pending.expires_at) ||
|
|
31
|
+
!Number.isFinite(pending.interval) ||
|
|
32
|
+
pending.api_url !== apiUrl ||
|
|
33
|
+
pending.expires_at - now < exports.PENDING_REUSE_MARGIN_MS) {
|
|
34
|
+
deletePending(dir, profile);
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return pending;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=pending-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-login.js","sourceRoot":"","sources":["../../src/lib/pending-login.ts"],"names":[],"mappings":";;;;;;AAUA,oCAEC;AAED,sCAEC;AAMD,kCAkBC;AAxCD,qCAA+C;AAC/C,0DAA6B;AAE7B,+CAAiD;AAGpC,QAAA,uBAAuB,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,OAAe,EAAE,EAAE,CAAC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,eAAe,CAAC,CAAC;AAEhG,SAAgB,YAAY,CAAC,GAAW,EAAE,OAAe,EAAE,OAAqB;IAC9E,IAAA,8BAAgB,EAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW,EAAE,OAAe;IACxD,IAAA,gBAAM,EAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAMD,SAAgB,WAAW,CAAC,GAAW,EAAE,OAAe,EAAE,MAAc,EAAE,GAAW;IACnF,IAAI,OAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,OAAO,OAAO,EAAE,WAAW,KAAK,QAAQ;QACxC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;QACpC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;QAClC,OAAO,CAAC,OAAO,KAAK,MAAM;QAC1B,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,+BAAuB,EAClD,CAAC;QACD,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { type StdioOptions } from "node:child_process";
|
|
|
2
2
|
export declare const CHILD_STDIO: StdioOptions;
|
|
3
3
|
export declare function projectStoreRef(dir: string): string | undefined;
|
|
4
4
|
export declare function projectStoreThemeId(dir: string): string | undefined;
|
|
5
|
+
export declare function writeProjectStoreThemeId(dir: string, id: string, storeRef?: string): void;
|
|
5
6
|
export type RunCommand = (cmd: string, args: string[], cwd: string) => {
|
|
6
7
|
status: number | null;
|
|
7
8
|
error?: Error;
|