@promptbook/core 0.84.0-12 → 0.84.0-14

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/esm/index.es.js CHANGED
@@ -7,7 +7,7 @@ import hexEncoder from 'crypto-js/enc-hex';
7
7
  import sha256 from 'crypto-js/sha256';
8
8
  import { basename, join, dirname } from 'path';
9
9
  import { SHA256 } from 'crypto-js';
10
- import { lookup } from 'mime-types';
10
+ import { lookup, extension } from 'mime-types';
11
11
  import moment from 'moment';
12
12
  import colors from 'colors';
13
13
 
@@ -25,7 +25,7 @@ var BOOK_LANGUAGE_VERSION = '1.0.0';
25
25
  * @generated
26
26
  * @see https://github.com/webgptorg/promptbook
27
27
  */
28
- var PROMPTBOOK_ENGINE_VERSION = '0.84.0-11';
28
+ var PROMPTBOOK_ENGINE_VERSION = '0.84.0-13';
29
29
  /**
30
30
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
31
31
  * Note: [💞] Ignore a discrepancy between file name and entity name
@@ -672,6 +672,18 @@ var DEFAULT_BOOK_TITLE = "\u2728 Untitled Book";
672
672
  * @public exported from `@promptbook/core`
673
673
  */
674
674
  var DEFAULT_TASK_TITLE = "Task";
675
+ /**
676
+ * When the title of the prompt task is not provided, the default title is used
677
+ *
678
+ * @public exported from `@promptbook/core`
679
+ */
680
+ var DEFAULT_PROMPT_TASK_TITLE = "Prompt";
681
+ /**
682
+ * When the pipeline is flat and no name of return parameter is provided, this name is used
683
+ *
684
+ * @public exported from `@promptbook/core`
685
+ */
686
+ var DEFAULT_BOOK_OUTPUT_PARAMETER_NAME = 'result';
675
687
  // <- TODO: [🧠] Better system for generator warnings - not always "code" and "by `@promptbook/cli`"
676
688
  /**
677
689
  * The maximum number of iterations for a loops
@@ -5674,22 +5686,6 @@ function $registeredScrapersMessage(availableScrapers) {
5674
5686
  * TODO: [®] DRY Register logic
5675
5687
  */
5676
5688
 
5677
- /**
5678
- * Removes emojis from a string and fix whitespaces
5679
- *
5680
- * @param text with emojis
5681
- * @returns text without emojis
5682
- * @public exported from `@promptbook/utils`
5683
- */
5684
- function removeEmojis(text) {
5685
- // Replace emojis (and also ZWJ sequence) with hyphens
5686
- text = text.replace(/(\p{Extended_Pictographic})\p{Modifier_Symbol}/gu, '$1');
5687
- text = text.replace(/(\p{Extended_Pictographic})[\u{FE00}-\u{FE0F}]/gu, '$1');
5688
- text = text.replace(/(\p{Extended_Pictographic})(\u{200D}\p{Extended_Pictographic})*/gu, '$1');
5689
- text = text.replace(/\p{Extended_Pictographic}/gu, '');
5690
- return text;
5691
- }
5692
-
5693
5689
  /**
5694
5690
  * @@@
5695
5691
  *
@@ -5752,30 +5748,6 @@ function normalizeToKebabCase(text) {
5752
5748
  * Note: [💞] Ignore a discrepancy between file name and entity name
5753
5749
  */
5754
5750
 
5755
- /**
5756
- * @@@
5757
- *
5758
- * @param value @@@
5759
- * @returns @@@
5760
- * @example @@@
5761
- * @public exported from `@promptbook/utils`
5762
- */
5763
- function titleToName(value) {
5764
- if (isValidUrl(value)) {
5765
- value = value.replace(/^https?:\/\//, '');
5766
- value = value.replace(/\.html$/, '');
5767
- }
5768
- else if (isValidFilePath(value)) {
5769
- value = basename(value);
5770
- // Note: Keeping extension in the name
5771
- }
5772
- value = value.split('/').join('-');
5773
- value = removeEmojis(value);
5774
- value = normalizeToKebabCase(value);
5775
- // TODO: [🧠] Maybe warn or add some padding to short name which are not good identifiers
5776
- return value;
5777
- }
5778
-
5779
5751
  /**
5780
5752
  * Creates unique name for the source
5781
5753
  *
@@ -5861,6 +5833,57 @@ function isFileExisting(filename, fs) {
5861
5833
  * TODO: [🖇] What about symlinks?
5862
5834
  */
5863
5835
 
5836
+ /**
5837
+ * Convert mime type to file extension
5838
+ *
5839
+ * Note: If the mime type is invalid, `null` is returned
5840
+ *
5841
+ * @private within the repository
5842
+ */
5843
+ function mimeTypeToExtension(value) {
5844
+ return extension(value) || null;
5845
+ }
5846
+
5847
+ /**
5848
+ * Removes emojis from a string and fix whitespaces
5849
+ *
5850
+ * @param text with emojis
5851
+ * @returns text without emojis
5852
+ * @public exported from `@promptbook/utils`
5853
+ */
5854
+ function removeEmojis(text) {
5855
+ // Replace emojis (and also ZWJ sequence) with hyphens
5856
+ text = text.replace(/(\p{Extended_Pictographic})\p{Modifier_Symbol}/gu, '$1');
5857
+ text = text.replace(/(\p{Extended_Pictographic})[\u{FE00}-\u{FE0F}]/gu, '$1');
5858
+ text = text.replace(/(\p{Extended_Pictographic})(\u{200D}\p{Extended_Pictographic})*/gu, '$1');
5859
+ text = text.replace(/\p{Extended_Pictographic}/gu, '');
5860
+ return text;
5861
+ }
5862
+
5863
+ /**
5864
+ * @@@
5865
+ *
5866
+ * @param value @@@
5867
+ * @returns @@@
5868
+ * @example @@@
5869
+ * @public exported from `@promptbook/utils`
5870
+ */
5871
+ function titleToName(value) {
5872
+ if (isValidUrl(value)) {
5873
+ value = value.replace(/^https?:\/\//, '');
5874
+ value = value.replace(/\.html$/, '');
5875
+ }
5876
+ else if (isValidFilePath(value)) {
5877
+ value = basename(value);
5878
+ // Note: Keeping extension in the name
5879
+ }
5880
+ value = value.split('/').join('-');
5881
+ value = removeEmojis(value);
5882
+ value = normalizeToKebabCase(value);
5883
+ // TODO: [🧠] Maybe warn or add some padding to short name which are not good identifiers
5884
+ return value;
5885
+ }
5886
+
5864
5887
  /**
5865
5888
  * The built-in `fetch' function with a lightweight error handling wrapper as default fetch function used in Promptbook scrapers
5866
5889
  *
@@ -5896,7 +5919,7 @@ var scraperFetch = function (url, init) { return __awaiter(void 0, void 0, void
5896
5919
  function makeKnowledgeSourceHandler(knowledgeSource, tools, options) {
5897
5920
  var _a;
5898
5921
  return __awaiter(this, void 0, void 0, function () {
5899
- var _b, fetch, knowledgeSourceContent, name, _c, _d, rootDirname, url, response, mimeType, filename, hash, rootDirname_1, filepath, _f, _g, _h, _j, _k, filename_1, fileExtension, mimeType;
5922
+ var _b, fetch, knowledgeSourceContent, name, _c, _d, rootDirname, url, response_1, mimeType, basename, hash, rootDirname_1, filepath, _f, _g, _h, _j, _k, filename_1, fileExtension, mimeType;
5900
5923
  return __generator(this, function (_l) {
5901
5924
  switch (_l.label) {
5902
5925
  case 0:
@@ -5912,25 +5935,67 @@ function makeKnowledgeSourceHandler(knowledgeSource, tools, options) {
5912
5935
  url = knowledgeSourceContent;
5913
5936
  return [4 /*yield*/, fetch(url)];
5914
5937
  case 1:
5915
- response = _l.sent();
5916
- mimeType = ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
5917
- filename = url.split('/').pop() || titleToName(url);
5938
+ response_1 = _l.sent();
5939
+ mimeType = ((_a = response_1.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
5940
+ if (tools.fs === undefined || !url.endsWith('.pdf' /* <- TODO: [💵] */)) {
5941
+ return [2 /*return*/, {
5942
+ source: name,
5943
+ filename: null,
5944
+ url: url,
5945
+ mimeType: mimeType,
5946
+ /*
5947
+ TODO: [🥽]
5948
+ > async asBlob() {
5949
+ > // TODO: [👨🏻‍🤝‍👨🏻] This can be called multiple times BUT when called second time, response in already consumed
5950
+ > const content = await response.blob();
5951
+ > return content;
5952
+ > },
5953
+ */
5954
+ asJson: function () {
5955
+ return __awaiter(this, void 0, void 0, function () {
5956
+ var content;
5957
+ return __generator(this, function (_a) {
5958
+ switch (_a.label) {
5959
+ case 0: return [4 /*yield*/, response_1.json()];
5960
+ case 1:
5961
+ content = _a.sent();
5962
+ return [2 /*return*/, content];
5963
+ }
5964
+ });
5965
+ });
5966
+ },
5967
+ asText: function () {
5968
+ return __awaiter(this, void 0, void 0, function () {
5969
+ var content;
5970
+ return __generator(this, function (_a) {
5971
+ switch (_a.label) {
5972
+ case 0: return [4 /*yield*/, response_1.text()];
5973
+ case 1:
5974
+ content = _a.sent();
5975
+ return [2 /*return*/, content];
5976
+ }
5977
+ });
5978
+ });
5979
+ },
5980
+ }];
5981
+ }
5982
+ basename = url.split('/').pop() || titleToName(url);
5918
5983
  hash = sha256(hexEncoder.parse(url)).toString( /* hex */);
5919
5984
  rootDirname_1 = join(process.cwd(), DEFAULT_DOWNLOAD_CACHE_DIRNAME);
5920
- filepath = join.apply(void 0, __spreadArray(__spreadArray([], __read(nameToSubfolderPath(hash /* <- TODO: [🎎] Maybe add some SHA256 prefix */)), false), ["".concat(filename.substring(0, MAX_FILENAME_LENGTH), ".pdf")], false));
5985
+ filepath = join.apply(void 0, __spreadArray(__spreadArray([], __read(nameToSubfolderPath(hash /* <- TODO: [🎎] Maybe add some SHA256 prefix */)), false), ["".concat(basename.substring(0, MAX_FILENAME_LENGTH), ".").concat(mimeTypeToExtension(mimeType))], false));
5921
5986
  return [4 /*yield*/, tools.fs.mkdir(dirname(join(rootDirname_1, filepath)), { recursive: true })];
5922
5987
  case 2:
5923
5988
  _l.sent();
5924
5989
  _g = (_f = tools.fs).writeFile;
5925
5990
  _h = [join(rootDirname_1, filepath)];
5926
5991
  _k = (_j = Buffer).from;
5927
- return [4 /*yield*/, response.arrayBuffer()];
5992
+ return [4 /*yield*/, response_1.arrayBuffer()];
5928
5993
  case 3: return [4 /*yield*/, _g.apply(_f, _h.concat([_k.apply(_j, [_l.sent()])]))];
5929
5994
  case 4:
5930
5995
  _l.sent();
5931
- // TODO: !!!!!!!! Check the file security
5996
+ // TODO: [💵] Check the file security
5932
5997
  // TODO: !!!!!!!! Check the file size (if it is not too big)
5933
- // TODO: !!!!!!!! Delete the file
5998
+ // TODO: !!!!!!!! Delete the file after the scraping is done
5934
5999
  return [2 /*return*/, makeKnowledgeSourceHandler({ name: name, knowledgeSourceContent: filepath }, tools, __assign(__assign({}, options), { rootDirname: rootDirname_1 }))];
5935
6000
  case 5:
5936
6001
  if (!isValidFilePath(knowledgeSourceContent)) return [3 /*break*/, 7];
@@ -9051,12 +9116,15 @@ function isFlatPipeline(pipelineString) {
9051
9116
  pipelineString = removeMarkdownComments(pipelineString);
9052
9117
  pipelineString = spaceTrim(pipelineString);
9053
9118
  var isMarkdownBeginningWithHeadline = pipelineString.startsWith('# ');
9054
- var isLastLineReturnStatement = pipelineString.split('\n').pop().split('`').join('').startsWith('->');
9055
- // TODO: Also (double)check
9119
+ //const isLastLineReturnStatement = pipelineString.split('\n').pop()!.split('`').join('').startsWith('->');
9120
+ var isBacktickBlockUsed = pipelineString.includes('```');
9121
+ var isQuoteBlocksUsed = /^>\s+/m.test(pipelineString);
9122
+ var isBlocksUsed = isBacktickBlockUsed || isQuoteBlocksUsed;
9123
+ // TODO: [🧉] Also (double)check
9056
9124
  // > const usedCommands
9057
9125
  // > const isBlocksUsed
9058
9126
  // > const returnStatementCount
9059
- var isFlat = !isMarkdownBeginningWithHeadline && isLastLineReturnStatement;
9127
+ var isFlat = !isMarkdownBeginningWithHeadline && !isBlocksUsed; /* && isLastLineReturnStatement */
9060
9128
  return isFlat;
9061
9129
  }
9062
9130
 
@@ -9070,9 +9138,26 @@ function deflatePipeline(pipelineString) {
9070
9138
  return pipelineString;
9071
9139
  }
9072
9140
  var pipelineStringLines = pipelineString.split('\n');
9073
- var returnStatement = pipelineStringLines.pop();
9141
+ var potentialReturnStatement = pipelineStringLines.pop();
9142
+ var returnStatement;
9143
+ if (/(-|=)>\s*\{.*\}/.test(potentialReturnStatement)) {
9144
+ // Note: Last line is return statement
9145
+ returnStatement = potentialReturnStatement;
9146
+ }
9147
+ else {
9148
+ // Note: Last line is not a return statement
9149
+ returnStatement = "-> {".concat(DEFAULT_BOOK_OUTPUT_PARAMETER_NAME, "}");
9150
+ pipelineStringLines.push(potentialReturnStatement);
9151
+ }
9074
9152
  var prompt = spaceTrim(pipelineStringLines.join('\n'));
9075
- pipelineString = validatePipelineString(spaceTrim(function (block) { return "\n # ".concat(DEFAULT_BOOK_TITLE, "\n\n ## Prompt\n\n ```\n ").concat(block(prompt), "\n ```\n\n ").concat(returnStatement, "\n "); }));
9153
+ var quotedPrompt;
9154
+ if (prompt.split('\n').length <= 1) {
9155
+ quotedPrompt = "> ".concat(prompt);
9156
+ }
9157
+ else {
9158
+ quotedPrompt = spaceTrim(function (block) { return "\n ```\n ".concat(block(prompt.split('`').join('\\`')), "\n ```\n "); });
9159
+ }
9160
+ pipelineString = validatePipelineString(spaceTrim(function (block) { return "\n # ".concat(DEFAULT_BOOK_TITLE, "\n\n ## Prompt\n\n ").concat(block(quotedPrompt), "\n\n ").concat(returnStatement, "\n "); }));
9076
9161
  // <- TODO: Maybe use book` notation
9077
9162
  return pipelineString;
9078
9163
  }
@@ -11331,7 +11416,7 @@ var markitdownScraperMetadata = $deepFreeze({
11331
11416
  className: 'MarkitdownScraper',
11332
11417
  mimeTypes: [
11333
11418
  'application/pdf',
11334
- // TODO: Make priority for scrapers and than allow all mime types here:
11419
+ // TODO: [💵] Make priority for scrapers and than analyze which mime-types can Markitdown scrape and allow all mime types here:
11335
11420
  // 'text/html',
11336
11421
  // 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
11337
11422
  ],
@@ -11493,5 +11578,5 @@ var PrefixStorage = /** @class */ (function () {
11493
11578
  return PrefixStorage;
11494
11579
  }());
11495
11580
 
11496
- export { $llmToolsMetadataRegister, $llmToolsRegister, $scrapersMetadataRegister, $scrapersRegister, ADMIN_EMAIL, ADMIN_GITHUB_NAME, AbstractFormatError, BOOK_LANGUAGE_VERSION, BlackholeStorage, BoilerplateError, BoilerplateFormfactorDefinition, CLAIM, CallbackInterfaceTools, ChatbotFormfactorDefinition, CollectionError, CsvFormatDefinition, CsvFormatError, DEFAULT_BOOKS_DIRNAME, DEFAULT_BOOK_TITLE, DEFAULT_CSV_SETTINGS, DEFAULT_DOWNLOAD_CACHE_DIRNAME, DEFAULT_EXECUTION_CACHE_DIRNAME, DEFAULT_GET_PIPELINE_COLLECTION_FUNCTION_NAME, DEFAULT_INTERMEDIATE_FILES_STRATEGY, DEFAULT_IS_AUTO_INSTALLED, DEFAULT_IS_VERBOSE, DEFAULT_MAX_EXECUTION_ATTEMPTS, DEFAULT_MAX_KNOWLEDGE_SOURCES_SCRAPING_DEPTH, DEFAULT_MAX_KNOWLEDGE_SOURCES_SCRAPING_TOTAL, DEFAULT_MAX_PARALLEL_COUNT, DEFAULT_PIPELINE_COLLECTION_BASE_FILENAME, DEFAULT_REMOTE_URL, DEFAULT_REMOTE_URL_PATH, DEFAULT_SCRAPE_CACHE_DIRNAME, DEFAULT_TASK_TITLE, EXPECTATION_UNITS, EnvironmentMismatchError, ExecutionReportStringOptionsDefaults, ExpectError, FORMFACTOR_DEFINITIONS, GENERIC_PIPELINE_INTERFACE, GeneratorFormfactorDefinition, GenericFormfactorDefinition, ImageGeneratorFormfactorDefinition, KnowledgeScrapeError, LOGO_DARK_SRC, LOGO_LIGHT_SRC, LimitReachedError, MANDATORY_CSV_SETTINGS, MAX_FILENAME_LENGTH, MODEL_VARIANTS, MatcherFormfactorDefinition, MemoryStorage, MissingToolsError, MultipleLlmExecutionTools, NAME, NonTaskSectionTypes, NotFoundError, NotYetImplementedError, ORDER_OF_PIPELINE_JSON, PROMPTBOOK_ENGINE_VERSION, PROMPTBOOK_ERRORS, ParseError, PipelineExecutionError, PipelineLogicError, PipelineUrlError, PrefixStorage, RESERVED_PARAMETER_NAMES, SET_IS_VERBOSE, SectionTypes, SheetsFormfactorDefinition, TaskTypes, TextFormatDefinition, TranslatorFormfactorDefinition, UNCERTAIN_USAGE, UnexpectedError, ZERO_USAGE, _AnthropicClaudeMetadataRegistration, _AzureOpenAiMetadataRegistration, _BoilerplateScraperMetadataRegistration, _DocumentScraperMetadataRegistration, _GoogleMetadataRegistration, _LegacyDocumentScraperMetadataRegistration, _MarkdownScraperMetadataRegistration, _MarkitdownScraperMetadataRegistration, _OpenAiAssistantMetadataRegistration, _OpenAiMetadataRegistration, _PdfScraperMetadataRegistration, _WebsiteScraperMetadataRegistration, addUsage, assertsExecutionSuccessful, book, cacheLlmTools, collectionToJson, compilePipeline, countTotalUsage, createCollectionFromJson, createCollectionFromPromise, createCollectionFromUrl, createLlmToolsFromConfiguration, createPipelineExecutor, createSubcollection, embeddingVectorToString, executionReportJsonToString, extractParameterNamesFromTask, getPipelineInterface, isPassingExpectations, isPipelineImplementingInterface, isPipelineInterfacesEqual, isPipelinePrepared, isValidPipelineString, joinLlmExecutionTools, limitTotalUsage, makeKnowledgeSourceHandler, parsePipeline, pipelineJsonToString, prepareKnowledgePieces, preparePersona, preparePipeline, prepareTasks, prettifyPipelineString, unpreparePipeline, usageToHuman, usageToWorktime, validatePipeline, validatePipelineString };
11581
+ export { $llmToolsMetadataRegister, $llmToolsRegister, $scrapersMetadataRegister, $scrapersRegister, ADMIN_EMAIL, ADMIN_GITHUB_NAME, AbstractFormatError, BOOK_LANGUAGE_VERSION, BlackholeStorage, BoilerplateError, BoilerplateFormfactorDefinition, CLAIM, CallbackInterfaceTools, ChatbotFormfactorDefinition, CollectionError, CsvFormatDefinition, CsvFormatError, DEFAULT_BOOKS_DIRNAME, DEFAULT_BOOK_OUTPUT_PARAMETER_NAME, DEFAULT_BOOK_TITLE, DEFAULT_CSV_SETTINGS, DEFAULT_DOWNLOAD_CACHE_DIRNAME, DEFAULT_EXECUTION_CACHE_DIRNAME, DEFAULT_GET_PIPELINE_COLLECTION_FUNCTION_NAME, DEFAULT_INTERMEDIATE_FILES_STRATEGY, DEFAULT_IS_AUTO_INSTALLED, DEFAULT_IS_VERBOSE, DEFAULT_MAX_EXECUTION_ATTEMPTS, DEFAULT_MAX_KNOWLEDGE_SOURCES_SCRAPING_DEPTH, DEFAULT_MAX_KNOWLEDGE_SOURCES_SCRAPING_TOTAL, DEFAULT_MAX_PARALLEL_COUNT, DEFAULT_PIPELINE_COLLECTION_BASE_FILENAME, DEFAULT_PROMPT_TASK_TITLE, DEFAULT_REMOTE_URL, DEFAULT_REMOTE_URL_PATH, DEFAULT_SCRAPE_CACHE_DIRNAME, DEFAULT_TASK_TITLE, EXPECTATION_UNITS, EnvironmentMismatchError, ExecutionReportStringOptionsDefaults, ExpectError, FORMFACTOR_DEFINITIONS, GENERIC_PIPELINE_INTERFACE, GeneratorFormfactorDefinition, GenericFormfactorDefinition, ImageGeneratorFormfactorDefinition, KnowledgeScrapeError, LOGO_DARK_SRC, LOGO_LIGHT_SRC, LimitReachedError, MANDATORY_CSV_SETTINGS, MAX_FILENAME_LENGTH, MODEL_VARIANTS, MatcherFormfactorDefinition, MemoryStorage, MissingToolsError, MultipleLlmExecutionTools, NAME, NonTaskSectionTypes, NotFoundError, NotYetImplementedError, ORDER_OF_PIPELINE_JSON, PROMPTBOOK_ENGINE_VERSION, PROMPTBOOK_ERRORS, ParseError, PipelineExecutionError, PipelineLogicError, PipelineUrlError, PrefixStorage, RESERVED_PARAMETER_NAMES, SET_IS_VERBOSE, SectionTypes, SheetsFormfactorDefinition, TaskTypes, TextFormatDefinition, TranslatorFormfactorDefinition, UNCERTAIN_USAGE, UnexpectedError, ZERO_USAGE, _AnthropicClaudeMetadataRegistration, _AzureOpenAiMetadataRegistration, _BoilerplateScraperMetadataRegistration, _DocumentScraperMetadataRegistration, _GoogleMetadataRegistration, _LegacyDocumentScraperMetadataRegistration, _MarkdownScraperMetadataRegistration, _MarkitdownScraperMetadataRegistration, _OpenAiAssistantMetadataRegistration, _OpenAiMetadataRegistration, _PdfScraperMetadataRegistration, _WebsiteScraperMetadataRegistration, addUsage, assertsExecutionSuccessful, book, cacheLlmTools, collectionToJson, compilePipeline, countTotalUsage, createCollectionFromJson, createCollectionFromPromise, createCollectionFromUrl, createLlmToolsFromConfiguration, createPipelineExecutor, createSubcollection, embeddingVectorToString, executionReportJsonToString, extractParameterNamesFromTask, getPipelineInterface, isPassingExpectations, isPipelineImplementingInterface, isPipelineInterfacesEqual, isPipelinePrepared, isValidPipelineString, joinLlmExecutionTools, limitTotalUsage, makeKnowledgeSourceHandler, parsePipeline, pipelineJsonToString, prepareKnowledgePieces, preparePersona, preparePipeline, prepareTasks, prettifyPipelineString, unpreparePipeline, usageToHuman, usageToWorktime, validatePipeline, validatePipelineString };
11497
11582
  //# sourceMappingURL=index.es.js.map