This is an automated email from the ASF dual-hosted git repository.

domoritz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new be5f5b8f8f GH-39722: [JS] Clean up packaging (#39723)
be5f5b8f8f is described below

commit be5f5b8f8f8294d43681c59e1e67f7434a10861c
Author: Dominik Moritz <[email protected]>
AuthorDate: Wed Apr 17 23:21:42 2024 -0400

    GH-39722: [JS] Clean up packaging (#39723)
    
    * Remove .mts since it's the same as .ts
    * Use .js consistently for all packages
    * Closes: #39722
    
    ---------
    
    Signed-off-by: Matt Topol <[email protected]>
    Co-authored-by: ptaylor <[email protected]>
    Co-authored-by: dependabot[bot] 
<49699333+dependabot[bot]@users.noreply.github.com>
---
 js/.vscode/launch.json     | 26 ++++++------------
 js/gulp/arrow-task.js      |  9 +++---
 js/gulp/closure-task.js    | 68 ++++++++++++++++++++++++++++++++++++++++------
 js/gulp/package-task.js    | 10 +++----
 js/gulp/typescript-task.js |  6 +---
 5 files changed, 78 insertions(+), 41 deletions(-)

diff --git a/js/.vscode/launch.json b/js/.vscode/launch.json
index 21255b61c3..189b9d1f33 100644
--- a/js/.vscode/launch.json
+++ b/js/.vscode/launch.json
@@ -5,24 +5,14 @@
   "version": "0.2.0",
   "inputs": [
     {
-      "type": "pickString",
-      "default": "src",
+      "type": "command",
       "id": "TEST_TARGET",
-      "options": [
-        "src",
-        "apache-arrow",
-        "ts",
-        "es5.cjs",
-        "es5.esm",
-        "es5.umd",
-        "es2015.cjs",
-        "es2015.esm",
-        "es2015.umd",
-        "esnext.cjs",
-        "esnext.esm",
-        "esnext.umd",
-      ],
-      "description": "The JS version + Module format combination to test (or 
src to test source files)",
+      "command": "shellCommand.execute",
+      "args": {
+        "cwd": "${workspaceFolder}",
+        "description": "The JS version + Module format combination to test (or 
src to test source files)",
+        "command": "echo 
\"src\napache-arrow\nts\nes5.cjs\nes5.esm\nes5.umd\nes2015.cjs\nes2015.esm\nes2015.umd\nesnext.cjs\nesnext.esm\nesnext.umd\""
+      }
     },
     {
       "type": "command",
@@ -50,7 +40,7 @@
       "command": "shellCommand.execute",
       "args": {
         "useSingleResult": "true",
-        "command": "case \"${input:TEST_TARGET}\" in *cjs | *umd | 
apache-arrow) echo '';; *) echo '--experimental-vm-modules';; esac"
+        "command": "case \"${input:TEST_TARGET}\" in *cjs | *umd) echo 
'--no-warnings';; *) echo '--experimental-vm-modules';; esac"
       }
     },
   ],
diff --git a/js/gulp/arrow-task.js b/js/gulp/arrow-task.js
index 855cb71283..2ec2043985 100644
--- a/js/gulp/arrow-task.js
+++ b/js/gulp/arrow-task.js
@@ -30,24 +30,23 @@ import { pipeline } from 'stream/promises';
 
 export const arrowTask = ((cache) => memoizeTask(cache, function 
copyMain(target) {
     const out = targetDir(target);
-    const dtsGlob = `${targetDir(`es2015`, `cjs`)}/**/*.ts`;
+    const dtsGlob = `${targetDir(`es2015`, `esm`)}/**/*.ts`;
     const cjsGlob = `${targetDir(`es2015`, `cjs`)}/**/*.js`;
     const esmGlob = `${targetDir(`es2015`, `esm`)}/**/*.js`;
     const es2015UmdGlob = `${targetDir(`es2015`, `umd`)}/*.js`;
     const esnextUmdGlob = `${targetDir(`esnext`, `umd`)}/*.js`;
-    const cjsSourceMapsGlob = `${targetDir(`es2015`, `cjs`)}/**/*.map`;
+    const cjsSourceMapsGlob = `${targetDir(`es2015`, `cjs`)}/**/*.js.map`;
     const esmSourceMapsGlob = `${targetDir(`es2015`, `esm`)}/**/*.map`;
     const es2015UmdSourceMapsGlob = `${targetDir(`es2015`, `umd`)}/*.map`;
     const esnextUmdSourceMapsGlob = `${targetDir(`esnext`, `umd`)}/*.map`;
     return ObservableForkJoin([
         observableFromStreams(gulp.src(dtsGlob), gulp.dest(out)), // copy d.ts 
files
-        observableFromStreams(gulp.src(dtsGlob), gulpRename((p) => { p.extname 
= '.mts'; }), gulp.dest(out)), // copy d.ts files as esm
         observableFromStreams(gulp.src(cjsGlob), gulp.dest(out)), // copy 
es2015 cjs files
         observableFromStreams(gulp.src(cjsSourceMapsGlob), gulp.dest(out)), // 
copy es2015 cjs sourcemaps
-        observableFromStreams(gulp.src(esmSourceMapsGlob), gulp.dest(out)), // 
copy es2015 esm sourcemaps
+        observableFromStreams(gulp.src(esmSourceMapsGlob), gulpRename((p) => { 
p.basename = p.basename.replace('.js', '.mjs'); }), gulpReplace(`.js"`, 
`.mjs"`), gulp.dest(out)), // copy es2015 esm sourcemaps
         observableFromStreams(gulp.src(es2015UmdSourceMapsGlob), 
gulp.dest(out)), // copy es2015 umd sourcemap files, but don't rename
         observableFromStreams(gulp.src(esnextUmdSourceMapsGlob), 
gulp.dest(out)), // copy esnext umd sourcemap files, but don't rename
-        observableFromStreams(gulp.src(esmGlob), gulpRename((p) => { p.extname 
= '.mjs'; }), gulpReplace(`.js'`, `.mjs'`), gulp.dest(out)), // copy es2015 esm 
files and rename to `.mjs`
+        observableFromStreams(gulp.src(esmGlob), gulpRename((p) => { p.extname 
= '.mjs'; }), gulpReplace(`.js'`, `.mjs'`), gulpReplace(`.js.map`, `.mjs.map`), 
gulp.dest(out)), // copy es2015 esm files and rename to `.mjs`
         observableFromStreams(gulp.src(es2015UmdGlob), gulpRename((p) => { 
p.basename += `.es2015.min`; }), gulp.dest(out)), // copy es2015 umd files and 
add `.es2015.min`
         observableFromStreams(gulp.src(esnextUmdGlob), gulpRename((p) => { 
p.basename += `.esnext.min`; }), gulp.dest(out)), // copy esnext umd files and 
add `.esnext.min`
     ]).pipe(share({ connector: () => new ReplaySubject(), resetOnError: false, 
resetOnComplete: false, resetOnRefCountZero: false }));
diff --git a/js/gulp/closure-task.js b/js/gulp/closure-task.js
index c620784fd1..80f841bf72 100644
--- a/js/gulp/closure-task.js
+++ b/js/gulp/closure-task.js
@@ -19,8 +19,10 @@ import { targetDir, mainExport, esmRequire, 
gCCLanguageNames, publicModulePaths,
 
 import fs from 'node:fs';
 import gulp from 'gulp';
-import path from 'node:path';
+import Path from 'node:path';
+import https from 'node:https';
 import { mkdirp } from 'mkdirp';
+import { PassThrough } from 'node:stream';
 import sourcemaps from 'gulp-sourcemaps';
 import { memoizeTask } from './memoize-task.js';
 import { compileBinFiles } from './typescript-task.js';
@@ -28,6 +30,12 @@ import { compileBinFiles } from './typescript-task.js';
 import closureCompiler from 'google-closure-compiler';
 const compiler = closureCompiler.gulp();
 
+import { fileURLToPath } from 'url';
+import { dirname } from 'path';
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+const closureCompilerVer = JSON.parse(fs.readFileSync(Path.join(__dirname, 
'..', 
'package.json'))).devDependencies['google-closure-compiler'].split('.')[0];
+
 export const closureTask = ((cache) => memoizeTask(cache, async function 
closure(target, format) {
 
     if (shouldRunInChildProcess(target, format)) {
@@ -35,10 +43,10 @@ export const closureTask = ((cache) => memoizeTask(cache, 
async function closure
     }
 
     const src = targetDir(target, `cls`);
-    const srcAbsolute = path.resolve(src);
+    const srcAbsolute = Path.resolve(src);
     const out = targetDir(target, format);
-    const externs = path.join(`${out}/${mainExport}.externs.js`);
-    const entry_point = path.join(`${src}/${mainExport}.dom.cls.js`);
+    const externs = Path.join(`${out}/${mainExport}.externs.js`);
+    const entry_point = Path.join(`${src}/${mainExport}.dom.cls.js`);
 
     const exportedImports = publicModulePaths(srcAbsolute).reduce((entries, 
publicModulePath) => [
         ...entries, {
@@ -54,12 +62,42 @@ export const closureTask = ((cache) => memoizeTask(cache, 
async function closure
         fs.promises.writeFile(entry_point, 
generateUMDExportAssignment(srcAbsolute, exportedImports))
     ]);
 
-    return await Promise.all([
+    const closeCompilerPolyfills = [];
+
+    await Promise.all([
         runClosureCompileAsObservable().toPromise(),
-        compileBinFiles(target, format).toPromise(),
-        observableFromStreams(gulp.src(`${src}/**/*.d.ts`), gulp.dest(out)), 
// copy .d.ts files
+        compileBinFiles(target, format).toPromise().then(() => Promise.all([
+            observableFromStreams(gulp.src(`${src}/**/*.d.ts`), 
gulp.dest(out)).toPromise(), // copy .d.ts files,
+            observableFromStreams(gulp.src(`${src}/**/*.d.ts.map`), 
gulp.dest(out)).toPromise(), // copy .d.ts.map files,
+            observableFromStreams(gulp.src(`${src}/src/**/*`), 
gulp.dest(`${out}/src`)).toPromise(), // copy TS source files,
+        ]))
     ]);
 
+    // Download the closure compiler polyfill sources for sourcemaps
+    await Promise.all(closeCompilerPolyfills.map(async (path) => {
+
+        await fs.promises.mkdir(
+            Path.join(out, Path.parse(path).dir),
+            { recursive: true, mode: 0o755 }
+        );
+
+        const res = new PassThrough();
+        const req = https.request(
+            new 
URL(`https://raw.githubusercontent.com/google/closure-compiler/v${closureCompilerVer}/${path}`),
+            (res_) => {
+                if (res_.statusCode === 200) {
+                    res_.pipe(res);
+                } else {
+                    res.end();
+                }
+            }
+        );
+
+        req.on('error', (e) => res.emit('error', e)).end();
+
+        return observableFromStreams(res, fs.createWriteStream(Path.join(out, 
path))).toPromise();
+    }));
+
     function runClosureCompileAsObservable() {
         return observableFromStreams(
             gulp.src([
@@ -72,8 +110,22 @@ export const closureTask = ((cache) => memoizeTask(cache, 
async function closure
             compiler(createClosureArgs(entry_point, externs, target), {
                 platform: ['native', 'java', 'javascript']
             }),
+            sourcemaps.mapSources((path) => {
+                if (path.indexOf(`${src}/`) === 0) {
+                    return path.slice(`${src}/`.length);
+                }
+                if (path.includes('com/google')) {
+                    closeCompilerPolyfills.push(path);
+                    return path.slice(`src/`.length);
+                }
+                return path;
+            }),
             // rename the sourcemaps from *.js.map files to *.min.js.map
-            sourcemaps.write(`.`, { mapFile: (mapPath) => 
mapPath.replace(`.js.map`, `.${target}.min.js.map`) }),
+            sourcemaps.write(`./`, {
+                sourceRoot: './src',
+                includeContent: false,
+                mapFile: (mapPath) => mapPath.replace(`.js.map`, 
`.${target}.min.js.map`),
+            }),
             gulp.dest(out)
         );
     }
diff --git a/js/gulp/package-task.js b/js/gulp/package-task.js
index 9bc002e664..0b0f4cfa20 100644
--- a/js/gulp/package-task.js
+++ b/js/gulp/package-task.js
@@ -56,7 +56,7 @@ const createMainPackageJson = (target, format) => (orig) => ({
         '.': {
             node: {
                 import: {
-                    types: `./${mainExport}.node.d.mts`,
+                    types: `./${mainExport}.node.d.ts`,
                     default: `./${mainExport}.node.mjs`,
                 },
                 require: {
@@ -65,7 +65,7 @@ const createMainPackageJson = (target, format) => (orig) => ({
                 },
             },
             import: {
-                types: `./${mainExport}.dom.d.mts`,
+                types: `./${mainExport}.dom.d.ts`,
                 default: `./${mainExport}.dom.mjs`,
             },
             require: {
@@ -75,7 +75,7 @@ const createMainPackageJson = (target, format) => (orig) => ({
         },
         './*': {
             import: {
-                types: `./*.d.mts`,
+                types: `./*.d.ts`,
                 default: `./*.mjs`,
             },
             require: {
@@ -127,8 +127,8 @@ const createScopedPackageJSON = (target, format) => (({ 
name, ...orig }) =>
             sideEffects: format === 'esm' ? false : undefined,
             // include "esm" settings for https://www.npmjs.com/package/esm if 
building scoped ESM target
             esm:      format === `esm` ? { mode: `auto`, sourceMap: true } : 
undefined,
-            // set "types" (for TypeScript/VSCode)
-            types:    format === 'umd' ? undefined : `${mainExport}.node.d.ts`,
+            // set "types" to "Arrow.dom" if building scoped UMD target, 
otherwise "Arrow.node"
+            types:    format === 'umd' ? `${mainExport}.dom.d.ts`: 
`${mainExport}.node.d.ts`,
         }
     )
 );
diff --git a/js/gulp/typescript-task.js b/js/gulp/typescript-task.js
index b5a4c3232d..ae5b389f7f 100644
--- a/js/gulp/typescript-task.js
+++ b/js/gulp/typescript-task.js
@@ -61,10 +61,9 @@ function compileTypescript(out, tsconfigPath, 
tsconfigOverrides, writeSourcemaps
     );
     const writeSources = observableFromStreams(tsProject.src(), 
gulp.dest(path.join(out, 'src')));
     const writeDTypes = observableFromStreams(dts, sourcemaps.write('./', { 
includeContent: false, sourceRoot: './src' }), gulp.dest(out));
-    const mapFile = tsProject.options.module === tsc.ModuleKind.ES2015 ? 
esmMapFile : cjsMapFile;
     const writeJSArgs = writeSourcemaps ? [
         js,
-        sourcemaps.write('./', { mapFile, includeContent: false, sourceRoot: 
'./src' }),
+        sourcemaps.write('./', { includeContent: false, sourceRoot: './src' }),
         gulp.dest(out)
       ] : [
         js,
@@ -73,6 +72,3 @@ function compileTypescript(out, tsconfigPath, 
tsconfigOverrides, writeSourcemaps
     const writeJS = observableFromStreams(...writeJSArgs);
     return ObservableForkJoin([writeSources, writeDTypes, writeJS]);
 }
-
-const cjsMapFile = (mapFilePath) => mapFilePath;
-const esmMapFile = (mapFilePath) => mapFilePath.replace('.js.map', '.mjs.map');

Reply via email to