@module-federation/bridge-vue3 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
@@ -1,38 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref } from 'vue';
3
-
4
- defineProps<{ msg: string }>();
5
-
6
- const count = ref(0);
7
- </script>
8
-
9
- <template>
10
- <h1>{{ msg }}</h1>
11
-
12
- <div class="card">
13
- <button type="button" @click="count++">count is {{ count }}</button>
14
- <p>
15
- Edit
16
- <code>components/HelloWorld.vue</code> to test HMR
17
- </p>
18
- </div>
19
-
20
- <p>
21
- Check out
22
- <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
23
- >create-vue</a
24
- >, the official Vue + Vite starter
25
- </p>
26
- <p>
27
- Install
28
- <a href="https://github.com/vuejs/language-tools" target="_blank">Volar</a>
29
- in your IDE for a better DX
30
- </p>
31
- <p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
32
- </template>
33
-
34
- <style scoped>
35
- .read-the-docs {
36
- color: #888;
37
- }
38
- </style>
package/src/create.ts DELETED
@@ -1,83 +0,0 @@
1
- import { type AsyncComponentOptions, defineAsyncComponent, h } from 'vue';
2
- import { useRoute } from 'vue-router';
3
- import RemoteApp from './remoteApp.jsx';
4
- import { LoggerInstance } from './utils.js';
5
-
6
- declare const __APP_VERSION__: string;
7
-
8
- export function createRemoteAppComponent(info: {
9
- loader: () => Promise<any>;
10
- export?: string;
11
- asyncComponentOptions?: Omit<AsyncComponentOptions, 'loader'>;
12
- rootAttrs?: Record<string, unknown>;
13
- memoryRoute?: { entryPath: string };
14
- hashRoute?: boolean;
15
- }) {
16
- return defineAsyncComponent({
17
- __APP_VERSION__,
18
- ...info.asyncComponentOptions,
19
- //@ts-ignore
20
- loader: async () => {
21
- const route = useRoute();
22
-
23
- let basename = '/';
24
- const matchPath = route?.matched?.[0]?.path;
25
- if (matchPath) {
26
- if (matchPath.endsWith('/:pathMatch(.*)*')) {
27
- basename = matchPath.replace('/:pathMatch(.*)*', '');
28
- } else {
29
- basename = route.matched[0].path;
30
- }
31
- }
32
-
33
- const exportName = info?.export || 'default';
34
- LoggerInstance.debug(
35
- `createRemoteAppComponent LazyComponent create >>>`,
36
- {
37
- basename,
38
- info,
39
- },
40
- );
41
-
42
- const module: any = await info.loader();
43
- const moduleName = module && module[Symbol.for('mf_module_id')];
44
- const exportFn = module[exportName];
45
-
46
- LoggerInstance.debug(
47
- `createRemoteAppComponent LazyComponent loadRemote info >>>`,
48
- { moduleName, module, exportName, basename, route },
49
- );
50
-
51
- if (exportName in module && typeof exportFn === 'function') {
52
- return {
53
- render() {
54
- return h(RemoteApp, {
55
- moduleName,
56
- providerInfo: exportFn,
57
- basename,
58
- rootAttrs: info.rootAttrs,
59
- memoryRoute: info.memoryRoute,
60
- hashRoute: info.hashRoute,
61
- });
62
- },
63
- };
64
- }
65
- throw new Error('module not found');
66
- },
67
- });
68
- }
69
-
70
- /**
71
- * @deprecated createRemoteComponent is deprecated, please use createRemoteAppComponent instead!
72
- */
73
- export function createRemoteComponent(info: {
74
- loader: () => Promise<any>;
75
- export?: string;
76
- asyncComponentOptions?: Omit<AsyncComponentOptions, 'loader'>;
77
- rootAttrs?: Record<string, unknown>;
78
- }) {
79
- LoggerInstance.warn(
80
- 'createRemoteComponent is deprecated, please use createRemoteAppComponent instead!',
81
- );
82
- return createRemoteAppComponent(info);
83
- }
package/src/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export { createBridgeComponent } from './provider';
2
- export type { ProviderFnParams } from './provider';
3
- export { createRemoteComponent, createRemoteAppComponent } from './create';
4
- export type { RenderFnParams } from '@module-federation/bridge-shared';
package/src/provider.ts DELETED
@@ -1,112 +0,0 @@
1
- import * as Vue from 'vue';
2
- import * as VueRouter from 'vue-router';
3
- import { RenderFnParams } from '@module-federation/bridge-shared';
4
- import { LoggerInstance } from './utils';
5
- import { getInstance } from '@module-federation/runtime';
6
- import { processRoutes } from './routeUtils';
7
-
8
- declare const __APP_VERSION__: string;
9
-
10
- type AddOptionsFnParams = {
11
- app: Vue.App<Vue.Component>;
12
- basename: RenderFnParams['basename'];
13
- memoryRoute: RenderFnParams['memoryRoute'];
14
- [key: string]: any;
15
- };
16
-
17
- export type ProviderFnParams = {
18
- rootComponent: Vue.Component;
19
- appOptions: (params: AddOptionsFnParams) => {
20
- router?: VueRouter.Router;
21
- /** Called with the bridge's internal router after creation but before navigation.
22
- * Use this to register global guards (beforeEach, afterEach, etc.) that would
23
- * otherwise be lost when the bridge recreates the router. */
24
- afterRouterCreate?: (router: VueRouter.Router) => void;
25
- } | void;
26
- };
27
-
28
- export function createBridgeComponent(bridgeInfo: ProviderFnParams) {
29
- const rootMap = new Map();
30
- const instance = getInstance();
31
- return () => {
32
- return {
33
- __APP_VERSION__,
34
- async render(info: RenderFnParams) {
35
- LoggerInstance.debug(`createBridgeComponent render Info`, info);
36
- const {
37
- moduleName,
38
- dom,
39
- basename,
40
- memoryRoute,
41
- hashRoute,
42
- ...propsInfo
43
- } = info;
44
- const app = Vue.createApp(bridgeInfo.rootComponent, propsInfo);
45
- rootMap.set(dom, app);
46
-
47
- const beforeBridgeRenderRes =
48
- await instance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(info);
49
-
50
- const extraProps =
51
- beforeBridgeRenderRes &&
52
- typeof beforeBridgeRenderRes === 'object' &&
53
- beforeBridgeRenderRes?.extraProps
54
- ? beforeBridgeRenderRes?.extraProps
55
- : {};
56
-
57
- const bridgeOptions = bridgeInfo.appOptions({
58
- app,
59
- basename,
60
- memoryRoute,
61
- hashRoute,
62
- ...propsInfo,
63
- ...extraProps,
64
- });
65
- if (bridgeOptions?.router) {
66
- const { history, routes, patchRouter } = processRoutes({
67
- router: bridgeOptions.router,
68
- basename: info.basename,
69
- memoryRoute: info.memoryRoute,
70
- hashRoute: info.hashRoute,
71
- });
72
-
73
- const router = VueRouter.createRouter({
74
- ...bridgeOptions.router.options,
75
- history,
76
- routes,
77
- });
78
-
79
- if (patchRouter) {
80
- patchRouter(router);
81
- }
82
-
83
- if (bridgeOptions.afterRouterCreate) {
84
- bridgeOptions.afterRouterCreate(router);
85
- }
86
-
87
- LoggerInstance.debug(`createBridgeComponent render router info>>>`, {
88
- moduleName,
89
- router,
90
- });
91
- // memory route Initializes the route
92
- if (memoryRoute) {
93
- await router.push(memoryRoute.entryPath);
94
- }
95
-
96
- app.use(router);
97
- }
98
-
99
- app.mount(dom);
100
- instance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(info);
101
- },
102
- destroy(info: { dom: HTMLElement }) {
103
- LoggerInstance.debug(`createBridgeComponent destroy Info`, info);
104
- const root = rootMap.get(info?.dom);
105
-
106
- instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit(info);
107
- root?.unmount();
108
- instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(info);
109
- },
110
- };
111
- };
112
- }
package/src/remoteApp.tsx DELETED
@@ -1,115 +0,0 @@
1
- import {
2
- ref,
3
- onMounted,
4
- onBeforeUnmount,
5
- watch,
6
- defineComponent,
7
- useAttrs,
8
- } from 'vue';
9
- import { dispatchPopstateEnv } from '@module-federation/bridge-shared';
10
- import { useRoute } from 'vue-router';
11
- import { LoggerInstance } from './utils';
12
- import { getInstance } from '@module-federation/runtime';
13
-
14
- export default defineComponent({
15
- name: 'RemoteApp',
16
- props: {
17
- moduleName: String,
18
- basename: String,
19
- memoryRoute: Object,
20
- hashRoute: Boolean,
21
- providerInfo: Function,
22
- rootAttrs: Object,
23
- },
24
- inheritAttrs: false,
25
- setup(props) {
26
- const rootRef = ref(null);
27
- const providerInfoRef = ref(null);
28
- const pathname = ref('');
29
- const route = useRoute();
30
- const hostInstance = getInstance();
31
- const componentAttrs = useAttrs();
32
-
33
- const renderComponent = async () => {
34
- const providerReturn = props.providerInfo?.();
35
- providerInfoRef.value = providerReturn;
36
-
37
- let renderProps = {
38
- ...componentAttrs,
39
- moduleName: props.moduleName,
40
- dom: rootRef.value,
41
- basename: props.basename,
42
- memoryRoute: props.memoryRoute,
43
- hashRoute: props.hashRoute,
44
- };
45
- LoggerInstance.debug(
46
- `createRemoteAppComponent LazyComponent render >>>`,
47
- renderProps,
48
- );
49
-
50
- const beforeBridgeRenderRes =
51
- (await hostInstance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(
52
- renderProps,
53
- )) || {};
54
-
55
- renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
56
- providerReturn.render(renderProps);
57
- hostInstance?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(renderProps);
58
- };
59
-
60
- const watchStopHandle = watch(
61
- () => route?.path,
62
- (newPath) => {
63
- if (newPath !== route.path) {
64
- renderComponent();
65
- }
66
-
67
- // dispatchPopstateEnv
68
- if (pathname.value !== '' && pathname.value !== newPath) {
69
- LoggerInstance.debug(
70
- `createRemoteAppComponent dispatchPopstateEnv >>>`,
71
- {
72
- ...props,
73
- pathname: route.path,
74
- },
75
- );
76
- dispatchPopstateEnv();
77
- }
78
- pathname.value = newPath;
79
- },
80
- );
81
-
82
- onMounted(() => {
83
- renderComponent();
84
- });
85
-
86
- onBeforeUnmount(() => {
87
- LoggerInstance.debug(
88
- `createRemoteAppComponent LazyComponent destroy >>>`,
89
- {
90
- ...props,
91
- },
92
- );
93
- watchStopHandle();
94
-
95
- hostInstance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit({
96
- name: props.moduleName,
97
- dom: rootRef.value,
98
- basename: props.basename,
99
- memoryRoute: props.memoryRoute,
100
- hashRoute: props.hashRoute,
101
- });
102
-
103
- (providerInfoRef.value as any)?.destroy({ dom: rootRef.value });
104
- hostInstance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit({
105
- name: props.moduleName,
106
- dom: rootRef.value,
107
- basename: props.basename,
108
- memoryRoute: props.memoryRoute,
109
- hashRoute: props.hashRoute,
110
- });
111
- });
112
-
113
- return () => <div {...(props.rootAttrs || {})} ref={rootRef}></div>;
114
- },
115
- });
package/src/routeUtils.ts DELETED
@@ -1,218 +0,0 @@
1
- import * as VueRouter from 'vue-router';
2
-
3
- export interface RouteProcessingOptions {
4
- router: VueRouter.Router;
5
- basename?: string;
6
- memoryRoute?: boolean | { entryPath: string };
7
- hashRoute?: boolean;
8
- }
9
-
10
- export interface RouteProcessingResult {
11
- history: VueRouter.RouterHistory;
12
- routes: VueRouter.RouteRecordNormalized[];
13
- patchRouter?: (router: VueRouter.Router) => void;
14
- }
15
-
16
- /**
17
- * Add basename prefix to all nested routes recursively
18
- *
19
- * @param routes - route configuration array
20
- * @param basename - base path prefix
21
- * @returns processed route configuration
22
- */
23
- function addBasenameToNestedRoutes(
24
- routes: VueRouter.RouteRecordNormalized[],
25
- basename: string,
26
- ): VueRouter.RouteRecordNormalized[] {
27
- /**
28
- * Join two path segments, collapse multiple slashes, and optionally
29
- * preserve a trailing slash that was present in the original value.
30
- * A bare '/' root is never considered an intentional trailing slash.
31
- */
32
- const prefixPath = (original: string): string => {
33
- const hasTrailingSlash = original.length > 1 && original.endsWith('/');
34
- const normalized =
35
- `${basename}/${original}`.replace(/\/+/g, '/').replace(/\/$/, '') || '/';
36
- return hasTrailingSlash ? `${normalized}/` : normalized;
37
- };
38
-
39
- return routes.map((route) => {
40
- const updatedRoute: VueRouter.RouteRecordNormalized = {
41
- ...route,
42
- path: prefixPath(route.path),
43
- };
44
-
45
- // Prefix string redirects with basename
46
- if (typeof route.redirect === 'string') {
47
- updatedRoute.redirect = prefixPath(route.redirect);
48
- } else if (
49
- route.redirect &&
50
- typeof route.redirect === 'object' &&
51
- 'path' in route.redirect &&
52
- typeof route.redirect.path === 'string'
53
- ) {
54
- updatedRoute.redirect = {
55
- ...route.redirect,
56
- path: prefixPath(route.redirect.path),
57
- };
58
- }
59
-
60
- // Recursively process child routes
61
- if (route.children && route.children.length > 0) {
62
- updatedRoute.children = addBasenameToNestedRoutes(
63
- route.children as VueRouter.RouteRecordNormalized[],
64
- basename,
65
- );
66
- }
67
-
68
- return updatedRoute;
69
- });
70
- }
71
-
72
- /**
73
- * Create a patch function that rewrites path-based navigations to include
74
- * the basename prefix. This is needed because createWebHashHistory() does
75
- * not accept a basename argument, so router.push('/foo') would bypass the
76
- * prefixed route definitions.
77
- *
78
- * By patching push/replace/resolve *before* Vue Router resolves the
79
- * location we also avoid the "No match found" console warning.
80
- */
81
- function createHashBasenamePatch(
82
- basename: string,
83
- ): (router: VueRouter.Router) => void {
84
- const normalized = basename.replace(/\/+$/, '');
85
-
86
- /**
87
- * Only absolute paths (starting with '/') that don't already carry the
88
- * basename prefix need rewriting. Relative segments ('settings'),
89
- * query-only ('?tab=1'), and hash-only ('#anchor') strings are resolved
90
- * by Vue Router against the current route and must pass through untouched.
91
- */
92
- const needsPrefix = (path: string): boolean =>
93
- path.startsWith('/') &&
94
- path !== normalized &&
95
- !path.startsWith(normalized + '/');
96
-
97
- const prefix = (path: string): string =>
98
- `${normalized}${path}`.replace(/\/+/g, '/');
99
-
100
- const rewrite = (
101
- to: VueRouter.RouteLocationRaw,
102
- ): VueRouter.RouteLocationRaw => {
103
- if (typeof to === 'string') {
104
- return needsPrefix(to) ? prefix(to) : to;
105
- }
106
- if ('path' in to && typeof to.path === 'string' && needsPrefix(to.path)) {
107
- return { ...to, path: prefix(to.path) };
108
- }
109
- return to;
110
- };
111
-
112
- return (router) => {
113
- const originalPush = router.push.bind(router);
114
- const originalReplace = router.replace.bind(router);
115
- const originalResolve = router.resolve.bind(router);
116
-
117
- router.push = (to: VueRouter.RouteLocationRaw) => originalPush(rewrite(to));
118
- router.replace = (to: VueRouter.RouteLocationRaw) =>
119
- originalReplace(rewrite(to));
120
- router.resolve = ((to: VueRouter.RouteLocationRaw, ...rest: any[]) =>
121
- originalResolve(rewrite(to), ...rest)) as typeof router.resolve;
122
- };
123
- }
124
-
125
- /**
126
- * Route processing solution based on path analysis
127
- *
128
- * @param options - route processing options
129
- * @returns processed history and routes
130
- */
131
- export function processRoutes(
132
- options: RouteProcessingOptions,
133
- ): RouteProcessingResult {
134
- const { router, basename, memoryRoute, hashRoute } = options;
135
-
136
- // Sort routes, try to process parent route first
137
- const flatRoutes = router
138
- .getRoutes()
139
- .sort(
140
- (a, b) =>
141
- a.path.split('/').filter((p) => p).length -
142
- b.path.split('/').filter((p) => p).length,
143
- );
144
-
145
- // Use Map/Set for O(1) lookup performance
146
- const flatRoutesMap = new Map<string, VueRouter.RouteRecordNormalized>();
147
- const processedRoutes = new Set<VueRouter.RouteRecordNormalized>();
148
-
149
- flatRoutes.forEach((route) => {
150
- flatRoutesMap.set(route.path, route);
151
- });
152
-
153
- /**
154
- * Normalize path by removing double slashes and trailing slashes
155
- */
156
- const normalizePath = (prefix: string, childPath: string): string => {
157
- const fullPath = `${prefix}/${childPath}`;
158
- return fullPath.replace(/\/+/g, '/').replace(/\/$/, '') || '/';
159
- };
160
-
161
- const processChildren = (
162
- route: VueRouter.RouteRecordNormalized,
163
- prefix = '',
164
- ): VueRouter.RouteRecordNormalized => {
165
- if (!route.children || route.children.length === 0) {
166
- return route;
167
- }
168
-
169
- for (let j = 0; j < route.children.length; j++) {
170
- const child = route.children[j];
171
- const fullPath = normalizePath(prefix, child.path);
172
- const childRoute = flatRoutesMap.get(fullPath);
173
-
174
- if (childRoute && !processedRoutes.has(childRoute)) {
175
- // Create a new optimized route object with relative path for nested routes
176
- const relativeChildRoute: VueRouter.RouteRecordNormalized = {
177
- ...childRoute,
178
- path: child.path, // Keep the original relative path from static route
179
- };
180
-
181
- route.children[j] = relativeChildRoute;
182
- processedRoutes.add(childRoute);
183
-
184
- processChildren(relativeChildRoute, fullPath);
185
- }
186
- }
187
-
188
- return route;
189
- };
190
-
191
- // Reconstruct nested structure
192
- let routes: VueRouter.RouteRecordNormalized[] = [];
193
-
194
- for (const route of flatRoutes) {
195
- if (!processedRoutes.has(route)) {
196
- const processedRoute = processChildren(route, route.path);
197
- processedRoutes.add(route);
198
- routes.push(processedRoute);
199
- }
200
- }
201
-
202
- let history: VueRouter.RouterHistory;
203
- let patchRouter: ((router: VueRouter.Router) => void) | undefined;
204
-
205
- if (memoryRoute) {
206
- history = VueRouter.createMemoryHistory(basename);
207
- } else if (hashRoute) {
208
- history = VueRouter.createWebHashHistory();
209
- if (basename) {
210
- routes = addBasenameToNestedRoutes(routes, basename);
211
- patchRouter = createHashBasenamePatch(basename);
212
- }
213
- } else {
214
- history = VueRouter.createWebHistory(basename);
215
- }
216
-
217
- return { history, routes, patchRouter };
218
- }
package/src/style.css DELETED
@@ -1,79 +0,0 @@
1
- :root {
2
- font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3
- line-height: 1.5;
4
- font-weight: 400;
5
-
6
- color-scheme: light dark;
7
- color: rgba(255, 255, 255, 0.87);
8
- background-color: #242424;
9
-
10
- font-synthesis: none;
11
- text-rendering: optimizeLegibility;
12
- -webkit-font-smoothing: antialiased;
13
- -moz-osx-font-smoothing: grayscale;
14
- }
15
-
16
- a {
17
- font-weight: 500;
18
- color: #646cff;
19
- text-decoration: inherit;
20
- }
21
- a:hover {
22
- color: #535bf2;
23
- }
24
-
25
- body {
26
- margin: 0;
27
- display: flex;
28
- place-items: center;
29
- min-width: 320px;
30
- min-height: 100vh;
31
- }
32
-
33
- h1 {
34
- font-size: 3.2em;
35
- line-height: 1.1;
36
- }
37
-
38
- button {
39
- border-radius: 8px;
40
- border: 1px solid transparent;
41
- padding: 0.6em 1.2em;
42
- font-size: 1em;
43
- font-weight: 500;
44
- font-family: inherit;
45
- background-color: #1a1a1a;
46
- cursor: pointer;
47
- transition: border-color 0.25s;
48
- }
49
- button:hover {
50
- border-color: #646cff;
51
- }
52
- button:focus,
53
- button:focus-visible {
54
- outline: 4px auto -webkit-focus-ring-color;
55
- }
56
-
57
- .card {
58
- padding: 2em;
59
- }
60
-
61
- #app {
62
- max-width: 1280px;
63
- margin: 0 auto;
64
- padding: 2rem;
65
- text-align: center;
66
- }
67
-
68
- @media (prefers-color-scheme: light) {
69
- :root {
70
- color: #213547;
71
- background-color: #ffffff;
72
- }
73
- a:hover {
74
- color: #747bff;
75
- }
76
- button {
77
- background-color: #f9f9f9;
78
- }
79
- }
package/src/utils.ts DELETED
@@ -1,3 +0,0 @@
1
- import { createLogger } from '@module-federation/sdk';
2
-
3
- export const LoggerInstance = createLogger('[ Module Federation Bridge Vue3 ]');
package/src/vite-env.d.ts DELETED
@@ -1 +0,0 @@
1
- /// <reference types="vite/client" />
package/tsconfig.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "useDefineForClassFields": true,
4
-
5
- /* Bundler mode */
6
- "allowImportingTsExtensions": true,
7
- "resolveJsonModule": true,
8
- "isolatedModules": true,
9
- "jsxImportSource": "vue",
10
-
11
- /* Linting */
12
- "noUnusedLocals": true,
13
- "noUnusedParameters": true,
14
- "noFallthroughCasesInSwitch": true,
15
- "declaration": true,
16
- "emitDeclarationOnly": true,
17
- "outDir": "dist",
18
- "skipLibCheck": true,
19
- "strict": true,
20
- "moduleResolution": "node",
21
- "target": "esnext",
22
- "module": "esnext",
23
- "lib": ["esnext", "dom"],
24
- "jsx": "preserve",
25
- "esModuleInterop": true,
26
- "allowSyntheticDefaultImports": true,
27
- "sourceMap": true,
28
- "baseUrl": ".",
29
- "paths": {
30
- "@/*": ["src/*"]
31
- }
32
- },
33
- "include": [
34
- "src/**/*.ts",
35
- "src/**/*.tsx",
36
- "src/**/*.vue",
37
- "src/remoteApp.tsx",
38
- "src/create.ts"
39
- ],
40
- "references": [{ "path": "./tsconfig.node.json" }]
41
- }