polyv-live-cli 1.1.13 → 1.2.6

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.
Files changed (104) hide show
  1. package/dist/commands/coupon.commands.d.ts +8 -0
  2. package/dist/commands/coupon.commands.d.ts.map +1 -0
  3. package/dist/commands/coupon.commands.js +258 -0
  4. package/dist/commands/coupon.commands.js.map +1 -0
  5. package/dist/commands/index.d.ts +1 -0
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +3 -1
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/product.commands.d.ts +10 -0
  10. package/dist/commands/product.commands.d.ts.map +1 -0
  11. package/dist/commands/product.commands.js +398 -0
  12. package/dist/commands/product.commands.js.map +1 -0
  13. package/dist/commands/setup.commands.d.ts +4 -0
  14. package/dist/commands/setup.commands.d.ts.map +1 -0
  15. package/dist/commands/setup.commands.js +132 -0
  16. package/dist/commands/setup.commands.js.map +1 -0
  17. package/dist/commands/stream.commands.d.ts.map +1 -1
  18. package/dist/commands/stream.commands.js +7 -15
  19. package/dist/commands/stream.commands.js.map +1 -1
  20. package/dist/handlers/channel.handler.d.ts.map +1 -1
  21. package/dist/handlers/channel.handler.js +2 -2
  22. package/dist/handlers/channel.handler.js.map +1 -1
  23. package/dist/handlers/coupon.handler.d.ts +54 -0
  24. package/dist/handlers/coupon.handler.d.ts.map +1 -0
  25. package/dist/handlers/coupon.handler.js +258 -0
  26. package/dist/handlers/coupon.handler.js.map +1 -0
  27. package/dist/handlers/product.handler.d.ts +28 -0
  28. package/dist/handlers/product.handler.d.ts.map +1 -0
  29. package/dist/handlers/product.handler.js +182 -0
  30. package/dist/handlers/product.handler.js.map +1 -0
  31. package/dist/handlers/setup.handler.d.ts +30 -0
  32. package/dist/handlers/setup.handler.d.ts.map +1 -0
  33. package/dist/handlers/setup.handler.js +160 -0
  34. package/dist/handlers/setup.handler.js.map +1 -0
  35. package/dist/handlers/stream.handler.d.ts +3 -2
  36. package/dist/handlers/stream.handler.d.ts.map +1 -1
  37. package/dist/handlers/stream.handler.js +3 -2
  38. package/dist/handlers/stream.handler.js.map +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +17 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/sdk/client.d.ts +8 -0
  43. package/dist/sdk/client.d.ts.map +1 -0
  44. package/dist/sdk/client.js +37 -0
  45. package/dist/sdk/client.js.map +1 -0
  46. package/dist/sdk/index.d.ts +3 -0
  47. package/dist/sdk/index.d.ts.map +1 -0
  48. package/dist/sdk/index.js +12 -0
  49. package/dist/sdk/index.js.map +1 -0
  50. package/dist/services/{channel.service.d.ts → channel.service.sdk.d.ts} +6 -8
  51. package/dist/services/channel.service.sdk.d.ts.map +1 -0
  52. package/dist/services/channel.service.sdk.js +265 -0
  53. package/dist/services/channel.service.sdk.js.map +1 -0
  54. package/dist/services/index.d.ts +4 -3
  55. package/dist/services/index.d.ts.map +1 -1
  56. package/dist/services/index.js +7 -5
  57. package/dist/services/index.js.map +1 -1
  58. package/dist/services/product.service.sdk.d.ts +22 -0
  59. package/dist/services/product.service.sdk.d.ts.map +1 -0
  60. package/dist/services/product.service.sdk.js +242 -0
  61. package/dist/services/product.service.sdk.js.map +1 -0
  62. package/dist/services/{stream.service.d.ts → stream.service.sdk.d.ts} +4 -12
  63. package/dist/services/stream.service.sdk.d.ts.map +1 -0
  64. package/dist/services/stream.service.sdk.js +265 -0
  65. package/dist/services/stream.service.sdk.js.map +1 -0
  66. package/dist/setup/output-renderer.d.ts +39 -0
  67. package/dist/setup/output-renderer.d.ts.map +1 -0
  68. package/dist/setup/output-renderer.js +151 -0
  69. package/dist/setup/output-renderer.js.map +1 -0
  70. package/dist/setup/resource-handlers.d.ts +13 -0
  71. package/dist/setup/resource-handlers.d.ts.map +1 -0
  72. package/dist/setup/resource-handlers.js +136 -0
  73. package/dist/setup/resource-handlers.js.map +1 -0
  74. package/dist/setup/scene-config-loader.d.ts +52 -0
  75. package/dist/setup/scene-config-loader.d.ts.map +1 -0
  76. package/dist/setup/scene-config-loader.js +275 -0
  77. package/dist/setup/scene-config-loader.js.map +1 -0
  78. package/dist/setup/scene-executor.d.ts +44 -0
  79. package/dist/setup/scene-executor.d.ts.map +1 -0
  80. package/dist/setup/scene-executor.js +162 -0
  81. package/dist/setup/scene-executor.js.map +1 -0
  82. package/dist/setup/variable-resolver.d.ts +16 -0
  83. package/dist/setup/variable-resolver.d.ts.map +1 -0
  84. package/dist/setup/variable-resolver.js +176 -0
  85. package/dist/setup/variable-resolver.js.map +1 -0
  86. package/dist/setup-scenes/e-commerce.yaml +123 -0
  87. package/dist/types/index.d.ts +1 -0
  88. package/dist/types/index.d.ts.map +1 -1
  89. package/dist/types/index.js +1 -0
  90. package/dist/types/index.js.map +1 -1
  91. package/dist/types/product.d.ts +135 -0
  92. package/dist/types/product.d.ts.map +1 -0
  93. package/dist/types/product.js +3 -0
  94. package/dist/types/product.js.map +1 -0
  95. package/dist/utils/data-manager.d.ts +3 -3
  96. package/dist/utils/data-manager.d.ts.map +1 -1
  97. package/dist/utils/data-manager.js.map +1 -1
  98. package/package.json +33 -32
  99. package/dist/services/channel.service.d.ts.map +0 -1
  100. package/dist/services/channel.service.js +0 -672
  101. package/dist/services/channel.service.js.map +0 -1
  102. package/dist/services/stream.service.d.ts.map +0 -1
  103. package/dist/services/stream.service.js +0 -489
  104. package/dist/services/stream.service.js.map +0 -1
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OutputRenderer = void 0;
4
+ const variable_resolver_1 = require("./variable-resolver");
5
+ class OutputRenderer {
6
+ constructor() {
7
+ this.spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
8
+ this.spinnerIndex = 0;
9
+ this.resolver = new variable_resolver_1.VariableResolver();
10
+ }
11
+ renderSummary(config, resources, options = {}) {
12
+ if (options.format === 'json') {
13
+ return this.renderSummaryJson(config, resources, options);
14
+ }
15
+ return this.renderSummaryTable(config, resources, options);
16
+ }
17
+ renderNextSteps(nextSteps, outputs) {
18
+ if (!nextSteps || nextSteps.length === 0) {
19
+ return 'No next steps available.';
20
+ }
21
+ const lines = ['\n📋 Next Steps:', ''];
22
+ nextSteps.forEach((step, index) => {
23
+ try {
24
+ const resolvedCommand = this.resolver.renderTemplate(step.command, outputs);
25
+ lines.push(`${index + 1}. ${step.description}`);
26
+ lines.push(` $ ${resolvedCommand}`);
27
+ lines.push('');
28
+ }
29
+ catch (error) {
30
+ const errorMsg = error instanceof Error ? error.message : String(error);
31
+ lines.push(`${index + 1}. ${step.description} (error: ${errorMsg})`);
32
+ lines.push('');
33
+ }
34
+ });
35
+ return lines.join('\n');
36
+ }
37
+ renderProgress(event) {
38
+ const { phase, resourceId, resourceType, showSpinner, current, total } = event;
39
+ let icon = '';
40
+ let action = '';
41
+ switch (phase) {
42
+ case 'creating':
43
+ icon = showSpinner ? this.getNextSpinnerFrame() : '⏳';
44
+ action = 'Creating';
45
+ break;
46
+ case 'created':
47
+ icon = '✅';
48
+ action = 'Created';
49
+ break;
50
+ case 'rolling_back':
51
+ icon = '↩️';
52
+ action = 'Rolling back';
53
+ break;
54
+ case 'rolled_back':
55
+ icon = '🔙';
56
+ action = 'Rolled back';
57
+ break;
58
+ }
59
+ let progress = '';
60
+ if (current !== undefined && total !== undefined) {
61
+ progress = ` (${current}/${total})`;
62
+ }
63
+ return `${icon} ${action} ${resourceType}: ${resourceId}${progress}`;
64
+ }
65
+ renderError(error, context = {}, options = {}) {
66
+ if (options.format === 'json') {
67
+ return JSON.stringify({
68
+ success: false,
69
+ error: error.message,
70
+ ...context,
71
+ }, null, 2);
72
+ }
73
+ const lines = ['\n❌ Error:', '', error.message];
74
+ if (context.failedAt) {
75
+ lines.push(``);
76
+ lines.push(`Failed at: ${context.failedAt}`);
77
+ }
78
+ if (context.rolledBack && context.rolledBack.length > 0) {
79
+ lines.push('');
80
+ lines.push('Rolled back resources:');
81
+ context.rolledBack.forEach(id => {
82
+ lines.push(` - ${id}`);
83
+ });
84
+ }
85
+ if (context.suggestion) {
86
+ lines.push('');
87
+ lines.push(`💡 Suggestion: ${context.suggestion}`);
88
+ }
89
+ return lines.join('\n');
90
+ }
91
+ renderTemplate(template, outputs) {
92
+ return this.resolver.renderTemplate(template, outputs);
93
+ }
94
+ renderDryRunOutput(config, resources) {
95
+ const lines = [
96
+ '\n🔍 Dry Run - No resources will be created',
97
+ '',
98
+ `Scene: ${config.name}`,
99
+ `Description: ${config.description || 'N/A'}`,
100
+ '',
101
+ `Resources to be created: ${resources.length}`,
102
+ '',
103
+ ];
104
+ lines.push('Execution order:');
105
+ resources.forEach((resource, index) => {
106
+ lines.push(` ${index + 1}. ${resource.type}: ${resource.id}`);
107
+ });
108
+ return lines.join('\n');
109
+ }
110
+ renderSummaryTable(config, resources, options) {
111
+ const icon = config.metadata?.icon || '📦';
112
+ const lines = [
113
+ `\n${icon} Scene "${config.name}" configured successfully!`,
114
+ '',
115
+ ];
116
+ lines.push('Created resources:');
117
+ lines.push('');
118
+ resources.forEach(resource => {
119
+ lines.push(` ${resource.type}: ${resource.id}`);
120
+ for (const [key, value] of Object.entries(resource.output)) {
121
+ lines.push(` - ${key}: ${value}`);
122
+ }
123
+ lines.push('');
124
+ });
125
+ if (options.duration !== undefined) {
126
+ const seconds = (options.duration / 1000).toFixed(2);
127
+ lines.push(`Duration: ${seconds}s`);
128
+ }
129
+ return lines.join('\n');
130
+ }
131
+ renderSummaryJson(config, resources, options) {
132
+ return JSON.stringify({
133
+ success: true,
134
+ scene: config.name,
135
+ resources: resources.map(r => ({
136
+ id: r.id,
137
+ type: r.type,
138
+ output: r.output,
139
+ status: r.status,
140
+ })),
141
+ duration: options.duration,
142
+ }, null, 2);
143
+ }
144
+ getNextSpinnerFrame() {
145
+ const frame = this.spinnerFrames[this.spinnerIndex] ?? '⠋';
146
+ this.spinnerIndex = (this.spinnerIndex + 1) % this.spinnerFrames.length;
147
+ return frame;
148
+ }
149
+ }
150
+ exports.OutputRenderer = OutputRenderer;
151
+ //# sourceMappingURL=output-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-renderer.js","sourceRoot":"","sources":["../../src/setup/output-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { PolyVClient } from '@polyv/live-api-sdk';
2
+ export interface ResourceHandler {
3
+ create(params: Record<string, any>, outputConfig?: Record<string, string>): Promise<Record<string, any>>;
4
+ rollback?(resource: Record<string, any>): Promise<void>;
5
+ }
6
+ export interface ResourceHandlers {
7
+ channel: ResourceHandler;
8
+ product: ResourceHandler;
9
+ coupon: ResourceHandler;
10
+ watchCondition: ResourceHandler;
11
+ }
12
+ export declare function createResourceHandlers(client: PolyVClient): ResourceHandlers;
13
+ //# sourceMappingURL=resource-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-handlers.d.ts","sourceRoot":"","sources":["../../src/setup/resource-handlers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKlD,MAAM,WAAW,eAAe;IAO9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAMzG,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAKD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,eAAe,CAAC;IACxB,cAAc,EAAE,eAAe,CAAC;CACjC;AAOD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAO5E"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createResourceHandlers = createResourceHandlers;
4
+ function createResourceHandlers(client) {
5
+ return {
6
+ channel: createChannelHandler(client),
7
+ product: createProductHandler(client),
8
+ coupon: createCouponHandler(client),
9
+ watchCondition: createWatchConditionHandler(client),
10
+ };
11
+ }
12
+ function createChannelHandler(client) {
13
+ return {
14
+ async create(params, outputConfig) {
15
+ const response = await client.channel.createChannelV4(params);
16
+ if (outputConfig) {
17
+ return mapOutputFields(response, outputConfig);
18
+ }
19
+ return {
20
+ channelId: response.channelId,
21
+ channelName: params['name'],
22
+ channelPasswd: response.channelPasswd,
23
+ userId: response.userId,
24
+ };
25
+ },
26
+ async rollback(resource) {
27
+ const channelId = resource['channelId'];
28
+ if (!channelId) {
29
+ throw new Error('Cannot rollback channel: channelId is missing');
30
+ }
31
+ const userId = resource['userId'] || resource['createdUserId'] || '';
32
+ await client.channel.deleteChannel(String(channelId), userId);
33
+ },
34
+ };
35
+ }
36
+ function createWatchConditionHandler(client) {
37
+ return {
38
+ async create(params, outputConfig) {
39
+ const channelId = params['channelId'];
40
+ if (!channelId) {
41
+ throw new Error('channelId is required for watch condition');
42
+ }
43
+ const authSettings = params['authSettings'];
44
+ if (!authSettings || !Array.isArray(authSettings)) {
45
+ throw new Error('authSettings array is required for watch condition');
46
+ }
47
+ await client.channel.updateWatchCondition({
48
+ channelId: String(channelId),
49
+ authSettings: authSettings,
50
+ });
51
+ const result = {
52
+ channelId,
53
+ authSettings,
54
+ success: true,
55
+ };
56
+ if (outputConfig) {
57
+ return mapOutputFields(result, outputConfig);
58
+ }
59
+ return result;
60
+ },
61
+ };
62
+ }
63
+ function createProductHandler(client) {
64
+ return {
65
+ async create(params, outputConfig) {
66
+ if (!params['channelId']) {
67
+ throw new Error('channelId is required for product creation');
68
+ }
69
+ const response = await client.channel.addChannelProduct(params);
70
+ if (outputConfig) {
71
+ return mapOutputFields(response, outputConfig);
72
+ }
73
+ return {
74
+ productId: response.productId,
75
+ name: response.name,
76
+ channelId: params['channelId'],
77
+ };
78
+ },
79
+ async rollback(resource) {
80
+ const channelId = resource['channelId'];
81
+ const productId = resource['productId'];
82
+ if (!channelId || !productId) {
83
+ throw new Error('Cannot rollback product: channelId or productId is missing');
84
+ }
85
+ await client.channel.deleteChannelProduct({
86
+ channelId,
87
+ productId,
88
+ });
89
+ },
90
+ };
91
+ }
92
+ function createCouponHandler(client) {
93
+ return {
94
+ async create(params, outputConfig) {
95
+ const couponId = await client.v4Platform.createCoupon(params);
96
+ if (outputConfig) {
97
+ return mapOutputFields({ couponId, ...params }, outputConfig);
98
+ }
99
+ return {
100
+ couponId,
101
+ name: params['name'],
102
+ };
103
+ },
104
+ async rollback(resource) {
105
+ const couponId = resource['couponId'];
106
+ if (!couponId) {
107
+ throw new Error('Cannot rollback coupon: couponId is missing');
108
+ }
109
+ await client.v4Platform.deleteCouponsBatch({
110
+ couponIds: [couponId],
111
+ });
112
+ },
113
+ };
114
+ }
115
+ function mapOutputFields(response, outputConfig) {
116
+ const result = {};
117
+ for (const [outputField, responsePath] of Object.entries(outputConfig)) {
118
+ const value = getNestedValue(response, responsePath);
119
+ if (value !== undefined) {
120
+ result[outputField] = value;
121
+ }
122
+ }
123
+ return result;
124
+ }
125
+ function getNestedValue(obj, path) {
126
+ const parts = path.split('.');
127
+ let value = obj;
128
+ for (const part of parts) {
129
+ if (value === undefined || value === null) {
130
+ return undefined;
131
+ }
132
+ value = value[part];
133
+ }
134
+ return value;
135
+ }
136
+ //# sourceMappingURL=resource-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-handlers.js","sourceRoot":"","sources":["../../src/setup/resource-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export interface SceneResource {
2
+ id: string;
3
+ type: string;
4
+ description?: string;
5
+ dependsOn?: string | string[];
6
+ params: Record<string, any>;
7
+ output: Record<string, string>;
8
+ }
9
+ export interface SceneConfig {
10
+ name: string;
11
+ version: string;
12
+ description?: string;
13
+ metadata?: {
14
+ icon?: string;
15
+ category?: string;
16
+ tags?: string[];
17
+ };
18
+ resources: SceneResource[];
19
+ outputTemplate?: string;
20
+ nextSteps?: Array<{
21
+ command: string;
22
+ description: string;
23
+ }>;
24
+ }
25
+ export interface SceneInfo {
26
+ name: string;
27
+ description?: string | undefined;
28
+ icon?: string | undefined;
29
+ category?: string | undefined;
30
+ tags?: string[] | undefined;
31
+ resources?: number | undefined;
32
+ }
33
+ export declare class SceneConfigLoader {
34
+ private builtinScenesPath;
35
+ private userScenesPath;
36
+ constructor();
37
+ loadScene(name: string): Promise<SceneConfig>;
38
+ loadBuiltinScene(name: string): Promise<SceneConfig>;
39
+ loadUserScene(name: string): Promise<SceneConfig>;
40
+ listBuiltinScenes(): string[];
41
+ listUserScenes(): string[];
42
+ listAllScenes(): {
43
+ builtin: string[];
44
+ user: string[];
45
+ };
46
+ getSceneInfo(name: string): SceneInfo;
47
+ private loadSceneSync;
48
+ getExecutionOrder(config: SceneConfig): string[];
49
+ validateConfig(config: any): string[];
50
+ private validateOutputFieldRefs;
51
+ }
52
+ //# sourceMappingURL=scene-config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-config-loader.d.ts","sourceRoot":"","sources":["../../src/setup/scene-config-loader.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC;IAEX,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAKD,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IAEF,SAAS,EAAE,aAAa,EAAE,CAAC;IAE3B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAKD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AASD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAS;;IAezB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmB7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgCpD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA+BvD,iBAAiB,IAAI,MAAM,EAAE;IAe7B,cAAc,IAAI,MAAM,EAAE;IAe1B,aAAa,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAYtD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAqBrC,OAAO,CAAC,aAAa;IAoBrB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE;IAkDhD,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE;IA0ErC,OAAO,CAAC,uBAAuB;CA6BhC"}
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SceneConfigLoader = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const yaml = __importStar(require("js-yaml"));
41
+ const js_yaml_1 = require("js-yaml");
42
+ const SUPPORTED_RESOURCE_TYPES = ['channel', 'product', 'coupon', 'watchCondition'];
43
+ class SceneConfigLoader {
44
+ constructor() {
45
+ this.builtinScenesPath = path.join(__dirname, '..', 'setup-scenes');
46
+ this.userScenesPath = path.join(os.homedir(), '.polyv', 'scenes');
47
+ }
48
+ async loadScene(name) {
49
+ try {
50
+ return await this.loadBuiltinScene(name);
51
+ }
52
+ catch (builtinError) {
53
+ try {
54
+ return await this.loadUserScene(name);
55
+ }
56
+ catch (userError) {
57
+ throw new Error(`Scene "${name}" not found. Use 'setup --list' to see available scenes.`);
58
+ }
59
+ }
60
+ }
61
+ async loadBuiltinScene(name) {
62
+ const scenePath = path.join(this.builtinScenesPath, `${name}.yaml`);
63
+ if (!fs.existsSync(scenePath)) {
64
+ throw new Error(`Builtin scene "${name}" not found`);
65
+ }
66
+ const content = fs.readFileSync(scenePath, 'utf-8');
67
+ let config;
68
+ try {
69
+ config = yaml.load(content);
70
+ }
71
+ catch (e) {
72
+ if (e instanceof js_yaml_1.YAMLException) {
73
+ throw new Error(`Invalid YAML in builtin scene "${name}": ${e.message}`);
74
+ }
75
+ throw e;
76
+ }
77
+ const errors = this.validateConfig(config);
78
+ if (errors.length > 0) {
79
+ throw new Error(`Invalid scene config: ${errors.join(', ')}`);
80
+ }
81
+ return config;
82
+ }
83
+ async loadUserScene(name) {
84
+ const scenePath = path.join(this.userScenesPath, `${name}.yaml`);
85
+ if (!fs.existsSync(scenePath)) {
86
+ throw new Error(`User scene "${name}" not found`);
87
+ }
88
+ const content = fs.readFileSync(scenePath, 'utf-8');
89
+ let config;
90
+ try {
91
+ config = yaml.load(content);
92
+ }
93
+ catch (e) {
94
+ if (e instanceof js_yaml_1.YAMLException) {
95
+ throw new Error(`Invalid YAML in user scene "${name}": ${e.message}`);
96
+ }
97
+ throw e;
98
+ }
99
+ const errors = this.validateConfig(config);
100
+ if (errors.length > 0) {
101
+ throw new Error(`Invalid scene config: ${errors.join(', ')}`);
102
+ }
103
+ return config;
104
+ }
105
+ listBuiltinScenes() {
106
+ if (!fs.existsSync(this.builtinScenesPath)) {
107
+ return [];
108
+ }
109
+ const files = fs.readdirSync(this.builtinScenesPath);
110
+ return files
111
+ .filter(file => file.endsWith('.yaml') || file.endsWith('.yml'))
112
+ .map(file => path.basename(file, path.extname(file)));
113
+ }
114
+ listUserScenes() {
115
+ if (!fs.existsSync(this.userScenesPath)) {
116
+ return [];
117
+ }
118
+ const files = fs.readdirSync(this.userScenesPath);
119
+ return files
120
+ .filter(file => file.endsWith('.yaml') || file.endsWith('.yml'))
121
+ .map(file => path.basename(file, path.extname(file)));
122
+ }
123
+ listAllScenes() {
124
+ return {
125
+ builtin: this.listBuiltinScenes(),
126
+ user: this.listUserScenes(),
127
+ };
128
+ }
129
+ getSceneInfo(name) {
130
+ try {
131
+ const config = this.loadSceneSync(name);
132
+ const info = {
133
+ name: config.name,
134
+ resources: config.resources.length,
135
+ };
136
+ if (config.description)
137
+ info.description = config.description;
138
+ if (config.metadata?.icon)
139
+ info.icon = config.metadata.icon;
140
+ if (config.metadata?.category)
141
+ info.category = config.metadata.category;
142
+ if (config.metadata?.tags)
143
+ info.tags = config.metadata.tags;
144
+ return info;
145
+ }
146
+ catch {
147
+ return { name };
148
+ }
149
+ }
150
+ loadSceneSync(name) {
151
+ let scenePath = path.join(this.builtinScenesPath, `${name}.yaml`);
152
+ if (!fs.existsSync(scenePath)) {
153
+ scenePath = path.join(this.userScenesPath, `${name}.yaml`);
154
+ }
155
+ if (!fs.existsSync(scenePath)) {
156
+ throw new Error(`Scene "${name}" not found`);
157
+ }
158
+ const content = fs.readFileSync(scenePath, 'utf-8');
159
+ return yaml.load(content);
160
+ }
161
+ getExecutionOrder(config) {
162
+ const resources = config.resources;
163
+ const ordered = [];
164
+ const visited = new Set();
165
+ const visiting = new Set();
166
+ const visit = (resource) => {
167
+ if (visited.has(resource.id)) {
168
+ return;
169
+ }
170
+ if (visiting.has(resource.id)) {
171
+ throw new Error(`Circular dependency detected at resource "${resource.id}"`);
172
+ }
173
+ visiting.add(resource.id);
174
+ if (resource.dependsOn) {
175
+ const deps = Array.isArray(resource.dependsOn)
176
+ ? resource.dependsOn
177
+ : [resource.dependsOn];
178
+ for (const depId of deps) {
179
+ const depResource = resources.find(r => r.id === depId);
180
+ if (!depResource) {
181
+ throw new Error(`Dependency "${depId}" not found for resource "${resource.id}"`);
182
+ }
183
+ visit(depResource);
184
+ }
185
+ }
186
+ visiting.delete(resource.id);
187
+ visited.add(resource.id);
188
+ ordered.push(resource.id);
189
+ };
190
+ for (const resource of resources) {
191
+ visit(resource);
192
+ }
193
+ return ordered;
194
+ }
195
+ validateConfig(config) {
196
+ const errors = [];
197
+ if (!config.name || config.name.trim() === '') {
198
+ errors.push('name is required');
199
+ }
200
+ if (!config.version || config.version.trim() === '') {
201
+ errors.push('version is required');
202
+ }
203
+ if (!Array.isArray(config.resources) || config.resources.length === 0) {
204
+ errors.push('resources must not be empty');
205
+ return errors;
206
+ }
207
+ const resourceIds = config.resources.map((r) => r.id).filter((id) => typeof id === 'string');
208
+ const uniqueIds = new Set(resourceIds);
209
+ if (resourceIds.length !== uniqueIds.size) {
210
+ const duplicates = resourceIds.filter((id, index) => resourceIds.indexOf(id) !== index);
211
+ errors.push(`duplicate resource IDs detected: ${[...new Set(duplicates)].join(', ')}`);
212
+ }
213
+ const resourceIdSet = uniqueIds;
214
+ for (const resource of config.resources) {
215
+ if (!resource.id || resource.id.trim() === '') {
216
+ errors.push('resource id is required');
217
+ }
218
+ if (!resource.type) {
219
+ errors.push(`resource type is required for "${resource.id || 'unknown'}"`);
220
+ }
221
+ else if (!SUPPORTED_RESOURCE_TYPES.includes(resource.type)) {
222
+ errors.push(`invalid resource type: ${resource.type}`);
223
+ }
224
+ if (resource.dependsOn) {
225
+ const deps = Array.isArray(resource.dependsOn)
226
+ ? resource.dependsOn
227
+ : [resource.dependsOn];
228
+ for (const dep of deps) {
229
+ if (!resourceIdSet.has(dep)) {
230
+ errors.push(`dependsOn references nonexistent resource "${dep}" in "${resource.id}"`);
231
+ }
232
+ }
233
+ }
234
+ if (resource.params && typeof resource.params === 'object') {
235
+ this.validateOutputFieldRefs(resource.params, resourceIdSet, resource.id, errors);
236
+ }
237
+ }
238
+ try {
239
+ this.getExecutionOrder(config);
240
+ }
241
+ catch (error) {
242
+ if (error instanceof Error && error.message.includes('Circular dependency')) {
243
+ errors.push('circular dependency detected');
244
+ }
245
+ }
246
+ return errors;
247
+ }
248
+ validateOutputFieldRefs(obj, resourceIds, resourceId, errors) {
249
+ if (typeof obj === 'string') {
250
+ const refPattern = /\{([a-zA-Z_][a-zA-Z0-9_]*\.[a-zA-Z_][a-zA-Z0-9_]*)\}/g;
251
+ let match;
252
+ while ((match = refPattern.exec(obj)) !== null) {
253
+ const refPath = match[1];
254
+ if (refPath) {
255
+ const [refResourceId] = refPath.split('.');
256
+ if (refResourceId && !resourceIds.has(refResourceId)) {
257
+ errors.push(`reference to undefined resource "${refResourceId}" in "${resourceId}"`);
258
+ }
259
+ }
260
+ }
261
+ }
262
+ else if (Array.isArray(obj)) {
263
+ for (const item of obj) {
264
+ this.validateOutputFieldRefs(item, resourceIds, resourceId, errors);
265
+ }
266
+ }
267
+ else if (typeof obj === 'object' && obj !== null) {
268
+ for (const value of Object.values(obj)) {
269
+ this.validateOutputFieldRefs(value, resourceIds, resourceId, errors);
270
+ }
271
+ }
272
+ }
273
+ }
274
+ exports.SceneConfigLoader = SceneConfigLoader;
275
+ //# sourceMappingURL=scene-config-loader.js.map