@wyw-in-js/transform 1.0.6 → 1.0.8

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.
Files changed (98) hide show
  1. package/esm/cache.js +160 -12
  2. package/esm/cache.js.map +1 -1
  3. package/esm/debug/fileReporter.js.map +1 -1
  4. package/esm/module.js +59 -5
  5. package/esm/module.js.map +1 -1
  6. package/esm/plugins/shaker.js +152 -13
  7. package/esm/plugins/shaker.js.map +1 -1
  8. package/esm/shaker.js +51 -23
  9. package/esm/shaker.js.map +1 -1
  10. package/esm/transform/BaseEntrypoint.js +3 -1
  11. package/esm/transform/BaseEntrypoint.js.map +1 -1
  12. package/esm/transform/Entrypoint.js +68 -20
  13. package/esm/transform/Entrypoint.js.map +1 -1
  14. package/esm/transform/EvaluatedEntrypoint.js.map +1 -1
  15. package/esm/transform/actions/BaseAction.js +2 -1
  16. package/esm/transform/actions/BaseAction.js.map +1 -1
  17. package/esm/transform/actions/actionRunner.js +2 -2
  18. package/esm/transform/actions/actionRunner.js.map +1 -1
  19. package/esm/transform/barrelManifest.js +291 -0
  20. package/esm/transform/barrelManifest.js.map +1 -0
  21. package/esm/transform/generators/getExports.js +5 -0
  22. package/esm/transform/generators/getExports.js.map +1 -1
  23. package/esm/transform/generators/processEntrypoint.js +31 -1
  24. package/esm/transform/generators/processEntrypoint.js.map +1 -1
  25. package/esm/transform/generators/resolveImports.js +29 -5
  26. package/esm/transform/generators/resolveImports.js.map +1 -1
  27. package/esm/transform/generators/rewriteBarrelImports.js +733 -0
  28. package/esm/transform/generators/rewriteBarrelImports.js.map +1 -0
  29. package/esm/transform/generators/transform.js +154 -21
  30. package/esm/transform/generators/transform.js.map +1 -1
  31. package/esm/transform/types.js.map +1 -1
  32. package/esm/transform.js +45 -23
  33. package/esm/transform.js.map +1 -1
  34. package/esm/utils/collectTemplateDependencies.js +9 -0
  35. package/esm/utils/collectTemplateDependencies.js.map +1 -1
  36. package/lib/cache.js +163 -12
  37. package/lib/cache.js.map +1 -1
  38. package/lib/debug/fileReporter.js.map +1 -1
  39. package/lib/module.js +61 -7
  40. package/lib/module.js.map +1 -1
  41. package/lib/plugins/shaker.js +152 -13
  42. package/lib/plugins/shaker.js.map +1 -1
  43. package/lib/shaker.js +58 -26
  44. package/lib/shaker.js.map +1 -1
  45. package/lib/transform/BaseEntrypoint.js +3 -1
  46. package/lib/transform/BaseEntrypoint.js.map +1 -1
  47. package/lib/transform/Entrypoint.js +69 -20
  48. package/lib/transform/Entrypoint.js.map +1 -1
  49. package/lib/transform/EvaluatedEntrypoint.js.map +1 -1
  50. package/lib/transform/actions/BaseAction.js +2 -1
  51. package/lib/transform/actions/BaseAction.js.map +1 -1
  52. package/lib/transform/actions/actionRunner.js +2 -2
  53. package/lib/transform/actions/actionRunner.js.map +1 -1
  54. package/lib/transform/barrelManifest.js +300 -0
  55. package/lib/transform/barrelManifest.js.map +1 -0
  56. package/lib/transform/generators/getExports.js +5 -0
  57. package/lib/transform/generators/getExports.js.map +1 -1
  58. package/lib/transform/generators/processEntrypoint.js +31 -1
  59. package/lib/transform/generators/processEntrypoint.js.map +1 -1
  60. package/lib/transform/generators/resolveImports.js +29 -5
  61. package/lib/transform/generators/resolveImports.js.map +1 -1
  62. package/lib/transform/generators/rewriteBarrelImports.js +743 -0
  63. package/lib/transform/generators/rewriteBarrelImports.js.map +1 -0
  64. package/lib/transform/generators/transform.js +158 -22
  65. package/lib/transform/generators/transform.js.map +1 -1
  66. package/lib/transform/types.js.map +1 -1
  67. package/lib/transform.js +45 -23
  68. package/lib/transform.js.map +1 -1
  69. package/lib/utils/collectTemplateDependencies.js +9 -0
  70. package/lib/utils/collectTemplateDependencies.js.map +1 -1
  71. package/package.json +8 -4
  72. package/types/cache.d.ts +23 -2
  73. package/types/cache.js +170 -10
  74. package/types/debug/fileReporter.d.ts +1 -0
  75. package/types/module.d.ts +3 -0
  76. package/types/module.js +65 -5
  77. package/types/plugins/shaker.js +161 -16
  78. package/types/shaker.d.ts +10 -1
  79. package/types/shaker.js +56 -28
  80. package/types/transform/BaseEntrypoint.d.ts +3 -1
  81. package/types/transform/BaseEntrypoint.js +5 -1
  82. package/types/transform/Entrypoint.d.ts +10 -1
  83. package/types/transform/Entrypoint.js +81 -23
  84. package/types/transform/EvaluatedEntrypoint.d.ts +2 -0
  85. package/types/transform/actions/BaseAction.d.ts +2 -1
  86. package/types/transform/actions/BaseAction.js +3 -1
  87. package/types/transform/actions/actionRunner.js +2 -2
  88. package/types/transform/barrelManifest.d.ts +42 -0
  89. package/types/transform/barrelManifest.js +300 -0
  90. package/types/transform/generators/getExports.js +5 -0
  91. package/types/transform/generators/processEntrypoint.js +29 -1
  92. package/types/transform/generators/resolveImports.js +29 -5
  93. package/types/transform/generators/rewriteBarrelImports.d.ts +15 -0
  94. package/types/transform/generators/rewriteBarrelImports.js +815 -0
  95. package/types/transform/generators/transform.js +148 -19
  96. package/types/transform/types.d.ts +3 -0
  97. package/types/transform.js +47 -23
  98. package/types/utils/collectTemplateDependencies.js +9 -0
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","names":["isFeatureEnabled","loadWywOptions","TransformCacheCollection","Entrypoint","asyncActionRunner","syncActionRunner","baseHandlers","asyncResolveImports","syncResolveImports","withDefaultServices","memoizedSyncResolve","WeakMap","memoizedAsyncResolve","transformSync","partialServices","originalCode","syncResolve","customHandlers","options","pluginOptions","services","features","filename","cache","entrypoint","createRoot","ignored","code","sourceMap","inputSourceMap","workflowAction","createAction","undefined","has","set","resolveImports","call","result","get","log","name","err","console","error","transform","asyncResolve"],"sources":["../src/transform.ts"],"sourcesContent":["/**\n * This file exposes sync and async transform functions that:\n * - parse the passed code to AST\n * - builds a dependency graph for the file\n * - shakes each dependency and removes unused code\n * - runs generated code in a sandbox\n * - collects artifacts\n * - returns transformed code (without WYW template literals), generated CSS, source maps and babel metadata from transform step.\n */\n\nimport { isFeatureEnabled } from '@wyw-in-js/shared';\n\nimport type { PartialOptions } from './transform/helpers/loadWywOptions';\nimport { loadWywOptions } from './transform/helpers/loadWywOptions';\nimport { TransformCacheCollection } from './cache';\nimport { Entrypoint } from './transform/Entrypoint';\nimport {\n asyncActionRunner,\n syncActionRunner,\n} from './transform/actions/actionRunner';\nimport { baseHandlers } from './transform/generators';\nimport {\n asyncResolveImports,\n syncResolveImports,\n} from './transform/generators/resolveImports';\nimport { withDefaultServices } from './transform/helpers/withDefaultServices';\nimport type {\n Handler,\n Handlers,\n IResolveImportsAction,\n Services,\n} from './transform/types';\nimport type { Result } from './types';\n\ntype PartialServices = Partial<Omit<Services, 'options'>> & {\n options: Omit<Services['options'], 'pluginOptions'> & {\n pluginOptions?: PartialOptions;\n };\n};\n\ntype AllHandlers<TMode extends 'async' | 'sync'> = Handlers<TMode>;\n\nconst memoizedSyncResolve = new WeakMap<\n (what: string, importer: string, stack: string[]) => string | null,\n Handler<'sync', IResolveImportsAction>\n>();\n\nconst memoizedAsyncResolve = new WeakMap<\n (what: string, importer: string, stack: string[]) => Promise<string | null>,\n Handler<'async' | 'sync', IResolveImportsAction>\n>();\n\nexport function transformSync(\n partialServices: PartialServices,\n originalCode: string,\n syncResolve: (what: string, importer: string, stack: string[]) => string,\n customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Result {\n const { options } = partialServices;\n const pluginOptions = loadWywOptions(options.pluginOptions);\n const services = withDefaultServices({\n ...partialServices,\n options: {\n ...options,\n pluginOptions,\n },\n });\n\n if (\n !isFeatureEnabled(pluginOptions.features, 'globalCache', options.filename)\n ) {\n // If global cache is disabled, we need to create a new cache for each file\n services.cache = new TransformCacheCollection();\n }\n\n const entrypoint = Entrypoint.createRoot(\n services,\n options.filename,\n ['__wywPreval'],\n originalCode\n );\n\n if (entrypoint.ignored) {\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n const workflowAction = entrypoint.createAction('workflow', undefined);\n\n if (!memoizedSyncResolve.has(syncResolve)) {\n memoizedSyncResolve.set(\n syncResolve,\n function resolveImports(this: IResolveImportsAction) {\n return syncResolveImports.call(this, syncResolve);\n }\n );\n }\n\n try {\n const result = syncActionRunner(workflowAction, {\n ...baseHandlers,\n ...customHandlers,\n resolveImports: memoizedSyncResolve.get(syncResolve)!,\n });\n\n entrypoint.log('%s is ready', entrypoint.name);\n\n return result;\n } catch (err) {\n entrypoint.log('Unhandled error %O', err);\n\n if (\n isFeatureEnabled(pluginOptions.features, 'softErrors', options.filename)\n ) {\n // eslint-disable-next-line no-console\n console.error(`Error during transform of ${entrypoint.name}:`, err);\n\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n throw err;\n }\n}\n\nexport async function transform(\n partialServices: PartialServices,\n originalCode: string,\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>,\n customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Promise<Result> {\n const { options } = partialServices;\n const pluginOptions = loadWywOptions(options.pluginOptions);\n const services = withDefaultServices({\n ...partialServices,\n options: {\n ...options,\n pluginOptions,\n },\n });\n\n if (\n !isFeatureEnabled(pluginOptions.features, 'globalCache', options.filename)\n ) {\n // If global cache is disabled, we need to create a new cache for each file\n services.cache = new TransformCacheCollection();\n }\n\n /*\n * This method can be run simultaneously for multiple files.\n * A shared cache is accessible for all runs, but each run has its own queue\n * to maintain the correct processing order. The cache stores the outcome\n * of tree-shaking, and if the result is already stored in the cache\n * but the \"only\" option has changed, the file will be re-processed using\n * the combined \"only\" option.\n */\n const entrypoint = Entrypoint.createRoot(\n services,\n options.filename,\n ['__wywPreval'],\n originalCode\n );\n\n if (entrypoint.ignored) {\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n const workflowAction = entrypoint.createAction('workflow', undefined);\n\n if (!memoizedAsyncResolve.has(asyncResolve)) {\n const resolveImports = function resolveImports(\n this: IResolveImportsAction\n ) {\n return asyncResolveImports.call(this, asyncResolve);\n };\n\n memoizedAsyncResolve.set(asyncResolve, resolveImports);\n }\n\n try {\n const result = await asyncActionRunner(workflowAction, {\n ...baseHandlers,\n ...customHandlers,\n resolveImports: memoizedAsyncResolve.get(asyncResolve)!,\n });\n\n entrypoint.log('%s is ready', entrypoint.name);\n\n return result;\n } catch (err) {\n entrypoint.log('Unhandled error %O', err);\n\n if (\n isFeatureEnabled(pluginOptions.features, 'softErrors', options.filename)\n ) {\n // eslint-disable-next-line no-console\n console.error(`Error during transform of ${entrypoint.name}:`, err);\n\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n throw err;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"transform.js","names":["isFeatureEnabled","loadWywOptions","TransformCacheCollection","Entrypoint","asyncActionRunner","syncActionRunner","baseHandlers","asyncResolveImports","syncResolveImports","withDefaultServices","memoizedSyncResolve","WeakMap","memoizedAsyncResolve","EMPTY_CUSTOM_HANDLERS","memoizedActionContexts","getActionContext","resolveImportsHandler","customHandlers","customHandlersKey","Object","keys","length","actionContextsByHandlers","get","set","actionContext","transformSync","partialServices","originalCode","syncResolve","options","pluginOptions","services","features","filename","cache","has","resolveImports","call","actionHandlers","entrypoint","createRoot","ignored","code","sourceMap","inputSourceMap","workflowAction","createAction","undefined","result","log","name","err","console","error","transform","asyncResolve"],"sources":["../src/transform.ts"],"sourcesContent":["/**\n * This file exposes sync and async transform functions that:\n * - parse the passed code to AST\n * - builds a dependency graph for the file\n * - shakes each dependency and removes unused code\n * - runs generated code in a sandbox\n * - collects artifacts\n * - returns transformed code (without WYW template literals), generated CSS, source maps and babel metadata from transform step.\n */\n\nimport { isFeatureEnabled } from '@wyw-in-js/shared';\n\nimport type { PartialOptions } from './transform/helpers/loadWywOptions';\nimport { loadWywOptions } from './transform/helpers/loadWywOptions';\nimport { TransformCacheCollection } from './cache';\nimport { Entrypoint } from './transform/Entrypoint';\nimport {\n asyncActionRunner,\n syncActionRunner,\n} from './transform/actions/actionRunner';\nimport { baseHandlers } from './transform/generators';\nimport {\n asyncResolveImports,\n syncResolveImports,\n} from './transform/generators/resolveImports';\nimport { withDefaultServices } from './transform/helpers/withDefaultServices';\nimport type {\n Handler,\n Handlers,\n IResolveImportsAction,\n Services,\n} from './transform/types';\nimport type { Result } from './types';\n\ntype PartialServices = Partial<Omit<Services, 'options'>> & {\n options: Omit<Services['options'], 'pluginOptions'> & {\n pluginOptions?: PartialOptions;\n };\n};\n\ntype AllHandlers<TMode extends 'async' | 'sync'> = Handlers<TMode>;\n\nconst memoizedSyncResolve = new WeakMap<\n (what: string, importer: string, stack: string[]) => string | null,\n Handler<'sync', IResolveImportsAction>\n>();\n\nconst memoizedAsyncResolve = new WeakMap<\n (what: string, importer: string, stack: string[]) => Promise<string | null>,\n Handler<'async' | 'sync', IResolveImportsAction>\n>();\n\nconst EMPTY_CUSTOM_HANDLERS = {};\nconst memoizedActionContexts = new WeakMap<object, WeakMap<object, object>>();\n\nconst getActionContext = (\n resolveImportsHandler: object,\n customHandlers: object\n): object => {\n const customHandlersKey =\n Object.keys(customHandlers).length === 0\n ? EMPTY_CUSTOM_HANDLERS\n : customHandlers;\n let actionContextsByHandlers = memoizedActionContexts.get(\n resolveImportsHandler\n );\n if (!actionContextsByHandlers) {\n actionContextsByHandlers = new WeakMap();\n memoizedActionContexts.set(resolveImportsHandler, actionContextsByHandlers);\n }\n\n let actionContext = actionContextsByHandlers.get(customHandlersKey);\n if (!actionContext) {\n actionContext = {};\n actionContextsByHandlers.set(customHandlersKey, actionContext);\n }\n\n return actionContext;\n};\n\nexport function transformSync(\n partialServices: PartialServices,\n originalCode: string,\n syncResolve: (what: string, importer: string, stack: string[]) => string,\n customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Result {\n const { options } = partialServices;\n const pluginOptions = loadWywOptions(options.pluginOptions);\n const services = withDefaultServices({\n ...partialServices,\n options: {\n ...options,\n pluginOptions,\n },\n });\n\n if (\n !isFeatureEnabled(pluginOptions.features, 'globalCache', options.filename)\n ) {\n // If global cache is disabled, we need to create a new cache for each file\n services.cache = new TransformCacheCollection();\n }\n\n if (!memoizedSyncResolve.has(syncResolve)) {\n memoizedSyncResolve.set(\n syncResolve,\n function resolveImports(this: IResolveImportsAction) {\n return syncResolveImports.call(this, syncResolve);\n }\n );\n }\n\n const resolveImportsHandler = memoizedSyncResolve.get(syncResolve)!;\n const actionHandlers = {\n ...baseHandlers,\n ...customHandlers,\n resolveImports: resolveImportsHandler,\n };\n const actionContext = getActionContext(resolveImportsHandler, customHandlers);\n\n const entrypoint = Entrypoint.createRoot(\n services,\n options.filename,\n ['__wywPreval'],\n originalCode\n );\n\n if (entrypoint.ignored) {\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n const workflowAction = entrypoint.createAction(\n 'workflow',\n undefined,\n null,\n actionContext\n );\n\n try {\n const result = syncActionRunner(workflowAction, actionHandlers);\n\n entrypoint.log('%s is ready', entrypoint.name);\n\n return result;\n } catch (err) {\n entrypoint.log('Unhandled error %O', err);\n\n if (\n isFeatureEnabled(pluginOptions.features, 'softErrors', options.filename)\n ) {\n // eslint-disable-next-line no-console\n console.error(`Error during transform of ${entrypoint.name}:`, err);\n\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n throw err;\n }\n}\n\nexport async function transform(\n partialServices: PartialServices,\n originalCode: string,\n asyncResolve: (\n what: string,\n importer: string,\n stack: string[]\n ) => Promise<string | null>,\n customHandlers: Partial<AllHandlers<'sync'>> = {}\n): Promise<Result> {\n const { options } = partialServices;\n const pluginOptions = loadWywOptions(options.pluginOptions);\n const services = withDefaultServices({\n ...partialServices,\n options: {\n ...options,\n pluginOptions,\n },\n });\n\n if (\n !isFeatureEnabled(pluginOptions.features, 'globalCache', options.filename)\n ) {\n // If global cache is disabled, we need to create a new cache for each file\n services.cache = new TransformCacheCollection();\n }\n\n /*\n * This method can be run simultaneously for multiple files.\n * A shared cache is accessible for all runs, but each run has its own queue\n * to maintain the correct processing order. The cache stores the outcome\n * of tree-shaking, and if the result is already stored in the cache\n * but the \"only\" option has changed, the file will be re-processed using\n * the combined \"only\" option.\n */\n if (!memoizedAsyncResolve.has(asyncResolve)) {\n const resolveImports = function resolveImports(\n this: IResolveImportsAction\n ) {\n return asyncResolveImports.call(this, asyncResolve);\n };\n\n memoizedAsyncResolve.set(asyncResolve, resolveImports);\n }\n\n const resolveImportsHandler = memoizedAsyncResolve.get(asyncResolve)!;\n const actionHandlers = {\n ...baseHandlers,\n ...customHandlers,\n resolveImports: resolveImportsHandler,\n };\n const actionContext = getActionContext(resolveImportsHandler, customHandlers);\n\n const entrypoint = Entrypoint.createRoot(\n services,\n options.filename,\n ['__wywPreval'],\n originalCode\n );\n\n if (entrypoint.ignored) {\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n const workflowAction = entrypoint.createAction(\n 'workflow',\n undefined,\n null,\n actionContext\n );\n\n try {\n const result = await asyncActionRunner(workflowAction, actionHandlers);\n\n entrypoint.log('%s is ready', entrypoint.name);\n\n return result;\n } catch (err) {\n entrypoint.log('Unhandled error %O', err);\n\n if (\n isFeatureEnabled(pluginOptions.features, 'softErrors', options.filename)\n ) {\n // eslint-disable-next-line no-console\n console.error(`Error during transform of ${entrypoint.name}:`, err);\n\n return {\n code: originalCode,\n sourceMap: options.inputSourceMap,\n };\n }\n\n throw err;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -15,6 +15,15 @@ import { mutate, referenceAll } from './scopeHelpers';
15
15
  import { valueToLiteral } from './valueToLiteral';
16
16
  function staticEval(ex, evaluate = false) {
17
17
  if (!evaluate) return undefined;
18
+ if (ex.isIdentifier()) {
19
+ const binding = ex.scope.getBinding(ex.node.name);
20
+
21
+ // Babel may "evaluate" a destructured binding to its source container
22
+ // object/array instead of the bound value, which changes template semantics.
23
+ if (binding?.path.isVariableDeclarator() && !binding.path.get('id').isIdentifier()) {
24
+ return undefined;
25
+ }
26
+ }
18
27
  const result = ex.evaluate();
19
28
  if (result.confident && !hasEvalMeta(result.value)) {
20
29
  return [result.value];
@@ -1 +1 @@
1
- {"version":3,"file":"collectTemplateDependencies.js","names":["statement","cloneNode","hasEvalMeta","ValueType","logger","createId","findIdentifiers","getSource","mutate","referenceAll","valueToLiteral","staticEval","ex","evaluate","undefined","result","confident","value","expressionDeclarationTpl","preserveComments","unsupported","reason","buildCodeFrameError","isIdentifier","getUidInRootScope","path","name","node","rootScope","scope","getProgramParent","hasBinding","generateUid","hoistVariableDeclarator","parent","referencedIdentifiers","forEach","identifier","hoistIdentifier","bindingIdentifiers","newName","rename","statementInRoot","findParent","p","parentPath","isProgram","declaration","type","kind","declarations","inserted","insertBefore","registerDeclaration","idPath","isReferenced","binding","getBinding","includes","bindingPath","isVariableDeclarator","extractExpression","imports","isLiteral","CONST","loc","isFunction","isFunctionExpression","isArrowFunctionExpression","expUid","evaluated","id","evaluatedId","replaceWith","FUNCTION","LAZY","expId","expression","importedFrom","findImportSourceOfIdentifier","exBindingIdentifier","exImport","find","i","local","push","source","traverse","Identifier","callee","arguments","debug","extend","collectTemplateDependencies","quasi","get","quasis","expressions","length","expressionValues","map","bind","isExpression","extracted"],"sources":["../../src/utils/collectTemplateDependencies.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-use-before-define: [\"error\", { \"functions\": false }] */\n\n/**\n * This file is a visitor that checks TaggedTemplateExpressions and look for WYW template literals.\n * For each template it makes a list of dependencies, try to evaluate expressions, and if it is not possible, mark them as lazy dependencies.\n */\n\nimport { statement } from '@babel/template';\nimport type { NodePath } from '@babel/traverse';\nimport type {\n Expression,\n Identifier,\n JSXIdentifier,\n Statement,\n TaggedTemplateExpression,\n TemplateElement,\n TSType,\n VariableDeclaration,\n VariableDeclarator,\n} from '@babel/types';\nimport { cloneNode } from '@babel/types';\n\nimport type {\n ConstValue,\n ExpressionValue,\n FunctionValue,\n LazyValue,\n} from '@wyw-in-js/shared';\nimport { hasEvalMeta, ValueType, logger } from '@wyw-in-js/shared';\n\nimport type { IImport } from './collectExportsAndImports';\nimport { createId } from './createId';\nimport { findIdentifiers } from './findIdentifiers';\nimport { getSource } from './getSource';\nimport { mutate, referenceAll } from './scopeHelpers';\nimport { valueToLiteral } from './valueToLiteral';\n\nfunction staticEval(\n ex: NodePath<Expression>,\n evaluate = false\n): [unknown] | undefined {\n if (!evaluate) return undefined;\n\n const result = ex.evaluate();\n if (result.confident && !hasEvalMeta(result.value)) {\n return [result.value];\n }\n\n return undefined;\n}\n\nconst expressionDeclarationTpl = statement(\n 'const %%expId%% = () => %%expression%%',\n {\n preserveComments: true,\n }\n);\n\nconst unsupported = (ex: NodePath, reason?: string): Error =>\n ex.buildCodeFrameError(\n `This ${\n ex.isIdentifier() ? 'identifier' : 'expression'\n } cannot be used in the template${reason ? `, because it ${reason}` : ''}.`\n );\n\nfunction getUidInRootScope(path: NodePath<Identifier | JSXIdentifier>): string {\n const { name } = path.node;\n const rootScope = path.scope.getProgramParent();\n if (rootScope.hasBinding(name)) {\n return rootScope.generateUid(name);\n }\n\n return name;\n}\n\nfunction hoistVariableDeclarator(ex: NodePath<VariableDeclarator>) {\n if (!ex.scope.parent) {\n // It is already in the root scope\n return;\n }\n\n const referencedIdentifiers = findIdentifiers([ex], 'reference');\n referencedIdentifiers.forEach((identifier) => {\n if (identifier.isIdentifier()) {\n hoistIdentifier(identifier);\n }\n });\n\n const bindingIdentifiers = findIdentifiers([ex], 'declaration');\n\n bindingIdentifiers.forEach((path) => {\n const newName = getUidInRootScope(path);\n if (newName !== path.node.name) {\n path.scope.rename(path.node.name, newName);\n }\n });\n\n const rootScope = ex.scope.getProgramParent();\n\n const statementInRoot = ex.findParent(\n (p) => p.parentPath?.isProgram() === true\n ) as NodePath<Statement>;\n\n const declaration: VariableDeclaration = {\n type: 'VariableDeclaration',\n kind: 'let',\n declarations: [cloneNode(ex.node)],\n };\n\n const [inserted] = statementInRoot.insertBefore(declaration);\n referenceAll(inserted);\n rootScope.registerDeclaration(inserted);\n}\n\nfunction hoistIdentifier(idPath: NodePath<Identifier>): void {\n if (!idPath.isReferenced()) {\n throw unsupported(idPath);\n }\n\n const binding = idPath.scope.getBinding(idPath.node.name);\n if (!binding) {\n // It's something strange\n throw unsupported(idPath, 'is undefined');\n }\n\n if (binding.kind === 'module') {\n // Modules are global by default\n return;\n }\n\n if (!['var', 'let', 'const', 'hoisted'].includes(binding.kind)) {\n // This is not a variable, we can't hoist it\n throw unsupported(binding.path, 'is a function parameter');\n }\n\n const { scope, path: bindingPath } = binding;\n // parent here can be null or undefined in different versions of babel\n if (!scope.parent) {\n // The variable is already in the root scope\n return;\n }\n\n if (bindingPath.isVariableDeclarator()) {\n hoistVariableDeclarator(bindingPath);\n\n return;\n }\n\n throw unsupported(idPath);\n}\n\n/**\n * Only an expression that can be evaluated in the root scope can be\n * used in a WYW template. This function tries to hoist the expression.\n * @param ex The expression to hoist.\n * @param evaluate If true, we try to statically evaluate the expression.\n * @param imports All the imports of the file.\n */\nexport function extractExpression(\n ex: NodePath<Expression>,\n evaluate = false,\n imports: IImport[] = []\n): Omit<ExpressionValue, 'buildCodeFrameError' | 'source'> {\n if (\n ex.isLiteral() &&\n ('value' in ex.node || ex.node.type === 'NullLiteral')\n ) {\n return {\n ex: ex.node,\n kind: ValueType.CONST,\n value: ex.node.type === 'NullLiteral' ? null : ex.node.value,\n } as Omit<ConstValue, 'buildCodeFrameError' | 'source'>;\n }\n\n const { loc } = ex.node;\n\n const rootScope = ex.scope.getProgramParent();\n const statementInRoot = ex.findParent(\n (p) => p.parentPath?.isProgram() === true\n ) as NodePath<Statement>;\n\n const isFunction =\n ex.isFunctionExpression() || ex.isArrowFunctionExpression();\n\n // Generate next _expN name\n const expUid = rootScope.generateUid('exp');\n\n const evaluated = staticEval(ex, evaluate);\n\n if (!evaluated) {\n // If expression is not statically evaluable,\n // we need to hoist all its referenced identifiers\n\n // Collect all referenced identifiers\n findIdentifiers([ex], 'reference').forEach((id) => {\n if (!id.isIdentifier()) return;\n\n // Try to evaluate and inline them…\n const evaluatedId = staticEval(id, evaluate);\n if (evaluatedId) {\n mutate(id, (p) => {\n p.replaceWith(valueToLiteral(evaluatedId[0], ex));\n });\n } else {\n // … or hoist them to the root scope\n hoistIdentifier(id);\n }\n });\n }\n\n const kind = isFunction ? ValueType.FUNCTION : ValueType.LAZY;\n\n // Declare _expN const with the lazy expression\n const declaration = expressionDeclarationTpl({\n expId: createId(expUid),\n expression: evaluated\n ? valueToLiteral(evaluated[0], ex)\n : cloneNode(ex.node),\n }) as VariableDeclaration;\n\n // Insert the declaration as close as possible to the original expression\n const [inserted] = statementInRoot.insertBefore(declaration);\n referenceAll(inserted);\n rootScope.registerDeclaration(inserted);\n\n const importedFrom: string[] = [];\n function findImportSourceOfIdentifier(idPath: NodePath<Identifier>) {\n const exBindingIdentifier = idPath.scope.getBinding(idPath.node.name)\n ?.identifier;\n const exImport =\n imports.find((i) => i.local.node === exBindingIdentifier) ?? null;\n if (exImport) {\n importedFrom.push(exImport.source);\n }\n }\n\n if (ex.isIdentifier()) {\n findImportSourceOfIdentifier(ex);\n } else {\n ex.traverse({\n Identifier: findImportSourceOfIdentifier,\n });\n }\n\n // Replace the expression with the _expN() call\n mutate(ex, (p) => {\n p.replaceWith({\n type: 'CallExpression',\n callee: createId(expUid),\n arguments: [],\n });\n });\n\n // eslint-disable-next-line no-param-reassign\n ex.node.loc = loc;\n\n // noinspection UnnecessaryLocalVariableJS\n const result: Omit<\n LazyValue | FunctionValue,\n 'buildCodeFrameError' | 'source'\n > = {\n kind,\n ex: createId(expUid, loc),\n importedFrom,\n };\n\n return result;\n}\n\nconst debug = logger.extend('template-parse:identify-expressions');\n\n/**\n * Collects, hoists, and makes lazy all expressions in the given template\n * If evaluate is true, it will try to evaluate the expressions\n */\nexport function collectTemplateDependencies(\n path: NodePath<TaggedTemplateExpression>,\n evaluate = false\n): [quasis: TemplateElement[], expressionValues: ExpressionValue[]] {\n const quasi = path.get('quasi');\n const quasis = quasi.get('quasis');\n const expressions = quasi.get('expressions');\n\n debug('Found: %s', expressions.length);\n\n const expressionValues: ExpressionValue[] = expressions.map(\n (ex: NodePath<Expression | TSType>): ExpressionValue => {\n const buildCodeFrameError = ex.buildCodeFrameError.bind(ex);\n const source = getSource(ex);\n\n if (!ex.isExpression()) {\n throw buildCodeFrameError(\n `The expression '${source}' is not supported.`\n );\n }\n\n const extracted = extractExpression(ex, evaluate);\n\n return {\n ...extracted,\n source,\n buildCodeFrameError,\n } as ExpressionValue;\n }\n );\n\n return [quasis.map((p) => p.node), expressionValues];\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"collectTemplateDependencies.js","names":["statement","cloneNode","hasEvalMeta","ValueType","logger","createId","findIdentifiers","getSource","mutate","referenceAll","valueToLiteral","staticEval","ex","evaluate","undefined","isIdentifier","binding","scope","getBinding","node","name","path","isVariableDeclarator","get","result","confident","value","expressionDeclarationTpl","preserveComments","unsupported","reason","buildCodeFrameError","getUidInRootScope","rootScope","getProgramParent","hasBinding","generateUid","hoistVariableDeclarator","parent","referencedIdentifiers","forEach","identifier","hoistIdentifier","bindingIdentifiers","newName","rename","statementInRoot","findParent","p","parentPath","isProgram","declaration","type","kind","declarations","inserted","insertBefore","registerDeclaration","idPath","isReferenced","includes","bindingPath","extractExpression","imports","isLiteral","CONST","loc","isFunction","isFunctionExpression","isArrowFunctionExpression","expUid","evaluated","id","evaluatedId","replaceWith","FUNCTION","LAZY","expId","expression","importedFrom","findImportSourceOfIdentifier","exBindingIdentifier","exImport","find","i","local","push","source","traverse","Identifier","callee","arguments","debug","extend","collectTemplateDependencies","quasi","quasis","expressions","length","expressionValues","map","bind","isExpression","extracted"],"sources":["../../src/utils/collectTemplateDependencies.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-use-before-define: [\"error\", { \"functions\": false }] */\n\n/**\n * This file is a visitor that checks TaggedTemplateExpressions and look for WYW template literals.\n * For each template it makes a list of dependencies, try to evaluate expressions, and if it is not possible, mark them as lazy dependencies.\n */\n\nimport { statement } from '@babel/template';\nimport type { NodePath } from '@babel/traverse';\nimport type {\n Expression,\n Identifier,\n JSXIdentifier,\n Statement,\n TaggedTemplateExpression,\n TemplateElement,\n TSType,\n VariableDeclaration,\n VariableDeclarator,\n} from '@babel/types';\nimport { cloneNode } from '@babel/types';\n\nimport type {\n ConstValue,\n ExpressionValue,\n FunctionValue,\n LazyValue,\n} from '@wyw-in-js/shared';\nimport { hasEvalMeta, ValueType, logger } from '@wyw-in-js/shared';\n\nimport type { IImport } from './collectExportsAndImports';\nimport { createId } from './createId';\nimport { findIdentifiers } from './findIdentifiers';\nimport { getSource } from './getSource';\nimport { mutate, referenceAll } from './scopeHelpers';\nimport { valueToLiteral } from './valueToLiteral';\n\nfunction staticEval(\n ex: NodePath<Expression>,\n evaluate = false\n): [unknown] | undefined {\n if (!evaluate) return undefined;\n\n if (ex.isIdentifier()) {\n const binding = ex.scope.getBinding(ex.node.name);\n\n // Babel may \"evaluate\" a destructured binding to its source container\n // object/array instead of the bound value, which changes template semantics.\n if (\n binding?.path.isVariableDeclarator() &&\n !binding.path.get('id').isIdentifier()\n ) {\n return undefined;\n }\n }\n\n const result = ex.evaluate();\n if (result.confident && !hasEvalMeta(result.value)) {\n return [result.value];\n }\n\n return undefined;\n}\n\nconst expressionDeclarationTpl = statement(\n 'const %%expId%% = () => %%expression%%',\n {\n preserveComments: true,\n }\n);\n\nconst unsupported = (ex: NodePath, reason?: string): Error =>\n ex.buildCodeFrameError(\n `This ${\n ex.isIdentifier() ? 'identifier' : 'expression'\n } cannot be used in the template${reason ? `, because it ${reason}` : ''}.`\n );\n\nfunction getUidInRootScope(path: NodePath<Identifier | JSXIdentifier>): string {\n const { name } = path.node;\n const rootScope = path.scope.getProgramParent();\n if (rootScope.hasBinding(name)) {\n return rootScope.generateUid(name);\n }\n\n return name;\n}\n\nfunction hoistVariableDeclarator(ex: NodePath<VariableDeclarator>) {\n if (!ex.scope.parent) {\n // It is already in the root scope\n return;\n }\n\n const referencedIdentifiers = findIdentifiers([ex], 'reference');\n referencedIdentifiers.forEach((identifier) => {\n if (identifier.isIdentifier()) {\n hoistIdentifier(identifier);\n }\n });\n\n const bindingIdentifiers = findIdentifiers([ex], 'declaration');\n\n bindingIdentifiers.forEach((path) => {\n const newName = getUidInRootScope(path);\n if (newName !== path.node.name) {\n path.scope.rename(path.node.name, newName);\n }\n });\n\n const rootScope = ex.scope.getProgramParent();\n\n const statementInRoot = ex.findParent(\n (p) => p.parentPath?.isProgram() === true\n ) as NodePath<Statement>;\n\n const declaration: VariableDeclaration = {\n type: 'VariableDeclaration',\n kind: 'let',\n declarations: [cloneNode(ex.node)],\n };\n\n const [inserted] = statementInRoot.insertBefore(declaration);\n referenceAll(inserted);\n rootScope.registerDeclaration(inserted);\n}\n\nfunction hoistIdentifier(idPath: NodePath<Identifier>): void {\n if (!idPath.isReferenced()) {\n throw unsupported(idPath);\n }\n\n const binding = idPath.scope.getBinding(idPath.node.name);\n if (!binding) {\n // It's something strange\n throw unsupported(idPath, 'is undefined');\n }\n\n if (binding.kind === 'module') {\n // Modules are global by default\n return;\n }\n\n if (!['var', 'let', 'const', 'hoisted'].includes(binding.kind)) {\n // This is not a variable, we can't hoist it\n throw unsupported(binding.path, 'is a function parameter');\n }\n\n const { scope, path: bindingPath } = binding;\n // parent here can be null or undefined in different versions of babel\n if (!scope.parent) {\n // The variable is already in the root scope\n return;\n }\n\n if (bindingPath.isVariableDeclarator()) {\n hoistVariableDeclarator(bindingPath);\n\n return;\n }\n\n throw unsupported(idPath);\n}\n\n/**\n * Only an expression that can be evaluated in the root scope can be\n * used in a WYW template. This function tries to hoist the expression.\n * @param ex The expression to hoist.\n * @param evaluate If true, we try to statically evaluate the expression.\n * @param imports All the imports of the file.\n */\nexport function extractExpression(\n ex: NodePath<Expression>,\n evaluate = false,\n imports: IImport[] = []\n): Omit<ExpressionValue, 'buildCodeFrameError' | 'source'> {\n if (\n ex.isLiteral() &&\n ('value' in ex.node || ex.node.type === 'NullLiteral')\n ) {\n return {\n ex: ex.node,\n kind: ValueType.CONST,\n value: ex.node.type === 'NullLiteral' ? null : ex.node.value,\n } as Omit<ConstValue, 'buildCodeFrameError' | 'source'>;\n }\n\n const { loc } = ex.node;\n\n const rootScope = ex.scope.getProgramParent();\n const statementInRoot = ex.findParent(\n (p) => p.parentPath?.isProgram() === true\n ) as NodePath<Statement>;\n\n const isFunction =\n ex.isFunctionExpression() || ex.isArrowFunctionExpression();\n\n // Generate next _expN name\n const expUid = rootScope.generateUid('exp');\n\n const evaluated = staticEval(ex, evaluate);\n\n if (!evaluated) {\n // If expression is not statically evaluable,\n // we need to hoist all its referenced identifiers\n\n // Collect all referenced identifiers\n findIdentifiers([ex], 'reference').forEach((id) => {\n if (!id.isIdentifier()) return;\n\n // Try to evaluate and inline them…\n const evaluatedId = staticEval(id, evaluate);\n if (evaluatedId) {\n mutate(id, (p) => {\n p.replaceWith(valueToLiteral(evaluatedId[0], ex));\n });\n } else {\n // … or hoist them to the root scope\n hoistIdentifier(id);\n }\n });\n }\n\n const kind = isFunction ? ValueType.FUNCTION : ValueType.LAZY;\n\n // Declare _expN const with the lazy expression\n const declaration = expressionDeclarationTpl({\n expId: createId(expUid),\n expression: evaluated\n ? valueToLiteral(evaluated[0], ex)\n : cloneNode(ex.node),\n }) as VariableDeclaration;\n\n // Insert the declaration as close as possible to the original expression\n const [inserted] = statementInRoot.insertBefore(declaration);\n referenceAll(inserted);\n rootScope.registerDeclaration(inserted);\n\n const importedFrom: string[] = [];\n function findImportSourceOfIdentifier(idPath: NodePath<Identifier>) {\n const exBindingIdentifier = idPath.scope.getBinding(idPath.node.name)\n ?.identifier;\n const exImport =\n imports.find((i) => i.local.node === exBindingIdentifier) ?? null;\n if (exImport) {\n importedFrom.push(exImport.source);\n }\n }\n\n if (ex.isIdentifier()) {\n findImportSourceOfIdentifier(ex);\n } else {\n ex.traverse({\n Identifier: findImportSourceOfIdentifier,\n });\n }\n\n // Replace the expression with the _expN() call\n mutate(ex, (p) => {\n p.replaceWith({\n type: 'CallExpression',\n callee: createId(expUid),\n arguments: [],\n });\n });\n\n // eslint-disable-next-line no-param-reassign\n ex.node.loc = loc;\n\n // noinspection UnnecessaryLocalVariableJS\n const result: Omit<\n LazyValue | FunctionValue,\n 'buildCodeFrameError' | 'source'\n > = {\n kind,\n ex: createId(expUid, loc),\n importedFrom,\n };\n\n return result;\n}\n\nconst debug = logger.extend('template-parse:identify-expressions');\n\n/**\n * Collects, hoists, and makes lazy all expressions in the given template\n * If evaluate is true, it will try to evaluate the expressions\n */\nexport function collectTemplateDependencies(\n path: NodePath<TaggedTemplateExpression>,\n evaluate = false\n): [quasis: TemplateElement[], expressionValues: ExpressionValue[]] {\n const quasi = path.get('quasi');\n const quasis = quasi.get('quasis');\n const expressions = quasi.get('expressions');\n\n debug('Found: %s', expressions.length);\n\n const expressionValues: ExpressionValue[] = expressions.map(\n (ex: NodePath<Expression | TSType>): ExpressionValue => {\n const buildCodeFrameError = ex.buildCodeFrameError.bind(ex);\n const source = getSource(ex);\n\n if (!ex.isExpression()) {\n throw buildCodeFrameError(\n `The expression '${source}' is not supported.`\n );\n }\n\n const extracted = extractExpression(ex, evaluate);\n\n return {\n ...extracted,\n source,\n buildCodeFrameError,\n } as ExpressionValue;\n }\n );\n\n return [quasis.map((p) => p.node), expressionValues];\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/cache.js CHANGED
@@ -13,15 +13,28 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
13
13
  function hashContent(content) {
14
14
  return (0, _crypto.createHash)('sha256').update(content).digest('hex');
15
15
  }
16
+ function isMissingFileError(error) {
17
+ if (!error || typeof error !== 'object') {
18
+ return false;
19
+ }
20
+ const {
21
+ code
22
+ } = error;
23
+ return code === 'ENOENT' || code === 'ENOTDIR';
24
+ }
16
25
  const cacheLogger = _shared.logger.extend('cache');
17
- const cacheNames = ['entrypoints', 'exports'];
26
+ const cacheNames = ['barrelManifests', 'entrypoints', 'exports'];
18
27
  const loggers = cacheNames.reduce((acc, key) => ({
19
28
  ...acc,
20
29
  [key]: cacheLogger.extend(key)
21
30
  }), {});
22
31
  class TransformCacheCollection {
32
+ barrelManifestDependencies = new Map();
23
33
  contentHashes = new Map();
34
+ fileMtimes = new Map();
35
+ exportDependencies = new Map();
24
36
  constructor(caches = {}) {
37
+ this.barrelManifests = caches.barrelManifests || new Map();
25
38
  this.entrypoints = caches.entrypoints || new Map();
26
39
  this.exports = caches.exports || new Map();
27
40
  }
@@ -39,8 +52,10 @@ class TransformCacheCollection {
39
52
  if (value === undefined) {
40
53
  cache.delete(key);
41
54
  this.contentHashes.delete(key);
55
+ this.clearCacheDependencies(cacheName, key);
42
56
  return;
43
57
  }
58
+ this.clearCacheDependencies(cacheName, key);
44
59
  cache.set(key, value);
45
60
  if ('initialCode' in value) {
46
61
  const maybeOriginalCode = value.originalCode;
@@ -62,6 +77,15 @@ class TransformCacheCollection {
62
77
  } catch {
63
78
  this.setContentHash(key, source, hashContent(''));
64
79
  }
80
+ return;
81
+ }
82
+ if (cacheName === 'barrelManifests') {
83
+ try {
84
+ const fileContent = _nodeFs.default.readFileSync((0, _parseRequest.stripQueryAndHash)(key), 'utf8');
85
+ this.setContentHash(key, 'fs', hashContent(fileContent));
86
+ } catch {
87
+ this.setContentHash(key, 'fs', hashContent(''));
88
+ }
65
89
  }
66
90
  }
67
91
  clear(cacheName) {
@@ -74,6 +98,7 @@ class TransformCacheCollection {
74
98
  loggers[cacheName]('clear');
75
99
  const cache = this[cacheName];
76
100
  cache.clear();
101
+ this.clearCacheDependencies(cacheName);
77
102
  }
78
103
  delete(cacheName, key) {
79
104
  this.invalidate(cacheName, key);
@@ -97,25 +122,69 @@ class TransformCacheCollection {
97
122
  }
98
123
  loggers[cacheName]('invalidate', key);
99
124
  cache.delete(key);
125
+ this.clearCacheDependencies(cacheName, key);
100
126
  }
101
127
  invalidateForFile(filename) {
102
128
  cacheNames.forEach(cacheName => {
103
129
  this.invalidate(cacheName, filename);
104
130
  });
105
131
  }
106
- invalidateIfChanged(filename, content, previousVisitedFiles, source = 'loaded') {
132
+ invalidateIfChanged(filename, content, previousVisitedFiles, source = 'loaded', changedFiles = new Set()) {
133
+ if (changedFiles.has(filename)) {
134
+ return true;
135
+ }
107
136
  const visitedFiles = new Set(previousVisitedFiles);
108
137
  const fileEntrypoint = this.get('entrypoints', filename);
138
+ let anyDepChanged = false;
109
139
 
110
140
  // We need to check all dependencies of the file
111
141
  // because they might have changed as well.
112
- if (fileEntrypoint && !visitedFiles.has(filename)) {
142
+ if (!visitedFiles.has(filename) && (fileEntrypoint || this.hasCachedDependencies(filename))) {
113
143
  visitedFiles.add(filename);
114
- for (const [, dependency] of fileEntrypoint.dependencies) {
144
+ const invalidateOnDependencyChange = fileEntrypoint === null || fileEntrypoint === void 0 ? void 0 : fileEntrypoint.invalidateOnDependencyChange;
145
+ const dependenciesToCheck = new Map();
146
+ for (const [key, dependency] of (_fileEntrypoint$depen = fileEntrypoint === null || fileEntrypoint === void 0 ? void 0 : fileEntrypoint.dependencies) !== null && _fileEntrypoint$depen !== void 0 ? _fileEntrypoint$depen : []) {
147
+ var _fileEntrypoint$depen;
148
+ dependenciesToCheck.set(key, dependency);
149
+ }
150
+ for (const [key, dependency] of (_fileEntrypoint$inval = fileEntrypoint === null || fileEntrypoint === void 0 ? void 0 : fileEntrypoint.invalidationDependencies) !== null && _fileEntrypoint$inval !== void 0 ? _fileEntrypoint$inval : []) {
151
+ var _fileEntrypoint$inval;
152
+ if (!dependenciesToCheck.has(key)) {
153
+ dependenciesToCheck.set(key, dependency);
154
+ }
155
+ }
156
+ for (const dependencyFilename of this.getCachedDependencies(filename)) {
157
+ if (![...dependenciesToCheck.values()].some(dependency => dependency.resolved === dependencyFilename)) {
158
+ dependenciesToCheck.set(dependencyFilename, {
159
+ resolved: dependencyFilename
160
+ });
161
+ }
162
+ }
163
+ for (const [, dependency] of dependenciesToCheck) {
115
164
  const dependencyFilename = dependency.resolved;
116
165
  if (dependencyFilename) {
117
- const dependencyContent = _nodeFs.default.readFileSync((0, _parseRequest.stripQueryAndHash)(dependencyFilename), 'utf8');
118
- this.invalidateIfChanged(dependencyFilename, dependencyContent, visitedFiles, 'fs');
166
+ let dependencyContent;
167
+ try {
168
+ dependencyContent = _nodeFs.default.readFileSync((0, _parseRequest.stripQueryAndHash)(dependencyFilename), 'utf8');
169
+ } catch (error) {
170
+ if (!isMissingFileError(error)) {
171
+ throw error;
172
+ }
173
+ this.invalidateForFile(dependencyFilename);
174
+ anyDepChanged = true;
175
+ // eslint-disable-next-line no-continue
176
+ continue;
177
+ }
178
+ const dependencyChanged = this.invalidateIfChanged(dependencyFilename, dependencyContent, visitedFiles, 'fs', changedFiles);
179
+ if (dependencyChanged && invalidateOnDependencyChange !== null && invalidateOnDependencyChange !== void 0 && invalidateOnDependencyChange.has(dependencyFilename)) {
180
+ cacheLogger('dependency affecting output has changed, invalidate all for %s', filename);
181
+ this.invalidateForFile(filename);
182
+ changedFiles.add(filename);
183
+ return true;
184
+ }
185
+ if (dependencyChanged) {
186
+ anyDepChanged = true;
187
+ }
119
188
  }
120
189
  }
121
190
  }
@@ -125,32 +194,114 @@ class TransformCacheCollection {
125
194
  if (previousHash === undefined) {
126
195
  const otherSource = source === 'fs' ? 'loaded' : 'fs';
127
196
  const otherHash = existing === null || existing === void 0 ? void 0 : existing[otherSource];
128
- if (otherHash !== undefined && otherHash !== newHash) {
197
+ if (otherHash !== undefined && otherHash !== newHash || anyDepChanged) {
129
198
  cacheLogger('content has changed, invalidate all for %s', filename);
130
199
  this.setContentHash(filename, source, newHash);
131
200
  this.invalidateForFile(filename);
201
+ changedFiles.add(filename);
132
202
  return true;
133
203
  }
134
204
  this.setContentHash(filename, source, newHash);
205
+ if (anyDepChanged) {
206
+ this.invalidateForFile(filename);
207
+ changedFiles.add(filename);
208
+ return true;
209
+ }
135
210
  return false;
136
211
  }
137
- if (previousHash !== newHash) {
212
+ if (previousHash !== newHash || anyDepChanged) {
138
213
  cacheLogger('content has changed, invalidate all for %s', filename);
139
214
  this.setContentHash(filename, source, newHash);
140
215
  this.invalidateForFile(filename);
216
+ changedFiles.add(filename);
141
217
  return true;
142
218
  }
143
219
  return false;
144
220
  }
221
+ setCacheDependencies(cacheName, key, dependencies) {
222
+ const cache = this.getDependencyCache(cacheName);
223
+ const nextDependencies = new Set([...dependencies].filter(dependency => dependency.length > 0));
224
+ if (nextDependencies.size === 0) {
225
+ cache.delete(key);
226
+ return;
227
+ }
228
+ cache.set(key, nextDependencies);
229
+ }
230
+ clearCacheDependencies(cacheName, key) {
231
+ if (cacheName === 'all') {
232
+ this.barrelManifestDependencies.clear();
233
+ this.exportDependencies.clear();
234
+ return;
235
+ }
236
+ if (cacheName === 'barrelManifests') {
237
+ if (key === undefined) {
238
+ this.barrelManifestDependencies.clear();
239
+ } else {
240
+ this.barrelManifestDependencies.delete(key);
241
+ }
242
+ return;
243
+ }
244
+ if (cacheName === 'exports') {
245
+ if (key === undefined) {
246
+ this.exportDependencies.clear();
247
+ } else {
248
+ this.exportDependencies.delete(key);
249
+ }
250
+ }
251
+ }
252
+ getCachedDependencies(filename) {
253
+ var _this$barrelManifestD, _this$exportDependenc;
254
+ return new Set([...((_this$barrelManifestD = this.barrelManifestDependencies.get(filename)) !== null && _this$barrelManifestD !== void 0 ? _this$barrelManifestD : []), ...((_this$exportDependenc = this.exportDependencies.get(filename)) !== null && _this$exportDependenc !== void 0 ? _this$exportDependenc : [])]);
255
+ }
256
+ getDependencyCache(cacheName) {
257
+ return cacheName === 'barrelManifests' ? this.barrelManifestDependencies : this.exportDependencies;
258
+ }
259
+ hasCachedDependencies(filename) {
260
+ return this.getCachedDependencies(filename).size > 0;
261
+ }
262
+
263
+ /**
264
+ * Fast check if a file changed on disk since last seen.
265
+ * Uses mtime as a fast path — only reads the file if mtime differs.
266
+ * Returns true if the file changed (cache was invalidated).
267
+ */
268
+ checkFreshness(filename, strippedFilename) {
269
+ try {
270
+ const currentMtime = _nodeFs.default.statSync(strippedFilename).mtimeMs;
271
+ const cachedMtime = this.fileMtimes.get(filename);
272
+ if (cachedMtime !== undefined && currentMtime === cachedMtime) {
273
+ return false;
274
+ }
275
+ const content = _nodeFs.default.readFileSync(strippedFilename, 'utf-8');
276
+ this.fileMtimes.set(filename, currentMtime);
277
+ if (this.invalidateIfChanged(filename, content, undefined, 'fs')) {
278
+ return true;
279
+ }
280
+ return false;
281
+ } catch (error) {
282
+ if (!isMissingFileError(error)) {
283
+ throw error;
284
+ }
285
+ this.invalidateForFile(filename);
286
+ return true;
287
+ }
288
+ }
145
289
  setContentHash(filename, source, hash) {
146
290
  const current = this.contentHashes.get(filename);
147
291
  if (current) {
148
292
  current[source] = hash;
149
- return;
293
+ } else {
294
+ this.contentHashes.set(filename, {
295
+ [source]: hash
296
+ });
297
+ }
298
+ if (source === 'fs') {
299
+ try {
300
+ this.fileMtimes.set(filename, _nodeFs.default.statSync((0, _parseRequest.stripQueryAndHash)(filename)).mtimeMs);
301
+ } catch {
302
+ // ignore
303
+ }
150
304
  }
151
- this.contentHashes.set(filename, {
152
- [source]: hash
153
- });
154
305
  }
155
306
  }
156
307
  exports.TransformCacheCollection = TransformCacheCollection;
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":["_crypto","require","_nodeFs","_interopRequireDefault","_shared","_getFileIdx","_parseRequest","e","__esModule","default","hashContent","content","createHash","update","digest","cacheLogger","logger","extend","cacheNames","loggers","reduce","acc","key","TransformCacheCollection","contentHashes","Map","constructor","caches","entrypoints","exports","add","cacheName","value","cache","getFileIdx","undefined","has","get","delete","set","maybeOriginalCode","originalCode","isLoaded","initialCode","source","resolvedCode","setContentHash","fileContent","fs","readFileSync","stripQueryAndHash","clear","forEach","name","invalidate","res","invalidateForFile","filename","invalidateIfChanged","previousVisitedFiles","visitedFiles","Set","fileEntrypoint","dependency","dependencies","dependencyFilename","resolved","dependencyContent","existing","previousHash","newHash","otherSource","otherHash","hash","current"],"sources":["../src/cache.ts"],"sourcesContent":["import { createHash } from 'crypto';\nimport fs from 'node:fs';\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { Entrypoint } from './transform/Entrypoint';\nimport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nimport { getFileIdx } from './utils/getFileIdx';\nimport { stripQueryAndHash } from './utils/parseRequest';\n\nfunction hashContent(content: string) {\n return createHash('sha256').update(content).digest('hex');\n}\n\ninterface IBaseCachedEntrypoint {\n dependencies: Map<string, { resolved: string | null }>;\n initialCode?: string;\n}\n\ninterface ICaches<TEntrypoint extends IBaseCachedEntrypoint> {\n entrypoints: Map<string, TEntrypoint>;\n exports: Map<string, string[]>;\n}\n\ntype MapValue<T> = T extends Map<string, infer V> ? V : never;\n\nconst cacheLogger = logger.extend('cache');\n\nconst cacheNames = ['entrypoints', 'exports'] as const;\ntype CacheNames = (typeof cacheNames)[number];\n\nconst loggers = cacheNames.reduce(\n (acc, key) => ({\n ...acc,\n [key]: cacheLogger.extend(key),\n }),\n {} as Record<CacheNames, typeof logger>\n);\n\nexport class TransformCacheCollection<\n TEntrypoint extends IBaseCachedEntrypoint = Entrypoint | IEvaluatedEntrypoint,\n> {\n public readonly entrypoints: Map<string, TEntrypoint>;\n\n public readonly exports: Map<string, string[]>;\n\n private contentHashes = new Map<string, { fs?: string; loaded?: string }>();\n\n constructor(caches: Partial<ICaches<TEntrypoint>> = {}) {\n this.entrypoints = caches.entrypoints || new Map();\n this.exports = caches.exports || new Map();\n }\n\n public add<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string, value: TValue): void {\n const cache = this[cacheName] as Map<string, TValue>;\n loggers[cacheName]('%s:add %s %f', getFileIdx(key), key, () => {\n if (value === undefined) {\n return cache.has(key) ? 'removed' : 'noop';\n }\n\n if (!cache.has(key)) {\n return 'added';\n }\n\n return cache.get(key) === value ? 'unchanged' : 'updated';\n });\n\n if (value === undefined) {\n cache.delete(key);\n this.contentHashes.delete(key);\n return;\n }\n\n cache.set(key, value);\n\n if ('initialCode' in value) {\n const maybeOriginalCode = (value as unknown as { originalCode?: unknown })\n .originalCode;\n const isLoaded = typeof value.initialCode === 'string';\n const source = isLoaded ? 'loaded' : 'fs';\n\n let resolvedCode: string | undefined;\n if (isLoaded) {\n resolvedCode = value.initialCode;\n } else if (typeof maybeOriginalCode === 'string') {\n resolvedCode = maybeOriginalCode;\n }\n\n if (resolvedCode !== undefined) {\n this.setContentHash(key, source, hashContent(resolvedCode));\n return;\n }\n\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, source, hashContent(fileContent));\n } catch {\n this.setContentHash(key, source, hashContent(''));\n }\n }\n }\n\n public clear(cacheName: CacheNames | 'all'): void {\n if (cacheName === 'all') {\n cacheNames.forEach((name) => {\n this.clear(name);\n });\n\n return;\n }\n\n loggers[cacheName]('clear');\n const cache = this[cacheName] as Map<string, unknown>;\n\n cache.clear();\n }\n\n public delete(cacheName: CacheNames, key: string): void {\n this.invalidate(cacheName, key);\n }\n\n public get<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string): TValue | undefined {\n const cache = this[cacheName] as Map<string, TValue>;\n\n const res = cache.get(key);\n loggers[cacheName]('get', key, res === undefined ? 'miss' : 'hit');\n return res;\n }\n\n public has(cacheName: CacheNames, key: string): boolean {\n const cache = this[cacheName] as Map<string, unknown>;\n\n const res = cache.has(key);\n loggers[cacheName]('has', key, res);\n return res;\n }\n\n public invalidate(cacheName: CacheNames, key: string): void {\n const cache = this[cacheName] as Map<string, unknown>;\n if (!cache.has(key)) {\n return;\n }\n\n loggers[cacheName]('invalidate', key);\n\n cache.delete(key);\n }\n\n public invalidateForFile(filename: string) {\n cacheNames.forEach((cacheName) => {\n this.invalidate(cacheName, filename);\n });\n }\n\n public invalidateIfChanged(\n filename: string,\n content: string,\n previousVisitedFiles?: Set<string>,\n source: 'fs' | 'loaded' = 'loaded'\n ) {\n const visitedFiles = new Set(previousVisitedFiles);\n const fileEntrypoint = this.get('entrypoints', filename);\n\n // We need to check all dependencies of the file\n // because they might have changed as well.\n if (fileEntrypoint && !visitedFiles.has(filename)) {\n visitedFiles.add(filename);\n\n for (const [, dependency] of fileEntrypoint.dependencies) {\n const dependencyFilename = dependency.resolved;\n\n if (dependencyFilename) {\n const dependencyContent = fs.readFileSync(\n stripQueryAndHash(dependencyFilename),\n 'utf8'\n );\n this.invalidateIfChanged(\n dependencyFilename,\n dependencyContent,\n visitedFiles,\n 'fs'\n );\n }\n }\n }\n\n const existing = this.contentHashes.get(filename);\n const previousHash = existing?.[source];\n const newHash = hashContent(content);\n\n if (previousHash === undefined) {\n const otherSource = source === 'fs' ? 'loaded' : 'fs';\n const otherHash = existing?.[otherSource];\n\n if (otherHash !== undefined && otherHash !== newHash) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n\n return true;\n }\n\n this.setContentHash(filename, source, newHash);\n return false;\n }\n\n if (previousHash !== newHash) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n\n return true;\n }\n\n return false;\n }\n\n private setContentHash(\n filename: string,\n source: 'fs' | 'loaded',\n hash: string\n ) {\n const current = this.contentHashes.get(filename);\n if (current) {\n current[source] = hash;\n return;\n }\n\n this.contentHashes.set(filename, { [source]: hash });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"cache.js","names":["_crypto","require","_nodeFs","_interopRequireDefault","_shared","_getFileIdx","_parseRequest","e","__esModule","default","hashContent","content","createHash","update","digest","isMissingFileError","error","code","cacheLogger","logger","extend","cacheNames","loggers","reduce","acc","key","TransformCacheCollection","barrelManifestDependencies","Map","contentHashes","fileMtimes","exportDependencies","constructor","caches","barrelManifests","entrypoints","exports","add","cacheName","value","cache","getFileIdx","undefined","has","get","delete","clearCacheDependencies","set","maybeOriginalCode","originalCode","isLoaded","initialCode","source","resolvedCode","setContentHash","fileContent","fs","readFileSync","stripQueryAndHash","clear","forEach","name","invalidate","res","invalidateForFile","filename","invalidateIfChanged","previousVisitedFiles","changedFiles","Set","visitedFiles","fileEntrypoint","anyDepChanged","hasCachedDependencies","invalidateOnDependencyChange","dependenciesToCheck","dependency","_fileEntrypoint$depen","dependencies","_fileEntrypoint$inval","invalidationDependencies","dependencyFilename","getCachedDependencies","values","some","resolved","dependencyContent","dependencyChanged","existing","previousHash","newHash","otherSource","otherHash","setCacheDependencies","getDependencyCache","nextDependencies","filter","length","size","_this$barrelManifestD","_this$exportDependenc","checkFreshness","strippedFilename","currentMtime","statSync","mtimeMs","cachedMtime","hash","current"],"sources":["../src/cache.ts"],"sourcesContent":["import { createHash } from 'crypto';\nimport fs from 'node:fs';\nimport { logger } from '@wyw-in-js/shared';\n\nimport type { BarrelManifestCacheEntry } from './transform/barrelManifest';\nimport type { Entrypoint } from './transform/Entrypoint';\nimport type { IEvaluatedEntrypoint } from './transform/EvaluatedEntrypoint';\nimport { getFileIdx } from './utils/getFileIdx';\nimport { stripQueryAndHash } from './utils/parseRequest';\n\nfunction hashContent(content: string) {\n return createHash('sha256').update(content).digest('hex');\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { code } = error as NodeJS.ErrnoException;\n return code === 'ENOENT' || code === 'ENOTDIR';\n}\n\ninterface IBaseCachedEntrypoint {\n dependencies: Map<string, { resolved: string | null }>;\n initialCode?: string;\n invalidateOnDependencyChange?: Set<string>;\n invalidationDependencies?: Map<string, { resolved: string | null }>;\n}\n\ninterface ICaches<TEntrypoint extends IBaseCachedEntrypoint> {\n barrelManifests: Map<string, BarrelManifestCacheEntry>;\n entrypoints: Map<string, TEntrypoint>;\n exports: Map<string, string[]>;\n}\n\ntype MapValue<T> = T extends Map<string, infer V> ? V : never;\n\nconst cacheLogger = logger.extend('cache');\n\nconst cacheNames = ['barrelManifests', 'entrypoints', 'exports'] as const;\ntype CacheNames = (typeof cacheNames)[number];\n\nconst loggers = cacheNames.reduce(\n (acc, key) => ({\n ...acc,\n [key]: cacheLogger.extend(key),\n }),\n {} as Record<CacheNames, typeof logger>\n);\n\nexport class TransformCacheCollection<\n TEntrypoint extends IBaseCachedEntrypoint = Entrypoint | IEvaluatedEntrypoint,\n> {\n public readonly barrelManifests: Map<string, BarrelManifestCacheEntry>;\n\n public readonly entrypoints: Map<string, TEntrypoint>;\n\n public readonly exports: Map<string, string[]>;\n\n private readonly barrelManifestDependencies = new Map<string, Set<string>>();\n\n private contentHashes = new Map<string, { fs?: string; loaded?: string }>();\n\n private fileMtimes = new Map<string, number>();\n\n private readonly exportDependencies = new Map<string, Set<string>>();\n\n constructor(caches: Partial<ICaches<TEntrypoint>> = {}) {\n this.barrelManifests = caches.barrelManifests || new Map();\n this.entrypoints = caches.entrypoints || new Map();\n this.exports = caches.exports || new Map();\n }\n\n public add<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string, value: TValue): void {\n const cache = this[cacheName] as Map<string, TValue>;\n loggers[cacheName]('%s:add %s %f', getFileIdx(key), key, () => {\n if (value === undefined) {\n return cache.has(key) ? 'removed' : 'noop';\n }\n\n if (!cache.has(key)) {\n return 'added';\n }\n\n return cache.get(key) === value ? 'unchanged' : 'updated';\n });\n\n if (value === undefined) {\n cache.delete(key);\n this.contentHashes.delete(key);\n this.clearCacheDependencies(cacheName, key);\n return;\n }\n\n this.clearCacheDependencies(cacheName, key);\n cache.set(key, value);\n\n if ('initialCode' in value) {\n const maybeOriginalCode = (value as unknown as { originalCode?: unknown })\n .originalCode;\n const isLoaded = typeof value.initialCode === 'string';\n const source = isLoaded ? 'loaded' : 'fs';\n\n let resolvedCode: string | undefined;\n if (isLoaded) {\n resolvedCode = value.initialCode;\n } else if (typeof maybeOriginalCode === 'string') {\n resolvedCode = maybeOriginalCode;\n }\n\n if (resolvedCode !== undefined) {\n this.setContentHash(key, source, hashContent(resolvedCode));\n return;\n }\n\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, source, hashContent(fileContent));\n } catch {\n this.setContentHash(key, source, hashContent(''));\n }\n\n return;\n }\n\n if (cacheName === 'barrelManifests') {\n try {\n const fileContent = fs.readFileSync(stripQueryAndHash(key), 'utf8');\n this.setContentHash(key, 'fs', hashContent(fileContent));\n } catch {\n this.setContentHash(key, 'fs', hashContent(''));\n }\n }\n }\n\n public clear(cacheName: CacheNames | 'all'): void {\n if (cacheName === 'all') {\n cacheNames.forEach((name) => {\n this.clear(name);\n });\n\n return;\n }\n\n loggers[cacheName]('clear');\n const cache = this[cacheName] as Map<string, unknown>;\n\n cache.clear();\n this.clearCacheDependencies(cacheName);\n }\n\n public delete(cacheName: CacheNames, key: string): void {\n this.invalidate(cacheName, key);\n }\n\n public get<\n TCache extends CacheNames,\n TValue extends MapValue<ICaches<TEntrypoint>[TCache]>,\n >(cacheName: TCache, key: string): TValue | undefined {\n const cache = this[cacheName] as Map<string, TValue>;\n\n const res = cache.get(key);\n loggers[cacheName]('get', key, res === undefined ? 'miss' : 'hit');\n return res;\n }\n\n public has(cacheName: CacheNames, key: string): boolean {\n const cache = this[cacheName] as Map<string, unknown>;\n\n const res = cache.has(key);\n loggers[cacheName]('has', key, res);\n return res;\n }\n\n public invalidate(cacheName: CacheNames, key: string): void {\n const cache = this[cacheName] as Map<string, unknown>;\n if (!cache.has(key)) {\n return;\n }\n\n loggers[cacheName]('invalidate', key);\n\n cache.delete(key);\n this.clearCacheDependencies(cacheName, key);\n }\n\n public invalidateForFile(filename: string) {\n cacheNames.forEach((cacheName) => {\n this.invalidate(cacheName, filename);\n });\n }\n\n public invalidateIfChanged(\n filename: string,\n content: string,\n previousVisitedFiles?: Set<string>,\n source: 'fs' | 'loaded' = 'loaded',\n changedFiles = new Set<string>()\n ) {\n if (changedFiles.has(filename)) {\n return true;\n }\n\n const visitedFiles = new Set(previousVisitedFiles);\n const fileEntrypoint = this.get('entrypoints', filename);\n let anyDepChanged = false;\n\n // We need to check all dependencies of the file\n // because they might have changed as well.\n if (\n !visitedFiles.has(filename) &&\n (fileEntrypoint || this.hasCachedDependencies(filename))\n ) {\n visitedFiles.add(filename);\n const invalidateOnDependencyChange =\n fileEntrypoint?.invalidateOnDependencyChange;\n\n const dependenciesToCheck = new Map<\n string,\n { resolved: string | null }\n >();\n\n for (const [key, dependency] of fileEntrypoint?.dependencies ?? []) {\n dependenciesToCheck.set(key, dependency);\n }\n\n for (const [\n key,\n dependency,\n ] of fileEntrypoint?.invalidationDependencies ?? []) {\n if (!dependenciesToCheck.has(key)) {\n dependenciesToCheck.set(key, dependency);\n }\n }\n\n for (const dependencyFilename of this.getCachedDependencies(filename)) {\n if (\n ![...dependenciesToCheck.values()].some(\n (dependency) => dependency.resolved === dependencyFilename\n )\n ) {\n dependenciesToCheck.set(dependencyFilename, {\n resolved: dependencyFilename,\n });\n }\n }\n\n for (const [, dependency] of dependenciesToCheck) {\n const dependencyFilename = dependency.resolved;\n\n if (dependencyFilename) {\n let dependencyContent: string;\n try {\n dependencyContent = fs.readFileSync(\n stripQueryAndHash(dependencyFilename),\n 'utf8'\n );\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(dependencyFilename);\n anyDepChanged = true;\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const dependencyChanged = this.invalidateIfChanged(\n dependencyFilename,\n dependencyContent,\n visitedFiles,\n 'fs',\n changedFiles\n );\n\n if (\n dependencyChanged &&\n invalidateOnDependencyChange?.has(dependencyFilename)\n ) {\n cacheLogger(\n 'dependency affecting output has changed, invalidate all for %s',\n filename\n );\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n if (dependencyChanged) {\n anyDepChanged = true;\n }\n }\n }\n }\n\n const existing = this.contentHashes.get(filename);\n const previousHash = existing?.[source];\n const newHash = hashContent(content);\n\n if (previousHash === undefined) {\n const otherSource = source === 'fs' ? 'loaded' : 'fs';\n const otherHash = existing?.[otherSource];\n\n if ((otherHash !== undefined && otherHash !== newHash) || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n this.setContentHash(filename, source, newHash);\n if (anyDepChanged) {\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n return true;\n }\n return false;\n }\n\n if (previousHash !== newHash || anyDepChanged) {\n cacheLogger('content has changed, invalidate all for %s', filename);\n this.setContentHash(filename, source, newHash);\n this.invalidateForFile(filename);\n changedFiles.add(filename);\n\n return true;\n }\n\n return false;\n }\n\n public setCacheDependencies(\n cacheName: 'barrelManifests' | 'exports',\n key: string,\n dependencies: Iterable<string>\n ): void {\n const cache = this.getDependencyCache(cacheName);\n const nextDependencies = new Set(\n [...dependencies].filter((dependency) => dependency.length > 0)\n );\n\n if (nextDependencies.size === 0) {\n cache.delete(key);\n return;\n }\n\n cache.set(key, nextDependencies);\n }\n\n private clearCacheDependencies(cacheName: CacheNames | 'all', key?: string) {\n if (cacheName === 'all') {\n this.barrelManifestDependencies.clear();\n this.exportDependencies.clear();\n return;\n }\n\n if (cacheName === 'barrelManifests') {\n if (key === undefined) {\n this.barrelManifestDependencies.clear();\n } else {\n this.barrelManifestDependencies.delete(key);\n }\n return;\n }\n\n if (cacheName === 'exports') {\n if (key === undefined) {\n this.exportDependencies.clear();\n } else {\n this.exportDependencies.delete(key);\n }\n }\n }\n\n private getCachedDependencies(filename: string): Set<string> {\n return new Set([\n ...(this.barrelManifestDependencies.get(filename) ?? []),\n ...(this.exportDependencies.get(filename) ?? []),\n ]);\n }\n\n private getDependencyCache(cacheName: 'barrelManifests' | 'exports') {\n return cacheName === 'barrelManifests'\n ? this.barrelManifestDependencies\n : this.exportDependencies;\n }\n\n private hasCachedDependencies(filename: string): boolean {\n return this.getCachedDependencies(filename).size > 0;\n }\n\n /**\n * Fast check if a file changed on disk since last seen.\n * Uses mtime as a fast path — only reads the file if mtime differs.\n * Returns true if the file changed (cache was invalidated).\n */\n public checkFreshness(filename: string, strippedFilename: string): boolean {\n try {\n const currentMtime = fs.statSync(strippedFilename).mtimeMs;\n const cachedMtime = this.fileMtimes.get(filename);\n\n if (cachedMtime !== undefined && currentMtime === cachedMtime) {\n return false;\n }\n\n const content = fs.readFileSync(strippedFilename, 'utf-8');\n this.fileMtimes.set(filename, currentMtime);\n\n if (this.invalidateIfChanged(filename, content, undefined, 'fs')) {\n return true;\n }\n\n return false;\n } catch (error) {\n if (!isMissingFileError(error)) {\n throw error;\n }\n\n this.invalidateForFile(filename);\n return true;\n }\n }\n\n private setContentHash(\n filename: string,\n source: 'fs' | 'loaded',\n hash: string\n ) {\n const current = this.contentHashes.get(filename);\n if (current) {\n current[source] = hash;\n } else {\n this.contentHashes.set(filename, { [source]: hash });\n }\n\n if (source === 'fs') {\n try {\n this.fileMtimes.set(\n filename,\n fs.statSync(stripQueryAndHash(filename)).mtimeMs\n );\n } catch {\n // ignore\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"fileReporter.js","names":["_fs","require","_path","_interopRequireDefault","_EventEmitter","e","__esModule","default","workingDir","process","cwd","replacer","_key","value","path","isAbsolute","relative","Map","Array","from","entries","reduce","obj","k","v","key","printTimings","timings","startedAt","sourceRoot","size","console","log","performance","now","toFixed","forEach","label","byLabel","array","sort","a","b","localeCompare","time","name","startsWith","writeJSONl","stream","data","write","JSON","stringify","createFileReporter","options","dir","emitter","EventEmitter","dummy","onDone","reportFolder","existsSync","mkdirSync","recursive","Error","actionStream","createWriteStream","join","dependenciesStream","entrypointStream","addTiming","has","set","forLabel","get","Math","round","processDependencyEvent","file","only","imports","fileIdx","processSingleEvent","meta","type","startTimes","onEvent","Object","startTime","String","actionId","onAction","args","isOnActionStartArgs","timestamp","idx","entrypointRef","result","id","isAsync","error","finishedAt","onEntrypointEvent","emitterId","event","print","memoryUsage","end","clear","exports"],"sources":["../../src/debug/fileReporter.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport path from 'path';\n\nimport type {\n OnAction,\n OnEvent,\n OnActionFinishArgs,\n OnActionStartArgs,\n OnEntrypointEvent,\n} from '../utils/EventEmitter';\nimport { EventEmitter, isOnActionStartArgs } from '../utils/EventEmitter';\n\ntype Timings = Map<string, Map<string, number>>;\n\nexport interface IFileReporterOptions {\n dir?: string;\n print?: boolean;\n}\n\nexport interface IProcessedEvent {\n file: string;\n fileIdx: string;\n imports: { from: string; what: string[] }[];\n only: string[];\n type: 'dependency';\n}\n\nexport interface IQueueActionEvent {\n action: string;\n args?: string[];\n datetime: Date;\n file: string;\n queueIdx: string;\n type: 'queue-action';\n}\n\nconst workingDir = process.cwd();\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && path.isAbsolute(value)) {\n return path.relative(workingDir, value);\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries()).reduce((obj, [k, v]) => {\n const key = replacer(k, k) as string;\n return {\n ...obj,\n [key]: replacer(key, v),\n };\n }, {});\n }\n\n return value;\n}\n\nfunction printTimings(timings: Timings, startedAt: number, sourceRoot: string) {\n if (timings.size === 0) {\n return;\n }\n\n console.log(`\\nTimings:`);\n console.log(` Total: ${(performance.now() - startedAt).toFixed()}ms`);\n\n Array.from(timings.entries()).forEach(([label, byLabel]) => {\n console.log(`\\n By ${label}:`);\n\n const array = Array.from(byLabel.entries());\n // array.sort(([, a], [, b]) => b - a);\n array\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(([value, time]) => {\n const name = value.startsWith(sourceRoot)\n ? path.relative(sourceRoot, value)\n : value;\n console.log(` ${name}: ${time}ms`);\n });\n });\n}\n\nconst writeJSONl = (stream: NodeJS.WritableStream, data: unknown) => {\n stream.write(`${JSON.stringify(data, replacer)}\\n`);\n};\n\nexport const createFileReporter = (\n options: IFileReporterOptions | false = false\n) => {\n if (!options || !options.dir) {\n return {\n emitter: EventEmitter.dummy,\n onDone: () => {},\n };\n }\n\n const reportFolder = existsSync(options.dir)\n ? options.dir\n : mkdirSync(options.dir, {\n recursive: true,\n });\n\n if (!reportFolder) {\n throw new Error(`Could not create directory ${options.dir}`);\n }\n\n const actionStream = createWriteStream(\n path.join(options.dir, 'actions.jsonl')\n );\n\n const dependenciesStream = createWriteStream(\n path.join(options.dir, 'dependencies.jsonl')\n );\n\n const entrypointStream = createWriteStream(\n path.join(options.dir, 'entrypoints.jsonl')\n );\n\n const startedAt = performance.now();\n const timings: Timings = new Map();\n const addTiming = (label: string, key: string, value: number) => {\n if (!timings.has(label)) {\n timings.set(label, new Map());\n }\n\n const forLabel = timings.get(label)!;\n forLabel.set(key, Math.round((forLabel.get(key) || 0) + value));\n };\n\n const processDependencyEvent = ({\n file,\n only,\n imports,\n fileIdx,\n }: IProcessedEvent) => {\n writeJSONl(dependenciesStream, {\n file,\n only,\n imports,\n fileIdx,\n });\n };\n\n const processSingleEvent = (\n meta: Record<string, unknown> | IProcessedEvent | IQueueActionEvent\n ) => {\n if (meta.type === 'dependency') {\n processDependencyEvent(meta as IProcessedEvent);\n }\n };\n\n const startTimes = new Map<string, number>();\n\n const onEvent: OnEvent = (meta, type) => {\n if (type === 'single') {\n processSingleEvent(meta);\n return;\n }\n\n if (type === 'start') {\n Object.entries(meta).forEach(([label, value]) => {\n startTimes.set(`${label}\\0${value}`, performance.now());\n });\n } else {\n Object.entries(meta).forEach(([label, value]) => {\n const startTime = startTimes.get(`${label}\\0${value}`);\n if (startTime) {\n addTiming(label, String(value), performance.now() - startTime);\n }\n });\n }\n };\n\n let actionId = 0;\n const onAction: OnAction = (\n ...args: OnActionStartArgs | OnActionFinishArgs\n ) => {\n if (isOnActionStartArgs(args)) {\n const [, timestamp, type, idx, entrypointRef] = args;\n writeJSONl(actionStream, {\n actionId,\n entrypointRef,\n idx,\n startedAt: timestamp,\n type,\n });\n\n // eslint-disable-next-line no-plusplus\n return actionId++;\n }\n\n const [result, timestamp, id, isAsync, error] = args;\n writeJSONl(actionStream, {\n actionId: id,\n error,\n finishedAt: timestamp,\n isAsync,\n result: `${result}ed`,\n });\n\n return id;\n };\n\n const onEntrypointEvent: OnEntrypointEvent = (\n emitterId,\n timestamp,\n event\n ) => {\n entrypointStream.write(\n `${JSON.stringify([emitterId, timestamp, event])}\\n`\n );\n };\n\n const emitter = new EventEmitter(onEvent, onAction, onEntrypointEvent);\n\n return {\n emitter,\n onDone: (sourceRoot: string) => {\n if (options.print) {\n printTimings(timings, startedAt, sourceRoot);\n\n console.log('\\nMemory usage:', process.memoryUsage());\n }\n\n actionStream.end();\n dependenciesStream.end();\n timings.clear();\n },\n };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fileReporter.js","names":["_fs","require","_path","_interopRequireDefault","_EventEmitter","e","__esModule","default","workingDir","process","cwd","replacer","_key","value","path","isAbsolute","relative","Map","Array","from","entries","reduce","obj","k","v","key","printTimings","timings","startedAt","sourceRoot","size","console","log","performance","now","toFixed","forEach","label","byLabel","array","sort","a","b","localeCompare","time","name","startsWith","writeJSONl","stream","data","write","JSON","stringify","createFileReporter","options","dir","emitter","EventEmitter","dummy","onDone","reportFolder","existsSync","mkdirSync","recursive","Error","actionStream","createWriteStream","join","dependenciesStream","entrypointStream","addTiming","has","set","forLabel","get","Math","round","processDependencyEvent","file","only","imports","fileIdx","processSingleEvent","meta","type","startTimes","onEvent","Object","startTime","String","actionId","onAction","args","isOnActionStartArgs","timestamp","idx","entrypointRef","result","id","isAsync","error","finishedAt","onEntrypointEvent","emitterId","event","print","memoryUsage","end","clear","exports"],"sources":["../../src/debug/fileReporter.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { createWriteStream, existsSync, mkdirSync } from 'fs';\nimport path from 'path';\n\nimport type {\n OnAction,\n OnEvent,\n OnActionFinishArgs,\n OnActionStartArgs,\n OnEntrypointEvent,\n} from '../utils/EventEmitter';\nimport { EventEmitter, isOnActionStartArgs } from '../utils/EventEmitter';\n\ntype Timings = Map<string, Map<string, number>>;\n\nexport interface IFileReporterOptions {\n dir?: string;\n print?: boolean;\n}\n\nexport interface IProcessedEvent {\n file: string;\n fileIdx: string;\n imports: { from: string; what: string[] }[];\n only: string[];\n phase?: 'initial' | 'rewritten';\n type: 'dependency';\n}\n\nexport interface IQueueActionEvent {\n action: string;\n args?: string[];\n datetime: Date;\n file: string;\n queueIdx: string;\n type: 'queue-action';\n}\n\nconst workingDir = process.cwd();\n\nfunction replacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && path.isAbsolute(value)) {\n return path.relative(workingDir, value);\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries()).reduce((obj, [k, v]) => {\n const key = replacer(k, k) as string;\n return {\n ...obj,\n [key]: replacer(key, v),\n };\n }, {});\n }\n\n return value;\n}\n\nfunction printTimings(timings: Timings, startedAt: number, sourceRoot: string) {\n if (timings.size === 0) {\n return;\n }\n\n console.log(`\\nTimings:`);\n console.log(` Total: ${(performance.now() - startedAt).toFixed()}ms`);\n\n Array.from(timings.entries()).forEach(([label, byLabel]) => {\n console.log(`\\n By ${label}:`);\n\n const array = Array.from(byLabel.entries());\n // array.sort(([, a], [, b]) => b - a);\n array\n .sort(([a], [b]) => a.localeCompare(b))\n .forEach(([value, time]) => {\n const name = value.startsWith(sourceRoot)\n ? path.relative(sourceRoot, value)\n : value;\n console.log(` ${name}: ${time}ms`);\n });\n });\n}\n\nconst writeJSONl = (stream: NodeJS.WritableStream, data: unknown) => {\n stream.write(`${JSON.stringify(data, replacer)}\\n`);\n};\n\nexport const createFileReporter = (\n options: IFileReporterOptions | false = false\n) => {\n if (!options || !options.dir) {\n return {\n emitter: EventEmitter.dummy,\n onDone: () => {},\n };\n }\n\n const reportFolder = existsSync(options.dir)\n ? options.dir\n : mkdirSync(options.dir, {\n recursive: true,\n });\n\n if (!reportFolder) {\n throw new Error(`Could not create directory ${options.dir}`);\n }\n\n const actionStream = createWriteStream(\n path.join(options.dir, 'actions.jsonl')\n );\n\n const dependenciesStream = createWriteStream(\n path.join(options.dir, 'dependencies.jsonl')\n );\n\n const entrypointStream = createWriteStream(\n path.join(options.dir, 'entrypoints.jsonl')\n );\n\n const startedAt = performance.now();\n const timings: Timings = new Map();\n const addTiming = (label: string, key: string, value: number) => {\n if (!timings.has(label)) {\n timings.set(label, new Map());\n }\n\n const forLabel = timings.get(label)!;\n forLabel.set(key, Math.round((forLabel.get(key) || 0) + value));\n };\n\n const processDependencyEvent = ({\n file,\n only,\n imports,\n fileIdx,\n }: IProcessedEvent) => {\n writeJSONl(dependenciesStream, {\n file,\n only,\n imports,\n fileIdx,\n });\n };\n\n const processSingleEvent = (\n meta: Record<string, unknown> | IProcessedEvent | IQueueActionEvent\n ) => {\n if (meta.type === 'dependency') {\n processDependencyEvent(meta as IProcessedEvent);\n }\n };\n\n const startTimes = new Map<string, number>();\n\n const onEvent: OnEvent = (meta, type) => {\n if (type === 'single') {\n processSingleEvent(meta);\n return;\n }\n\n if (type === 'start') {\n Object.entries(meta).forEach(([label, value]) => {\n startTimes.set(`${label}\\0${value}`, performance.now());\n });\n } else {\n Object.entries(meta).forEach(([label, value]) => {\n const startTime = startTimes.get(`${label}\\0${value}`);\n if (startTime) {\n addTiming(label, String(value), performance.now() - startTime);\n }\n });\n }\n };\n\n let actionId = 0;\n const onAction: OnAction = (\n ...args: OnActionStartArgs | OnActionFinishArgs\n ) => {\n if (isOnActionStartArgs(args)) {\n const [, timestamp, type, idx, entrypointRef] = args;\n writeJSONl(actionStream, {\n actionId,\n entrypointRef,\n idx,\n startedAt: timestamp,\n type,\n });\n\n // eslint-disable-next-line no-plusplus\n return actionId++;\n }\n\n const [result, timestamp, id, isAsync, error] = args;\n writeJSONl(actionStream, {\n actionId: id,\n error,\n finishedAt: timestamp,\n isAsync,\n result: `${result}ed`,\n });\n\n return id;\n };\n\n const onEntrypointEvent: OnEntrypointEvent = (\n emitterId,\n timestamp,\n event\n ) => {\n entrypointStream.write(\n `${JSON.stringify([emitterId, timestamp, event])}\\n`\n );\n };\n\n const emitter = new EventEmitter(onEvent, onAction, onEntrypointEvent);\n\n return {\n emitter,\n onDone: (sourceRoot: string) => {\n if (options.print) {\n printTimings(timings, startedAt, sourceRoot);\n\n console.log('\\nMemory usage:', process.memoryUsage());\n }\n\n actionStream.end();\n dependenciesStream.end();\n timings.clear();\n },\n };\n};\n"],"mappings":"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","ignoreList":[]}