@servicetitan/startup 27.4.0 → 28.1.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.
Files changed (141) hide show
  1. package/dist/cli/commands/get-command.d.ts.map +1 -1
  2. package/dist/cli/commands/get-command.js +4 -2
  3. package/dist/cli/commands/get-command.js.map +1 -1
  4. package/dist/cli/commands/init.d.ts +0 -1
  5. package/dist/cli/commands/init.d.ts.map +1 -1
  6. package/dist/cli/commands/init.js +39 -9
  7. package/dist/cli/commands/init.js.map +1 -1
  8. package/dist/cli/commands/mfe-package-clean.d.ts +14 -0
  9. package/dist/cli/commands/mfe-package-clean.d.ts.map +1 -0
  10. package/dist/cli/commands/mfe-package-clean.js +124 -0
  11. package/dist/cli/commands/mfe-package-clean.js.map +1 -0
  12. package/dist/cli/commands/mfe-package-publish.d.ts +20 -0
  13. package/dist/cli/commands/mfe-package-publish.d.ts.map +1 -0
  14. package/dist/cli/commands/mfe-package-publish.js +153 -0
  15. package/dist/cli/commands/mfe-package-publish.js.map +1 -0
  16. package/dist/cli/commands/mfe-publish.d.ts +6 -30
  17. package/dist/cli/commands/mfe-publish.d.ts.map +1 -1
  18. package/dist/cli/commands/mfe-publish.js +14 -226
  19. package/dist/cli/commands/mfe-publish.js.map +1 -1
  20. package/dist/cli/utils/assets-copy.d.ts.map +1 -1
  21. package/dist/cli/utils/assets-copy.js +3 -3
  22. package/dist/cli/utils/assets-copy.js.map +1 -1
  23. package/dist/cli/utils/cli-os.d.ts +9 -2
  24. package/dist/cli/utils/cli-os.d.ts.map +1 -1
  25. package/dist/cli/utils/cli-os.js +16 -8
  26. package/dist/cli/utils/cli-os.js.map +1 -1
  27. package/dist/cli/utils/styles-copy.d.ts.map +1 -1
  28. package/dist/cli/utils/styles-copy.js +3 -3
  29. package/dist/cli/utils/styles-copy.js.map +1 -1
  30. package/dist/utils/get-branch-configs.d.ts +3 -0
  31. package/dist/utils/get-branch-configs.d.ts.map +1 -0
  32. package/dist/utils/get-branch-configs.js +18 -0
  33. package/dist/utils/get-branch-configs.js.map +1 -0
  34. package/dist/utils/get-configuration.d.ts +13 -3
  35. package/dist/utils/get-configuration.d.ts.map +1 -1
  36. package/dist/utils/get-configuration.js +28 -5
  37. package/dist/utils/get-configuration.js.map +1 -1
  38. package/dist/utils/get-folders.js +2 -2
  39. package/dist/utils/get-folders.js.map +1 -1
  40. package/dist/utils/get-jest-config.d.ts.map +1 -1
  41. package/dist/utils/get-jest-config.js +2 -10
  42. package/dist/utils/get-jest-config.js.map +1 -1
  43. package/dist/webpack/configs/dev-server-config.d.ts.map +1 -1
  44. package/dist/webpack/configs/dev-server-config.js +1 -1
  45. package/dist/webpack/configs/dev-server-config.js.map +1 -1
  46. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.js +1 -1
  47. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.js.map +1 -1
  48. package/dist/webpack/configs/plugins/index.d.ts +1 -0
  49. package/dist/webpack/configs/plugins/index.d.ts.map +1 -1
  50. package/dist/webpack/configs/plugins/index.js +1 -0
  51. package/dist/webpack/configs/plugins/index.js.map +1 -1
  52. package/dist/webpack/configs/plugins/virtual-modules-plugin.d.ts.map +1 -1
  53. package/dist/webpack/configs/plugins/virtual-modules-plugin.js +15 -5
  54. package/dist/webpack/configs/plugins/virtual-modules-plugin.js.map +1 -1
  55. package/dist/webpack/configs/plugins/watch-run-plugin.d.ts +8 -0
  56. package/dist/webpack/configs/plugins/watch-run-plugin.d.ts.map +1 -0
  57. package/dist/webpack/configs/plugins/watch-run-plugin.js +26 -0
  58. package/dist/webpack/configs/plugins/watch-run-plugin.js.map +1 -0
  59. package/dist/webpack/configs/plugins-config.d.ts.map +1 -1
  60. package/dist/webpack/configs/plugins-config.js +1 -0
  61. package/dist/webpack/configs/plugins-config.js.map +1 -1
  62. package/dist/webpack/configs/types.d.ts +16 -0
  63. package/dist/webpack/configs/types.d.ts.map +1 -1
  64. package/dist/webpack/configs/utils/generate-metadata.d.ts.map +1 -1
  65. package/dist/webpack/configs/utils/generate-metadata.js +3 -3
  66. package/dist/webpack/configs/utils/generate-metadata.js.map +1 -1
  67. package/jest/jest-preset.js +9 -0
  68. package/package.json +18 -23
  69. package/src/cli/commands/__tests__/init.test.ts +108 -28
  70. package/src/cli/commands/__tests__/mfe-package-clean.test.ts +45 -6
  71. package/src/cli/commands/__tests__/mfe-package-publish.test.ts +77 -7
  72. package/src/cli/commands/__tests__/mfe-publish.test.ts +19 -1
  73. package/src/cli/commands/__tests__/tests.test.ts +4 -0
  74. package/src/cli/commands/get-command.ts +3 -1
  75. package/src/cli/commands/init.ts +40 -10
  76. package/src/cli/commands/mfe-package-clean.ts +143 -0
  77. package/src/cli/commands/mfe-package-publish.ts +189 -0
  78. package/src/cli/commands/mfe-publish.ts +18 -298
  79. package/src/cli/utils/__tests__/assets-copy.test.ts +3 -7
  80. package/src/cli/utils/__tests__/cli-os.test.ts +41 -6
  81. package/src/cli/utils/__tests__/eslint.test.ts +4 -0
  82. package/src/cli/utils/__tests__/styles-copy.test.ts +3 -7
  83. package/src/cli/utils/assets-copy.ts +3 -3
  84. package/src/cli/utils/cli-os.ts +20 -8
  85. package/src/cli/utils/styles-copy.ts +3 -3
  86. package/src/utils/__tests__/get-branch-configs.test.ts +36 -0
  87. package/src/utils/__tests__/get-configuration.test.ts +65 -0
  88. package/src/utils/__tests__/get-jest-config.test.ts +1 -7
  89. package/src/utils/__tests__/load-shared-dependencies.test.ts +82 -88
  90. package/src/utils/get-branch-configs.ts +17 -0
  91. package/src/utils/get-configuration.ts +45 -7
  92. package/src/utils/get-folders.ts +1 -1
  93. package/src/utils/get-jest-config.ts +2 -10
  94. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +0 -1
  95. package/src/webpack/__tests__/create-webpack-config-web-component.test.ts +47 -13
  96. package/src/webpack/__tests__/create-webpack-config.test.ts +3 -2
  97. package/src/webpack/configs/dev-server-config.ts +2 -1
  98. package/src/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.ts +1 -1
  99. package/src/webpack/configs/plugins/index.ts +1 -0
  100. package/src/webpack/configs/plugins/virtual-modules-plugin.ts +17 -5
  101. package/src/webpack/configs/plugins/watch-run-plugin.ts +23 -0
  102. package/src/webpack/configs/plugins-config.ts +2 -0
  103. package/src/webpack/configs/types.ts +19 -0
  104. package/src/webpack/configs/utils/generate-metadata.ts +5 -5
  105. package/tsconfig/base.json +1 -1
  106. package/template/.eslintrc.json +0 -3
  107. package/template/.gitignore +0 -21
  108. package/template/.npmrc +0 -3
  109. package/template/.prettierrc +0 -9
  110. package/template/.stylelintignore +0 -1
  111. package/template/.stylelintrc.json +0 -3
  112. package/template/.vscode/extensions.json +0 -18
  113. package/template/.vscode/settings.json +0 -4
  114. package/template/lerna.json +0 -4
  115. package/template/package.json +0 -32
  116. package/template/packages/application/package.json +0 -35
  117. package/template/packages/application/src/__tests__/app.test.tsx +0 -33
  118. package/template/packages/application/src/app.css +0 -3
  119. package/template/packages/application/src/app.tsx +0 -45
  120. package/template/packages/application/src/design-system.css +0 -3
  121. package/template/packages/application/src/index.tsx +0 -8
  122. package/template/packages/application/src/main-page.tsx +0 -5
  123. package/template/packages/application/src/second-page.tsx +0 -5
  124. package/template/packages/application/tsconfig.json +0 -13
  125. package/template/packages/feature-a/package.json +0 -19
  126. package/template/packages/feature-a/src/index.ts +0 -0
  127. package/template/packages/feature-a/tsconfig.json +0 -9
  128. package/template/packages/feature-b/package.json +0 -19
  129. package/template/packages/feature-b/src/index.ts +0 -0
  130. package/template/packages/feature-b/tsconfig.json +0 -9
  131. package/template/packages/feature-c/package.json +0 -19
  132. package/template/packages/feature-c/src/index.ts +0 -0
  133. package/template/packages/feature-c/tsconfig.json +0 -9
  134. package/template/setupTests.ts +0 -27
  135. package/template/tsconfig.test.json +0 -5
  136. package/template-react18/packages/application/package.json +0 -35
  137. package/template-react18/packages/application/src/index.tsx +0 -9
  138. package/template-react18/packages/feature-a/package.json +0 -19
  139. package/template-react18/packages/feature-b/package.json +0 -19
  140. package/template-react18/packages/feature-c/package.json +0 -19
  141. package/tsconfig.json +0 -13
@@ -67,16 +67,19 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
67
67
  const indexCode = ({
68
68
  embed = false,
69
69
  legacyRoot = false,
70
- }: { embed?: boolean; legacyRoot?: boolean } = {}) =>
70
+ designSystem,
71
+ }: { embed?: boolean; legacyRoot?: boolean; designSystem?: boolean } = {}) =>
71
72
  [
72
- ...(embed ? [] : [`require('./design-system.css');`]),
73
+ ...(designSystem ? [`require('./design-system.css');`] : []),
73
74
  `import { register } from '@servicetitan/web-components';`,
74
75
  `import { App } from './app';`,
75
- `register(App, ${embed}, { legacyRoot: ${legacyRoot}, sharedDependenciesNames: [] });`,
76
+ `register(App, ${embed}, { legacyRoot: ${legacyRoot}, sharedDependenciesNames: ${JSON.stringify(Object.keys(sharedDependencies))} });`,
76
77
  ].join('\n');
77
78
 
78
79
  let overrides: Parameters<typeof createWebpackConfig>[0];
79
80
  let options: NonNullable<Parameters<typeof createWebpackConfig>[1]>;
81
+ let dependencies: Record<string, string>;
82
+ let sharedDependencies: Record<string, string>;
80
83
 
81
84
  function mockPlugIn(name: string) {
82
85
  return (options: Record<string, any>): any => ({ [name]: options });
@@ -85,6 +88,10 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
85
88
  beforeEach(() => {
86
89
  overrides = { plugins: { HtmlWebpackPlugin: { favicon: 'foo' } } };
87
90
  options = { name: packageName };
91
+ dependencies = { '@servicetitan/design-system': '*' };
92
+ sharedDependencies = {
93
+ '@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
94
+ };
88
95
 
89
96
  jest.resetAllMocks();
90
97
  jest.mocked(MiniCssExtractPlugin).mockImplementation(mockPlugIn('MiniCssExtractPlugin'));
@@ -95,11 +102,11 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
95
102
 
96
103
  jest.mocked(getCallerFile).mockReturnValue('');
97
104
  jest.mocked(getFolders).mockReturnValue({ source, destination });
98
- jest.mocked(getPackageData).mockReturnValue({
105
+ jest.mocked(getPackageData).mockImplementation(() => ({
99
106
  name: packageName,
100
- dependencies: {},
101
- sharedDependencies: {},
102
- });
107
+ dependencies,
108
+ sharedDependencies,
109
+ }));
103
110
  jest.mocked(getPackages).mockReturnValue([]);
104
111
  jest.mocked(getTsConfig).mockReturnValue(tsConfig);
105
112
  jest.mocked(isLegacyRoot).mockReturnValue(false);
@@ -233,7 +240,7 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
233
240
  expect(subject().plugins).toContainEqual(
234
241
  new VirtualModulesPlugin({
235
242
  [designSystemPath()]: designSystemCode,
236
- [indexPath()]: indexCode(),
243
+ [indexPath()]: indexCode({ designSystem: true }),
237
244
  })
238
245
  );
239
246
  });
@@ -245,7 +252,7 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
245
252
  expect(subject().plugins).toContainEqual(
246
253
  new VirtualModulesPlugin({
247
254
  [designSystemPath()]: designSystemCode,
248
- [indexPath()]: indexCode({ legacyRoot: true }),
255
+ [indexPath()]: indexCode({ designSystem: true, legacyRoot: true }),
249
256
  })
250
257
  );
251
258
  });
@@ -262,7 +269,22 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
262
269
  test('omits design system virtual module', () => {
263
270
  expect(subject().plugins).toContainEqual(
264
271
  new VirtualModulesPlugin({
265
- [indexPath()]: indexCode(),
272
+ [indexPath()]: indexCode({ designSystem: true }),
273
+ })
274
+ );
275
+ });
276
+ });
277
+
278
+ describe('when package does not depend on design system', () => {
279
+ beforeEach(() => {
280
+ delete dependencies['@servicetitan/design-system'];
281
+ delete sharedDependencies['@servicetitan/design-system'];
282
+ });
283
+
284
+ test('omits design system', () => {
285
+ expect(subject().plugins).toContainEqual(
286
+ new VirtualModulesPlugin({
287
+ [indexPath()]: indexCode({ designSystem: false }),
266
288
  })
267
289
  );
268
290
  });
@@ -271,11 +293,10 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
271
293
  describe('when embed option is set to true', () => {
272
294
  beforeEach(() => (options.embed = true));
273
295
 
274
- test(`changes virtual index module to omit design system and to register App`, () => {
296
+ test(`omits design system and registers App with embed set to true`, () => {
275
297
  expect(subject().plugins).toContainEqual(
276
298
  new VirtualModulesPlugin({
277
- [designSystemPath()]: designSystemCode,
278
- [indexPath()]: indexCode({ embed: true }),
299
+ [indexPath()]: indexCode({ designSystem: false, embed: true }),
279
300
  })
280
301
  );
281
302
  });
@@ -285,6 +306,19 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
285
306
  expect.stringContaining(path.join(destination, 'bundle', 'light'))
286
307
  );
287
308
  });
309
+
310
+ describe('when package does not share design system', () => {
311
+ beforeEach(() => delete sharedDependencies['@servicetitan/design-system']);
312
+
313
+ test('includes design system', () => {
314
+ expect(subject().plugins).toContainEqual(
315
+ new VirtualModulesPlugin({
316
+ [designSystemPath()]: designSystemCode,
317
+ [indexPath()]: indexCode({ designSystem: true, embed: true }),
318
+ })
319
+ );
320
+ });
321
+ });
288
322
  });
289
323
 
290
324
  describe.each([webpackDevConfigFileName, webpackProdConfigFileName])(
@@ -118,6 +118,7 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
118
118
  configuration = {};
119
119
 
120
120
  jest.resetAllMocks();
121
+ jest.mocked(log.debug).mockReturnValue({ enabled: false } as any);
121
122
  jest.mocked(CssMinimizerWebpackPlugin).mockImplementation(
122
123
  mockPlugIn('CssMinimizerWebpackPlugin')
123
124
  );
@@ -331,10 +332,10 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
331
332
  ];
332
333
  });
333
334
 
334
- test('configures "watchOptions" to ignore TSC packages', () => {
335
+ test('configures "watchOptions" to ignore TSC source files', () => {
335
336
  const ignored = packages
336
337
  .filter(({ type }) => type === PackageType.TSC)
337
- .map(({ location }) => location);
338
+ .map(({ location }) => path.join(location, getFolders(location).source));
338
339
  expect(subject().watchOptions).toEqual({ ignored });
339
340
  });
340
341
  });
@@ -4,6 +4,7 @@ import { Configuration } from 'webpack';
4
4
  import {
5
5
  PackageType,
6
6
  allowedWebpackDevServerOptions,
7
+ getFolders,
7
8
  getPackageName,
8
9
  getPackages,
9
10
  getWebpackConfiguration,
@@ -77,7 +78,7 @@ function getDevServerConfig() {
77
78
  function watchOptionsConfig(): WatchOptionsConfig {
78
79
  const ignored = getPackages({ scope: getPackageName() })
79
80
  .filter(({ type }) => type === PackageType.TSC)
80
- .map(({ location }) => location);
81
+ .map(({ location }) => path.join(location, getFolders(location).source));
81
82
 
82
83
  /*
83
84
  * NOTE: Don't return empty ignored array. It triggered a bug that caused
@@ -16,7 +16,7 @@ const optionalAnvilPeerDependencies = ['@servicetitan/design-system', '@servicet
16
16
  export function isOptionalAnvilPeerDependency({ context, packageContext, resource }: Dependency) {
17
17
  return (
18
18
  optionalAnvilPeerDependencies.includes(resource) &&
19
- /(@servicetitan|packages)\/(web-components)/.test(context) &&
19
+ /(@servicetitan|packages)[\\/](web-components)/.test(context) &&
20
20
  !Object.keys(packageContext.packageData.dependencies).includes(resource)
21
21
  );
22
22
  }
@@ -10,3 +10,4 @@ export * from './moment-locales-plugin';
10
10
  export * from './provide-react-plugin';
11
11
  export * from './ts-checker-plugin';
12
12
  export * from './virtual-modules-plugin';
13
+ export * from './watch-run-plugin';
@@ -15,9 +15,11 @@ export function virtualModulesPlugin(context: Context, _: Overrides) {
15
15
  [indexPath]: indexCode(context),
16
16
  };
17
17
 
18
- const designSystemPath = path.join(process.cwd(), `${source}/design-system.css`);
19
- if (!fs.existsSync(designSystemPath)) {
20
- modules[designSystemPath] = designSystemCode();
18
+ if (needsToIncludeDesignSystem(context)) {
19
+ const designSystemPath = path.join(process.cwd(), `${source}/design-system.css`);
20
+ if (!fs.existsSync(designSystemPath)) {
21
+ modules[designSystemPath] = designSystemCode();
22
+ }
21
23
  }
22
24
 
23
25
  return new VirtualModulesPlugin(modules);
@@ -31,14 +33,24 @@ function designSystemCode() {
31
33
  ].join('\n');
32
34
  }
33
35
 
34
- function indexCode({ embed = false, isLegacyRoot, sharedDependencies }: Context) {
36
+ function indexCode(context: Context) {
37
+ const { embed = false, isLegacyRoot, sharedDependencies } = context;
35
38
  const options = `{ legacyRoot: ${isLegacyRoot}, sharedDependenciesNames: ${JSON.stringify(
36
39
  Object.keys(sharedDependencies)
37
40
  )} }`;
38
41
  return [
39
- ...(embed ? [] : [`require('./design-system.css');`]),
42
+ ...(needsToIncludeDesignSystem(context) ? [`require('./design-system.css');`] : []),
40
43
  `import { register } from '@servicetitan/web-components';`,
41
44
  `import { App } from './app';`,
42
45
  `register(App, ${embed}, ${options});`,
43
46
  ].join('\n');
44
47
  }
48
+
49
+ function needsToIncludeDesignSystem({ embed, packageData, sharedDependencies }: Context) {
50
+ return (
51
+ // Depends on design system
52
+ !!packageData.dependencies['@servicetitan/design-system'] &&
53
+ // ... and is not light bundle with private copy of design system
54
+ !(embed && !!sharedDependencies['@servicetitan/design-system'])
55
+ );
56
+ }
@@ -0,0 +1,23 @@
1
+ import path from 'path';
2
+ import { Compiler } from 'webpack';
3
+
4
+ import { log } from '../../../utils';
5
+ import { Context, Overrides } from '../types';
6
+
7
+ export function watchRunPlugin(_context: Context, _overrides: Overrides) {
8
+ /* istanbul ignore next: debug only */
9
+ if (log.debug('modified-files').enabled) {
10
+ return new WatchRunPlugin();
11
+ }
12
+ }
13
+
14
+ class WatchRunPlugin {
15
+ /* istanbul ignore next: debug only */
16
+ apply(compiler: Compiler) {
17
+ compiler.hooks.watchRun.tap('WatchRun', compilation => {
18
+ compilation.modifiedFiles?.forEach(file => {
19
+ log.debug('modified-files', path.relative('', file));
20
+ });
21
+ });
22
+ }
23
+ }
@@ -12,6 +12,7 @@ import {
12
12
  provideReactPlugin,
13
13
  tsCheckerPlugin,
14
14
  virtualModulesPlugin,
15
+ watchRunPlugin,
15
16
  } from './plugins';
16
17
  import { Context, Overrides } from './types';
17
18
 
@@ -32,6 +33,7 @@ export function pluginsConfig(context: Context, overrides: Overrides): Result {
32
33
  tsCheckerPlugin,
33
34
  provideReactPlugin,
34
35
  virtualModulesPlugin,
36
+ watchRunPlugin,
35
37
  ]
36
38
  .map(fn => fn(context, overrides))
37
39
  .filter(plugin => !!plugin);
@@ -13,7 +13,26 @@ export interface Context extends Options {
13
13
  isProduction: boolean;
14
14
  isWebComponent: boolean;
15
15
  minify?: MinifyOptions;
16
+ name: string;
16
17
  packageData: ReturnType<typeof getPackageData>;
17
18
  sharedDependencies: ReturnType<typeof loadSharedDependencies>;
18
19
  source: string;
19
20
  }
21
+
22
+ export interface EntryPoint {
23
+ css?: string[];
24
+ js?: string[];
25
+ }
26
+
27
+ export interface EntryPoints {
28
+ full?: EntryPoint;
29
+ light?: EntryPoint;
30
+ }
31
+
32
+ export interface Metadata {
33
+ name: string;
34
+ bundledWith: Record<string, string>;
35
+ sharedDependencies: Record<string, string>;
36
+ dependencies: Record<string, string>;
37
+ entrypoints: EntryPoints;
38
+ }
@@ -1,21 +1,20 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { log, getStartupVersion, readJsonSafe } from '../../../utils';
4
- import { Context } from '../types';
4
+ import { Context, Metadata } from '../types';
5
5
 
6
6
  import { getWebComponentsVersion } from './get-web-components-version';
7
7
 
8
8
  export function generateMetadata(context: Context) {
9
9
  const { destination, name, packageData, sharedDependencies } = context;
10
- const outputFile = `./${destination}/metadata.json`;
11
10
 
12
- if (!fs.existsSync(`./${destination}`)) {
13
- fs.mkdirSync(`./${destination}`, { recursive: true });
11
+ if (!fs.existsSync(destination)) {
12
+ fs.mkdirSync(destination, { recursive: true });
14
13
  }
15
14
 
16
15
  const full = readJsonSafe(path.join(destination, 'bundle', 'full', 'entrypoints.json'));
17
16
  const light = readJsonSafe(path.join(destination, 'bundle', 'light', 'entrypoints.json'));
18
- const metadata = {
17
+ const metadata: Metadata = {
19
18
  name,
20
19
  bundledWith: {
21
20
  '@servicetitan/startup': getStartupVersion(),
@@ -26,6 +25,7 @@ export function generateMetadata(context: Context) {
26
25
  entrypoints: { ...(full ? { full } : {}), ...(light ? { light } : {}) },
27
26
  };
28
27
 
28
+ const outputFile = path.join(destination, 'metadata.json');
29
29
  fs.writeFileSync(outputFile, JSON.stringify(metadata, null, 2), 'utf8');
30
30
 
31
31
  /* istanbul ignore next: debug only */
@@ -4,7 +4,7 @@
4
4
  "incremental": true,
5
5
  "target": "es2018",
6
6
  "module": "esnext",
7
- "moduleResolution": "node",
7
+ "moduleResolution": "Bundler",
8
8
  "lib": ["dom", "dom.iterable", "esnext"],
9
9
  "jsx": "react-jsx",
10
10
  "declaration": true,
@@ -1,3 +0,0 @@
1
- {
2
- "extends": ["@servicetitan/eslint-config/mono"]
3
- }
@@ -1,21 +0,0 @@
1
- # Mac-related stuff
2
- ._.DS_Store/
3
- .DS_Store/
4
- *.DS_Store
5
-
6
- # Node.js
7
- node_modules/
8
-
9
- # yalc store
10
- .yalc/
11
- yalc.lock
12
-
13
- #SonarQube
14
- .scannerwork/
15
-
16
- *.css.d.ts
17
- *.less.d.ts
18
- *.scss.d.ts
19
- /coverage/
20
- dist/
21
- *.tsbuildinfo
package/template/.npmrc DELETED
@@ -1,3 +0,0 @@
1
- engine-strict=true
2
- legacy-peer-deps=true
3
- no-audit=true
@@ -1,9 +0,0 @@
1
- {
2
- "printWidth": 100,
3
- "tabWidth": 4,
4
- "singleQuote": true,
5
- "quoteProps": "consistent",
6
- "arrowParens": "avoid",
7
- "endOfLine": "auto",
8
- "trailingComma": "es5"
9
- }
@@ -1 +0,0 @@
1
- /coverage
@@ -1,3 +0,0 @@
1
- {
2
- "extends": ["@servicetitan/stylelint-config"]
3
- }
@@ -1,18 +0,0 @@
1
- {
2
- // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
3
- // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
4
-
5
- // List of extensions which should be recommended for users of this workspace.
6
- "recommendations": [
7
- "dbaeumer.vscode-eslint",
8
- "esbenp.prettier-vscode",
9
- "stylelint.vscode-stylelint",
10
- "editorconfig.editorconfig",
11
- "yoavbls.pretty-ts-errors",
12
- "streetsidesoftware.code-spell-checker",
13
- "eamodio.gitlens",
14
- "pomber.git-file-history"
15
- ],
16
- // List of extensions recommended by VS Code that should not be recommended for users of this workspace.
17
- "unwantedRecommendations": []
18
- }
@@ -1,4 +0,0 @@
1
- {
2
- "typescript.tsdk": "node_modules/typescript/lib",
3
- "editor.formatOnSave": true
4
- }
@@ -1,4 +0,0 @@
1
- {
2
- "packages": ["packages/*"],
3
- "version": "0.0.0"
4
- }
@@ -1,32 +0,0 @@
1
- {
2
- "name": "root",
3
- "version": "0.0.0",
4
- "description": "Multi-package web application template",
5
- "private": true,
6
- "engines": {
7
- "node": ">=18",
8
- "npm": ">=10"
9
- },
10
- "scripts": {
11
- "bootstrap": "npx --yes @servicetitan/startup install",
12
- "prestart": "npm run bootstrap",
13
- "start": "startup start",
14
- "prebuild": "npm run bootstrap",
15
- "build": "startup build",
16
- "lint": "startup lint",
17
- "test": "startup test"
18
- },
19
- "devDependencies": {
20
- "@servicetitan/startup": ">=22.21.0"
21
- },
22
- "workspaces": [
23
- "packages/*"
24
- ],
25
- "cli": {
26
- "test": {
27
- "setupFilesAfterEnv": [
28
- "./setupTests.ts"
29
- ]
30
- }
31
- }
32
- }
@@ -1,35 +0,0 @@
1
- {
2
- "name": "application",
3
- "version": "0.0.0",
4
- "description": "",
5
- "private": true,
6
- "main": "./dist/index.js",
7
- "typings": "./dist/index.d.ts",
8
- "scripts": {},
9
- "dependencies": {
10
- "@servicetitan/design-system": "^13.4.3",
11
- "@servicetitan/hash-browser-router": "^24.1.0",
12
- "@servicetitan/link-item": "^26.1.0",
13
- "@servicetitan/log-service": "^24.1.0",
14
- "@servicetitan/react-ioc": "^24.1.0",
15
- "@servicetitan/web-components": "^24.1.0",
16
- "axios": "^0.28.1",
17
- "feature-a": "^0.0.0",
18
- "feature-b": "^0.0.0",
19
- "feature-c": "^0.0.0",
20
- "history": "~4.10.1",
21
- "mobx": "~6.10.2",
22
- "react": "^17.0.2",
23
- "react-dom": "^17.0.2",
24
- "react-router-dom": "^5.3.0"
25
- },
26
- "devDependencies": {
27
- "@servicetitan/testing-library": "^1.2.0",
28
- "@testing-library/jest-dom": "^5.17.0",
29
- "@testing-library/react": "^12.1.5",
30
- "@testing-library/react-hooks": "^8.0.1",
31
- "@types/react": "^17.0.37",
32
- "@types/react-dom": "^17.0.11",
33
- "@types/react-router-dom": "^5.3.2"
34
- }
35
- }
@@ -1,33 +0,0 @@
1
- import { mockComponent, mockLocation } from '@servicetitan/testing-library';
2
- import { render, screen } from '@testing-library/react';
3
-
4
- import { App } from '../app';
5
-
6
- jest.mock('../main-page', () => mockComponent('MainPage'));
7
- jest.mock('../second-page', () => mockComponent('SecondPage'));
8
-
9
- describe(`${App.name}`, () => {
10
- const subject = () => render(<App />);
11
-
12
- test('renders sidebar', () => {
13
- subject();
14
-
15
- expect(screen.getByRole('link', { name: 'Main page' })).toBeInTheDocument();
16
- expect(screen.getByRole('link', { name: 'Second page' })).toBeInTheDocument();
17
- });
18
-
19
- const routes = Object.entries({
20
- MainPage: '/',
21
- SecondPage: '/#/second-page',
22
- }).map(([component, path]) => ({ component, path }));
23
-
24
- describe.each(routes)('when location is $path', ({ component, path }) => {
25
- beforeEach(() => mockLocation(path));
26
-
27
- test(`renders <${component} />`, () => {
28
- subject();
29
-
30
- expect(screen).toContainComponent(component);
31
- });
32
- });
33
- });
@@ -1,3 +0,0 @@
1
- body {
2
- margin: var(--spacing-0);
3
- }
@@ -1,45 +0,0 @@
1
- import { StrictMode, FC } from 'react';
2
- import { Switch, Route } from 'react-router-dom';
3
- import { HashBrowserRouter } from '@servicetitan/hash-browser-router';
4
- import { SideNav, Frame, Page, Sidebar } from '@servicetitan/design-system';
5
- import { SideNavLinkItem } from '@servicetitan/link-item';
6
-
7
- import { SecondPage } from './second-page';
8
- import { MainPage } from './main-page';
9
- import './design-system.css';
10
- import './app.css';
11
-
12
- export const App: FC = () => (
13
- <StrictMode>
14
- <HashBrowserRouter>
15
- <Frame>
16
- <Page
17
- sidebar={
18
- <Sidebar localStorageKey="sidebar-application">
19
- <Sidebar.Section padding="y">
20
- <SideNav title="Application">
21
- <SideNavLinkItem pathname="/" exact>
22
- Main page
23
- </SideNavLinkItem>
24
- <SideNavLinkItem pathname="/second-page">
25
- Second page
26
- </SideNavLinkItem>
27
- </SideNav>
28
- </Sidebar.Section>
29
- </Sidebar>
30
- }
31
- maxWidth="wide"
32
- >
33
- <Switch>
34
- <Route path="/" exact>
35
- <MainPage />
36
- </Route>
37
- <Route path="/second-page">
38
- <SecondPage />
39
- </Route>
40
- </Switch>
41
- </Page>
42
- </Frame>
43
- </HashBrowserRouter>
44
- </StrictMode>
45
- );
@@ -1,3 +0,0 @@
1
- @import '~@servicetitan/tokens/dist/tokens.css';
2
- @import '~@servicetitan/anvil-fonts/dist/css/anvil-fonts.css';
3
- @import '~@servicetitan/design-system/dist/system.min.css';
@@ -1,8 +0,0 @@
1
- import { render } from 'react-dom';
2
-
3
- import { App } from './app';
4
-
5
- const appContainer = document.createElement('div');
6
- document.body.appendChild(appContainer);
7
-
8
- render(<App />, appContainer);
@@ -1,5 +0,0 @@
1
- import { Fragment } from 'react';
2
-
3
- export function MainPage() {
4
- return <Fragment>Main page</Fragment>;
5
- }
@@ -1,5 +0,0 @@
1
- import { Fragment } from 'react';
2
-
3
- export function SecondPage() {
4
- return <Fragment>Second page</Fragment>;
5
- }
@@ -1,13 +0,0 @@
1
- {
2
- "extends": "@servicetitan/startup/tsconfig/base",
3
- "compilerOptions": {
4
- "outDir": "dist",
5
- "rootDir": "src"
6
- },
7
- "include": ["src/**/*"],
8
- "references": [
9
- { "path": "../feature-a" },
10
- { "path": "../feature-b" },
11
- { "path": "../feature-c" }
12
- ]
13
- }
@@ -1,19 +0,0 @@
1
- {
2
- "name": "feature-a",
3
- "version": "0.0.0",
4
- "description": "",
5
- "private": true,
6
- "main": "./dist/index.js",
7
- "typings": "./dist/index.d.ts",
8
- "dependencies": {
9
- "react": "^17.0.2",
10
- "react-dom": "^17.0.2"
11
- },
12
- "devDependencies": {
13
- "@types/react": "^17.0.37",
14
- "@types/react-dom": "^17.0.11"
15
- },
16
- "cli": {
17
- "webpack": false
18
- }
19
- }
File without changes
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "@servicetitan/startup/tsconfig/base",
3
- "compilerOptions": {
4
- "outDir": "dist",
5
- "rootDir": "src",
6
- "composite": true
7
- },
8
- "include": ["src/**/*"]
9
- }