@wyw-in-js/shared 2.0.0-alpha.0 → 2.0.0

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 CHANGED
@@ -5,6 +5,7 @@ export { findPackageJSON } from "./findPackageJSON.js";
5
5
  export { isBoxedPrimitive } from "./isBoxedPrimitive.js";
6
6
  export { enableDebug, logger } from "./logger.js";
7
7
  export { isFeatureEnabled } from "./options/isFeatureEnabled.js";
8
+ export { mergeOxcResolverAlias, toNativeResolverAlias } from "./options/nativeResolverOptions.js";
8
9
  export { slugify } from "./slugify.js";
9
10
  export { ValueType } from "./types.js";
10
11
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"AAEA,SAAS,sBAAsB,mBAAmB;AAClD,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,aAAa,cAAc;AACpC,SAAS,wBAAwB;AACjC,SAAS,eAAe;AACxB,SAAS,iBAAiB","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["export type { Debugger } from './debugger';\n\nexport { asyncResolveFallback, syncResolve } from './asyncResolveFallback';\nexport { asyncResolverFactory } from './asyncResolverFactory';\nexport { hasEvalMeta } from './hasEvalMeta';\nexport { findPackageJSON } from './findPackageJSON';\nexport { isBoxedPrimitive } from './isBoxedPrimitive';\nexport { enableDebug, logger } from './logger';\nexport { isFeatureEnabled } from './options/isFeatureEnabled';\nexport { slugify } from './slugify';\nexport { ValueType } from './types';\n\nexport type { IVariableContext } from './IVariableContext';\nexport type {\n ClassNameSlugVars,\n ClassNameFn,\n CodeRemoverOptions,\n EvalOptionsV2,\n EvalRequireMode,\n EvalResolverKind,\n EvalResolverMode,\n EvalWarning,\n EvalWarningCode,\n ImportLoader,\n ImportLoaderContext,\n ImportLoaders,\n ImportOverride,\n ImportOverrides,\n OxcOptions,\n TagResolverMeta,\n StrictOptions,\n EvalRule,\n EvaluatorOptions,\n TransformEngineOptions,\n Evaluator,\n FeatureFlag,\n EvaluatorConfig,\n FeatureFlags,\n VariableNameFn,\n} from './options/types';\nexport type {\n Artifact,\n AstExpression,\n AstNode,\n BigIntLiteral,\n BooleanLiteral,\n BuildCodeFrameErrorFn,\n ConstValue,\n DecimalLiteral,\n ExpressionValue,\n FunctionValue,\n Identifier,\n ICSSRule,\n LazyValue,\n Location,\n NullLiteral,\n NumericLiteral,\n Replacement,\n Replacements,\n Rules,\n SourceLocation,\n StringLiteral,\n WYWEvalMeta,\n} from './types';\n"],"file":"index.js"}
1
+ {"mappings":"AAEA,SAAS,sBAAsB,mBAAmB;AAClD,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,aAAa,cAAc;AACpC,SAAS,wBAAwB;AACjC,SACE,uBACA,6BACK;AAEP,SAAS,eAAe;AACxB,SAAS,iBAAiB","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["export type { Debugger } from './debugger';\n\nexport { asyncResolveFallback, syncResolve } from './asyncResolveFallback';\nexport { asyncResolverFactory } from './asyncResolverFactory';\nexport { hasEvalMeta } from './hasEvalMeta';\nexport { findPackageJSON } from './findPackageJSON';\nexport { isBoxedPrimitive } from './isBoxedPrimitive';\nexport { enableDebug, logger } from './logger';\nexport { isFeatureEnabled } from './options/isFeatureEnabled';\nexport {\n mergeOxcResolverAlias,\n toNativeResolverAlias,\n} from './options/nativeResolverOptions';\nexport type { NativeResolverAlias } from './options/nativeResolverOptions';\nexport { slugify } from './slugify';\nexport { ValueType } from './types';\n\nexport type { IVariableContext } from './IVariableContext';\nexport type {\n ClassNameSlugVars,\n ClassNameFn,\n CodeRemoverOptions,\n EvalErrorMode,\n EvalOptionsV2,\n EvalRequireMode,\n EvalResolverKind,\n EvalResolverMode,\n EvalRuntime,\n EvalStrategy,\n EvalWarning,\n EvalWarningCode,\n ImportLoader,\n ImportLoaderContext,\n ImportLoaders,\n ImportOverride,\n ImportOverrides,\n OxcOptions,\n TagResolverMeta,\n StrictOptions,\n EvalRule,\n EvaluatorOptions,\n TransformEngineOptions,\n Evaluator,\n FeatureFlag,\n EvaluatorConfig,\n FeatureFlags,\n VariableNameFn,\n} from './options/types';\nexport type {\n Artifact,\n AstExpression,\n AstNode,\n BigIntLiteral,\n BooleanLiteral,\n BuildCodeFrameErrorFn,\n ConstValue,\n DecimalLiteral,\n ExpressionValue,\n FunctionValue,\n Identifier,\n ICSSRule,\n LazyValue,\n Location,\n NullLiteral,\n NumericLiteral,\n Replacement,\n Replacements,\n Rules,\n SourceLocation,\n StringLiteral,\n WYWEvalMeta,\n} from './types';\n"],"file":"index.js"}
@@ -0,0 +1,54 @@
1
+ const isNativeResolverAlias = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
2
+ const toAliasTargets = (replacement) => {
3
+ if (typeof replacement === "string") {
4
+ return [replacement];
5
+ }
6
+ if (Array.isArray(replacement) && replacement.every((item) => typeof item === "string")) {
7
+ return replacement;
8
+ }
9
+ return null;
10
+ };
11
+ export const toNativeResolverAlias = (alias) => {
12
+ const nativeAlias = {};
13
+ let entries = [];
14
+ if (Array.isArray(alias)) {
15
+ entries = alias;
16
+ } else if (isNativeResolverAlias(alias)) {
17
+ entries = Object.entries(alias).map(([find, replacement]) => ({
18
+ find,
19
+ replacement
20
+ }));
21
+ }
22
+ entries.forEach((rawEntry) => {
23
+ if (!isNativeResolverAlias(rawEntry)) {
24
+ return;
25
+ }
26
+ const entry = rawEntry;
27
+ const find = "find" in entry ? entry.find : entry.name;
28
+ const replacement = "replacement" in entry ? entry.replacement : entry.alias;
29
+ const targets = toAliasTargets(replacement);
30
+ if (typeof find !== "string" || !targets) {
31
+ return;
32
+ }
33
+ nativeAlias[find] = targets;
34
+ });
35
+ return nativeAlias;
36
+ };
37
+ export const mergeOxcResolverAlias = (oxcOptions, bundlerAlias) => {
38
+ if (Object.keys(bundlerAlias).length === 0) {
39
+ return oxcOptions;
40
+ }
41
+ const resolver = oxcOptions?.resolver ?? {};
42
+ const configuredAlias = isNativeResolverAlias(resolver.alias) ? resolver.alias : {};
43
+ return {
44
+ ...oxcOptions,
45
+ resolver: {
46
+ ...resolver,
47
+ alias: {
48
+ ...bundlerAlias,
49
+ ...configuredAlias
50
+ }
51
+ }
52
+ };
53
+ };
54
+ //# sourceMappingURL=nativeResolverOptions.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"AAcA,MAAM,yBAAyB,UAC7B,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;AAEtE,MAAM,kBACJ,gBAC4C;AAC5C,KAAI,OAAO,gBAAgB,UAAU;AACnC,SAAO,CAAC,YAAY;;AAGtB,KACE,MAAM,QAAQ,YAAY,IAC1B,YAAY,OAAO,SAAS,OAAO,SAAS,SAAS,EACrD;AACA,SAAO;;AAGT,QAAO;;AAGT,OAAO,MAAM,yBAAyB,UAAwC;CAC5E,MAAM,cAAmC,EAAE;CAE3C,IAAI,UAAqB,EAAE;AAE3B,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,YAAU;YACD,sBAAsB,MAAM,EAAE;AACvC,YAAU,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,kBAAkB;GAC5D;GACA;GACD,EAAE;;AAGL,SAAQ,SAAS,aAAa;AAC5B,MAAI,CAAC,sBAAsB,SAAS,EAAE;AACpC;;EAGF,MAAM,QAAQ;EACd,MAAM,OAAO,UAAU,QAAQ,MAAM,OAAO,MAAM;EAClD,MAAM,cACJ,iBAAiB,QAAQ,MAAM,cAAc,MAAM;EACrD,MAAM,UAAU,eAAe,YAAY;AAE3C,MAAI,OAAO,SAAS,YAAY,CAAC,SAAS;AACxC;;AAGF,cAAY,QAAQ;GACpB;AAEF,QAAO;;AAGT,OAAO,MAAM,yBACX,YACA,iBAC2B;AAC3B,KAAI,OAAO,KAAK,aAAa,CAAC,WAAW,GAAG;AAC1C,SAAO;;CAGT,MAAM,WAAW,YAAY,YAAY,EAAE;CAC3C,MAAM,kBAAkB,sBAAsB,SAAS,MAAM,GACzD,SAAS,QACT,EAAE;AAEN,QAAO;EACL,GAAG;EACH,UAAU;GACR,GAAG;GACH,OAAO;IACL,GAAG;IACH,GAAG;IACJ;GACF;EACF","names":[],"sources":["../../src/options/nativeResolverOptions.ts"],"version":3,"sourcesContent":["import type { OxcOptions } from './types';\n\nexport type NativeResolverAlias = Record<\n string,\n Array<string | undefined | null>\n>;\n\ntype AliasEntry = {\n alias?: unknown;\n find?: unknown;\n name?: unknown;\n replacement?: unknown;\n};\n\nconst isNativeResolverAlias = (value: unknown): value is NativeResolverAlias =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst toAliasTargets = (\n replacement: unknown\n): Array<string | undefined | null> | null => {\n if (typeof replacement === 'string') {\n return [replacement];\n }\n\n if (\n Array.isArray(replacement) &&\n replacement.every((item) => typeof item === 'string')\n ) {\n return replacement;\n }\n\n return null;\n};\n\nexport const toNativeResolverAlias = (alias: unknown): NativeResolverAlias => {\n const nativeAlias: NativeResolverAlias = {};\n\n let entries: unknown[] = [];\n\n if (Array.isArray(alias)) {\n entries = alias;\n } else if (isNativeResolverAlias(alias)) {\n entries = Object.entries(alias).map(([find, replacement]) => ({\n find,\n replacement,\n }));\n }\n\n entries.forEach((rawEntry) => {\n if (!isNativeResolverAlias(rawEntry)) {\n return;\n }\n\n const entry = rawEntry as AliasEntry;\n const find = 'find' in entry ? entry.find : entry.name;\n const replacement =\n 'replacement' in entry ? entry.replacement : entry.alias;\n const targets = toAliasTargets(replacement);\n\n if (typeof find !== 'string' || !targets) {\n return;\n }\n\n nativeAlias[find] = targets;\n });\n\n return nativeAlias;\n};\n\nexport const mergeOxcResolverAlias = (\n oxcOptions: OxcOptions | undefined,\n bundlerAlias: NativeResolverAlias\n): OxcOptions | undefined => {\n if (Object.keys(bundlerAlias).length === 0) {\n return oxcOptions;\n }\n\n const resolver = oxcOptions?.resolver ?? {};\n const configuredAlias = isNativeResolverAlias(resolver.alias)\n ? resolver.alias\n : {};\n\n return {\n ...oxcOptions,\n resolver: {\n ...resolver,\n alias: {\n ...bundlerAlias,\n ...configuredAlias,\n },\n },\n };\n};\n"],"file":"nativeResolverOptions.js"}
@@ -1 +1 @@
1
- {"mappings":"","names":[],"sources":["../../src/options/types.ts"],"version":3,"sourcesContent":["import type { IVariableContext } from '../IVariableContext';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype VmContext = Record<string, any>; // It's Context from `vm`\n\nexport type ClassNameSlugVars = {\n dir: string;\n ext: string;\n file: string;\n hash: string;\n index: number;\n name: string;\n title: string;\n};\n\nexport type ClassNameFn = (\n hash: string,\n title: string,\n args: ClassNameSlugVars\n) => string;\n\nexport type VariableNameFn = (context: IVariableContext) => string;\n\nexport type EvaluatorConfig = {\n features: StrictOptions['features'];\n highPriorityPlugins: string[];\n importOverrides?: StrictOptions['importOverrides'];\n onlyExports: string[];\n root?: string;\n};\n\nexport type EvaluatorOptions = {\n ast?: boolean | null;\n configFile?: boolean | null | string;\n env?: Record<string, EvaluatorOptions | null | undefined> | null;\n filename?: string | null;\n inputSourceMap?: object | null;\n overrides?: EvaluatorOptions[] | null;\n plugins?: unknown[] | null;\n presets?: unknown[] | null;\n root?: string | null;\n sourceFileName?: string | null;\n sourceMaps?: boolean | 'both' | 'inline' | null;\n [key: string]: unknown;\n};\n\nexport type TransformEngineOptions = EvaluatorOptions;\n\nexport type EvaluatorAst = unknown;\n\nexport type EvaluatorRuntime = unknown;\n\nexport type Evaluator = (\n evalConfig: EvaluatorOptions,\n ast: EvaluatorAst,\n code: string,\n config: EvaluatorConfig,\n runtime: EvaluatorRuntime\n) => [\n ast: EvaluatorAst,\n code: string,\n imports: Map<string, string[]> | null,\n exports?: string[] | null,\n];\n\nexport type EvalRule = {\n action: Evaluator | 'ignore' | string;\n /**\n * Per-rule Oxc options for the Oxc-first transform path.\n */\n oxcOptions?: OxcOptions;\n test?: RegExp | ((path: string, code: string) => boolean);\n};\n\nexport type FeatureFlag = boolean | string | string[];\n\ntype ImportOverrideMock = {\n /**\n * Replaces resolved import with provided specifier (resolved on prepare/eval stages).\n * Raw `source` stays intact; only resolution target changes.\n */\n mock: string;\n noShake?: never;\n unknown?: never;\n};\n\ntype ImportOverrideNoShake = {\n mock?: never;\n /**\n * Disables tree-shaking for this import by forcing `only=['*']`.\n */\n noShake: true;\n unknown?: never;\n};\n\ntype ImportOverrideUnknown = {\n mock?: never;\n noShake?: never;\n /**\n * Controls behavior when an import reaches eval-time Node resolver fallback.\n * - 'warn' (default): warn once per canonical import key.\n * - 'error': throw.\n * - 'allow': no warning, keep load-as-is.\n */\n unknown: 'allow' | 'error' | 'warn';\n};\n\nexport type ImportOverride =\n | ImportOverrideMock\n | ImportOverrideNoShake\n | ImportOverrideUnknown;\n\nexport type ImportOverrides = Record<string, ImportOverride>;\n\nexport type ImportLoaderContext = {\n emitWarning: (message: string) => void;\n filename: string;\n hash: string;\n importer: string;\n query: string;\n readFile: () => string;\n request: string;\n resolved: string;\n toUrl: () => string;\n};\n\nexport type ImportLoader =\n | 'raw'\n | 'url'\n | ((context: ImportLoaderContext) => unknown);\n\nexport type ImportLoaders = Record<string, ImportLoader | false>;\n\nexport type EvalResolverMode = 'bundler' | 'hybrid' | 'node' | 'custom';\n\nexport type EvalRequireMode = 'warn-and-run' | 'error' | 'off';\n\nexport type EvalResolverKind = 'import' | 'dynamic-import' | 'require';\n\nexport type EvalWarningCode =\n | 'resolve-fallback'\n | 'resolve-error'\n | 'require-fallback'\n | 'require-error'\n | 'dynamic-import'\n | 'eval-error';\n\nexport type EvalWarning = {\n code: EvalWarningCode;\n message: string;\n importer?: string;\n specifier?: string;\n resolved?: string | null;\n callstack?: string[];\n hint?: string;\n};\n\nexport type EvalOptionsV2 = {\n /**\n * Default is `bundler`. `hybrid` is an opt-in mode whose intended\n * precedence is customResolver -> safe Oxc subset -> bundler -> node.\n */\n resolver?: EvalResolverMode;\n customResolver?: (\n specifier: string,\n importer: string,\n kind: EvalResolverKind\n ) => Promise<{ id: string; external?: boolean } | null>;\n customLoader?: (\n id: string\n ) => Promise<{ code: string; map?: unknown; loader?: string } | null>;\n require?: EvalRequireMode; // default: 'warn-and-run'\n mode?: 'strict' | 'loose'; // default: 'strict'\n globals?: Record<string, unknown>;\n onWarn?: (warning: EvalWarning) => void;\n};\n\nexport type TagResolverMeta = {\n resolvedSource?: string;\n sourceFile: string | null | undefined;\n};\n\ntype AllFeatureFlags = {\n dangerousCodeRemover: FeatureFlag;\n globalCache: FeatureFlag;\n happyDOM: FeatureFlag;\n softErrors: FeatureFlag;\n staticImportValues: FeatureFlag;\n useWeakRefInEval: FeatureFlag;\n};\n\nexport type FeatureFlags<\n TOnly extends keyof AllFeatureFlags = keyof AllFeatureFlags,\n> = Pick<AllFeatureFlags, TOnly>;\n\nexport type CodeRemoverOptions = {\n componentTypes?: Record<string, string[]>;\n hocs?: Record<string, string[]>;\n};\n\nexport type OxcOptions = {\n /**\n * Parser-level Oxc options. The first slice only preserves this contract.\n */\n parser?: Record<string, unknown>;\n /**\n * Resolver-level Oxc options. Bundler-aware resolution remains authoritative\n * unless `eval.resolver` explicitly opts into `hybrid`.\n */\n resolver?: Record<string, unknown>;\n /**\n * Transform-level Oxc options.\n */\n transform?: Record<string, unknown>;\n};\n\nexport type StrictOptions = {\n classNameSlug?: string | ClassNameFn;\n codeRemover?: CodeRemoverOptions;\n conditionNames?: string[];\n displayName: boolean;\n evaluate: boolean;\n eval?: EvalOptionsV2;\n extensions: string[];\n features: FeatureFlags;\n highPriorityPlugins: string[];\n ignore?: RegExp;\n importLoaders?: ImportLoaders;\n importOverrides?: ImportOverrides;\n outputMetadata: boolean;\n overrideContext?: (\n context: Partial<VmContext>,\n filename: string\n ) => Partial<VmContext>;\n /**\n * Oxc-first transform options.\n */\n oxcOptions: OxcOptions;\n rules: EvalRule[];\n tagResolver?: (\n source: string,\n tag: string,\n meta: TagResolverMeta\n ) => string | null;\n evalConsole?: 'warning' | 'pipe';\n variableNameConfig?: 'var' | 'dashes' | 'raw';\n variableNameSlug?: string | VariableNameFn;\n};\n"],"file":"types.js"}
1
+ {"mappings":"","names":[],"sources":["../../src/options/types.ts"],"version":3,"sourcesContent":["import type { IVariableContext } from '../IVariableContext';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype VmContext = Record<string, any>; // It's Context from `vm`\n\nexport type ClassNameSlugVars = {\n dir: string;\n ext: string;\n file: string;\n hash: string;\n index: number;\n name: string;\n title: string;\n};\n\nexport type ClassNameFn = (\n hash: string,\n title: string,\n args: ClassNameSlugVars\n) => string;\n\nexport type VariableNameFn = (context: IVariableContext) => string;\n\nexport type EvaluatorConfig = {\n features: StrictOptions['features'];\n highPriorityPlugins: string[];\n importOverrides?: StrictOptions['importOverrides'];\n onlyExports: string[];\n root?: string;\n};\n\nexport type EvaluatorOptions = {\n ast?: boolean | null;\n configFile?: boolean | null | string;\n env?: Record<string, EvaluatorOptions | null | undefined> | null;\n filename?: string | null;\n inputSourceMap?: object | null;\n overrides?: EvaluatorOptions[] | null;\n plugins?: unknown[] | null;\n presets?: unknown[] | null;\n root?: string | null;\n sourceFileName?: string | null;\n sourceMaps?: boolean | 'both' | 'inline' | null;\n [key: string]: unknown;\n};\n\nexport type TransformEngineOptions = EvaluatorOptions;\n\nexport type EvaluatorAst = unknown;\n\nexport type EvaluatorRuntime = unknown;\n\nexport type Evaluator = (\n evalConfig: EvaluatorOptions,\n ast: EvaluatorAst,\n code: string,\n config: EvaluatorConfig,\n runtime: EvaluatorRuntime\n) => [\n ast: EvaluatorAst,\n code: string,\n imports: Map<string, string[]> | null,\n exports?: string[] | null,\n];\n\nexport type EvalRule = {\n action: Evaluator | 'ignore' | string;\n /**\n * Per-rule Oxc options for the Oxc-first transform path.\n */\n oxcOptions?: OxcOptions;\n test?: RegExp | ((path: string, code: string) => boolean);\n};\n\nexport type FeatureFlag = boolean | string | string[];\n\ntype ImportOverrideMock = {\n /**\n * Replaces resolved import with provided specifier (resolved on prepare/eval stages).\n * Raw `source` stays intact; only resolution target changes.\n */\n mock: string;\n noShake?: never;\n unknown?: never;\n};\n\ntype ImportOverrideNoShake = {\n mock?: never;\n /**\n * Disables tree-shaking for this import by forcing `only=['*']`.\n */\n noShake: true;\n unknown?: never;\n};\n\ntype ImportOverrideUnknown = {\n mock?: never;\n noShake?: never;\n /**\n * Controls behavior when an import reaches eval-time native resolver fallback.\n * - 'warn' (default): warn once per canonical import key.\n * - 'error': throw.\n * - 'allow': no warning, keep load-as-is.\n */\n unknown: 'allow' | 'error' | 'warn';\n};\n\nexport type ImportOverride =\n | ImportOverrideMock\n | ImportOverrideNoShake\n | ImportOverrideUnknown;\n\nexport type ImportOverrides = Record<string, ImportOverride>;\n\nexport type ImportLoaderContext = {\n emitWarning: (message: string) => void;\n filename: string;\n hash: string;\n importer: string;\n query: string;\n readFile: () => string;\n request: string;\n resolved: string;\n toUrl: () => string;\n};\n\nexport type ImportLoader =\n | 'raw'\n | 'url'\n | ((context: ImportLoaderContext) => unknown);\n\nexport type ImportLoaders = Record<string, ImportLoader | false>;\n\nexport type EvalResolverMode = 'bundler' | 'hybrid' | 'native' | 'custom';\n\nexport type EvalRequireMode = 'warn-and-run' | 'error' | 'off';\n\nexport type EvalStrategy = 'execute' | 'hybrid' | 'static';\n\nexport type EvalRuntime = 'nodejs';\n\nexport type EvalErrorMode = 'strict' | 'loose';\n\nexport type EvalResolverKind = 'import' | 'dynamic-import' | 'require';\n\nexport type EvalWarningCode =\n | 'resolve-fallback'\n | 'resolve-error'\n | 'require-fallback'\n | 'require-error'\n | 'dynamic-import'\n | 'eval-error';\n\nexport type EvalWarning = {\n code: EvalWarningCode;\n message: string;\n importer?: string;\n specifier?: string;\n resolved?: string | null;\n callstack?: string[];\n hint?: string;\n};\n\nexport type EvalOptionsV2 = {\n /**\n * Controls how interpolation values are computed.\n * - `execute`: use the build-time evaluator.\n * - `hybrid`: resolve provably static values first, then fall back to the evaluator.\n * - `static`: resolve only provably static values and fail on evaluator fallback.\n */\n strategy?: EvalStrategy;\n /**\n * Runtime used by the build-time evaluator.\n */\n runtime?: EvalRuntime;\n /**\n * Default is `bundler`. `hybrid` is an opt-in mode whose intended\n * precedence is customResolver -> native Oxc resolver -> bundler.\n */\n resolver?: EvalResolverMode;\n customResolver?: (\n specifier: string,\n importer: string,\n kind: EvalResolverKind\n ) => Promise<{ id: string; external?: boolean } | null>;\n customLoader?: (\n id: string\n ) => Promise<{ code: string; map?: unknown; loader?: string } | null>;\n require?: EvalRequireMode; // default: 'warn-and-run'\n errors?: EvalErrorMode; // default: 'strict'\n globals?: Record<string, unknown>;\n onWarn?: (warning: EvalWarning) => void;\n};\n\nexport type TagResolverMeta = {\n resolvedSource?: string;\n sourceFile: string | null | undefined;\n};\n\ntype AllFeatureFlags = {\n dangerousCodeRemover: FeatureFlag;\n globalCache: FeatureFlag;\n happyDOM: FeatureFlag;\n softErrors: FeatureFlag;\n useWeakRefInEval: FeatureFlag;\n};\n\nexport type FeatureFlags<\n TOnly extends keyof AllFeatureFlags = keyof AllFeatureFlags,\n> = Pick<AllFeatureFlags, TOnly>;\n\nexport type CodeRemoverOptions = {\n componentTypes?: Record<string, string[]>;\n hocs?: Record<string, string[]>;\n};\n\nexport type OxcOptions = {\n /**\n * Parser-level Oxc options. The first slice only preserves this contract.\n */\n parser?: Record<string, unknown>;\n /**\n * Resolver-level Oxc options. Bundler-aware resolution remains authoritative\n * unless `eval.resolver` explicitly opts into `hybrid`.\n */\n resolver?: Record<string, unknown>;\n /**\n * Transform-level Oxc options.\n */\n transform?: Record<string, unknown>;\n};\n\nexport type StrictOptions = {\n classNameSlug?: string | ClassNameFn;\n codeRemover?: CodeRemoverOptions;\n conditionNames?: string[];\n displayName: boolean;\n eval?: EvalOptionsV2;\n extensions: string[];\n features: FeatureFlags;\n highPriorityPlugins: string[];\n ignore?: RegExp;\n importLoaders?: ImportLoaders;\n importOverrides?: ImportOverrides;\n /**\n * Per-source map of imported names to statically-known values. Used by\n * the static evaluator when resolving imports from the listed sources.\n *\n * Each entry maps an import source (a package name or absolute file\n * path) to a record of imported names. Each name's value is either:\n * - a function: treated as a pure helper. Called at every CallExpression\n * site whose callee resolves to this binding, with evaluator-resolved\n * args. Result is treated as a static value.\n * - any other value: treated as a literal binding override. Returned\n * wherever the binding is referenced.\n *\n * Trust model is the same as importOverrides / tagResolver: the user\n * vouches that pure helpers are deterministic and that literal\n * overrides reflect the runtime value (or knowingly diverge for\n * prototyping / SSR theming).\n *\n * Example:\n * staticBindings: {\n * '@linaria/core': {\n * cx: (...args) => args.filter(Boolean).join(' '),\n * },\n * '/abs/path/to/theme.ts': {\n * themeVars: { panelBg: '#f00' },\n * },\n * }\n */\n staticBindings?: Record<string, Record<string, unknown>>;\n outputMetadata: boolean;\n overrideContext?: (\n context: Partial<VmContext>,\n filename: string\n ) => Partial<VmContext>;\n /**\n * Oxc-first transform options.\n */\n oxcOptions: OxcOptions;\n rules: EvalRule[];\n tagResolver?: (\n source: string,\n tag: string,\n meta: TagResolverMeta\n ) => string | null;\n evalConsole?: 'warning' | 'pipe';\n variableNameConfig?: 'var' | 'dashes' | 'raw';\n variableNameSlug?: string | VariableNameFn;\n};\n"],"file":"types.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wyw-in-js/shared",
3
- "version": "2.0.0-alpha.0",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "dependencies": {
6
6
  "debug": "^4.3.4",
package/types/index.d.ts CHANGED
@@ -6,8 +6,10 @@ export { findPackageJSON } from './findPackageJSON';
6
6
  export { isBoxedPrimitive } from './isBoxedPrimitive';
7
7
  export { enableDebug, logger } from './logger';
8
8
  export { isFeatureEnabled } from './options/isFeatureEnabled';
9
+ export { mergeOxcResolverAlias, toNativeResolverAlias, } from './options/nativeResolverOptions';
10
+ export type { NativeResolverAlias } from './options/nativeResolverOptions';
9
11
  export { slugify } from './slugify';
10
12
  export { ValueType } from './types';
11
13
  export type { IVariableContext } from './IVariableContext';
12
- export type { ClassNameSlugVars, ClassNameFn, CodeRemoverOptions, EvalOptionsV2, EvalRequireMode, EvalResolverKind, EvalResolverMode, EvalWarning, EvalWarningCode, ImportLoader, ImportLoaderContext, ImportLoaders, ImportOverride, ImportOverrides, OxcOptions, TagResolverMeta, StrictOptions, EvalRule, EvaluatorOptions, TransformEngineOptions, Evaluator, FeatureFlag, EvaluatorConfig, FeatureFlags, VariableNameFn, } from './options/types';
14
+ export type { ClassNameSlugVars, ClassNameFn, CodeRemoverOptions, EvalErrorMode, EvalOptionsV2, EvalRequireMode, EvalResolverKind, EvalResolverMode, EvalRuntime, EvalStrategy, EvalWarning, EvalWarningCode, ImportLoader, ImportLoaderContext, ImportLoaders, ImportOverride, ImportOverrides, OxcOptions, TagResolverMeta, StrictOptions, EvalRule, EvaluatorOptions, TransformEngineOptions, Evaluator, FeatureFlag, EvaluatorConfig, FeatureFlags, VariableNameFn, } from './options/types';
13
15
  export type { Artifact, AstExpression, AstNode, BigIntLiteral, BooleanLiteral, BuildCodeFrameErrorFn, ConstValue, DecimalLiteral, ExpressionValue, FunctionValue, Identifier, ICSSRule, LazyValue, Location, NullLiteral, NumericLiteral, Replacement, Replacements, Rules, SourceLocation, StringLiteral, WYWEvalMeta, } from './types';
package/types/index.js CHANGED
@@ -5,5 +5,6 @@ export { findPackageJSON } from './findPackageJSON';
5
5
  export { isBoxedPrimitive } from './isBoxedPrimitive';
6
6
  export { enableDebug, logger } from './logger';
7
7
  export { isFeatureEnabled } from './options/isFeatureEnabled';
8
+ export { mergeOxcResolverAlias, toNativeResolverAlias, } from './options/nativeResolverOptions';
8
9
  export { slugify } from './slugify';
9
10
  export { ValueType } from './types';
@@ -0,0 +1,4 @@
1
+ import type { OxcOptions } from './types';
2
+ export type NativeResolverAlias = Record<string, Array<string | undefined | null>>;
3
+ export declare const toNativeResolverAlias: (alias: unknown) => NativeResolverAlias;
4
+ export declare const mergeOxcResolverAlias: (oxcOptions: OxcOptions | undefined, bundlerAlias: NativeResolverAlias) => OxcOptions | undefined;
@@ -0,0 +1,57 @@
1
+ const isNativeResolverAlias = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
2
+ const toAliasTargets = (replacement) => {
3
+ if (typeof replacement === 'string') {
4
+ return [replacement];
5
+ }
6
+ if (Array.isArray(replacement) &&
7
+ replacement.every((item) => typeof item === 'string')) {
8
+ return replacement;
9
+ }
10
+ return null;
11
+ };
12
+ export const toNativeResolverAlias = (alias) => {
13
+ const nativeAlias = {};
14
+ let entries = [];
15
+ if (Array.isArray(alias)) {
16
+ entries = alias;
17
+ }
18
+ else if (isNativeResolverAlias(alias)) {
19
+ entries = Object.entries(alias).map(([find, replacement]) => ({
20
+ find,
21
+ replacement,
22
+ }));
23
+ }
24
+ entries.forEach((rawEntry) => {
25
+ if (!isNativeResolverAlias(rawEntry)) {
26
+ return;
27
+ }
28
+ const entry = rawEntry;
29
+ const find = 'find' in entry ? entry.find : entry.name;
30
+ const replacement = 'replacement' in entry ? entry.replacement : entry.alias;
31
+ const targets = toAliasTargets(replacement);
32
+ if (typeof find !== 'string' || !targets) {
33
+ return;
34
+ }
35
+ nativeAlias[find] = targets;
36
+ });
37
+ return nativeAlias;
38
+ };
39
+ export const mergeOxcResolverAlias = (oxcOptions, bundlerAlias) => {
40
+ if (Object.keys(bundlerAlias).length === 0) {
41
+ return oxcOptions;
42
+ }
43
+ const resolver = oxcOptions?.resolver ?? {};
44
+ const configuredAlias = isNativeResolverAlias(resolver.alias)
45
+ ? resolver.alias
46
+ : {};
47
+ return {
48
+ ...oxcOptions,
49
+ resolver: {
50
+ ...resolver,
51
+ alias: {
52
+ ...bundlerAlias,
53
+ ...configuredAlias,
54
+ },
55
+ },
56
+ };
57
+ };
@@ -71,7 +71,7 @@ type ImportOverrideUnknown = {
71
71
  mock?: never;
72
72
  noShake?: never;
73
73
  /**
74
- * Controls behavior when an import reaches eval-time Node resolver fallback.
74
+ * Controls behavior when an import reaches eval-time native resolver fallback.
75
75
  * - 'warn' (default): warn once per canonical import key.
76
76
  * - 'error': throw.
77
77
  * - 'allow': no warning, keep load-as-is.
@@ -93,8 +93,11 @@ export type ImportLoaderContext = {
93
93
  };
94
94
  export type ImportLoader = 'raw' | 'url' | ((context: ImportLoaderContext) => unknown);
95
95
  export type ImportLoaders = Record<string, ImportLoader | false>;
96
- export type EvalResolverMode = 'bundler' | 'hybrid' | 'node' | 'custom';
96
+ export type EvalResolverMode = 'bundler' | 'hybrid' | 'native' | 'custom';
97
97
  export type EvalRequireMode = 'warn-and-run' | 'error' | 'off';
98
+ export type EvalStrategy = 'execute' | 'hybrid' | 'static';
99
+ export type EvalRuntime = 'nodejs';
100
+ export type EvalErrorMode = 'strict' | 'loose';
98
101
  export type EvalResolverKind = 'import' | 'dynamic-import' | 'require';
99
102
  export type EvalWarningCode = 'resolve-fallback' | 'resolve-error' | 'require-fallback' | 'require-error' | 'dynamic-import' | 'eval-error';
100
103
  export type EvalWarning = {
@@ -107,9 +110,20 @@ export type EvalWarning = {
107
110
  hint?: string;
108
111
  };
109
112
  export type EvalOptionsV2 = {
113
+ /**
114
+ * Controls how interpolation values are computed.
115
+ * - `execute`: use the build-time evaluator.
116
+ * - `hybrid`: resolve provably static values first, then fall back to the evaluator.
117
+ * - `static`: resolve only provably static values and fail on evaluator fallback.
118
+ */
119
+ strategy?: EvalStrategy;
120
+ /**
121
+ * Runtime used by the build-time evaluator.
122
+ */
123
+ runtime?: EvalRuntime;
110
124
  /**
111
125
  * Default is `bundler`. `hybrid` is an opt-in mode whose intended
112
- * precedence is customResolver -> safe Oxc subset -> bundler -> node.
126
+ * precedence is customResolver -> native Oxc resolver -> bundler.
113
127
  */
114
128
  resolver?: EvalResolverMode;
115
129
  customResolver?: (specifier: string, importer: string, kind: EvalResolverKind) => Promise<{
@@ -122,7 +136,7 @@ export type EvalOptionsV2 = {
122
136
  loader?: string;
123
137
  } | null>;
124
138
  require?: EvalRequireMode;
125
- mode?: 'strict' | 'loose';
139
+ errors?: EvalErrorMode;
126
140
  globals?: Record<string, unknown>;
127
141
  onWarn?: (warning: EvalWarning) => void;
128
142
  };
@@ -135,7 +149,6 @@ type AllFeatureFlags = {
135
149
  globalCache: FeatureFlag;
136
150
  happyDOM: FeatureFlag;
137
151
  softErrors: FeatureFlag;
138
- staticImportValues: FeatureFlag;
139
152
  useWeakRefInEval: FeatureFlag;
140
153
  };
141
154
  export type FeatureFlags<TOnly extends keyof AllFeatureFlags = keyof AllFeatureFlags> = Pick<AllFeatureFlags, TOnly>;
@@ -163,7 +176,6 @@ export type StrictOptions = {
163
176
  codeRemover?: CodeRemoverOptions;
164
177
  conditionNames?: string[];
165
178
  displayName: boolean;
166
- evaluate: boolean;
167
179
  eval?: EvalOptionsV2;
168
180
  extensions: string[];
169
181
  features: FeatureFlags;
@@ -171,6 +183,34 @@ export type StrictOptions = {
171
183
  ignore?: RegExp;
172
184
  importLoaders?: ImportLoaders;
173
185
  importOverrides?: ImportOverrides;
186
+ /**
187
+ * Per-source map of imported names to statically-known values. Used by
188
+ * the static evaluator when resolving imports from the listed sources.
189
+ *
190
+ * Each entry maps an import source (a package name or absolute file
191
+ * path) to a record of imported names. Each name's value is either:
192
+ * - a function: treated as a pure helper. Called at every CallExpression
193
+ * site whose callee resolves to this binding, with evaluator-resolved
194
+ * args. Result is treated as a static value.
195
+ * - any other value: treated as a literal binding override. Returned
196
+ * wherever the binding is referenced.
197
+ *
198
+ * Trust model is the same as importOverrides / tagResolver: the user
199
+ * vouches that pure helpers are deterministic and that literal
200
+ * overrides reflect the runtime value (or knowingly diverge for
201
+ * prototyping / SSR theming).
202
+ *
203
+ * Example:
204
+ * staticBindings: {
205
+ * '@linaria/core': {
206
+ * cx: (...args) => args.filter(Boolean).join(' '),
207
+ * },
208
+ * '/abs/path/to/theme.ts': {
209
+ * themeVars: { panelBg: '#f00' },
210
+ * },
211
+ * }
212
+ */
213
+ staticBindings?: Record<string, Record<string, unknown>>;
174
214
  outputMetadata: boolean;
175
215
  overrideContext?: (context: Partial<VmContext>, filename: string) => Partial<VmContext>;
176
216
  /**