@plasmicapp/cli 0.1.341 → 0.1.343
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/dist/actions/status.d.ts +5 -0
- package/dist/actions/sync-project-module.d.ts +5 -0
- package/dist/actions/sync-style-tokens-provider.d.ts +5 -0
- package/dist/api.d.ts +12 -0
- package/dist/index.js +4932 -4528
- package/dist/lib.js +4370 -4100
- package/dist/plasmic.schema.json +10 -0
- package/dist/utils/config-utils.d.ts +5 -1
- package/package.json +2 -2
- package/src/__mocks__/api.ts +2 -0
- package/src/actions/export.ts +40 -1
- package/src/actions/status.ts +173 -0
- package/src/actions/sync-project-module.ts +88 -0
- package/src/actions/sync-style-tokens-provider.ts +96 -0
- package/src/actions/sync.ts +20 -0
- package/src/api.ts +19 -0
- package/src/deps.ts +1 -1
- package/src/index.ts +13 -1
- package/src/test-common/fixtures.ts +2 -0
- package/src/utils/checksum.ts +37 -0
- package/src/utils/code-utils.ts +73 -6
- package/src/utils/config-utils.ts +11 -1
- package/src/utils/get-context.ts +28 -0
- package/src/utils/test-utils.ts +1 -1
package/dist/plasmic.schema.json
CHANGED
|
@@ -434,6 +434,10 @@
|
|
|
434
434
|
"description": "Project ID",
|
|
435
435
|
"type": "string"
|
|
436
436
|
},
|
|
437
|
+
"projectModuleFilePath": {
|
|
438
|
+
"description": "File location for the project-wide plasmic.ts file. Relative to srcDir",
|
|
439
|
+
"type": "string"
|
|
440
|
+
},
|
|
437
441
|
"projectName": {
|
|
438
442
|
"description": "Project name synced down from Studio",
|
|
439
443
|
"type": "string"
|
|
@@ -442,6 +446,10 @@
|
|
|
442
446
|
"description": "File location for the project-wide splits provider. Relative to srcDir",
|
|
443
447
|
"type": "string"
|
|
444
448
|
},
|
|
449
|
+
"styleTokensProviderFilePath": {
|
|
450
|
+
"description": "File location for the project-wide style tokens provider. Relative to srcDir",
|
|
451
|
+
"type": "string"
|
|
452
|
+
},
|
|
445
453
|
"version": {
|
|
446
454
|
"description": "A version range for syncing this project. Can be:\n* \"latest\" - always syncs down whatever has been saved in the project.\n* \">0\" - always syncs down the latest published version of the project.\n* any other semver string you'd like",
|
|
447
455
|
"type": "string"
|
|
@@ -455,8 +463,10 @@
|
|
|
455
463
|
"images",
|
|
456
464
|
"indirect",
|
|
457
465
|
"projectId",
|
|
466
|
+
"projectModuleFilePath",
|
|
458
467
|
"projectName",
|
|
459
468
|
"splitsProviderFilePath",
|
|
469
|
+
"styleTokensProviderFilePath",
|
|
460
470
|
"version"
|
|
461
471
|
],
|
|
462
472
|
"type": "object"
|
|
@@ -144,6 +144,10 @@ export interface ProjectConfig {
|
|
|
144
144
|
globalContextsFilePath: string;
|
|
145
145
|
/** File location for the project-wide splits provider. Relative to srcDir */
|
|
146
146
|
splitsProviderFilePath: string;
|
|
147
|
+
/** File location for the project-wide style tokens provider. Relative to srcDir */
|
|
148
|
+
styleTokensProviderFilePath: string;
|
|
149
|
+
/** File location for the project-wide plasmic.ts file. Relative to srcDir */
|
|
150
|
+
projectModuleFilePath: string;
|
|
147
151
|
jsBundleThemes?: JsBundleThemeConfig[];
|
|
148
152
|
codeComponents?: CodeComponentConfig[];
|
|
149
153
|
customFunctions?: CustomFunctionConfig[];
|
|
@@ -260,7 +264,7 @@ export interface GlobalVariantGroupConfig {
|
|
|
260
264
|
contextFilePath: string;
|
|
261
265
|
}
|
|
262
266
|
export interface FileLock {
|
|
263
|
-
type: "renderModule" | "cssRules" | "icon" | "image" | "projectCss" | "globalVariant" | "globalContexts" | "splitsProvider";
|
|
267
|
+
type: "renderModule" | "cssRules" | "icon" | "image" | "projectCss" | "globalVariant" | "globalContexts" | "splitsProvider" | "styleTokensProvider" | "projectModule";
|
|
264
268
|
checksum: string;
|
|
265
269
|
assetId: string;
|
|
266
270
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plasmicapp/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.343",
|
|
4
4
|
"description": "plasmic cli for syncing local code with Plasmic designs",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=12"
|
|
@@ -83,5 +83,5 @@
|
|
|
83
83
|
"wrap-ansi": "^7.0.0",
|
|
84
84
|
"yargs": "^15.4.1"
|
|
85
85
|
},
|
|
86
|
-
"gitHead": "
|
|
86
|
+
"gitHead": "809dc071d1574484fc1d2da06f6ba9f380a1b19c"
|
|
87
87
|
}
|
package/src/__mocks__/api.ts
CHANGED
|
@@ -355,6 +355,8 @@ class PlasmicApi {
|
|
|
355
355
|
projectCssChecksum: "",
|
|
356
356
|
globalContextsChecksum: "",
|
|
357
357
|
splitsProviderChecksum: "",
|
|
358
|
+
styleTokensProviderChecksum: "",
|
|
359
|
+
projectModuleChecksum: "",
|
|
358
360
|
} as ChecksumBundle,
|
|
359
361
|
usedNpmPackages: [],
|
|
360
362
|
externalCssImports: [],
|
package/src/actions/export.ts
CHANGED
|
@@ -10,17 +10,19 @@ import {
|
|
|
10
10
|
} from "../utils/code-utils";
|
|
11
11
|
import {
|
|
12
12
|
CodeConfig,
|
|
13
|
-
findConfigFile,
|
|
14
13
|
I18NConfig,
|
|
15
14
|
ImagesConfig,
|
|
16
15
|
PlasmicConfig,
|
|
17
16
|
StyleConfig,
|
|
17
|
+
findConfigFile,
|
|
18
18
|
} from "../utils/config-utils";
|
|
19
19
|
import { getContext, getCurrentOrDefaultAuth } from "../utils/get-context";
|
|
20
20
|
import { tuple } from "../utils/lang-utils";
|
|
21
21
|
import { DEFAULT_GLOBAL_CONTEXTS_NAME } from "./sync-global-contexts";
|
|
22
22
|
import { ensureImageAssetContents } from "./sync-images";
|
|
23
|
+
import { DEFAULT_PROJECT_MODULE_NAME } from "./sync-project-module";
|
|
23
24
|
import { DEFAULT_SPLITS_PROVIDER_NAME } from "./sync-splits-provider";
|
|
25
|
+
import { DEFAULT_STYLE_TOKENS_PROVIDER_NAME } from "./sync-style-tokens-provider";
|
|
24
26
|
|
|
25
27
|
export interface ExportArgs extends CommonArgs {
|
|
26
28
|
projects: readonly string[];
|
|
@@ -138,6 +140,20 @@ export async function exportProjectsCli(opts: ExportArgs): Promise<void> {
|
|
|
138
140
|
);
|
|
139
141
|
}
|
|
140
142
|
|
|
143
|
+
if (bundle.projectConfig.styleTokensProviderBundle) {
|
|
144
|
+
writeFile(
|
|
145
|
+
`${DEFAULT_STYLE_TOKENS_PROVIDER_NAME}.${extx}`,
|
|
146
|
+
bundle.projectConfig.styleTokensProviderBundle.module
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (bundle.projectConfig.projectModuleBundle) {
|
|
151
|
+
writeFile(
|
|
152
|
+
`${DEFAULT_PROJECT_MODULE_NAME}.${extx}`,
|
|
153
|
+
bundle.projectConfig.projectModuleBundle.module
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
141
157
|
if (bundle.projectConfig.reactWebExportedFiles) {
|
|
142
158
|
for (const file of bundle.projectConfig.reactWebExportedFiles) {
|
|
143
159
|
writeFile(file.fileName, file.content);
|
|
@@ -196,6 +212,13 @@ export async function exportProjectsCli(opts: ExportArgs): Promise<void> {
|
|
|
196
212
|
splitsProviderFilePath: bundle.projectConfig.splitsProviderBundle
|
|
197
213
|
? `${projectName}/${DEFAULT_SPLITS_PROVIDER_NAME}.${extx}`
|
|
198
214
|
: "",
|
|
215
|
+
styleTokensProviderFilePath: bundle.projectConfig
|
|
216
|
+
.styleTokensProviderBundle
|
|
217
|
+
? `${projectName}/${DEFAULT_STYLE_TOKENS_PROVIDER_NAME}.${extx}`
|
|
218
|
+
: "",
|
|
219
|
+
projectModuleFilePath: bundle.projectConfig.projectModuleBundle
|
|
220
|
+
? `${projectName}/${DEFAULT_PROJECT_MODULE_NAME}.${extx}`
|
|
221
|
+
: "",
|
|
199
222
|
components: bundle.components.map((comp) => ({
|
|
200
223
|
id: comp.id,
|
|
201
224
|
name: comp.componentName,
|
|
@@ -351,6 +374,22 @@ async function exportProjects(api: PlasmicApi, opts: ExportOpts) {
|
|
|
351
374
|
);
|
|
352
375
|
proj.projectConfig.splitsProviderBundle.module = res[1];
|
|
353
376
|
}
|
|
377
|
+
if (proj.projectConfig.styleTokensProviderBundle) {
|
|
378
|
+
const res = maybeConvertTsxToJsx(
|
|
379
|
+
`${DEFAULT_STYLE_TOKENS_PROVIDER_NAME}.tsx`,
|
|
380
|
+
proj.projectConfig.styleTokensProviderBundle.module,
|
|
381
|
+
"."
|
|
382
|
+
);
|
|
383
|
+
proj.projectConfig.styleTokensProviderBundle.module = res[1];
|
|
384
|
+
}
|
|
385
|
+
if (proj.projectConfig.projectModuleBundle) {
|
|
386
|
+
const res = maybeConvertTsxToJsx(
|
|
387
|
+
`${DEFAULT_PROJECT_MODULE_NAME}.tsx`,
|
|
388
|
+
proj.projectConfig.projectModuleBundle.module,
|
|
389
|
+
"."
|
|
390
|
+
);
|
|
391
|
+
proj.projectConfig.projectModuleBundle.module = res[1];
|
|
392
|
+
}
|
|
354
393
|
}
|
|
355
394
|
}
|
|
356
395
|
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { CommonArgs } from "..";
|
|
3
|
+
import { logger } from "../deps";
|
|
4
|
+
import { getContext, readLock } from "../utils/get-context";
|
|
5
|
+
import * as semver from "../utils/semver";
|
|
6
|
+
|
|
7
|
+
const PROJECT_ID_WIDTH = 23;
|
|
8
|
+
const PROJECT_NAME_WIDTH = 30;
|
|
9
|
+
const BRANCH_NAME_WIDTH = 15;
|
|
10
|
+
const VERSION_WIDTH = 15;
|
|
11
|
+
const STATUS_WIDTH = 23;
|
|
12
|
+
const TOTAL_WIDTH =
|
|
13
|
+
PROJECT_ID_WIDTH +
|
|
14
|
+
PROJECT_NAME_WIDTH +
|
|
15
|
+
BRANCH_NAME_WIDTH +
|
|
16
|
+
VERSION_WIDTH * 3 +
|
|
17
|
+
STATUS_WIDTH;
|
|
18
|
+
|
|
19
|
+
export interface StatusArgs extends CommonArgs {
|
|
20
|
+
json?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function showProjectStatus(opts: StatusArgs): Promise<void> {
|
|
24
|
+
const context = await getContext(opts, { skipInit: true });
|
|
25
|
+
|
|
26
|
+
const projects = context.config.projects;
|
|
27
|
+
if (projects.length === 0) {
|
|
28
|
+
logger.info("No projects found in plasmic.json");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Read lock file if it exists
|
|
33
|
+
const lockData = readLock(context.lockFile);
|
|
34
|
+
|
|
35
|
+
// Fetch latest versions from the server for all projects at once
|
|
36
|
+
let serverVersions: Record<string, string | null> = {};
|
|
37
|
+
try {
|
|
38
|
+
const resolution = await context.api.resolveSync(
|
|
39
|
+
projects.map((project) => ({
|
|
40
|
+
projectId: project.projectId,
|
|
41
|
+
branchName: project.projectBranchName || "main",
|
|
42
|
+
// We want to use ">=0.0.0" to get the latest published version.
|
|
43
|
+
// However, due to PLA-11698, this results in an error if the project
|
|
44
|
+
// has never been published. This is much more likely if the synced
|
|
45
|
+
// version is "latest".
|
|
46
|
+
versionRange: project.version === "latest" ? "latest" : ">=0.0.0",
|
|
47
|
+
componentIdOrNames: undefined,
|
|
48
|
+
projectApiToken: project.projectApiToken,
|
|
49
|
+
}))
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
resolution.projects?.forEach((resolvedProject) => {
|
|
53
|
+
serverVersions[resolvedProject.projectId] = resolvedProject.version;
|
|
54
|
+
});
|
|
55
|
+
} catch (error) {
|
|
56
|
+
// If we can't reach the server, we'll just show local information
|
|
57
|
+
logger.debug(`Could not fetch latest versions from server: ${error}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const projectData = projects.map((project) => {
|
|
61
|
+
// Find the corresponding lock entry
|
|
62
|
+
const lockEntry = lockData.projects?.find(
|
|
63
|
+
(p) => p.projectId === project.projectId
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
projectId: project.projectId,
|
|
68
|
+
projectName: project.projectName,
|
|
69
|
+
branchName: project.projectBranchName,
|
|
70
|
+
plasmicJsonVersion: project.version,
|
|
71
|
+
plasmicLockVersion: lockEntry?.version || null,
|
|
72
|
+
serverVersion: serverVersions[project.projectId] || "unpublished",
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (opts.json) {
|
|
77
|
+
// Output as JSON
|
|
78
|
+
logger.info(JSON.stringify(projectData, null, 2));
|
|
79
|
+
} else {
|
|
80
|
+
// Output as formatted table
|
|
81
|
+
logger.info(chalk.bold("\nPlasmic Project Sync Status\n"));
|
|
82
|
+
logger.info(chalk.gray("─".repeat(TOTAL_WIDTH)));
|
|
83
|
+
|
|
84
|
+
// Header
|
|
85
|
+
logger.info(
|
|
86
|
+
chalk.bold(padRight("Project ID", PROJECT_ID_WIDTH)) +
|
|
87
|
+
chalk.bold(padRight("Project", PROJECT_NAME_WIDTH)) +
|
|
88
|
+
chalk.bold(padRight("Branch", BRANCH_NAME_WIDTH)) +
|
|
89
|
+
chalk.bold(padRight("plasmic.json", VERSION_WIDTH)) +
|
|
90
|
+
chalk.bold(padRight("plasmic.lock", VERSION_WIDTH)) +
|
|
91
|
+
chalk.bold(padRight("server", VERSION_WIDTH)) +
|
|
92
|
+
chalk.bold("Status")
|
|
93
|
+
);
|
|
94
|
+
logger.info(chalk.gray("─".repeat(TOTAL_WIDTH)));
|
|
95
|
+
|
|
96
|
+
let notSynced = 0;
|
|
97
|
+
let updateAvailable = 0;
|
|
98
|
+
let updateStatusUnknown = 0;
|
|
99
|
+
for (const status of projectData) {
|
|
100
|
+
const projectIdDisplay = padRight(status.projectId, 23);
|
|
101
|
+
const projectNameDisplay = padRight(
|
|
102
|
+
status.projectName.substring(0, 29),
|
|
103
|
+
30
|
|
104
|
+
);
|
|
105
|
+
const branchDisplay = padRight(status.branchName || "main", 15);
|
|
106
|
+
const targetDisplay = padRight(status.plasmicJsonVersion, 15);
|
|
107
|
+
const syncedDisplay = padRight(
|
|
108
|
+
status.plasmicLockVersion || "not synced",
|
|
109
|
+
15
|
|
110
|
+
);
|
|
111
|
+
const latestDisplay = padRight(status.serverVersion || "unknown", 15);
|
|
112
|
+
|
|
113
|
+
let statusDisplay = "";
|
|
114
|
+
if (!status.plasmicLockVersion) {
|
|
115
|
+
statusDisplay = chalk.gray("! Not synced");
|
|
116
|
+
++notSynced;
|
|
117
|
+
} else if (
|
|
118
|
+
!status.serverVersion ||
|
|
119
|
+
!semver.valid(status.serverVersion) ||
|
|
120
|
+
semver.isLatest(status.serverVersion)
|
|
121
|
+
) {
|
|
122
|
+
// Can't compare if the server version is unknown or latest
|
|
123
|
+
statusDisplay = chalk.yellow("? Update status unknown");
|
|
124
|
+
++updateStatusUnknown;
|
|
125
|
+
} else if (semver.lt(status.plasmicLockVersion, status.serverVersion)) {
|
|
126
|
+
statusDisplay = chalk.blue("↑ Update available");
|
|
127
|
+
++updateAvailable;
|
|
128
|
+
} else {
|
|
129
|
+
statusDisplay = chalk.green("✓ Up-to-date");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
logger.info(
|
|
133
|
+
projectIdDisplay +
|
|
134
|
+
projectNameDisplay +
|
|
135
|
+
branchDisplay +
|
|
136
|
+
targetDisplay +
|
|
137
|
+
syncedDisplay +
|
|
138
|
+
latestDisplay +
|
|
139
|
+
statusDisplay
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
logger.info(chalk.gray("─".repeat(TOTAL_WIDTH)));
|
|
144
|
+
logger.info("");
|
|
145
|
+
|
|
146
|
+
if (notSynced > 0) {
|
|
147
|
+
logger.info(chalk.yellow(`! ${notSynced} project(s) not synced`));
|
|
148
|
+
}
|
|
149
|
+
if (updateAvailable > 0) {
|
|
150
|
+
logger.info(chalk.blue(`↑ ${updateAvailable} project(s) can be updated`));
|
|
151
|
+
}
|
|
152
|
+
if (updateStatusUnknown > 0) {
|
|
153
|
+
logger.info(
|
|
154
|
+
chalk.yellow(
|
|
155
|
+
`? ${updateStatusUnknown} project(s) have unknown update status due to "latest" version in plasmic.json`
|
|
156
|
+
)
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
if (notSynced === 0 && updateAvailable === 0 && updateStatusUnknown === 0) {
|
|
160
|
+
logger.info(chalk.green("✓ All projects are up to date"));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
logger.info("");
|
|
164
|
+
logger.info(chalk.gray("Run 'plasmic sync' to sync your projects"));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function padRight(str: string, length: number): string {
|
|
169
|
+
if (str.length >= length) {
|
|
170
|
+
return str.substring(0, length - 1) + " ";
|
|
171
|
+
}
|
|
172
|
+
return str + " ".repeat(length - str.length);
|
|
173
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import L from "lodash";
|
|
2
|
+
import { ChecksumBundle, ProjectMetaBundle } from "../api";
|
|
3
|
+
import { logger } from "../deps";
|
|
4
|
+
import { formatScript, tsxToJsx } from "../utils/code-utils";
|
|
5
|
+
import {
|
|
6
|
+
PlasmicContext,
|
|
7
|
+
ProjectConfig,
|
|
8
|
+
ProjectLock,
|
|
9
|
+
} from "../utils/config-utils";
|
|
10
|
+
import {
|
|
11
|
+
defaultResourcePath,
|
|
12
|
+
deleteFile,
|
|
13
|
+
fileExists,
|
|
14
|
+
writeFileContent,
|
|
15
|
+
} from "../utils/file-utils";
|
|
16
|
+
|
|
17
|
+
const MODULE_NAME = "plasmic";
|
|
18
|
+
export const DEFAULT_PROJECT_MODULE_NAME = MODULE_NAME;
|
|
19
|
+
|
|
20
|
+
export async function syncProjectModule(
|
|
21
|
+
context: PlasmicContext,
|
|
22
|
+
projectMeta: ProjectMetaBundle,
|
|
23
|
+
projectConfig: ProjectConfig,
|
|
24
|
+
projectLock: ProjectLock,
|
|
25
|
+
checksums: ChecksumBundle,
|
|
26
|
+
baseDir: string
|
|
27
|
+
) {
|
|
28
|
+
const resourcePath = getProjectModuleResourcePath(context, projectConfig);
|
|
29
|
+
if (checksums.projectModuleChecksum && projectMeta.projectModuleBundle) {
|
|
30
|
+
if (context.cliArgs.quiet !== true) {
|
|
31
|
+
logger.info(
|
|
32
|
+
`Syncing module: ${MODULE_NAME}@${projectLock.version}\t['${projectConfig.projectName}' ${projectConfig.projectId} ${projectConfig.version}]`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (context.config.code.lang === "js") {
|
|
36
|
+
projectMeta.projectModuleBundle.module = formatScript(
|
|
37
|
+
tsxToJsx(projectMeta.projectModuleBundle.module),
|
|
38
|
+
baseDir
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
writeFileContent(
|
|
42
|
+
context,
|
|
43
|
+
resourcePath,
|
|
44
|
+
projectMeta.projectModuleBundle.module,
|
|
45
|
+
{ force: true }
|
|
46
|
+
);
|
|
47
|
+
projectConfig.projectModuleFilePath = resourcePath;
|
|
48
|
+
const fl = projectLock.fileLocks.find(
|
|
49
|
+
(fl) =>
|
|
50
|
+
fl.assetId === projectConfig.projectId && fl.type === "projectModule"
|
|
51
|
+
);
|
|
52
|
+
if (fl) {
|
|
53
|
+
fl.checksum = checksums.projectModuleChecksum || "";
|
|
54
|
+
} else {
|
|
55
|
+
projectLock.fileLocks.push({
|
|
56
|
+
assetId: projectConfig.projectId,
|
|
57
|
+
checksum: checksums.projectModuleChecksum || "",
|
|
58
|
+
type: "projectModule",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
} else if (
|
|
62
|
+
!checksums.projectModuleChecksum &&
|
|
63
|
+
!projectMeta.projectModuleBundle
|
|
64
|
+
) {
|
|
65
|
+
if (fileExists(context, resourcePath)) {
|
|
66
|
+
deleteFile(context, resourcePath);
|
|
67
|
+
}
|
|
68
|
+
projectConfig.projectModuleFilePath = "";
|
|
69
|
+
L.remove(
|
|
70
|
+
projectLock.fileLocks,
|
|
71
|
+
(fl) =>
|
|
72
|
+
fl.assetId === projectConfig.projectId && fl.type === "projectModule"
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function getProjectModuleResourcePath(
|
|
78
|
+
context: PlasmicContext,
|
|
79
|
+
projectConfig: ProjectConfig
|
|
80
|
+
) {
|
|
81
|
+
return projectConfig.projectModuleFilePath !== ""
|
|
82
|
+
? projectConfig.projectModuleFilePath
|
|
83
|
+
: defaultResourcePath(
|
|
84
|
+
context,
|
|
85
|
+
projectConfig.projectName,
|
|
86
|
+
`${MODULE_NAME}.${context.config.code.lang === "ts" ? "tsx" : "jsx"}`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import L from "lodash";
|
|
2
|
+
import { ChecksumBundle, ProjectMetaBundle } from "../api";
|
|
3
|
+
import { logger } from "../deps";
|
|
4
|
+
import { formatScript, tsxToJsx } from "../utils/code-utils";
|
|
5
|
+
import {
|
|
6
|
+
PlasmicContext,
|
|
7
|
+
ProjectConfig,
|
|
8
|
+
ProjectLock,
|
|
9
|
+
} from "../utils/config-utils";
|
|
10
|
+
import {
|
|
11
|
+
defaultResourcePath,
|
|
12
|
+
deleteFile,
|
|
13
|
+
fileExists,
|
|
14
|
+
writeFileContent,
|
|
15
|
+
} from "../utils/file-utils";
|
|
16
|
+
|
|
17
|
+
const MODULE_NAME = "PlasmicStyleTokensProvider";
|
|
18
|
+
export const DEFAULT_STYLE_TOKENS_PROVIDER_NAME = MODULE_NAME;
|
|
19
|
+
|
|
20
|
+
export async function syncStyleTokensProvider(
|
|
21
|
+
context: PlasmicContext,
|
|
22
|
+
projectMeta: ProjectMetaBundle,
|
|
23
|
+
projectConfig: ProjectConfig,
|
|
24
|
+
projectLock: ProjectLock,
|
|
25
|
+
checksums: ChecksumBundle,
|
|
26
|
+
baseDir: string
|
|
27
|
+
) {
|
|
28
|
+
const resourcePath = getStyleTokensProviderResourcePath(
|
|
29
|
+
context,
|
|
30
|
+
projectConfig
|
|
31
|
+
);
|
|
32
|
+
if (
|
|
33
|
+
checksums.styleTokensProviderChecksum &&
|
|
34
|
+
projectMeta.styleTokensProviderBundle
|
|
35
|
+
) {
|
|
36
|
+
if (context.cliArgs.quiet !== true) {
|
|
37
|
+
logger.info(
|
|
38
|
+
`Syncing module: ${MODULE_NAME}@${projectLock.version}\t['${projectConfig.projectName}' ${projectConfig.projectId} ${projectConfig.version}]`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (context.config.code.lang === "js") {
|
|
42
|
+
projectMeta.styleTokensProviderBundle.module = formatScript(
|
|
43
|
+
tsxToJsx(projectMeta.styleTokensProviderBundle.module),
|
|
44
|
+
baseDir
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
writeFileContent(
|
|
48
|
+
context,
|
|
49
|
+
resourcePath,
|
|
50
|
+
projectMeta.styleTokensProviderBundle.module,
|
|
51
|
+
{ force: true }
|
|
52
|
+
);
|
|
53
|
+
projectConfig.styleTokensProviderFilePath = resourcePath;
|
|
54
|
+
const fl = projectLock.fileLocks.find(
|
|
55
|
+
(fl) =>
|
|
56
|
+
fl.assetId === projectConfig.projectId &&
|
|
57
|
+
fl.type === "styleTokensProvider"
|
|
58
|
+
);
|
|
59
|
+
if (fl) {
|
|
60
|
+
fl.checksum = checksums.styleTokensProviderChecksum || "";
|
|
61
|
+
} else {
|
|
62
|
+
projectLock.fileLocks.push({
|
|
63
|
+
assetId: projectConfig.projectId,
|
|
64
|
+
checksum: checksums.styleTokensProviderChecksum || "",
|
|
65
|
+
type: "styleTokensProvider",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
} else if (
|
|
69
|
+
!checksums.styleTokensProviderChecksum &&
|
|
70
|
+
!projectMeta.styleTokensProviderBundle
|
|
71
|
+
) {
|
|
72
|
+
if (fileExists(context, resourcePath)) {
|
|
73
|
+
deleteFile(context, resourcePath);
|
|
74
|
+
}
|
|
75
|
+
projectConfig.styleTokensProviderFilePath = "";
|
|
76
|
+
L.remove(
|
|
77
|
+
projectLock.fileLocks,
|
|
78
|
+
(fl) =>
|
|
79
|
+
fl.assetId === projectConfig.projectId &&
|
|
80
|
+
fl.type === "styleTokensProvider"
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function getStyleTokensProviderResourcePath(
|
|
86
|
+
context: PlasmicContext,
|
|
87
|
+
projectConfig: ProjectConfig
|
|
88
|
+
) {
|
|
89
|
+
return projectConfig.styleTokensProviderFilePath !== ""
|
|
90
|
+
? projectConfig.styleTokensProviderFilePath
|
|
91
|
+
: defaultResourcePath(
|
|
92
|
+
context,
|
|
93
|
+
projectConfig.projectName,
|
|
94
|
+
`${MODULE_NAME}.${context.config.code.lang === "ts" ? "tsx" : "jsx"}`
|
|
95
|
+
);
|
|
96
|
+
}
|
package/src/actions/sync.ts
CHANGED
|
@@ -56,7 +56,9 @@ import { syncGlobalContexts } from "./sync-global-contexts";
|
|
|
56
56
|
import { syncGlobalVariants } from "./sync-global-variants";
|
|
57
57
|
import { syncProjectIconAssets } from "./sync-icons";
|
|
58
58
|
import { syncProjectImageAssets } from "./sync-images";
|
|
59
|
+
import { syncProjectModule } from "./sync-project-module";
|
|
59
60
|
import { syncSplitsProvider } from "./sync-splits-provider";
|
|
61
|
+
import { syncStyleTokensProvider } from "./sync-style-tokens-provider";
|
|
60
62
|
import { upsertStyleTokens } from "./sync-styles";
|
|
61
63
|
|
|
62
64
|
export interface SyncArgs extends CommonArgs {
|
|
@@ -781,6 +783,24 @@ async function syncProjectConfig(
|
|
|
781
783
|
baseDir
|
|
782
784
|
);
|
|
783
785
|
|
|
786
|
+
await syncProjectModule(
|
|
787
|
+
context,
|
|
788
|
+
projectBundle,
|
|
789
|
+
projectConfig,
|
|
790
|
+
projectLock,
|
|
791
|
+
checksums,
|
|
792
|
+
baseDir
|
|
793
|
+
);
|
|
794
|
+
|
|
795
|
+
await syncStyleTokensProvider(
|
|
796
|
+
context,
|
|
797
|
+
projectBundle,
|
|
798
|
+
projectConfig,
|
|
799
|
+
projectLock,
|
|
800
|
+
checksums,
|
|
801
|
+
baseDir
|
|
802
|
+
);
|
|
803
|
+
|
|
784
804
|
// Write out components
|
|
785
805
|
await syncProjectComponents(
|
|
786
806
|
context,
|
package/src/api.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import axios, { AxiosError } from "axios";
|
|
2
2
|
import socketio from "socket.io-client";
|
|
3
|
+
import { logger } from "./deps";
|
|
3
4
|
import {
|
|
4
5
|
AuthConfig,
|
|
5
6
|
CodeConfig,
|
|
@@ -65,6 +66,16 @@ export interface SplitsProviderBundle {
|
|
|
65
66
|
module: string;
|
|
66
67
|
}
|
|
67
68
|
|
|
69
|
+
export interface StyleTokensProviderBundle {
|
|
70
|
+
id: string;
|
|
71
|
+
module: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface ProjectModuleBundle {
|
|
75
|
+
id: string;
|
|
76
|
+
module: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
68
79
|
export interface JsBundleTheme {
|
|
69
80
|
themeFileName: string;
|
|
70
81
|
themeModule: string;
|
|
@@ -78,6 +89,8 @@ export interface ProjectMetaBundle {
|
|
|
78
89
|
cssRules: string;
|
|
79
90
|
globalContextBundle?: GlobalContextBundle;
|
|
80
91
|
splitsProviderBundle?: SplitsProviderBundle;
|
|
92
|
+
styleTokensProviderBundle?: StyleTokensProviderBundle;
|
|
93
|
+
projectModuleBundle?: ProjectModuleBundle;
|
|
81
94
|
// A list of files that are exported from the project and *can* be used by the user
|
|
82
95
|
reactWebExportedFiles?: Array<{
|
|
83
96
|
fileName: string;
|
|
@@ -189,6 +202,10 @@ export interface ChecksumBundle {
|
|
|
189
202
|
globalContextsChecksum: string;
|
|
190
203
|
// Checksum of project splits provider
|
|
191
204
|
splitsProviderChecksum: string;
|
|
205
|
+
// Checksum of project style tokens provider
|
|
206
|
+
styleTokensProviderChecksum: string;
|
|
207
|
+
// Checksum of project plasmic.ts
|
|
208
|
+
projectModuleChecksum: string;
|
|
192
209
|
}
|
|
193
210
|
|
|
194
211
|
export interface CodeComponentMeta {
|
|
@@ -468,6 +485,7 @@ export class PlasmicApi {
|
|
|
468
485
|
// message
|
|
469
486
|
private async post(url: string, data?: any, rethrowAppError?: boolean) {
|
|
470
487
|
try {
|
|
488
|
+
logger.debug(`POST ${url}`);
|
|
471
489
|
return await axios.post(
|
|
472
490
|
url,
|
|
473
491
|
{ projectIdsAndTokens: this.projectIdsAndTokens, ...data },
|
|
@@ -493,6 +511,7 @@ export class PlasmicApi {
|
|
|
493
511
|
|
|
494
512
|
private async get(url: string, rethrowAppError?: boolean, extraHeaders?: {}) {
|
|
495
513
|
try {
|
|
514
|
+
logger.debug(`GET ${url}`);
|
|
496
515
|
return await axios.get(url, {
|
|
497
516
|
headers: { ...this.makeHeaders(), ...(extraHeaders ?? {}) },
|
|
498
517
|
});
|
package/src/deps.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import yargs from "yargs";
|
|
3
3
|
import * as auth from "./actions/auth";
|
|
4
|
+
import { ExportArgs, exportProjectsCli } from "./actions/export";
|
|
4
5
|
import { fixImports, FixImportsArgs } from "./actions/fix-imports";
|
|
5
6
|
import { InfoArgs, printProjectInfo } from "./actions/info";
|
|
6
7
|
import { getYargsOption, InitArgs, initPlasmic } from "./actions/init";
|
|
@@ -10,11 +11,11 @@ import {
|
|
|
10
11
|
LocalizationStringsArgs,
|
|
11
12
|
} from "./actions/localization-strings";
|
|
12
13
|
import * as projectToken from "./actions/project-token";
|
|
14
|
+
import { showProjectStatus, StatusArgs } from "./actions/status";
|
|
13
15
|
import { sync, SyncArgs } from "./actions/sync";
|
|
14
16
|
import { UploadBundleArgs, uploadJsBundle } from "./actions/upload-bundle";
|
|
15
17
|
import { WatchArgs, watchProjects } from "./actions/watch";
|
|
16
18
|
import { handleError } from "./utils/error";
|
|
17
|
-
import { ExportArgs, exportProjectsCli } from "./actions/export";
|
|
18
19
|
|
|
19
20
|
if (process.env.DEBUG_CHDIR) {
|
|
20
21
|
process.chdir(process.env.DEBUG_CHDIR);
|
|
@@ -106,6 +107,17 @@ yargs
|
|
|
106
107
|
handleError(auth.auth(argv));
|
|
107
108
|
}
|
|
108
109
|
)
|
|
110
|
+
.command<StatusArgs>(
|
|
111
|
+
"status",
|
|
112
|
+
"Shows the status of local Plasmic projects.",
|
|
113
|
+
(yargs) =>
|
|
114
|
+
yargs.option("json", {
|
|
115
|
+
describe: "Output status in JSON format",
|
|
116
|
+
type: "boolean",
|
|
117
|
+
default: false,
|
|
118
|
+
}),
|
|
119
|
+
(argv) => handleError(showProjectStatus(argv))
|
|
120
|
+
)
|
|
109
121
|
.command<SyncArgs>(
|
|
110
122
|
"sync",
|
|
111
123
|
"Syncs designs from Plasmic to local files.",
|
|
@@ -151,6 +151,8 @@ export const project1Config: ProjectConfig = {
|
|
|
151
151
|
indirect: false,
|
|
152
152
|
globalContextsFilePath: "",
|
|
153
153
|
splitsProviderFilePath: "",
|
|
154
|
+
styleTokensProviderFilePath: "",
|
|
155
|
+
projectModuleFilePath: "",
|
|
154
156
|
};
|
|
155
157
|
|
|
156
158
|
export function expectProject1PlasmicJson(optional?: {
|