@typespec/bundler 0.1.0-alpha.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.
@@ -0,0 +1,34 @@
1
+ export interface TypeSpecBundleDefinition {
2
+ path: string;
3
+ main: string;
4
+ packageJson: PackageJson;
5
+ exports: Record<string, string>;
6
+ }
7
+ export interface TypeSpecBundle {
8
+ /**
9
+ * Definition
10
+ */
11
+ definition: TypeSpecBundleDefinition;
12
+ /**
13
+ * Bundle content
14
+ */
15
+ files: TypeSpecBundleFile[];
16
+ }
17
+ export interface TypeSpecBundleFile {
18
+ export?: string;
19
+ filename: string;
20
+ content: string;
21
+ }
22
+ interface PackageJson {
23
+ name: string;
24
+ main: string;
25
+ tspMain?: string;
26
+ peerDependencies: string[];
27
+ dependencies: string[];
28
+ exports?: Record<string, string>;
29
+ }
30
+ export declare function createTypeSpecBundle(libraryPath: string): Promise<TypeSpecBundle>;
31
+ export declare function watchTypeSpecBundle(libraryPath: string, onBundle: (bundle: TypeSpecBundle) => void): Promise<void>;
32
+ export declare function bundleTypeSpecLibrary(libraryPath: string, outputDir: string): Promise<void>;
33
+ export {};
34
+ //# sourceMappingURL=bundler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../../src/bundler.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,UAAU,EAAE,wBAAwB,CAAC;IAErC;;OAEG;IACH,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUvF;AAED,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,iBA8B3C;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAMjF"}
@@ -0,0 +1,171 @@
1
+ import commonjs from "@rollup/plugin-commonjs";
2
+ import json from "@rollup/plugin-json";
3
+ import nodeResolve from "@rollup/plugin-node-resolve";
4
+ import virtual from "@rollup/plugin-virtual";
5
+ import { compile, getNormalizedAbsolutePath, joinPaths, NodeHost, normalizePath, } from "@typespec/compiler";
6
+ import { mkdir, readFile, realpath, writeFile } from "fs/promises";
7
+ import { basename, join, resolve } from "path";
8
+ import { rollup, watch } from "rollup";
9
+ import { relativeTo } from "./utils.js";
10
+ export async function createTypeSpecBundle(libraryPath) {
11
+ const definition = await resolveTypeSpecBundleDefinition(libraryPath);
12
+ const rollupOptions = await createRollupConfig(definition);
13
+ const bundle = await rollup(rollupOptions);
14
+ try {
15
+ return generateTypeSpecBundle(definition, bundle);
16
+ }
17
+ finally {
18
+ await bundle.close();
19
+ }
20
+ }
21
+ export async function watchTypeSpecBundle(libraryPath, onBundle) {
22
+ const definition = await resolveTypeSpecBundleDefinition(libraryPath);
23
+ const rollupOptions = await createRollupConfig(definition);
24
+ const watcher = watch({
25
+ ...rollupOptions,
26
+ watch: {
27
+ skipWrite: true,
28
+ },
29
+ });
30
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
31
+ watcher.on("event", async (event) => {
32
+ var _a;
33
+ switch (event.code) {
34
+ case "BUNDLE_START":
35
+ break;
36
+ case "BUNDLE_END":
37
+ try {
38
+ const typespecBundle = await generateTypeSpecBundle(definition, event.result);
39
+ onBundle(typespecBundle);
40
+ }
41
+ finally {
42
+ await event.result.close();
43
+ }
44
+ break;
45
+ case "ERROR":
46
+ // eslint-disable-next-line no-console
47
+ console.error("Error bundling", event.error);
48
+ await ((_a = event.result) === null || _a === void 0 ? void 0 : _a.close());
49
+ }
50
+ });
51
+ }
52
+ export async function bundleTypeSpecLibrary(libraryPath, outputDir) {
53
+ const bundle = await createTypeSpecBundle(libraryPath);
54
+ await mkdir(outputDir, { recursive: true });
55
+ for (const file of bundle.files) {
56
+ await writeFile(joinPaths(outputDir, file.filename), file.content);
57
+ }
58
+ }
59
+ async function resolveTypeSpecBundleDefinition(libraryPath) {
60
+ libraryPath = normalizePath(await realpath(libraryPath));
61
+ const pkg = await readLibraryPackageJson(libraryPath);
62
+ const exports = pkg.exports
63
+ ? Object.fromEntries(Object.entries(pkg.exports).filter(([k, v]) => k !== "." && k !== "./testing"))
64
+ : {};
65
+ return {
66
+ path: libraryPath,
67
+ main: pkg.main,
68
+ exports,
69
+ packageJson: pkg,
70
+ };
71
+ }
72
+ async function createRollupConfig(definition) {
73
+ const libraryPath = definition.path;
74
+ const program = await compile(NodeHost, libraryPath, {
75
+ noEmit: true,
76
+ });
77
+ const jsFiles = [];
78
+ for (const file of program.jsSourceFiles.keys()) {
79
+ if (file.startsWith(libraryPath)) {
80
+ jsFiles.push(file);
81
+ }
82
+ }
83
+ const typespecFiles = {
84
+ [normalizePath(join(libraryPath, "package.json"))]: JSON.stringify(definition.packageJson),
85
+ };
86
+ for (const [filename, sourceFile] of program.sourceFiles) {
87
+ typespecFiles[filename] = sourceFile.file.text;
88
+ }
89
+ const content = createBundleEntrypoint({
90
+ libraryPath,
91
+ mainFile: definition.main,
92
+ jsSourceFileNames: jsFiles,
93
+ typespecSourceFiles: typespecFiles,
94
+ });
95
+ const extraEntry = Object.fromEntries(Object.entries(definition.exports).map(([key, value]) => {
96
+ return [key.replace("./", ""), normalizePath(resolve(libraryPath, value))];
97
+ }));
98
+ return {
99
+ input: {
100
+ index: "entry.js",
101
+ ...extraEntry,
102
+ },
103
+ output: {
104
+ esModule: true,
105
+ },
106
+ plugins: [
107
+ virtual({
108
+ "entry.js": content,
109
+ }),
110
+ commonjs(),
111
+ json(),
112
+ nodeResolve({ preferBuiltins: true, browser: true }),
113
+ ],
114
+ external: (id) => {
115
+ return (definition.packageJson.peerDependencies &&
116
+ !!Object.keys(definition.packageJson.peerDependencies).find((x) => id.startsWith(x)));
117
+ },
118
+ onwarn: (warning, warn) => {
119
+ if (warning.code === "THIS_IS_UNDEFINED" || warning.code === "CIRCULAR_DEPENDENCY") {
120
+ return;
121
+ }
122
+ warn(warning);
123
+ },
124
+ };
125
+ }
126
+ async function generateTypeSpecBundle(definition, bundle) {
127
+ const { output } = await bundle.generate({
128
+ dir: "virtual",
129
+ });
130
+ return {
131
+ definition,
132
+ files: output
133
+ .filter((x) => "code" in x)
134
+ .map((chunk) => {
135
+ return {
136
+ filename: chunk.fileName,
137
+ content: chunk.code,
138
+ export: definition.exports[basename(chunk.fileName)],
139
+ };
140
+ }),
141
+ };
142
+ }
143
+ async function readLibraryPackageJson(path) {
144
+ const file = await readFile(join(path, "package.json"));
145
+ return JSON.parse(file.toString());
146
+ }
147
+ /**
148
+ * Create a virtual JS file being the entrypoint of the bundle.
149
+ */
150
+ function createBundleEntrypoint({ libraryPath, mainFile, jsSourceFileNames, typespecSourceFiles, }) {
151
+ const absoluteMain = normalizePath(resolve(libraryPath, mainFile));
152
+ const relativeTypeSpecFiles = {};
153
+ for (const [name, content] of Object.entries(typespecSourceFiles)) {
154
+ relativeTypeSpecFiles[relativeTo(libraryPath, name)] = content;
155
+ getNormalizedAbsolutePath;
156
+ }
157
+ return [
158
+ `export * from "${absoluteMain}";`,
159
+ ...jsSourceFileNames.map((x, i) => `import * as f${i} from "${x}";`),
160
+ "",
161
+ `const TypeSpecJSSources = {`,
162
+ ...jsSourceFileNames.map((x, i) => `"${relativeTo(libraryPath, x)}": f${i},`),
163
+ "};",
164
+ `const TypeSpecSources = ${JSON.stringify(relativeTypeSpecFiles, null, 2)};`,
165
+ "export const _TypeSpecLibrary_ = {",
166
+ " jsSourceFiles: TypeSpecJSSources,",
167
+ " typespecSourceFiles: TypeSpecSources,",
168
+ "};",
169
+ ].join("\n");
170
+ }
171
+ //# sourceMappingURL=bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../src/bundler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ // Use bundler via cli.
2
+ // Todo.
3
+ import { resolve } from "path";
4
+ import { bundleTypeSpecLibrary } from "./bundler.js";
5
+ const name = process.argv[2];
6
+ const libraryPath = resolve(`../${name}`);
7
+ bundleTypeSpecLibrary(libraryPath, resolve(process.cwd(), "output")).catch((e) => {
8
+ // eslint-disable-next-line no-console
9
+ console.error(e);
10
+ process.exit(1);
11
+ });
12
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,QAAQ;AAER,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC1C,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAC/E,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./bundler.js";
2
+ export * from "./vite-plugin.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./bundler.js";
2
+ export * from "./vite-plugin.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function relativeTo(from: string, to: string): string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAElD"}
@@ -0,0 +1,6 @@
1
+ import { normalizePath } from "@typespec/compiler";
2
+ import { relative } from "path";
3
+ export function relativeTo(from, to) {
4
+ return normalizePath(relative(from, to));
5
+ }
6
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,EAAU;IACjD,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Plugin } from "vite";
2
+ export interface TypeSpecBundlePluginOptions {
3
+ folderName: string;
4
+ /**
5
+ * Name of libraries to bundle.
6
+ */
7
+ libraries: string[];
8
+ }
9
+ export declare function typespecBundlePlugin(options: TypeSpecBundlePluginOptions): Plugin;
10
+ //# sourceMappingURL=vite-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA6B,MAAM,EAAkB,MAAM,MAAM,CAAC;AAQ9E,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CA+FjF"}
@@ -0,0 +1,112 @@
1
+ import { resolvePath } from "@typespec/compiler";
2
+ import { resolve } from "path";
3
+ import { createTypeSpecBundle, watchTypeSpecBundle, } from "./bundler.js";
4
+ export function typespecBundlePlugin(options) {
5
+ let config;
6
+ const definitions = {};
7
+ const bundles = {};
8
+ return {
9
+ name: "typespec-bundle",
10
+ enforce: "pre",
11
+ async configResolved(c) {
12
+ config = c;
13
+ },
14
+ async buildStart() {
15
+ for (const name of options.libraries) {
16
+ const bundle = await bundleLibrary(config.root, name);
17
+ bundles[name] = bundle;
18
+ definitions[name] = bundle.definition;
19
+ }
20
+ },
21
+ async configureServer(server) {
22
+ for (const library of options.libraries) {
23
+ await watchBundleLibrary(config.root, library, (bundle) => {
24
+ bundles[library] = bundle;
25
+ definitions[library] = bundle.definition;
26
+ server.ws.send({ type: "full-reload" });
27
+ });
28
+ }
29
+ server.middlewares.use((req, res, next) => {
30
+ const id = req.url;
31
+ if (id === undefined) {
32
+ next();
33
+ return;
34
+ }
35
+ const start = `/${options.folderName}/`;
36
+ const resolveFilename = (path) => {
37
+ if (path === "") {
38
+ return "index.js";
39
+ }
40
+ else {
41
+ return `${path}.js`;
42
+ }
43
+ };
44
+ const findPkgName = (id) => {
45
+ const segments = id.slice(start.length, -".js".length).split("/");
46
+ if (bundles[segments[0]]) {
47
+ return [segments[0], resolveFilename(segments.slice(1).join("/"))];
48
+ }
49
+ const inFolder = segments[0] + "/" + segments[1];
50
+ if (bundles[inFolder]) {
51
+ return [inFolder, resolveFilename(segments.slice(2).join("/"))];
52
+ }
53
+ return undefined;
54
+ };
55
+ if (id.startsWith(start) && id.endsWith(".js")) {
56
+ const found = findPkgName(id);
57
+ if (found) {
58
+ const [pkgId, path] = found;
59
+ const file = bundles[pkgId].files.find((x) => x.filename === path);
60
+ if (file) {
61
+ res.writeHead(200, "Ok", { "Content-Type": "application/javascript" });
62
+ res.write(file.content);
63
+ res.end();
64
+ return;
65
+ }
66
+ }
67
+ }
68
+ next();
69
+ });
70
+ },
71
+ async generateBundle() {
72
+ for (const name of options.libraries) {
73
+ for (const file of bundles[name].files) {
74
+ this.emitFile({
75
+ type: "asset",
76
+ fileName: `${options.folderName}/${name}/${file.filename}`,
77
+ source: file.content,
78
+ });
79
+ }
80
+ }
81
+ },
82
+ transformIndexHtml: {
83
+ enforce: "post",
84
+ transform: (html, ctx) => {
85
+ // Inject the importmap before the html script. Cannot just use injectTo:head-prepend as vite will inject its own script before that and cause a failure.
86
+ const importMapTag = `<script type="importmap">\n${JSON.stringify(createImportMap(options.folderName, definitions), null, 2)}\n</script>`;
87
+ return html.replace("<html", importMapTag + "\n<html");
88
+ },
89
+ },
90
+ };
91
+ }
92
+ function createImportMap(folderName, definitions) {
93
+ const imports = {};
94
+ for (const [library, definition] of Object.entries(definitions)) {
95
+ imports[library] = `./${folderName}/${library}/index.js`;
96
+ for (const name of Object.keys(definition.exports)) {
97
+ imports[resolvePath(library, name)] =
98
+ "./" + resolvePath(`./${folderName}/${library}`, name) + ".js";
99
+ }
100
+ }
101
+ const importMap = {
102
+ imports: imports,
103
+ };
104
+ return importMap;
105
+ }
106
+ async function bundleLibrary(projectRoot, name) {
107
+ return await createTypeSpecBundle(resolve(projectRoot, "node_modules", name));
108
+ }
109
+ async function watchBundleLibrary(projectRoot, name, onChange) {
110
+ return await watchTypeSpecBundle(resolve(projectRoot, "node_modules", name), onChange);
111
+ }
112
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/vite-plugin.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@typespec/bundler",
3
+ "version": "0.1.0-alpha.0",
4
+ "author": "Microsoft Corporation",
5
+ "description": "Package to bundle a typespec library.",
6
+ "homepage": "https://microsoft.github.io/typespec",
7
+ "readme": "https://github.com/microsoft/typespec/blob/master/README.md",
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/microsoft/typespec.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/microsoft/typespec/issues"
15
+ },
16
+ "keywords": [
17
+ "typespec"
18
+ ],
19
+ "type": "module",
20
+ "main": "dist/src/index.js",
21
+ "tspMain": "dist/src/index.js",
22
+ "engines": {
23
+ "node": ">=16.0.0"
24
+ },
25
+ "files": [
26
+ "lib/*.tsp",
27
+ "dist/**",
28
+ "!dist/test/**"
29
+ ],
30
+ "dependencies": {
31
+ "@typespec/compiler": "~0.48.1",
32
+ "@rollup/plugin-virtual": "~3.0.1",
33
+ "@rollup/plugin-commonjs": "~25.0.4",
34
+ "@rollup/plugin-json": "~6.0.0",
35
+ "@rollup/plugin-node-resolve": "~15.2.1",
36
+ "@rollup/plugin-multi-entry": "~6.0.0",
37
+ "rollup": "~3.29.2",
38
+ "@rollup/plugin-alias": "~5.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/mocha": "~10.0.1",
42
+ "@types/node": "~18.11.9",
43
+ "@typespec/eslint-config-typespec": "~0.48.0",
44
+ "eslint": "^8.49.0",
45
+ "mocha": "~10.2.0",
46
+ "mocha-junit-reporter": "~2.2.1",
47
+ "mocha-multi-reporters": "~1.5.1",
48
+ "c8": "~8.0.1",
49
+ "rimraf": "~5.0.1",
50
+ "typescript": "~5.2.2",
51
+ "vite": "^4.4.9"
52
+ },
53
+ "scripts": {
54
+ "bundle": "node ./dist/src/cli.js",
55
+ "clean": "rimraf ./dist ./temp",
56
+ "build": "tsc -p .",
57
+ "watch": "tsc -p . --watch",
58
+ "test": "mocha",
59
+ "test-official": "c8 mocha --forbid-only --reporter mocha-multi-reporters",
60
+ "lint": "eslint . --ext .ts --max-warnings=0",
61
+ "lint:fix": "eslint . --fix --ext .ts"
62
+ }
63
+ }