@stubborn-sh/publisher 0.0.3

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.cjs ADDED
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ContractPublisher: () => ContractPublisher,
24
+ detectContentType: () => detectContentType,
25
+ knownExtensions: () => knownExtensions,
26
+ scanContracts: () => scanContracts
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+
30
+ // src/scanner.ts
31
+ var import_promises = require("fs/promises");
32
+ var import_node_path = require("path");
33
+
34
+ // src/content-type.ts
35
+ var EXTENSION_MAP = /* @__PURE__ */ new Map([
36
+ [".yaml", "application/x-yaml"],
37
+ [".yml", "application/x-yaml"],
38
+ [".json", "application/json"],
39
+ [".groovy", "application/x-groovy"],
40
+ [".kts", "application/x-kotlin"],
41
+ [".kt", "application/x-kotlin"],
42
+ [".java", "text/x-java-source"]
43
+ ]);
44
+ function detectContentType(filename) {
45
+ if (filename === "") {
46
+ return null;
47
+ }
48
+ const lastDot = filename.lastIndexOf(".");
49
+ if (lastDot === -1) {
50
+ return null;
51
+ }
52
+ const ext = filename.slice(lastDot).toLowerCase();
53
+ return EXTENSION_MAP.get(ext) ?? null;
54
+ }
55
+ function knownExtensions() {
56
+ return [...EXTENSION_MAP.keys()];
57
+ }
58
+
59
+ // src/scanner.ts
60
+ async function scanContracts(directory) {
61
+ const extensions = new Set(knownExtensions());
62
+ const contracts = [];
63
+ await walk(directory, directory, extensions, contracts);
64
+ return contracts;
65
+ }
66
+ async function walk(rootDir, currentDir, extensions, contracts) {
67
+ const entries = await (0, import_promises.readdir)(currentDir, { withFileTypes: true });
68
+ for (const entry of entries) {
69
+ const fullPath = (0, import_node_path.join)(currentDir, entry.name);
70
+ if (entry.isDirectory()) {
71
+ await walk(rootDir, fullPath, extensions, contracts);
72
+ continue;
73
+ }
74
+ if (!entry.isFile()) {
75
+ continue;
76
+ }
77
+ const contentType = detectContentType(entry.name);
78
+ if (contentType === null) {
79
+ continue;
80
+ }
81
+ const content = await (0, import_promises.readFile)(fullPath, "utf-8");
82
+ const contractName = (0, import_node_path.relative)(rootDir, fullPath).replace(/\\/g, "/");
83
+ contracts.push({ contractName, content, contentType });
84
+ }
85
+ }
86
+
87
+ // src/publisher.ts
88
+ var ContractPublisher = class {
89
+ client;
90
+ constructor(client) {
91
+ this.client = client;
92
+ }
93
+ /**
94
+ * Scan a directory for contracts and publish them to the broker.
95
+ * Returns published contracts and any errors encountered.
96
+ */
97
+ async publish(options) {
98
+ const scanned = await scanContracts(options.contractsDir);
99
+ if (scanned.length === 0) {
100
+ return { published: [], errors: [] };
101
+ }
102
+ const published = [];
103
+ const errors = [];
104
+ for (const contract of scanned) {
105
+ try {
106
+ const result = await this.client.publishContract(options.applicationName, options.version, {
107
+ contractName: contract.contractName,
108
+ content: contract.content,
109
+ contentType: contract.contentType
110
+ });
111
+ published.push(result);
112
+ } catch (err) {
113
+ errors.push({
114
+ contractName: contract.contractName,
115
+ error: err instanceof Error ? err : new Error(String(err))
116
+ });
117
+ }
118
+ }
119
+ return { published, errors };
120
+ }
121
+ /**
122
+ * Publish a single pre-scanned contract.
123
+ */
124
+ async publishOne(applicationName, version, contract) {
125
+ return this.client.publishContract(applicationName, version, {
126
+ contractName: contract.contractName,
127
+ content: contract.content,
128
+ contentType: contract.contentType
129
+ });
130
+ }
131
+ };
132
+ // Annotate the CommonJS export names for ESM import in node:
133
+ 0 && (module.exports = {
134
+ ContractPublisher,
135
+ detectContentType,
136
+ knownExtensions,
137
+ scanContracts
138
+ });
139
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/scanner.ts","../src/content-type.ts","../src/publisher.ts"],"sourcesContent":["export { ContractPublisher } from \"./publisher.js\";\r\nexport type { PublishOptions, PublishResult, PublishError } from \"./publisher.js\";\r\nexport { scanContracts } from \"./scanner.js\";\r\nexport type { ScannedContract } from \"./scanner.js\";\r\nexport { detectContentType, knownExtensions } from \"./content-type.js\";\r\n","import { readdir, readFile } from \"node:fs/promises\";\r\nimport { join, relative } from \"node:path\";\r\nimport { detectContentType, knownExtensions } from \"./content-type.js\";\r\n\r\n/** A contract file discovered by the scanner. */\r\nexport interface ScannedContract {\r\n /** Relative path from the scan root (used as contractName). */\r\n readonly contractName: string;\r\n /** Raw file content as a string. */\r\n readonly content: string;\r\n /** Detected content type (e.g., \"application/x-yaml\"). */\r\n readonly contentType: string;\r\n}\r\n\r\n/**\r\n * Recursively scan a directory for contract files.\r\n * Only files with known contract extensions are included.\r\n */\r\nexport async function scanContracts(directory: string): Promise<readonly ScannedContract[]> {\r\n const extensions = new Set(knownExtensions());\r\n const contracts: ScannedContract[] = [];\r\n\r\n await walk(directory, directory, extensions, contracts);\r\n\r\n return contracts;\r\n}\r\n\r\nasync function walk(\r\n rootDir: string,\r\n currentDir: string,\r\n extensions: ReadonlySet<string>,\r\n contracts: ScannedContract[],\r\n): Promise<void> {\r\n const entries = await readdir(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n await walk(rootDir, fullPath, extensions, contracts);\r\n continue;\r\n }\r\n\r\n if (!entry.isFile()) {\r\n continue;\r\n }\r\n\r\n const contentType = detectContentType(entry.name);\r\n if (contentType === null) {\r\n continue;\r\n }\r\n\r\n const content = await readFile(fullPath, \"utf-8\");\r\n const contractName = relative(rootDir, fullPath).replace(/\\\\/g, \"/\");\r\n\r\n contracts.push({ contractName, content, contentType });\r\n }\r\n}\r\n","const EXTENSION_MAP: ReadonlyMap<string, string> = new Map([\r\n [\".yaml\", \"application/x-yaml\"],\r\n [\".yml\", \"application/x-yaml\"],\r\n [\".json\", \"application/json\"],\r\n [\".groovy\", \"application/x-groovy\"],\r\n [\".kts\", \"application/x-kotlin\"],\r\n [\".kt\", \"application/x-kotlin\"],\r\n [\".java\", \"text/x-java-source\"],\r\n]);\r\n\r\n/**\r\n * Detect the content type of a contract file based on its extension.\r\n * Returns null for unknown extensions.\r\n */\r\nexport function detectContentType(filename: string): string | null {\r\n if (filename === \"\") {\r\n return null;\r\n }\r\n const lastDot = filename.lastIndexOf(\".\");\r\n if (lastDot === -1) {\r\n return null;\r\n }\r\n const ext = filename.slice(lastDot).toLowerCase();\r\n return EXTENSION_MAP.get(ext) ?? null;\r\n}\r\n\r\n/** Get all known contract file extensions. */\r\nexport function knownExtensions(): readonly string[] {\r\n return [...EXTENSION_MAP.keys()];\r\n}\r\n","import type { BrokerClient, ContractResponse } from \"@stubborn-sh/broker-client\";\r\nimport type { ScannedContract } from \"./scanner.js\";\r\nimport { scanContracts } from \"./scanner.js\";\r\n\r\n/** Options for publishing contracts. */\r\nexport interface PublishOptions {\r\n /** Application name to publish contracts for. */\r\n readonly applicationName: string;\r\n /** Version of the application. */\r\n readonly version: string;\r\n /** Directory containing contract files. */\r\n readonly contractsDir: string;\r\n}\r\n\r\n/** Result of a publish operation. */\r\nexport interface PublishResult {\r\n readonly published: readonly ContractResponse[];\r\n readonly errors: readonly PublishError[];\r\n}\r\n\r\n/** A single contract publish failure. */\r\nexport interface PublishError {\r\n readonly contractName: string;\r\n readonly error: Error;\r\n}\r\n\r\n/** Publishes contracts from a directory to the broker. */\r\nexport class ContractPublisher {\r\n private readonly client: BrokerClient;\r\n\r\n constructor(client: BrokerClient) {\r\n this.client = client;\r\n }\r\n\r\n /**\r\n * Scan a directory for contracts and publish them to the broker.\r\n * Returns published contracts and any errors encountered.\r\n */\r\n async publish(options: PublishOptions): Promise<PublishResult> {\r\n const scanned = await scanContracts(options.contractsDir);\r\n\r\n if (scanned.length === 0) {\r\n return { published: [], errors: [] };\r\n }\r\n\r\n const published: ContractResponse[] = [];\r\n const errors: PublishError[] = [];\r\n\r\n for (const contract of scanned) {\r\n try {\r\n const result = await this.client.publishContract(options.applicationName, options.version, {\r\n contractName: contract.contractName,\r\n content: contract.content,\r\n contentType: contract.contentType,\r\n });\r\n published.push(result);\r\n } catch (err: unknown) {\r\n errors.push({\r\n contractName: contract.contractName,\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }\r\n\r\n return { published, errors };\r\n }\r\n\r\n /**\r\n * Publish a single pre-scanned contract.\r\n */\r\n async publishOne(\r\n applicationName: string,\r\n version: string,\r\n contract: ScannedContract,\r\n ): Promise<ContractResponse> {\r\n return this.client.publishContract(applicationName, version, {\r\n contractName: contract.contractName,\r\n content: contract.content,\r\n contentType: contract.contentType,\r\n });\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ // src/scanner.ts
2
+ import { readdir, readFile } from "fs/promises";
3
+ import { join, relative } from "path";
4
+
5
+ // src/content-type.ts
6
+ var EXTENSION_MAP = /* @__PURE__ */ new Map([
7
+ [".yaml", "application/x-yaml"],
8
+ [".yml", "application/x-yaml"],
9
+ [".json", "application/json"],
10
+ [".groovy", "application/x-groovy"],
11
+ [".kts", "application/x-kotlin"],
12
+ [".kt", "application/x-kotlin"],
13
+ [".java", "text/x-java-source"]
14
+ ]);
15
+ function detectContentType(filename) {
16
+ if (filename === "") {
17
+ return null;
18
+ }
19
+ const lastDot = filename.lastIndexOf(".");
20
+ if (lastDot === -1) {
21
+ return null;
22
+ }
23
+ const ext = filename.slice(lastDot).toLowerCase();
24
+ return EXTENSION_MAP.get(ext) ?? null;
25
+ }
26
+ function knownExtensions() {
27
+ return [...EXTENSION_MAP.keys()];
28
+ }
29
+
30
+ // src/scanner.ts
31
+ async function scanContracts(directory) {
32
+ const extensions = new Set(knownExtensions());
33
+ const contracts = [];
34
+ await walk(directory, directory, extensions, contracts);
35
+ return contracts;
36
+ }
37
+ async function walk(rootDir, currentDir, extensions, contracts) {
38
+ const entries = await readdir(currentDir, { withFileTypes: true });
39
+ for (const entry of entries) {
40
+ const fullPath = join(currentDir, entry.name);
41
+ if (entry.isDirectory()) {
42
+ await walk(rootDir, fullPath, extensions, contracts);
43
+ continue;
44
+ }
45
+ if (!entry.isFile()) {
46
+ continue;
47
+ }
48
+ const contentType = detectContentType(entry.name);
49
+ if (contentType === null) {
50
+ continue;
51
+ }
52
+ const content = await readFile(fullPath, "utf-8");
53
+ const contractName = relative(rootDir, fullPath).replace(/\\/g, "/");
54
+ contracts.push({ contractName, content, contentType });
55
+ }
56
+ }
57
+
58
+ // src/publisher.ts
59
+ var ContractPublisher = class {
60
+ client;
61
+ constructor(client) {
62
+ this.client = client;
63
+ }
64
+ /**
65
+ * Scan a directory for contracts and publish them to the broker.
66
+ * Returns published contracts and any errors encountered.
67
+ */
68
+ async publish(options) {
69
+ const scanned = await scanContracts(options.contractsDir);
70
+ if (scanned.length === 0) {
71
+ return { published: [], errors: [] };
72
+ }
73
+ const published = [];
74
+ const errors = [];
75
+ for (const contract of scanned) {
76
+ try {
77
+ const result = await this.client.publishContract(options.applicationName, options.version, {
78
+ contractName: contract.contractName,
79
+ content: contract.content,
80
+ contentType: contract.contentType
81
+ });
82
+ published.push(result);
83
+ } catch (err) {
84
+ errors.push({
85
+ contractName: contract.contractName,
86
+ error: err instanceof Error ? err : new Error(String(err))
87
+ });
88
+ }
89
+ }
90
+ return { published, errors };
91
+ }
92
+ /**
93
+ * Publish a single pre-scanned contract.
94
+ */
95
+ async publishOne(applicationName, version, contract) {
96
+ return this.client.publishContract(applicationName, version, {
97
+ contractName: contract.contractName,
98
+ content: contract.content,
99
+ contentType: contract.contentType
100
+ });
101
+ }
102
+ };
103
+ export {
104
+ ContractPublisher,
105
+ detectContentType,
106
+ knownExtensions,
107
+ scanContracts
108
+ };
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scanner.ts","../src/content-type.ts","../src/publisher.ts"],"sourcesContent":["import { readdir, readFile } from \"node:fs/promises\";\r\nimport { join, relative } from \"node:path\";\r\nimport { detectContentType, knownExtensions } from \"./content-type.js\";\r\n\r\n/** A contract file discovered by the scanner. */\r\nexport interface ScannedContract {\r\n /** Relative path from the scan root (used as contractName). */\r\n readonly contractName: string;\r\n /** Raw file content as a string. */\r\n readonly content: string;\r\n /** Detected content type (e.g., \"application/x-yaml\"). */\r\n readonly contentType: string;\r\n}\r\n\r\n/**\r\n * Recursively scan a directory for contract files.\r\n * Only files with known contract extensions are included.\r\n */\r\nexport async function scanContracts(directory: string): Promise<readonly ScannedContract[]> {\r\n const extensions = new Set(knownExtensions());\r\n const contracts: ScannedContract[] = [];\r\n\r\n await walk(directory, directory, extensions, contracts);\r\n\r\n return contracts;\r\n}\r\n\r\nasync function walk(\r\n rootDir: string,\r\n currentDir: string,\r\n extensions: ReadonlySet<string>,\r\n contracts: ScannedContract[],\r\n): Promise<void> {\r\n const entries = await readdir(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n await walk(rootDir, fullPath, extensions, contracts);\r\n continue;\r\n }\r\n\r\n if (!entry.isFile()) {\r\n continue;\r\n }\r\n\r\n const contentType = detectContentType(entry.name);\r\n if (contentType === null) {\r\n continue;\r\n }\r\n\r\n const content = await readFile(fullPath, \"utf-8\");\r\n const contractName = relative(rootDir, fullPath).replace(/\\\\/g, \"/\");\r\n\r\n contracts.push({ contractName, content, contentType });\r\n }\r\n}\r\n","const EXTENSION_MAP: ReadonlyMap<string, string> = new Map([\r\n [\".yaml\", \"application/x-yaml\"],\r\n [\".yml\", \"application/x-yaml\"],\r\n [\".json\", \"application/json\"],\r\n [\".groovy\", \"application/x-groovy\"],\r\n [\".kts\", \"application/x-kotlin\"],\r\n [\".kt\", \"application/x-kotlin\"],\r\n [\".java\", \"text/x-java-source\"],\r\n]);\r\n\r\n/**\r\n * Detect the content type of a contract file based on its extension.\r\n * Returns null for unknown extensions.\r\n */\r\nexport function detectContentType(filename: string): string | null {\r\n if (filename === \"\") {\r\n return null;\r\n }\r\n const lastDot = filename.lastIndexOf(\".\");\r\n if (lastDot === -1) {\r\n return null;\r\n }\r\n const ext = filename.slice(lastDot).toLowerCase();\r\n return EXTENSION_MAP.get(ext) ?? null;\r\n}\r\n\r\n/** Get all known contract file extensions. */\r\nexport function knownExtensions(): readonly string[] {\r\n return [...EXTENSION_MAP.keys()];\r\n}\r\n","import type { BrokerClient, ContractResponse } from \"@stubborn-sh/broker-client\";\r\nimport type { ScannedContract } from \"./scanner.js\";\r\nimport { scanContracts } from \"./scanner.js\";\r\n\r\n/** Options for publishing contracts. */\r\nexport interface PublishOptions {\r\n /** Application name to publish contracts for. */\r\n readonly applicationName: string;\r\n /** Version of the application. */\r\n readonly version: string;\r\n /** Directory containing contract files. */\r\n readonly contractsDir: string;\r\n}\r\n\r\n/** Result of a publish operation. */\r\nexport interface PublishResult {\r\n readonly published: readonly ContractResponse[];\r\n readonly errors: readonly PublishError[];\r\n}\r\n\r\n/** A single contract publish failure. */\r\nexport interface PublishError {\r\n readonly contractName: string;\r\n readonly error: Error;\r\n}\r\n\r\n/** Publishes contracts from a directory to the broker. */\r\nexport class ContractPublisher {\r\n private readonly client: BrokerClient;\r\n\r\n constructor(client: BrokerClient) {\r\n this.client = client;\r\n }\r\n\r\n /**\r\n * Scan a directory for contracts and publish them to the broker.\r\n * Returns published contracts and any errors encountered.\r\n */\r\n async publish(options: PublishOptions): Promise<PublishResult> {\r\n const scanned = await scanContracts(options.contractsDir);\r\n\r\n if (scanned.length === 0) {\r\n return { published: [], errors: [] };\r\n }\r\n\r\n const published: ContractResponse[] = [];\r\n const errors: PublishError[] = [];\r\n\r\n for (const contract of scanned) {\r\n try {\r\n const result = await this.client.publishContract(options.applicationName, options.version, {\r\n contractName: contract.contractName,\r\n content: contract.content,\r\n contentType: contract.contentType,\r\n });\r\n published.push(result);\r\n } catch (err: unknown) {\r\n errors.push({\r\n contractName: contract.contractName,\r\n error: err instanceof Error ? err : new Error(String(err)),\r\n });\r\n }\r\n }\r\n\r\n return { published, errors };\r\n }\r\n\r\n /**\r\n * Publish a single pre-scanned contract.\r\n */\r\n async publishOne(\r\n applicationName: string,\r\n version: string,\r\n contract: ScannedContract,\r\n ): Promise<ContractResponse> {\r\n return this.client.publishContract(applicationName, version, {\r\n contractName: contract.contractName,\r\n content: contract.content,\r\n contentType: contract.contentType,\r\n });\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@stubborn-sh/publisher",
3
+ "version": "0.0.3",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.cjs"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "typecheck": "tsc --noEmit"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "dependencies": {
25
+ "@stubborn-sh/broker-client": "0.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "tsup": "^8.4.0"
29
+ }
30
+ }