@streamfox/create-streamfox-plugin 0.3.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.
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/cli.cjs +637 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +614 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +459 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +420 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
|
|
31
|
+
// src/index.ts
|
|
32
|
+
var index_exports = {};
|
|
33
|
+
__export(index_exports, {
|
|
34
|
+
CAPABILITIES: () => CAPABILITIES,
|
|
35
|
+
DEFAULT_PRESET: () => DEFAULT_PRESET,
|
|
36
|
+
DEFAULT_SDK_VERSION: () => DEFAULT_SDK_VERSION,
|
|
37
|
+
scaffoldProject: () => scaffoldProject
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(index_exports);
|
|
40
|
+
|
|
41
|
+
// src/scaffold.ts
|
|
42
|
+
var import_promises = require("fs/promises");
|
|
43
|
+
var import_node_path = __toESM(require("path"), 1);
|
|
44
|
+
var CAPABILITIES = [
|
|
45
|
+
"catalog",
|
|
46
|
+
"meta",
|
|
47
|
+
"stream",
|
|
48
|
+
"subtitles",
|
|
49
|
+
"plugin_catalog"
|
|
50
|
+
];
|
|
51
|
+
var DEFAULT_PRESET = "meta";
|
|
52
|
+
var DEFAULT_SDK_VERSION = "^0.2.0";
|
|
53
|
+
function sortedCapabilities(values) {
|
|
54
|
+
const unique = Array.from(new Set(values));
|
|
55
|
+
return CAPABILITIES.filter((capability) => unique.includes(capability));
|
|
56
|
+
}
|
|
57
|
+
async function ensureTargetDoesNotExist(targetDir) {
|
|
58
|
+
try {
|
|
59
|
+
await (0, import_promises.access)(targetDir);
|
|
60
|
+
throw new Error(`Target directory already exists: ${targetDir}`);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
if (error.code === "ENOENT") {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function makePackageJson(name, language, sdkVersion) {
|
|
69
|
+
const scripts = language === "ts" ? {
|
|
70
|
+
dev: "tsx watch src/server.ts",
|
|
71
|
+
build: "tsc -p tsconfig.json",
|
|
72
|
+
format: "prettier --write .",
|
|
73
|
+
"format:check": "prettier --check .",
|
|
74
|
+
start: "node dist/server.js",
|
|
75
|
+
test: "vitest run",
|
|
76
|
+
typecheck: "tsc --noEmit"
|
|
77
|
+
} : {
|
|
78
|
+
dev: "node --watch src/server.js",
|
|
79
|
+
build: 'echo "No build step for JavaScript template"',
|
|
80
|
+
format: "prettier --write .",
|
|
81
|
+
"format:check": "prettier --check .",
|
|
82
|
+
start: "node src/server.js",
|
|
83
|
+
test: "vitest run"
|
|
84
|
+
};
|
|
85
|
+
const normalizedScripts = {
|
|
86
|
+
...scripts,
|
|
87
|
+
check: language === "ts" ? "npm run format:check && npm run typecheck && npm test && npm run build" : "npm run format:check && npm test && npm run build"
|
|
88
|
+
};
|
|
89
|
+
const packageJson = {
|
|
90
|
+
name,
|
|
91
|
+
version: "0.1.0",
|
|
92
|
+
private: true,
|
|
93
|
+
type: "module",
|
|
94
|
+
scripts: normalizedScripts,
|
|
95
|
+
dependencies: {
|
|
96
|
+
"@streamfox/plugin-sdk": sdkVersion
|
|
97
|
+
},
|
|
98
|
+
devDependencies: language === "ts" ? {
|
|
99
|
+
"@types/node": "^24.6.0",
|
|
100
|
+
prettier: "^3.6.2",
|
|
101
|
+
tsx: "^4.20.5",
|
|
102
|
+
typescript: "^5.9.2",
|
|
103
|
+
vitest: "^2.1.9"
|
|
104
|
+
} : {
|
|
105
|
+
prettier: "^3.6.2",
|
|
106
|
+
vitest: "^2.1.9"
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
return `${JSON.stringify(packageJson, null, 2)}
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
function resourceBlock(capability, advanced) {
|
|
113
|
+
switch (capability) {
|
|
114
|
+
case "catalog":
|
|
115
|
+
return `catalog: {
|
|
116
|
+
endpoints: [
|
|
117
|
+
{
|
|
118
|
+
id: "top",
|
|
119
|
+
name: "Top",
|
|
120
|
+
mediaTypes: ["movie"],
|
|
121
|
+
filters: [{ key: "genre", valueType: "string" }],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
handler: async () => ({
|
|
125
|
+
items: [],
|
|
126
|
+
}),
|
|
127
|
+
},`;
|
|
128
|
+
case "meta":
|
|
129
|
+
return `meta: {
|
|
130
|
+
mediaTypes: ["movie"],
|
|
131
|
+
includes: ["videos", "links"],
|
|
132
|
+
handler: async () => ({
|
|
133
|
+
item: ${advanced ? `{
|
|
134
|
+
summary: {
|
|
135
|
+
id: { namespace: "imdb", value: "tt1254207" },
|
|
136
|
+
mediaType: "movie",
|
|
137
|
+
title: "Big Buck Bunny",
|
|
138
|
+
links: [],
|
|
139
|
+
},
|
|
140
|
+
defaultVideoID: "main",
|
|
141
|
+
trailers: [{ transport: { kind: "youtube", id: "aqz-KE-bpKQ" } }],
|
|
142
|
+
videos: [
|
|
143
|
+
{
|
|
144
|
+
id: "main",
|
|
145
|
+
title: "Main",
|
|
146
|
+
streams: [{ transport: { kind: "http", url: "https://example.com/video.mp4" } }],
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
}` : "null"},
|
|
150
|
+
}),
|
|
151
|
+
},`;
|
|
152
|
+
case "stream":
|
|
153
|
+
return `stream: {
|
|
154
|
+
mediaTypes: ["movie"],
|
|
155
|
+
supportedTransports: ${advanced ? `["http", "torrent", "usenet", "archive", "youtube"]` : `["http"]`},
|
|
156
|
+
handler: async () => ({
|
|
157
|
+
streams: [
|
|
158
|
+
{
|
|
159
|
+
transport: { kind: "http", url: "https://example.com/video.mp4", mode: "stream" },
|
|
160
|
+
hints: {
|
|
161
|
+
notWebReady: true,
|
|
162
|
+
proxyHeaders: { request: { "User-Agent": "StreamFox" } },
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
${advanced ? ` {
|
|
166
|
+
transport: { kind: "torrent", infoHash: "abcdef", peerDiscovery: ["tracker:udp://tracker.example.com:80"] },
|
|
167
|
+
selection: { fileIndex: 0 },
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
transport: { kind: "usenet", nzbURL: "https://example.com/file.nzb", servers: ["nntps://user:pass@news.example.com:563/4"] },
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
transport: {
|
|
174
|
+
kind: "archive",
|
|
175
|
+
format: "zip",
|
|
176
|
+
files: [{ url: "https://example.com/archive.zip", bytes: 1024 }],
|
|
177
|
+
},
|
|
178
|
+
selection: { fileMustInclude: "movie.mkv" },
|
|
179
|
+
},
|
|
180
|
+
` : ""} ],
|
|
181
|
+
}),
|
|
182
|
+
},`;
|
|
183
|
+
case "subtitles":
|
|
184
|
+
return `subtitles: {
|
|
185
|
+
mediaTypes: ["movie", "episode"],
|
|
186
|
+
defaultLanguages: ["en"],
|
|
187
|
+
handler: async (request, { settings }) => {
|
|
188
|
+
const configuredLanguages = Array.isArray(settings.languages)
|
|
189
|
+
? settings.languages
|
|
190
|
+
: [];
|
|
191
|
+
const languagePreferences =
|
|
192
|
+
configuredLanguages.length > 0 ? configuredLanguages : (request.languagePreferences ?? []);
|
|
193
|
+
|
|
194
|
+
void languagePreferences;
|
|
195
|
+
void settings.includeHI;
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
subtitles: [],
|
|
199
|
+
};
|
|
200
|
+
},
|
|
201
|
+
},`;
|
|
202
|
+
case "plugin_catalog":
|
|
203
|
+
return `pluginCatalog: {
|
|
204
|
+
endpoints: [
|
|
205
|
+
{
|
|
206
|
+
id: "featured",
|
|
207
|
+
name: "Featured",
|
|
208
|
+
pluginKinds: ["catalog", "meta", "stream", "subtitles"],
|
|
209
|
+
tags: ["official"],
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
handler: async () => ({
|
|
213
|
+
plugins: [
|
|
214
|
+
{
|
|
215
|
+
id: "com.example.recommended",
|
|
216
|
+
name: "Recommended",
|
|
217
|
+
version: "1.0.0",
|
|
218
|
+
pluginKinds: ["catalog", "meta"],
|
|
219
|
+
distribution: {
|
|
220
|
+
transport: "https",
|
|
221
|
+
manifestURL: "https://plugins.example.com/recommended/manifest",
|
|
222
|
+
},
|
|
223
|
+
manifestSnapshot: {
|
|
224
|
+
plugin: { id: "com.example.recommended" },
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
}),
|
|
229
|
+
},`;
|
|
230
|
+
default:
|
|
231
|
+
return "";
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function makeInstallBlock(preset) {
|
|
235
|
+
if (preset !== "subtitles") {
|
|
236
|
+
return "";
|
|
237
|
+
}
|
|
238
|
+
return ` install: {
|
|
239
|
+
configurationRequired: true,
|
|
240
|
+
title: "Subtitle Settings",
|
|
241
|
+
description: "Configure subtitle defaults before installing this plugin.",
|
|
242
|
+
fields: [
|
|
243
|
+
settings.multiSelect("languages", {
|
|
244
|
+
label: "Languages",
|
|
245
|
+
options: [
|
|
246
|
+
{ label: "English", value: "en" },
|
|
247
|
+
{ label: "Greek", value: "el" },
|
|
248
|
+
{ label: "Spanish", value: "es" },
|
|
249
|
+
],
|
|
250
|
+
defaultValue: ["en"],
|
|
251
|
+
}),
|
|
252
|
+
settings.checkbox("includeHI", {
|
|
253
|
+
label: "Include hearing impaired",
|
|
254
|
+
defaultValue: true,
|
|
255
|
+
}),
|
|
256
|
+
],
|
|
257
|
+
},
|
|
258
|
+
`;
|
|
259
|
+
}
|
|
260
|
+
function makePluginFile(name, preset, capabilities, advanced) {
|
|
261
|
+
const resources = capabilities.map((capability) => resourceBlock(capability, advanced)).join("\n ");
|
|
262
|
+
const install = makeInstallBlock(preset);
|
|
263
|
+
const importSpec = install.length > 0 ? "definePlugin, settings" : "definePlugin";
|
|
264
|
+
const installBlock = install.length > 0 ? `${install}` : "";
|
|
265
|
+
return `import { ${importSpec} } from "@streamfox/plugin-sdk";
|
|
266
|
+
|
|
267
|
+
export const plugin = definePlugin({
|
|
268
|
+
plugin: {
|
|
269
|
+
id: "com.example.${name}",
|
|
270
|
+
name: "${name}",
|
|
271
|
+
version: "0.1.0",
|
|
272
|
+
description: "Generated StreamFox plugin scaffold",
|
|
273
|
+
},
|
|
274
|
+
${installBlock} resources: {
|
|
275
|
+
${resources}
|
|
276
|
+
},
|
|
277
|
+
});
|
|
278
|
+
`;
|
|
279
|
+
}
|
|
280
|
+
function makeServerFile(language) {
|
|
281
|
+
const pluginImport = language === "ts" ? "./plugin" : "./plugin.js";
|
|
282
|
+
return `import { serve } from "@streamfox/plugin-sdk";
|
|
283
|
+
import { plugin } from "${pluginImport}";
|
|
284
|
+
|
|
285
|
+
const { url, installURL, launchURL } = await serve(plugin, {
|
|
286
|
+
port: Number(process.env.PORT ?? 7000),
|
|
287
|
+
integration: {
|
|
288
|
+
installScheme: "streamfox",
|
|
289
|
+
launchBaseURL: "https://streamfox.app/#",
|
|
290
|
+
autoOpen: "none",
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
console.log("Plugin manifest:", url);
|
|
295
|
+
console.log("Plugin installer deeplink:", installURL);
|
|
296
|
+
console.log("Plugin launch URL:", launchURL);
|
|
297
|
+
`;
|
|
298
|
+
}
|
|
299
|
+
function makeVitestFile(language) {
|
|
300
|
+
const pluginImport = language === "ts" ? "../src/plugin" : "../src/plugin.js";
|
|
301
|
+
return `import { describe, expect, it } from "vitest";
|
|
302
|
+
import { createServer } from "@streamfox/plugin-sdk";
|
|
303
|
+
import { plugin } from "${pluginImport}";
|
|
304
|
+
|
|
305
|
+
describe("scaffold smoke", () => {
|
|
306
|
+
it("serves manifest and studio config", async () => {
|
|
307
|
+
const app = createServer(plugin, { frontend: false });
|
|
308
|
+
|
|
309
|
+
const manifestResponse = await app.request("/manifest");
|
|
310
|
+
expect(manifestResponse.status).toBe(200);
|
|
311
|
+
|
|
312
|
+
const studioResponse = await app.request("/studio-config");
|
|
313
|
+
expect(studioResponse.status).toBe(200);
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
318
|
+
var tsConfig = `{
|
|
319
|
+
"compilerOptions": {
|
|
320
|
+
"target": "ES2022",
|
|
321
|
+
"module": "ESNext",
|
|
322
|
+
"moduleResolution": "Bundler",
|
|
323
|
+
"strict": true,
|
|
324
|
+
"declaration": true,
|
|
325
|
+
"outDir": "dist",
|
|
326
|
+
"rootDir": "src",
|
|
327
|
+
"types": ["node"]
|
|
328
|
+
},
|
|
329
|
+
"include": ["src"]
|
|
330
|
+
}
|
|
331
|
+
`;
|
|
332
|
+
var prettierConfig = `{
|
|
333
|
+
"semi": true,
|
|
334
|
+
"singleQuote": false,
|
|
335
|
+
"trailingComma": "all"
|
|
336
|
+
}
|
|
337
|
+
`;
|
|
338
|
+
var prettierIgnore = `dist
|
|
339
|
+
node_modules
|
|
340
|
+
.DS_Store
|
|
341
|
+
`;
|
|
342
|
+
function makeReadme(projectName, preset, capabilities, advanced) {
|
|
343
|
+
const capabilitiesList = capabilities.map((capability) => `- ${capability}`).join("\n");
|
|
344
|
+
const endpointForCapability = (capability) => {
|
|
345
|
+
switch (capability) {
|
|
346
|
+
case "catalog":
|
|
347
|
+
return "/catalog/:mediaType/:catalogID";
|
|
348
|
+
case "meta":
|
|
349
|
+
return "/meta/:mediaType/:itemID";
|
|
350
|
+
case "stream":
|
|
351
|
+
return "/stream/:mediaType/:itemID";
|
|
352
|
+
case "subtitles":
|
|
353
|
+
return "/subtitles/:mediaType/:itemID";
|
|
354
|
+
case "plugin_catalog":
|
|
355
|
+
return "/plugin_catalog/:catalogID/:pluginKind";
|
|
356
|
+
default:
|
|
357
|
+
return `/${capability}`;
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
const endpointLines = [
|
|
361
|
+
"- GET /manifest",
|
|
362
|
+
"- GET /studio-config",
|
|
363
|
+
...capabilities.map(
|
|
364
|
+
(capability) => `- GET ${endpointForCapability(capability)}`
|
|
365
|
+
)
|
|
366
|
+
].join("\n");
|
|
367
|
+
return `# ${projectName}
|
|
368
|
+
|
|
369
|
+
Generated with create-streamfox-plugin.
|
|
370
|
+
|
|
371
|
+
Preset: \`${preset}\`
|
|
372
|
+
Advanced template: \`${advanced ? "enabled" : "disabled"}\`
|
|
373
|
+
|
|
374
|
+
## Scripts
|
|
375
|
+
|
|
376
|
+
- npm run dev
|
|
377
|
+
- npm run build
|
|
378
|
+
- npm run format
|
|
379
|
+
- npm run start
|
|
380
|
+
- npm run test
|
|
381
|
+
|
|
382
|
+
## Implemented Capabilities
|
|
383
|
+
|
|
384
|
+
${capabilitiesList}
|
|
385
|
+
|
|
386
|
+
## Stream Model
|
|
387
|
+
|
|
388
|
+
- Unified transport model via \`stream.transport\`
|
|
389
|
+
- Capability declaration via \`resources.stream.supportedTransports\`
|
|
390
|
+
- Optional selection controls via \`stream.selection\`
|
|
391
|
+
|
|
392
|
+
## Endpoints
|
|
393
|
+
|
|
394
|
+
${endpointLines}
|
|
395
|
+
`;
|
|
396
|
+
}
|
|
397
|
+
async function scaffoldProject(options) {
|
|
398
|
+
const capabilities = sortedCapabilities([
|
|
399
|
+
options.preset,
|
|
400
|
+
...options.extraCapabilities ?? []
|
|
401
|
+
]);
|
|
402
|
+
const sdkVersion = (options.sdkVersion ?? DEFAULT_SDK_VERSION).trim() || DEFAULT_SDK_VERSION;
|
|
403
|
+
const advanced = options.advanced ?? false;
|
|
404
|
+
await ensureTargetDoesNotExist(options.targetDir);
|
|
405
|
+
const srcDir = import_node_path.default.join(options.targetDir, "src");
|
|
406
|
+
const testDir = import_node_path.default.join(options.targetDir, "test");
|
|
407
|
+
await (0, import_promises.mkdir)(srcDir, { recursive: true });
|
|
408
|
+
await (0, import_promises.mkdir)(testDir, { recursive: true });
|
|
409
|
+
await (0, import_promises.writeFile)(
|
|
410
|
+
import_node_path.default.join(options.targetDir, "package.json"),
|
|
411
|
+
makePackageJson(options.projectName, options.language, sdkVersion)
|
|
412
|
+
);
|
|
413
|
+
await (0, import_promises.writeFile)(
|
|
414
|
+
import_node_path.default.join(options.targetDir, ".prettierrc.json"),
|
|
415
|
+
prettierConfig
|
|
416
|
+
);
|
|
417
|
+
await (0, import_promises.writeFile)(
|
|
418
|
+
import_node_path.default.join(options.targetDir, ".prettierignore"),
|
|
419
|
+
prettierIgnore
|
|
420
|
+
);
|
|
421
|
+
await (0, import_promises.writeFile)(
|
|
422
|
+
import_node_path.default.join(options.targetDir, "README.md"),
|
|
423
|
+
makeReadme(options.projectName, options.preset, capabilities, advanced)
|
|
424
|
+
);
|
|
425
|
+
if (options.language === "ts") {
|
|
426
|
+
await (0, import_promises.writeFile)(import_node_path.default.join(options.targetDir, "tsconfig.json"), tsConfig);
|
|
427
|
+
await (0, import_promises.writeFile)(
|
|
428
|
+
import_node_path.default.join(srcDir, "plugin.ts"),
|
|
429
|
+
makePluginFile(
|
|
430
|
+
options.projectName,
|
|
431
|
+
options.preset,
|
|
432
|
+
capabilities,
|
|
433
|
+
advanced
|
|
434
|
+
)
|
|
435
|
+
);
|
|
436
|
+
await (0, import_promises.writeFile)(import_node_path.default.join(srcDir, "server.ts"), makeServerFile("ts"));
|
|
437
|
+
await (0, import_promises.writeFile)(import_node_path.default.join(testDir, "plugin.test.ts"), makeVitestFile("ts"));
|
|
438
|
+
} else {
|
|
439
|
+
await (0, import_promises.writeFile)(
|
|
440
|
+
import_node_path.default.join(srcDir, "plugin.js"),
|
|
441
|
+
makePluginFile(
|
|
442
|
+
options.projectName,
|
|
443
|
+
options.preset,
|
|
444
|
+
capabilities,
|
|
445
|
+
advanced
|
|
446
|
+
)
|
|
447
|
+
);
|
|
448
|
+
await (0, import_promises.writeFile)(import_node_path.default.join(srcDir, "server.js"), makeServerFile("js"));
|
|
449
|
+
await (0, import_promises.writeFile)(import_node_path.default.join(testDir, "plugin.test.js"), makeVitestFile("js"));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
453
|
+
0 && (module.exports = {
|
|
454
|
+
CAPABILITIES,
|
|
455
|
+
DEFAULT_PRESET,
|
|
456
|
+
DEFAULT_SDK_VERSION,
|
|
457
|
+
scaffoldProject
|
|
458
|
+
});
|
|
459
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/scaffold.ts"],"sourcesContent":["export * from \"./scaffold\";\n","import { access, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const CAPABILITIES = [\n \"catalog\",\n \"meta\",\n \"stream\",\n \"subtitles\",\n \"plugin_catalog\",\n] as const;\nexport type Capability = (typeof CAPABILITIES)[number];\nexport type Preset = Capability;\nexport type Language = \"ts\" | \"js\";\nexport const DEFAULT_PRESET: Preset = \"meta\";\nexport const DEFAULT_SDK_VERSION = \"^0.2.0\";\n\nexport interface ScaffoldOptions {\n targetDir: string;\n projectName: string;\n language: Language;\n preset: Preset;\n advanced?: boolean;\n extraCapabilities?: Capability[];\n sdkVersion?: string;\n}\n\nfunction sortedCapabilities(values: Capability[]): Capability[] {\n const unique = Array.from(new Set(values));\n return CAPABILITIES.filter((capability) => unique.includes(capability));\n}\n\nasync function ensureTargetDoesNotExist(targetDir: string): Promise<void> {\n try {\n await access(targetDir);\n throw new Error(`Target directory already exists: ${targetDir}`);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n}\n\nfunction makePackageJson(\n name: string,\n language: Language,\n sdkVersion: string,\n): string {\n const scripts =\n language === \"ts\"\n ? {\n dev: \"tsx watch src/server.ts\",\n build: \"tsc -p tsconfig.json\",\n format: \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n start: \"node dist/server.js\",\n test: \"vitest run\",\n typecheck: \"tsc --noEmit\",\n }\n : {\n dev: \"node --watch src/server.js\",\n build: 'echo \"No build step for JavaScript template\"',\n format: \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n start: \"node src/server.js\",\n test: \"vitest run\",\n };\n\n const normalizedScripts = {\n ...scripts,\n check:\n language === \"ts\"\n ? \"npm run format:check && npm run typecheck && npm test && npm run build\"\n : \"npm run format:check && npm test && npm run build\",\n };\n\n const packageJson = {\n name,\n version: \"0.1.0\",\n private: true,\n type: \"module\",\n scripts: normalizedScripts,\n dependencies: {\n \"@streamfox/plugin-sdk\": sdkVersion,\n },\n devDependencies:\n language === \"ts\"\n ? {\n \"@types/node\": \"^24.6.0\",\n prettier: \"^3.6.2\",\n tsx: \"^4.20.5\",\n typescript: \"^5.9.2\",\n vitest: \"^2.1.9\",\n }\n : {\n prettier: \"^3.6.2\",\n vitest: \"^2.1.9\",\n },\n };\n\n return `${JSON.stringify(packageJson, null, 2)}\\n`;\n}\n\nfunction resourceBlock(capability: Capability, advanced: boolean): string {\n switch (capability) {\n case \"catalog\":\n return `catalog: {\n endpoints: [\n {\n id: \"top\",\n name: \"Top\",\n mediaTypes: [\"movie\"],\n filters: [{ key: \"genre\", valueType: \"string\" }],\n },\n ],\n handler: async () => ({\n items: [],\n }),\n },`;\n case \"meta\":\n return `meta: {\n mediaTypes: [\"movie\"],\n includes: [\"videos\", \"links\"],\n handler: async () => ({\n item: ${\n advanced\n ? `{\n summary: {\n id: { namespace: \"imdb\", value: \"tt1254207\" },\n mediaType: \"movie\",\n title: \"Big Buck Bunny\",\n links: [],\n },\n defaultVideoID: \"main\",\n trailers: [{ transport: { kind: \"youtube\", id: \"aqz-KE-bpKQ\" } }],\n videos: [\n {\n id: \"main\",\n title: \"Main\",\n streams: [{ transport: { kind: \"http\", url: \"https://example.com/video.mp4\" } }],\n },\n ],\n }`\n : \"null\"\n },\n }),\n },`;\n case \"stream\":\n return `stream: {\n mediaTypes: [\"movie\"],\n supportedTransports: ${advanced ? `[\"http\", \"torrent\", \"usenet\", \"archive\", \"youtube\"]` : `[\"http\"]`},\n handler: async () => ({\n streams: [\n {\n transport: { kind: \"http\", url: \"https://example.com/video.mp4\", mode: \"stream\" },\n hints: {\n notWebReady: true,\n proxyHeaders: { request: { \"User-Agent\": \"StreamFox\" } },\n },\n },\n${\n advanced\n ? ` {\n transport: { kind: \"torrent\", infoHash: \"abcdef\", peerDiscovery: [\"tracker:udp://tracker.example.com:80\"] },\n selection: { fileIndex: 0 },\n },\n {\n transport: { kind: \"usenet\", nzbURL: \"https://example.com/file.nzb\", servers: [\"nntps://user:pass@news.example.com:563/4\"] },\n },\n {\n transport: {\n kind: \"archive\",\n format: \"zip\",\n files: [{ url: \"https://example.com/archive.zip\", bytes: 1024 }],\n },\n selection: { fileMustInclude: \"movie.mkv\" },\n },\n`\n : \"\"\n} ],\n }),\n },`;\n case \"subtitles\":\n return `subtitles: {\n mediaTypes: [\"movie\", \"episode\"],\n defaultLanguages: [\"en\"],\n handler: async (request, { settings }) => {\n const configuredLanguages = Array.isArray(settings.languages)\n ? settings.languages\n : [];\n const languagePreferences =\n configuredLanguages.length > 0 ? configuredLanguages : (request.languagePreferences ?? []);\n\n void languagePreferences;\n void settings.includeHI;\n\n return {\n subtitles: [],\n };\n },\n },`;\n case \"plugin_catalog\":\n return `pluginCatalog: {\n endpoints: [\n {\n id: \"featured\",\n name: \"Featured\",\n pluginKinds: [\"catalog\", \"meta\", \"stream\", \"subtitles\"],\n tags: [\"official\"],\n },\n ],\n handler: async () => ({\n plugins: [\n {\n id: \"com.example.recommended\",\n name: \"Recommended\",\n version: \"1.0.0\",\n pluginKinds: [\"catalog\", \"meta\"],\n distribution: {\n transport: \"https\",\n manifestURL: \"https://plugins.example.com/recommended/manifest\",\n },\n manifestSnapshot: {\n plugin: { id: \"com.example.recommended\" },\n },\n },\n ],\n }),\n },`;\n default:\n return \"\";\n }\n}\n\nfunction makeInstallBlock(preset: Preset): string {\n if (preset !== \"subtitles\") {\n return \"\";\n }\n\n return ` install: {\n configurationRequired: true,\n title: \"Subtitle Settings\",\n description: \"Configure subtitle defaults before installing this plugin.\",\n fields: [\n settings.multiSelect(\"languages\", {\n label: \"Languages\",\n options: [\n { label: \"English\", value: \"en\" },\n { label: \"Greek\", value: \"el\" },\n { label: \"Spanish\", value: \"es\" },\n ],\n defaultValue: [\"en\"],\n }),\n settings.checkbox(\"includeHI\", {\n label: \"Include hearing impaired\",\n defaultValue: true,\n }),\n ],\n },\n`;\n}\n\nfunction makePluginFile(\n name: string,\n preset: Preset,\n capabilities: Capability[],\n advanced: boolean,\n): string {\n const resources = capabilities\n .map((capability) => resourceBlock(capability, advanced))\n .join(\"\\n \");\n const install = makeInstallBlock(preset);\n const importSpec =\n install.length > 0 ? \"definePlugin, settings\" : \"definePlugin\";\n const installBlock = install.length > 0 ? `${install}` : \"\";\n\n return `import { ${importSpec} } from \"@streamfox/plugin-sdk\";\n\nexport const plugin = definePlugin({\n plugin: {\n id: \"com.example.${name}\",\n name: \"${name}\",\n version: \"0.1.0\",\n description: \"Generated StreamFox plugin scaffold\",\n },\n${installBlock} resources: {\n ${resources}\n },\n});\n`;\n}\n\nfunction makeServerFile(language: Language): string {\n const pluginImport = language === \"ts\" ? \"./plugin\" : \"./plugin.js\";\n return `import { serve } from \"@streamfox/plugin-sdk\";\nimport { plugin } from \"${pluginImport}\";\n\nconst { url, installURL, launchURL } = await serve(plugin, {\n port: Number(process.env.PORT ?? 7000),\n integration: {\n installScheme: \"streamfox\",\n launchBaseURL: \"https://streamfox.app/#\",\n autoOpen: \"none\",\n },\n});\n\nconsole.log(\"Plugin manifest:\", url);\nconsole.log(\"Plugin installer deeplink:\", installURL);\nconsole.log(\"Plugin launch URL:\", launchURL);\n`;\n}\n\nfunction makeVitestFile(language: Language): string {\n const pluginImport = language === \"ts\" ? \"../src/plugin\" : \"../src/plugin.js\";\n return `import { describe, expect, it } from \"vitest\";\nimport { createServer } from \"@streamfox/plugin-sdk\";\nimport { plugin } from \"${pluginImport}\";\n\ndescribe(\"scaffold smoke\", () => {\n it(\"serves manifest and studio config\", async () => {\n const app = createServer(plugin, { frontend: false });\n\n const manifestResponse = await app.request(\"/manifest\");\n expect(manifestResponse.status).toBe(200);\n\n const studioResponse = await app.request(\"/studio-config\");\n expect(studioResponse.status).toBe(200);\n });\n});\n`;\n}\n\nconst tsConfig = `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"strict\": true,\n \"declaration\": true,\n \"outDir\": \"dist\",\n \"rootDir\": \"src\",\n \"types\": [\"node\"]\n },\n \"include\": [\"src\"]\n}\n`;\n\nconst prettierConfig = `{\n \"semi\": true,\n \"singleQuote\": false,\n \"trailingComma\": \"all\"\n}\n`;\n\nconst prettierIgnore = `dist\nnode_modules\n.DS_Store\n`;\n\nfunction makeReadme(\n projectName: string,\n preset: Preset,\n capabilities: Capability[],\n advanced: boolean,\n): string {\n const capabilitiesList = capabilities\n .map((capability) => `- ${capability}`)\n .join(\"\\n\");\n\n const endpointForCapability = (capability: Capability): string => {\n switch (capability) {\n case \"catalog\":\n return \"/catalog/:mediaType/:catalogID\";\n case \"meta\":\n return \"/meta/:mediaType/:itemID\";\n case \"stream\":\n return \"/stream/:mediaType/:itemID\";\n case \"subtitles\":\n return \"/subtitles/:mediaType/:itemID\";\n case \"plugin_catalog\":\n return \"/plugin_catalog/:catalogID/:pluginKind\";\n default:\n return `/${capability}`;\n }\n };\n\n const endpointLines = [\n \"- GET /manifest\",\n \"- GET /studio-config\",\n ...capabilities.map(\n (capability) => `- GET ${endpointForCapability(capability)}`,\n ),\n ].join(\"\\n\");\n\n return `# ${projectName}\n\nGenerated with create-streamfox-plugin.\n\nPreset: \\`${preset}\\`\nAdvanced template: \\`${advanced ? \"enabled\" : \"disabled\"}\\`\n\n## Scripts\n\n- npm run dev\n- npm run build\n- npm run format\n- npm run start\n- npm run test\n\n## Implemented Capabilities\n\n${capabilitiesList}\n\n## Stream Model\n\n- Unified transport model via \\`stream.transport\\`\n- Capability declaration via \\`resources.stream.supportedTransports\\`\n- Optional selection controls via \\`stream.selection\\`\n\n## Endpoints\n\n${endpointLines}\n`;\n}\n\nexport async function scaffoldProject(options: ScaffoldOptions): Promise<void> {\n const capabilities = sortedCapabilities([\n options.preset,\n ...(options.extraCapabilities ?? []),\n ]);\n const sdkVersion =\n (options.sdkVersion ?? DEFAULT_SDK_VERSION).trim() || DEFAULT_SDK_VERSION;\n const advanced = options.advanced ?? false;\n\n await ensureTargetDoesNotExist(options.targetDir);\n\n const srcDir = path.join(options.targetDir, \"src\");\n const testDir = path.join(options.targetDir, \"test\");\n\n await mkdir(srcDir, { recursive: true });\n await mkdir(testDir, { recursive: true });\n\n await writeFile(\n path.join(options.targetDir, \"package.json\"),\n makePackageJson(options.projectName, options.language, sdkVersion),\n );\n await writeFile(\n path.join(options.targetDir, \".prettierrc.json\"),\n prettierConfig,\n );\n await writeFile(\n path.join(options.targetDir, \".prettierignore\"),\n prettierIgnore,\n );\n await writeFile(\n path.join(options.targetDir, \"README.md\"),\n makeReadme(options.projectName, options.preset, capabilities, advanced),\n );\n\n if (options.language === \"ts\") {\n await writeFile(path.join(options.targetDir, \"tsconfig.json\"), tsConfig);\n await writeFile(\n path.join(srcDir, \"plugin.ts\"),\n makePluginFile(\n options.projectName,\n options.preset,\n capabilities,\n advanced,\n ),\n );\n await writeFile(path.join(srcDir, \"server.ts\"), makeServerFile(\"ts\"));\n await writeFile(path.join(testDir, \"plugin.test.ts\"), makeVitestFile(\"ts\"));\n } else {\n await writeFile(\n path.join(srcDir, \"plugin.js\"),\n makePluginFile(\n options.projectName,\n options.preset,\n capabilities,\n advanced,\n ),\n );\n await writeFile(path.join(srcDir, \"server.js\"), makeServerFile(\"js\"));\n await writeFile(path.join(testDir, \"plugin.test.js\"), makeVitestFile(\"js\"));\n }\n}\n"],"mappings":"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","names":["path"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
declare const CAPABILITIES: readonly ["catalog", "meta", "stream", "subtitles", "plugin_catalog"];
|
|
2
|
+
type Capability = (typeof CAPABILITIES)[number];
|
|
3
|
+
type Preset = Capability;
|
|
4
|
+
type Language = "ts" | "js";
|
|
5
|
+
declare const DEFAULT_PRESET: Preset;
|
|
6
|
+
declare const DEFAULT_SDK_VERSION = "^0.2.0";
|
|
7
|
+
interface ScaffoldOptions {
|
|
8
|
+
targetDir: string;
|
|
9
|
+
projectName: string;
|
|
10
|
+
language: Language;
|
|
11
|
+
preset: Preset;
|
|
12
|
+
advanced?: boolean;
|
|
13
|
+
extraCapabilities?: Capability[];
|
|
14
|
+
sdkVersion?: string;
|
|
15
|
+
}
|
|
16
|
+
declare function scaffoldProject(options: ScaffoldOptions): Promise<void>;
|
|
17
|
+
|
|
18
|
+
export { CAPABILITIES, type Capability, DEFAULT_PRESET, DEFAULT_SDK_VERSION, type Language, type Preset, type ScaffoldOptions, scaffoldProject };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
declare const CAPABILITIES: readonly ["catalog", "meta", "stream", "subtitles", "plugin_catalog"];
|
|
2
|
+
type Capability = (typeof CAPABILITIES)[number];
|
|
3
|
+
type Preset = Capability;
|
|
4
|
+
type Language = "ts" | "js";
|
|
5
|
+
declare const DEFAULT_PRESET: Preset;
|
|
6
|
+
declare const DEFAULT_SDK_VERSION = "^0.2.0";
|
|
7
|
+
interface ScaffoldOptions {
|
|
8
|
+
targetDir: string;
|
|
9
|
+
projectName: string;
|
|
10
|
+
language: Language;
|
|
11
|
+
preset: Preset;
|
|
12
|
+
advanced?: boolean;
|
|
13
|
+
extraCapabilities?: Capability[];
|
|
14
|
+
sdkVersion?: string;
|
|
15
|
+
}
|
|
16
|
+
declare function scaffoldProject(options: ScaffoldOptions): Promise<void>;
|
|
17
|
+
|
|
18
|
+
export { CAPABILITIES, type Capability, DEFAULT_PRESET, DEFAULT_SDK_VERSION, type Language, type Preset, type ScaffoldOptions, scaffoldProject };
|