From 8bbf2c5fb7040a968929d835a3918b427ddcb908 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Fri, 11 Aug 2023 22:06:35 -0400 Subject: [PATCH] build: include dist folder in published packages --- .../_tools/scripts/publish_packages.js | 59 +++------ ...ansform_error_messages.js => transform.js} | 119 +++++++++++++----- 2 files changed, 108 insertions(+), 70 deletions(-) rename lib/node_modules/@stdlib/_tools/scripts/{transform_error_messages.js => transform.js} (57%) diff --git a/lib/node_modules/@stdlib/_tools/scripts/publish_packages.js b/lib/node_modules/@stdlib/_tools/scripts/publish_packages.js index c0abcb606be..acbb175c0c7 100644 --- a/lib/node_modules/@stdlib/_tools/scripts/publish_packages.js +++ b/lib/node_modules/@stdlib/_tools/scripts/publish_packages.js @@ -1098,24 +1098,6 @@ function publish( pkg, clbk ) { 'cwd': dist }; - // Transform error messages: - jscodeshift = join( rootDir(), 'node_modules', '.bin', 'jscodeshift' ); - command = 'STDLIB_PKG=\'@stdlib/'+distPkg+'\' '+jscodeshift+' ./lib/**/*.js ./lib/*.js -t '+join( __dirname, 'transform_error_messages.js' ); - debug( 'Executing command: %s', command ); - shell( command, opts ); - - // Format rewritten error messages: - command = 'find . -name "*.js" -exec sed -E -i "s/Error\\( format\\( \\"([a-zA-Z0-9]+)\\"/Error\\( format\\( \'\\1\'/g" {} \\;'; - shell( command, opts ); - - // Format string literal error messages: - command = 'find . -name "*.js" -exec sed -E -i "s/Error\\( format\\(\\"([a-zA-Z0-9]+)\\"/Error\\( format\\( \'\\1\'/g" {} \\;'; - shell( command, opts ); - - // Format code by replacing double quotes with single quotes in inserted `require` calls: - command = 'find . -name "*.js" -exec sed -E -i "s/require\\( ?\\"@stdlib\\/error-tools-fmtprodmsg\\" ?\\);/require\\( \'@stdlib\\/error-tools-fmtprodmsg\' \\);/g" {} \\;'; - shell( command, opts ); - command = 'rm -f docs/repl.txt && rm -f docs/types/test.ts'; shell( command, opts ); if ( hasCLI ) { @@ -1180,36 +1162,35 @@ function publish( pkg, clbk ) { } } } + // Transform error messages and save files to `dist` subdirectory: + command = 'cp -r lib dist'; + shell( command, opts ); + jscodeshift = join( rootDir(), 'node_modules', '.bin', 'jscodeshift' ); + command = 'STDLIB_PKG=\'@stdlib/'+distPkg+'\' '+jscodeshift+' ./dist/**/*.js ./dist/*.js -t '+join( __dirname, 'transform.js' ); + debug( 'Executing command: %s', command ); + shell( command, opts ); + command = 'find ./dist -name "*.js" -exec sed -E -i "1i\\/\\*\\* \\@license '+pkgJSON.license+' \\*\\/\n" {} \\;'; + shell( command, opts ); - // Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json: + // Add `@stdlib/error-tools-fmtprodmsg` in package.json if the package depends on `@stdlib/string-format`: if ( pkgJSON.dependencies[ '@stdlib/string-format' ] ) { - delete pkgJSON.dependencies[ '@stdlib/string-format' ]; + fmtProdMsgVersion = npmVersion( '@stdlib/error-tools-fmtprodmsg' ); + pkgJSON.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = fmtProdMsgVersion; } - fmtProdMsgVersion = npmVersion( '@stdlib/error-tools-fmtprodmsg' ); - pkgJSON.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = fmtProdMsgVersion; - - // Replace LICENSE comments with abbreviated ones: - if ( hasCLI ) { - command = 'find '+dist+' -name "*.js" -type f'; - } else { - command = 'find '+dist+' -name "bin/cli" -type f'; - } - command += ' -exec perl -i -p0e \'s|/\\*\\*\\n\\*\\s\\@license\\sApache-2.0\\n\\*\\n\\*\\sCopyright\\s\\(c\\)\\s\\d{4}\\sThe\\sStdlib\\sAuthors\\.\\n(.*?)\\n\\*\\slimitations\\sunder\\sthe\\sLicense\\.\\n\\*/|// Copyright (c) '+CURRENT_YEAR+' The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0|s\' {} \\;'; - shell( command ); // Replace GitHub MathJax equations with SVGs: - command = 'find '+dist+' -type f -name \'*.md\' -print0 | xargs -0 perl -0777 -i -pe \'s/```math\\n([\\s\\S]+?)\\n```\\n\\n//g\''; - shell( command ); - command = 'find '+dist+' -type f -name \'*.md\' -print0 | xargs -0 perl -0777 -i -pe \'s/)/
/sg\''; - shell( command ); + command = 'find . -type f -name \'*.md\' -print0 | xargs -0 perl -0777 -i -pe \'s/```math\\n([\\s\\S]+?)\\n```\\n\\n//g\''; + shell( command, opts ); + command = 'find . -type f -name \'*.md\' -print0 | xargs -0 perl -0777 -i -pe \'s/)/
/sg\''; + shell( command, opts ); // Replace GitHub links to individual packages with npm links: - command = 'find '+dist+' -type f -name \'*.md\' -print0 | xargs -0 sed -Ei \'/tree\\/main/b; s/@stdlib\\/([^:]*)\\]: https:\\/\\/github.com\\/stdlib-js/@stdlib\\/\\1\\]: https:\\/\\/www.npmjs.com\\/package\\/@stdlib/g\''; - shell( command ); + command = 'find . -type f -name \'*.md\' -print0 | xargs -0 sed -Ei \'/tree\\/main/b; s/@stdlib\\/([^:]*)\\]: https:\\/\\/github.com\\/stdlib-js/@stdlib\\/\\1\\]: https:\\/\\/www.npmjs.com\\/package\\/@stdlib/g\''; + shell( command, opts ); // Replace list with links to other branches from installation section: - command = 'find '+dist+' -type f -name \'*.md\' -print0 | xargs -0 perl -0777 -i -pe "s/\\`\\`\\`\n\nAlternatively,[^<]+<\\/section>/\\`\\`\\`\n\n<\\/section>/"'; - shell( command ); + command = 'find . -type f -name \'*.md\' -print0 | xargs -0 perl -0777 -i -pe "s/\\`\\`\\`\n\nAlternatively,[^<]+<\\/section>/\\`\\`\\`\n\n<\\/section>/"'; + shell( command, opts ); writeFileSync( pkgJsonPath, JSON.stringify( pkgJSON, null, ' ' ).concat( '\n' ) ); diff --git a/lib/node_modules/@stdlib/_tools/scripts/transform_error_messages.js b/lib/node_modules/@stdlib/_tools/scripts/transform.js similarity index 57% rename from lib/node_modules/@stdlib/_tools/scripts/transform_error_messages.js rename to lib/node_modules/@stdlib/_tools/scripts/transform.js index 010135ecb33..252ec4b7136 100644 --- a/lib/node_modules/@stdlib/_tools/scripts/transform_error_messages.js +++ b/lib/node_modules/@stdlib/_tools/scripts/transform.js @@ -21,6 +21,8 @@ // MODULES // var logger = require( 'debug' ); +var startsWith = require('@stdlib/string/starts-with'); +var replace = require( '@stdlib/string/replace' ); var pkg2id = require( '@stdlib/error/tools/pkg2id' ); var msg2id = require( '@stdlib/error/tools/msg2id'); var ENV = require( '@stdlib/process/env' ); @@ -28,9 +30,10 @@ var ENV = require( '@stdlib/process/env' ); // VARIABLES // -var debug = logger( 'scripts:transform-error-messages' ); +var debug = logger( 'scripts:transform' ); var pkg = ENV[ 'STDLIB_PKG' ]; var prefix = pkg2id( pkg ); +var RE_EMPTY_LINE = /(\r?\n){2,}/g; var ERROR_NAMES = [ 'Error', 'AssertionError', @@ -45,7 +48,7 @@ var ERROR_NAMES = [ // MAIN // /** -* Transforms a file. +* Transforms a file for a production build. * * ## Notes * @@ -64,68 +67,122 @@ function transformer( fileInfo, api ) { var requires; var code; var root; + var out; var id; var j; j = api.jscodeshift; root = j( fileInfo.source ); + root.find(j.Program).forEach( onProgram ); + + requires = root.find( j.CallExpression, { + 'callee': { + 'name': 'require', + 'type': 'Identifier' + } + }); + debug( 'Transforming file: %s', fileInfo.path ); - return root + + root .find( j.Literal ) - .forEach( onStringLiteral ) - .toSource(); + .forEach( onStringLiteral ); + + requires.forEach( rewriteRequire ); + + root + .find(j.Node) + .forEach( deleteComment ); + + out = root.toSource({ + 'quote': 'single', + 'lineTerminator': '\n', + 'reuseWhitespace': false, + 'useTabs': true + }); + + return replace( out, RE_EMPTY_LINE, '\n' ); + + /** + * Removes comments from the program. + * + * @private + * @param {Object} path - AST node path + * @returns {void} + */ + function onProgram( path ) { + path.node.comments = []; + } + + /** + * Deletes the comments associated with a given node. + * + * @private + * @param {Object} path - AST node path + * @returns {void} + */ + function deleteComment( path ) { + delete path.node.comments; + } + + /** + * Rewrites a `require` statement to include the `/dist` directory if the module being required starts with `@stdlib`. + * + * @private + * @param {Object} path - AST node path + * @returns {void} + */ + function rewriteRequire( path ) { + if ( startsWith( path.value.arguments[0].value, '@stdlib' ) ) { + path.value.arguments[0].value += '/dist'; + } + } /** * Callback invoked upon finding a string literal. * * @private - * @param {Object} node - AST node + * @param {Object} path - AST node path * @returns {void} */ - function onStringLiteral( node ) { - if ( node.value.value === '@stdlib/string-format' ) { + function onStringLiteral( path ) { + if ( path.value.value === '@stdlib/string-format' ) { debug( 'Replacing `@stdlib/string-format` with `@stdlib/error-tools-fmtprodmsg`...' ); - j( node ) + j( path ) .replaceWith( j.stringLiteral( '@stdlib/error-tools-fmtprodmsg' ) ); } // If the string literal is inside a NewExpression for an error, replace the string literal with the error message... else if ( // Case: new Error( format( '...', ... ) ) - ( node.parent.parent.value.type === 'NewExpression' && - ERROR_NAMES.includes( node.parent.parent.value.callee.name ) ) + ( path.parent.parent.value.type === 'NewExpression' && + ERROR_NAMES.includes( path.parent.parent.value.callee.name ) ) ) { - id = msg2id( node.value.value ); + id = msg2id( path.value.value ); if ( id ) { code = prefix + id; - debug( 'Replacing format string "'+node.value.value+'" with error code "'+code+'"...' ); - j( node ) + debug( 'Replacing format string "'+path.value.value+'" with error code "'+code+'"...' ); + j( path ) .replaceWith( j.stringLiteral( code ) ); } } else if ( // Case: new Error( '...' ) - ( node.parent.value.type === 'NewExpression' && - ERROR_NAMES.includes( node.parent.value.callee.name ) ) + ( path.parent.value.type === 'NewExpression' && + ERROR_NAMES.includes( path.parent.value.callee.name ) ) ) { - id = msg2id( node.value.value ); + id = msg2id( path.value.value ); if ( id ) { code = prefix + id; - debug( 'Replacing string literal "'+node.value.value+'" with error code "'+code+'"...' ); + debug( 'Replacing string literal "'+path.value.value+'" with error code "'+code+'"...' ); // Replace with call to `format` with the error code... replacement = j.callExpression(j.identifier( 'format' ), [ j.stringLiteral( code ) ]); - j( node ).replaceWith( replacement ); + j( path ).replaceWith( replacement ); // Add `require` call to `@stdlib/error-tools-fmtprodmsg` if not already present... - requires = root.find( j.CallExpression, { - 'callee': { - 'name': 'require', - 'type': 'Identifier' - } - }); nRequires = requires.size(); debug( 'Found ' + nRequires + ' `require` calls...' ); if ( !requires.some( hasRequire ) ) { @@ -142,15 +199,15 @@ function transformer( fileInfo, api ) { } /** - * Tests whether a node is a require call for `@stdlib/error-tools-fmtprodmsg`. + * Tests whether a path is a require call for `@stdlib/error-tools-fmtprodmsg`. * * @private - * @param {Object} node - node to test - * @returns {boolean} boolean indicating whether a node is a require call for `@stdlib/error-tools-fmtprodmsg` + * @param {Object} path - AST node path + * @returns {boolean} boolean indicating whether a path is a require call for `@stdlib/error-tools-fmtprodmsg` */ - function hasRequire( node ) { - return node.value.callee.name === 'require' && - node.value.arguments[ 0 ].value === '@stdlib/error-tools-fmtprodmsg'; + function hasRequire( path ) { + return path.value.callee.name === 'require' && + path.value.arguments[ 0 ].value === '@stdlib/error-tools-fmtprodmsg'; } }