@graphcommerce/next-config 8.1.0-canary.2 → 8.1.0-canary.5

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 (44) hide show
  1. package/CHANGELOG.md +133 -1
  2. package/Config.graphqls +4 -2
  3. package/__tests__/config/utils/__snapshots__/mergeEnvIntoConfig.ts.snap +19 -2
  4. package/__tests__/config/utils/replaceConfigInString.ts +4 -0
  5. package/__tests__/interceptors/findPlugins.ts +473 -113
  6. package/__tests__/interceptors/generateInterceptors.ts +610 -322
  7. package/__tests__/interceptors/parseStructure.ts +158 -0
  8. package/__tests__/interceptors/writeInterceptors.ts +23 -14
  9. package/__tests__/utils/resolveDependenciesSync.ts +28 -25
  10. package/dist/config/commands/generateConfig.js +5 -2
  11. package/dist/config/demoConfig.js +19 -4
  12. package/dist/generated/config.js +8 -1
  13. package/dist/interceptors/InterceptorPlugin.js +70 -25
  14. package/dist/interceptors/RenameVisitor.js +19 -0
  15. package/dist/interceptors/Visitor.js +1418 -0
  16. package/dist/interceptors/extractExports.js +201 -0
  17. package/dist/interceptors/findOriginalSource.js +87 -0
  18. package/dist/interceptors/findPlugins.js +21 -53
  19. package/dist/interceptors/generateInterceptor.js +200 -0
  20. package/dist/interceptors/generateInterceptors.js +38 -179
  21. package/dist/interceptors/parseStructure.js +71 -0
  22. package/dist/interceptors/swc.js +16 -0
  23. package/dist/interceptors/writeInterceptors.js +19 -10
  24. package/dist/utils/resolveDependency.js +27 -5
  25. package/dist/withGraphCommerce.js +2 -1
  26. package/package.json +4 -1
  27. package/src/config/commands/generateConfig.ts +5 -2
  28. package/src/config/demoConfig.ts +19 -4
  29. package/src/config/index.ts +4 -2
  30. package/src/generated/config.ts +25 -3
  31. package/src/index.ts +16 -6
  32. package/src/interceptors/InterceptorPlugin.ts +90 -32
  33. package/src/interceptors/RenameVisitor.ts +17 -0
  34. package/src/interceptors/Visitor.ts +1847 -0
  35. package/src/interceptors/extractExports.ts +230 -0
  36. package/src/interceptors/findOriginalSource.ts +105 -0
  37. package/src/interceptors/findPlugins.ts +36 -87
  38. package/src/interceptors/generateInterceptor.ts +271 -0
  39. package/src/interceptors/generateInterceptors.ts +67 -237
  40. package/src/interceptors/parseStructure.ts +82 -0
  41. package/src/interceptors/swc.ts +13 -0
  42. package/src/interceptors/writeInterceptors.ts +26 -10
  43. package/src/utils/resolveDependency.ts +51 -12
  44. package/src/withGraphCommerce.ts +2 -1
@@ -6,48 +6,93 @@ import { findPlugins } from './findPlugins'
6
6
  import { generateInterceptors, GenerateInterceptorsReturn } from './generateInterceptors'
7
7
  import { writeInterceptors } from './writeInterceptors'
8
8
 
9
- export class InterceptorPlugin {
10
- private interceptors: GenerateInterceptorsReturn
9
+ let interceptors: GenerateInterceptorsReturn | undefined
10
+ let interceptorByDepependency: GenerateInterceptorsReturn | undefined
11
+
12
+ let generating = false
11
13
 
12
- private interceptorByDepependency: GenerateInterceptorsReturn
14
+ // let totalGenerationTime = 0
13
15
 
16
+ export class InterceptorPlugin {
14
17
  private resolveDependency: ResolveDependency
15
18
 
16
- constructor(private config: GraphCommerceConfig) {
19
+ constructor(
20
+ private config: GraphCommerceConfig,
21
+ private regenerate: boolean = false,
22
+ ) {
17
23
  this.resolveDependency = resolveDependency()
18
24
 
19
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
26
+ if (regenerate) this.#generateInterceptors()
27
+ }
28
+
29
+ #generateInterceptors = async () => {
30
+ if (generating) return {}
31
+ generating = true
32
+ const start = Date.now()
33
+
34
+ // console.log('Generating interceptors...')
35
+
20
36
  const [plugins, errors] = findPlugins(this.config)
21
- this.interceptors = generateInterceptors(plugins, this.resolveDependency, this.config.debug)
22
- this.interceptorByDepependency = Object.fromEntries(
23
- Object.values(this.interceptors).map((i) => [i.dependency, i]),
37
+
38
+ // console.log(errors)
39
+
40
+ // const found = Date.now()
41
+ // console.log('Found plugins in', found - start, 'ms')
42
+
43
+ const generatedInterceptors = await generateInterceptors(
44
+ plugins,
45
+ this.resolveDependency,
46
+ this.config.debug,
24
47
  )
25
48
 
26
- writeInterceptors(this.interceptors)
49
+ // const generated = Date.now()
50
+ // console.log('Generated interceptors in', generated - found, 'ms')
51
+
52
+ await writeInterceptors(generatedInterceptors)
53
+
54
+ // const wrote = Date.now()
55
+ // console.log('Wrote interceptors in', wrote - generated, 'ms')
56
+
57
+ interceptors = generatedInterceptors
58
+
59
+ interceptorByDepependency = Object.fromEntries(
60
+ Object.values(interceptors).map((i) => [i.dependency, i]),
61
+ )
62
+
63
+ // totalGenerationTime += Date.now() - start
64
+ generating = false
65
+
66
+ return generatedInterceptors
27
67
  }
28
68
 
29
69
  apply(compiler: Compiler): void {
30
70
  const logger = compiler.getInfrastructureLogger('InterceptorPlugin')
31
71
 
32
72
  // After the compilation has succeeded we watch all possible plugin locations.
33
- compiler.hooks.afterCompile.tap('InterceptorPlugin', (compilation) => {
34
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
35
- const [plugins, errors] = findPlugins(this.config)
73
+ if (this.regenerate) {
74
+ compiler.hooks.afterCompile.tap('InterceptorPlugin', (compilation) => {
75
+ // console.log('generate interceptors after compile')
76
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
77
+ const [plugins, errors] = findPlugins(this.config)
36
78
 
37
- plugins.forEach((p) => {
38
- const absoluteFilePath = `${path.join(
39
- process.cwd(),
40
- this.resolveDependency(p.plugin).fromRoot,
41
- )}.tsx`
42
- compilation.fileDependencies.add(absoluteFilePath)
43
- })
79
+ plugins.forEach((p) => {
80
+ const source = this.resolveDependency(p.sourceModule)
81
+ if (source) {
82
+ const absoluteFilePath = `${path.join(process.cwd(), source.fromRoot)}.tsx`
83
+ compilation.fileDependencies.add(absoluteFilePath)
84
+ }
85
+ })
44
86
 
45
- this.interceptors = generateInterceptors(plugins, this.resolveDependency, this.config.debug)
46
- this.interceptorByDepependency = Object.fromEntries(
47
- Object.values(this.interceptors).map((i) => [i.dependency, i]),
48
- )
49
- writeInterceptors(this.interceptors)
50
- })
87
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
88
+ this.#generateInterceptors().then((i) => {
89
+ Object.entries(i).forEach(([key, { sourcePath }]) => {
90
+ const absoluteFilePath = path.join(process.cwd(), sourcePath)
91
+ compilation.fileDependencies.add(absoluteFilePath)
92
+ })
93
+ })
94
+ })
95
+ }
51
96
 
52
97
  compiler.hooks.normalModuleFactory.tap('InterceptorPlugin', (nmf) => {
53
98
  nmf.hooks.beforeResolve.tap('InterceptorPlugin', (resource) => {
@@ -58,21 +103,34 @@ export class InterceptorPlugin {
58
103
  path.resolve(resource.context, resource.request),
59
104
  )
60
105
 
61
- if (issuer.endsWith('interceptor.tsx') && this.interceptors[requestPath]) {
106
+ if (!interceptors || !interceptorByDepependency) {
107
+ // console.log('interceptors not ready')
108
+ return
109
+ }
110
+
111
+ const split = requestPath.split('/')
112
+ const targets = [
113
+ `${split[split.length - 1]}.interceptor.tsx`,
114
+ `${split[split.length - 1]}.interceptor.ts`,
115
+ ]
116
+
117
+ if (targets.some((target) => issuer.endsWith(target)) && interceptors[requestPath]) {
62
118
  logger.log(`Interceptor ${issuer} is requesting the original ${requestPath}`)
63
119
  return
64
120
  }
65
121
 
66
- const interceptorForRequest = this.interceptorByDepependency[resource.request]
122
+ const interceptorForRequest = interceptorByDepependency[resource.request]
67
123
  if (interceptorForRequest) {
68
- logger.log(`Intercepting dep... ${interceptorForRequest.dependency}`)
69
- resource.request = `${interceptorForRequest.denormalized}.interceptor.tsx`
124
+ const extension = interceptorForRequest.sourcePath.endsWith('.tsx') ? '.tsx' : '.ts'
125
+ resource.request = `${interceptorForRequest.denormalized}.interceptor${extension}`
126
+ logger.log(`Intercepting dep... ${interceptorForRequest.dependency}`, resource.request)
70
127
  }
71
128
 
72
- const interceptorForPath = this.interceptors[requestPath]
129
+ const interceptorForPath = interceptors[requestPath]
73
130
  if (interceptorForPath) {
74
- logger.log(`Intercepting fromRoot... ${interceptorForPath.fromRoot}`)
75
- resource.request = `${resource.request}.interceptor.tsx`
131
+ const extension = interceptorForPath.sourcePath.endsWith('.tsx') ? '.tsx' : '.ts'
132
+ resource.request = `${resource.request}.interceptor${extension}`
133
+ logger.log(`Intercepting fromRoot... ${interceptorForPath.dependency}`, resource.request)
76
134
  }
77
135
  })
78
136
  })
@@ -0,0 +1,17 @@
1
+ /* eslint-disable max-classes-per-file */
2
+ import { Identifier } from '@swc/core'
3
+ import { Visitor } from './Visitor'
4
+
5
+ export class RenameVisitor extends Visitor {
6
+ constructor(
7
+ private replace: string[],
8
+ private suffix: (v: string) => string,
9
+ ) {
10
+ super()
11
+ }
12
+
13
+ visitIdentifier(n: Identifier): Identifier {
14
+ if (this.replace.includes(n.value)) n.value = this.suffix(n.value)
15
+ return n
16
+ }
17
+ }