@graphcommerce/next-config 8.1.0-canary.3 → 8.1.0-canary.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +134 -2
- package/Config.graphqls +4 -2
- package/__tests__/config/utils/__snapshots__/mergeEnvIntoConfig.ts.snap +19 -2
- package/__tests__/config/utils/replaceConfigInString.ts +4 -0
- package/__tests__/interceptors/findPlugins.ts +473 -113
- package/__tests__/interceptors/generateInterceptors.ts +610 -322
- package/__tests__/interceptors/parseStructure.ts +158 -0
- package/__tests__/interceptors/writeInterceptors.ts +23 -14
- package/__tests__/utils/resolveDependenciesSync.ts +28 -25
- package/dist/config/commands/generateConfig.js +5 -2
- package/dist/config/demoConfig.js +19 -4
- package/dist/generated/config.js +8 -1
- package/dist/interceptors/InterceptorPlugin.js +70 -25
- package/dist/interceptors/RenameVisitor.js +19 -0
- package/dist/interceptors/Visitor.js +1418 -0
- package/dist/interceptors/extractExports.js +201 -0
- package/dist/interceptors/findOriginalSource.js +87 -0
- package/dist/interceptors/findPlugins.js +21 -53
- package/dist/interceptors/generateInterceptor.js +200 -0
- package/dist/interceptors/generateInterceptors.js +38 -179
- package/dist/interceptors/parseStructure.js +71 -0
- package/dist/interceptors/swc.js +16 -0
- package/dist/interceptors/writeInterceptors.js +19 -10
- package/dist/utils/resolveDependency.js +27 -5
- package/dist/withGraphCommerce.js +2 -1
- package/package.json +4 -1
- package/src/config/commands/generateConfig.ts +5 -2
- package/src/config/demoConfig.ts +19 -4
- package/src/config/index.ts +4 -2
- package/src/generated/config.ts +25 -3
- package/src/index.ts +16 -6
- package/src/interceptors/InterceptorPlugin.ts +90 -32
- package/src/interceptors/RenameVisitor.ts +17 -0
- package/src/interceptors/Visitor.ts +1847 -0
- package/src/interceptors/extractExports.ts +230 -0
- package/src/interceptors/findOriginalSource.ts +105 -0
- package/src/interceptors/findPlugins.ts +36 -87
- package/src/interceptors/generateInterceptor.ts +271 -0
- package/src/interceptors/generateInterceptors.ts +67 -237
- package/src/interceptors/parseStructure.ts +82 -0
- package/src/interceptors/swc.ts +13 -0
- package/src/interceptors/writeInterceptors.ts +26 -10
- package/src/utils/resolveDependency.ts +51 -12
- 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
|
-
|
|
10
|
-
|
|
9
|
+
let interceptors: GenerateInterceptorsReturn | undefined
|
|
10
|
+
let interceptorByDepependency: GenerateInterceptorsReturn | undefined
|
|
11
|
+
|
|
12
|
+
let generating = false
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
// let totalGenerationTime = 0
|
|
13
15
|
|
|
16
|
+
export class InterceptorPlugin {
|
|
14
17
|
private resolveDependency: ResolveDependency
|
|
15
18
|
|
|
16
|
-
constructor(
|
|
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-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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 (
|
|
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 =
|
|
122
|
+
const interceptorForRequest = interceptorByDepependency[resource.request]
|
|
67
123
|
if (interceptorForRequest) {
|
|
68
|
-
|
|
69
|
-
resource.request = `${interceptorForRequest.denormalized}.interceptor
|
|
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 =
|
|
129
|
+
const interceptorForPath = interceptors[requestPath]
|
|
73
130
|
if (interceptorForPath) {
|
|
74
|
-
|
|
75
|
-
resource.request = `${resource.request}.interceptor
|
|
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
|
+
}
|