arcadible 0.1.0 → 0.1.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.
- package/bin/arc-default.js +32 -32
- package/bin/arc-deploy.js +113 -42
- package/bin/arc-init.js +196 -0
- package/bin/arc-inspect.js +65 -44
- package/bin/arc-login.js +127 -0
- package/bin/arc-logout.js +58 -0
- package/bin/arc-pack.js +81 -49
- package/bin/arc-validate.js +115 -0
- package/bin/arc-whoami.js +111 -0
- package/bin/arc.js +20 -15
- package/package.json +22 -9
- package/src/action/deploy/tool.js +11 -0
- package/src/action/deploy-git/git.js +192 -0
- package/src/action/deploy-git/tool.js +86 -0
- package/src/action/init/tool.js +44 -0
- package/src/action/inspect/tool.js +25 -0
- package/src/action/login/flow.js +94 -0
- package/src/action/login/tool.js +16 -0
- package/src/action/logout/tool.js +15 -0
- package/src/action/pack/tool.js +60 -0
- package/src/action/validate/tool.js +39 -0
- package/src/action/whoami/tool.js +15 -0
- package/src/api.js +39 -0
- package/src/cli/deploy.js +17 -0
- package/src/cli/index.js +25 -0
- package/src/cli/init.js +15 -0
- package/src/cli/inspect.js +15 -0
- package/src/cli/login.js +15 -0
- package/src/cli/logout.js +15 -0
- package/src/cli/pack.js +15 -0
- package/src/cli/validate.js +15 -0
- package/src/cli/whoami.js +15 -0
- package/src/config/html.js +27 -0
- package/src/config/uri.js +14 -0
- package/src/config/url.js +17 -0
- package/src/config/workflow.js +6 -1
- package/src/{manifest.js → parser/manifest.js} +5 -6
- package/src/{media.js → parser/media.js} +1 -1
- package/src/parser/pkg.js +56 -0
- package/src/parser/project.js +59 -0
- package/src/{readme.js → parser/readme.js} +25 -15
- package/src/prompt/project.js +10 -0
- package/src/prompt/starter.js +41 -0
- package/src/schema/game.js +38 -15
- package/src/schema/workflow.js +7 -5
- package/src/user.js +91 -0
- package/src/util/dom.js +10 -36
- package/src/util/log.js +44 -3
- package/src/util/md.js +2 -2
- package/src/util/objs.js +14 -2
- package/src/util/os.js +24 -0
- package/src/util/output.js +54 -0
- package/src/util/request.js +62 -0
- package/src/util/schema.js +25 -0
- package/src/util/time.js +79 -0
- package/bin/arc-check.js +0 -74
- package/npm-shrinkwrap.json +0 -988
- package/src/cmd/check.js +0 -26
- package/src/cmd/deploy.js +0 -22
- package/src/cmd/index.js +0 -12
- package/src/cmd/inspect.js +0 -26
- package/src/cmd/pack.js +0 -24
- package/src/cmd-check/index.js +0 -57
- package/src/cmd-deploy/index.js +0 -43
- package/src/cmd-inspect/index.js +0 -53
- package/src/cmd-pack/index.js +0 -83
- package/src/project.js +0 -62
- package/src/util/arc.js +0 -74
- package/src/util/git.js +0 -23
package/src/cmd/check.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const cmdCheck = require("../cmd-check");
|
|
6
|
-
const log = require("../util/log");
|
|
7
|
-
const project = require("../project");
|
|
8
|
-
|
|
9
|
-
// [function]
|
|
10
|
-
|
|
11
|
-
const main = function (conf) {
|
|
12
|
-
project
|
|
13
|
-
.parse(conf.root)
|
|
14
|
-
.then(({ game, workflow }) => {
|
|
15
|
-
cmdCheck(conf, workflow, game);
|
|
16
|
-
})
|
|
17
|
-
.catch((ex) => {
|
|
18
|
-
log.hd("Check aborted.");
|
|
19
|
-
log.pdnl(ex.message);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// [export]
|
|
25
|
-
|
|
26
|
-
module.exports = main;
|
package/src/cmd/deploy.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const cmdDeploy = require("../cmd-deploy");
|
|
6
|
-
const log = require("../util/log");
|
|
7
|
-
|
|
8
|
-
// [function]
|
|
9
|
-
|
|
10
|
-
const main = function (conf) {
|
|
11
|
-
try {
|
|
12
|
-
cmdDeploy(conf);
|
|
13
|
-
} catch (ex) {
|
|
14
|
-
log.hd("Deploy aborted.");
|
|
15
|
-
log.pdnl(ex.message);
|
|
16
|
-
process.exit(1);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// [export]
|
|
21
|
-
|
|
22
|
-
module.exports = main;
|
package/src/cmd/index.js
DELETED
package/src/cmd/inspect.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const cmdInspect = require("../cmd-inspect");
|
|
6
|
-
const log = require("../util/log");
|
|
7
|
-
const project = require("../project");
|
|
8
|
-
|
|
9
|
-
// [function]
|
|
10
|
-
|
|
11
|
-
const main = function (conf) {
|
|
12
|
-
project
|
|
13
|
-
.parse(conf.root)
|
|
14
|
-
.then(({ game, workflow }) => {
|
|
15
|
-
cmdInspect(conf, workflow, game);
|
|
16
|
-
})
|
|
17
|
-
.catch((ex) => {
|
|
18
|
-
log.hd("Inspect aborted.");
|
|
19
|
-
log.pdnl(ex.message);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// [export]
|
|
25
|
-
|
|
26
|
-
module.exports = main;
|
package/src/cmd/pack.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const cmdPack = require("../cmd-pack");
|
|
6
|
-
const log = require("../util/log");
|
|
7
|
-
const project = require("../project");
|
|
8
|
-
|
|
9
|
-
// [function]
|
|
10
|
-
|
|
11
|
-
const main = function (conf) {
|
|
12
|
-
project
|
|
13
|
-
.parse(conf.root)
|
|
14
|
-
.then(({ game, workflow }) => cmdPack(conf, workflow, game))
|
|
15
|
-
.catch((ex) => {
|
|
16
|
-
log.hd("Pack aborted.");
|
|
17
|
-
log.pdnl(ex.message);
|
|
18
|
-
process.exit(1);
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// [export]
|
|
23
|
-
|
|
24
|
-
module.exports = main;
|
package/src/cmd-check/index.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const gameSchema = require("../schema/game");
|
|
6
|
-
const log = require("../util/log");
|
|
7
|
-
const workflowSchema = require("../schema/workflow");
|
|
8
|
-
|
|
9
|
-
// [declare]
|
|
10
|
-
|
|
11
|
-
const SUCCESS = ["Workspace and manifest are well-formed."];
|
|
12
|
-
|
|
13
|
-
// [function]
|
|
14
|
-
|
|
15
|
-
const formatError = function (schema, zodError) {
|
|
16
|
-
return zodError.issues.map((issue) => {
|
|
17
|
-
const field = issue.path.join(".") || "value";
|
|
18
|
-
return `✖ ${schema}.${field}: ${issue.message}`;
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
// [function]
|
|
23
|
-
|
|
24
|
-
const checkGame = function (root, game) {
|
|
25
|
-
const schema = gameSchema(root, game).safeParse(game);
|
|
26
|
-
if (!schema.success) {
|
|
27
|
-
log.hd("Check failed.");
|
|
28
|
-
log.pdnl(formatError("game", schema.error));
|
|
29
|
-
process.exit(1);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// [function]
|
|
34
|
-
|
|
35
|
-
const checkWorkflow = function (root, workflow) {
|
|
36
|
-
const schema = workflowSchema(root, workflow).safeParse(workflow);
|
|
37
|
-
if (!schema.success) {
|
|
38
|
-
log.hd("Check failed.");
|
|
39
|
-
log.pdnl(formatError("workflow", schema.error));
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// [function]
|
|
45
|
-
|
|
46
|
-
const main = function ({ quiet, root }, workflow, game) {
|
|
47
|
-
checkGame(root, game);
|
|
48
|
-
checkWorkflow(root, workflow);
|
|
49
|
-
if (!quiet) {
|
|
50
|
-
log.hs("Check Passed.");
|
|
51
|
-
log.pnl(SUCCESS);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// [export]
|
|
56
|
-
|
|
57
|
-
module.exports = main;
|
package/src/cmd-deploy/index.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const arc = require("../util/arc");
|
|
6
|
-
const git = require("../util/git");
|
|
7
|
-
const log = require("../util/log");
|
|
8
|
-
|
|
9
|
-
// [declare]
|
|
10
|
-
|
|
11
|
-
const SUCCESS = [
|
|
12
|
-
"Await an email from Arcadible confirming a successful release.",
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
// [function]
|
|
16
|
-
|
|
17
|
-
const main = function ({ pre, preId, quiet, root }) {
|
|
18
|
-
if (!quiet) {
|
|
19
|
-
log.h("Attempting to deploy…");
|
|
20
|
-
}
|
|
21
|
-
git.isDirty(root, (dirty) => {
|
|
22
|
-
if (dirty) {
|
|
23
|
-
log.hd("Deploy aborted.");
|
|
24
|
-
log.pdnl("Git working directory is not clean.");
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
arc.deploy(root, { pre, preId }, (err, tag) => {
|
|
28
|
-
if (err) {
|
|
29
|
-
log.hd("Deploy aborted.");
|
|
30
|
-
log.pdnl(err.message);
|
|
31
|
-
process.exit(1);
|
|
32
|
-
}
|
|
33
|
-
if (!quiet) {
|
|
34
|
-
log.hs(`Deploy initiated for ${tag}.`);
|
|
35
|
-
log.pnl(SUCCESS);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// [export]
|
|
42
|
-
|
|
43
|
-
module.exports = main;
|
package/src/cmd-inspect/index.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const TOML = require("@iarna/toml");
|
|
6
|
-
|
|
7
|
-
// [function]
|
|
8
|
-
|
|
9
|
-
const write = function (data) {
|
|
10
|
-
process.stdout.write(data.trim().concat("\n"));
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
// [function]
|
|
14
|
-
|
|
15
|
-
const printJson = function (data) {
|
|
16
|
-
write(JSON.stringify(data, null, 2));
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
// [function]
|
|
20
|
-
|
|
21
|
-
const printToml = function (data) {
|
|
22
|
-
write(TOML.stringify(data));
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// [function]
|
|
26
|
-
|
|
27
|
-
const print = function (data, json) {
|
|
28
|
-
if (json) {
|
|
29
|
-
printJson(data);
|
|
30
|
-
} else {
|
|
31
|
-
printToml(data);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// [function]
|
|
36
|
-
|
|
37
|
-
const main = function ({ json, topic }, workflow, game) {
|
|
38
|
-
switch (topic) {
|
|
39
|
-
case "manifest:game":
|
|
40
|
-
print({ game }, json);
|
|
41
|
-
break;
|
|
42
|
-
case "manifest:workflow":
|
|
43
|
-
print({ workflow }, json);
|
|
44
|
-
break;
|
|
45
|
-
default:
|
|
46
|
-
print({ game, workflow }, json);
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
// [export]
|
|
52
|
-
|
|
53
|
-
module.exports = main;
|
package/src/cmd-pack/index.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const path = require("node:path");
|
|
6
|
-
|
|
7
|
-
// [import]
|
|
8
|
-
|
|
9
|
-
const fs = require("fs-extra");
|
|
10
|
-
const TOML = require("@iarna/toml");
|
|
11
|
-
|
|
12
|
-
// [import]
|
|
13
|
-
|
|
14
|
-
const Zip = require("../util/zip");
|
|
15
|
-
|
|
16
|
-
// [use]
|
|
17
|
-
|
|
18
|
-
const pathExists = fs.pathExists;
|
|
19
|
-
const pathParse = path.parse;
|
|
20
|
-
const resolve = path.resolve;
|
|
21
|
-
|
|
22
|
-
// [declare]
|
|
23
|
-
|
|
24
|
-
const MANIFEST = "arcadible.json";
|
|
25
|
-
const MEDIA = ".arcadible";
|
|
26
|
-
|
|
27
|
-
// [function]
|
|
28
|
-
|
|
29
|
-
const write = function (data) {
|
|
30
|
-
process.stdout.write(data.trim().concat("\n"));
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// [function]
|
|
34
|
-
|
|
35
|
-
const printJson = function (data) {
|
|
36
|
-
write(JSON.stringify(data, null, 2));
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// [function]
|
|
40
|
-
|
|
41
|
-
const printToml = function (data) {
|
|
42
|
-
write(TOML.stringify(data));
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// [function]
|
|
46
|
-
|
|
47
|
-
const print = function (data, json) {
|
|
48
|
-
if (json) {
|
|
49
|
-
printJson(data);
|
|
50
|
-
} else {
|
|
51
|
-
printToml(data);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// [function]
|
|
56
|
-
|
|
57
|
-
const main = function (conf, workflow, game) {
|
|
58
|
-
const { json, out, quiet, root } = conf;
|
|
59
|
-
const { deploy_dir: deployDir } = workflow;
|
|
60
|
-
const pathDeployDir = resolve(root, deployDir);
|
|
61
|
-
const pathMediaDir = resolve(root, MEDIA);
|
|
62
|
-
const zip = new Zip(pathParse(out).name);
|
|
63
|
-
return Promise.all([
|
|
64
|
-
pathExists(pathDeployDir),
|
|
65
|
-
pathExists(pathMediaDir),
|
|
66
|
-
]).then(([existsDeployDir, existsMediaDir]) => {
|
|
67
|
-
if (existsDeployDir) {
|
|
68
|
-
zip.addDir(pathDeployDir);
|
|
69
|
-
}
|
|
70
|
-
if (existsMediaDir) {
|
|
71
|
-
zip.addDir(pathMediaDir, MEDIA);
|
|
72
|
-
}
|
|
73
|
-
zip.addJson(MANIFEST, { game });
|
|
74
|
-
zip.write(resolve(root, out));
|
|
75
|
-
if (!quiet) {
|
|
76
|
-
print(zip.stat(), json);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
// [export]
|
|
82
|
-
|
|
83
|
-
module.exports = main;
|
package/src/project.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const gameConfig = require("./config/game");
|
|
6
|
-
const manifest = require("./manifest");
|
|
7
|
-
const media = require("./media");
|
|
8
|
-
const promise = require("./util/promise");
|
|
9
|
-
const readme = require("./readme");
|
|
10
|
-
const workflowConfig = require("./config/workflow");
|
|
11
|
-
|
|
12
|
-
// [function]
|
|
13
|
-
|
|
14
|
-
const parseManifest = function (root) {
|
|
15
|
-
return () => manifest.parse(root);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
// [function]
|
|
19
|
-
|
|
20
|
-
const parseMedia = function (root) {
|
|
21
|
-
return () => media.parse(root);
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
// [function]
|
|
25
|
-
|
|
26
|
-
const parseReadme = function (root) {
|
|
27
|
-
return () => readme.parse(root);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// [function]
|
|
31
|
-
|
|
32
|
-
const confGame = function (readmeGame, mediaGame, manifestGame) {
|
|
33
|
-
return {
|
|
34
|
-
...gameConfig,
|
|
35
|
-
...(readmeGame || {}),
|
|
36
|
-
...(mediaGame || {}),
|
|
37
|
-
...(manifestGame || {}),
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// [function]
|
|
42
|
-
|
|
43
|
-
const confWorkflow = function (manifestWorkflow) {
|
|
44
|
-
return { ...workflowConfig, ...(manifestWorkflow || {}) };
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
// [function]
|
|
48
|
-
|
|
49
|
-
const parse = function (root) {
|
|
50
|
-
const parsers = [parseManifest, parseMedia, parseReadme];
|
|
51
|
-
return promise
|
|
52
|
-
.serial(parsers.map((fn) => fn(root)))
|
|
53
|
-
.then(([manifestData, mediaData, readmeData]) => {
|
|
54
|
-
const game = confGame(readmeData.game, mediaData.game, manifestData.game);
|
|
55
|
-
const workflow = confWorkflow(manifestData.workflow);
|
|
56
|
-
return { game, workflow };
|
|
57
|
-
});
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
// [export]
|
|
61
|
-
|
|
62
|
-
module.exports = { parse };
|
package/src/util/arc.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const execFile = require("node:child_process").execFile;
|
|
6
|
-
|
|
7
|
-
// [import]
|
|
8
|
-
|
|
9
|
-
const strs = require("./strs");
|
|
10
|
-
|
|
11
|
-
// [use]
|
|
12
|
-
|
|
13
|
-
const trimWhitespace = strs.trimWhitespace;
|
|
14
|
-
|
|
15
|
-
// [declare]
|
|
16
|
-
|
|
17
|
-
const RE_TAG_EXISTS = /tag\s+'([^']+)'\s+already\s+exists/iu;
|
|
18
|
-
|
|
19
|
-
// [function]
|
|
20
|
-
|
|
21
|
-
const knownErr = function (stdErr) {
|
|
22
|
-
const tagExists = stdErr.match(RE_TAG_EXISTS);
|
|
23
|
-
if (tagExists) {
|
|
24
|
-
return [
|
|
25
|
-
`Git tag exists: ${tagExists[1]}`,
|
|
26
|
-
"The package version has been synchronized.",
|
|
27
|
-
"Try again.",
|
|
28
|
-
].join("\n");
|
|
29
|
-
}
|
|
30
|
-
return stdErr;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// [function]
|
|
34
|
-
|
|
35
|
-
const npm = function (root, pre, preId) {
|
|
36
|
-
return [
|
|
37
|
-
"--prefix",
|
|
38
|
-
root,
|
|
39
|
-
"version",
|
|
40
|
-
pre ? "prerelease" : "patch",
|
|
41
|
-
"--preid",
|
|
42
|
-
preId,
|
|
43
|
-
"-m",
|
|
44
|
-
pre ? "Prerelease v%s" : "Release v%s",
|
|
45
|
-
];
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// [function]
|
|
49
|
-
|
|
50
|
-
const git = function (root) {
|
|
51
|
-
return ["-C", root, "push", "--follow-tags"];
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
// [function]
|
|
55
|
-
|
|
56
|
-
const deploy = function (root, { pre, preId }, cb) {
|
|
57
|
-
execFile("npm", npm(root, pre, preId), (err, stdOut, stdErr) => {
|
|
58
|
-
if (err) {
|
|
59
|
-
cb(new Error(knownErr(stdErr), { cause: err }));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
execFile("git", git(root), (err) => {
|
|
63
|
-
if (err) {
|
|
64
|
-
cb(new Error(knownErr(stdErr), { cause: err }));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
cb(null, trimWhitespace(stdOut));
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
// [export]
|
|
73
|
-
|
|
74
|
-
module.exports = { deploy };
|
package/src/util/git.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
// [import]
|
|
4
|
-
|
|
5
|
-
const execFile = require("node:child_process").execFile;
|
|
6
|
-
|
|
7
|
-
// [function]
|
|
8
|
-
|
|
9
|
-
const isDirty = function (root, cb) {
|
|
10
|
-
execFile("git", ["-C", root, "diff", "--quiet"], (err) => {
|
|
11
|
-
if (err) {
|
|
12
|
-
cb(true);
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
execFile("git", ["-C", root, "diff", "--cached", "--quiet"], (err) => {
|
|
16
|
-
cb(Boolean(err));
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// [export]
|
|
22
|
-
|
|
23
|
-
module.exports = { isDirty };
|