loopwind 0.25.6 → 0.25.7

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 (90) hide show
  1. package/app/.astro/types.d.ts +1 -0
  2. package/app/dist/_astro/callback.Ci5gaEfJ.css +1 -0
  3. package/app/dist/auth/callback/index.html +81 -0
  4. package/app/dist/device/index.html +70 -0
  5. package/app/dist/index.html +327 -0
  6. package/app/package-lock.json +9239 -0
  7. package/app/package.json +23 -0
  8. package/app/wrangler.toml +8 -0
  9. package/dist/cli.js +54 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/login.d.ts +5 -0
  12. package/dist/commands/login.d.ts.map +1 -0
  13. package/dist/commands/login.js +60 -0
  14. package/dist/commands/login.js.map +1 -0
  15. package/dist/commands/logout.d.ts +5 -0
  16. package/dist/commands/logout.d.ts.map +1 -0
  17. package/dist/commands/logout.js +15 -0
  18. package/dist/commands/logout.js.map +1 -0
  19. package/dist/commands/publish.d.ts +10 -0
  20. package/dist/commands/publish.d.ts.map +1 -0
  21. package/dist/commands/publish.js +155 -0
  22. package/dist/commands/publish.js.map +1 -0
  23. package/dist/commands/templates.d.ts +5 -0
  24. package/dist/commands/templates.d.ts.map +1 -0
  25. package/dist/commands/templates.js +60 -0
  26. package/dist/commands/templates.js.map +1 -0
  27. package/dist/commands/unpublish.d.ts +5 -0
  28. package/dist/commands/unpublish.d.ts.map +1 -0
  29. package/dist/commands/unpublish.js +54 -0
  30. package/dist/commands/unpublish.js.map +1 -0
  31. package/dist/commands/whoami.d.ts +5 -0
  32. package/dist/commands/whoami.d.ts.map +1 -0
  33. package/dist/commands/whoami.js +30 -0
  34. package/dist/commands/whoami.js.map +1 -0
  35. package/dist/lib/api.d.ts +92 -0
  36. package/dist/lib/api.d.ts.map +1 -0
  37. package/dist/lib/api.js +149 -0
  38. package/dist/lib/api.js.map +1 -0
  39. package/dist/lib/auth.d.ts +41 -0
  40. package/dist/lib/auth.d.ts.map +1 -0
  41. package/dist/lib/auth.js +89 -0
  42. package/dist/lib/auth.js.map +1 -0
  43. package/dist/lib/bundler.d.ts +18 -0
  44. package/dist/lib/bundler.d.ts.map +1 -0
  45. package/dist/lib/bundler.js +105 -0
  46. package/dist/lib/bundler.js.map +1 -0
  47. package/dist/lib/helpers.d.ts +35 -2
  48. package/dist/lib/helpers.d.ts.map +1 -1
  49. package/dist/lib/helpers.js +91 -13
  50. package/dist/lib/helpers.js.map +1 -1
  51. package/dist/lib/utils.d.ts.map +1 -1
  52. package/dist/lib/utils.js +9 -0
  53. package/dist/lib/utils.js.map +1 -1
  54. package/dist/sdk/edge.d.ts +65 -0
  55. package/dist/sdk/edge.d.ts.map +1 -0
  56. package/dist/sdk/edge.js +329 -0
  57. package/dist/sdk/edge.js.map +1 -0
  58. package/dist/sdk/errors.d.ts +64 -0
  59. package/dist/sdk/errors.d.ts.map +1 -0
  60. package/dist/sdk/errors.js +94 -0
  61. package/dist/sdk/errors.js.map +1 -0
  62. package/dist/sdk/index.d.ts +29 -0
  63. package/dist/sdk/index.d.ts.map +1 -0
  64. package/dist/sdk/index.js +30 -0
  65. package/dist/sdk/index.js.map +1 -0
  66. package/dist/sdk/render.d.ts +52 -0
  67. package/dist/sdk/render.d.ts.map +1 -0
  68. package/dist/sdk/render.js +432 -0
  69. package/dist/sdk/render.js.map +1 -0
  70. package/dist/sdk/types.d.ts +185 -0
  71. package/dist/sdk/types.d.ts.map +1 -0
  72. package/dist/sdk/types.js +5 -0
  73. package/dist/sdk/types.js.map +1 -0
  74. package/dist/types/template.d.ts +18 -0
  75. package/dist/types/template.d.ts.map +1 -1
  76. package/package.json +26 -4
  77. package/plans/PLATFORM.md +1637 -237
  78. package/plans/PLATFORM_IMPLEMENTATION.md +1347 -530
  79. package/plans/SDK.md +797 -0
  80. package/platform/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/ebad93a0a7be9c5768c512f3e30740b64d2b6e575277a40d77044af5ae8fd3f2.sqlite +0 -0
  81. package/platform/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/ebad93a0a7be9c5768c512f3e30740b64d2b6e575277a40d77044af5ae8fd3f2.sqlite-shm +0 -0
  82. package/platform/.wrangler/state/v3/d1/miniflare-D1DatabaseObject/ebad93a0a7be9c5768c512f3e30740b64d2b6e575277a40d77044af5ae8fd3f2.sqlite-wal +0 -0
  83. package/platform/migrations/0001_initial.sql +90 -0
  84. package/platform/package-lock.json +3104 -0
  85. package/platform/package.json +30 -0
  86. package/platform/wrangler.toml +43 -0
  87. package/tests-sdk/createRenderer.test.ts +251 -0
  88. package/tests-sdk/errors.test.ts +230 -0
  89. package/tests-sdk/render.test.ts +241 -0
  90. package/tests-sdk/tw.test.ts +277 -0
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "loopwind-app",
3
+ "type": "module",
4
+ "version": "0.1.0",
5
+ "scripts": {
6
+ "dev": "astro dev",
7
+ "build": "astro build",
8
+ "preview": "astro preview",
9
+ "deploy": "astro build && wrangler deploy"
10
+ },
11
+ "dependencies": {
12
+ "@astrojs/cloudflare": "^11.1.0",
13
+ "@astrojs/react": "^4.4.2",
14
+ "astro": "^4.15.11",
15
+ "react": "^19.2.0",
16
+ "react-dom": "^19.2.0"
17
+ },
18
+ "devDependencies": {
19
+ "@tailwindcss/vite": "^4.0.0",
20
+ "tailwindcss": "^4.0.0",
21
+ "wrangler": "^4.54.0"
22
+ }
23
+ }
@@ -0,0 +1,8 @@
1
+ name = "loopwind-app"
2
+ compatibility_date = "2024-12-01"
3
+ assets = { directory = "dist" }
4
+
5
+ # Custom domain
6
+ [[routes]]
7
+ pattern = "app.loopwind.dev"
8
+ custom_domain = true
package/dist/cli.js CHANGED
@@ -6,6 +6,12 @@ import { renderCommand } from './commands/render.js';
6
6
  import { validateCommand } from './commands/validate.js';
7
7
  import { initCommand } from './commands/init.js';
8
8
  import { defaultCommand } from './commands/default.js';
9
+ import { loginCommand } from './commands/login.js';
10
+ import { logoutCommand } from './commands/logout.js';
11
+ import { whoamiCommand } from './commands/whoami.js';
12
+ import { publishCommand } from './commands/publish.js';
13
+ import { templatesCommand } from './commands/templates.js';
14
+ import { unpublishCommand } from './commands/unpublish.js';
9
15
  import { readFileSync } from 'fs';
10
16
  import { fileURLToPath } from 'url';
11
17
  import { dirname, join } from 'path';
@@ -66,5 +72,53 @@ program
66
72
  .command('init')
67
73
  .description('Initialize a loopwind.json config file')
68
74
  .action(initCommand);
75
+ // Platform commands
76
+ // loopwind login
77
+ program
78
+ .command('login')
79
+ .description('Authenticate with Loopwind Platform')
80
+ .action(loginCommand);
81
+ // loopwind logout
82
+ program
83
+ .command('logout')
84
+ .description('Log out from Loopwind Platform')
85
+ .action(logoutCommand);
86
+ // loopwind whoami
87
+ program
88
+ .command('whoami')
89
+ .description('Show current user and organization')
90
+ .action(whoamiCommand);
91
+ // loopwind publish [template]
92
+ program
93
+ .command('publish [template]')
94
+ .description('Publish a template to Loopwind Platform')
95
+ .option('-n, --name <name>', 'Override template name')
96
+ .option('-o, --org <org>', 'Organization to publish to (slug or name)')
97
+ .addHelpText('after', `
98
+ Examples:
99
+ Publish current directory:
100
+ $ loopwind publish
101
+
102
+ Publish a specific template:
103
+ $ loopwind publish banner-hero
104
+ $ loopwind publish ./my-template/template.tsx
105
+
106
+ Publish with custom name:
107
+ $ loopwind publish banner-hero --name my-banner
108
+
109
+ Publish to a specific organization:
110
+ $ loopwind publish banner-hero --org my-company
111
+ `)
112
+ .action(publishCommand);
113
+ // loopwind templates
114
+ program
115
+ .command('templates')
116
+ .description('List published templates')
117
+ .action(templatesCommand);
118
+ // loopwind unpublish <name>
119
+ program
120
+ .command('unpublish <name>')
121
+ .description('Remove a template from Loopwind Platform')
122
+ .action(unpublishCommand);
69
123
  program.parse();
70
124
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wFAAwF,CAAC;KACrG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,wBAAwB;AACxB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,wBAAwB,CAAC;KAC/E,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,mCAAmC;AACnC,OAAO;KACJ,OAAO,CAAC,2BAA2B,CAAC;KACpC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,oBAAoB,EAAE,iEAAiE,CAAC;KAC/F,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,EAAE,KAAK,CAAC;KAC/E,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;KACjE,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,EAAE,IAAI,CAAC;KAC9E,MAAM,CAAC,UAAU,EAAE,4DAA4D,CAAC;KAChF,MAAM,CAAC,SAAS,EAAE,yDAAyD,CAAC;KAC5E,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;CAcvB,CAAC;KACC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wFAAwF,CAAC;KACrG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,wBAAwB;AACxB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,wBAAwB,CAAC;KAC/E,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,mCAAmC;AACnC,OAAO;KACJ,OAAO,CAAC,2BAA2B,CAAC;KACpC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,oBAAoB,EAAE,iEAAiE,CAAC;KAC/F,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,EAAE,KAAK,CAAC;KAC/E,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;KACjE,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,EAAE,IAAI,CAAC;KAC9E,MAAM,CAAC,UAAU,EAAE,4DAA4D,CAAC;KAChF,MAAM,CAAC,SAAS,EAAE,yDAAyD,CAAC;KAC5E,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;CAcvB,CAAC;KACC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,oBAAoB;AAEpB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,8BAA8B;AAC9B,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;KACrD,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;KACtE,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;CAcvB,CAAC;KACC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,qBAAqB;AACrB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,4BAA4B;AAC5B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Login command - authenticate with Loopwind Platform
3
+ */
4
+ export declare function loginCommand(): Promise<void>;
5
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DlD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Login command - authenticate with Loopwind Platform
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { isAuthenticated, loadCredentials } from '../lib/auth.js';
7
+ import { startDeviceFlow, pollForToken, fetchAndSaveUserInfo, } from '../lib/api.js';
8
+ export async function loginCommand() {
9
+ // Check if already logged in
10
+ if (await isAuthenticated()) {
11
+ const creds = await loadCredentials();
12
+ console.log(chalk.yellow(`\nAlready logged in as ${chalk.bold(creds?.organization.name)}`));
13
+ console.log(chalk.dim('Run `loopwind logout` to sign out first.\n'));
14
+ return;
15
+ }
16
+ console.log(chalk.blue('\nLogging in to Loopwind...\n'));
17
+ const spinner = ora('Starting authentication...').start();
18
+ try {
19
+ // Start device code flow
20
+ const deviceFlow = await startDeviceFlow();
21
+ spinner.stop();
22
+ // Show user code and URL
23
+ console.log(chalk.white('Please visit:'));
24
+ console.log(chalk.cyan.bold(` ${deviceFlow.verification_uri_complete}`));
25
+ console.log();
26
+ console.log(chalk.white('Or go to:'));
27
+ console.log(chalk.cyan(` ${deviceFlow.verification_uri}`));
28
+ console.log(chalk.white('And enter code:'));
29
+ console.log(chalk.cyan.bold(` ${deviceFlow.user_code}`));
30
+ console.log();
31
+ // Try to open browser
32
+ try {
33
+ const open = (await import('open')).default;
34
+ await open(deviceFlow.verification_uri_complete);
35
+ console.log(chalk.dim('Browser opened automatically.'));
36
+ }
37
+ catch {
38
+ // Browser open failed, user will manually navigate
39
+ }
40
+ console.log();
41
+ spinner.start('Waiting for authorization...');
42
+ // Poll for token
43
+ const tokenResponse = await pollForToken(deviceFlow.device_code, deviceFlow.interval * 1000);
44
+ spinner.text = 'Fetching user info...';
45
+ // Save credentials
46
+ const credentials = await fetchAndSaveUserInfo(tokenResponse.access_token);
47
+ spinner.succeed(chalk.green('Logged in successfully!'));
48
+ console.log();
49
+ console.log(chalk.dim(`Organization: ${chalk.white(credentials.organization.name)}`));
50
+ console.log(chalk.dim(`Slug: ${chalk.white(credentials.organization.slug)}`));
51
+ console.log();
52
+ console.log(chalk.dim('You can now publish templates with `loopwind publish`\n'));
53
+ }
54
+ catch (error) {
55
+ spinner.fail(chalk.red('Login failed'));
56
+ console.error(chalk.red(`\nError: ${error.message}\n`));
57
+ process.exit(1);
58
+ }
59
+ }
60
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Logout command - clear stored credentials
3
+ */
4
+ export declare function logoutCommand(): Promise<void>;
5
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Logout command - clear stored credentials
3
+ */
4
+ import chalk from 'chalk';
5
+ import { clearCredentials, isAuthenticated, loadCredentials } from '../lib/auth.js';
6
+ export async function logoutCommand() {
7
+ if (!(await isAuthenticated())) {
8
+ console.log(chalk.yellow('\nNot currently logged in.\n'));
9
+ return;
10
+ }
11
+ const creds = await loadCredentials();
12
+ await clearCredentials();
13
+ console.log(chalk.green(`\nLogged out from ${chalk.bold(creds?.organization.name)}\n`));
14
+ }
15
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpF,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,MAAM,gBAAgB,EAAE,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Publish command - publish template to Loopwind Platform
3
+ */
4
+ interface PublishOptions {
5
+ name?: string;
6
+ org?: string;
7
+ }
8
+ export declare function publishCommand(templatePath?: string, options?: PublishOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgCD,wBAAsB,cAAc,CAClC,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkIf"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Publish command - publish template to Loopwind Platform
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { existsSync } from 'fs';
7
+ import { basename, resolve, dirname } from 'path';
8
+ import { createInterface } from 'readline';
9
+ import { isAuthenticated, loadCredentials } from '../lib/auth.js';
10
+ import { publishTemplate, listOrganizations, setCurrentOrg } from '../lib/api.js';
11
+ import { bundleTemplate } from '../lib/bundler.js';
12
+ import { getTemplatePathAsync } from '../lib/utils.js';
13
+ /**
14
+ * Prompt user to select from a list
15
+ */
16
+ async function promptSelect(message, options) {
17
+ const rl = createInterface({
18
+ input: process.stdin,
19
+ output: process.stdout,
20
+ });
21
+ console.log(chalk.white(`\n${message}`));
22
+ options.forEach((opt, i) => {
23
+ console.log(chalk.dim(` ${i + 1}) ${opt.label}`));
24
+ });
25
+ return new Promise((resolve) => {
26
+ rl.question(chalk.dim('\nEnter number: '), (answer) => {
27
+ rl.close();
28
+ const index = parseInt(answer, 10) - 1;
29
+ if (index >= 0 && index < options.length) {
30
+ resolve(options[index].value);
31
+ }
32
+ else {
33
+ resolve(options[0].value); // Default to first
34
+ }
35
+ });
36
+ });
37
+ }
38
+ export async function publishCommand(templatePath, options = {}) {
39
+ // Check authentication
40
+ if (!(await isAuthenticated())) {
41
+ console.log(chalk.red('\nNot logged in.'));
42
+ console.log(chalk.dim('Run `loopwind login` to authenticate.\n'));
43
+ process.exit(1);
44
+ }
45
+ // Check for multiple organizations
46
+ const credentials = await loadCredentials();
47
+ let currentOrg = credentials?.organization;
48
+ try {
49
+ const orgs = await listOrganizations();
50
+ if (orgs.length > 1) {
51
+ // If --org flag provided, use it
52
+ if (options.org) {
53
+ const selectedOrg = orgs.find(o => o.slug === options.org || o.id === options.org || o.name === options.org);
54
+ if (!selectedOrg) {
55
+ console.log(chalk.red(`\nOrganization "${options.org}" not found.\n`));
56
+ console.log(chalk.dim('Available organizations:'));
57
+ orgs.forEach(o => console.log(chalk.dim(` - ${o.name} (${o.slug})`)));
58
+ process.exit(1);
59
+ }
60
+ currentOrg = selectedOrg;
61
+ }
62
+ else {
63
+ // Prompt user to select org
64
+ const selectedOrgId = await promptSelect('Select organization to publish to:', orgs.map(o => ({
65
+ label: `${o.name}${o.id === currentOrg?.id ? ' (current)' : ''}`,
66
+ value: o.id,
67
+ })));
68
+ currentOrg = orgs.find(o => o.id === selectedOrgId);
69
+ }
70
+ // Set the org for API requests
71
+ if (currentOrg) {
72
+ setCurrentOrg(currentOrg.id);
73
+ }
74
+ console.log(chalk.dim(`\nPublishing to: ${currentOrg?.name}\n`));
75
+ }
76
+ }
77
+ catch {
78
+ // If listing orgs fails, continue with current org from credentials
79
+ }
80
+ console.log(chalk.blue('Publishing template to Loopwind...\n'));
81
+ const spinner = ora('Finding template...').start();
82
+ try {
83
+ // Find template
84
+ let templateFile;
85
+ let templateName;
86
+ if (templatePath) {
87
+ // Try to resolve the template path
88
+ try {
89
+ templateFile = await getTemplatePathAsync(templatePath);
90
+ // Extract template name from path
91
+ if (templatePath.endsWith('.tsx')) {
92
+ templateName = options.name || basename(dirname(templateFile));
93
+ }
94
+ else {
95
+ templateName = options.name || basename(templatePath);
96
+ }
97
+ }
98
+ catch {
99
+ // If not found in .loopwind, try as direct file
100
+ if (existsSync(templatePath)) {
101
+ templateFile = resolve(templatePath);
102
+ templateName = options.name || basename(templateFile, '.tsx');
103
+ }
104
+ else {
105
+ throw new Error(`Template not found: ${templatePath}`);
106
+ }
107
+ }
108
+ }
109
+ else {
110
+ // Look for template in current directory
111
+ const possibleFiles = ['template.tsx', 'index.tsx', 'og.tsx'];
112
+ const found = possibleFiles.find((f) => existsSync(f));
113
+ if (!found) {
114
+ throw new Error('No template specified. Provide a template path or run from a directory with template.tsx');
115
+ }
116
+ templateFile = resolve(found);
117
+ templateName = options.name || basename(process.cwd());
118
+ }
119
+ // Verify file exists
120
+ if (!existsSync(templateFile)) {
121
+ throw new Error(`Template file not found: ${templateFile}`);
122
+ }
123
+ spinner.text = `Bundling ${templateName}...`;
124
+ // Bundle the template
125
+ const bundleBuffer = await bundleTemplate(templateFile);
126
+ const bundleBase64 = Buffer.from(bundleBuffer).toString('base64');
127
+ spinner.text = `Publishing ${templateName}...`;
128
+ // Publish to platform
129
+ const result = await publishTemplate(templateName, bundleBase64, {
130
+ // Could read meta from meta.json if present
131
+ });
132
+ spinner.succeed(chalk.green(`Published ${chalk.bold(templateName)} v${result.version}`));
133
+ console.log();
134
+ // Show render URL
135
+ console.log(chalk.white('Render URL:'));
136
+ console.log(chalk.cyan.bold(` ${result.render_url}`));
137
+ console.log();
138
+ console.log(chalk.dim('Example:'));
139
+ console.log(chalk.dim(` ${result.render_url}?title=Hello%20World`));
140
+ console.log();
141
+ if (result.created) {
142
+ console.log(chalk.dim('This is a new template. A render token has been created automatically.'));
143
+ }
144
+ else {
145
+ console.log(chalk.dim('Template updated. Existing render URLs continue to work.'));
146
+ }
147
+ console.log();
148
+ }
149
+ catch (error) {
150
+ spinner.fail(chalk.red('Publish failed'));
151
+ console.error(chalk.red(`\nError: ${error.message}\n`));
152
+ process.exit(1);
153
+ }
154
+ }
155
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Templates command - list published templates
3
+ */
4
+ export declare function templatesCommand(): Promise<void>;
5
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0CtD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Templates command - list published templates
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { isAuthenticated } from '../lib/auth.js';
7
+ import { listTemplates } from '../lib/api.js';
8
+ export async function templatesCommand() {
9
+ // Check authentication
10
+ if (!(await isAuthenticated())) {
11
+ console.log(chalk.yellow('\nNot logged in.'));
12
+ console.log(chalk.dim('Run `loopwind login` to authenticate.\n'));
13
+ process.exit(1);
14
+ }
15
+ const spinner = ora('Fetching templates...').start();
16
+ try {
17
+ const templates = await listTemplates();
18
+ if (templates.length === 0) {
19
+ spinner.succeed(chalk.dim('No templates published yet.'));
20
+ console.log();
21
+ console.log(chalk.dim('Publish a template with: loopwind publish <template>'));
22
+ console.log();
23
+ return;
24
+ }
25
+ spinner.succeed(`Found ${templates.length} template${templates.length !== 1 ? 's' : ''}`);
26
+ console.log();
27
+ // Display templates in a table-like format
28
+ for (const template of templates) {
29
+ const updated = new Date(template.updated_at);
30
+ const timeAgo = getTimeAgo(updated);
31
+ console.log(chalk.white.bold(` ${template.name}`));
32
+ console.log(chalk.dim(` Version: ${template.version} • Updated ${timeAgo}`));
33
+ }
34
+ console.log();
35
+ console.log(chalk.dim('View details: loopwind templates <name>'));
36
+ console.log();
37
+ }
38
+ catch (error) {
39
+ spinner.fail(chalk.red('Failed to fetch templates'));
40
+ console.error(chalk.red(`\nError: ${error.message}\n`));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ function getTimeAgo(date) {
45
+ const now = new Date();
46
+ const diffMs = now.getTime() - date.getTime();
47
+ const diffMins = Math.floor(diffMs / 60000);
48
+ const diffHours = Math.floor(diffMs / 3600000);
49
+ const diffDays = Math.floor(diffMs / 86400000);
50
+ if (diffMins < 1)
51
+ return 'just now';
52
+ if (diffMins < 60)
53
+ return `${diffMins}m ago`;
54
+ if (diffHours < 24)
55
+ return `${diffHours}h ago`;
56
+ if (diffDays < 30)
57
+ return `${diffDays}d ago`;
58
+ return date.toLocaleDateString();
59
+ }
60
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAgB,MAAM,eAAe,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,uBAAuB;IACvB,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;QAExC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,SAAS,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,2CAA2C;QAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAEpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,OAAO,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,QAAQ,GAAG,EAAE;QAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC7C,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,GAAG,SAAS,OAAO,CAAC;IAC/C,IAAI,QAAQ,GAAG,EAAE;QAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC7C,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unpublish command - remove template from Loopwind Platform
3
+ */
4
+ export declare function unpublishCommand(templateName: string): Promise<void>;
5
+ //# sourceMappingURL=unpublish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish.d.ts","sourceRoot":"","sources":["../../src/commands/unpublish.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC1E"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Unpublish command - remove template from Loopwind Platform
3
+ */
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import readline from 'readline';
7
+ import { isAuthenticated } from '../lib/auth.js';
8
+ import { deleteTemplate } from '../lib/api.js';
9
+ async function confirm(question) {
10
+ const rl = readline.createInterface({
11
+ input: process.stdin,
12
+ output: process.stdout,
13
+ });
14
+ return new Promise((resolve) => {
15
+ rl.question(question, (answer) => {
16
+ rl.close();
17
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
18
+ });
19
+ });
20
+ }
21
+ export async function unpublishCommand(templateName) {
22
+ // Check authentication
23
+ if (!(await isAuthenticated())) {
24
+ console.log(chalk.red('\nNot logged in.'));
25
+ console.log(chalk.dim('Run `loopwind login` to authenticate.\n'));
26
+ process.exit(1);
27
+ }
28
+ if (!templateName) {
29
+ console.log(chalk.red('\nTemplate name required.'));
30
+ console.log(chalk.dim('Usage: loopwind unpublish <template-name>\n'));
31
+ process.exit(1);
32
+ }
33
+ console.log();
34
+ console.log(chalk.yellow(`This will delete ${chalk.bold(templateName)} and all its render tokens.`));
35
+ console.log(chalk.yellow('Existing URLs will stop working.'));
36
+ console.log();
37
+ const confirmed = await confirm(chalk.red('Are you sure? [y/N] '));
38
+ if (!confirmed) {
39
+ console.log(chalk.dim('\nCancelled.\n'));
40
+ return;
41
+ }
42
+ const spinner = ora(`Deleting ${templateName}...`).start();
43
+ try {
44
+ await deleteTemplate(templateName);
45
+ spinner.succeed(chalk.green(`Deleted ${chalk.bold(templateName)}`));
46
+ console.log();
47
+ }
48
+ catch (error) {
49
+ spinner.fail(chalk.red('Failed to delete template'));
50
+ console.error(chalk.red(`\nError: ${error.message}\n`));
51
+ process.exit(1);
52
+ }
53
+ }
54
+ //# sourceMappingURL=unpublish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish.js","sourceRoot":"","sources":["../../src/commands/unpublish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Whoami command - show current user and organization
3
+ */
4
+ export declare function whoamiCommand(): Promise<void>;
5
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BnD"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Whoami command - show current user and organization
3
+ */
4
+ import chalk from 'chalk';
5
+ import { isAuthenticated, loadCredentials } from '../lib/auth.js';
6
+ import { API_BASE_URL } from '../lib/api.js';
7
+ export async function whoamiCommand() {
8
+ if (!(await isAuthenticated())) {
9
+ console.log(chalk.yellow('\nNot logged in.'));
10
+ console.log(chalk.dim('Run `loopwind login` to authenticate.\n'));
11
+ return;
12
+ }
13
+ const creds = await loadCredentials();
14
+ if (!creds) {
15
+ console.log(chalk.red('\nCredentials corrupted. Please run `loopwind login` again.\n'));
16
+ return;
17
+ }
18
+ console.log();
19
+ console.log(chalk.white('Organization:'), chalk.cyan(creds.organization.name));
20
+ console.log(chalk.white('Slug: '), chalk.cyan(creds.organization.slug));
21
+ if (creds.expiresAt) {
22
+ const expiry = new Date(creds.expiresAt);
23
+ const now = new Date();
24
+ const daysLeft = Math.ceil((expiry.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
25
+ console.log(chalk.white('Session: '), chalk.dim(`expires in ${daysLeft} day${daysLeft !== 1 ? 's' : ''}`));
26
+ }
27
+ console.log(chalk.white('API: '), chalk.dim(API_BASE_URL));
28
+ console.log();
29
+ }
30
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;QACxF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/E,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}