confluence-exporter 1.0.3 → 1.0.4
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/README.md +10 -0
- package/dist/commands/help.command.js +4 -0
- package/dist/commands/help.command.js.map +1 -1
- package/dist/index.js +45 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/help.command.ts +4 -0
- package/src/index.ts +51 -6
package/README.md
CHANGED
|
@@ -76,6 +76,7 @@ node index.js index plan download transform [options]
|
|
|
76
76
|
| `-p` | `--password` | API token | env: `CONFLUENCE_PASSWORD` |
|
|
77
77
|
| `-s` | `--space` | Space key | env: `CONFLUENCE_SPACE_KEY` |
|
|
78
78
|
| `-o` | `--output` | Output directory | `./output` or env: `CONFLUENCE_OUTPUT_DIR` |
|
|
79
|
+
| `-e` | `--envFile` | Path to .env file | searches up to project root |
|
|
79
80
|
| `-i` | `--pageId` | Single page ID (optional) | none |
|
|
80
81
|
| `-l` | `--limit` | Limit number of pages to process | none |
|
|
81
82
|
| | `--parallel` | Number of concurrent operations | `5` |
|
|
@@ -92,6 +93,15 @@ node index.js index plan download transform [options]
|
|
|
92
93
|
- `CONFLUENCE_SPACE_KEY`
|
|
93
94
|
- `CONFLUENCE_OUTPUT_DIR`
|
|
94
95
|
|
|
96
|
+
### Environment File (.env)
|
|
97
|
+
|
|
98
|
+
By default, the tool searches for a `.env` file starting from the current directory and moving up the directory tree until it finds one or reaches the project root (identified by a `.git` folder).
|
|
99
|
+
|
|
100
|
+
You can specify a custom `.env` file path using the `--envFile` / `-e` option:
|
|
101
|
+
```bash
|
|
102
|
+
node index.js sync --envFile /path/to/.env.production
|
|
103
|
+
```
|
|
104
|
+
|
|
95
105
|
## Examples
|
|
96
106
|
|
|
97
107
|
### Full Space Export (4-phase workflow)
|
|
@@ -24,6 +24,7 @@ export class HelpCommand {
|
|
|
24
24
|
console.log(' -s, --space <key> Confluence space key');
|
|
25
25
|
console.log(' -i, --pageId <id> Download specific page ID only (optional)');
|
|
26
26
|
console.log(' -o, --output <dir> Output directory (default: ./output)');
|
|
27
|
+
console.log(' -e, --envFile <path> Path to .env file (default: searches up to project root)');
|
|
27
28
|
console.log(' -l, --limit <number> Limit number of pages to process (optional)');
|
|
28
29
|
console.log(' --parallel <number> Number of concurrent operations (default: 5)');
|
|
29
30
|
console.log(' -f, --force Force re-download of all pages (skip version check)');
|
|
@@ -36,6 +37,9 @@ export class HelpCommand {
|
|
|
36
37
|
console.log(' CONFLUENCE_PASSWORD');
|
|
37
38
|
console.log(' CONFLUENCE_SPACE_KEY');
|
|
38
39
|
console.log(' CONFLUENCE_OUTPUT_DIR\n');
|
|
40
|
+
console.log('Environment File (.env):');
|
|
41
|
+
console.log(' By default, searches for .env file from current directory up to project root (.git folder).');
|
|
42
|
+
console.log(' Use --envFile to specify a custom path.\n');
|
|
39
43
|
console.log('Examples:');
|
|
40
44
|
console.log(' # Full workflow: index, plan, download, and transform');
|
|
41
45
|
console.log(' node index.js index plan download transform -u https://mysite.atlassian.net -n user@example.com -p token -s MYSPACE\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.command.js","sourceRoot":"","sources":["../../src/commands/help.command.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"help.command.js","sourceRoot":"","sources":["../../src/commands/help.command.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,OAAO,CAAC,QAAwB;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAEO,QAAQ;QACd,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,qHAAqH,CAAC,CAAC;QACnI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,oGAAoG,CAAC,CAAC;QAClH,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,qHAAqH,CAAC,CAAC;QACnI,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC9F,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAAC;QAC7G,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,yHAAyH,CAAC,CAAC;QACvI,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,+HAA+H,CAAC,CAAC;QAC7I,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,iGAAiG,CAAC,CAAC;QAC/G,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,kGAAkG,CAAC,CAAC;QAChH,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,gGAAgG,CAAC,CAAC;QAC9G,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,6GAA6G,CAAC,CAAC;QAC3H,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,wGAAwG,CAAC,CAAC;QACtH,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,oGAAoG,CAAC,CAAC;QAClH,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,qGAAqG,CAAC,CAAC;QACnH,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,6GAA6G,CAAC,CAAC;QAC3H,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,8GAA8G,CAAC,CAAC;QAC5H,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,4HAA4H,CAAC,CAAC;QAC1I,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,+GAA+G,CAAC,CAAC;IAC/H,CAAC;CACF"}
|
package/dist/index.js
CHANGED
|
@@ -4,16 +4,52 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import minimist from 'minimist';
|
|
6
6
|
import { config as loadEnv } from 'dotenv';
|
|
7
|
-
import { promises as fs } from 'fs';
|
|
7
|
+
import { promises as fs, existsSync } from 'fs';
|
|
8
8
|
import path from 'path';
|
|
9
9
|
import { CommandExecutor } from './commands/executor.js';
|
|
10
10
|
import { HelpCommand } from './commands/help.command.js';
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Find and load .env file from current directory up to project root (.git folder)
|
|
13
|
+
* If envFile is specified, loads from that path directly.
|
|
14
|
+
* Otherwise searches from current working directory upward until it finds a .env file
|
|
15
|
+
* or reaches the project root (identified by .git folder) or filesystem root.
|
|
16
|
+
*/
|
|
17
|
+
function loadEnvFromProjectHierarchy(envFile) {
|
|
18
|
+
// If explicit envFile is provided, use it directly
|
|
19
|
+
if (envFile) {
|
|
20
|
+
const resolvedPath = path.resolve(envFile);
|
|
21
|
+
if (existsSync(resolvedPath)) {
|
|
22
|
+
loadEnv({ path: resolvedPath });
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.error(`Warning: Specified .env file not found: ${resolvedPath}`);
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
let currentDir = process.cwd();
|
|
30
|
+
const root = path.parse(currentDir).root;
|
|
31
|
+
while (currentDir !== root) {
|
|
32
|
+
const envPath = path.join(currentDir, '.env');
|
|
33
|
+
const gitPath = path.join(currentDir, '.git');
|
|
34
|
+
// Check if .env exists in current directory
|
|
35
|
+
if (existsSync(envPath)) {
|
|
36
|
+
loadEnv({ path: envPath });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Stop at project root (where .git is located)
|
|
40
|
+
if (existsSync(gitPath)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Move to parent directory
|
|
44
|
+
currentDir = path.dirname(currentDir);
|
|
45
|
+
}
|
|
46
|
+
// Fallback: try loading from cwd (default dotenv behavior)
|
|
13
47
|
loadEnv();
|
|
14
|
-
|
|
48
|
+
}
|
|
49
|
+
async function main() {
|
|
50
|
+
// Parse command line arguments first to get envFile option
|
|
15
51
|
const args = minimist(process.argv.slice(2), {
|
|
16
|
-
string: ['url', 'username', 'password', 'space', 'output', 'pageId', 'pageSize', 'limit', 'parallel'],
|
|
52
|
+
string: ['url', 'username', 'password', 'space', 'output', 'pageId', 'pageSize', 'limit', 'parallel', 'envFile'],
|
|
17
53
|
boolean: ['clear', 'force', 'debug'],
|
|
18
54
|
alias: {
|
|
19
55
|
u: 'url',
|
|
@@ -25,9 +61,12 @@ async function main() {
|
|
|
25
61
|
l: 'limit',
|
|
26
62
|
f: 'force',
|
|
27
63
|
d: 'debug',
|
|
28
|
-
h: 'help'
|
|
64
|
+
h: 'help',
|
|
65
|
+
e: 'envFile'
|
|
29
66
|
}
|
|
30
67
|
});
|
|
68
|
+
// Load .env file from specified path, current directory, or any parent up to project root
|
|
69
|
+
loadEnvFromProjectHierarchy(args.envFile);
|
|
31
70
|
// Show help if requested
|
|
32
71
|
if (args.help) {
|
|
33
72
|
const helpCommand = new HelpCommand();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -29,6 +29,7 @@ export class HelpCommand implements CommandHandler {
|
|
|
29
29
|
console.log(' -s, --space <key> Confluence space key');
|
|
30
30
|
console.log(' -i, --pageId <id> Download specific page ID only (optional)');
|
|
31
31
|
console.log(' -o, --output <dir> Output directory (default: ./output)');
|
|
32
|
+
console.log(' -e, --envFile <path> Path to .env file (default: searches up to project root)');
|
|
32
33
|
console.log(' -l, --limit <number> Limit number of pages to process (optional)');
|
|
33
34
|
console.log(' --parallel <number> Number of concurrent operations (default: 5)');
|
|
34
35
|
console.log(' -f, --force Force re-download of all pages (skip version check)');
|
|
@@ -41,6 +42,9 @@ export class HelpCommand implements CommandHandler {
|
|
|
41
42
|
console.log(' CONFLUENCE_PASSWORD');
|
|
42
43
|
console.log(' CONFLUENCE_SPACE_KEY');
|
|
43
44
|
console.log(' CONFLUENCE_OUTPUT_DIR\n');
|
|
45
|
+
console.log('Environment File (.env):');
|
|
46
|
+
console.log(' By default, searches for .env file from current directory up to project root (.git folder).');
|
|
47
|
+
console.log(' Use --envFile to specify a custom path.\n');
|
|
44
48
|
console.log('Examples:');
|
|
45
49
|
console.log(' # Full workflow: index, plan, download, and transform');
|
|
46
50
|
console.log(' node index.js index plan download transform -u https://mysite.atlassian.net -n user@example.com -p token -s MYSPACE\n');
|
package/src/index.ts
CHANGED
|
@@ -5,20 +5,61 @@
|
|
|
5
5
|
|
|
6
6
|
import minimist from 'minimist';
|
|
7
7
|
import { config as loadEnv } from 'dotenv';
|
|
8
|
-
import { promises as fs } from 'fs';
|
|
8
|
+
import { promises as fs, existsSync } from 'fs';
|
|
9
9
|
import path from 'path';
|
|
10
10
|
import { CommandExecutor } from './commands/executor.js';
|
|
11
11
|
import { HelpCommand } from './commands/help.command.js';
|
|
12
12
|
import type { ConfluenceConfig } from './types.js';
|
|
13
13
|
import type { CommandContext } from './commands/types.js';
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Find and load .env file from current directory up to project root (.git folder)
|
|
17
|
+
* If envFile is specified, loads from that path directly.
|
|
18
|
+
* Otherwise searches from current working directory upward until it finds a .env file
|
|
19
|
+
* or reaches the project root (identified by .git folder) or filesystem root.
|
|
20
|
+
*/
|
|
21
|
+
function loadEnvFromProjectHierarchy(envFile?: string): void {
|
|
22
|
+
// If explicit envFile is provided, use it directly
|
|
23
|
+
if (envFile) {
|
|
24
|
+
const resolvedPath = path.resolve(envFile);
|
|
25
|
+
if (existsSync(resolvedPath)) {
|
|
26
|
+
loadEnv({ path: resolvedPath });
|
|
27
|
+
} else {
|
|
28
|
+
console.error(`Warning: Specified .env file not found: ${resolvedPath}`);
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let currentDir = process.cwd();
|
|
34
|
+
const root = path.parse(currentDir).root;
|
|
35
|
+
|
|
36
|
+
while (currentDir !== root) {
|
|
37
|
+
const envPath = path.join(currentDir, '.env');
|
|
38
|
+
const gitPath = path.join(currentDir, '.git');
|
|
39
|
+
|
|
40
|
+
// Check if .env exists in current directory
|
|
41
|
+
if (existsSync(envPath)) {
|
|
42
|
+
loadEnv({ path: envPath });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Stop at project root (where .git is located)
|
|
47
|
+
if (existsSync(gitPath)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Move to parent directory
|
|
52
|
+
currentDir = path.dirname(currentDir);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Fallback: try loading from cwd (default dotenv behavior)
|
|
17
56
|
loadEnv();
|
|
57
|
+
}
|
|
18
58
|
|
|
19
|
-
|
|
59
|
+
async function main() {
|
|
60
|
+
// Parse command line arguments first to get envFile option
|
|
20
61
|
const args = minimist(process.argv.slice(2), {
|
|
21
|
-
string: ['url', 'username', 'password', 'space', 'output', 'pageId', 'pageSize', 'limit', 'parallel'],
|
|
62
|
+
string: ['url', 'username', 'password', 'space', 'output', 'pageId', 'pageSize', 'limit', 'parallel', 'envFile'],
|
|
22
63
|
boolean: ['clear', 'force', 'debug'],
|
|
23
64
|
alias: {
|
|
24
65
|
u: 'url',
|
|
@@ -30,10 +71,14 @@ async function main() {
|
|
|
30
71
|
l: 'limit',
|
|
31
72
|
f: 'force',
|
|
32
73
|
d: 'debug',
|
|
33
|
-
h: 'help'
|
|
74
|
+
h: 'help',
|
|
75
|
+
e: 'envFile'
|
|
34
76
|
}
|
|
35
77
|
});
|
|
36
78
|
|
|
79
|
+
// Load .env file from specified path, current directory, or any parent up to project root
|
|
80
|
+
loadEnvFromProjectHierarchy(args.envFile);
|
|
81
|
+
|
|
37
82
|
// Show help if requested
|
|
38
83
|
if (args.help) {
|
|
39
84
|
const helpCommand = new HelpCommand();
|