@storybook/core-server 7.0.0-alpha.4 → 7.0.0-alpha.41

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 (64) hide show
  1. package/dist/cjs/__for-testing__/main.js +39 -0
  2. package/dist/cjs/build-dev.js +11 -13
  3. package/dist/cjs/build-static.js +54 -85
  4. package/dist/cjs/core-presets.disabled-test.js +367 -0
  5. package/dist/cjs/dev-server.js +21 -35
  6. package/dist/cjs/index.js +0 -14
  7. package/dist/cjs/presets/common-preset.js +44 -22
  8. package/dist/cjs/standalone.js +0 -2
  9. package/dist/cjs/utils/StoryIndexGenerator.js +322 -61
  10. package/dist/cjs/utils/__mockdata__/duplicate/A.stories.js +14 -0
  11. package/dist/cjs/utils/__mockdata__/duplicate/SecondA.stories.js +14 -0
  12. package/dist/cjs/utils/__mockdata__/{src → errors}/NoMeta.stories.js +0 -0
  13. package/dist/cjs/utils/__mockdata__/errors/NoStories.stories.js +13 -0
  14. package/dist/cjs/utils/copy-all-static-files.js +5 -5
  15. package/dist/cjs/utils/get-builders.js +1 -3
  16. package/dist/cjs/utils/metadata.js +2 -6
  17. package/dist/cjs/utils/open-in-browser.js +3 -5
  18. package/dist/cjs/utils/output-startup-information.js +3 -3
  19. package/dist/cjs/utils/output-stats.js +0 -2
  20. package/dist/cjs/utils/release-notes.js +1 -5
  21. package/dist/cjs/utils/server-init.js +0 -2
  22. package/dist/cjs/utils/server-statics.js +3 -5
  23. package/dist/cjs/utils/stories-json.js +61 -11
  24. package/dist/cjs/utils/update-check.js +3 -5
  25. package/dist/cjs/utils/watch-story-specifiers.js +4 -4
  26. package/dist/esm/__for-testing__/main.js +35 -0
  27. package/dist/esm/build-dev.js +12 -12
  28. package/dist/esm/build-static.js +54 -77
  29. package/dist/esm/core-presets.disabled-test.js +352 -0
  30. package/dist/esm/dev-server.js +21 -33
  31. package/dist/esm/index.js +3 -2
  32. package/dist/esm/presets/common-preset.js +31 -13
  33. package/dist/esm/standalone.js +0 -1
  34. package/dist/esm/utils/StoryIndexGenerator.js +323 -55
  35. package/dist/esm/utils/__mockdata__/duplicate/A.stories.js +6 -0
  36. package/dist/esm/utils/__mockdata__/duplicate/SecondA.stories.js +6 -0
  37. package/dist/esm/utils/__mockdata__/{src → errors}/NoMeta.stories.js +0 -0
  38. package/dist/esm/utils/__mockdata__/errors/NoStories.stories.js +5 -0
  39. package/dist/esm/utils/copy-all-static-files.js +5 -4
  40. package/dist/esm/utils/get-builders.js +1 -3
  41. package/dist/esm/utils/metadata.js +2 -3
  42. package/dist/esm/utils/open-in-browser.js +2 -3
  43. package/dist/esm/utils/output-startup-information.js +2 -2
  44. package/dist/esm/utils/output-stats.js +0 -1
  45. package/dist/esm/utils/release-notes.js +1 -3
  46. package/dist/esm/utils/server-init.js +0 -1
  47. package/dist/esm/utils/server-statics.js +1 -2
  48. package/dist/esm/utils/stories-json.js +56 -8
  49. package/dist/esm/utils/update-check.js +2 -3
  50. package/dist/esm/utils/watch-story-specifiers.js +3 -3
  51. package/dist/types/__for-testing__/main.d.ts +1 -0
  52. package/dist/types/dev-server.d.ts +3 -3
  53. package/dist/types/index.d.ts +2 -2
  54. package/dist/types/presets/common-preset.d.ts +5 -3
  55. package/dist/types/utils/StoryIndexGenerator.d.ts +44 -7
  56. package/dist/types/utils/__mockdata__/{src → errors}/NoMeta.stories.d.ts +0 -0
  57. package/dist/types/utils/__mockdata__/errors/NoStories.stories.d.ts +4 -0
  58. package/dist/types/utils/copy-all-static-files.d.ts +1 -1
  59. package/dist/types/utils/get-builders.d.ts +1 -1
  60. package/dist/types/utils/server-init.d.ts +1 -1
  61. package/dist/types/utils/stories-json.d.ts +3 -1
  62. package/package.json +26 -26
  63. package/LICENSE +0 -21
  64. package/typings.d.ts +0 -13
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ /// <reference types="node" />
7
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8
+ // @ts-ignore
9
+ var config = {
10
+ stories: ['../../ui/manager/src/**/*.stories.@(ts|tsx|js|jsx|mdx)', '../../lib/components/src/**/*.stories.@(ts|tsx|js|jsx|mdx)', './../../addons/docs/**/*.stories.@(ts|tsx|js|jsx|mdx)', './../../addons/interactions/**/*.stories.@(ts|tsx|js|jsx|mdx)'],
11
+ addons: [{
12
+ name: '@storybook/addon-docs',
13
+ options: {
14
+ transcludeMarkdown: true,
15
+ sourceLoaderOptions: null
16
+ }
17
+ }, '@storybook/addon-essentials', '@storybook/addon-interactions', '@storybook/addon-storysource', '@storybook/addon-links', '@storybook/addon-jest', '@storybook/addon-a11y'],
18
+ core: {
19
+ channelOptions: {
20
+ allowFunction: false,
21
+ maxDepth: 10
22
+ },
23
+ disableTelemetry: true
24
+ },
25
+ logLevel: 'debug',
26
+ features: {
27
+ interactionsDebugger: true,
28
+ breakingChangesV7: false,
29
+ storyStoreV7: false
30
+ },
31
+ framework: {
32
+ name: '@storybook/react-webpack5',
33
+ options: {
34
+ fastRefresh: true,
35
+ strictMode: true
36
+ }
37
+ }
38
+ };
39
+ module.exports = config;
@@ -1,14 +1,10 @@
1
1
  "use strict";
2
2
 
3
- require("core-js/modules/es.symbol.description.js");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
6
  exports.buildDevStandalone = buildDevStandalone;
9
7
 
10
- require("core-js/modules/es.promise.js");
11
-
12
8
  var _coreCommon = require("@storybook/core-common");
13
9
 
14
10
  var _prompts = _interopRequireDefault(require("prompts"));
@@ -97,6 +93,7 @@ async function buildDevStandalone(options) {
97
93
 
98
94
  var corePresets = [];
99
95
  var frameworkName = typeof framework === 'string' ? framework : framework === null || framework === void 0 ? void 0 : framework.name;
96
+ (0, _coreCommon.validateFrameworkName)(frameworkName);
100
97
 
101
98
  if (frameworkName) {
102
99
  corePresets.push((0, _path.join)(frameworkName, 'preset'));
@@ -106,7 +103,7 @@ async function buildDevStandalone(options) {
106
103
 
107
104
  _nodeLogger.logger.info('=> Loading presets');
108
105
 
109
- var presets = (0, _coreCommon.loadAllPresets)(_objectSpread({
106
+ var presets = await (0, _coreCommon.loadAllPresets)(_objectSpread({
110
107
  corePresets: corePresets,
111
108
  overridePresets: []
112
109
  }, options));
@@ -118,8 +115,8 @@ async function buildDevStandalone(options) {
118
115
  previewBuilder = _await$getBuilders2[0],
119
116
  managerBuilder = _await$getBuilders2[1];
120
117
 
121
- presets = (0, _coreCommon.loadAllPresets)(_objectSpread({
122
- corePresets: [require.resolve('./presets/common-preset'), ...managerBuilder.corePresets, ...previewBuilder.corePresets, ...corePresets, require.resolve('./presets/babel-cache-preset')],
118
+ presets = await (0, _coreCommon.loadAllPresets)(_objectSpread({
119
+ corePresets: [require.resolve('./presets/common-preset'), ...(managerBuilder.corePresets || []), ...(previewBuilder.corePresets || []), ...corePresets, require.resolve('./presets/babel-cache-preset')],
123
120
  overridePresets: previewBuilder.overridePresets
124
121
  }, options));
125
122
  var features = await presets.apply('features');
@@ -143,22 +140,23 @@ async function buildDevStandalone(options) {
143
140
 
144
141
  if (options.webpackStatsJson) {
145
142
  var target = options.webpackStatsJson === true ? options.outputDir : options.webpackStatsJson;
146
- await (0, _outputStats.outputStats)(target, previewStats, managerStats);
143
+ await (0, _outputStats.outputStats)(target, previewStats);
147
144
  }
148
145
 
149
146
  if (options.smokeTest) {
150
- var warnings = []; // @ts-ignore
147
+ var _managerStats$toJson, _previewStats$toJson;
151
148
 
152
- warnings.push(...(managerStats && managerStats.toJson().warnings || [])); // @ts-ignore
153
-
154
- warnings.push(...(managerStats && previewStats.toJson().warnings || []));
149
+ var warnings = [];
150
+ warnings.push(...((managerStats === null || managerStats === void 0 ? void 0 : (_managerStats$toJson = managerStats.toJson()) === null || _managerStats$toJson === void 0 ? void 0 : _managerStats$toJson.warnings) || []));
151
+ warnings.push(...((previewStats === null || previewStats === void 0 ? void 0 : (_previewStats$toJson = previewStats.toJson()) === null || _previewStats$toJson === void 0 ? void 0 : _previewStats$toJson.warnings) || []));
155
152
  var problems = warnings.filter(function (warning) {
156
153
  return !warning.message.includes(`export 'useInsertionEffect'`);
157
154
  }).filter(function (warning) {
158
155
  return !warning.message.includes(`compilation but it's unused`);
159
156
  }).filter(function (warning) {
160
157
  return !warning.message.includes(`Conflicting values for 'process.env.NODE_ENV'`);
161
- });
158
+ }); // eslint-disable-next-line no-console
159
+
162
160
  console.log(problems.map(function (p) {
163
161
  return p.stack;
164
162
  }));
@@ -1,23 +1,17 @@
1
1
  "use strict";
2
2
 
3
- require("core-js/modules/es.symbol.description.js");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
6
  exports.buildStaticStandalone = buildStaticStandalone;
9
7
 
10
- require("core-js/modules/es.promise.js");
11
-
12
8
  var _chalk = _interopRequireDefault(require("chalk"));
13
9
 
14
- var _cpy = _interopRequireDefault(require("cpy"));
15
-
16
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
10
+ var _fsExtra = require("fs-extra");
17
11
 
18
- var _path = _interopRequireWildcard(require("path"));
12
+ var _path = require("path");
19
13
 
20
- var _tsDedent = _interopRequireDefault(require("ts-dedent"));
14
+ var _tsDedent = require("ts-dedent");
21
15
 
22
16
  var _global = _interopRequireDefault(require("global"));
23
17
 
@@ -59,10 +53,6 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
59
53
 
60
54
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
61
55
 
62
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
63
-
64
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
65
-
66
56
  async function buildStaticStandalone(options) {
67
57
  var _options$staticDir;
68
58
 
@@ -77,25 +67,18 @@ async function buildStaticStandalone(options) {
77
67
  throw new Error("Won't copy root directory. Check your staticDirs!");
78
68
  }
79
69
 
80
- options.outputDir = _path.default.isAbsolute(options.outputDir) ? options.outputDir : _path.default.join(process.cwd(), options.outputDir);
81
- options.configDir = _path.default.resolve(options.configDir);
70
+ options.outputDir = (0, _path.isAbsolute)(options.outputDir) ? options.outputDir : (0, _path.join)(process.cwd(), options.outputDir);
71
+ options.configDir = (0, _path.resolve)(options.configDir);
82
72
  /* eslint-enable no-param-reassign */
83
73
 
84
- var defaultFavIcon = require.resolve('@storybook/core-server/public/favicon.ico');
85
-
86
- _nodeLogger.logger.info((0, _chalk.default)`=> Cleaning outputDir: {cyan ${options.outputDir}}`);
74
+ _nodeLogger.logger.info((0, _chalk.default)`=> Cleaning outputDir: {cyan ${options.outputDir.replace(process.cwd(), '')}}`);
87
75
 
88
76
  if (options.outputDir === '/') {
89
77
  throw new Error("Won't remove directory '/'. Check your outputDir!");
90
78
  }
91
79
 
92
- await _fsExtra.default.emptyDir(options.outputDir);
93
- await (0, _cpy.default)(defaultFavIcon, options.outputDir);
94
-
95
- var _await$import = await Promise.resolve().then(function () {
96
- return _interopRequireWildcard(require('@storybook/manager-webpack5/prebuilt-manager'));
97
- }),
98
- getPrebuiltDir = _await$import.getPrebuiltDir;
80
+ await (0, _fsExtra.emptyDir)(options.outputDir);
81
+ await (0, _fsExtra.ensureDir)(options.outputDir);
99
82
 
100
83
  var _loadMainConfig = (0, _coreCommon.loadMainConfig)(options),
101
84
  framework = _loadMainConfig.framework;
@@ -111,7 +94,7 @@ async function buildStaticStandalone(options) {
111
94
 
112
95
  _nodeLogger.logger.info('=> Loading presets');
113
96
 
114
- var presets = (0, _coreCommon.loadAllPresets)(_objectSpread({
97
+ var presets = await (0, _coreCommon.loadAllPresets)(_objectSpread({
115
98
  corePresets: [require.resolve('./presets/common-preset'), ...corePresets],
116
99
  overridePresets: []
117
100
  }, options));
@@ -123,14 +106,27 @@ async function buildStaticStandalone(options) {
123
106
  previewBuilder = _await$getBuilders2[0],
124
107
  managerBuilder = _await$getBuilders2[1];
125
108
 
126
- presets = (0, _coreCommon.loadAllPresets)(_objectSpread({
109
+ presets = await (0, _coreCommon.loadAllPresets)(_objectSpread({
127
110
  corePresets: [require.resolve('./presets/common-preset'), ...(managerBuilder.corePresets || []), ...(previewBuilder.corePresets || []), ...corePresets, require.resolve('./presets/babel-cache-preset')],
128
111
  overridePresets: previewBuilder.overridePresets || []
129
112
  }, options));
130
- var staticDirs = await presets.apply('staticDirs');
113
+
114
+ var _await$Promise$all = await Promise.all([presets.apply('features'), presets.apply('core'), presets.apply('staticDirs'), presets.apply('storyIndexers', []), presets.apply('stories'), presets.apply('docs', {})]),
115
+ _await$Promise$all2 = _slicedToArray(_await$Promise$all, 6),
116
+ features = _await$Promise$all2[0],
117
+ core = _await$Promise$all2[1],
118
+ staticDirs = _await$Promise$all2[2],
119
+ storyIndexers = _await$Promise$all2[3],
120
+ stories = _await$Promise$all2[4],
121
+ docsOptions = _await$Promise$all2[5];
122
+
123
+ var fullOptions = _objectSpread(_objectSpread({}, options), {}, {
124
+ presets: presets,
125
+ features: features
126
+ });
131
127
 
132
128
  if (staticDirs && options.staticDir) {
133
- throw new Error((0, _tsDedent.default)`
129
+ throw new Error((0, _tsDedent.dedent)`
134
130
  Conflict when trying to read staticDirs:
135
131
  * Storybook's configuration option: 'staticDirs'
136
132
  * Storybook's CLI flag: '--staticDir' or '-s'
@@ -139,17 +135,23 @@ async function buildStaticStandalone(options) {
139
135
  `);
140
136
  }
141
137
 
138
+ var effects = [];
139
+ _global.default.FEATURES = features;
140
+ await managerBuilder.build({
141
+ startTime: process.hrtime(),
142
+ options: fullOptions
143
+ });
144
+
142
145
  if (staticDirs) {
143
- await (0, _copyAllStaticFiles.copyAllStaticFilesRelativeToMain)(staticDirs, options.outputDir, options.configDir);
146
+ effects.push((0, _copyAllStaticFiles.copyAllStaticFilesRelativeToMain)(staticDirs, options.outputDir, options.configDir));
144
147
  }
145
148
 
146
149
  if (options.staticDir) {
147
- await (0, _copyAllStaticFiles.copyAllStaticFiles)(options.staticDir, options.outputDir);
150
+ effects.push((0, _copyAllStaticFiles.copyAllStaticFiles)(options.staticDir, options.outputDir));
148
151
  }
149
152
 
150
- var features = await presets.apply('features');
151
- _global.default.FEATURES = features;
152
- var extractTasks = [];
153
+ var coreServerPublicDir = (0, _path.join)((0, _path.dirname)(require.resolve('@storybook/core-server/package.json')), 'public');
154
+ effects.push((0, _fsExtra.copy)(coreServerPublicDir, options.outputDir));
153
155
  var initializedStoryIndexGenerator = Promise.resolve(undefined);
154
156
 
155
157
  if ((features !== null && features !== void 0 && features.buildStoriesJson || features !== null && features !== void 0 && features.storyStoreV7) && !options.ignorePreview) {
@@ -158,89 +160,56 @@ async function buildStaticStandalone(options) {
158
160
  configDir: options.configDir,
159
161
  workingDir: workingDir
160
162
  };
161
- var normalizedStories = (0, _coreCommon.normalizeStories)(await presets.apply('stories'), directories);
162
- var storyIndexers = await presets.apply('storyIndexers', []);
163
+ var normalizedStories = (0, _coreCommon.normalizeStories)(stories, directories);
163
164
  var generator = new _StoryIndexGenerator.StoryIndexGenerator(normalizedStories, _objectSpread(_objectSpread({}, directories), {}, {
164
165
  storyIndexers: storyIndexers,
166
+ docs: docsOptions,
165
167
  storiesV2Compatibility: !(features !== null && features !== void 0 && features.breakingChangesV7) && !(features !== null && features !== void 0 && features.storyStoreV7),
166
168
  storyStoreV7: !!(features !== null && features !== void 0 && features.storyStoreV7)
167
169
  }));
168
170
  initializedStoryIndexGenerator = generator.initialize().then(function () {
169
171
  return generator;
170
172
  });
171
- extractTasks.push((0, _storiesJson.extractStoriesJson)(_path.default.join(options.outputDir, 'stories.json'), initializedStoryIndexGenerator));
173
+ effects.push((0, _storiesJson.extractStoriesJson)((0, _path.join)(options.outputDir, 'stories.json'), initializedStoryIndexGenerator, _storiesJson.convertToIndexV3));
174
+ effects.push((0, _storiesJson.extractStoriesJson)((0, _path.join)(options.outputDir, 'index.json'), initializedStoryIndexGenerator));
172
175
  }
173
176
 
174
- var core = await presets.apply('core');
175
-
176
177
  if (!(core !== null && core !== void 0 && core.disableTelemetry)) {
177
- initializedStoryIndexGenerator.then(async function (generator) {
178
- if (!generator) {
179
- return;
180
- }
181
-
182
- var storyIndex = await generator.getIndex();
178
+ effects.push(initializedStoryIndexGenerator.then(async function (generator) {
179
+ var storyIndex = await (generator === null || generator === void 0 ? void 0 : generator.getIndex());
183
180
  var payload = storyIndex ? {
184
181
  storyIndex: {
185
- storyCount: Object.keys(storyIndex.stories).length,
182
+ storyCount: Object.keys(storyIndex.entries).length,
186
183
  version: storyIndex.v
187
184
  }
188
185
  } : undefined;
189
- (0, _telemetry.telemetry)('build', payload, {
186
+ await (0, _telemetry.telemetry)('build', payload, {
190
187
  configDir: options.configDir
191
188
  });
192
- });
189
+ }));
193
190
  }
194
191
 
195
192
  if (!(core !== null && core !== void 0 && core.disableProjectJson)) {
196
- extractTasks.push((0, _metadata.extractStorybookMetadata)(_path.default.join(options.outputDir, 'project.json'), options.configDir));
193
+ effects.push((0, _metadata.extractStorybookMetadata)((0, _path.join)(options.outputDir, 'project.json'), options.configDir));
197
194
  }
198
195
 
199
- var fullOptions = _objectSpread(_objectSpread({}, options), {}, {
200
- presets: presets,
201
- features: features
202
- });
203
-
204
196
  if (options.debugWebpack) {
205
197
  (0, _coreCommon.logConfig)('Preview webpack config', await previewBuilder.getConfig(fullOptions));
206
- (0, _coreCommon.logConfig)('Manager webpack config', await managerBuilder.getConfig(fullOptions));
207
198
  }
208
199
 
209
- var prebuiltDir = await getPrebuiltDir(fullOptions);
210
- var startTime = process.hrtime(); // When using the prebuilt manager, we straight up copy it into the outputDir instead of building it
211
-
212
- var manager = prebuiltDir ? (0, _cpy.default)('**', options.outputDir, {
213
- cwd: prebuiltDir,
214
- parents: true
215
- }).then(function () {}) : managerBuilder.build({
216
- startTime: startTime,
217
- options: fullOptions
218
- });
219
-
220
200
  if (options.ignorePreview) {
221
201
  _nodeLogger.logger.info(`=> Not building preview`);
222
202
  }
223
203
 
224
- var preview = options.ignorePreview ? Promise.resolve() : previewBuilder.build({
225
- startTime: startTime,
204
+ await Promise.all([...(options.ignorePreview ? [] : [previewBuilder.build({
205
+ startTime: process.hrtime(),
226
206
  options: fullOptions
227
- });
228
-
229
- var _await$Promise$all = await Promise.all([manager.catch(async function (err) {
230
- await (previewBuilder === null || previewBuilder === void 0 ? void 0 : previewBuilder.bail());
231
- throw err;
232
- }), preview.catch(async function (err) {
233
- await (managerBuilder === null || managerBuilder === void 0 ? void 0 : managerBuilder.bail());
234
- throw err;
235
- }), ...extractTasks]),
236
- _await$Promise$all2 = _slicedToArray(_await$Promise$all, 2),
237
- managerStats = _await$Promise$all2[0],
238
- previewStats = _await$Promise$all2[1];
239
-
240
- if (options.webpackStatsJson) {
241
- var target = options.webpackStatsJson === true ? options.outputDir : options.webpackStatsJson;
242
- await (0, _outputStats.outputStats)(target, previewStats, managerStats);
243
- }
207
+ }).then(async function (previewStats) {
208
+ if (options.webpackStatsJson) {
209
+ var target = options.webpackStatsJson === true ? options.outputDir : options.webpackStatsJson;
210
+ await (0, _outputStats.outputStats)(target, previewStats);
211
+ }
212
+ })]), ...effects]);
244
213
 
245
214
  _nodeLogger.logger.info(`=> Output directory: ${options.outputDir}`);
246
215
  }