@looker/wholly-artifact 0.1.1

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/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.1](https://github.com/looker-open-source/sdk-codegen/compare/wholly-artifact-v0.1.0...wholly-artifact-v0.1.1) (2023-03-03)
9
+
10
+
11
+ ### Features
12
+
13
+ * new WhollyArtifact package ([#1200](https://github.com/looker-open-source/sdk-codegen/issues/1200)) ([0d9d45d](https://github.com/looker-open-source/sdk-codegen/commit/0d9d45de07b461554739d847b7b312909228adf5))
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * Hack App Wholly Artifact Refactor ([#1210](https://github.com/looker-open-source/sdk-codegen/issues/1210)) ([d508fa8](https://github.com/looker-open-source/sdk-codegen/commit/d508fa878ca23f6ed298359d3ec1b25a3f333fac))
19
+ * WhollyArtifact/Hack App table name fix ([#1212](https://github.com/looker-open-source/sdk-codegen/issues/1212)) ([2bba660](https://github.com/looker-open-source/sdk-codegen/commit/2bba660a6d9fa135eade144900bac5e5e5e180d7))
20
+
21
+ ## [0.1.0]
22
+
23
+ Created package
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Looker Data Sciences, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # Looker Artifact API SDK
2
+
3
+ This package combines the design of [wholly-sheet](../wholly-sheet) with the Looker Artifact API to replace the GSheets "data table" implementation of WhollySheet with the key/value store of the Looker Artifact API.
4
+
5
+ This package for using the artifact API to create dynamic tables is classified as `alpha` or `experimental` and subject to drastic change or removal at any time.
6
+
7
+ Currently, the Looker Artifact API is reserved for Looker's own extensions and is not available for other uses. The artifact endpoints in the Looker API are also marked as `alpha`.
8
+
9
+ ## Design
10
+
11
+ This SDK supports CRUDS (Create, Read, Update, Delete, Search) operations for typed object collection to be managed by the Artifact API, replacing the GSheets-based persistence layer in WhollySheet.
@@ -0,0 +1,90 @@
1
+ import type { IArtifact, IUpdateArtifact } from '@looker/sdk';
2
+ export declare type SheetValues = any[];
3
+ export declare const noDate: Date;
4
+ export declare const APP_JSON = "application/json";
5
+ export declare const nilCell = "\0";
6
+ export declare const addMinutes: (date: Date, minutes: number) => Date;
7
+ export declare const stringer: (value: any) => any;
8
+ export declare type RowValues = Record<string, any>;
9
+ export declare type ColumnHeaders = string[];
10
+ export declare const rowPosition = "_row";
11
+ export interface IRowValidationError {
12
+ message: string;
13
+ type: 'error';
14
+ }
15
+ export declare type RowValidationErrors = Record<string, IRowValidationError>;
16
+ export declare enum RowAction {
17
+ None = 0,
18
+ Create = 1,
19
+ Update = 2,
20
+ Delete = 3
21
+ }
22
+ export interface IRowModelProps extends RowValues {
23
+ _row: number;
24
+ _id: string;
25
+ _updated: Date;
26
+ $action: RowAction;
27
+ $artifact: Partial<IArtifact>;
28
+ }
29
+ export interface IRowModel extends IRowModelProps {
30
+ assign(values: any): IRowModel;
31
+ keys(): ColumnHeaders;
32
+ header(): ColumnHeaders;
33
+ displayHeader(): ColumnHeaders;
34
+ values(): SheetValues;
35
+ prepare(): IRowModel;
36
+ validate(): RowValidationErrors | undefined;
37
+ typeCast(key: string, value: any): any;
38
+ toObject(): Record<string, unknown>;
39
+ fromObject(obj: Record<string, unknown>): IRowModel;
40
+ toArtifact(): Partial<IUpdateArtifact>;
41
+ fromArtifact(obj: Partial<IArtifact>): IRowModel;
42
+ setUpdate(): boolean;
43
+ setDelete(): boolean;
44
+ setCreate(): boolean;
45
+ isNew(): boolean;
46
+ isStored(): boolean;
47
+ namespace(): string;
48
+ tableName(): string;
49
+ makey(): string;
50
+ }
51
+ export declare abstract class RowModel<T extends IRowModel> implements IRowModel {
52
+ _row: number;
53
+ _id: string;
54
+ _updated: Date;
55
+ $artifact: Partial<IArtifact>;
56
+ constructor(values?: any);
57
+ isNew(): boolean;
58
+ isStored(): boolean;
59
+ private $_action;
60
+ private static hide;
61
+ private initFromArray;
62
+ private initValues;
63
+ tableName(): string;
64
+ makey(): string;
65
+ get key(): string;
66
+ set key(value: string);
67
+ private oops;
68
+ get $action(): RowAction;
69
+ set $action(value: RowAction);
70
+ setCreate(): boolean;
71
+ setUpdate(): boolean;
72
+ setDelete(): boolean;
73
+ keys(): ColumnHeaders;
74
+ header(): ColumnHeaders;
75
+ displayHeader(): ColumnHeaders;
76
+ prepare(): T;
77
+ values(): SheetValues;
78
+ typeCast(key: string, value: any): any;
79
+ assign(values: any): T;
80
+ validate(): RowValidationErrors | undefined;
81
+ toObject(): Record<string, unknown>;
82
+ fromObject(obj: Record<string, unknown>): IRowModel;
83
+ fromArtifact(obj: Partial<IArtifact>): IRowModel;
84
+ private storageValues;
85
+ toArtifact(): Partial<IUpdateArtifact>;
86
+ abstract namespace(): string;
87
+ }
88
+ export declare type RowModelFactory<T extends IRowModel> = {
89
+ new (values?: any): T;
90
+ };
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stringer = exports.rowPosition = exports.noDate = exports.nilCell = exports.addMinutes = exports.RowModel = exports.RowAction = exports.APP_JSON = void 0;
7
+ var _uuid = require("uuid");
8
+ var _sdkRtl = require("@looker/sdk-rtl");
9
+ var _omit = _interopRequireDefault(require("lodash/omit"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
12
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
13
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
15
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
16
+ var noDate = new Date(-8640000000000000);
17
+ exports.noDate = noDate;
18
+ var APP_JSON = 'application/json';
19
+ exports.APP_JSON = APP_JSON;
20
+ var nilCell = '\0';
21
+ exports.nilCell = nilCell;
22
+ var addMinutes = (date, minutes) => {
23
+ return new Date(date.getTime() + minutes * 60000);
24
+ };
25
+ exports.addMinutes = addMinutes;
26
+ var stringer = value => {
27
+ if (value === undefined || value === null) return nilCell;
28
+ if (value instanceof Date) {
29
+ if (value === noDate) return nilCell;
30
+ return value.toISOString();
31
+ }
32
+ return value.toString();
33
+ };
34
+ exports.stringer = stringer;
35
+ var rowPosition = '_row';
36
+ exports.rowPosition = rowPosition;
37
+ var RowAction;
38
+ exports.RowAction = RowAction;
39
+ (function (RowAction) {
40
+ RowAction[RowAction["None"] = 0] = "None";
41
+ RowAction[RowAction["Create"] = 1] = "Create";
42
+ RowAction[RowAction["Update"] = 2] = "Update";
43
+ RowAction[RowAction["Delete"] = 3] = "Delete";
44
+ })(RowAction || (exports.RowAction = RowAction = {}));
45
+ class RowModel {
46
+ constructor(values) {
47
+ _defineProperty(this, "_row", 0);
48
+ _defineProperty(this, "_id", '');
49
+ _defineProperty(this, "_updated", noDate);
50
+ _defineProperty(this, "$artifact", {
51
+ version: 0
52
+ });
53
+ _defineProperty(this, "$_action", RowAction.None);
54
+ this.initValues(values);
55
+ if (!this.key) {
56
+ this.key = this.makey();
57
+ this.$_action = RowAction.Create;
58
+ }
59
+ }
60
+ isNew() {
61
+ return this.$artifact.version < 1;
62
+ }
63
+ isStored() {
64
+ return !this.isNew();
65
+ }
66
+ initFromArray(values) {
67
+ if (Array.isArray(values)) {
68
+ var _keys = this.header();
69
+ if (Array.isArray(values)) {
70
+ values.forEach((val, index) => {
71
+ if (val !== undefined && val !== null && index < _keys.length) {
72
+ var _key = _keys[index];
73
+ this[_key] = this.typeCast(_key, val);
74
+ }
75
+ });
76
+ }
77
+ return true;
78
+ }
79
+ return false;
80
+ }
81
+ initValues(values) {
82
+ if (this.initFromArray(values)) return;
83
+ if (typeof values === 'object' && values !== null && values !== undefined) {
84
+ var nested = ('value' in values);
85
+ var _value = nested ? values.value : values;
86
+ if (nested) {
87
+ this.$artifact = values;
88
+ }
89
+ if (typeof _value === 'string') {
90
+ try {
91
+ _value = JSON.parse(_value);
92
+ } catch (e) {
93
+ var _values$$artifact, _values$$artifact$con;
94
+ if (((_values$$artifact = values.$artifact) === null || _values$$artifact === void 0 ? void 0 : (_values$$artifact$con = _values$$artifact.content_type) === null || _values$$artifact$con === void 0 ? void 0 : _values$$artifact$con.localeCompare(APP_JSON, 'en', {
95
+ sensitivity: 'base'
96
+ })) === 0) {
97
+ throw new _sdkRtl.LookerSDKError("Expected ".concat(APP_JSON, " but got ").concat(e));
98
+ } else {
99
+ throw new _sdkRtl.LookerSDKError(e);
100
+ }
101
+ }
102
+ }
103
+ Object.keys(_value).forEach(k => {
104
+ this[k] = this.typeCast(k, _value[k]);
105
+ if (typeof this[k] === 'string') {
106
+ this[k] = decodeURI(this[k]);
107
+ }
108
+ });
109
+ if (values.key) this.key = values.key;
110
+ return true;
111
+ }
112
+ return false;
113
+ }
114
+ tableName() {
115
+ return this.constructor.name;
116
+ }
117
+ makey() {
118
+ return "".concat(this.tableName(), ":").concat((0, _uuid.v4)());
119
+ }
120
+ get key() {
121
+ return this._id;
122
+ }
123
+ set key(value) {
124
+ this._id = value;
125
+ this.$artifact.key = value;
126
+ }
127
+ oops(message) {
128
+ throw new _sdkRtl.LookerSDKError("".concat(this.key, ": ").concat(message));
129
+ }
130
+ get $action() {
131
+ if (this.$_action === RowAction.None && this.isNew()) return RowAction.Create;
132
+ return this.$_action;
133
+ }
134
+ set $action(value) {
135
+ switch (value) {
136
+ case RowAction.Create:
137
+ {
138
+ if (this.isStored()) this.oops("can't create an existing item");
139
+ break;
140
+ }
141
+ case RowAction.Delete:
142
+ {
143
+ if (this.isNew()) {
144
+ this.oops("can't delete a new item");
145
+ }
146
+ break;
147
+ }
148
+ case RowAction.Update:
149
+ {
150
+ if (this.isNew()) {
151
+ this.oops("can't update a new item");
152
+ }
153
+ break;
154
+ }
155
+ case RowAction.None:
156
+ {
157
+ if (this.isNew()) {
158
+ this.oops("Action must be assigned for a new item");
159
+ }
160
+ break;
161
+ }
162
+ }
163
+ this.$_action = value;
164
+ }
165
+ setCreate() {
166
+ this.$action = RowAction.Create;
167
+ return true;
168
+ }
169
+ setUpdate() {
170
+ this.$action = RowAction.Update;
171
+ return true;
172
+ }
173
+ setDelete() {
174
+ this.$action = RowAction.Delete;
175
+ return true;
176
+ }
177
+ keys() {
178
+ return Object.keys(this);
179
+ }
180
+ header() {
181
+ var keys = this.keys();
182
+ var result = keys.filter(v => !(v.startsWith('$') || RowModel.hide.has(v)));
183
+ return result;
184
+ }
185
+ displayHeader() {
186
+ return this.header().filter(v => !(v.startsWith('_') || RowModel.hide.has(v)));
187
+ }
188
+ prepare() {
189
+ if (!this.key) {
190
+ this.key = this.makey();
191
+ this.$action = RowAction.Create;
192
+ }
193
+ this._updated = new Date();
194
+ return this;
195
+ }
196
+ values() {
197
+ var result = [];
198
+ var keys = this.header();
199
+ keys.forEach(key => {
200
+ result.push(stringer(this[key]));
201
+ });
202
+ return result;
203
+ }
204
+ typeCast(key, value) {
205
+ if (value === undefined || value === null) value = '';
206
+ var type = typeof this[key];
207
+ var fromType = typeof value;
208
+ if (type === fromType) {
209
+ return value;
210
+ }
211
+ if (type === 'string') {
212
+ return value.toString();
213
+ }
214
+ if (type === 'number') {
215
+ if (value === '') return 0;
216
+ var isInt = /^([+-]?[1-9]\d*|0)$/;
217
+ if (value.toString().match(isInt)) {
218
+ return parseInt(value, 10);
219
+ }
220
+ return parseFloat(value);
221
+ }
222
+ if (type === 'boolean') {
223
+ return (0, _sdkRtl.boolDefault)(value, false);
224
+ }
225
+ if (this[key] instanceof Date) {
226
+ if (value) return new Date(value);
227
+ return noDate;
228
+ }
229
+ if (Array.isArray(this[key])) {
230
+ if (!value) return [];
231
+ return value.toString().split(',');
232
+ }
233
+ return value;
234
+ }
235
+ assign(values) {
236
+ if (values) {
237
+ this.initValues(values);
238
+ }
239
+ return this;
240
+ }
241
+ validate() {
242
+ return undefined;
243
+ }
244
+ toObject() {
245
+ return (0, _omit.default)(_objectSpread({}, this), ['$_action']);
246
+ }
247
+ fromObject(obj) {
248
+ return this.assign(obj);
249
+ }
250
+ fromArtifact(obj) {
251
+ return this.assign(obj);
252
+ }
253
+ storageValues() {
254
+ var result = {};
255
+ var keys = this.header();
256
+ for (var _key2 of keys) {
257
+ var val = typeof this[_key2] === 'string' ? encodeURI(this[_key2]) : this[_key2];
258
+ result[_key2] = val;
259
+ }
260
+ return result;
261
+ }
262
+ toArtifact() {
263
+ var _this$$artifact$versi;
264
+ return {
265
+ key: this.key,
266
+ value: JSON.stringify(this.storageValues()),
267
+ version: (_this$$artifact$versi = this.$artifact.version) !== null && _this$$artifact$versi !== void 0 ? _this$$artifact$versi : 0,
268
+ content_type: APP_JSON
269
+ };
270
+ }
271
+ }
272
+ exports.RowModel = RowModel;
273
+ _defineProperty(RowModel, "hide", new Set(['_row']));
274
+ //# sourceMappingURL=RowModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowModel.js","names":["noDate","Date","APP_JSON","nilCell","addMinutes","date","minutes","getTime","stringer","value","undefined","toISOString","toString","rowPosition","RowAction","RowModel","constructor","values","version","None","initValues","key","makey","$_action","Create","isNew","$artifact","isStored","initFromArray","Array","isArray","keys","header","forEach","val","index","length","typeCast","nested","JSON","parse","e","content_type","localeCompare","sensitivity","LookerSDKError","Object","k","decodeURI","tableName","name","uuidv4","_id","oops","message","$action","Delete","Update","setCreate","setUpdate","setDelete","result","filter","v","startsWith","hide","has","displayHeader","prepare","_updated","push","type","fromType","isInt","match","parseInt","parseFloat","boolDefault","split","assign","validate","toObject","omit","fromObject","obj","fromArtifact","storageValues","encodeURI","toArtifact","stringify","Set"],"sources":["../src/RowModel.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { boolDefault, LookerSDKError } from '@looker/sdk-rtl'\nimport omit from 'lodash/omit'\nimport type { IArtifact, IUpdateArtifact } from '@looker/sdk'\nexport type SheetValues = any[]\n\nexport const noDate = new Date(-8640000000000000)\nexport const APP_JSON = 'application/json'\n\n/** Signifies an empty cell */\nexport const nilCell = '\\0'\n\nexport const addMinutes = (date: Date, minutes: number) => {\n return new Date(date.getTime() + minutes * 60000)\n}\n\n/** Convert a value to the string representation for a cell value */\nexport const stringer = (value: any) => {\n if (value === undefined || value === null) return nilCell\n if (value instanceof Date) {\n if (value === noDate) return nilCell\n return value.toISOString()\n }\n return value.toString()\n}\n\n/** Key/value pairs for tab data */\nexport type RowValues = Record<string, any>\n\n/** Sheet (tab) column header definition */\nexport type ColumnHeaders = string[]\n\n/** name of the property that tracks the row's position in the tab sheet */\nexport const rowPosition = '_row'\n\nexport interface IRowValidationError {\n message: string\n type: 'error'\n}\n\nexport type RowValidationErrors = Record<string, IRowValidationError>\n\nexport enum RowAction {\n None,\n Create,\n Update,\n Delete,\n}\n\n/**\n * Includes type-specific properties and base Looker Artifact properties where the JSON\n * data in the artifact value property will be extracted into the type-specific\n * properties of the row model\n */\nexport interface IRowModelProps extends RowValues {\n /** Row position in sheet for this item. Usually assigned in WhollySheet processing */\n _row: number\n /**\n * Unique ID for this row. This is an alias for the artifact's key.\n * It's assigned to a combination type name:UUID in prepare()\n *\n * TODO remove this property entirely after changing the `_id` refs in the Hackathon app to use `key`\n */\n _id: string\n /**\n * Updated date/time stamp for this row. Always set in prepare().\n * TODO remove this property entirely because the artifact `version` property performs the version locking\n */\n _updated: Date\n\n /** Batch update action. Defaults to RowAction.None, so the row is not part of the delta */\n $action: RowAction\n /** Looker API key/value store artifact object for managing this row */\n $artifact: Partial<IArtifact>\n}\n\n/** Keyed data for a sheet row */\nexport interface IRowModel extends IRowModelProps {\n /**\n * Assign a value array or object to the typed row\n *\n * @param values an array of values, or an object with matching keys\n */\n assign(values: any): IRowModel\n\n /** All keys for this object, but overrideable */\n keys(): ColumnHeaders\n\n /** The sheet Column Headers keys for this model */\n header(): ColumnHeaders\n\n /** The display column headers for this model */\n displayHeader(): ColumnHeaders\n\n /** Column values in the correct order to write the entire row to the GSheet */\n values(): SheetValues\n\n /**\n * Prepare the row for saving. This includes auto-generation of _id and updating _update\n * Override this for error handling, calculations, and other default initializations\n * to avoid persisting bad data values to the sheet\n */\n prepare(): IRowModel\n\n /** Returns undefined if no errors, or the error messages with keys corresponding to property names */\n validate(): RowValidationErrors | undefined\n\n /**\n * Convert a cell to the declared type of the keyed property\n * @param key name of property to receive the value\n * @param value any value representation\n */\n typeCast(key: string, value: any): any\n\n /** Converts instance to plain javascript object */\n toObject(): Record<string, unknown>\n\n /**\n * Converts from plain javascript object to class instance\n * @param obj to assign to row. Uses properties of the same name\n */\n fromObject(obj: Record<string, unknown>): IRowModel\n\n /** Converts instance to IArtifact javascript object for storing in a Looker instance\n * the required columns are:\n * - key: unique key identifying this item, automatically managed\n * - value: IRowModel descendant nested properties with values from the `headers` keys\n * - version: version number of the artifact\n * - content_type: for WhollyArtifacts, always \"application/json\"\n */\n toArtifact(): Partial<IUpdateArtifact>\n\n /** Converts from IArtifact interface to class instance\n *\n * @param obj to assign to row\n */\n fromArtifact(obj: Partial<IArtifact>): IRowModel\n\n /** Mark a row for update. Sets the $action and returns true if the row can be marked for updating. Throws error otherwise */\n setUpdate(): boolean\n\n /** Mark a row for deletion. Sets the $action and returns true if the row can be marked for deleting. Throws error otherwise */\n setDelete(): boolean\n\n /** Mark a row for creation. Sets the $action and returns true if the row can be marked for creating. Throws error otherwise */\n setCreate(): boolean\n\n /** True if this item has NOT been saved to the artifact store. False otherwise */\n isNew(): boolean\n\n /** True if this item HAS been saved to the artifact store. False otherwise */\n isStored(): boolean\n\n /** Namespace of artifact storage bucket to use for this collection */\n namespace(): string\n\n /**\n * RowModel prefix to use for generating new key values. For example, a prefix() that returns `Hackathon` would\n * result in a key assignment like `Hackathon:9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d`\n *\n * When using artifact collections like data tables, artifact key values are intended to be hidden from the UI.\n * This prefix is purely used for making it feasible to query an artifact collection by its prefix key value\n * Must be implemented.\n */\n tableName(): string\n\n /**\n * Combines prefix() with a UUID to create a filterable key pattern\n * makey makey!\n */\n makey(): string\n}\n\nexport abstract class RowModel<T extends IRowModel> implements IRowModel {\n _row = 0\n _id = ''\n _updated: Date = noDate\n\n $artifact: Partial<IArtifact> = {\n version: 0,\n }\n\n constructor(values?: any) {\n this.initValues(values)\n if (!this.key) {\n this.key = this.makey()\n this.$_action = RowAction.Create\n }\n }\n\n isNew() {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.$artifact.version! < 1\n }\n\n isStored() {\n return !this.isNew()\n }\n\n private $_action: RowAction = RowAction.None\n\n private static hide = new Set(['_row'])\n\n /**\n * initializes values by position, iterating the header keys\n * @param values to initialize\n * @private\n */\n private initFromArray(values?: any) {\n if (Array.isArray(values)) {\n const keys = this.header()\n if (Array.isArray(values)) {\n // Assign by position\n values.forEach((val, index) => {\n if (val !== undefined && val !== null && index < keys.length) {\n const key = keys[index]\n this[key] = this.typeCast(key, val)\n }\n })\n }\n return true\n }\n return false\n }\n\n /**\n * Initializes values from any of:\n * - an array\n * - a value object\n * - an artifact object\n * @param values to initialize\n * @private\n */\n private initValues(values?: any) {\n if (this.initFromArray(values)) return\n if (typeof values === 'object' && values !== null && values !== undefined) {\n const nested = 'value' in values\n let value = nested ? values.value : values\n if (nested) {\n this.$artifact = values\n }\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value)\n } catch (e: any) {\n if (\n values.$artifact?.content_type?.localeCompare(APP_JSON, 'en', {\n sensitivity: 'base',\n }) === 0\n ) {\n throw new LookerSDKError(`Expected ${APP_JSON} but got ${e}`)\n } else {\n throw new LookerSDKError(e)\n }\n }\n }\n Object.keys(value).forEach((k) => {\n this[k] = this.typeCast(k, value[k])\n if (typeof this[k] === 'string') {\n this[k] = decodeURI(this[k])\n }\n })\n if (values.key) this.key = values.key\n return true\n }\n return false\n }\n\n /**\n * RowModel prefix to use for generating new key values. For example, a prefix() that returns `Hackathon` would\n * result in a key assignment like `Hackathon:9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d`\n *\n * When using artifact collections like data tables, artifact key values are intended to be hidden from the UI.\n * This prefix is purely used for making it feasible to query an artifact collection by its prefix key value\n */\n tableName() {\n return this.constructor.name\n }\n\n makey() {\n return `${this.tableName()}:${uuidv4()}`\n }\n\n get key() {\n return this._id\n }\n\n set key(value) {\n this._id = value\n this.$artifact.key = value\n }\n\n private oops(message: string) {\n throw new LookerSDKError(`${this.key}: ${message}`)\n }\n\n get $action(): RowAction {\n if (this.$_action === RowAction.None && this.isNew())\n return RowAction.Create\n return this.$_action\n }\n\n set $action(value: RowAction) {\n switch (value) {\n case RowAction.Create: {\n if (this.isStored()) this.oops(`can't create an existing item`)\n break\n }\n case RowAction.Delete: {\n if (this.isNew()) {\n this.oops(`can't delete a new item`)\n }\n break\n }\n case RowAction.Update: {\n if (this.isNew()) {\n this.oops(`can't update a new item`)\n }\n break\n }\n case RowAction.None: {\n if (this.isNew()) {\n this.oops(`Action must be assigned for a new item`)\n }\n break\n }\n }\n this.$_action = value\n }\n\n setCreate(): boolean {\n this.$action = RowAction.Create\n return true\n }\n\n setUpdate(): boolean {\n this.$action = RowAction.Update\n return true\n }\n\n setDelete(): boolean {\n this.$action = RowAction.Delete\n return true\n }\n\n keys(): ColumnHeaders {\n return Object.keys(this)\n }\n\n header(): ColumnHeaders {\n const keys = this.keys()\n const result = keys.filter(\n (v) => !(v.startsWith('$') || RowModel.hide.has(v))\n )\n return result\n }\n\n displayHeader(): ColumnHeaders {\n return this.header().filter(\n (v) => !(v.startsWith('_') || RowModel.hide.has(v))\n )\n }\n\n prepare(): T {\n if (!this.key) {\n // Generate id if not assigned\n this.key = this.makey()\n this.$action = RowAction.Create\n }\n /** Always update the \"updated\" value before saving */\n this._updated = new Date()\n return this as unknown as T\n }\n\n values() {\n const result: SheetValues = []\n const keys = this.header()\n keys.forEach((key) => {\n result.push(stringer(this[key]))\n })\n return result\n }\n\n typeCast(key: string, value: any) {\n if (value === undefined || value === null) value = ''\n const type = typeof this[key]\n const fromType = typeof value\n if (type === fromType) {\n // No conversion required\n return value\n }\n if (type === 'string') {\n return value.toString()\n }\n if (type === 'number') {\n if (value === '') return 0\n const isInt = /^([+-]?[1-9]\\d*|0)$/\n if (value.toString().match(isInt)) {\n return parseInt(value, 10)\n }\n return parseFloat(value)\n }\n if (type === 'boolean') {\n return boolDefault(value, false)\n }\n if (this[key] instanceof Date) {\n if (value) return new Date(value)\n return noDate\n }\n if (Array.isArray(this[key])) {\n if (!value) return []\n return value.toString().split(',')\n }\n return value\n }\n\n assign(values: any): T {\n if (values) {\n this.initValues(values)\n }\n return this as unknown as T\n }\n\n /** default to no errors */\n validate(): RowValidationErrors | undefined {\n return undefined\n }\n\n toObject(): Record<string, unknown> {\n return omit({ ...this }, ['$_action'])\n }\n\n fromObject(obj: Record<string, unknown>): IRowModel {\n return this.assign(obj)\n }\n\n fromArtifact(obj: Partial<IArtifact>): IRowModel {\n return this.assign(obj)\n }\n\n /**\n * Values to store in attribute\n *\n * All string values are stored with encodeURI to prevent character encoding issues\n * @private\n */\n private storageValues() {\n const result = {}\n // TODO after migrating from sheets, use `key` as this.keyColumn rather than `_id` and use displayHeader()\n // const keys = this.displayHeader()\n const keys = this.header()\n for (const key of keys) {\n const val =\n typeof this[key] === 'string' ? encodeURI(this[key]) : this[key]\n result[key] = val\n }\n return result\n }\n\n toArtifact(): Partial<IUpdateArtifact> {\n return {\n key: this.key,\n value: JSON.stringify(this.storageValues()),\n version: this.$artifact.version ?? 0,\n content_type: APP_JSON,\n } as Partial<IArtifact>\n }\n\n abstract namespace(): string\n}\n\n// TODO figure out the TypeScript magic for this to work\nexport type RowModelFactory<T extends IRowModel> = { new (values?: any): T }\n\n// export const RowModelCreator: RowModelFactory<IRowModel> = (values?: any) =>\n// new RowModel(values)\n"],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { ILooker40SDK } from '@looker/sdk';
2
+ import type { ColumnHeaders, IRowModel, SheetValues } from './RowModel';
3
+ export declare const compareDates: (a: Date, b: Date) => number;
4
+ export interface IMaker<T> {
5
+ new (values?: any): T;
6
+ }
7
+ export interface IRowDelta<T extends IRowModel> {
8
+ updates: T[];
9
+ deletes: T[];
10
+ creates: T[];
11
+ }
12
+ export declare class TypedRows<T> {
13
+ rows: T[];
14
+ constructor(rows: T[], Maker?: IMaker<T>);
15
+ add(value: T): void;
16
+ where(predicate: (value: T) => boolean): TypedRows<T>;
17
+ select<U>(selector: (value: T) => U): TypedRows<U>;
18
+ toArray(): T[];
19
+ static from<U>(values: U[]): TypedRows<U>;
20
+ static create<U>(values?: U[]): TypedRows<U>;
21
+ }
22
+ export interface IWhollyArtifact<T extends IRowModel, P> {
23
+ sdk: ILooker40SDK;
24
+ namespace: string;
25
+ tableName: string;
26
+ header: ColumnHeaders;
27
+ displayHeader: ColumnHeaders;
28
+ keyColumn: string;
29
+ rows: T[];
30
+ index: Record<string, T>;
31
+ nextRow: number;
32
+ checkHeader(header: ColumnHeaders): boolean;
33
+ displayable(columnName: string): boolean;
34
+ values(model: T): SheetValues;
35
+ allValues(): SheetValues;
36
+ typeRow<T extends IRowModel>(values?: any): T;
37
+ typeRows<T extends IRowModel>(rows: SheetValues): T[];
38
+ refresh<T extends IRowModel>(values?: any): Promise<T[]>;
39
+ save<T extends IRowModel>(model: T, force?: boolean): Promise<T>;
40
+ create<T extends IRowModel>(model: T): Promise<T>;
41
+ update<T extends IRowModel>(model: T, force?: boolean): Promise<T>;
42
+ delete<T extends IRowModel>(model: T, force?: boolean): Promise<boolean>;
43
+ checkOutdated<T extends IRowModel>(model: T, source?: T): Promise<boolean>;
44
+ find(value: any, columnName?: string): T | undefined;
45
+ loadRows<T extends IRowModel>(rows: SheetValues): T[];
46
+ toObject(): P[];
47
+ fromObject<T extends IRowModel>(obj: P[]): T[];
48
+ getDelta<T extends IRowModel>(): IRowDelta<T>;
49
+ mergePurge<T extends IRowModel>(tab: SheetValues, delta: IRowDelta<T>): SheetValues;
50
+ prepareBatch<T extends IRowModel>(tab: SheetValues, delta: IRowDelta<T>, force?: boolean): boolean;
51
+ createUpdateBatch<T extends IRowModel>(items: T[]): Promise<T[]>;
52
+ deleteBatch<T extends IRowModel>(items: T[]): Promise<T[]>;
53
+ batchUpdate<T extends IRowModel>(force?: boolean): Promise<T[]>;
54
+ }
55
+ export interface ITabTable {
56
+ header: ColumnHeaders;
57
+ rows: IRowModel[];
58
+ }
59
+ export declare abstract class WhollyArtifact<T extends IRowModel, P> extends TypedRows<T> implements IWhollyArtifact<T, P> {
60
+ readonly sdk: ILooker40SDK;
61
+ readonly table: ITabTable;
62
+ readonly keyColumn: string;
63
+ index: Record<string, T>;
64
+ namespace: string;
65
+ tableName: string;
66
+ constructor(sdk: ILooker40SDK, table: ITabTable, keyColumn?: string);
67
+ loadRows<T extends IRowModel>(rows: SheetValues): T[];
68
+ refresh<T extends IRowModel>(values?: any): Promise<T[]>;
69
+ abstract typeRow<T extends IRowModel>(values?: any): T;
70
+ typeRows<T extends IRowModel>(rows: SheetValues): T[];
71
+ private static toAT;
72
+ checkHeader(): boolean;
73
+ get header(): ColumnHeaders;
74
+ get nextRow(): number;
75
+ private createIndex;
76
+ values<T extends IRowModel>(model: T): SheetValues;
77
+ allValues(): SheetValues;
78
+ save<T extends IRowModel>(model: T, force?: boolean): Promise<T>;
79
+ checkId<T extends IRowModel>(model: T): void;
80
+ create<T extends IRowModel>(model: T): Promise<T>;
81
+ update<T extends IRowModel>(model: T, _force?: boolean): Promise<T>;
82
+ find(value: any, columnName?: string): T | undefined;
83
+ private _displayHeader;
84
+ get displayHeader(): ColumnHeaders;
85
+ delete<T extends IRowModel>(model: T, force?: boolean): Promise<boolean>;
86
+ displayable(columnName: string): boolean;
87
+ checkOutdated<T extends IRowModel>(model: T, source?: T): Promise<boolean>;
88
+ fromObject<T extends IRowModel>(obj: P[]): T[];
89
+ toObject(): P[];
90
+ batchUpdate<T extends IRowModel>(_force?: boolean): Promise<T[]>;
91
+ getDelta<T extends IRowModel>(): IRowDelta<T>;
92
+ mergePurge<T extends IRowModel>(values: SheetValues, delta: IRowDelta<T>): SheetValues;
93
+ prepareBatch<T extends IRowModel>(values: SheetValues, delta: IRowDelta<T>, force?: boolean): boolean;
94
+ createUpdateBatch<T extends IRowModel>(items: T[]): Promise<T[]>;
95
+ private updateRowsFromIndex;
96
+ deleteBatch<T extends IRowModel>(items: T[]): Promise<T[]>;
97
+ }