nivii 0.3.1 → 0.3.2

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 (86) hide show
  1. package/README.md +142 -215
  2. package/dist/cli.js +1 -1
  3. package/dist/dist/cli.d.ts +3 -0
  4. package/dist/dist/cli.d.ts.map +1 -0
  5. package/dist/dist/cli.js +144 -0
  6. package/dist/dist/cli.js.map +1 -0
  7. package/dist/dist/commands/config.d.ts +2 -0
  8. package/dist/dist/commands/config.d.ts.map +1 -0
  9. package/dist/dist/commands/config.js +32 -0
  10. package/dist/dist/commands/config.js.map +1 -0
  11. package/dist/dist/commands/fullstack.d.ts +12 -0
  12. package/dist/dist/commands/fullstack.d.ts.map +1 -0
  13. package/dist/dist/commands/fullstack.js +173 -0
  14. package/dist/dist/commands/fullstack.js.map +1 -0
  15. package/dist/dist/commands/share.d.ts +18 -0
  16. package/dist/dist/commands/share.d.ts.map +1 -0
  17. package/dist/dist/commands/share.js +125 -0
  18. package/dist/dist/commands/share.js.map +1 -0
  19. package/dist/dist/commands/whoami.d.ts +2 -0
  20. package/dist/dist/commands/whoami.d.ts.map +1 -0
  21. package/dist/dist/commands/whoami.js +17 -0
  22. package/dist/dist/commands/whoami.js.map +1 -0
  23. package/dist/dist/core/analytics.d.ts +11 -0
  24. package/dist/dist/core/analytics.d.ts.map +1 -0
  25. package/dist/dist/core/analytics.js +47 -0
  26. package/dist/dist/core/analytics.js.map +1 -0
  27. package/dist/dist/core/backend.d.ts +26 -0
  28. package/dist/dist/core/backend.d.ts.map +1 -0
  29. package/dist/dist/core/backend.js +185 -0
  30. package/dist/dist/core/backend.js.map +1 -0
  31. package/dist/dist/core/build.d.ts +11 -0
  32. package/dist/dist/core/build.d.ts.map +1 -0
  33. package/dist/dist/core/build.js +34 -0
  34. package/dist/dist/core/build.js.map +1 -0
  35. package/dist/dist/core/detect.d.ts +12 -0
  36. package/dist/dist/core/detect.d.ts.map +1 -0
  37. package/dist/dist/core/detect.js +122 -0
  38. package/dist/dist/core/detect.js.map +1 -0
  39. package/dist/dist/core/env.d.ts +27 -0
  40. package/dist/dist/core/env.d.ts.map +1 -0
  41. package/dist/dist/core/env.js +164 -0
  42. package/dist/dist/core/env.js.map +1 -0
  43. package/dist/dist/core/fullstack.d.ts +29 -0
  44. package/dist/dist/core/fullstack.d.ts.map +1 -0
  45. package/dist/dist/core/fullstack.js +126 -0
  46. package/dist/dist/core/fullstack.js.map +1 -0
  47. package/dist/dist/core/qr.d.ts +4 -0
  48. package/dist/dist/core/qr.d.ts.map +1 -0
  49. package/dist/dist/core/qr.js +29 -0
  50. package/dist/dist/core/qr.js.map +1 -0
  51. package/dist/dist/core/tunnel.d.ts +9 -0
  52. package/dist/dist/core/tunnel.d.ts.map +1 -0
  53. package/dist/dist/core/tunnel.js +55 -0
  54. package/dist/dist/core/tunnel.js.map +1 -0
  55. package/dist/dist/core/upload.d.ts +22 -0
  56. package/dist/dist/core/upload.d.ts.map +1 -0
  57. package/dist/dist/core/upload.js +73 -0
  58. package/dist/dist/core/upload.js.map +1 -0
  59. package/dist/dist/ui/spinner.d.ts +8 -0
  60. package/dist/dist/ui/spinner.d.ts.map +1 -0
  61. package/dist/dist/ui/spinner.js +35 -0
  62. package/dist/dist/ui/spinner.js.map +1 -0
  63. package/dist/dist/ui/theme.d.ts +14 -0
  64. package/dist/dist/ui/theme.d.ts.map +1 -0
  65. package/dist/dist/ui/theme.js +32 -0
  66. package/dist/dist/ui/theme.js.map +1 -0
  67. package/dist/dist/ui/welcome.d.ts +4 -0
  68. package/dist/dist/ui/welcome.d.ts.map +1 -0
  69. package/dist/dist/ui/welcome.js +95 -0
  70. package/dist/dist/ui/welcome.js.map +1 -0
  71. package/dist/dist/utils/config.d.ts +19 -0
  72. package/dist/dist/utils/config.d.ts.map +1 -0
  73. package/dist/dist/utils/config.js +31 -0
  74. package/dist/dist/utils/config.js.map +1 -0
  75. package/dist/dist/utils/hash.d.ts +3 -0
  76. package/dist/dist/utils/hash.d.ts.map +1 -0
  77. package/dist/dist/utils/hash.js +10 -0
  78. package/dist/dist/utils/hash.js.map +1 -0
  79. package/dist/dist/utils/zip.d.ts +2 -0
  80. package/dist/dist/utils/zip.d.ts.map +1 -0
  81. package/dist/dist/utils/zip.js +19 -0
  82. package/dist/dist/utils/zip.js.map +1 -0
  83. package/dist/ui/welcome.js +3 -3
  84. package/package.json +9 -4
  85. package/src/cli.ts +1 -1
  86. package/src/ui/welcome.ts +3 -3
@@ -0,0 +1,14 @@
1
+ export declare const theme: {
2
+ primary: import("chalk").ChalkInstance;
3
+ accent: import("chalk").ChalkInstance;
4
+ success: import("chalk").ChalkInstance;
5
+ warning: import("chalk").ChalkInstance;
6
+ error: import("chalk").ChalkInstance;
7
+ muted: import("chalk").ChalkInstance;
8
+ white: import("chalk").ChalkInstance;
9
+ bold: import("chalk").ChalkInstance;
10
+ dim: import("chalk").ChalkInstance;
11
+ gradient: (text: string) => string;
12
+ box: (lines: string[]) => string;
13
+ };
14
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;qBAWC,MAAM;iBAMV,MAAM,EAAE;CAWtB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import chalk from 'chalk';
2
+ export const theme = {
3
+ primary: chalk.hex('#7C3AED'), // violet
4
+ accent: chalk.hex('#06B6D4'), // cyan
5
+ success: chalk.hex('#10B981'), // emerald
6
+ warning: chalk.hex('#F59E0B'), // amber
7
+ error: chalk.hex('#EF4444'), // red
8
+ muted: chalk.hex('#6B7280'), // gray
9
+ white: chalk.white,
10
+ bold: chalk.bold,
11
+ dim: chalk.dim,
12
+ gradient: (text) => {
13
+ const chars = text.split('');
14
+ const colors = ['#7C3AED', '#8B5CF6', '#A78BFA', '#06B6D4', '#22D3EE'];
15
+ return chars.map((c, i) => chalk.hex(colors[i % colors.length])(c)).join('');
16
+ },
17
+ box: (lines) => {
18
+ const maxLen = Math.max(...lines.map(l => stripAnsi(l).length));
19
+ const border = chalk.hex('#7C3AED')('─'.repeat(maxLen + 4));
20
+ const top = chalk.hex('#7C3AED')('╭') + border + chalk.hex('#7C3AED')('╮');
21
+ const bottom = chalk.hex('#7C3AED')('╰') + border + chalk.hex('#7C3AED')('╯');
22
+ const mid = lines.map(l => {
23
+ const pad = maxLen - stripAnsi(l).length;
24
+ return chalk.hex('#7C3AED')('│') + ' ' + l + ' '.repeat(pad) + ' ' + chalk.hex('#7C3AED')('│');
25
+ });
26
+ return [top, ...mid, bottom].join('\n');
27
+ }
28
+ };
29
+ function stripAnsi(str) {
30
+ return str.replace(/\x1b\[[0-9;]*m/g, '');
31
+ }
32
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAM,SAAS;IAC5C,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAO,OAAO;IAC1C,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAM,UAAU;IAC7C,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAM,QAAQ;IAC3C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAQ,MAAM;IACzC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAQ,OAAO;IAC1C,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,GAAG,EAAE,KAAK,CAAC,GAAG;IAEd,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,GAAG,EAAE,CAAC,KAAe,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACxB,MAAM,GAAG,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACzC,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC;AAEF,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function showWelcome(): void;
2
+ export declare function showHelp(): void;
3
+ export declare function showBanner(): void;
4
+ //# sourceMappingURL=welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AA2CA,wBAAgB,WAAW,IAAI,IAAI,CAoBlC;AAED,wBAAgB,QAAQ,IAAI,IAAI,CA4B/B;AAED,wBAAgB,UAAU,IAAI,IAAI,CAQjC"}
@@ -0,0 +1,95 @@
1
+ import chalk from 'chalk';
2
+ // Fixed NIVII ASCII art — V now properly narrows to a point
3
+ const NIVII_ASCII = [
4
+ '███╗ ██╗██╗██╗ ██╗██╗██╗',
5
+ '████╗ ██║██║██║ ██║██║██║',
6
+ '██╔██╗ ██║██║██║ ██║██║██║',
7
+ '██║╚██╗██║██║╚██╗ ██╔╝██║██║',
8
+ '██║ ╚████║██║ ╚████╔╝ ██║██║',
9
+ '╚═╝ ╚═══╝╚═╝ ╚═══╝ ╚═╝╚═╝',
10
+ ];
11
+ const GRADIENT = [
12
+ '#6B21A8',
13
+ '#7C3AED',
14
+ '#8B5CF6',
15
+ '#A78BFA',
16
+ '#C4B5FD',
17
+ '#DDD6FE',
18
+ ];
19
+ const cyan = chalk.hex('#06B6D4');
20
+ const gray = chalk.hex('#6B7280');
21
+ const green = chalk.hex('#10B981');
22
+ const orange = chalk.hex('#F97316');
23
+ const white = chalk.white;
24
+ const purple = chalk.hex('#A78BFA');
25
+ // Snow/sparkle effect row
26
+ const SNOW_CHARS = ['✦', '✧', '⋆', '·', '❄', '❆', '✵', '˚', '*', ' ', ' ', ' ', ' ', ' '];
27
+ function snowRow(width, color) {
28
+ return Array.from({ length: width }, () => {
29
+ const ch = SNOW_CHARS[Math.floor(Math.random() * SNOW_CHARS.length)];
30
+ return chalk.hex(color)(ch);
31
+ }).join('');
32
+ }
33
+ function printSnow() {
34
+ // Two rows of snow — alternating purple shades
35
+ console.log(' ' + snowRow(30, '#7C3AED'));
36
+ console.log(' ' + snowRow(30, '#A78BFA'));
37
+ }
38
+ export function showWelcome() {
39
+ console.log('');
40
+ printSnow();
41
+ for (let i = 0; i < NIVII_ASCII.length; i++) {
42
+ console.log(' ' + chalk.hex(GRADIENT[i])(NIVII_ASCII[i]));
43
+ }
44
+ printSnow();
45
+ console.log('');
46
+ console.log(' ' + orange('⚡') + ' ' + cyan('Share any project in seconds. No accounts. No config.'));
47
+ console.log(' ' + gray('v0.1.8 · nivii.app'));
48
+ console.log('');
49
+ console.log(' ' + gray('─'.repeat(46)));
50
+ console.log(' ' + cyan('Quick start:') + ' ' + white('nivii share'));
51
+ console.log(' ' + cyan('Custom slug:') + ' ' + white('nivii share --slug my-demo'));
52
+ console.log(' ' + cyan('With password:') + white('nivii share --pass secret123'));
53
+ console.log(' ' + cyan('Live sync:') + ' ' + white('nivii share --live'));
54
+ console.log(' ' + gray('─'.repeat(46)));
55
+ console.log('');
56
+ console.log(' ' + green('✓') + ' ' + cyan('First-run setup complete!') + gray(' Config saved to ~/.nivii/config.json'));
57
+ console.log('');
58
+ }
59
+ export function showHelp() {
60
+ console.log('');
61
+ printSnow();
62
+ for (let i = 0; i < NIVII_ASCII.length; i++) {
63
+ console.log(' ' + chalk.hex(GRADIENT[i])(NIVII_ASCII[i]));
64
+ }
65
+ printSnow();
66
+ console.log('');
67
+ console.log(' ' + orange('⚡') + ' ' + cyan('Share any project in seconds. No accounts. No config.'));
68
+ console.log(' ' + gray('v0.1.8 · nivii.app'));
69
+ console.log('');
70
+ console.log(' ' + gray('─'.repeat(50)));
71
+ console.log(' ' + purple.bold('Commands'));
72
+ console.log('');
73
+ console.log(' ' + cyan('nivii share') + ' ' + gray('Deploy current directory'));
74
+ console.log(' ' + cyan('nivii share --slug my-demo') + ' ' + gray('Custom slug (Pro)'));
75
+ console.log(' ' + cyan('nivii share --pass secret') + ' ' + gray('Password protect'));
76
+ console.log(' ' + cyan('nivii share --expires 24h') + ' ' + gray('Set expiry (1h/24h/7d/30d)'));
77
+ console.log(' ' + cyan('nivii share --live') + ' ' + gray('Live sync on file changes'));
78
+ console.log(' ' + cyan('nivii share --no-build') + ' ' + gray('Skip build step'));
79
+ console.log(' ' + cyan('nivii ls') + ' ' + gray('List recent deployments'));
80
+ console.log(' ' + cyan('nivii whoami') + ' ' + gray('Show account info'));
81
+ console.log(' ' + cyan('nivii analytics [slug]') + ' ' + gray('View deployment analytics'));
82
+ console.log(' ' + cyan('nivii config') + ' ' + gray('View/set config values'));
83
+ console.log('');
84
+ console.log(' ' + gray('─'.repeat(50)));
85
+ console.log(' ' + gray('Docs: ') + white('https://nivii.app') + ' ' + gray('·') + ' ' + gray('Pro: ') + white('https://nivii.app/#pricing'));
86
+ console.log('');
87
+ }
88
+ export function showBanner() {
89
+ console.log('');
90
+ console.log(' ' + orange('⚡') + ' ' +
91
+ chalk.hex('#A78BFA').bold('NIVII') + ' ' +
92
+ gray('v0.1.8'));
93
+ console.log('');
94
+ }
95
+ //# sourceMappingURL=welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface NiviiConfig {
2
+ token?: string;
3
+ plan?: 'free' | 'pro';
4
+ apiBase?: string;
5
+ firstRun?: boolean;
6
+ flyToken?: string;
7
+ deployments?: Array<{
8
+ slug: string;
9
+ url: string;
10
+ createdAt: string;
11
+ expiresAt?: string;
12
+ type?: 'frontend' | 'fullstack';
13
+ }>;
14
+ }
15
+ export declare const API_BASE: string;
16
+ export declare function loadConfig(): NiviiConfig;
17
+ export declare function saveConfig(config: NiviiConfig): void;
18
+ export declare function updateConfig(updates: Partial<NiviiConfig>): NiviiConfig;
19
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;KACjC,CAAC,CAAC;CACJ;AAKD,eAAO,MAAM,QAAQ,QAAmD,CAAC;AAEzE,wBAAgB,UAAU,IAAI,WAAW,CAYxC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAKvE"}
@@ -0,0 +1,31 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ const CONFIG_DIR = path.join(os.homedir(), '.nivii');
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
6
+ export const API_BASE = process.env.NIVII_API || 'https://api.nivii.app';
7
+ export function loadConfig() {
8
+ try {
9
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
10
+ if (!fs.existsSync(CONFIG_FILE)) {
11
+ const defaults = { firstRun: true, apiBase: API_BASE, deployments: [] };
12
+ saveConfig(defaults);
13
+ return defaults;
14
+ }
15
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
16
+ }
17
+ catch {
18
+ return { firstRun: true, apiBase: API_BASE, deployments: [] };
19
+ }
20
+ }
21
+ export function saveConfig(config) {
22
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
23
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
24
+ }
25
+ export function updateConfig(updates) {
26
+ const current = loadConfig();
27
+ const updated = { ...current, ...updates };
28
+ saveConfig(updated);
29
+ return updated;
30
+ }
31
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAiBpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,uBAAuB,CAAC;AAEzE,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;YACrF,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAA6B;IACxD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3C,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function generateSlug(length?: number): string;
2
+ export declare function hashFile(content: Buffer): string;
3
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,MAAM,SAAI,GAAG,MAAM,CAI/C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,10 @@
1
+ import crypto from 'crypto';
2
+ export function generateSlug(length = 8) {
3
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
4
+ const bytes = crypto.randomBytes(length);
5
+ return Array.from(bytes).map(b => chars[b % chars.length]).join('');
6
+ }
7
+ export function hashFile(content) {
8
+ return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
9
+ }
10
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,UAAU,YAAY,CAAC,MAAM,GAAG,CAAC;IACrC,MAAM,KAAK,GAAG,sCAAsC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function zipDirectory(sourceDir: string): Promise<string>;
2
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../src/utils/zip.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAerE"}
@@ -0,0 +1,19 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { createWriteStream } from 'fs';
4
+ import archiver from 'archiver';
5
+ import os from 'os';
6
+ export async function zipDirectory(sourceDir) {
7
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'nivii-'));
8
+ const zipPath = path.join(tmpDir, 'deploy.zip');
9
+ return new Promise((resolve, reject) => {
10
+ const output = createWriteStream(zipPath);
11
+ const archive = archiver('zip', { zlib: { level: 9 } });
12
+ output.on('close', () => resolve(zipPath));
13
+ archive.on('error', reject);
14
+ archive.pipe(output);
15
+ archive.directory(sourceDir, false);
16
+ archive.finalize();
17
+ });
18
+ }
19
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/utils/zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -44,7 +44,7 @@ export function showWelcome() {
44
44
  printSnow();
45
45
  console.log('');
46
46
  console.log(' ' + orange('⚡') + ' ' + cyan('Share any project in seconds. No accounts. No config.'));
47
- console.log(' ' + gray('v0.3.0 · nivii.app'));
47
+ console.log(' ' + gray('v0.1.8 · nivii.app'));
48
48
  console.log('');
49
49
  console.log(' ' + gray('─'.repeat(46)));
50
50
  console.log(' ' + cyan('Quick start:') + ' ' + white('nivii share'));
@@ -65,7 +65,7 @@ export function showHelp() {
65
65
  printSnow();
66
66
  console.log('');
67
67
  console.log(' ' + orange('⚡') + ' ' + cyan('Share any project in seconds. No accounts. No config.'));
68
- console.log(' ' + gray('v0.3.0 · nivii.app'));
68
+ console.log(' ' + gray('v0.1.8 · nivii.app'));
69
69
  console.log('');
70
70
  console.log(' ' + gray('─'.repeat(50)));
71
71
  console.log(' ' + purple.bold('Commands'));
@@ -89,7 +89,7 @@ export function showBanner() {
89
89
  console.log('');
90
90
  console.log(' ' + orange('⚡') + ' ' +
91
91
  chalk.hex('#A78BFA').bold('NIVII') + ' ' +
92
- gray('v0.3.0'));
92
+ gray('v0.1.8'));
93
93
  console.log('');
94
94
  }
95
95
  //# sourceMappingURL=welcome.js.map
package/package.json CHANGED
@@ -1,11 +1,15 @@
1
1
  {
2
2
  "name": "nivii",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "⚡ The fastest, most beautiful way to share any local project via a live URL",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "nivii": "./dist/cli.js"
8
8
  },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch"
12
+ },
9
13
  "dependencies": {
10
14
  "archiver": "^6.0.1",
11
15
  "cac": "^6.7.14",
@@ -45,7 +49,8 @@
45
49
  "url": "https://github.com/Aadigarg111/Nivi-sh.git"
46
50
  },
47
51
  "homepage": "https://nivii.app",
48
- "bugs": {
49
- "url": "mailto:contact@nivii.app"
52
+ "author": {
53
+ "name": "Aadi Garg",
54
+ "email": "contact@aadigarg.in"
50
55
  }
51
- }
56
+ }
package/src/cli.ts CHANGED
@@ -99,7 +99,7 @@ cli
99
99
  await runAnalytics(slug);
100
100
  });
101
101
 
102
- cli.version('0.3.0');
102
+ cli.version('0.1.8');
103
103
 
104
104
  // ─── Show help when no command given ─────────────────────────────────────────
105
105
  cli.parse(process.argv, { run: false });
package/src/ui/welcome.ts CHANGED
@@ -50,7 +50,7 @@ export function showWelcome(): void {
50
50
  printSnow();
51
51
  console.log('');
52
52
  console.log(' ' + orange('⚡') + ' ' + cyan('Share any project in seconds. No accounts. No config.'));
53
- console.log(' ' + gray('v0.3.0 · nivii.app'));
53
+ console.log(' ' + gray('v0.1.8 · nivii.app'));
54
54
  console.log('');
55
55
  console.log(' ' + gray('─'.repeat(46)));
56
56
  console.log(' ' + cyan('Quick start:') + ' ' + white('nivii share'));
@@ -72,7 +72,7 @@ export function showHelp(): void {
72
72
  printSnow();
73
73
  console.log('');
74
74
  console.log(' ' + orange('⚡') + ' ' + cyan('Share any project in seconds. No accounts. No config.'));
75
- console.log(' ' + gray('v0.3.0 · nivii.app'));
75
+ console.log(' ' + gray('v0.1.8 · nivii.app'));
76
76
  console.log('');
77
77
  console.log(' ' + gray('─'.repeat(50)));
78
78
  console.log(' ' + purple.bold('Commands'));
@@ -98,7 +98,7 @@ export function showBanner(): void {
98
98
  console.log(
99
99
  ' ' + orange('⚡') + ' ' +
100
100
  chalk.hex('#A78BFA').bold('NIVII') + ' ' +
101
- gray('v0.3.0')
101
+ gray('v0.1.8')
102
102
  );
103
103
  console.log('');
104
104
  }