@wyw-in-js/babel-preset 2.0.0-alpha.1 → 2.0.1

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.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["import { existsSync } from 'fs';\nimport { spawnSync } from 'child_process';\nimport { fileURLToPath } from 'url';\n\nimport type {\n BabelFile,\n ConfigAPI,\n PluginObj,\n TransformCaller,\n} from '@babel/core';\nimport { parseSync } from '@babel/core';\nimport type {\n PluginOptions,\n WYWTransformMetadata,\n WYWTransformResultMetadata,\n} from '@wyw-in-js/transform';\n\nimport { encodeGlobals } from './globals';\n\ntype SyncTransformPayload = {\n code: string;\n filename: string;\n inlineEvalGlobals?: unknown;\n inputSourceMap?: unknown;\n pluginOptions: Partial<PluginOptions>;\n root?: string;\n};\n\ntype SyncTransformOutput = {\n code: string;\n metadata?: WYWTransformResultMetadata;\n sourceMap?: unknown;\n};\n\nconst buildRunnerPath = () => {\n const jsPath = fileURLToPath(\n new URL('./sync-transform-runner.js', import.meta.url)\n );\n if (existsSync(jsPath)) {\n return jsPath;\n }\n\n return fileURLToPath(new URL('./sync-transform-runner.ts', import.meta.url));\n};\n\nconst runnerPath = buildRunnerPath();\nconst nodeBinary =\n runnerPath.endsWith('.ts') && process.execPath.includes('bun')\n ? process.execPath\n : process.env.WYW_NODE_BINARY ||\n (process.execPath.includes('bun') ? 'node' : process.execPath);\n\nconst compatibilityWarnings = new Set<string>();\n\nconst emitCompatibilityWarning = (key: string, message: string) => {\n if (compatibilityWarnings.has(key)) {\n return;\n }\n\n compatibilityWarnings.add(key);\n\n if (typeof process.emitWarning === 'function') {\n process.emitWarning(message, {\n code: `WYW_${key}`,\n type: 'DeprecationWarning',\n });\n return;\n }\n\n // eslint-disable-next-line no-console\n console.warn(message);\n};\n\nconst warnBabelPresetDeprecation = () => {\n emitCompatibilityWarning(\n 'BABEL_PRESET_COMPATIBILITY',\n '[wyw-in-js] @wyw-in-js/babel-preset is a deprecated compatibility wrapper around the Oxc-backed transform. Prefer bundler integrations or the transform() API for new setups.'\n );\n};\n\nconst warnSynchronousModuleConfig = (configFile: unknown) => {\n if (\n typeof configFile !== 'string' ||\n !/\\.(?:mjs|mts)$/iu.test(configFile)\n ) {\n return;\n }\n\n emitCompatibilityWarning(\n 'BABEL_PRESET_SYNC_CONFIG',\n '[wyw-in-js] @wyw-in-js/babel-preset loads .mjs/.mts WyW config files synchronously. Keep them synchronous and avoid top-level await.'\n );\n};\n\nfunction isEnabled(caller?: TransformCaller & { evaluate?: true }) {\n return caller?.name !== 'wyw-in-js' || caller.evaluate === true;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n};\n\nconst getObjectTypeName = (value: object): string => {\n const { constructor } = value as { constructor?: { name?: unknown } };\n if (\n constructor &&\n typeof constructor.name === 'string' &&\n constructor.name.length > 0\n ) {\n return constructor.name;\n }\n\n const tag = Object.prototype.toString.call(value);\n return tag.slice(8, -1) || 'Object';\n};\n\nconst formatOptionPath = (path: Array<string | number>): string =>\n path.reduce<string>((acc, segment) => {\n if (typeof segment === 'number') {\n return `${acc}[${segment}]`;\n }\n\n if (/^[A-Za-z_$][\\w$]*$/u.test(segment)) {\n return `${acc}.${segment}`;\n }\n\n return `${acc}[${JSON.stringify(segment)}]`;\n }, 'options');\n\nconst throwNonSerializableOption = (\n path: Array<string | number>,\n reason: string\n): never => {\n throw new Error(\n `[wyw-in-js] Babel preset option ${formatOptionPath(\n path\n )} is not serializable (${reason}). ` +\n '@wyw-in-js/babel-preset forwards inline options through a separate sync runner. ' +\n 'Move it into a WyW config file or use the async transform() API.'\n );\n};\n\nconst validateSerializableValue = (\n value: unknown,\n path: Array<string | number>\n): void => {\n if (\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return;\n }\n\n if (typeof value === 'function') {\n throwNonSerializableOption(path, 'Function');\n }\n\n if (typeof value === 'symbol') {\n throwNonSerializableOption(path, 'Symbol');\n }\n\n if (typeof value === 'bigint') {\n throwNonSerializableOption(path, 'BigInt');\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n validateSerializableValue(item, [...path, index])\n );\n return;\n }\n\n if (isPlainObject(value)) {\n Object.entries(value).forEach(([key, item]) =>\n validateSerializableValue(item, [...path, key])\n );\n return;\n }\n\n throwNonSerializableOption(path, getObjectTypeName(value));\n};\n\nconst stringifyPayload = (payload: SyncTransformPayload) => {\n validateSerializableValue(payload.inputSourceMap, ['inputSourceMap']);\n validateSerializableValue(payload.pluginOptions, ['pluginOptions']);\n return JSON.stringify(payload);\n};\n\nconst buildTransformPayload = (\n file: BabelFile,\n options: Partial<PluginOptions>\n): SyncTransformPayload => {\n const filename = file.opts.filename!;\n const evalOptions = options.eval ?? {};\n const inlineEvalGlobals =\n evalOptions.globals === undefined\n ? undefined\n : encodeGlobals(evalOptions.globals);\n const nextEvalOptions =\n 'globals' in evalOptions\n ? Object.fromEntries(\n Object.entries(evalOptions).filter(([key]) => key !== 'globals')\n )\n : evalOptions;\n\n const pluginOptionsForChild: Partial<PluginOptions> = {\n ...options,\n eval: nextEvalOptions,\n outputMetadata: true,\n };\n\n if (\n pluginOptionsForChild.eval &&\n Object.keys(pluginOptionsForChild.eval).length === 0\n ) {\n delete pluginOptionsForChild.eval;\n }\n\n return {\n filename,\n root: file.opts.root ?? undefined,\n code: file.code ?? '',\n inputSourceMap: file.opts.inputSourceMap ?? undefined,\n pluginOptions: pluginOptionsForChild,\n inlineEvalGlobals,\n };\n};\n\nconst runSyncTransform = (\n payload: SyncTransformPayload\n): SyncTransformOutput => {\n let input: string;\n try {\n input = stringifyPayload(payload);\n } catch (error) {\n throw new Error(\n `[wyw-in-js] Failed to serialize babel preset options: ${String(error)}`\n );\n }\n\n const result = spawnSync(nodeBinary, [runnerPath], {\n input,\n encoding: 'utf8',\n cwd: payload.root ?? process.cwd(),\n env: {\n ...process.env,\n NODE_NO_WARNINGS: '1',\n WYW_EVAL_OXC_SYNC: '1',\n },\n maxBuffer: 10 * 1024 * 1024,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n if (result.status !== 0) {\n throw new Error(\n `[wyw-in-js] Babel preset sync transform failed:\\n${result.stderr ?? ''}`\n );\n }\n\n return result.stdout\n ? (JSON.parse(result.stdout) as SyncTransformOutput)\n : { code: payload.code };\n};\n\nconst toBabelMetadata = (\n metadata: WYWTransformResultMetadata\n): WYWTransformMetadata => ({\n dependencies: metadata.dependencies,\n processors: metadata.processors.map((processor) => ({\n artifacts: processor.artifacts,\n className: processor.className,\n displayName: processor.displayName,\n location: processor.start\n ? {\n end: processor.start,\n start: processor.start,\n }\n : null,\n })),\n replacements: metadata.replacements,\n rules: metadata.rules,\n});\n\nfunction oxcCompatibilityPlugin(\n _babel: ConfigAPI,\n options: Partial<PluginOptions>\n): PluginObj {\n return {\n name: '@wyw-in-js/babel-preset/oxc-compatibility',\n pre(file: BabelFile) {\n const payload = buildTransformPayload(file, options);\n const result = runSyncTransform(payload);\n\n if (result.code && result.code !== payload.code) {\n const ast = parseSync(result.code, {\n babelrc: false,\n configFile: false,\n filename: payload.filename,\n sourceType: 'module',\n });\n\n if (ast?.program) {\n const programNode = file.path.node;\n programNode.body = ast.program.body;\n programNode.directives = ast.program.directives;\n }\n }\n\n if (result.metadata) {\n const metadata = file.metadata as { wywInJS?: WYWTransformMetadata };\n metadata.wywInJS = toBabelMetadata(result.metadata);\n }\n },\n visitor: {},\n };\n}\n\nexport default function wywInJS(babel: ConfigAPI, options: PluginOptions) {\n if (!babel.caller(isEnabled)) {\n return {};\n }\n\n warnBabelPresetDeprecation();\n warnSynchronousModuleConfig(options.configFile);\n\n return {\n plugins: [[oxcCompatibilityPlugin, options]],\n };\n}\n"],"file":"index.js"}
1
+ {"mappings":"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","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["import { existsSync } from 'fs';\nimport { spawnSync } from 'child_process';\nimport { fileURLToPath } from 'url';\n\nimport type {\n BabelFile,\n ConfigAPI,\n PluginObj,\n TransformCaller,\n} from '@babel/core';\nimport { parseSync } from '@babel/core';\nimport type {\n PluginOptions,\n WYWTransformMetadata,\n WYWTransformResultMetadata,\n} from '@wyw-in-js/transform';\n\nimport { encodeGlobals } from './globals';\n\ntype SyncTransformPayload = {\n code: string;\n filename: string;\n inlineEvalGlobals?: unknown;\n inputSourceMap?: unknown;\n pluginOptions: Partial<PluginOptions>;\n root?: string;\n};\n\ntype SyncTransformOutput = {\n code: string;\n metadata?: WYWTransformResultMetadata;\n sourceMap?: unknown;\n};\n\nconst buildRunnerPath = () => {\n const jsPath = fileURLToPath(\n new URL('./sync-transform-runner.js', import.meta.url)\n );\n if (existsSync(jsPath)) {\n return jsPath;\n }\n\n return fileURLToPath(new URL('./sync-transform-runner.ts', import.meta.url));\n};\n\nconst runnerPath = buildRunnerPath();\nconst nodeBinary =\n runnerPath.endsWith('.ts') && process.execPath.includes('bun')\n ? process.execPath\n : process.env.WYW_NODE_BINARY ||\n (process.execPath.includes('bun') ? 'node' : process.execPath);\n\nconst compatibilityWarnings = new Set<string>();\n\nconst emitCompatibilityWarning = (key: string, message: string) => {\n if (compatibilityWarnings.has(key)) {\n return;\n }\n\n compatibilityWarnings.add(key);\n\n if (typeof process.emitWarning === 'function') {\n process.emitWarning(message, {\n code: `WYW_${key}`,\n type: 'DeprecationWarning',\n });\n return;\n }\n\n // eslint-disable-next-line no-console\n console.warn(message);\n};\n\nconst warnBabelPresetDeprecation = () => {\n emitCompatibilityWarning(\n 'BABEL_PRESET_COMPATIBILITY',\n '[wyw-in-js] @wyw-in-js/babel-preset is a deprecated compatibility wrapper around the Oxc-backed transform. Prefer bundler integrations or the transform() API for new setups.'\n );\n};\n\nconst warnSynchronousModuleConfig = (configFile: unknown) => {\n if (typeof configFile !== 'string' || !/\\.(?:mjs|mts)$/iu.test(configFile)) {\n return;\n }\n\n emitCompatibilityWarning(\n 'BABEL_PRESET_SYNC_CONFIG',\n '[wyw-in-js] @wyw-in-js/babel-preset loads .mjs/.mts WyW config files synchronously. Keep them synchronous and avoid top-level await.'\n );\n};\n\nfunction isEnabled(caller?: TransformCaller & { evaluate?: true }) {\n return caller?.name !== 'wyw-in-js' || caller.evaluate === true;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n};\n\nconst getObjectTypeName = (value: object): string => {\n const { constructor } = value as { constructor?: { name?: unknown } };\n if (\n constructor &&\n typeof constructor.name === 'string' &&\n constructor.name.length > 0\n ) {\n return constructor.name;\n }\n\n const tag = Object.prototype.toString.call(value);\n return tag.slice(8, -1) || 'Object';\n};\n\nconst formatOptionPath = (path: Array<string | number>): string =>\n path.reduce<string>((acc, segment) => {\n if (typeof segment === 'number') {\n return `${acc}[${segment}]`;\n }\n\n if (/^[A-Za-z_$][\\w$]*$/u.test(segment)) {\n return `${acc}.${segment}`;\n }\n\n return `${acc}[${JSON.stringify(segment)}]`;\n }, 'options');\n\nconst throwNonSerializableOption = (\n path: Array<string | number>,\n reason: string\n): never => {\n throw new Error(\n `[wyw-in-js] Babel preset option ${formatOptionPath(\n path\n )} is not serializable (${reason}). ` +\n '@wyw-in-js/babel-preset forwards inline options through a separate sync runner. ' +\n 'Move it into a WyW config file or use the async transform() API.'\n );\n};\n\nconst validateSerializableValue = (\n value: unknown,\n path: Array<string | number>\n): void => {\n if (\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return;\n }\n\n if (typeof value === 'function') {\n throwNonSerializableOption(path, 'Function');\n }\n\n if (typeof value === 'symbol') {\n throwNonSerializableOption(path, 'Symbol');\n }\n\n if (typeof value === 'bigint') {\n throwNonSerializableOption(path, 'BigInt');\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n validateSerializableValue(item, [...path, index])\n );\n return;\n }\n\n if (isPlainObject(value)) {\n Object.entries(value).forEach(([key, item]) =>\n validateSerializableValue(item, [...path, key])\n );\n return;\n }\n\n throwNonSerializableOption(path, getObjectTypeName(value));\n};\n\nconst stringifyPayload = (payload: SyncTransformPayload) => {\n validateSerializableValue(payload.inputSourceMap, ['inputSourceMap']);\n validateSerializableValue(payload.pluginOptions, ['pluginOptions']);\n return JSON.stringify(payload);\n};\n\nconst buildTransformPayload = (\n file: BabelFile,\n options: Partial<PluginOptions>\n): SyncTransformPayload => {\n const filename = file.opts.filename!;\n const evalOptions = options.eval ?? {};\n const inlineEvalGlobals =\n evalOptions.globals === undefined\n ? undefined\n : encodeGlobals(evalOptions.globals);\n const nextEvalOptions =\n 'globals' in evalOptions\n ? Object.fromEntries(\n Object.entries(evalOptions).filter(([key]) => key !== 'globals')\n )\n : evalOptions;\n\n const pluginOptionsForChild: Partial<PluginOptions> = {\n ...options,\n eval: nextEvalOptions,\n outputMetadata: true,\n };\n\n if (\n pluginOptionsForChild.eval &&\n Object.keys(pluginOptionsForChild.eval).length === 0\n ) {\n delete pluginOptionsForChild.eval;\n }\n\n return {\n filename,\n root: file.opts.root ?? undefined,\n code: file.code ?? '',\n inputSourceMap: file.opts.inputSourceMap ?? undefined,\n pluginOptions: pluginOptionsForChild,\n inlineEvalGlobals,\n };\n};\n\nconst runSyncTransform = (\n payload: SyncTransformPayload\n): SyncTransformOutput => {\n let input: string;\n try {\n input = stringifyPayload(payload);\n } catch (error) {\n throw new Error(\n `[wyw-in-js] Failed to serialize babel preset options: ${String(error)}`\n );\n }\n\n const result = spawnSync(nodeBinary, [runnerPath], {\n input,\n encoding: 'utf8',\n cwd: payload.root ?? process.cwd(),\n env: {\n ...process.env,\n NODE_NO_WARNINGS: '1',\n WYW_EVAL_OXC_SYNC: '1',\n },\n maxBuffer: 10 * 1024 * 1024,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n if (result.status !== 0) {\n throw new Error(\n `[wyw-in-js] Babel preset sync transform failed:\\n${result.stderr ?? ''}`\n );\n }\n\n return result.stdout\n ? (JSON.parse(result.stdout) as SyncTransformOutput)\n : { code: payload.code };\n};\n\nconst toBabelMetadata = (\n metadata: WYWTransformResultMetadata\n): WYWTransformMetadata => ({\n dependencies: metadata.dependencies,\n processors: metadata.processors.map((processor) => ({\n artifacts: processor.artifacts,\n className: processor.className,\n displayName: processor.displayName,\n location: processor.start\n ? {\n end: processor.start,\n start: processor.start,\n }\n : null,\n })),\n replacements: metadata.replacements,\n rules: metadata.rules,\n});\n\nfunction oxcCompatibilityPlugin(\n _babel: ConfigAPI,\n options: Partial<PluginOptions>\n): PluginObj {\n return {\n name: '@wyw-in-js/babel-preset/oxc-compatibility',\n pre(file: BabelFile) {\n const payload = buildTransformPayload(file, options);\n const result = runSyncTransform(payload);\n\n if (result.code && result.code !== payload.code) {\n const ast = parseSync(result.code, {\n babelrc: false,\n configFile: false,\n filename: payload.filename,\n sourceType: 'module',\n });\n\n if (ast?.program) {\n const programNode = file.path.node;\n programNode.body = ast.program.body;\n programNode.directives = ast.program.directives;\n }\n }\n\n if (result.metadata) {\n const metadata = file.metadata as { wywInJS?: WYWTransformMetadata };\n metadata.wywInJS = toBabelMetadata(result.metadata);\n }\n },\n visitor: {},\n };\n}\n\nexport default function wywInJS(babel: ConfigAPI, options: PluginOptions) {\n if (!babel.caller(isEnabled)) {\n return {};\n }\n\n warnBabelPresetDeprecation();\n warnSynchronousModuleConfig(options.configFile);\n\n return {\n plugins: [[oxcCompatibilityPlugin, options]],\n };\n}\n"],"file":"index.js"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@wyw-in-js/babel-preset",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.1",
4
4
  "type": "module",
5
5
  "dependencies": {
6
6
  "@babel/core": "^7.23.5",
7
- "@wyw-in-js/shared": "2.0.0-alpha.1",
8
- "@wyw-in-js/transform": "2.0.0-alpha.1"
7
+ "@wyw-in-js/shared": "2.0.0",
8
+ "@wyw-in-js/transform": "2.0.1"
9
9
  },
10
10
  "devDependencies": {
11
11
  "@types/babel__core": "^7.20.5",
package/types/index.js CHANGED
@@ -35,8 +35,7 @@ const warnBabelPresetDeprecation = () => {
35
35
  emitCompatibilityWarning('BABEL_PRESET_COMPATIBILITY', '[wyw-in-js] @wyw-in-js/babel-preset is a deprecated compatibility wrapper around the Oxc-backed transform. Prefer bundler integrations or the transform() API for new setups.');
36
36
  };
37
37
  const warnSynchronousModuleConfig = (configFile) => {
38
- if (typeof configFile !== 'string' ||
39
- !/\.(?:mjs|mts)$/iu.test(configFile)) {
38
+ if (typeof configFile !== 'string' || !/\.(?:mjs|mts)$/iu.test(configFile)) {
40
39
  return;
41
40
  }
42
41
  emitCompatibilityWarning('BABEL_PRESET_SYNC_CONFIG', '[wyw-in-js] @wyw-in-js/babel-preset loads .mjs/.mts WyW config files synchronously. Keep them synchronous and avoid top-level await.');