@haxtheweb/create 9.0.25 → 10.0.2

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/dist/create.js CHANGED
@@ -363,6 +363,11 @@ async function main() {
363
363
  results
364
364
  }) => {
365
365
  let themes = await (0, _site.siteThemeList)();
366
+ let custom = {
367
+ value: 'custom-theme',
368
+ label: 'Create Custom Theme'
369
+ };
370
+ themes.push(custom);
366
371
  if (results.type === "site" && !commandRun.options.theme) {
367
372
  // support having no theme but autoselecting
368
373
  if (commandRun.options.auto && commandRun.options.skip) {
@@ -377,6 +382,53 @@ async function main() {
377
382
  }
378
383
  }
379
384
  },
385
+ customName({
386
+ results
387
+ }) {
388
+ if (results.theme === "custom-theme") {
389
+ return p.text({
390
+ message: 'Theme Name:',
391
+ placeholder: results.theme,
392
+ required: false,
393
+ validate: value => {
394
+ if (!value) {
395
+ return "Name is required (tab writes default)";
396
+ }
397
+ if (/^\d/.test(value)) {
398
+ return "Name cannot start with a number";
399
+ }
400
+ if (value.indexOf(' ') !== -1) {
401
+ return "No spaces allowed in project name";
402
+ }
403
+ if (value.indexOf('-') === -1 && value.indexOf('-') !== 0 && value.indexOf('-') !== value.length - 1) {
404
+ return "Name must include at least one `-` and must not start or end name.";
405
+ }
406
+ }
407
+ });
408
+ }
409
+ },
410
+ customTemplate({
411
+ results
412
+ }) {
413
+ if (results.theme === "custom-theme") {
414
+ const options = [{
415
+ value: 'base',
416
+ label: 'Vanilla Theme with Hearty Documentation'
417
+ }, {
418
+ value: 'polaris-flex',
419
+ label: 'Minimalist Theme with Horizontal Nav'
420
+ }, {
421
+ value: 'polaris-sidebar',
422
+ label: 'Content-Focused Theme with Flexible Sidebar'
423
+ }];
424
+ return p.select({
425
+ message: 'Template:',
426
+ required: false,
427
+ options: options,
428
+ initialValue: `${results.theme}`
429
+ });
430
+ }
431
+ },
380
432
  extras: ({
381
433
  results
382
434
  }) => {
@@ -15,11 +15,13 @@ var _promises = require("node:timers/promises");
15
15
  var fs = _interopRequireWildcard(require("node:fs"));
16
16
  var path = _interopRequireWildcard(require("node:path"));
17
17
  var p = _interopRequireWildcard(require("@clack/prompts"));
18
+ var ejs = _interopRequireWildcard(require("ejs"));
18
19
  var _picocolors = _interopRequireDefault(require("picocolors"));
19
20
  var _jsYaml = require("js-yaml");
20
21
  var winston = _interopRequireWildcard(require("winston"));
21
22
  var _nodeHtmlParser = require("node-html-parser");
22
23
  var _statements = require("../statements.js");
24
+ var _utils = require("../utils.js");
23
25
  var _logging = require("../logging.js");
24
26
  var _microFrontendRegistry = require("../micro-frontend-registry.js");
25
27
  var haxcmsNodejsCli = _interopRequireWildcard(require("@haxtheweb/haxcms-nodejs/dist/cli.js"));
@@ -752,12 +754,12 @@ async function siteCommandDetected(commandRun) {
752
754
  initialValue: val,
753
755
  options: list
754
756
  });
755
- let themes = await HAXCMS.getThemes();
756
- if (themes && commandRun.options.theme && themes[commandRun.options.theme]) {
757
- activeHaxsite.manifest.metadata.theme = themes[commandRun.options.theme];
758
- activeHaxsite.manifest.save(false);
759
- recipe.log(siteLoggingName, (0, _logging.commandString)(commandRun));
760
- }
757
+ }
758
+ let themes = await HAXCMS.getThemes();
759
+ if (themes && commandRun.options.theme && themes[commandRun.options.theme]) {
760
+ activeHaxsite.manifest.metadata.theme = themes[commandRun.options.theme];
761
+ activeHaxsite.manifest.save(false);
762
+ recipe.log(siteLoggingName, (0, _logging.commandString)(commandRun));
761
763
  }
762
764
  } catch (e) {
763
765
  (0, _logging.log)(e.stderr);
@@ -909,6 +911,7 @@ async function siteCommandDetected(commandRun) {
909
911
  let recContents = await fs.readFileSync(commandRun.options.recipe, 'utf8');
910
912
  // split into commands
911
913
  let commandList = recContents.replaceAll('cli: ', '').split("\n");
914
+ let rootDir = '';
912
915
  // confirm each command or allow --y so that it auto applies
913
916
  for (var i in commandList) {
914
917
  // verify every command starts this way for safety
@@ -924,7 +927,23 @@ async function siteCommandDetected(commandRun) {
924
927
  }
925
928
  // confirmed; let's run!
926
929
  if (confirmation) {
927
- await exec(`${commandList[i]} --y --no-i --auto --quiet`);
930
+ let commandMatch = siteActions().filter(action => action.value === commandList[i].split(' ')[2]);
931
+ // if we found a command that means it is a valid command to run against the site
932
+ if (commandMatch.length > 0) {
933
+ await exec(`${commandList[i]} --y --no-i --auto --quiet${rootDir}`);
934
+ }
935
+ // 1st command won't match as the argument creates a new site
936
+ // but ensure we don't have a site context prior to running this
937
+ // or we'll get a site in a site with the same name which is not
938
+ // the desired result
939
+ else if (!(await hax.systemStructureContext())) {
940
+ await exec(`${commandList[i]} --y --no-i --auto --quiet --no-extras`);
941
+ // site will have been created, obtain the site name and set root so
942
+ // the other commands get piped into it correctly
943
+ rootDir = ` --root ${commandList[i].split(' ')[2]}`;
944
+ } else {
945
+ (0, _logging.log)('Did not run because we already have a site', 'warn');
946
+ }
928
947
  }
929
948
  }
930
949
  }
@@ -1191,6 +1210,13 @@ async function siteProcess(commandRun, project, port = '3000') {
1191
1210
  s.stop((0, _statements.merlinSays)(`${project.name} created!`));
1192
1211
  await (0, _promises.setTimeout)(500);
1193
1212
  }
1213
+
1214
+ // Write theme template to site/custom
1215
+ if (project.customName && project.customTemplate) {
1216
+ s.start((0, _statements.merlinSays)(`Creating new theme: ${project.customName}`));
1217
+ await customSiteTheme(commandRun, project);
1218
+ s.stop((0, _statements.merlinSays)(`${project.customName} theme created!`));
1219
+ }
1194
1220
  if (project.gitRepo && !commandRun.options.isMonorepo) {
1195
1221
  try {
1196
1222
  await exec(`cd ${project.path}/${project.name} && git init && git add -A && git commit -m "first commit" && git branch -M main${project.gitRepo ? ` && git remote add origin ${project.gitRepo}` : ''}`);
@@ -1254,6 +1280,43 @@ async function siteThemeList() {
1254
1280
  }
1255
1281
  return items;
1256
1282
  }
1283
+ async function customSiteTheme(commandRun, project) {
1284
+ project.className = (0, _utils.dashToCamel)(project.customName);
1285
+ var sitePath = `${project.path}/${project.name}`;
1286
+ const filePath = `${sitePath}/custom/src/${project.customName}.js`;
1287
+ if (project.customTemplate === "base") {
1288
+ await fs.copyFileSync(`${process.mainModule.path}/templates/sitetheme/base-theme.js`, `${sitePath}/custom/src/base-theme.js`);
1289
+ await fs.renameSync(`${sitePath}/custom/src/base-theme.js`, filePath);
1290
+ } else if (project.customTemplate === "polaris-flex") {
1291
+ await fs.copyFileSync(`${process.mainModule.path}/templates/sitetheme/flex-theme.js`, `${sitePath}/custom/src/flex-theme.js`);
1292
+ await fs.renameSync(`${sitePath}/custom/src/flex-theme.js`, filePath);
1293
+ } else if (project.customTemplate === "polaris-sidebar") {
1294
+ await fs.copyFileSync(`${process.mainModule.path}/templates/sitetheme/sidebar-theme.js`, `${sitePath}/custom/src/sidebar-theme.js`);
1295
+ await fs.renameSync(`${sitePath}/custom/src/sidebar-theme.js`, filePath);
1296
+ }
1297
+ try {
1298
+ // ensure we don't try to pattern rewrite image files
1299
+ if (!filePath.endsWith('.jpg') && !filePath.endsWith('.png')) {
1300
+ const ejsString = ejs.fileLoader(filePath, 'utf8');
1301
+ let content = ejs.render(ejsString, project);
1302
+ // file written successfully
1303
+ fs.writeFileSync(filePath, content);
1304
+ }
1305
+ } catch (err) {
1306
+ console.error(filePath);
1307
+ console.error(err);
1308
+ }
1309
+ await fs.appendFileSync(`${sitePath}/custom/src/custom.js`, `\n import "./${project.customName}.js"`);
1310
+ var activeHaxsite = await hax.systemStructureContext(sitePath);
1311
+ let themeObj = {
1312
+ element: project.customName,
1313
+ path: filePath,
1314
+ name: project.className
1315
+ };
1316
+ activeHaxsite.manifest.metadata.theme = themeObj;
1317
+ activeHaxsite.manifest.save(false);
1318
+ await exec(`cd ${sitePath}/custom/ && ${commandRun.options.npmClient} install && ${commandRun.options.npmClient} run build && cd ${sitePath}`);
1319
+ }
1257
1320
 
1258
1321
  // @fork of the hax core util for this so that we avoid api difference between real dom and parse nodejs dom
1259
1322
  async function nodeToHaxElement(node, eventName = "insert-element") {
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright <%= year %> <%= author %>
3
+ * @license Apache-2.0, see License.md for full text.
4
+ */
5
+ import { html, css, HAXCMSLitElementTheme } from "@haxtheweb/haxcms-elements/lib/core/HAXCMSLitElementTheme.js";
6
+
7
+ /**
8
+ * `<%= className %>`
9
+ * `<%= className %> based on modern flex design system`
10
+ * `This theme is an example of extending an existing theme component`
11
+ *
12
+ * @microcopy - language worth noting:
13
+ * - HAXcms - A headless content management system
14
+ * - HAXCMSTheme - A super class that provides correct baseline wiring to build a new theme
15
+ *
16
+ * @demo demo/index.html
17
+ * @element <%= customName %>
18
+ */
19
+ class <%= className %> extends HAXCMSLitElementTheme {
20
+ //styles function
21
+ static get styles() {
22
+ return [
23
+ super.styles,
24
+ css`
25
+ :host {
26
+ display: block;
27
+ }
28
+ `,
29
+ ];
30
+ }
31
+
32
+ /**
33
+ * Store the tag name to make it easier to obtain directly.
34
+ * @notice function name must be here for tooling to operate correctly
35
+ */
36
+ static get tag() {
37
+ return "<%= customName %>";
38
+ }
39
+
40
+ constructor() {
41
+ super();
42
+ }
43
+ }
44
+ customElements.define(<%= className %>.tag, <%= className %>);
45
+ export { <%= className %> };
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Copyright <%= year %> <%= author %>
3
+ * @license Apache-2.0, see License.md for full text.
4
+ */
5
+ import { html, css, HAXCMSLitElementTheme } from "@haxtheweb/haxcms-elements/lib/core/HAXCMSLitElementTheme.js";
6
+ import { PolarisFlexTheme } from "@haxtheweb/polaris-theme/lib/polaris-flex-theme";
7
+ import "@haxtheweb/haxcms-elements/lib/ui-components/blocks/site-children-block.js";
8
+
9
+ /**
10
+ * `<%= className %>`
11
+ * `<%= className %> based on modern flex design system`
12
+ * `This theme is an example of extending an existing theme component`
13
+ *
14
+ * @microcopy - language worth noting:
15
+ * - HAXcms - A headless content management system
16
+ * - HAXCMSTheme - A super class that provides correct baseline wiring to build a new theme
17
+ *
18
+ * @demo demo/index.html
19
+ * @element <%= customName %>
20
+ */
21
+ class <%= className %> extends PolarisFlexTheme {
22
+ //styles function
23
+ static get styles() {
24
+ return [
25
+ super.styles,
26
+ css`
27
+ :host {
28
+ display: block;
29
+ }
30
+ `,
31
+ ];
32
+ }
33
+
34
+ /**
35
+ * Overload methods for customization of slots from the base class
36
+ */
37
+ renderHeaderSlot() {
38
+ return html``
39
+ }
40
+
41
+ renderFooterContactInformation() {
42
+ return html``
43
+ }
44
+
45
+ renderFooterSecondarySlot() {
46
+ return html``
47
+ }
48
+
49
+ renderFooterPrimarySlot() {
50
+ return html``
51
+ }
52
+
53
+ /**
54
+ * Store the tag name to make it easier to obtain directly.
55
+ * @notice function name must be here for tooling to operate correctly
56
+ */
57
+ static get tag() {
58
+ return "<%= customName %>";
59
+ }
60
+
61
+ constructor() {
62
+ super();
63
+ }
64
+ }
65
+ customElements.define(<%= className %>.tag, <%= className %>);
66
+ export { <%= className %> };
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Copyright <%= year %> <%= author %>
3
+ * @license Apache-2.0, see License.md for full text.
4
+ */
5
+ import { html, css, HAXCMSLitElementTheme } from "@haxtheweb/haxcms-elements/lib/core/HAXCMSLitElementTheme.js";
6
+ import { PolarisFlexTheme } from "@haxtheweb/polaris-theme/lib/polaris-flex-theme";
7
+ import "@haxtheweb/haxcms-elements/lib/ui-components/blocks/site-children-block.js";
8
+
9
+ /**
10
+ * `<%= className %>`
11
+ * `<%= className %> based on modern flex design system`
12
+ * `This theme is an example of extending an existing theme component`
13
+ *
14
+ * @microcopy - language worth noting:
15
+ * - HAXcms - A headless content management system
16
+ * - HAXCMSTheme - A super class that provides correct baseline wiring to build a new theme
17
+ *
18
+ * @demo demo/index.html
19
+ * @element <%= customName %>
20
+ */
21
+ class <%= className %> extends PolarisFlexTheme {
22
+ //styles function
23
+ static get styles() {
24
+ return [
25
+ super.styles,
26
+ css`
27
+ :host {
28
+ display: block;
29
+ }
30
+ aside {
31
+ float: left;
32
+ width: 240px;
33
+ }
34
+ aside section h4 {
35
+ font-size: 16px;
36
+ margin: 0 0 24px 0;
37
+ text-transform: uppercase;
38
+ font-family: "Open Sans", sans-serif;
39
+ font-weight: 300;
40
+ }
41
+
42
+ aside section {
43
+ background-color: #fff;
44
+ border-radius: 3px;
45
+ margin-bottom: 40px;
46
+ padding: 0px 40px 40px 0px;
47
+ }
48
+
49
+ site-children-block {
50
+ --site-children-block-border-bottom: lightblue 1px solid;
51
+ --site-children-block-li-padding: 8px 0;
52
+ --site-children-block-link-hover-color: rgb(0, 95, 169);
53
+ --site-children-block-active-border-left: rgb(0, 95, 169) 3px solid;
54
+ --site-children-block-link-active-color: rgb(0, 30, 68);
55
+ font-family: "Roboto Condensed", sans-serif;
56
+ font-size: 16px;
57
+ }
58
+ `,
59
+ ];
60
+ }
61
+
62
+ /**
63
+ * Overload methods for customization of slots from the base class
64
+ */
65
+ renderHeaderSlot() {
66
+ return html``
67
+ }
68
+
69
+ renderSideBar() {
70
+ return html`
71
+ <aside
72
+ role="complementary"
73
+ aria-label="Primary Sidebar"
74
+ itemtype="http://schema.org/WPSideBar"
75
+ part="page-primary-sidebar"
76
+ >
77
+ <section>
78
+ <site-children-block
79
+ part="page-children-block"
80
+ dynamic-methodology="ancestor"
81
+ ></site-children-block>
82
+ </section>
83
+ </aside>
84
+ `
85
+ }
86
+
87
+ renderFooterContactInformation() {
88
+ return html``
89
+ }
90
+
91
+ renderFooterSecondarySlot() {
92
+ return html``
93
+ }
94
+
95
+ renderFooterPrimarySlot() {
96
+ return html``
97
+ }
98
+
99
+ /**
100
+ * Store the tag name to make it easier to obtain directly.
101
+ * @notice function name must be here for tooling to operate correctly
102
+ */
103
+ static get tag() {
104
+ return "<%= customName %>";
105
+ }
106
+
107
+ constructor() {
108
+ super();
109
+ }
110
+ }
111
+ customElements.define(<%= className %>.tag, <%= className %>);
112
+ export { <%= className %> };
@@ -28,8 +28,8 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "lit": "^3.2.1",
31
- "@haxtheweb/d-d-d": "^9.0.21",
32
- "@haxtheweb/i18n-manager": "^9.0.18"
31
+ "@haxtheweb/d-d-d": "^10.0.1",
32
+ "@haxtheweb/i18n-manager": "^10.0.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@babel/preset-env": "^7.16.4",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haxtheweb/create",
3
- "version": "9.0.25",
3
+ "version": "10.0.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -45,12 +45,12 @@
45
45
  "dependencies": {
46
46
  "@clack/core": "0.3.4",
47
47
  "@clack/prompts": "0.7.0",
48
- "@haxtheweb/haxcms-nodejs": "^9.0.20",
49
- "@haxtheweb/open-apis": "^9.0.12",
48
+ "@haxtheweb/haxcms-nodejs": "^10.0.1",
49
+ "@haxtheweb/open-apis": "^10.0.1",
50
50
  "commander": "12.1.0",
51
- "node-html-parser": "6.1.13",
52
51
  "ejs": "3.1.10",
53
52
  "js-yaml": "4.1.0",
53
+ "node-html-parser": "6.1.13",
54
54
  "picocolors": "1.0.1",
55
55
  "winston": "3.17.0"
56
56
  },