@granite-js/plugin-core 0.1.6 → 0.1.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.
package/dist/index.js CHANGED
@@ -1,5 +1,12 @@
1
- import { z } from "zod";
1
+ import { isNotNil } from "es-toolkit";
2
+ import * as z from "zod";
2
3
 
4
+ //#region src/createContext.ts
5
+ function createContext() {
6
+ return { meta: Object.create(null) };
7
+ }
8
+
9
+ //#endregion
3
10
  //#region src/utils/flattenPlugins.ts
4
11
  const flattenPlugins = async (plugin) => {
5
12
  if (Array.isArray(plugin)) {
@@ -26,20 +33,282 @@ async function resolvePlugins(plugins) {
26
33
  const pluginsResolved = await flattenPlugins(plugins);
27
34
  return {
28
35
  plugins: pluginsResolved,
36
+ configs: pluginsResolved.map((plugin) => plugin.config).filter(isNotNil),
37
+ pluginHooks: {
38
+ devServer: {
39
+ preHandlers: pluginsResolved.filter((plugin) => plugin.dev?.order === "pre").map((plugin) => plugin.dev?.handler),
40
+ postHandlers: pluginsResolved.filter((plugin) => plugin.dev?.order === "post").map((plugin) => plugin.dev?.handler)
41
+ },
42
+ build: {
43
+ preHandlers: pluginsResolved.filter((plugin) => plugin.build?.order === "pre").map((plugin) => plugin.build?.handler),
44
+ postHandlers: pluginsResolved.filter((plugin) => plugin.build?.order === "post").map((plugin) => plugin.build?.handler)
45
+ }
46
+ }
47
+ };
48
+ }
49
+
50
+ //#endregion
51
+ //#region src/utils/mergeBabel.ts
52
+ function mergeBabel(source, target) {
53
+ if (!(source || target)) return void 0;
54
+ if (source == null) return target;
55
+ if (target == null) return source;
56
+ return {
57
+ ...source,
58
+ ...target,
59
+ presets: [...source.presets ?? [], ...target.presets ?? []],
60
+ plugins: [...source.plugins ?? [], ...target.plugins ?? []],
61
+ conditions: [...source.conditions ?? [], ...target.conditions ?? []]
62
+ };
63
+ }
64
+
65
+ //#endregion
66
+ //#region src/utils/mergeDevServer.ts
67
+ function mergeDevServer(source, target) {
68
+ if (!(source || target)) return void 0;
69
+ if (source == null) return target;
70
+ if (target == null) return source;
71
+ return {
72
+ ...source,
73
+ ...target,
74
+ middlewares: [...source.middlewares ?? [], ...target.middlewares ?? []]
75
+ };
76
+ }
77
+
78
+ //#endregion
79
+ //#region src/utils/mergeEsbuild.ts
80
+ function mergeEsbuild(source, target) {
81
+ if (!(source || target)) return void 0;
82
+ if (source == null) return target;
83
+ if (target == null) return source;
84
+ return {
85
+ ...source,
86
+ ...target,
87
+ define: {
88
+ ...source.define,
89
+ ...target.define
90
+ },
91
+ inject: [...source.inject || [], ...target.inject || []],
92
+ prelude: [...source.prelude || [], ...target.prelude || []],
93
+ banner: mergeBanners(source.banner ?? {}, target.banner ?? {})
94
+ };
95
+ }
96
+ function mergeBanners(baseBanner, overrideBanner) {
97
+ const result = { ...baseBanner };
98
+ for (const [key, value] of Object.entries(overrideBanner)) result[key] = `${result[key] ?? ""}\n${value}`;
99
+ return result;
100
+ }
101
+
102
+ //#endregion
103
+ //#region src/utils/mergeExtra.ts
104
+ function mergeExtra(source, target) {
105
+ if (!(source || target)) return void 0;
106
+ if (source == null) return target;
107
+ if (target == null) return source;
108
+ return {
109
+ ...source,
110
+ ...target
111
+ };
112
+ }
113
+
114
+ //#endregion
115
+ //#region src/utils/mergeMetro.ts
116
+ function mergeMetro(source, target) {
117
+ if (!(source || target)) return void 0;
118
+ if (source == null) return target;
119
+ if (target == null) return source;
120
+ return {
121
+ ...source,
122
+ ...target,
123
+ middlewares: [...source.middlewares || [], ...target.middlewares || []],
124
+ resolver: mergeResolver$1(source.resolver, target.resolver),
125
+ serializer: mergeSerializer(source.serializer, target.serializer),
126
+ reporter: mergeReporter(source.reporter, target.reporter)
127
+ };
128
+ }
129
+ function mergeResolver$1(source, target) {
130
+ if (!(source || target)) return void 0;
131
+ if (source == null) return target;
132
+ if (target == null) return source;
133
+ return {
134
+ ...source,
135
+ ...target,
136
+ blockList: [...(Array.isArray(source.blockList) ? source.blockList : [source.blockList]) || [], ...(Array.isArray(target.blockList) ? target.blockList : [target.blockList]) || []].filter(isNotNil)
137
+ };
138
+ }
139
+ function mergeSerializer(source, target) {
140
+ if (!(source || target)) return void 0;
141
+ if (source == null) return target;
142
+ if (target == null) return source;
143
+ return {
144
+ ...source,
145
+ ...target,
146
+ getPolyfills: () => [...source.getPolyfills?.() || [], ...target.getPolyfills?.() || []]
147
+ };
148
+ }
149
+ function mergeReporter(source, target) {
150
+ if (!(source || target)) return void 0;
151
+ if (source == null) return target;
152
+ if (target == null) return source;
153
+ return { update: (event) => {
154
+ source.update?.(event);
155
+ target.update?.(event);
156
+ } };
157
+ }
158
+
159
+ //#endregion
160
+ //#region src/utils/mergeResolver.ts
161
+ function mergeResolver(source, target) {
162
+ if (!(source || target)) return void 0;
163
+ if (source == null) return target;
164
+ if (target == null) return source;
165
+ return {
166
+ alias: [...source.alias ?? [], ...target.alias ?? []],
167
+ protocols: {
168
+ ...source.protocols,
169
+ ...target.protocols
170
+ }
171
+ };
172
+ }
173
+
174
+ //#endregion
175
+ //#region src/utils/mergeSwc.ts
176
+ function mergeSwc(source, target) {
177
+ if (!(source || target)) return void 0;
178
+ if (source == null) return target;
179
+ if (target == null) return source;
180
+ return {
181
+ ...source,
182
+ ...target,
183
+ plugins: [...source.plugins || [], ...target.plugins || []]
184
+ };
185
+ }
186
+
187
+ //#endregion
188
+ //#region src/utils/mergeTransformer.ts
189
+ function mergeTransformer(source, target) {
190
+ if (!(source || target)) return void 0;
191
+ if (source == null) return target;
192
+ if (target == null) return source;
193
+ let transformSync;
194
+ let transformAsync;
195
+ if (!(source.transformSync || target.transformSync)) transformSync = void 0;
196
+ else if (source.transformSync && target.transformSync) transformSync = (id, code) => {
197
+ let src = code;
198
+ src = source.transformSync?.(id, src) ?? src;
199
+ src = target.transformSync?.(id, src) ?? src;
200
+ return src;
201
+ };
202
+ else if (source.transformSync) transformSync = source.transformSync;
203
+ else if (target.transformSync) transformSync = target.transformSync;
204
+ if (!(source.transformAsync || target.transformAsync)) transformAsync = void 0;
205
+ else if (source.transformAsync && target.transformAsync) transformAsync = async (id, code) => {
206
+ let src = code;
207
+ src = await source.transformAsync?.(id, src) ?? src;
208
+ src = await target.transformAsync?.(id, src) ?? src;
209
+ return src;
210
+ };
211
+ else if (source.transformAsync) transformAsync = source.transformAsync;
212
+ else if (target.transformAsync) transformAsync = target.transformAsync;
213
+ return {
214
+ transformSync,
215
+ transformAsync
216
+ };
217
+ }
218
+
219
+ //#endregion
220
+ //#region src/utils/mergeConfig.ts
221
+ function mergeConfig(base, ...configs) {
222
+ if (!(base || configs.length)) return void 0;
223
+ return configs.reduce((acc, curr) => ({
224
+ ...acc,
225
+ ...curr,
226
+ resolver: mergeResolver(acc?.resolver, curr?.resolver),
227
+ transformer: mergeTransformer(acc?.transformer, curr?.transformer),
228
+ esbuild: mergeEsbuild(acc?.esbuild, curr?.esbuild),
229
+ babel: mergeBabel(acc?.babel, curr?.babel),
230
+ swc: mergeSwc(acc?.swc, curr?.swc),
231
+ devServer: mergeDevServer(acc?.devServer, curr?.devServer),
232
+ metro: mergeMetro(acc?.metro, curr?.metro),
233
+ extra: mergeExtra(acc?.extra, curr?.extra)
234
+ }), base);
235
+ }
236
+
237
+ //#endregion
238
+ //#region src/utils/mergeBuildConfigs.ts
239
+ function mergeBuildConfigs(baseConfig, ...otherConfigs) {
240
+ const mergedConfig = otherConfigs.reduce((acc, curr) => ({
241
+ entry: acc.entry ?? curr.entry,
242
+ outfile: acc.outfile ?? curr.outfile,
243
+ platform: acc.platform ?? curr.platform,
244
+ resolver: mergeResolver(acc.resolver, curr.resolver),
245
+ transformer: mergeTransformer(acc.transformer, curr.transformer),
246
+ esbuild: mergeEsbuild(acc.esbuild, curr.esbuild),
247
+ swc: mergeSwc(acc.swc, curr.swc),
248
+ babel: mergeBabel(acc.babel, curr.babel),
249
+ extra: mergeExtra(acc.extra, curr.extra)
250
+ }), baseConfig);
251
+ return mergedConfig;
252
+ }
253
+
254
+ //#endregion
255
+ //#region src/utils/createPluginHooksDriver.ts
256
+ function createPluginHooksDriver(config) {
257
+ const context = createPluginContext();
258
+ const { devServer: devServerHooks, build: buildHooks } = config.pluginHooks;
259
+ const baseArgs = {
260
+ cwd: config.cwd,
261
+ appName: config.appName,
262
+ entryFile: config.entryFile,
263
+ outdir: config.outdir
264
+ };
265
+ return {
29
266
  devServer: {
30
- preHandlers: pluginsResolved.filter((plugin) => plugin.dev?.order === "pre").map((plugin) => plugin.dev?.handler),
31
- postHandlers: pluginsResolved.filter((plugin) => plugin.dev?.order === "post").map((plugin) => plugin.dev?.handler)
267
+ pre: async (args) => {
268
+ for (const handler of devServerHooks.preHandlers) await handler.call(context, {
269
+ ...baseArgs,
270
+ ...args
271
+ });
272
+ },
273
+ post: async (args) => {
274
+ for (const handler of devServerHooks.postHandlers) await handler.call(context, {
275
+ ...baseArgs,
276
+ ...args
277
+ });
278
+ }
32
279
  },
33
280
  build: {
34
- preHandlers: pluginsResolved.filter((plugin) => plugin.build?.order === "pre").map((plugin) => plugin.build?.handler),
35
- postHandlers: pluginsResolved.filter((plugin) => plugin.build?.order === "post").map((plugin) => plugin.build?.handler)
281
+ pre: async () => {
282
+ for (const handler of buildHooks.preHandlers) await handler.call(context, { ...baseArgs });
283
+ },
284
+ post: async (args) => {
285
+ for (const handler of buildHooks.postHandlers) await handler.call(context, {
286
+ ...baseArgs,
287
+ ...args
288
+ });
289
+ }
36
290
  }
37
291
  };
38
292
  }
293
+ function createPluginContext() {
294
+ const meta = Object.create(null);
295
+ const context = { meta };
296
+ return context;
297
+ }
39
298
 
40
299
  //#endregion
41
- //#region src/types/mpackConfig.ts
42
- const mpackConfigScheme = z.object({ devServer: z.object({ middlewares: z.custom().default([]) }).optional().default({ middlewares: [] }) }).optional();
300
+ //#region src/schema/pluginConfig.ts
301
+ const pluginConfigSchema = z.object({
302
+ cwd: z.string().default(process.cwd()),
303
+ appName: z.string(),
304
+ scheme: z.string(),
305
+ outdir: z.string().default("dist"),
306
+ entryFile: z.string().default("./src/_app.tsx"),
307
+ build: z.custom().optional(),
308
+ devServer: z.custom().optional(),
309
+ metro: z.custom().optional(),
310
+ plugins: z.custom()
311
+ });
43
312
 
44
313
  //#endregion
45
- export { flattenPlugins, mpackConfigScheme, resolvePlugins };
314
+ export { createContext, createPluginContext, createPluginHooksDriver, flattenPlugins, mergeBuildConfigs, mergeConfig, pluginConfigSchema, resolvePlugins };
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@granite-js/plugin-core",
3
3
  "type": "module",
4
- "version": "0.1.6",
4
+ "version": "0.1.8",
5
5
  "description": "The core plugin module for Granite",
6
6
  "scripts": {
7
7
  "prepack": "yarn build",
8
+ "test": "vitest --run",
8
9
  "typecheck": "tsc --noEmit",
9
10
  "build": "tsdown"
10
11
  },
@@ -25,17 +26,19 @@
25
26
  "dist"
26
27
  ],
27
28
  "devDependencies": {
28
- "@granite-js/mpack": "0.1.6",
29
+ "@swc/core": "1.5.24",
30
+ "@types/babel__core": "^7",
29
31
  "@types/connect": "^3",
30
32
  "connect": "^3.7.0",
31
- "es-toolkit": "^1.34.1",
32
- "esbuild": "^0.25.4",
33
+ "esbuild": "^0.25.8",
34
+ "fastify": "4.14.0",
33
35
  "tsdown": "^0.11.12",
34
36
  "typescript": "^5.6.3",
35
37
  "vitest": "^3.0.9"
36
38
  },
37
39
  "dependencies": {
38
- "zod": "3.24.4"
40
+ "es-toolkit": "^1.39.7",
41
+ "zod": "^4.0.10"
39
42
  },
40
43
  "sideEffects": false
41
44
  }