|
| 1 | +#!/usr/bin/env node |
| 2 | + |
| 3 | +import path from 'path'; |
| 4 | +import fs from 'fs'; |
| 5 | + |
| 6 | +const parseArgs = () => { |
| 7 | + const args = process.argv.slice(2); |
| 8 | + const options = {}; |
| 9 | + args.forEach((arg) => { |
| 10 | + const [key, value] = arg.split('='); |
| 11 | + options[key.replace('--', '')] = value; |
| 12 | + }); |
| 13 | + return options; |
| 14 | +}; |
| 15 | + |
| 16 | +const shimContent = (target, pkg) => { |
| 17 | + const suffix = target.split('.').slice(-2).join('.'); |
| 18 | + const deprecationMessage = (original, replacement) => { |
| 19 | + return `DEPRECATED(${pkg}): "${target}" will be moved to "@ruby/wasm-wasi" in the next major release.\n` |
| 20 | + + `Please replace your \\\`${original}\\\` with \\\`${replacement}\\\``; |
| 21 | + }; |
| 22 | + |
| 23 | + let originalImport = ''; |
| 24 | + let newImport = ''; |
| 25 | + switch (suffix) { |
| 26 | + case 'cjs.js': |
| 27 | + originalImport = `require('${pkg}/dist/${target}');`; |
| 28 | + newImport = `require('@ruby/wasm-wasi/dist/${target}');`; |
| 29 | + break; |
| 30 | + case 'umd.js': |
| 31 | + originalImport = `require('${pkg}/dist/${target}');`; |
| 32 | + newImport = `require('@ruby/wasm-wasi/dist/${target}');`; |
| 33 | + break; |
| 34 | + case 'd.ts': |
| 35 | + case 'esm.js': |
| 36 | + originalImport = `import * from '${pkg}/dist/${target}';`; |
| 37 | + newImport = `import * from '@ruby/wasm-wasi/dist/${target}';`; |
| 38 | + break; |
| 39 | + default: |
| 40 | + throw new Error(`Unknown suffix: ${suffix} for target ${target}`); |
| 41 | + } |
| 42 | + |
| 43 | + const dirname = path.dirname(new URL(import.meta.url).pathname); |
| 44 | + const content = fs.readFileSync(path.join(dirname, '..', 'dist', target), 'utf-8'); |
| 45 | + if (suffix === 'd.ts') { |
| 46 | + return content |
| 47 | + } |
| 48 | + const deprecation = "\x1b[33m" + deprecationMessage(originalImport, newImport) + "\x1b[0m"; |
| 49 | + return `console.warn(\`${deprecation}\`);\n\n${content}`; |
| 50 | +} |
| 51 | + |
| 52 | +const main = () => { |
| 53 | + const targets = [ |
| 54 | + "bindgen/rb-abi-guest.d.ts", |
| 55 | + "bindgen/rb-js-abi-host.d.ts", |
| 56 | + "browser.cjs.js", |
| 57 | + "browser.d.ts", |
| 58 | + "browser.esm.js", |
| 59 | + "browser.script.cjs.js", |
| 60 | + "browser.script.d.ts", |
| 61 | + "browser.script.esm.js", |
| 62 | + "browser.script.umd.js", |
| 63 | + "browser.umd.js", |
| 64 | + "index.cjs.js", |
| 65 | + "index.d.ts", |
| 66 | + "index.esm.js", |
| 67 | + "index.umd.js", |
| 68 | + "node.cjs.js", |
| 69 | + "node.d.ts", |
| 70 | + "node.esm.js", |
| 71 | + ] |
| 72 | + |
| 73 | + const options = parseArgs(); |
| 74 | + if (!options.dist || !options.pkg) { |
| 75 | + throw new Error('--dist=path and --pkg=name is required'); |
| 76 | + } |
| 77 | + const { dist, pkg } = options |
| 78 | + |
| 79 | + for (const target of targets) { |
| 80 | + const shimmed = shimContent(target, pkg); |
| 81 | + const distPath = path.join(dist, target); |
| 82 | + fs.mkdirSync(path.dirname(distPath), { recursive: true }); |
| 83 | + fs.writeFileSync(distPath, shimmed); |
| 84 | + } |
| 85 | +} |
| 86 | + |
| 87 | +main(); |
0 commit comments