@flourish/sdk 3.17.3 → 3.20.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/lib/cmd/login.js CHANGED
@@ -7,7 +7,7 @@ var readline = require("readline"),
7
7
  log = require("../log"),
8
8
  sdk = require("../sdk");
9
9
 
10
- function login(args, server_opts) {
10
+ exports.command = function login(args) {
11
11
  function getEmail() {
12
12
  return new Promise(function(resolve, reject) {
13
13
  // If an email address was given on the command-line, use that
@@ -35,14 +35,14 @@ function login(args, server_opts) {
35
35
  }
36
36
 
37
37
  function login(email, password) {
38
- return sdk.request(server_opts, "user/login", { email: email, password: password })
38
+ return sdk.request(args, "user/login", { email: email, password: password })
39
39
  .then((response) => {
40
40
  const sdk_token = response.sdk_token || response.api_token;
41
41
  if (!sdk_token) {
42
42
  log.die("Unexpected response from server", JSON.stringify(response));
43
43
  }
44
44
 
45
- sdk.setSdkToken(server_opts, sdk_token)
45
+ sdk.setSdkToken(args, sdk_token)
46
46
  .then(() => log.victory("Logged in as " + email))
47
47
  .catch((error) => log.die("Failed to save SDK token", error.message));
48
48
  });
@@ -52,9 +52,9 @@ function login(args, server_opts) {
52
52
  .then((email) => Promise.all([email, getPassword()]))
53
53
  .then(([email, password]) => login(email, password))
54
54
  .catch((error) => log.die("Unexpected error", error.message, error.stack));
55
- }
55
+ };
56
56
 
57
- login.help = `
57
+ exports.help = `
58
58
  flourish login [email_address]
59
59
 
60
60
  Log in to Flourish. You will be prompted for a password.
@@ -65,5 +65,3 @@ When you have logged in successfully, your access token will be recorded
65
65
  in the file .flourish_sdk in your HOME or USERPROFILE directory. Subsequent
66
66
  flourish commands will use this token to authenticate with the server.
67
67
  `;
68
-
69
- module.exports = login;
package/lib/cmd/logout.js CHANGED
@@ -3,17 +3,15 @@
3
3
  var log = require("../log"),
4
4
  sdk = require("../sdk");
5
5
 
6
- function logout() {
6
+ exports.command = function logout() {
7
7
  sdk.deleteSdkTokens()
8
8
  .then(() => log.victory("Deleted all SDK tokens"))
9
9
  .catch((error) => log.die(error));
10
- }
10
+ };
11
11
 
12
- logout.help = `
12
+ exports.help = `
13
13
  flourish logout
14
14
 
15
15
  Deletes the .flourish_sdk file from your HOME or USERPROFILE directory. You
16
16
  will not be able to communicate with the server until you “flourish login”
17
17
  `;
18
-
19
- module.exports = logout;
package/lib/cmd/new.js CHANGED
@@ -7,7 +7,7 @@ var cross_spawn = require("cross-spawn"),
7
7
 
8
8
  log = require("../log");
9
9
 
10
- function _new(args) {
10
+ exports.command = function _new(args) {
11
11
  const new_template_path = args._[1];
12
12
  if (!new_template_path) {
13
13
  log.die("Please specify a directory name for the new template. E.g. flourish new my_template");
@@ -46,9 +46,9 @@ function _new(args) {
46
46
  "Try running it by hand");
47
47
  }
48
48
  });
49
- }
49
+ };
50
50
 
51
- _new.help = `
51
+ exports.help = `
52
52
  flourish new directory_name
53
53
 
54
54
  Creates a new skeleton Flourish template in the named directory,
@@ -58,5 +58,3 @@ The skeleton template has an example build configuration that uses
58
58
  Less to compile stylesheets and Rollup to bundle JavaScript code.
59
59
  You can run it in the SDK using “flourish run”.
60
60
  `;
61
-
62
- module.exports = _new;
@@ -48,6 +48,7 @@ function zipUpTemplate(template_dir, config) {
48
48
  categories: config.categories,
49
49
  joinable_data: config.joinable_data,
50
50
  tour: JSON.stringify(config.tour),
51
+ is_premium: config.is_premium,
51
52
  }), { name: "metadata.json" });
52
53
  if (config.settings) zip.append(JSON.stringify(config.settings), { name: "settings.js" });
53
54
  if (config.data) zip.append(JSON.stringify(config.data), { name: "data.json" });
@@ -110,7 +111,7 @@ async function uploadTemplate(server_opts, template_id, external_version, zip_fi
110
111
  return sdk.request(server_opts, "template/publish", body);
111
112
  }
112
113
 
113
- function publish(args, server_opts) {
114
+ exports.command = function publish(args) {
114
115
  const template_dir = args._[1] || ".";
115
116
 
116
117
  (args.build ? sdk.buildTemplate(template_dir, "production", "publish") : Promise.resolve())
@@ -139,11 +140,11 @@ function publish(args, server_opts) {
139
140
  log.success("Preparing template with id " + template_id + " for upload.");
140
141
 
141
142
  return zipUpTemplate(template_dir, config)
142
- .then((zip_filename) => uploadTemplate(server_opts, template_id, external_version, zip_filename))
143
- .then(() => sdk.request(server_opts, "user/whoami", {}))
143
+ .then((zip_filename) => uploadTemplate(args, template_id, external_version, zip_filename))
144
+ .then(() => sdk.request(args, "user/whoami", {}))
144
145
  .then((user_info) => {
145
146
  let protocol = "https";
146
- if (server_opts.host.match(/^(localhost|127\.0\.0\.1|.*\.local)(:\d+)?$/)) {
147
+ if (args.host.match(/^(localhost|127\.0\.0\.1|.*\.local)(:\d+)?$/)) {
147
148
  protocol = "http";
148
149
  }
149
150
 
@@ -156,12 +157,12 @@ function publish(args, server_opts) {
156
157
  }
157
158
  if (!external_version) {
158
159
  log.victory("Upload successful!",
159
- `Your template is available at ${protocol}://${server_opts.host}/@${template_path}`);
160
+ `Your template is available at ${protocol}://${args.host}/@${template_path}`);
160
161
  }
161
162
  else {
162
163
  const dt = new Date();
163
164
  log.victory(`Uploaded version ${external_version} on ${dt.toDateString()} at ${dt.toTimeString()}`,
164
- `Your template is available at ${protocol}://${server_opts.host}/@${template_path}/${external_version}`);
165
+ `Your template is available at ${protocol}://${args.host}/@${template_path}/${external_version}`);
165
166
  }
166
167
  warnings.forEach(warning => log.warn(warning));
167
168
  });
@@ -170,9 +171,9 @@ function publish(args, server_opts) {
170
171
  if (args.debug) log.die("Failed to upload template", error.message, error.stack);
171
172
  else log.die("Failed to upload template", error.message);
172
173
  });
173
- }
174
+ };
174
175
 
175
- publish.help = `
176
+ exports.help = `
176
177
  flourish publish [--patch] [--prerelease] [--release] [directory_name]
177
178
 
178
179
  Build and publish the template in the named directory, or in the current
@@ -192,5 +193,3 @@ Options:
192
193
  --release
193
194
  Remove the prerelease tag before publishing.
194
195
  `;
195
-
196
- module.exports = publish;
@@ -7,7 +7,7 @@ var readline = require("readline"),
7
7
  log = require("../log"),
8
8
  sdk = require("../sdk");
9
9
 
10
- function register(args, server_opts) {
10
+ exports.command = function register(args) {
11
11
  const questions = [
12
12
  { text: "Username: ", prop: "username" },
13
13
  { text: "Name: ", prop: "display_name" },
@@ -96,7 +96,7 @@ function register(args, server_opts) {
96
96
  }
97
97
 
98
98
  function register(answers) {
99
- return sdk.request(server_opts, "user/register", answers)
99
+ return sdk.request(args, "user/register", answers)
100
100
  .then((response) => {
101
101
  const sdk_token = response.sdk_token || response.api_token;
102
102
  if (!sdk_token) {
@@ -110,13 +110,13 @@ function register(args, server_opts) {
110
110
  .then((answers) => Promise.all([answers, getPassword()]))
111
111
  .then(([answers, password]) => Promise.all([answers, password, agreeTerms()]))
112
112
  .then(([answers, password, _]) => register(Object.assign(answers, { password })))
113
- .then((sdk_token) => sdk.setSdkToken(server_opts, sdk_token))
113
+ .then((sdk_token) => sdk.setSdkToken(args, sdk_token))
114
114
 
115
115
  .then(() => log.victory("Account registered successfully!"))
116
116
  .catch((error) => log.die(error.message));
117
- }
117
+ };
118
118
 
119
- register.help = `
119
+ exports.help = `
120
120
  flourish register
121
121
 
122
122
  Prompt for information and register an account with Flourish.
@@ -125,5 +125,3 @@ You will automatically be logged in to your new account.
125
125
  This account can be used on https://flourish.studio/ as well
126
126
  as in the SDK.
127
127
  `;
128
-
129
- module.exports = register;
package/lib/cmd/run.js CHANGED
@@ -8,7 +8,7 @@ var fs = require("fs"),
8
8
 
9
9
  server = require("../../server");
10
10
 
11
- function run(args) {
11
+ exports.command = function run(args) {
12
12
  const template_dir = args._[1] || ".";
13
13
  const port = +args.port;
14
14
 
@@ -61,9 +61,9 @@ function run(args) {
61
61
  });
62
62
  }
63
63
  });
64
- }
64
+ };
65
65
 
66
- run.help = `
66
+ exports.help = `
67
67
  flourish run [-o|--open] [--no-build] [--port=1685] [directory_name]
68
68
 
69
69
  Builds the template and runs the SDK server. If directory_name is omitted it
@@ -88,5 +88,3 @@ Options:
88
88
  --no-build
89
89
  Skip the build process
90
90
  `;
91
-
92
- module.exports = run;
@@ -48,7 +48,7 @@ function deleteIfExists(file_path) {
48
48
  });
49
49
  }
50
50
 
51
- function upgrade(template_dir) {
51
+ exports.upgrade = function upgrade(template_dir) {
52
52
  function loadSettings() {
53
53
  return loadFile([template_dir, "settings.js"], {})
54
54
  .then((contents) => {
@@ -78,16 +78,15 @@ function upgrade(template_dir) {
78
78
  return Promise.all([
79
79
  loadMetadata(),
80
80
  loadSettings(),
81
- loadTemplateDataBindings(),
82
- sdk.getSDKMajorVersion(),
81
+ loadTemplateDataBindings()
83
82
  ])
84
- .then(([metadata, settings, data_bindings, sdk_version]) => {
83
+ .then(([metadata, settings, data_bindings]) => {
85
84
  const o = {
86
85
  id: metadata.id,
87
86
  name: metadata.name,
88
87
  author: metadata.author,
89
88
 
90
- sdk_version,
89
+ sdk_version: sdk.SDK_MAJOR_VERSION,
91
90
 
92
91
  settings: settings
93
92
  };
@@ -127,7 +126,6 @@ function upgrade(template_dir) {
127
126
  .then(() => resolve(true), reject);
128
127
  });
129
128
  });
130
- }
129
+ };
131
130
 
132
- upgrade.title = "Convert configuration files to YAML format";
133
- module.exports = upgrade;
131
+ exports.title = "Convert configuration files to YAML format";
@@ -15,7 +15,7 @@ function convert(html) {
15
15
  });
16
16
  }
17
17
 
18
- function upgrade(template_dir) {
18
+ exports.upgrade = function upgrade(template_dir) {
19
19
  return new Promise(function(resolve, reject) {
20
20
  fs.stat(template_dir, function(error, stat) {
21
21
  if (error) reject(new Error(`Could not access ${template_dir}: ${error.message}`));
@@ -38,7 +38,6 @@ function upgrade(template_dir) {
38
38
  });
39
39
  });
40
40
  });
41
- }
41
+ };
42
42
 
43
- upgrade.title = "Convert index.html to mustache-free format";
44
- module.exports = upgrade;
43
+ exports.title = "Convert index.html to mustache-free format";
@@ -15,7 +15,7 @@ function addBuildRules(config) {
15
15
  return config;
16
16
  }
17
17
 
18
- function upgrade(template_dir) {
18
+ exports.upgrade = function upgrade(template_dir) {
19
19
  return new Promise(function(resolve, reject) {
20
20
  fs.stat(template_dir, function(error, stat) {
21
21
  if (error) reject(new Error(`Could not access ${template_dir}: ${error.message}`));
@@ -30,7 +30,6 @@ function upgrade(template_dir) {
30
30
  .then(resolve, reject);
31
31
  });
32
32
  });
33
- }
33
+ };
34
34
 
35
- upgrade.title = "Add build rules to template.yml";
36
- module.exports = upgrade;
35
+ exports.title = "Add build rules to template.yml";
@@ -3,7 +3,7 @@
3
3
  var fs = require("fs"),
4
4
  sdk = require("../../sdk");
5
5
 
6
- function upgrade(template_dir) {
6
+ exports.upgrade = function upgrade(template_dir) {
7
7
  return new Promise(function(resolve, reject) {
8
8
  fs.stat(template_dir, function(error, stat) {
9
9
  if (error) return reject(new Error(`Could not access ${template_dir}: ${error.message}`));
@@ -20,7 +20,6 @@ function upgrade(template_dir) {
20
20
  .then(resolve, reject);
21
21
  });
22
22
  });
23
- }
23
+ };
24
24
 
25
- upgrade.title = "Remove autoheight config from template.yml";
26
- module.exports = upgrade;
25
+ exports.title = "Remove autoheight config from template.yml";
@@ -9,8 +9,8 @@ const upgrades = [
9
9
  require("./4-remove-autoheight-config"),
10
10
  ];
11
11
 
12
- function runUpgrade(upgrade, template_dir) {
13
- log.info("Running: " + upgrade.title);
12
+ function runUpgrade({ upgrade, title }, template_dir) {
13
+ log.info("Running: " + title);
14
14
 
15
15
  return upgrade(template_dir)
16
16
  .then((upgraded) => {
@@ -34,7 +34,7 @@ function runUpgrades(template_dir, num_run=0) {
34
34
  .then(() => runUpgrades(template_dir, num_run));
35
35
  }
36
36
 
37
- function upgrade(args) {
37
+ exports.command = function upgrade(args) {
38
38
  const template_dir = args._[1] || ".";
39
39
  runUpgrades(template_dir)
40
40
  .then((num_upgrades) => {
@@ -47,9 +47,9 @@ function upgrade(args) {
47
47
  if (args.debug) log.problem("Upgrade failed", error.message, error.stack);
48
48
  else log.problem("Upgrade failed", error.message);
49
49
  });
50
- }
50
+ };
51
51
 
52
- upgrade.help = `
52
+ exports.help = `
53
53
  flourish upgrade [template_directory]
54
54
 
55
55
  Upgrade the template in template_directory, or in the current directory if no
@@ -58,5 +58,3 @@ Flourish.
58
58
 
59
59
  This is only needed when incompatible changes have been made to Flourish.
60
60
  `;
61
-
62
- module.exports = upgrade;
@@ -1,19 +1,11 @@
1
1
  "use strict";
2
2
 
3
- var log = require("../log"),
4
- sdk = require("../sdk");
3
+ var sdk = require("../sdk");
5
4
 
6
- function version(args) {
7
- sdk.getSdkVersion()
8
- .then((version_number) => console.log(version_number))
9
- .catch((error) => {
10
- if (args.debug) log.die("Failed to get SDK version number", error.message, error.stack);
11
- else log.die("Failed to get SDK version number", error.message);
12
- });
13
- }
5
+ exports.command = function version() {
6
+ console.log(sdk.SDK_VERSION);
7
+ };
14
8
 
15
- version.help = `
9
+ exports.help = `
16
10
  Prints the version number of the Flourish SDK.
17
11
  `;
18
-
19
- module.exports = version;
package/lib/cmd/whoami.js CHANGED
@@ -3,8 +3,8 @@
3
3
  var log = require("../log"),
4
4
  sdk = require("../sdk");
5
5
 
6
- function whoami(args, server_opts) {
7
- sdk.request(server_opts, "user/whoami", {})
6
+ exports.command = function whoami(args) {
7
+ sdk.request(args, "user/whoami", {})
8
8
  .then((user_info) => {
9
9
  if (args.full) {
10
10
  console.log(JSON.stringify(user_info, null, 4));
@@ -14,14 +14,12 @@ function whoami(args, server_opts) {
14
14
  }
15
15
  })
16
16
  .catch((error) => log.die("Unexpected error", error.message, error.stack));
17
- }
17
+ };
18
18
 
19
- whoami.help = `
19
+ exports.help = `
20
20
  flourish [--full] whoami
21
21
 
22
22
  With no options, prints the username of the currently logged-in account.
23
23
 
24
24
  With the --full option, prints all the account metadata in JSON format.
25
25
  `;
26
-
27
- module.exports = whoami;
package/lib/sdk.js CHANGED
@@ -19,27 +19,8 @@ const fs = require("fs"),
19
19
  const sdk_tokens_file = path.join(process.env.HOME || process.env.USERPROFILE, ".flourish_sdk");
20
20
 
21
21
  const YAML_DUMP_OPTS = { flowLevel: 4 };
22
-
23
- const package_json_filename = path.join(__dirname, "..", "package.json");
24
- var sdk_version = null;
25
- function getSdkVersion() {
26
- if (sdk_version) return Promise.resolve(sdk_version);
27
- return new Promise(function(resolve, reject) {
28
- fs.readFile(package_json_filename, "utf8", function(error, package_json) {
29
- if (error) return reject(error);
30
- const package_object = JSON.parse(package_json);
31
- resolve(sdk_version = package_object.version);
32
- });
33
- });
34
- }
35
-
36
- function getSDKMajorVersion() {
37
- return getSdkVersion()
38
- .then((sdk_version) => {
39
- const version_tuple = sdk_version.split(".").map((x) => parseInt(x));
40
- return version_tuple[0];
41
- });
42
- }
22
+ const SDK_VERSION = require("../package.json").version;
23
+ const SDK_MAJOR_VERSION = semver.parse(SDK_VERSION)[0];
43
24
 
44
25
  function getSdkToken(server_opts) {
45
26
  return new Promise(function(resolve, reject) {
@@ -110,7 +91,6 @@ async function request(server_opts, method, data) {
110
91
  }
111
92
  }
112
93
 
113
- const sdk_version = await getSdkVersion();
114
94
  const protocol = server_opts.host.match(/^(localhost|127\.0\.0\.1|.*\.local)(:\d+)?$/) ? "http:" : "https:";
115
95
  const url = `${protocol}//${server_opts.host}/api/v1/${method}`;
116
96
  const options = { method: data ? "POST" : "GET" };
@@ -120,12 +100,12 @@ async function request(server_opts, method, data) {
120
100
  if (sdk_token) {
121
101
  data.append("sdk_token", sdk_token);
122
102
  }
123
- data.append("sdk_version", sdk_version);
103
+ data.append("sdk_version", SDK_VERSION);
124
104
  options.headers = data.getHeaders();
125
105
  options.body = data;
126
106
  }
127
107
  else {
128
- options.body = JSON.stringify({ ...data, sdk_token, sdk_version });
108
+ options.body = JSON.stringify({ ...data, sdk_token, sdk_version: SDK_VERSION });
129
109
  options.headers = { "content-type": "application/json" };
130
110
  }
131
111
  }
@@ -345,33 +325,45 @@ async function resolveImports(config, template_dir) {
345
325
  qualifyNames(imported_settings, setting.property);
346
326
  if ("overrides" in setting) {
347
327
  setting.overrides.forEach(function(override) {
348
- const properties = Array.isArray(override.property) ? override.property : [override.property];
328
+ const use_tags = override.tag;
329
+ let settings_to_target = [];
330
+ if (use_tags) settings_to_target = Array.isArray(override.tag) ? override.tag : [override.tag];
331
+ else settings_to_target = Array.isArray(override.property) ? override.property : [override.property];
349
332
  const method = override.method || "replace";
350
- for (let property of properties) {
351
- const s = imported_settings.find(function(setting) { return setting.property === property; });
352
- if (!s) continue;
333
+ for (let target of settings_to_target) {
334
+ const settings_to_override = imported_settings.filter(function(setting) {
335
+ if (use_tags) {
336
+ if (!setting.tag) return false;
337
+ const setting_tags = Array.isArray(setting.tag) ? setting.tag : [setting.tag];
338
+ return setting_tags.includes(target);
339
+ }
340
+ return setting.property === target;
341
+ });
342
+ if (!settings_to_override.length) continue;
353
343
  for (let name in override) {
354
- if (name === "property" || name === "method") continue;
355
- if (method === "extend") {
356
- if (["show_if", "hide_if"].includes(name) && typeof override[name] === "boolean") {
357
- throw new Error(`Cannot extend a ${name} with Boolean value for property ${s.property}`);
358
- }
359
- let extendee = s[name];
360
- if (extendee === undefined) {
361
- if (name === "show_if" && s.hide_if !== undefined) {
362
- throw new Error(`Cannot extend a show_if when hide_if defined for property ${s.property}`);
344
+ for (const s of settings_to_override) {
345
+ if (name === "property" || name === "tag" || name === "method") continue;
346
+ if (method === "extend") {
347
+ if (["show_if", "hide_if"].includes(name) && typeof override[name] === "boolean") {
348
+ throw new Error(`Cannot extend a ${name} with Boolean value for property ${s.property}`);
363
349
  }
364
- else if (name === "hide_if" && s.show_if !== undefined) {
365
- throw new Error(`Cannot extend a hide_if when show_if defined for property ${s.property}`);
350
+ let extendee = s[name];
351
+ if (extendee === undefined) {
352
+ if (name === "show_if" && s.hide_if !== undefined) {
353
+ throw new Error(`Cannot extend a show_if when hide_if defined for property ${s.property}`);
354
+ }
355
+ else if (name === "hide_if" && s.show_if !== undefined) {
356
+ throw new Error(`Cannot extend a hide_if when show_if defined for property ${s.property}`);
357
+ }
358
+ extendee = {};
366
359
  }
367
- extendee = {};
360
+ s[name] = extendItem(extendee, override[name]);
361
+ }
362
+ else {
363
+ s[name] = override[name];
364
+ if (name === "show_if" && s.hide_if) delete s.hide_if;
365
+ else if (name === "hide_if" && s.show_if) delete s.show_if;
368
366
  }
369
- s[name] = extendItem(extendee, override[name]);
370
- }
371
- else {
372
- s[name] = override[name];
373
- if (name === "show_if" && s.hide_if) delete s.hide_if;
374
- else if (name === "hide_if" && s.show_if) delete s.show_if;
375
367
  }
376
368
  }
377
369
  }
@@ -528,18 +520,15 @@ function writePackageJson(template_dir, json) {
528
520
  }
529
521
 
530
522
  function checkTemplateVersion(template_dir) {
531
- return Promise.all([
532
- readConfig(template_dir),
533
- getSDKMajorVersion(),
534
- ]).then(([config, sdk_major_version]) => {
523
+ return readConfig(template_dir).then(config => {
535
524
  const template_sdk_version = config.sdk_version;
536
525
  if (!template_sdk_version) {
537
526
  throw new Error("Template does not specify an sdk_version");
538
527
  }
539
- if (template_sdk_version < sdk_major_version) {
528
+ if (template_sdk_version < SDK_MAJOR_VERSION) {
540
529
  throw new Error("This template was built for an older version of Flourish. Try running 'flourish upgrade'");
541
530
  }
542
- if (template_sdk_version > sdk_major_version) {
531
+ if (template_sdk_version > SDK_MAJOR_VERSION) {
543
532
  throw new Error("This template was built for an newer version of Flourish than you have. Try updating the SDK.");
544
533
  }
545
534
  });
@@ -559,7 +548,7 @@ const TEMPLATE_SPECIAL = new Set([
559
548
  ]);
560
549
 
561
550
  module.exports = {
562
- checkTemplateVersion, getSdkVersion, getSDKMajorVersion,
551
+ checkTemplateVersion,
563
552
 
564
553
  getSdkToken, setSdkToken, deleteSdkTokens,
565
554
  request,
@@ -567,5 +556,5 @@ module.exports = {
567
556
  readConfig, readAndValidateConfig, writeConfig, buildRules,
568
557
  incrementPrereleaseTag, removePrereleaseTag, incrementPatchVersion,
569
558
 
570
- TEMPLATE_SPECIAL_FILES, TEMPLATE_SPECIAL_DIRECTORIES, TEMPLATE_SPECIAL,
559
+ TEMPLATE_SPECIAL_FILES, TEMPLATE_SPECIAL_DIRECTORIES, TEMPLATE_SPECIAL, SDK_VERSION, SDK_MAJOR_VERSION
571
560
  };