lucid-package 0.0.69 → 0.0.72

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lucid-package",
3
- "version": "0.0.69",
3
+ "version": "0.0.72",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -0,0 +1 @@
1
+ export declare function createDataConnector(name: string, isInternalTesting: boolean, skipSDKDependency: boolean): Promise<void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDataConnector = void 0;
4
+ const filesystemutil_1 = require("./filesystemutil");
5
+ const installationutil_1 = require("./installationutil");
6
+ const package_1 = require("./package");
7
+ async function createDataConnector(name, isInternalTesting, skipSDKDependency) {
8
+ console.log('Creating data connector in dataconnectors/' + name);
9
+ (0, filesystemutil_1.copyFolderRecursiveSync)(__dirname + '/../templates/dataconnector', 'dataconnectors/' + name);
10
+ await (0, package_1.modifyManifest)((manifest) => {
11
+ if (!manifest['dataConnectors']) {
12
+ manifest['dataConnectors'] = [];
13
+ }
14
+ manifest['dataConnectors'].push({
15
+ 'name': name,
16
+ 'oauthProviderName': '',
17
+ 'callbackBaseUrl': '',
18
+ 'dataActions': {},
19
+ });
20
+ });
21
+ console.log(`Installing dependencies`);
22
+ process.chdir('dataconnectors/' + name);
23
+ (0, installationutil_1.installDependenciesIfNeeded)(isInternalTesting, skipSDKDependency);
24
+ }
25
+ exports.createDataConnector = createDataConnector;
@@ -5,40 +5,15 @@ const child_process = require("child_process");
5
5
  const express = require("express");
6
6
  const oldFs = require("fs");
7
7
  const fs = require("fs/promises");
8
- const path = require("path");
9
8
  const cors_1 = require("./cors");
10
9
  const filesystemutil_1 = require("./filesystemutil");
10
+ const installationutil_1 = require("./installationutil");
11
11
  const package_1 = require("./package");
12
12
  const packagemanifest_1 = require("./packagemanifest");
13
13
  const shapelibrary_1 = require("./shapelibrary");
14
14
  const shellutil_1 = require("./shellutil");
15
15
  const supportedproduct_1 = require("./supportedproduct");
16
16
  const WebPackCLI = require('webpack-cli');
17
- function linkInternalTestingSDK() {
18
- if (!oldFs.existsSync('node_modules/lucid-extension-sdk')) {
19
- const cwd = process.cwd();
20
- const rootSearch = 'lucid/main/extensibility/';
21
- const pos = cwd.indexOf(rootSearch);
22
- const sdkPath = cwd.substr(0, pos + rootSearch.length) + 'lucid-extension-sdk';
23
- const relativePath = path.relative(cwd, sdkPath);
24
- console.log('Using symlink for dependency on SDK for internal testing');
25
- console.log((0, shellutil_1.execSyncLoggingOutputOnError)(`npm install --silent --save ${relativePath}`).toString());
26
- }
27
- }
28
- function installDependenciesIfNeeded(isInternalTesting, skipSDKDependency = false) {
29
- if (!oldFs.existsSync('node_modules')) {
30
- console.log((0, shellutil_1.execSyncLoggingOutputOnError)('npm install --silent').toString());
31
- }
32
- if (!oldFs.existsSync('node_modules/lucid-extension-sdk') && !skipSDKDependency) {
33
- if (isInternalTesting) {
34
- linkInternalTestingSDK();
35
- }
36
- else {
37
- console.log('Adding dependency on SDK');
38
- console.log((0, shellutil_1.execSyncLoggingOutputOnError)('npm install --save lucid-extension-sdk').toString());
39
- }
40
- }
41
- }
42
17
  async function createEditorExtension(name, isInternalTesting, skipSDKDependency) {
43
18
  console.log('Creating empty editor extension in editorextensions/' + name);
44
19
  (0, filesystemutil_1.copyFolderRecursiveSync)(__dirname + '/../templates/editorextension', 'editorextensions/' + name);
@@ -56,12 +31,12 @@ async function createEditorExtension(name, isInternalTesting, skipSDKDependency)
56
31
  });
57
32
  console.log(`Installing dependencies`);
58
33
  process.chdir('editorextensions/' + name);
59
- installDependenciesIfNeeded(isInternalTesting, skipSDKDependency);
34
+ (0, installationutil_1.installDependenciesIfNeeded)(isInternalTesting, skipSDKDependency);
60
35
  }
61
36
  exports.createEditorExtension = createEditorExtension;
62
37
  async function buildEditorExtension(name, isInternalTesting, quiet = false) {
63
38
  process.chdir('editorextensions/' + (await getExtensionCodeDirectoryName(name)));
64
- installDependenciesIfNeeded(isInternalTesting);
39
+ (0, installationutil_1.installDependenciesIfNeeded)(isInternalTesting);
65
40
  const cli = new WebPackCLI();
66
41
  await cli.run(['node', 'webpack', '--mode', 'production', ...(quiet ? ['--stats', 'errors-only'] : [])]);
67
42
  }
@@ -79,7 +54,7 @@ exports.updateExtensionSDK = updateExtensionSDK;
79
54
  */
80
55
  async function watchEditorExtension(name, isInternalTesting, quiet = false) {
81
56
  process.chdir('editorextensions/' + (await getExtensionCodeDirectoryName(name)));
82
- installDependenciesIfNeeded(isInternalTesting);
57
+ (0, installationutil_1.installDependenciesIfNeeded)(isInternalTesting);
83
58
  const cli = new WebPackCLI();
84
59
  cli.run(['node', 'webpack', '--watch', ...(quiet ? ['--stats', 'errors-only'] : [])]);
85
60
  }
@@ -179,6 +154,16 @@ async function debugEditorExtension(extensionNames, quiet = false, pickAnyPort =
179
154
  const manifest = await (0, packagemanifest_1.readManifest)('local');
180
155
  res.send(JSON.stringify(manifest));
181
156
  });
157
+ // iframes (modals and panels) loaded in dev mode from a string (legacy style) will redirect here to get the
158
+ // iframe bootstrap code, so that any requests for static assets from localhost won't fail due to mixed
159
+ // HTTPS and HTTP. But to avoid duplicating the modal-frame.html source here, we just send it in the query
160
+ // string as part of the redirect.
161
+ app.get('/resources/modal-frame.html', async (req, res) => {
162
+ res.set({ 'Content-Type': 'text/html' });
163
+ res.send(req.query['source']);
164
+ });
165
+ // Static resources in the "public" directory of the package
166
+ app.use('/resources', express.static('public'));
182
167
  const listen = () => {
183
168
  app.listen(port, 'localhost', () => {
184
169
  console.log('Listening at http://localhost:' + port + '/extension.js');
package/src/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const argparse_1 = require("argparse");
4
+ const dataconnector_1 = require("./dataconnector");
4
5
  const editorextension_1 = require("./editorextension");
5
6
  const package_1 = require("./package");
6
7
  const shapelibrary_1 = require("./shapelibrary");
@@ -101,6 +102,15 @@ class LucidSuiteExtensionCLI {
101
102
  action: 'store_true',
102
103
  help: 'Lock the aspect ratio of all images',
103
104
  });
105
+ const createDataConnectorParser = subparsers.add_parser('create-data-connector', {
106
+ help: 'Create a new data-connector as part of the current package',
107
+ });
108
+ createDataConnectorParser.add_argument('name');
109
+ createDataConnectorParser.add_argument('--skip-sdk', {
110
+ default: false,
111
+ action: 'store_true',
112
+ help: argparse_1.SUPPRESS,
113
+ });
104
114
  const parsed = parser.parse_args(args);
105
115
  //For internal development, creating and operating on a "test" package via bazel
106
116
  let isInternalTesting = !!parsed['chdir'];
@@ -124,87 +134,53 @@ class LucidSuiteExtensionCLI {
124
134
  case 'create':
125
135
  (0, package_1.createEmptyPackage)(parsed['name']);
126
136
  break;
127
- case 'bundle':
128
- if ((0, package_1.currentlyInPackage)()) {
129
- await (0, package_1.writePackage)(parsed['quiet'], parsed['env']);
130
- }
131
- else {
132
- console.error('Not currently in a Lucid extension package folder');
133
- }
134
- break;
135
- case 'update-sdk':
136
- if ((0, package_1.currentlyInPackage)()) {
137
- await (0, package_1.updateAllExtensionSDK)();
138
- }
139
- else {
140
- console.error('Not currently in a Lucid extension package folder');
141
- }
142
- break;
143
- case 'create-editor-extension':
144
- if ((0, package_1.currentlyInPackage)()) {
145
- await (0, editorextension_1.createEditorExtension)(parsed['name'], isInternalTesting, parsed['skip_sdk']);
146
- }
147
- else {
148
- console.error('Not currently in a Lucid extension package folder');
149
- }
150
- break;
151
- case 'build-editor-extension':
152
- if ((0, package_1.currentlyInPackage)()) {
153
- await (0, editorextension_1.buildEditorExtension)(parsed['name'], isInternalTesting, parsed['quiet']);
154
- }
155
- else {
156
- console.error('Not currently in a Lucid extension package folder');
157
- }
158
- break;
159
- case 'create-shape-library':
160
- if ((0, package_1.currentlyInPackage)()) {
161
- await (0, shapelibrary_1.createEmptyShapeLibrary)(parsed['name']);
162
- }
163
- else {
164
- console.error('Not currently in a Lucid extension package folder');
165
- }
166
- break;
167
- case 'create-image-shape-library':
168
- if ((0, package_1.currentlyInPackage)()) {
169
- const width = Number(parsed['width']) ?? undefined;
170
- const height = Number(parsed['height']) ?? undefined;
171
- const config = {
172
- width: width,
173
- height: height,
174
- lockAspect: parsed['aspectRatio'],
175
- };
176
- await (0, shapelibrary_1.createImageShapeLibrary)(parsed['name'], parsed['path'], config);
177
- }
178
- else {
179
- console.error('Not currently in a Lucid extension package folder');
180
- }
181
- break;
182
- case 'test-shape-libraries':
183
- if ((0, package_1.currentlyInPackage)()) {
184
- await (0, shapelibrary_1.debugShapeLibraries)();
185
- }
186
- else {
187
- console.error('Not currently in a Lucid extension package folder');
188
- }
189
- break;
190
- case 'test-editor-extension':
191
- if ((0, package_1.currentlyInPackage)()) {
192
- await (0, editorextension_1.debugEditorExtension)(parsed['name'], parsed['quiet'], parsed['anyport']);
193
- }
194
- else {
137
+ default:
138
+ // All the following commands can only be executed inside a Lucid extension package folder
139
+ if (!(0, package_1.currentlyInPackage)()) {
195
140
  console.error('Not currently in a Lucid extension package folder');
196
141
  }
197
- break;
198
- case 'watch-editor-extension':
199
- if ((0, package_1.currentlyInPackage)()) {
200
- await (0, editorextension_1.watchEditorExtension)(parsed['name'], isInternalTesting, parsed['quiet']);
201
- }
202
142
  else {
203
- console.error('Not currently in a Lucid extension package folder');
143
+ switch (parsed['command']) {
144
+ case 'bundle':
145
+ await (0, package_1.writePackage)(parsed['quiet'], parsed['env']);
146
+ case 'update-sdk':
147
+ await (0, package_1.updateAllExtensionSDK)();
148
+ break;
149
+ case 'create-editor-extension':
150
+ await (0, editorextension_1.createEditorExtension)(parsed['name'], isInternalTesting, parsed['skip_sdk']);
151
+ break;
152
+ case 'build-editor-extension':
153
+ await (0, editorextension_1.buildEditorExtension)(parsed['name'], isInternalTesting, parsed['quiet']);
154
+ break;
155
+ case 'create-shape-library':
156
+ await (0, shapelibrary_1.createEmptyShapeLibrary)(parsed['name']);
157
+ break;
158
+ case 'create-image-shape-library':
159
+ const width = Number(parsed['width']) ?? undefined;
160
+ const height = Number(parsed['height']) ?? undefined;
161
+ const config = {
162
+ width: width,
163
+ height: height,
164
+ lockAspect: parsed['aspectRatio'],
165
+ };
166
+ await (0, shapelibrary_1.createImageShapeLibrary)(parsed['name'], parsed['path'], config);
167
+ break;
168
+ case 'create-data-connector':
169
+ await (0, dataconnector_1.createDataConnector)(parsed['name'], isInternalTesting, parsed['skip_sdk']);
170
+ break;
171
+ case 'test-shape-libraries':
172
+ await (0, shapelibrary_1.debugShapeLibraries)();
173
+ break;
174
+ case 'test-editor-extension':
175
+ await (0, editorextension_1.debugEditorExtension)(parsed['name'], parsed['quiet'], parsed['anyport']);
176
+ break;
177
+ case 'watch-editor-extension':
178
+ await (0, editorextension_1.watchEditorExtension)(parsed['name'], isInternalTesting, parsed['quiet']);
179
+ break;
180
+ default:
181
+ parser.print_help();
182
+ }
204
183
  }
205
- break;
206
- default:
207
- parser.print_help();
208
184
  }
209
185
  }
210
186
  }
@@ -0,0 +1 @@
1
+ export declare function installDependenciesIfNeeded(isInternalTesting: boolean, skipSDKDependency?: boolean): void;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installDependenciesIfNeeded = void 0;
4
+ const oldFs = require("fs");
5
+ const path = require("path");
6
+ const shellutil_1 = require("./shellutil");
7
+ function installDependenciesIfNeeded(isInternalTesting, skipSDKDependency = false) {
8
+ if (!oldFs.existsSync('node_modules')) {
9
+ console.log((0, shellutil_1.execSyncLoggingOutputOnError)('npm install --silent').toString());
10
+ }
11
+ if (!oldFs.existsSync('node_modules/lucid-extension-sdk') && !skipSDKDependency) {
12
+ if (isInternalTesting) {
13
+ linkInternalTestingSDK();
14
+ }
15
+ else {
16
+ console.log('Adding dependency on SDK');
17
+ console.log((0, shellutil_1.execSyncLoggingOutputOnError)('npm install --save lucid-extension-sdk').toString());
18
+ }
19
+ }
20
+ }
21
+ exports.installDependenciesIfNeeded = installDependenciesIfNeeded;
22
+ function linkInternalTestingSDK() {
23
+ if (!oldFs.existsSync('node_modules/lucid-extension-sdk')) {
24
+ const cwd = process.cwd();
25
+ const rootSearch = 'lucid/main/extensibility/';
26
+ const pos = cwd.indexOf(rootSearch);
27
+ const sdkPath = cwd.substr(0, pos + rootSearch.length) + 'lucid-extension-sdk';
28
+ const relativePath = path.relative(cwd, sdkPath);
29
+ console.log('Using symlink for dependency on SDK for internal testing');
30
+ console.log((0, shellutil_1.execSyncLoggingOutputOnError)(`npm install --silent --save ${relativePath}`).toString());
31
+ }
32
+ }
package/src/package.js CHANGED
@@ -4,6 +4,7 @@ exports.writePackage = exports.updateAllExtensionSDK = exports.modifyManifest =
4
4
  const fsOld = require("fs");
5
5
  const fs = require("fs/promises");
6
6
  const JSZip = require("jszip");
7
+ const path = require("path");
7
8
  const lucid_extension_sdk_1 = require("lucid-extension-sdk");
8
9
  const editorextension_1 = require("./editorextension");
9
10
  const filesystemutil_1 = require("./filesystemutil");
@@ -88,10 +89,32 @@ async function writePackage(quiet = false, manifestOverrideEnv) {
88
89
  }
89
90
  zip.file(library['lcszPath'], await fs.readFile(library['lcszPath']));
90
91
  }
92
+ //Add any static resources
93
+ const checkDirForResources = async (directory) => {
94
+ if (!fsOld.existsSync(directory)) {
95
+ return;
96
+ }
97
+ for (const fileName of await fs.readdir(directory)) {
98
+ const filePath = path.join(directory, fileName);
99
+ const stat = await fs.stat(filePath);
100
+ if (stat.isFile()) {
101
+ console.log('Adding resource file: ', filePath);
102
+ zip.file(filePath, await fs.readFile(filePath));
103
+ }
104
+ else if (stat.isDirectory()) {
105
+ await checkDirForResources(filePath);
106
+ }
107
+ }
108
+ };
109
+ await checkDirForResources('public');
91
110
  //Add the manifest itself
92
111
  zip.file('manifest.json', JSON.stringify(manifest, undefined, 2));
93
112
  //Write out the zip file
94
- const zipBytes = await zip.generateAsync({ type: 'uint8array' });
113
+ const zipBytes = await zip.generateAsync({
114
+ type: 'uint8array',
115
+ compression: 'DEFLATE',
116
+ compressionOptions: { level: 9 },
117
+ });
95
118
  console.log('Writing file package.zip');
96
119
  const fileName = `package${manifestOverrideEnv ? `-${manifestOverrideEnv}` : ''}.zip`;
97
120
  await fs.writeFile(fileName, zipBytes);
@@ -36,8 +36,8 @@ export declare type PackageManifest = {
36
36
  'dataConnectors'?: {
37
37
  'name': string;
38
38
  'oauthProviderName': string;
39
- 'callbackUrl': string;
40
- 'dataActions': string[];
39
+ 'callbackBaseUrl': string;
40
+ 'dataActions': Record<string, string>;
41
41
  }[];
42
42
  'settings'?: {
43
43
  'name': string;
@@ -0,0 +1 @@
1
+ This directory will contain actions performed by the data-connector
@@ -0,0 +1,7 @@
1
+ import * as crypto from 'crypto';
2
+ import * as express from 'express';
3
+ import {DataConnectorClient} from 'lucid-extension-sdk';
4
+ import {makeDataConnector} from './index';
5
+
6
+ const dataConnector = makeDataConnector(new DataConnectorClient({crypto, Buffer}));
7
+ dataConnector.runDebugServer({express});
@@ -0,0 +1,3 @@
1
+ import {DataConnector, DataConnectorClient} from 'lucid-extension-sdk';
2
+
3
+ export const makeDataConnector = (client: DataConnectorClient) => new DataConnector(client);
@@ -0,0 +1,16 @@
1
+ {
2
+ "devDependencies": {
3
+ "@types/express": "^4.17.13",
4
+ "@types/node": "^16.11.11",
5
+ "nodemon": "^2.0.19",
6
+ "ts-node": "^10.9.1",
7
+ "typescript": "^4.9.5"
8
+ },
9
+ "dependencies": {
10
+ "axios": "^0.27.2",
11
+ "express": "^4.18.1"
12
+ },
13
+ "engines": {
14
+ "node": ">=14.0.0"
15
+ }
16
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "compilerOptions": {
3
+ "declaration": true,
4
+ "emitDecoratorMetadata": true,
5
+ "experimentalDecorators": true,
6
+ "forceConsistentCasingInFileNames": true,
7
+ "module": "commonjs",
8
+ "moduleResolution": "node",
9
+ "newLine": "lf",
10
+ "noEmitOnError": false,
11
+ "noImplicitAny": true,
12
+ "noImplicitReturns": true,
13
+ "noImplicitThis": true,
14
+ "noUnusedLocals": false,
15
+ "pretty": true,
16
+ "removeComments": false,
17
+ "skipLibCheck": true,
18
+ "sourceMap": false,
19
+ "strictBindCallApply": true,
20
+ "strictFunctionTypes": true,
21
+ "strictNullChecks": true,
22
+ "strictPropertyInitialization": true,
23
+ "target": "ES2017",
24
+ "types": ["node"],
25
+ "lib": [
26
+ "es5",
27
+ "es6",
28
+ "ES2016.Array.Include",
29
+ "ES2017.String",
30
+ "ES2018.Promise",
31
+ "ES2017.Object",
32
+ "esnext.asynciterable"
33
+ ],
34
+ "outDir": "bin"
35
+ }
36
+ }