@sitecore-jss/sitecore-jss-dev-tools 22.0.0-canary.9 → 22.1.0-canary.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.
Files changed (52) hide show
  1. package/README.md +7 -2
  2. package/dist/cjs/index.js +2 -3
  3. package/dist/cjs/pipelines/runner.js +2 -2
  4. package/dist/cjs/templating/components.js +27 -0
  5. package/dist/cjs/templating/index.js +14 -0
  6. package/dist/cjs/templating/metadata.js +32 -0
  7. package/dist/cjs/templating/nextjs/component-props.loader.js +91 -0
  8. package/dist/cjs/templating/nextjs/generate-component-builder.js +72 -0
  9. package/dist/cjs/templating/nextjs/index.js +7 -0
  10. package/dist/cjs/templating/nextjs/templates/component-builder.js +59 -0
  11. package/dist/cjs/templating/plugins.js +78 -0
  12. package/dist/cjs/templating/react/generate-component-builder.js +64 -0
  13. package/dist/cjs/templating/react/index.js +7 -0
  14. package/dist/cjs/templating/react/templates/component-builder.js +49 -0
  15. package/dist/cjs/templating/scaffold.js +38 -0
  16. package/dist/cjs/templating/utils.js +56 -0
  17. package/dist/esm/index.js +1 -1
  18. package/dist/esm/pipelines/runner.js +2 -2
  19. package/dist/esm/templating/components.js +23 -0
  20. package/dist/esm/templating/index.js +5 -0
  21. package/dist/esm/templating/metadata.js +25 -0
  22. package/dist/esm/templating/nextjs/component-props.loader.js +65 -0
  23. package/dist/esm/templating/nextjs/generate-component-builder.js +63 -0
  24. package/dist/esm/templating/nextjs/index.js +2 -0
  25. package/dist/esm/templating/nextjs/templates/component-builder.js +55 -0
  26. package/dist/esm/templating/plugins.js +70 -0
  27. package/dist/esm/templating/react/generate-component-builder.js +55 -0
  28. package/dist/esm/templating/react/index.js +2 -0
  29. package/dist/esm/templating/react/templates/component-builder.js +42 -0
  30. package/dist/esm/templating/scaffold.js +30 -0
  31. package/dist/esm/templating/utils.js +48 -0
  32. package/nextjs-component-props-loader.d.ts +1 -0
  33. package/nextjs-component-props-loader.js +3 -0
  34. package/nextjs.d.ts +1 -0
  35. package/nextjs.js +3 -0
  36. package/package.json +12 -8
  37. package/react.d.ts +1 -0
  38. package/react.js +3 -0
  39. package/types/index.d.ts +2 -1
  40. package/types/templating/components.d.ts +29 -0
  41. package/types/templating/index.d.ts +5 -0
  42. package/types/templating/metadata.d.ts +5 -0
  43. package/types/templating/nextjs/component-props.loader.d.ts +7 -0
  44. package/types/templating/nextjs/generate-component-builder.d.ts +45 -0
  45. package/types/templating/nextjs/index.d.ts +2 -0
  46. package/types/templating/nextjs/templates/component-builder.d.ts +7 -0
  47. package/types/templating/plugins.d.ts +67 -0
  48. package/types/templating/react/generate-component-builder.d.ts +39 -0
  49. package/types/templating/react/index.d.ts +2 -0
  50. package/types/templating/react/templates/component-builder.d.ts +8 -0
  51. package/types/templating/scaffold.d.ts +15 -0
  52. package/types/templating/utils.d.ts +38 -0
package/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  This module is provided as a part of Sitecore JavaScript Rendering SDK (JSS). It contains developer tooling, such as development proxies and deployment scripts.
4
4
 
5
- Consult the [Sitecore JSS documentation](https://doc.sitecore.com/xp/en/developers/hd/190/sitecore-headless-development/sitecore-javascript-rendering-sdks--jss-.html) for further details.
5
+ <!---
6
+ @TODO: Update to next version docs before release
7
+ -->
8
+ [Documentation (Experience Platform)](https://doc.sitecore.com/xp/en/developers/hd/22/sitecore-headless-development/sitecore-javascript-rendering-sdks--jss-.html)
6
9
 
7
- Consult the package [API reference documentation](/ref-docs/sitecore-jss-dev-tools/).
10
+ [Documentation (XM Cloud)](https://doc.sitecore.com/xmc/en/developers/xm-cloud/sitecore-javascript-rendering-sdks--jss-.html)
11
+
12
+ [API reference documentation](/ref-docs/sitecore-jss-dev-tools/)
package/dist/cjs/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.strip = exports.resolveScJssConfig = exports.createDefaultDisconnectedServer = exports.createDefaultDocumentMiddleware = exports.createDisconnectedDictionaryService = exports.createDisconnectedLayoutService = exports.createDisconnectedAssetMiddleware = exports.packageGenerate = exports.packageDeploy = exports.clean = exports.deploy = exports.mergeFs = exports.verifySetup = exports.userConfigPath = exports.setup = exports.replaceConfigTokens = void 0;
17
+ exports.resolveScJssConfig = exports.createDefaultDisconnectedServer = exports.createDefaultDocumentMiddleware = exports.createDisconnectedDictionaryService = exports.createDisconnectedLayoutService = exports.createDisconnectedAssetMiddleware = exports.packageGenerate = exports.packageDeploy = exports.clean = exports.deploy = exports.mergeFs = exports.verifySetup = exports.userConfigPath = exports.setup = exports.replaceConfigTokens = void 0;
18
18
  var jss_config_1 = require("./setup/jss-config");
19
19
  Object.defineProperty(exports, "replaceConfigTokens", { enumerable: true, get: function () { return jss_config_1.replaceConfigTokens; } });
20
20
  var setup_1 = require("./setup/setup");
@@ -44,8 +44,7 @@ var create_default_disconnected_server_1 = require("./disconnected-server/create
44
44
  Object.defineProperty(exports, "createDefaultDisconnectedServer", { enumerable: true, get: function () { return create_default_disconnected_server_1.createDefaultDisconnectedServer; } });
45
45
  var resolve_scjssconfig_1 = require("./resolve-scjssconfig");
46
46
  Object.defineProperty(exports, "resolveScJssConfig", { enumerable: true, get: function () { return resolve_scjssconfig_1.resolveScJssConfig; } });
47
- var strip_1 = require("./templating/strip");
48
- Object.defineProperty(exports, "strip", { enumerable: true, get: function () { return strip_1.strip; } });
47
+ __exportStar(require("./templating"), exports);
49
48
  __exportStar(require("./manifest"), exports);
50
49
  __exportStar(require("./pipelines"), exports);
51
50
  __exportStar(require("./update"), exports);
@@ -23,7 +23,7 @@ pipeline.addProcessor({
23
23
  },
24
24
  });
25
25
  pipeline
26
- .runWithCompilers(['babel-core/register'])
26
+ .runWithCompilers(['@babel/register'])
27
27
  .then((result) => {
28
28
  console.log(JSON.stringify(result, null, 2));
29
29
  })
@@ -31,7 +31,7 @@ pipeline
31
31
  console.error(err);
32
32
  });
33
33
  const runner = () => __awaiter(void 0, void 0, void 0, function* () {
34
- const compilers = ['babel-core/register'];
34
+ const compilers = ['@babel/register'];
35
35
  return (0, utils_1.initCompilers)(compilers)
36
36
  .then(() => (0, configLoader_1.configLoader)({ fileGlobs: ['../test/pipelines/**/*.config.js'], workingDirectory: __dirname }))
37
37
  .then((config) => (0, configLoader_1.configLoader)({
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getComponentList = void 0;
4
+ const utils_1 = require("./utils");
5
+ /**
6
+ * Get list of components from @var path
7
+ * Returns a list of components in the following format:
8
+ * {
9
+ * path: 'path/to/component',
10
+ * componentName: 'ComponentName',
11
+ * moduleName: 'ComponentName'
12
+ * }
13
+ * @param {string} path path to search
14
+ */
15
+ function getComponentList(path) {
16
+ const components = (0, utils_1.getItems)({
17
+ path,
18
+ resolveItem: (path, name) => ({
19
+ path: `${path}/${name}`,
20
+ componentName: name,
21
+ moduleName: name.replace(/[^\w]+/g, ''),
22
+ }),
23
+ cb: (name) => console.debug(`Registering JSS component ${name}`),
24
+ });
25
+ return components;
26
+ }
27
+ exports.getComponentList = getComponentList;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMetadata = exports.strip = exports.scaffoldFile = exports.ModuleType = exports.generatePlugins = exports.getComponentList = void 0;
4
+ var components_1 = require("./components");
5
+ Object.defineProperty(exports, "getComponentList", { enumerable: true, get: function () { return components_1.getComponentList; } });
6
+ var plugins_1 = require("./plugins");
7
+ Object.defineProperty(exports, "generatePlugins", { enumerable: true, get: function () { return plugins_1.generatePlugins; } });
8
+ Object.defineProperty(exports, "ModuleType", { enumerable: true, get: function () { return plugins_1.ModuleType; } });
9
+ var scaffold_1 = require("./scaffold");
10
+ Object.defineProperty(exports, "scaffoldFile", { enumerable: true, get: function () { return scaffold_1.scaffoldFile; } });
11
+ var strip_1 = require("./strip");
12
+ Object.defineProperty(exports, "strip", { enumerable: true, get: function () { return strip_1.strip; } });
13
+ var metadata_1 = require("./metadata");
14
+ Object.defineProperty(exports, "getMetadata", { enumerable: true, get: function () { return metadata_1.getMetadata; } });
@@ -0,0 +1,32 @@
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.getMetadata = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ /**
10
+ * Get application metadata
11
+ */
12
+ function getMetadata() {
13
+ const metadata = { packages: {} };
14
+ const trackedScopes = ['@sitecore', '@sitecore-cloudsdk', '@sitecore-feaas', '@sitecore-jss'];
15
+ const dirs = fs_1.default.readdirSync('node_modules');
16
+ dirs.forEach((dir) => {
17
+ if (trackedScopes.includes(dir)) {
18
+ const packageNames = fs_1.default.readdirSync(path_1.default.join('node_modules', dir));
19
+ packageNames.forEach((pkg) => {
20
+ try {
21
+ const json = JSON.parse(fs_1.default.readFileSync(path_1.default.join('node_modules', dir, pkg, 'package.json'), 'utf8'));
22
+ metadata.packages[json.name] = json.version;
23
+ }
24
+ catch (e) {
25
+ console.error(`Failed to read/parse package.json for ${pkg}`, e);
26
+ }
27
+ });
28
+ }
29
+ });
30
+ return metadata;
31
+ }
32
+ exports.getMetadata = getMetadata;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const recast = __importStar(require("recast"));
27
+ /**
28
+ * Webpack loader to strip functions from the source code
29
+ * Strips the `getServerSideProps` and `getStaticProps` functions from the source code
30
+ * @param {string} source file source code
31
+ * @returns {string} output file source code with stripped functions
32
+ */
33
+ function componentPropsLoader(source) {
34
+ // Parse the source code into an AST (Abstract Syntax Tree)
35
+ const ast = recast.parse(source, {
36
+ parser: require('recast/parsers/babel-ts'),
37
+ });
38
+ // List of functions to strip from the AST
39
+ const functionsToStrip = ['getServerSideProps', 'getStaticProps'];
40
+ // Remove the function from the list of functions to strip
41
+ const updateList = (functionName) => {
42
+ // Remove the function from the list of functions to strip
43
+ functionsToStrip.splice(functionsToStrip.indexOf(functionName), 1);
44
+ };
45
+ // Traverse the AST and strip the functions
46
+ recast.visit(ast, {
47
+ // Visit the named export function expression
48
+ visitExportNamedDeclaration: function (path) {
49
+ var _a, _b;
50
+ // Get the variable declaration from the AST
51
+ (_b = (_a = path.node.declaration) === null || _a === void 0 ? void 0 : _a.declarations) === null || _b === void 0 ? void 0 : _b.forEach((declaration) => {
52
+ // Check if the function is in the list of functions to strip
53
+ if ('id' in declaration &&
54
+ 'name' in declaration.id &&
55
+ typeof declaration.id.name === 'string' &&
56
+ functionsToStrip.includes(declaration.id.name)) {
57
+ updateList(declaration.id.name);
58
+ // Strip the function from the AST
59
+ path.prune();
60
+ }
61
+ });
62
+ if (functionsToStrip.length === 0) {
63
+ // We have pruned all the functions we need to, so we can stop traversing the AST
64
+ return false;
65
+ }
66
+ // Continue traversing the AST
67
+ this.traverse(path);
68
+ },
69
+ // Visit the named export function declaration
70
+ visitFunctionDeclaration: function (path) {
71
+ // Check if the function is in the list of functions to strip
72
+ if (path.node.id &&
73
+ 'name' in path.node.id &&
74
+ typeof path.node.id.name === 'string' &&
75
+ functionsToStrip.includes(path.node.id.name)) {
76
+ updateList(path.node.id.name);
77
+ // Strip the function from the AST
78
+ path.prune();
79
+ }
80
+ if (functionsToStrip.length === 0) {
81
+ // We have pruned all the functions we need to, so we can stop traversing the AST
82
+ return false;
83
+ }
84
+ // Continue traversing the AST
85
+ this.traverse(path);
86
+ },
87
+ });
88
+ // Generate the output code
89
+ return recast.print(ast).code;
90
+ }
91
+ exports.default = componentPropsLoader;
@@ -0,0 +1,72 @@
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.writeComponentBuilder = exports.watchComponentBuilder = exports.generateComponentBuilder = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const component_builder_1 = require("./templates/component-builder");
10
+ const components_1 = require("../components");
11
+ const utils_1 = require("../utils");
12
+ // Default destination path for component builder
13
+ const defaultComponentBuilderOutputPath = 'src/temp/componentBuilder.ts';
14
+ const defaultComponentRootPath = 'src/components';
15
+ /**
16
+ * Generate component builder based on provided settings
17
+ * @param {Object} [settings] settings for component builder generation
18
+ * @param {string} [settings.componentRootPath] path to components root
19
+ * @param {string} [settings.componentBuilderOutputPath] path to component builder output
20
+ * @param {PackageDefinition[]} [settings.packages] list of packages to include in component builder
21
+ * @param {ComponentFile[]} [settings.components] list of components to include in component builder
22
+ * @param {boolean} [settings.watch] whether to watch for changes to component builder sources
23
+ */
24
+ function generateComponentBuilder({ componentRootPath = defaultComponentRootPath, componentBuilderOutputPath = defaultComponentBuilderOutputPath, packages = [], components = [], watch, } = {}) {
25
+ if (watch) {
26
+ watchComponentBuilder({ componentRootPath, componentBuilderOutputPath, packages, components });
27
+ }
28
+ else {
29
+ writeComponentBuilder({ componentRootPath, componentBuilderOutputPath, packages, components });
30
+ }
31
+ }
32
+ exports.generateComponentBuilder = generateComponentBuilder;
33
+ /**
34
+ * Watch for changes to component builder sources
35
+ * @param {Object} settings settings for component builder generation
36
+ * @param {string} settings.componentRootPath path to components root
37
+ * @param {string} settings.componentBuilderOutputPath path to component builder output
38
+ * @param {PackageDefinition[]} settings.packages list of packages to include in component builder
39
+ * @param {ComponentFile[]} settings.components list of components to include in component builder
40
+ */
41
+ function watchComponentBuilder({ componentRootPath, componentBuilderOutputPath, packages, components, }) {
42
+ console.log(`Watching for changes to component builder sources in ${componentRootPath}...`);
43
+ (0, utils_1.watchItems)([componentRootPath], writeComponentBuilder.bind(null, {
44
+ componentRootPath,
45
+ componentBuilderOutputPath,
46
+ packages,
47
+ components,
48
+ }));
49
+ }
50
+ exports.watchComponentBuilder = watchComponentBuilder;
51
+ /**
52
+ * Write component builder to file
53
+ * @param {Object} settings settings for component builder generation
54
+ * @param {string} settings.componentRootPath path to components root
55
+ * @param {string} settings.componentBuilderOutputPath path to component builder output
56
+ * @param {PackageDefinition[]} settings.packages list of packages to include in component builder
57
+ * @param {ComponentFile[]} settings.components list of components to include in component builder
58
+ */
59
+ function writeComponentBuilder({ componentRootPath, componentBuilderOutputPath, packages, components, }) {
60
+ const items = [
61
+ ...packages,
62
+ ...components,
63
+ ...(0, components_1.getComponentList)(componentRootPath),
64
+ ];
65
+ const componentBuilderPath = path_1.default.resolve(componentBuilderOutputPath);
66
+ const fileContent = (0, component_builder_1.getComponentBuilderTemplate)(items);
67
+ console.log(`Writing component builder to ${componentBuilderPath}`);
68
+ fs_1.default.writeFileSync(componentBuilderPath, fileContent, {
69
+ encoding: 'utf8',
70
+ });
71
+ }
72
+ exports.writeComponentBuilder = writeComponentBuilder;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getComponentBuilderTemplate = exports.generateComponentBuilder = void 0;
4
+ var generate_component_builder_1 = require("./generate-component-builder");
5
+ Object.defineProperty(exports, "generateComponentBuilder", { enumerable: true, get: function () { return generate_component_builder_1.generateComponentBuilder; } });
6
+ var component_builder_1 = require("./templates/component-builder");
7
+ Object.defineProperty(exports, "getComponentBuilderTemplate", { enumerable: true, get: function () { return component_builder_1.getComponentBuilderTemplate; } });
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getComponentBuilderTemplate = void 0;
4
+ const isLazyLoadingModule = (componentPath) => componentPath.includes('.dynamic');
5
+ const removeDynamicModuleNameEnding = (moduleName) => moduleName.replace(/\.?dynamic$/i, '');
6
+ /**
7
+ * Generate component builder template
8
+ * @param {(PackageDefinition | ComponentFile)[]} components components to include in component builder
9
+ * @returns generated component builder template
10
+ */
11
+ const getComponentBuilderTemplate = (components) => {
12
+ const componentFiles = components.filter((component) => component.componentName);
13
+ const packages = components.filter((component) => component.components);
14
+ const hasLazyModules = componentFiles.find((component) => isLazyLoadingModule(component.path));
15
+ return `/* eslint-disable */
16
+ // Do not edit this file, it is auto-generated at build time!
17
+ // See scripts/generate-component-builder/index.ts to modify the generation of this file.
18
+
19
+ ${hasLazyModules ? "import dynamic from 'next/dynamic';" : ''}
20
+ import { ComponentBuilder } from '@sitecore-jss/sitecore-jss-nextjs';
21
+
22
+ ${packages
23
+ .map((pkg) => {
24
+ const list = pkg.components.map((c) => c.moduleName).join(', ');
25
+ return `import { ${list} } from '${pkg.name}';\n`;
26
+ })
27
+ .join('')}
28
+ ${componentFiles
29
+ .map((component) => {
30
+ if (isLazyLoadingModule(component.path)) {
31
+ const moduleName = removeDynamicModuleNameEnding(component.moduleName);
32
+ return `const ${moduleName} = {
33
+ module: () => import('${component.path}'),
34
+ element: (isEditing?: boolean) => isEditing ? require('${component.path}')?.default : dynamic(${moduleName}.module)
35
+ }`;
36
+ }
37
+ return `import * as ${component.moduleName} from '${component.path}';`;
38
+ })
39
+ .join('\n')}
40
+
41
+ export const components = new Map();
42
+ ${packages
43
+ .map((p) => p.components.map((component) => `components.set('${component.componentName}', ${component.moduleName});\n`))
44
+ .flat()
45
+ .join('')}
46
+ ${componentFiles
47
+ .map((component) => `components.set('${isLazyLoadingModule(component.path)
48
+ ? removeDynamicModuleNameEnding(component.componentName)
49
+ : component.componentName}', ${isLazyLoadingModule(component.path)
50
+ ? removeDynamicModuleNameEnding(component.moduleName)
51
+ : component.moduleName});`)
52
+ .join('\n')}
53
+
54
+ export const componentBuilder = new ComponentBuilder({ components });
55
+
56
+ export const moduleFactory = componentBuilder.getModuleFactory();
57
+ `;
58
+ };
59
+ exports.getComponentBuilderTemplate = getComponentBuilderTemplate;
@@ -0,0 +1,78 @@
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.generatePlugins = exports.getPluginList = exports.ModuleType = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const utils_1 = require("./utils");
10
+ /**
11
+ * Identifies the format of the module to be compiled
12
+ */
13
+ var ModuleType;
14
+ (function (ModuleType) {
15
+ ModuleType[ModuleType["CJS"] = 0] = "CJS";
16
+ ModuleType[ModuleType["ESM"] = 1] = "ESM";
17
+ })(ModuleType = exports.ModuleType || (exports.ModuleType = {}));
18
+ /**
19
+ * Get list of plugins from @var path
20
+ * Returns a list of plugins in the following format:
21
+ * {
22
+ * path: 'path/to/plugin/foo',
23
+ * name: 'fooPlugin'
24
+ * }
25
+ * @example getPluginList('src/foo/plugins', 'Foo')
26
+ * @param {Object} definition plugin definition
27
+ * @param {string} definition.path path to get plugin from
28
+ * @param {string} definition.pluginName plugin name
29
+ * @param {boolean} [definition.silent] whether to suppress console output
30
+ */
31
+ function getPluginList({ path, pluginName, silent = false, }) {
32
+ const plugins = (0, utils_1.getItems)({
33
+ path,
34
+ resolveItem: (path, name) => ({
35
+ path: `${path}/${name}`,
36
+ name: `${name.replace(/-./g, (x) => x[1].toUpperCase())}Plugin`,
37
+ }),
38
+ cb: (name) => !silent && console.debug(`Registering ${pluginName} plugin ${name}`),
39
+ });
40
+ return plugins;
41
+ }
42
+ exports.getPluginList = getPluginList;
43
+ /**
44
+ * Generates the plugins file and saves it to the filesystem.
45
+ * By convention, we expect to find plugins under {pluginName}/plugins/** (subfolders are searched recursively).
46
+ * generated file will be saved to @var {distPath} and will contain a list of plugins in the following format:
47
+ * CJS: exports.fooPlugin = require('{pluginPath}');
48
+ * ESM: export { fooPlugin } from '{pluginPath}';
49
+ * @example generatePlugins({ distPath: 'src/temp/foo-plugins.js', rootPath: 'src/foo/plugins', moduleType: ModuleType.CJS })
50
+ * @param {PluginDefinition} definition plugin definition
51
+ */
52
+ function generatePlugins(definition) {
53
+ const { rootPath, distPath, moduleType, relative = false, silent } = definition;
54
+ const segments = rootPath.split('/');
55
+ const pluginName = segments[segments.length - 2];
56
+ const plugins = getPluginList({ path: rootPath, pluginName, silent });
57
+ let fileContent = '';
58
+ fileContent = plugins
59
+ .map((plugin) => {
60
+ const sourcePath = relative
61
+ ? path_1.default.relative(path_1.default.dirname(distPath), plugin.path).replace(/\\/g, '/')
62
+ : plugin.path;
63
+ return moduleType === ModuleType.CJS
64
+ ? `exports.${plugin.name} = require('${sourcePath}');`
65
+ : `export { ${plugin.name} } from '${sourcePath}';`;
66
+ })
67
+ .join('\r\n')
68
+ .concat('\r\n');
69
+ if (!plugins.length) {
70
+ fileContent = moduleType === ModuleType.CJS ? 'module.exports = {};\r\n' : 'export {};\r\n';
71
+ }
72
+ const filePath = path_1.default.resolve(distPath);
73
+ !silent && console.log(`Writing ${pluginName} plugins to ${filePath}`);
74
+ fs_1.default.writeFileSync(filePath, fileContent, {
75
+ encoding: 'utf8',
76
+ });
77
+ }
78
+ exports.generatePlugins = generatePlugins;
@@ -0,0 +1,64 @@
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.writeComponentBuilder = exports.watchComponentBuilder = exports.generateComponentBuilder = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const component_builder_1 = require("./templates/component-builder");
10
+ const components_1 = require("../components");
11
+ const utils_1 = require("../utils");
12
+ // Default destination path for component builder
13
+ const componentBuilderOutputPath = 'src/temp/componentBuilder.js';
14
+ const defaultComponentRootPath = 'src/components';
15
+ /**
16
+ * Generate component builder based on provided settings
17
+ * @param {Object} settings settings for component builder generation
18
+ * @param {string} settings.componentRootPath path to components root
19
+ * @param {PackageDefinition[]} [settings.packages] list of packages to include in component builder
20
+ * @param {ComponentFile[]} [settings.components] list of components to include in component builder
21
+ * @param {boolean} settings.watch whether to watch for changes to component builder sources
22
+ */
23
+ function generateComponentBuilder({ componentRootPath = defaultComponentRootPath, packages = [], components = [], watch, }) {
24
+ if (watch) {
25
+ watchComponentBuilder({ componentRootPath, packages, components });
26
+ }
27
+ else {
28
+ writeComponentBuilder({ componentRootPath, packages, components });
29
+ }
30
+ }
31
+ exports.generateComponentBuilder = generateComponentBuilder;
32
+ /**
33
+ * Watch for changes to component builder sources
34
+ * @param {object} config configuration for component builder watcher
35
+ * @param {string} config.componentRootPath root path to components
36
+ * @param {PackageDefinition[]} config.packages packages to include in component builder
37
+ * @param {ComponentFile[]} config.components components to include in component builder
38
+ */
39
+ function watchComponentBuilder({ componentRootPath, packages, components, }) {
40
+ console.log(`Watching for changes to component builder sources in ${componentRootPath}...`);
41
+ (0, utils_1.watchItems)([componentRootPath], writeComponentBuilder.bind(null, { componentRootPath, packages, components }));
42
+ }
43
+ exports.watchComponentBuilder = watchComponentBuilder;
44
+ /**
45
+ * Write component builder to file
46
+ * @param {Object} settings settings for component builder generation
47
+ * @param {string} settings.componentRootPath root path to components
48
+ * @param {PackageDefinition[]} settings.packages packages to include in component builder
49
+ * @param {ComponentFile[]} settings.components list of components to include in component builder
50
+ */
51
+ function writeComponentBuilder({ componentRootPath, packages, components, }) {
52
+ const items = [
53
+ ...packages,
54
+ ...components,
55
+ ...(0, components_1.getComponentList)(componentRootPath),
56
+ ];
57
+ const componentBuilderPath = path_1.default.resolve(componentBuilderOutputPath);
58
+ const fileContent = (0, component_builder_1.getComponentBuilderTemplate)(items, componentBuilderPath);
59
+ console.log(`Writing component builder to ${componentBuilderPath}`);
60
+ fs_1.default.writeFileSync(componentBuilderPath, fileContent, {
61
+ encoding: 'utf8',
62
+ });
63
+ }
64
+ exports.writeComponentBuilder = writeComponentBuilder;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateComponentBuilder = exports.getComponentBuilderTemplate = void 0;
4
+ var component_builder_1 = require("./templates/component-builder");
5
+ Object.defineProperty(exports, "getComponentBuilderTemplate", { enumerable: true, get: function () { return component_builder_1.getComponentBuilderTemplate; } });
6
+ var generate_component_builder_1 = require("./generate-component-builder");
7
+ Object.defineProperty(exports, "generateComponentBuilder", { enumerable: true, get: function () { return generate_component_builder_1.generateComponentBuilder; } });
@@ -0,0 +1,49 @@
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.getComponentBuilderTemplate = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ /**
9
+ * Generate component builder template
10
+ * @param {(PackageDefinition | ComponentFile)[]} components components to include in component builder
11
+ * @param {string} distPath destination path for component builder
12
+ * @returns generated component builder template
13
+ */
14
+ const getComponentBuilderTemplate = (components, distPath) => {
15
+ const componentFiles = components.filter((component) => component.componentName);
16
+ const packages = components.filter((component) => component.components);
17
+ return `/* eslint-disable */
18
+ // Do not edit this file, it is auto-generated at build time!
19
+ // See scripts/generate-component-builder/index.js to modify the generation of this file.
20
+
21
+ import { ComponentBuilder } from '@sitecore-jss/sitecore-jss-react';
22
+ ${packages
23
+ .map((pkg) => {
24
+ const list = pkg.components.map((c) => c.moduleName).join(', ');
25
+ return `import { ${list} } from '${pkg.name}';\n`;
26
+ })
27
+ .join('')}
28
+ ${componentFiles
29
+ .map((component) => {
30
+ const sourcePath = path_1.default.relative(path_1.default.dirname(distPath), component.path).replace(/\\/g, '/');
31
+ return `import ${component.moduleName} from '${sourcePath}';`;
32
+ })
33
+ .join('\n')}
34
+
35
+ const components = new Map();
36
+ ${packages
37
+ .map((p) => p.components.map((component) => `components.set('${component.componentName}', ${component.moduleName});\n`))
38
+ .flat()
39
+ .join('')}
40
+ ${componentFiles
41
+ .map((component) => `components.set('${component.componentName}', ${component.moduleName});`)
42
+ .join('\n')}
43
+
44
+ const componentBuilder = new ComponentBuilder({ components });
45
+
46
+ export const componentFactory = componentBuilder.getComponentFactory();
47
+ `;
48
+ };
49
+ exports.getComponentBuilderTemplate = getComponentBuilderTemplate;
@@ -0,0 +1,38 @@
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.scaffoldFile = exports.editLineEndings = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const path_1 = __importDefault(require("path"));
10
+ /**
11
+ * Force to use `crlf` line endings, we are using `crlf` across the project.
12
+ * Replace: `lf` (\n), `cr` (\r)
13
+ * @param {string} content
14
+ */
15
+ function editLineEndings(content) {
16
+ return content.replace(/\r|\n/gm, '\r\n');
17
+ }
18
+ exports.editLineEndings = editLineEndings;
19
+ /**
20
+ * Creates a file relative to the specified path if the file doesn't exist.
21
+ * Creates directories as needed.
22
+ * Does not overwrite existing files.
23
+ * @param {string} filePath - the file path
24
+ * @param {string} fileContent - the file content
25
+ * @returns {string} the file path if the file was created, otherwise null
26
+ */
27
+ function scaffoldFile(filePath, fileContent) {
28
+ const outputDir = path_1.default.dirname(filePath);
29
+ if (fs_1.default.existsSync(filePath)) {
30
+ console.log(chalk_1.default.red(`Skipping creating ${filePath}; already exists.`));
31
+ return null;
32
+ }
33
+ fs_1.default.mkdirSync(outputDir, { recursive: true });
34
+ fs_1.default.writeFileSync(filePath, editLineEndings(fileContent), 'utf8');
35
+ console.log(chalk_1.default.green(`File ${filePath} has been scaffolded.`));
36
+ return filePath;
37
+ }
38
+ exports.scaffoldFile = scaffoldFile;